pipewire-doc-1.0.5+git36.60deeb2-150600.3.3.5<>,Etfp9|lTL+)d\K`p~1ݵ%pU C:1\ 3 ?8r9+afq 򹅍An*ourz?;Vn2Өy<J[ub]@J Ljc+g ,BE,[jRPG@lJ^TH}^%`T–5TE'GvƬ DS1`cN#AپM@ ;?d# 0 T  6<D ( 5 PX / pMIThttps://www.suse.com/Development/Libraries/C and C++https://pipewire.org/linuxaarch645p7kba&1D 8+i,jbtaKbh&F'~W%')iiA#a{ ;}:w. + >waQquTQ~ 6'C?ReF~a<f=t56P8;kǥ&R%a!m<XsTh^8j(gmIg3Bj{yX^/_ P a PRv;"A~i5NE8f4aCs %y,OT2> #3 #  *f.T ,A#M 9.vy |/46Bop"#!r g+C%*\#sIIKq'rK`!.IL4oaR7r>;u7kr@iB`T@Q8,r7t)PGGM[|(,#$Z"o*+n#f8?I Nn`o(t*MEBE~ZVز>*X&FFd)v>hh p3"J&/bC*m)Jl2.SV_brw=D=Hdj]FI.CDGEFF55rH%L4JJJFFJ"D 6M,!{&' "/D$W86&<d5 8>Aei^+*[e-m y .8/bD!m65(Q'9n%%y{K"JV Gen#"!Ec_ ( WH'_*7 ,}$ ]p? {Dn. %1Ay64##ow,;'R`kF[3WfJU\A&W9w6W8C ;75~'$OM/Et7.t5;#hBQ\q; Dux#I;<8&uxQɣNb%&e8`[',2os!K X# y)[; 4<  [&&M=N.[-71Y0z;Er  ]1O!9*Ka-O4:a1\4Z$$Q\4 Q|fDwCmV[oHS3xF"0Ar)"Z!!p [$ 6~a`0X+'q4I:/'u2m&={4'3$<Nd7m#KH#Jm\,6}XZ`>:,@NfЈ u?vO}P3vJ<,tM&a$u:GKj5 k`~(1L$x,w>Uh{,O?&#\7#k6@& $75Oqf%mQM:B.%9>%*4~N8-0IZC3$1% 0y$^9=D$QF[65w$Y1_1DD%;% &UF(%8iSC$\)g%1 4o%=){e%+UO:9J! RZ7;,8$tB($~B#)=6C\#)(f)x!59nw$"ud8i<*(`2'3C))%$Vt$M5(T0.S`N|%1A&iU 2iB^(`iG^iS'E#i/kB<2mc)/{h/L3Qj* g|,{#n-'A;C* Q(3w#c!W?3_.Y3 2':':j#|!bO7,xxG\$} 0n*435{j-2 *MH '~#Z#vO!-SIt? , S%%{AG  EF!#vvv)eR#! !:'O.X%nbA+|2d%)^0.@'Ka!VUMa'*:%S4]IpbJ$am#z+ql!xwU^kϧGƎ<w*a)+ _b&4w-6%N8AA큤Afffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1a9bb0bd7dc3588d6fbf5a2721c55f4fc889da8f5663d9577b5185c0b4db4b03b27176b802264c2cf7e9a2b410d799994db1eca97e7399be3965e7e6bab5044cdf75304519906201aa34c823fcc67513088c99bd24df58dc0470cdef7a38975c98eec27c7ac9b47a4c85c849803b2b619353bf4a77295c451ab089f8e7e80ddc702afd37b301323a9c9fa5268c5f3186205485422f9b840a549026bece587eed886732c5f61dbea2111b185cc61736fe3c23e7982b7678f42af25f16b9dc48f688a19d71c8dab742a1b813e5e776dd9b2dcc9e125fa62a038e6671dd64652f46c981f53b4fcde82be0077cffaa5adb1d3c8a791cd447090ad969ca8fa78327c23bcae155fdfef0ea1d96157f78402256f0293bd2e2f49394bfbcaa315de5e96cd14088eddb4de453666baff4e3ad07ece1f505711370ac3236adfb45b83738102709aa2b21e3e2965ee88f55ce7d467476a074ff7127af41de67bc34b211a29e90159ca803cb1a75d98d3f7c6b2183f98c875f012d26c2d02d466c99da58f03cbd73a39677a9eff3221ba11f8b229ebfe613c146cdff7cffd74eb026deee8eb30488e203b894bbe82f454644ce401ffc6fd221d0d60170777ca3c5c6f28cb22232346bf6c38c264640bb822d85d77113be2b4bcf291c3c741c648a0b33763fbca4bd5b63ecbba6946376b8b86eefe1f590f7034f65cb4a177d35c99898559e4056eec4eae2ab56dd5ddc7845c28c96e12f79bfe8a665c9ccbe71535d7c848f63b6065e7bee027801e23e4dcb090e71e53eb099f2a84142331ff0775d7d45ed3b72043226f1bba9bb3b51b9deeb0d63a2f8e4bff7b937b7cf52f9b0cc7b8beb1006d891c32958ca774f71d68fb635fd4184658c45297f904ea201730be30ba87b322536be8ce375e4d69744336496e89bd2011fcbc885eb335b5fdcc443056e1bb6ae9bc92e9882fa9f4db0cbce51319bc0256188bf2a46f5c0821f56cc7ceda718c95fc45ed7aadb6310ed243614b5acbec01d4b2b38d7ac72bbfd18d093749dfdc86fba7aebc83720f46e173d6a9c06d6b09c6157b6ae322d6bb920b280b8674e47f9a22959d497dd51e5304114e3151d6f6551e787139f0210b0b0980720aa18afb25e5ff803b34cb0b3b7867e692637a54d4cac3533a0cb2a9ace0fc6d30bcc82a969a068d040da7ee959161dbf5e7cae507f5e37292a26d99073ad95bc5ab93bf4b641da5256f1f1511a6a439d967eaca1624d5413d7c16617a376d324f74d49b1245673dbb73b481f9f9b686448612c6db87b498c7d4097fac1d5363023c08d607e38f2731d5ea5adb4f9d69ef1d3978ea9a6443fddf3d146739350274e84fcdb0b44e1554be2bac3cefbbd101596774f54e450287b37bae3dfea1355583e8ab2071815e41b95dbc1275bb99e2e79e092c1a50f3e2445aa5daf50032e126e48c02aec242ac1acff456932298978e78906b056a44742316baf8af0773385d79302b86f1250397b75160c0e1cb2dea00073db18940509154fb38aef87c901547dfa17422ab47d72b554b07cd1967858eff7ebc430492db37f1e48b1984d2b57cb7795ede40016782f07d0729730e5b653baf93a3494d9bf1eaa2d6244943aa9615382f1e125916d1d57568ecb4f729ed5a0fc893fb208bdd9833a81d3145d08de03cdf399d3ffce7b4b56609a74f7a244f05bc2689565668cc63e6e1383e93011d3b2ba0a61c1e47076c46d7e3c54f51ec994c2a4cc26131d8fc015e47aeabe43c5c72e85ec02f87b3b5046c4467ee91b8d12ba1ed76b41103ce05c06150d00d6fee99b2b38f2b6318ac379b34cd7cfb6f5f4be2460e7616180d60d6e8ca9e7ed0ef70f99bb7f763a48ddd95d5990e103bb145eedfd0a76d19c122374be2be713b2cca9757f7589575afd788e336fc967cbb3218d4973122f2f19572eae6d4f8edf64959b95f3cde236547810509b9f0a503b5ba15ae20ae99e99e66db02a1ad1b385a29c6ffd2d574ee0bb43a9e25e4ecbd343f9cb61f21e10a77b384165d2ef71d962dc12e6ff2a648ab54ebc657de27ae16e5529c6400d9c87c87d6efda72dfaf3713001917b7ce0fb9e95b11c0c14aac012ea259d4c295abbc55708c67043c4269bc3365ed5cf2c3abb317c75b3543e9d377c05fdb29808ec492cb2dcf75591878affb48e7b46bda853b014d8d9fc5c10c0f9992e1d2219597c16552a260404d5466756d79c88a289eb87abc4b3318ea98f03aaca8c64a22101b7e641c5ae64db3a31705ca79bad09a3042de75c3cc3d1693fb2061e36bca80c75a7d5d21d636f0ecf2b6a32e6f01f07c0c1052b1bdff3572c9bffb44428992e845be0c1c8f0ec3c146f606fdc0fc8744b2fc81768e12aac532974a81bf8750d32b0e6c2e31c7543bc4122df59aa95f1798ce4a39b2c4c219efd564798e459a23c79f749581bc7cbba22852f94c87cd0db43b58f37788ca09c78ad0d2e45ee3d1a2703a97bc64ac36a2ed905e32be436ad5f434d04c162ae8357abdd9a43f2f60a3b700bde804cc3c5983d755ffc0ba90963ac87cb63ec1f4f7229249119d30b92dc2840edd35cd150af14c98df9265c5a4065b0eedd01f97e4efb1a476920f807ceeccad220162a5a568b30c1e25210775caa649e614fd9ca6b796143b51b4973a76bc505699c695c37d96015ba3623aff79862aa36bccba7582b10f79dbc75ddb79d0a8422963b3f575ec8ef4083414b055d21820ce97c5102d1930db506f689a5ac98c02adc57337f58c40aae15bbac05a3ccb364e5adb1d610a16452e92f178306f89a538e2d4670a26a7e43ef2cf207c68aec0e521b11d660c1a824dc679fe8bbbbbe65a4c56f6fda1cf1969ddc01d4609071b7c174b1c6a34c0f47a6aae691b26b012cd067bab42737a36b8009eec08860d54fe1f4f7b51a8afd88509789424f09ee9edc18d66e66db43a5988ac7b2bc4904160c7bedc7630ca98389aa78a8ef4ea971cff2114fb65e94de84656abfaf6577f38a4014746634cd1a5ee532a5465c3f24398240a6657c587a0bf77796d345b05b83a2b7ef6daae5985c4ba9d4f6b17d4bcb9bb1ff181240db54944d3f61da488c6b8574b3f6d3fff9c877db268638fa458a56adc5d02e587735363e76b690be3aa2f73741deff0116ce280a6a24e024a74f9ecdf0545c139ff762b9e1110633e8de6f9404637d8ca383c0357d16f9da35eed772d69c37ff64eea68cf217e46afce266db7ca3b131a388f4c95feec2418cee04f458298f57ef6b97242ebe118d6b931e55dd444ffb39dcd5d53470df367c75579e0f74c7be91701c95ddd0ef178df2ab06e23964a40022f863f3f28443af7c2bb4b6d178ed0fc7f1ae2e926f859a8c5685eb4ac5d60457d65ca9f3a7aacccf4e74cb73c0da8d91467d996b5057872492eae82f956160de4b5a3bf67950dc48135c155cd0e7c7d6edb7c625f86216073d5c9662c6edc070c63cd5d5db9196d7dee94062c92b2da8e3ee5ba5ae52133151c34f01970ac3c8da1c1930d43b6af38d83b4f36dacd1693d4227b435f18aa52de3ebb9ee4941a6e90e67fd22ff4ff665bfaba0e046b335ecfe3d8bc89ea46f46e6a6917741f6e93da75785b137cd1bee5bf8ffcef97fbd5cac2d3a4036b6aca1cd8533562b3fade32559405dded0265b0c42bac3e1e35672e7d087f54310fb5317194acd6d48ddcfb8977aa2bcc28a3fbb505e8ead81b741cba7f2b857b5c6121c7e389da7dab964004472096b66c89ecd3cc039e896bd7bb314a20bd490cb3f4f75edc0f99dce1d46764be61eb9592c0cf0d091edc8451590bbde4cc916d375900389b3bfb14d5a2692c4c6b3562101cb7f13dc594f857d4f02d7f3f295a27d12ac606c896b1045ac11a6d38a9bcbdfd45c341274ba419209eaa69a98972bcfcf74196ebbd7d6d35835b8c4a992d0770710f95d72ef82975289cb7fc799ccf63fd38f49dc9fa120106e769d5a0bd9e010ec8b29dddb063ecdce96cec194d4db6a5b11d03a06074190ed93720042cc24f140121ec88a5a69cd1f5db7a43578777e21a14938ab3133fc62b2e71334544e44401c2bea1dd20b0022ecc0199de6de702ed8d395929dec79b6e9218441692d29b1fa1ee622fb1ac576c1cc797dbe81bb491b514b82403b6cbd0b13091f32587093c28ed461f69e65b2f9f44a6e4f62de0c6e2fd17ffdd95e8b95f74be147bc8d845423c88b394e5e3bb7fb34dec27cb8a38fe5f55e7ff36e87e1dabf3580fe8c49243c9e6456eb3d1b0c4fc20c3e2246d4fc75459fbef89f2fee8d793acecad30632b729f4ff2423e08d521990596c4e5d84c9d382c988b62afd6bd6c6c5a5ed627bd9660c3a4cde2592b36fbeaebb070d855458a359841719a9f1aba674ef42753e3a056cdf6799abc129888fe87aadeca271b746550c72907b178e91939adbd9ebe2add85c5e87aed9933efe58875098c1cfdf4b7ab38079e225a0b37a33104430a477930b9909a0627bd66250ecc3c36a6885af8859f235cf553f27dd19cd0c2ca249566535a0c6b0e4e618406464ad8339002bea04179a47c641f223012da36f5e02ba53bf47ef777fc7ee148083cebb7bd2e2f48a09f88fcf20109079a3fd181b5854579429358141f790b8dc5fb4abce7a2f1a91e1ecc6a50df63179e116c75fdb8c01b985ff78b1fa578aa660d0605d72373cf09fd8d61fd72ca8c01c5529f658defa19b02862c1ad0a9e7c039626640ba1714506c4242fefb971df368bd8ca2cc2908c5a7ff70d5bc471260277982ea298afbd0ed7a5a7459c15871e371239fb15efc5e6603fda974c811298c35db962246b439738afbc4096232d4b1a5c34cc33dc424af35dd6c97fa1c0a41b04ed34d2e5a633d7994576d292bdad1125c922d5a5ea0dd3b504bee62c7a4b5f58252583a8e1305866c3fb2020ae1cccaacad2553fa0f3d2edc55f7c957ae207322ed15ff127e2880588c11107ea85ab822011fa69bab8fe9020e666569704e719753bf354b913f17a51194962f4cd46a09d28b802380c8af68775528d1bc3d529c483ba929364db31012f088a86c32d359505d6e577d91bf8e95fdfd8815e3df9fa279d2bbed56bd8b2dc5e1bccfb8797c77479c793e3ff9fee7be7ae349f637c675d8beabf012ec4bf7e1d51f8ea912f09e7d7b1f48fbc6ad9068d9a6b77154c73f1e18902e17b40afbb35f049c6e48fba8996051b9605a8bc15693a55f9e35677d0fb4c35e4f6dc30c5fd8814c00910f31c1074418df7fd74c11157e70fcdc996dced3d473b44612d96b42ca0a8cfd697115e7242e4ae435fa4d1ff7251420a7ed1fe3f38d8dfa5aba56e1471d2e83a9de0e337e4c1d92f430305ea792f42a3f6eb2031ac9b9af68550a96bd55f534787f12e899fabc14bdee1f11c8360ce0ed95c1fc590266b6499af49890142a64de05bb2c5603486a243ab0ab5a7f7990d58a67ce8bb492cb4e1daef1b73b03876684f4be174d7408fc101d937e3bac746142a7edcd94aa28c819ebf376e15a4aa96f694c72c208c241bdf806291917796177105c0a10c08aede1cfd7326014985d1e12dd863ce3b8412778c3e749950e6c904cdc5430cfd7c7123cfcb16b8cf84a663b8cd837d2fba79febd4a907baa17456a55849077c7083a7c9918c8b9ae1bb31a7bfee6f9c3e099f1ffe5dbf798232218d60ad2a64016b1d157a374648a3aa2c4b387ec7f9bad398ab00c41c2958fcbec2e3382cff1e4e0691566e38205d948525ee490c72ad49da469d13a4359a0a582a79cab7696d45398b16e42690480cf84cf109ddb6f06c1c6cd90afe0fd11fc895dabc4af4052c92e9d85d456640d5f2bbdf717112a216230e4b5be7450983c6182afbaf1fc9d917bb2457b33a77f7099551b8ff3cf0dba51903e34071be80e291a7d4eba12f3d4a74ef7105774615bda14ae3ba9272c7eb06cc0028b9cc6a0dd5590574778f31284e4d6d40c7b6195a01f62e6c92073dd4f12ce697ab8df43809aca4ec1e9e2a39ffda57b9e25a45c016f86c0a535e2c0289b58c4ec788826acab1eef3c39a506211269f4e20ff8cc9b22e90f7680c3e4ef3ddca7e9ae051335c9f41b67af5f61a9072e723ed03c61e491d9032fcc50d7eb0ac06fd68ed80a510cf5209c7315ed58fa3ee686b45b47da9fe875ff459a4b487d30361ac2e7ea50a967626853e345f25c5d6d31b993f26933169fa2d958b32104d75f3c6fe232e4e6768138840f04d23b982de6819b34f7384dffe265384f87474921fea0dfef5852979cf035f9da7a6e85014dca1de3afb769c0d4486b844a79a159c4ed519eca166e96cf7b195a97be2fdfc27e4c338aa602b6fd28a3aa2c175f9f4fde69eaba6b84f266d9f0bf043e394c5348c3721d977833e2b1cb0063954a36bd49434e2445c42fd9e54107b28687ea80694a30eebd8dd26c588bf57a0565e3d91cae442b3c96526f711931bc8e5ec447509b38c98b3e659353ab73defc80995833d196847441fe9af24f68deed4dc266ba8563ae7be9102a7bd263415dffc0cc63123c133e9058c82c4c5d8a0cc1aaa6df3951ca685ecac32a7a4b752180a04c97328a122e46c1f20313ffbdbec10245e65b39d8fc30d8020c660d6f4a110a35a75a7af1ca7f2caea1d2d597ce06e52dfe9cd965c2907ece2f8da68610f02a3f8ea899d2b4d3bed114fda919f3fbee95fb486952682cba84588def9c18d2d6d3c55a980db187eba90ef71cb677e6a75ff21bc2841b2d59cc8903b1f0e39cd98ee317fc8722f40ae8b175e69d68baad1ee117dac14f49cad9afbfb73cce14d48d28560c89b0b7345f2053d53dd5faa7a4fcac2695013494b8ba5b2466d85c5b2e0959a2f8ce0f4d23ee354a824d5208f5b504b2d283899fe31e45918df7df9b8af104f95a2f47bd5230d21337c5db15aaf20a567216c02e21225b36b8f86d15217018c84a13218e1f9a5e1d4eb55865e06fb15cd2127af96532eb506bbc425cd4a4bbfdd31b6a6d6838629704ec808d1729aa1e1a53560179cf6a5555f71dc394a691a22f24f58d70cdab6c8548569011ebb527bab2bf147dc810eeb72accfee824a915a781c7853f070186162fc03a9efe5f53a066694e9cfd1e15cd6504c43d58e07f042ea2431f03c9454a53aa91dcdb08093cb516c58494a09a169706b6524e62ba0fc653614da9845533d4017f929e4b26b80e628174fac50faf4482ffbab705112372e037496e179fb14e61a2b965a1d402fda15f0b7c695051334b7ffc277e03fb7f3f433b849531707b555f5385ddbf66b8f1342fc7bfa0dc2b04715117994f200b5883be3c113bb81afe6215ae63fa2e6f811455f67028458864119f04c47caacb9faf85c98f8d1f9c5d030934b421be668131e0d1378ba1dfe014629c730bdba8b51c9ccab4df7832cc72f19b89237467ad6982977a6b372e31ad648f15666a73efc6783fd3c0198764eccc4e14173a67d969b08e5aaea4da1e94e3125053e7d4f3cd3f8e607b86e7918055dfb5166e6900f16a6415fd4415a4eac328e5e85265ba1610dc955751f0b2813a3cd16a5a810caaa54c1385ed1e7d890c68f0d97761f08bbcd12836b5b25adc541b92f185335c0160d32c92ac73818b55faf28cc1e97c967db042db4f6b5846fd760e26cd064d1ec380998acacf0d5bfd5fe438dfa30a5a36cb36afaee1d09423e1616013cb5954a40df4914bb360b6f93a315fefc5674e5f3e4c851639a5cc50e59203921173199388198361ab1afbcc58de50b07e8356cda8a22ef4052c88f856f4545c6659cf670c1715dc657a500a15cda2e030c6429f4b4aa143b938cadf17f5e7dab08b393a6691918eaf5064f09527be9bc6a4396a7329f1148609dff895f78ac2e2be1d38ba1e33a32a6ee9d95ee647766bad6943594e72fba1f242fbf1a41c50143f9f2e7c57dd024ae89032a83c1c3f38ae574ad06493c92dec5a82d07ed38be019e34e707b4d1544b93f68049b2a986e6834e6ff0ded16ee4c6bdfb0821fe27bd1485af6db14c6c407a915c1bed6987ed6c5424c30abee7ff3a65b7477e5e264f61dc434a28cdd6c714d071c1639024dfc2c49eaf4f865b6dcf6780d4edef703923d25e2483d7d36f468e9c295401a1faf4993bf1990ae2de8fa39699b454aaf15abb2652206ec4bd0b44f6083971fb3198a3d2a0709f15126c1d4452d9603f4f6641baf9a94e04faddb4242ca96a1efae76681c75ecab5d93e6e9cfd6b03170fcaf409b7d86ae7ee93a04405dfedc26ea0294d7787755f767bbbda6be5918e65e5feda08319e5d479481e5222b1e2c347064482f9b903786d69a58644aab8ba99a81d26414c52b7f042446dba91c882636974563e953d7cf78a6aae46dba10495e32ea20ff8c3ad67887b5ef94cbc61d5b3aa2500949007f1977bdd17439ffdd7332ab7ffb788665e6b3d8281c37a7ac6f6229b7fc8030f6446e4881eb5686bdad2228f11262d8adf0cae087dcf048806d54d73e096f0c5fa1aa23c71edb07de58fdee476ba1fd65fc8409fce1b15fe30f22266352ccb52d0df213ce7426fd17bba9906c6659af63eb3f19f8fee4897c6e2f7b8a6372541671bd88331f546f3afe2245a8e91ecdce6d515bb1c826b12934a84012ea202d9c4b3eaec717cbf62783e26e713c73ee0e6b60614f4bd2d4b946248be8e4751820786455d729112997fc5f7dd2613f46bfdfeac500d945edf38eaf2ea55fe6dd2b9b4b4b4ddb016ed8e7dd8a052c4df7991840f4148f05f460ee145dd62b942dea6535fae7669a66a16292754ecd9b3b595a4367028229bfedac297d91d29b1fd792c2fe573dd55b5c12b1870d37b44ce1b6efcca8673274551375b9074df3dffafa4bf8d0a292bf71e9ab894adfa3792e0632384e9c8c1be1879c91425cbcca98b7d94032bb6f8de852eab3cd8573299321b122beb9336a711a60e894552be0d4fbfbb1b2dc70fc5e95a5c1c02432084833b062d6fdcbd245600e66c5ceef641fb53df00fa604f41f801755a759b5315a7b59a87a8dadefcd6714379d653bf40487f63af1f07d684ffe53f5be3e2516b5a07c3d2f06cf5849a124176af2294f760afff7656d7f806d98798696d9ad540683b3623fe60717ab245dfa031416f37d9721b0dda06f296bc1279422efb52cee7c0c9c0db70aba8a6834a4f88bdc4613cae71aa59ac3b54639c3de53a5ccbe60ce5890048ee1133e0a04e6e43df9543a6ce16f5394da87ff9f4e914291259a46f580e1a4fa1f8a26b4fb3ff4478cce0894936a9a2b4bde8ab1a624e279880ae95685b41eb702b1cd8f307b525a84b3e9573f5a5b79543cbcdf8c24a941e728fd192e0aba7cd834a9f9ece827c04499d8d90f6df9ae25fa82a125638fa973923ea6bdf11e0e22617d45b08be44a65294f577a42513a97b89ef76108280f9b6fee6ee1d6605b429dbd4651f5becdf1d85b9027092aed8db137afc3f9ce06bcb9b9d42649e7389b7682a3b7d1c1eec885b04c63012732bffa745e97e5fb2c4fc7668a0694f23a2db0b1f6fa1594f58d181f4123ea6bd21c42c6e38a259648007ad935512d9029bbdcf7fdfd556dbe820cff3b23ddb464bb12d3eec4407fd43913d7572a8407b84fc7da483026f8276cb4941b2457c7f1a597287f1fc24cae4a5293ee6a7a6ad9620f4b5326dcd6168286ab83b419ac5197124368668182b49fd371f93c7341ba62d800c3c7d07ddc3d5beb37b4a5cfdb210017e21e9d30643865002fa566f0888c47b4a7fb9a878f8de8cdacfd1d4fed1b3f1537676c237f784649171bbc11567fe9f0d7193698018c9fc4099792305a8b14f0fe9f28b7bb96d9f8d9ccd77f3733b3bf038092134a8c1e6ba9a0acc57625dae842b8b8c3492160f1ed49188ebbf9a5a2b5a0dfcf1af26b23c5c7d87ab498eb9b804d7e7fa26197d37507e7f69fd151a771e0f1a2767b05bd741ad0f599aff8c8e4616b1a8a0dc04ac376883e8efef7e4b3ffe56614aeb36d46d3a42d13468b4320d5b81b460392dd4923c3e809d04a944c13adc8d4db621cd4a57c47564b18fa47e943775b00ddcea08f461812144679f4a9140fb9680cb4745cbd9125258d8ca7addf7aff86537e838960bb29ef3d3c214e2be8f639e5874ac05f1d47d5dfa08ef590e41017607d9748b10365b44829102f8159f0bc51281ad37d309df4e96539f549da597ac631c54c48f33df7d0f8b65ff8201f449ce1d90e1301b837f7c45133aaeafcd79c88a0314756cd5f669209014c34f09aaefb5bfc97e240f8717010d40db6502080f752ae1b26a2378c4329b8635315400b1b97b53dcb8755a8d5ff12f44a0fa7b13ec44a7caa2f2cbf0ddb4ce1508f21769c2238fd76c5a7979025a2b67a49f0d544a1daf4d5ef39b1549d78cf2fd6934cc13ff2534b7f8074c49371ea1b03a97cc41014e31bc706a90a27b28c9af99fca8f053e6b8d8cf828f95138e0f7b1ea68c6f716f88c38c9d13e37817b08ef0341377807582216cdfba361bbd3d5b62815b8b8ecb9eb92068d8640087d19d367b424ae0bd2703c5fd512bc3917d0923ce32b599fb71bb5939742530bb1bb5a7dedd4e57a63a67433cf44046e3720d3c9939fd1fb91316e03f5ca875658099f2d1097a84ee086ed0fb80c06148d6d78ae111a85781e70b0ea5d356a029dde26694cabb41bb9d13b4178f46fa3ac7629ac2148cd8a67027c97fd24d448bbd5404423021c0bab30194e4cc25d8abcdade59da031458b1d1849646c5a79067d0c271a6d3c43a887c92f9cb38b2756a6dbb4a0e383621b9601d46afbcd47f6e88e2d66100f7f3e1c6a80521e62ff11ebae77c87f6a1953e5c50979bdb100332568e4143252b59c9d1f4f1a63c46de12a7fc7710834d46fbdbc47cad179c5c918ce88155d9589a95f6b7e850b8383748befc31c9d9d113cc70351f1af1cff0be4fdcd11e8891cd19ad42b13882eac9d5131edc747fe260fe396cb39bb7618d2d85f027de300b0a69962fb7bb3ba2e2e3c6bbf007c047300a390f38ea85659030cc6b8a41bd908435f19b10add1dfcd1c96a9c1d38e32547608aa226dbb71e77782b8d82f36b50fe3077eca7925eedd59b59103e1315a4ae0b38d73af82b9964817a9127436cccab161d74a3dab2c7c7dcca7a1cec2feb91df60cf73e7e97a78123a037af1335750f74a734aa867489a3880c9ad44a7e931d55b192af3e5dfbf436066e682176715a653f6ab251cd70fd792cfaa78ad27933667976b90b76a304478a045ce79ceeaf9a5f16a625d47e33adad459cddab6962069a45fb122defd534f16a077bb67fa13cf11e9ff6f0ecc1e5787d3de6d718f86d291f4a0869bcd411a6742ed71e59fff8bbc6c7f6e54f1e2caa1f0b7397d1210fab55a40f614bcf0b6116739ebef5e94c8590825a862d0ff078753c6cbcc6a52fb2e2a53ceb6a6df9904a28eb75346c591e90870c5ca445211cbe953b0412cea290516241f06f2c497a69aec8632ae724cea8b3946fffe1264889d17abdfb9ff8548052112a93ec32aa125d3e59039144bc9e0ae14207941c6faba4f307b8726c717dda9f135084298aa3b4533e47f50039a0963e950c7cbb5fb41a3fadd13d9e9c81c3d5dcb1b4cdb93fbbd7046f893b0f863dc00511d063e7c5ee19091f5bbc4f5fb53a94afb7c49b2ccbef3384a38ed95081e5126ffa36caec5bd02c6d00dbe0e061370be77cd142baea4089325c1ff993ea4e95c00963fe0b90898927678caf92cadfcd95b81ed2febebd8a8e0db029a95d3182f8c13234f0d7ef48a1233594bac540528cd7bdf591d62bcc4af4fc68c75b90f45abc93cde2305f10eaecb36ecdd86257e4cd67c71c6f2e94d8443fb0d3f4aee69c8ffc2d65c01517284b586b9afb3597278467b6c83404fb7b5cde3ae22a3fb2e19dbf493fc3820be83e1c77c1c1e0f0fabfb7ee415a01d666dc68651385ce33cedf38a7cfd74dba58dbee0fadbfeecce1baf33215dfd3fd345a955ab2382630d848ad1583bf08323f9e8d91da780ee5711baaea0e1082e7983b0764419c8a99001beec43a59ca2868c7eebe6dcaedf00c0a8b602d8e65f6184a0889933c8fd92ce05427e5638a5ae84be6f61c5a8dcc359e45536cf54dd3b57c040e06a9dae8049d15ed0b431f8888cfe2e023c29ed1d80c48404209b7f8c5783c48b3290afe0592651eb87c0588590ccd1e2a9c31f5fcbe45ecb6bc585112018c6032e40efe00f8910e4a1940c17ee0f668a9b2ee1f1d30950bee5f0523771a41ad7d4ce9642279989e91f2da209410b3d5553fab9828fc484d4a8598c791d226bebc5cafc3e07a68c8fb72c589480ced26c82c7971b16b42a07fc502cc748a30ea66d1c88cc003cade5531a439302a563e5f60a6cac85acc07364e9adca2ea8db99e088d3e96242b8c853c0854fded85974a2849678130b652d711379d6293255f433dfd0e334b12e1158bb4b67ca4d7a770ba0bf7427befe13eee90b07fb5e90f2fac21e6c03a440c32b2e1a815cca922d99f597369348b59cfd3707bcc2c5693dfda677155d1a89a4d329f9ff7273208fd30e7b20ce8e322bb79140a3556e066f14adf2b626231cf1a743def88bbc8ac739762f76899d4f0a6739bd4cb0169c31454307b081b052fa8bdfcc22f0bef873f306e6754c9b92d315a8bccc653cf100ed6164b3abff3937446b1115a92cebdede703bc2e391efa9b57258360ee5476e10b867efbe0fc3a4204e4b1c4badb0ca5c2925780143093912d75844f844d4dee4f25dcb069e9d62f8963acb324b735cb711562169ae64eaa9f960cf33cd20ef9e36862018287e8213bd6ef9ae2e060bb10017d6e3a4140d403a24b428db5419a837f6a25c9a3098bc485aeb78cd5d72877cb191419592805ac3dec67b6d0c5fb3ebeb1c93afca21304463ad28a95aba0d811bab1bdfa9be4290036132924f6d549a6a80dd7b865c463f7212d653c88ed4dfa03aee6718ca503db60a05c140b052e795a830cd013b38c0eb87b649589067df87076cddc69bdea2beb5e8ff4614708e69b591fe2aa2f75a2c6ab5c2573efca88287b07b61055f8f0457e9ff857184ef7c14b9a39cb937b520ffb1c831e06c743b9f6cb1264f5374cff09fdd8519959a5063c447b8edffb6ddbfa01f3c74bd6a534517668bc076f69e40ef0f116c2a1d1ebcb72cc20759e7495213350ad2bb96a838f585e491d651a3a88af242c275f624bbcffec6fa6cfc0276be830205dccf4cc88f6c2a007d2dee7fb8d6a4442da37f59e75b427029009eb8bc64fe32987312eb052e089fcc2e752883c800db3950df4fa18288b1d59365ec95044d6b65c4c9211f2e9b8b1c9fbef1120ddac1978915f0b5edd23310a14038910b437524ae618d813f9854d956b4d34bbffe0e234db029c5cb90d63d99f044fbb84d8f79732421b6f29ae3f661fa99ed96c618bcf973d86a305877e322ff0fe38b5c8099c7e67240e17126164c7d7de4347bca2f4455e8c3185e75ef62798365c511a9fddc057af41005f64df6b9b2bb7494971596adab727631f8e389a8193b9e829eebe45401079a246afb127945dc13140c52a537f1f896db5087f6fa96e42089b7096dfd4cc914d02aff24010c666c358b2d99d0fcb5a97b2f769e4211c761c57fcd09c6addaaa899ff7c7b88aa5e6eee4bd3cb2bc59bbee70b1bae68c75659d20023e0b2f0bfee167b7592a77c08d423a82c02dc75e74724c47809b9cbad10143d40f5c5e1c702d4496f928bf84d9fbd2d1475a89280544fec23b8ac04208ad0a6beeaf4360c7eb3ed7e765ce9f085bc01748c8c5e59ec13a7d7c14af905f6d57dd48688474fbacc4ca28d94ec96c6cd05762879560494d4e8eb3c256e61efbb4aa2145b12e487c23960e661e07a95a782aedf7bf938f4ef1022455977d32b1866d009694c5d8b2b3b698bcf445ef7687c0c348a4ee4abe7f394e0f2be7cf81164e016a738bf8d5f155f1919978275032dcf8d759b070080ae7f769465bb52a75cd64331c7cbe558bf5a64ae324a60db1504d6876608152208fa51c77defe71dd58a61f86650d3ce5abf5cb1d3e062ce2a1761b9a42d87aba7ad0d3622b3acaedff966a0da3a5af5b50b2820140114df49bd09e44c27f92dabbb6d0651523ff74d2c402b5e85e2fc290010cca97a7ed56e428539608fd44d6a6358899ab8fc54a60bcbecb14417fe29fad346d96e3c500be2644eeceac2c0021d6b3a7c04551a6959f13a8281bcd3a740c094a3ecded0a836db21bbc36d9891abd759b57006b44de99dd7d4d06b155cfc8a123f7b332a2230e2ac7c399cc407eb6cacc0c9f00c2af26de52273e98ce4e72a4fe5630b55e3da52d79e9f617cab68fb9a9fb73ee26a92ab0753653543ca145db0ba1301838f5b37249d0ffc8b08d0e3858d78fcb60cedc28b1b9a706c315a311ffab432aec0bb7008bde7800f381a69e2502dffa7007ad0c7d327de017c984da2990e2c81727a16fe7e3d324ad1833fa070009cc56475a85a7ba94e10232c650e8b9a8c0cfe95bfeae846896c7a3db49f559d4ede15022ef63e52c1afa2b374b87658b95d9a974436dc6557ef8cb656ea9be94c05ecc0477c42fa183138124afda1222e7cc8f8cdbf4f8b7b055a4abf502770d2351fe4e9192ab61e638e3525dcf2a77ac01506a9cc932d1305fd37821f78ffeb42e278725195489917238154b680e631f549300ec674b234a78731e60e015c3fc32bf1e612903eb46d0b6df1960947f07fb6dda2ad7b8ffb804c72e56fb9b7e3f7ee90a3ccd1f8e0a14abaa15795a7f0b79cf1b4ebe4d59251dd270233a764dd07e6eefb8172ca39e3b40165ab986857175c9344df72eb74ec3f586a0539a67ce35f15e29384f68ae3ce179ec9611234daee957b9d8858de7b5d0d9e814c1b673cf05d591cc50ca4c63e46aa32b98baf59ea2d814e9a6280bef2dda1ea595f4da7cc4e6206edb9ec622c3425e9f5512043308446ac093e7d38226433b9d7ace2ef4bec6c0fc890a60954175e7d2e4f9ddeed283a9387063bacd85d7ece788190e0fd0c22e1560389e72b1c4233e37e044bc49f4b1eedaf05e00ba60c0a6e1ac4d1ded45fe355ae1bb84b5d1a430fd2c5c5398602fca445951304ea73c19a01548ab26cac9d1edb574481065e8c255e6956a1c243f3369fc5d8c4585a5127e60d24e5c661baa229b93666ea900f20a4235479e1903036376052c28209066e4b5d43f356fc3f2cfc0517d2f885a3b806bba07466275e3b1ff0b180a9c4cb2cf8db652e31092606c6e75fafa514a56bafe0879905efffc8e968652e75c22ee69ca2ff2be0e38c919b7f992e69a3fc8823c7d47625e8a9b7c013ed68ec5f6d5294e18010b80cfd4d93a11ffc7fbe17e393fded7525b8fe7c9f7d05fb4b794146605e29fbe2c50d7223dee6a1007611da3004515f6d219e41cca6b27f879a9fd1ef253d09af5ca2bec5a2974b76be2f04a428db5069bfe8bbe72b947989ecb07b35071e573c20dbb1de0c8a881e96aa055ef9e17a7144d75003f374c70adc9bac6e942167391ec73ff851de02f3142866ad766a3338b55f7f853c16635ae8ebd2282ea9bab4f336a935543678b4d025dfa89bd81ee151c965877d29b09d6927701b7f15b7d2db2d64597ba863a4e7ba605baffe1933e4e54e2b8f02b70cfb56072f79e56e3027f04f8c19b2f85b6386b6f0595dd97db426a735b0f2f2c03e00fb609362dbc0cec9a56a63f79d069d4a2fa1b37e9bc9f6fed20403b50cf6b10064d8ac62e6d4dfd34df2056fade3a004482b61fbf73c8900eb23358461d8c6e8b59d2ed9ead5138a8f67457d9b1ec652d1979682ec3735cab95c907cd749316bd1dffca951c31ba240aad247eb91d3c7fcdbfdd7790b9cab81444f8ac4c7a7e03b104913b5e3290d8349ffbe99a1ed1d44965b1760bed473d019e804f6d7f35c3c55a41eaf65b7a06f00350deb446a2d483a95f861c874a7154696256afe124ed95968c22b47d65376c490986cdc47091665cc3047de04b4d07e2decf3ceefcb7c22d73a1682fea60c86ad6c3e447d88dec686dc292a642eb97e1bf532f0249a9b83544c2c3b94a2ab69618c8352437440802fa84eb359a43c0270e6ca62acbffcd182aab4dbc54023ebf7ba9cbd03fe11030d3db1c7a55612fe211b907a6a28beaf8f561a59dc27eaaf16e5b0b4ade76176994d45fccf700cedb55333e766b8947bfb19ff64604a9a61a04da69bf7d3e26038bda81d4139d392d90ceb6f4ed6ec5b6229a52b9ffe32e2e26dc8fc176ffe926deabb3099255954ab8c2e4e7d4bd9937cb954555d7c0b3eab7969403b2c7a30425f57b6b83ccc97125feac6d78e35362ce03ed12c6db270c3ae52f73761688c7ac0f797f656e766d5f4e91d9b086de5d8b82f54912e07df47bb0edfc64b2ff18f4fbe5109edc178e6940b22b17861d087afb1603b0d9fb46e4501fd2fec4996ff25eb6fb42dbf9e9e440c7d2b71ac375ea23919b74f47e6d8a39d3a619920d65b9cc91f1406ad1a1bb61cc7e24490ff8c1f26cebbb1c4bf201325851def0f1a4ba9abd488e29982817388c52ed979005fcb1dca4e07f103df755d341749d2c9cbe6b095195d2e1bfab4d95a6ed8bb5a15177ba45482f3236ec3cdf4066c89cea1d299364abe40baabe1a9e5fd95b28b9b7908aa5cce67b67422f2fb9c885e59d1979d279a406b8c2be396f8afc4b420b590a08c7a80def54c9237d62407ee6330311529b2f7cc5c777d04f874d174ae56b593ea3653b6185708958b19c4b3ef2fc0dd010126e42a8e8b62c9911a8e17a91eabd75a5c0e4f03e0a20876e681b1ceb99c75ce8143173e01c643a1abd6f57bdbca2f7246c926c9ec6412f4681bc8a463d4e95d26d777625efa2f9c36d36b66118ce70f54634c278c74d8d88834616bbc3e189003ca92da6c272ec104140c70435381708225c772236138fe3515a8586a5dc1f5432a7f8f37ffe42c13887739e97c177f7b065a0401e5ffc8935b77784bff2ab8686f59438acc84b3eaf8e7a025ba0cded94cbbe7ab8a109a18422f36e6edc17ea06aec07d19f57e677b360834447b2721f367c59ee130651f582162d821eec499fed710c8a979df11f60c43ab30e42c0a01659a5ae6d2055ba981ee8aa52e7a0523cc969550c3ab3eb99a02780a0891bbf88ce0743f4fcdfc77ba2aefd0ac1d9496419193da90ffaf568c6d47cb64c8f2da7f04a21654ddf9b7ef23d9361b61d322c1bd4250acbea73ddf9ddf78c6a196fcbb522ada82986cd76541732a8fc7ab93021c6c6e88e5bdcd2097e739e9431bca3dec220ffed898da0fd134428ee7d06f5b9f21e4ccdc059f0b35160b9ac7ba3e149489a42f95fbb5334f38c75f7ed5587206db85284f9d783faf5474dfbcec0d3a480df333f501dd81b477854b11052bfe9e2259b3fa02e8e7128a50f2576cfd9fba26aa5729df1384cc9508601184a4a7b54fc7f57fc953cda67487f7abf4d53861c712e0919b7f1c7c78ceecc7a850922e75b886bcedfcf13ada0203607cf54eda259f4ab25c1c1598942398ce7b663e46f876cae715b7bd5c2df59e41c85500ca90f56509105ffa9fd4fbb0b9a1c8267cc6ec4bd3b3cbcf8d22fe7d2f55fc56f600907654114f5b96490367743a9fb5b3fc54a7d0da67440d4c2ac27e2cb41856c047f48aac295c5a85231fc8e2e907299ebf8852741bab978e770622f30377397fb4496c725df34600663bc40638ec3629de9a344da73c15f98a07aa4749903e3d33dbb2bf83af00145ebb6e2a730d4175ceeb45e90b2358933b006e94a2feef5d00ed80bd96fff4790ba1a34a8b46c85464208c4a02d9e800aeea769b3b2fcd2bf697c15384ddec0ff672f28bf13d622a1ee90cda376c6167f92234b402b420e0f3b52481738eda764282ce8d20da0145550f537602fe391b610a331be1fb0f2a45ca1ac5406fcf1d12e0a6c433a9d295b55d6669e76d9e14aefad05fa357d444535a6638976f82da7620a09085e94d6d99c4717525234098de8f3a30f46197a0f28cc0951c2c71c0852b26faa7dfabffec50b8b746fb2af5b3fd5a0813ae7c85605abf78aa14a2cca1af8723e0e30006c146c76093a2b9bc8a0b509fe5a6178412267dd7a61de48406da3289bb0ef56ef95f4fa846f90cd82bdc973f2cfc70f9ac119ff425bb79a17955b410bd7a02b09d9fc075ce5b2804c712855246bd22ad93e48e67ab8e70bc4207a1ea0029d582eed0e12fe38920bd47b7a89a78788b85c2f44343f63c9774241a99e96a7996ce8dd6e185c2577d13c0b91b52412d47ba6e8405ca5e70ddbc9acffa0a843d119e39ac6b6815254306d0c576c70c53a9a4ee33f8889118c4e15f6d03d776dd994538d7ff436a8bd8f640ff476b6ebf99dbe8600b6a353805b217a6bc3db530e6357a9c6055326faacf1c6a9e6ef073ae6b14884d8760f6641a936e0af59c2d5b6381439449e0a928d8619c2473ea08fdd8d6f252c0b1cfc0d43f98dbdf514ae9defbe869020aa3838e8f431e8a369e3e9534c8687d76deb181b69748ee6d5d6e4c4f676593a85acc7db4e4a5e2b30bb9e47eca548d5e96b8f0f8ba5baa3349842e3389012f3b00a8f239a3f7d6c0c33ec5713a8dc86bbd251630441993bbb6a55e4e92665cde3c2a4da6172924c3301b278cfbfa06cec0e81bd3f68c1db4289cb8e2802864312e5dea8844eefa881a732f1a229adbb8149273dc44ac36f408d0e8bff58694259be99b9ec96040ce5fb35357d7f395756f67f391c48773bf7a98210e6247f701c1167eb1864d03e078c2be56b0d33912f6bd5eb445a0f600928405092312fd555f03403e988b495f590314cd326e273f66c7d67780adeeb298e6c8ab1a62d5a67ca68ab82661001a3614c982d86ed6561407ca5be2e951274f8c321c1920f2748eac18128625fdb508a12b4fb2f9c0f97b0137ddb776d4b04006cfd7967cec148cd686a1fbe02d969bdade5669bc5c6c32f7f20e1f600a03dcf82efc17bc5639a476b27604ebbc66ec5ab990adb37b45259f0812c5febd18630a975c2d1c581db60b0bdb545a69be8c5f139ead491d121fdf4fdb2ecf1297e73e4ad90af8266bca004659d73d7ce71023de7465089b5e36fd9ad8803ea473a0478414b896bfce6d3330f98ee2a463c9388bf09f0e1e022a943b7b6d3f9b9411a1baae082aa7f417caba0e121c8c8670d07051223cc25933a86ce59aa7ffc8605ef7b2d40a289bffe1098ecc954384d5164a3fb7390ad8a7ae05b5b5cc5885013c414136bd53f353dcf3f28683aecc7a63e85b6ea0e57d6003bf47af95fda6a1d659a5ba0afd7f84c794b1057caac2ee5e1c89306df52eaa0db62a44769136f8d64f7ac4938547671aad6d55978035f585430d726144db48258bf10a9acd29f48bd5d8bf98f9de64c723012e17d570f089b367811fe8aa122af26279a12af30b913dc8407562a40694c04949add0bf2cb60161d20501e86036616e4fbab32d81fd5370e0e57740d4815c2915eccb87d752183e2d65f3e32ca1c0e47dbe97ba557c606414922c3b2f7a04079aa1cd675d3be642d85b9e0ff24ff023eb50276630606b6b1e5301c36b6b02a2f97bcfae001aec29c8a4aeb99c59a1bad8b2471bcbc98762f4268c8fd84e339f4454d25d9a082fc4095d03f8c2db1f63a8b2966707823511e92f5292cca3ba1e70e433139c898da187ff274002db6c05e002694be62fe8440a209499c06a19c21af56ea53a9f281c2ac7d61c90087f4666db4da54d168cfd72045436557885bf6e5e4fc89c1b7ee8df48ab33e1896350c77127ae23e4de8d3f2b6b8d098b24282c75f2240bd218b79a84d4d1c349c782f2e449af96ef061ec351730812bc3d6672f32f7d8a843970ac10b0d1ab25d7bdf90ce4908ceb802392308fd7c802694883484cf84b0dbccf534141c163251504afbc24381b2b2dcd0bdaa5f700b352e9692b29674d7318f5d1bfe94468285839c566a7b570eee89e1d61676bc6f369874dd3871dea0deac0210abc09a28e18eab72f88415c3d93814c7defebe7763612a75af3965cf936db232f28b07467d1dba98587d57a71297a5368b7105ee28f61c30f258d30c75dab815be0907ea50c71228feb33b203d26f05877472b162dbb5b73c2189b75ec1fc341c62cd69d285fb76960f9567ee549b26f299b73adb51b840ea8125aa4862388ec8de3f8b44f9b7e1faa799c5be5dce98db991e3d13214a3d0815cb213031864de38d45f6f1fab9fceaa8634addb4c63c9d030d8fba5aad3eeb990ee9a07b1be681525ed25ad5dd0d4718db1c7757be125b9cb21d6c06f2e235f461177dc6d8acd3cb24d8b8a397b974e48e64c59211c4e041686bc8b2534f5b4c3091653a362fe04647390adc1093391296ddb2a90b1c1dbc40fd81a3e2d08278a5274601712bf655a6a50a34cb3d31d3ff12ee9543d353db4ff961281d816140e50dc041a1ebef16d69ec5bcce556c21476786c8f3a7858d97791b2731ad604ea0321c6d74fbd8ef020a465fcd637126da6ed68a01f83612a7dcc2ee551e5ff5c85defe408649ed4e29cafc13d3e183c5e93beea2b9bc4a372ec132ae7c335354620db1f0a178269830f80d2284c5fdb1075858c77349985215ca712aff2fa2e1762d5700e8b3a9f339d5f2a0841e4296c9ac1c4e5a45967a2abdc6e2834e549950fdc188644925930b85b2d1e58da30f2a7731c2d6013299a32275489935e68b985932a9600feef94e8721a6de284e80eade031fd98e5d2b7175a9ffc505c6c8aa569175d8a478b09d617efb40dd6212226500e746e0bc8bc16931e77ac8ad6964642bff24c43da3554adc70a00eae0eff4d84ea0aebe558be9e82dd26d17141842b3bd04eb20f5992e015ad7fbd887d864db96ccf269c9490b7c0b1c9b86020299eece90eaab9a31d5a28b4437484ef8eb0bc1f01329fe148f382962cd2cdfa95b28e2e749c4da0b3969779b742c3a85b93dbac26cb12c325d8b8752d2de10b052f6512b2b95ad79ff1ef978e211e1fc17b463396c79f9e991895c39966ad575b8a27e06df41f42d99ef1a0532d0ffd7510bcb2b0687c5bebfdd2dbd85a4f319a168cc2b3b516489414ea000746dc3bc653b3474ce89af9e0966efe8489be93fa8494533eb04baefd972dedac8f1a9e416df438c113a93847d1871cfab2aea9d17569896e01d5ecd8fb224f54e477e6b0858443133374758c64f52e40d75e0fa7164f1889798bac398d7f087fcb3ee96b70e196b79c98fbd74118e495011d22b9a5063173d9a044dbfd66fd7b228477af15287ab18a42b0574979be4bd0c9c5fa1a5c0f832d6fd9969b4806acf026e3a5a6abb288de53da8a29897bbcfa85693267ff1806b3599b04b4a22a6af27db56dbfce255be896b741252e8256359b32294d59e28e32b41cebe767c0d62a78b87a844da217429e14f3a6f0787e28cc85899de451a6228627fe3810d9b8081e440ad8b067f30b44915761c2ce184dc152fef951dfc11bd5775b9f228aedb7855af411a954eb8cdb02386679a481294f122a78f894ced5c465a648fb44667d15be7a6645defa2c62cabbf7d8d047480eb5a98d4b05bafe5befd4a83a3b1281d720326120be907824a688e5c6e2e88e76a8075cd6ed1c9b76e8e93f33b385505d13e9f2fe9e50c75f4ca9a26ed0dcae6622c9d8f6ef00a63434d758110c6a85abd58f8ab6d5f3fe2203cf5cbd7f3c4bee6256065235991e4b49eb6d87e82e9ab679dc768bc34205fd085e8746efde135b6b123a1268e60accd0224d655060162c3fdf72e7d206497c0ed8c4edf09b2fcc30ce73c2565017959138f11841972b0626412f6ccacb6391a12e227f4eda68fa8cdcc5285a2af7fa7296f613593a58b95670bd64bae9055c993f6125323443a95b3cdeb5fcb23d0fcc04bc4afa62b1476174d603a0e2b6237733eafadb9900342747c47207cab5c754bdab955be6b69bda69988459ab775d570e87fe6fb80f2a282b703338a3c6dba723e05dd9c6fc50d0f9cb99bd8d96bf1c5fcf9080848065f372afbd522258a52c6a6e42da3827a4af96b81d1c94d6b0d062d416f59c1bf7aba161d9b04ffe3cb163c77e344046d00b6ed94f6d1ac1d561bd4aaf971695eed00e4eb911a32a05758ed4fd6fad288eb35e6d13c7281a62aad81b890b4580d4fea8c14dea2f05087a0e5acacacf7537bb55b29bd7379847ccc52dd71b44d927a6689c94bb41a38aab42361c367a031a6cbe55d2cf608174f4a840cb09e60a99e05b9742e76214a1f2bfc591d6a44eba4b1b316c3317354a011f9f9095bb4ed8b237f39de49d4a3213fd8fd11d6e7094465064c0bc47b5940717ca1041aa66aad1bd88e3dfc5fae2c12d5f81e471a18bc31b2a5328dca25707bfa2a64fa5b0daaf69cd81f876929353e79075201e9fdb5e0100cbf328296175c52ecb0bf0ad6b29e49ac66d2140ea03d07517962ecd96211fc2e27196a35c8b998e6d4a8fe551ef743f36adf618c195516e0bd34c4e930bec236beff0e6c1dcd1dd1ad1ffd86411972c5a2368749e38b42ad41135ef3075088a6c216f8f58738d5f870e6b65e275dea25e466b2f6bd3772ad63dbce0737c26e24290c3f0ce2159fe1161dbd1fb3d72552d408aa5a2c0692d481bea2f328b494e386bf03ae5b0d1058304997ba1ff7af0acbbd142f1e850e61f3f83151943d84c01ff92367c8992b7a005895a1359e7dd405e4509f3bf58e35cdfbe43e263cc85b6854867faaad7862affce0d1acd198ee8d3928b34d75f13feafebd2908e2c172954715bd34db9fc0631d055518f700a44346c9f113a0494b96630fc005d40cff1cf9270b26c7adbd9fc4d1ae97c0b40f1d3933adea0c7f069482dbfe56cf6b8d238e14e21fd2c1dfd8601e7b16f50c7a81375334c86a0b67a2e3378e884cc9dbd24f6fe02e4033a26c62037f98223a91da80a3d9d58b61fdf6f6ad59b94b945ebfb9a6996234c620195e96d38d59219e7853de713adc2e888defb0e5453a07a8792835bec4cce44747c8f857c4ce363ede5cf282b181aeef5f01aa4aa3e1b9710d678fe124a15d8152f98dda6e0ef93c5f86b4775e43322f0fc28bcd9ad009a51f92e301a2d69abe0d40a30021bbe120beb11c842d4bae81cf769d23be1bd8aa9ff0510d29fc026f86ad1e045805ae685881cf27d74c1aee8ae52b94c7c80e0464afe26a8a211328691be73e469cd1daac23be902ad19bf6a95de5b3a1d85cb7f5aa14a42c568c860a67336e4b53f080e696340d1ca0e5635a6d67bcda6beef1f96252be74265b77d1e581cc260088ff092c01a3d3f3c487e857abd847c2ff942498c8e1c79f427ca740e3f64b75a39ef9d1bb001931fde40684baf93fca6d85a8d799bfc54699f00a4727951e2e676374dc35c1584983acd3826315c2f02396427984d8c80efd7358f54d772fb2da36a267b466c3b17fadba7b6a950fa14ba2a84a7af4be3e1cfa3c7fe9a12d51545088160d328c14eaef5ab4809540e733597f8c3800f6a2fd7ed43c8faa26adc23ec9d31bd945be3e333b4a190905fe41d635d7c72a138403e748b5af5c6a4bb06b2821904361da60fce6cdc3071d185549f90a6e21787f54dbdcd9126934d4e39b9988e20cf10895d9511f5b6c824bf2779f4f1add9b7be6e8fc4b3f0fab058905acabf3b44e84335927ed33dcb7e2b0420d5da0d113b8bcbbb5bffa047e2a5a6fc6adf0b121a71bf13398e3b3402fa662daa5969c54eecf5bd32530718b400c2bf12a4bb2df05d3cc6620415c8f8c1c7578686ea95516ed2d4fe70f113799e8ad78a8977c6039ea609e5f52cc4abd151045ff5ff77e90e8eb34d8865841c3805f2748b4050137f73d13745f156bcb47e707c32307da0e081379a5f008cb768a85506aa1fa571ae7ebd25a30cfc2b14f83490ee9e678f83d644260705d89e9021a0190a7c431c043fe60bd3506cfdd3f734534a1af2002af88dba1644c6d645b55ee3364106fd1bb43c433ad4969cb10a53b2c3e8db442706a0a50e4adf55ebbf394e7e66a2f6e9d274db41e4c9b12a73148e75a6eb224282017e5f54342935eda273ea22da221160c8ca740719789684b0f010aa96ae8dd06ff07f06fce5dc7843ca2d6b41d9db778a0f0f61468661df195a4e9e996b43252c3ec3645e6718989f022ae72416530b407af0b77955a886aff3c4a6ef72b196289773a0c9594e2a4a78f110470f11979f5ea91ce9594dd3b2f3044239e8a0584bc56a2441ca6c1293c82e0dc17b7e392d637332370b788b96ca8ebf388bdc70b2bf91761d5aec4c327be18b0753d2eef987c565f0940f7e5aca6baf28a5bddf6a34569ae1d1fb4107f6d2ecd7e4665279212c320bdfdb247cbe36cbcade333cec90287f7ba118780e5d7cc62034141fdebd8a45574a4ee54cacbd8b484f76ae5f93ad694c6695386a0492dd521da5926dbc55b1509ed5040c0f71dcd3d1bd9e3fa7321785496f264f655a4617f5243a44ded175d0c79a39ceb87cbd88eddb3e6a291d8344c5246f6fc506e30f584e1b2ee0a2536e950cea6bbdea7d4027cb5d17b31e6fdc320e883d85422d11f752fac1fd1bd9fe72a0c3db2ad5177b94d9cca55acddfee1130ed0e9b795ee42cbe0a76150069002295a42a0a3eda14aedd51b6ea4585177d2a3c29318116b1222dfe65e89ba9b6d7dc6995ebbd2b96dd00fa999c9f70644da842bc139dd996b96336746c086744fb2ef45ebd39d4e1a7924036e906c5d365bae54a69aedc35a29d72d446fe80a17d1575861e228866e0e1293ae7413a01b01d42847b4e0b9660ea1fd575eff8a1006ee9c4286ede10962140ac9b09934f94238ba2a8f07b433677cf11058f7c5eee37ff650ca7b3f5fea983ef1e323246796a34337aa3457b12924d3314ae6f93793db9eb163e474322b94f8274f035f71aecce88e46b4077f62c920a3fcd52b284ae657218997cd40fa16a776d04a4045680d556446984ee7d4dafbf5be3b87e124fa3d35110d22f5634cacfa086833b41d9edc1422b18aa23b98c22464d121c12bc52f870e6312db42cbf87e06f2036e85c9fa125594bc92fcf5604e7f70f85607806057c12eb081f6738eacc815227a6da7f1b18153dde032d72564d502fa38ffd8167f7aadb3817878b6d6d5398ce03355531bda1d580bc820e25e53a68d828da266271e17fdafda3ca08405b6f76fae4e98fc5979538abfd90796376e812b00df4bd5d13ed1bf4fc84d68800ca9f1d0baabab80ca6f221361f218d9f7df95e141311a7146b7a9e18cd9289788dca7332a31fbfdeabd387ff5c28e94f64bd1e39eb1633c6e4150968b0d864a4fc84322ff05d059025c955bd78e4dcbdf640020d802d05ea1b9a849474c31e1d6a11ddac1dd74540fa169ec8d44c2df707fa3e6241041a3e083d8e59221024d2df8518412479544270f7990ed50a848a63f941192080c39eef633742f08d58c86c60cc106392090ab6654acca85229652fce01ce4fb088ac4e6bd254ab3ec26278418f82af53b1393cec830ca9770a79947d71e131e5a4f7f127258f7d49e6ef248b9b751ee8a81922caffa622ff14d02a6b34dd7a580c72dce73bf494050e596b05eabbc10a31f86c40f7ea231999117bbf9f18a249b766bbc3653fc090515c34219d6f53224e28ae69b5da2612fe2d9dca810265a1b32b045c122a67e157e7058a204d65b71585be977ed93ce887a14d7eb43f0aa4e7cb1e41c0130d7be772bbb2bbe4dff237b10cb49679b436a12347e92c0db64a2ecfd0e3910b3a3e17c54b70952cf5f5ba24a449026d4cbac8953606095f8977d3a28ef798b400bb91876f051b53e4eaa8d186aa4b606a4e4e991bc82b68372197d9d17474114658180849983ebb3a45bf538f2be7ab64458a0bd2466a9c343ac1f41d33da1c1b748b2764599ea6a06b4bdc6a72666e1b300fdfc5ecf102714c9fd57df76fdf47139f8dbf8ae598636468c43d3eb0bccfc8ae7de4e17b1d6f98455b527b8ef7e3a6f600abe2b13c1a283171164c16baa5953c17821a7ce5feac673c05a56b287453ce3a0bf5048f0999b7711604d6cdeaf3cdfd661fa21fc5bf18de929671c801f00415eaecd35abda30714b74a43b5e56a05414eb1b18d9f817aa91339359efb23dba4c411434ed7a5a0f7830d5fe24feb9264e3140db4c70f90f7351251e9888a11b2fb9e06ad63b0046ef0d49e695dc365c0814a955601083ebe342cd72d03cd87f8f55eeb1333b4d63367acfdf4d504911b71e7fe050cce10e87a542c266f982d17e1f233a34999bccf6db476438db92e9d5fc77fd1e4d8b68894f0cc85d3d4712cb7e1499ec139ecfb8df043d76c0fdbbfe63ab343f6ab6c7d93ea4db7a6743d23929f3876d42b6d1f01c0e3c2e9d122d81f8c287dfa1dab0a818d28e4fc2eea01e5c7c45e75b115465ba8b17e1d12092fbb246f4aaeb71bed3eb6d9a73cdd851033f1b164c9472c35a8f30d0975efb44ba1e145e594a9786f3ee3a247e6e06dcf8a4bbfab4aaff66c6cacde1b4ab4b86e8443d8b3762da4caf90a709c4733db95528349055df6502ba7e60c397499008e7e3cc17665dd3ae2c9d845b380f1b72abcec9dcc1266e02200a3da889ef8c623e41f92d1dfabbe72706cacbcedbb3b7ab98b3ff7bf03f3513ee94a721b20049d81e37c71085291639914d3ae35ad2940f8b1653da68e4f7384a59d6619db4aeb0ed008cdde50527cd647c5a5a16b9cf690a60665eec8c34e04a669204827f7df6eaba560649154ae7da3f9b6f2558b3f44d5fb46e182b5ca6873c1502d5eb2bb8454b59578101e7e315745d1988f2502b2e034c4f8449821b9b5e5cce2c0d14caa573359d3469391543f311df3274a793a72c030907a44176b137a447563f32d7c19c489e8316ead5d92a2e6c620f3bde8ccfba183ebbec2be12e34e82c56d646c6a0f340320e31bd885042c7fde77856985e5e32dd34e11d7fadd112d289127cef1e90944fb26fb9c294270d91425cef81d2ca3b459c8961f913b042044a64a2160ce91f76320c3fa893221b8f17852bc86e59d2ad06d103cd4168fb6c721eec6c4feeca8256787b7054c81a28c959da09505e434bcb3e2a4c8bef5da20956aa537a88b4d504b21229395dffd85fadb443093d6ee03209103c97113669e8750926f8bee9e45ce2c61e841d2940c00710610e040ebe40a41a73240640da8d411dfe66ae11da90092905c40bb90863f5e1bff3fd7722b9969e1f5a568336da6d5d58ec73fb4fa9d7d0f1abb1502ba8c68ccb54700e9d88890297c4bd70d0f3631b22169972ba63dc9adfcd8e48ab4b83464279c77a85f0f8fe5b24511341bba126cf4aa5dfacbecf175807fe9f743e3993693774c38408b6a5a26808327dd0ac87bd26de927bd7cec8cf64a828a144ab0fd2f2cd6ef2eb42e0e94265ed7ae239d2f6d78eb4094940f0ef909108afcf907d9c91d9a1d03565ddb03267e97c02424a76e6ceef62292e068161339db4ddad568a5dd250d895f6a51356e843fefab5a7743ae751c67abc0c8152a4fe5b311784174bffde9bba04665e9dd0ef5ef2c6ddf02b4a12472984485adb027fd12ae6c60ffd203b1a4ad6b1ab92809fb457be90dc2a38bd8cc9688aef5e4581f48e2df51fc624eb83ca5ac71fda363300124b48d778c2db82437b4228c9909ad6bb647845de87bbec6b3fcdb389829ae0abe40ad1f047b1a2d053630d719f29acf820702d639673f0ac5f53d1cc4e91d7816a1f7e4d2f769e695f12086fff530f82b0f31414f4c8b90832abad70f429e18ef362b76da9f3a7c86d7180f16480376687599ec6acec34e4c63682a5cb65ad932d11b889d951e8bdcebb951ab6e1bb8b9e20792caf1e5c7647c771777e46b4a3aa354d61a0c291dc124723a265f55cd4a1a5b72a73b4373d467f7b6955312f68efd53b8c4e1807ca2a846e1c1dacd5f8eb4d9bac65d2d2871628c3e3560778aab844b7148dc2d9083461e5e0c376db940da5fa0ebf5c913ff6b17288e73cd3ae7b6f698bd3f8c20c28af34cfcf81c60f508e617d3c1a65d64c48bea0e8ea5973847ac36b5cc51e9bd80216c4fad2fab248c3bdf1a49751e83a38ee846e43d9093c30e5d64c4f641dec35ae80b9008173c66d1d13f1e35fe2193cef0528649b4ab495700b8272e46a89e91f45412e01eee4bde7d598c175c7033816863f79a000cb47a7c543db8b5b2fdead2113c594c21545826809756d154dcfe7f9f8a81d9e9933a1a8fa12260347994a6372ee2df00a14c02abe92aabde6ed043d65ee0b0c911b476ab198f69c08ad8ba2ee7509d1cd4b85d6b7e7b5e0b590815afe8fcbcf6e3cb6e60bbe762f784ef9ac24dcfa72053214a7d04aac5e02be1207db804d704d66e8e24154bdeac174d768c107219a63e60158ab1f0ee4a6270036575fe4e11f4e704abcdc15b038087ba3ba42e80fee2ef92f0f945ff40638029d5733ae13e0c3d0e3db1a7e775f8a3aa356f33736e83a315af96592b7a683b36f7c88120d56298c92521f7586f259012d0a420d46da419488b6fb47f7ff096b70c8b3bb5b255754f5f855a268e0723793157fbe7eec223046fcb568f732775301bf87a20629bc7f513df3979a692d57cc55b50064b4d109c83b0c3fc29a19f69230dc986c61158a35cb69da1ecf682ebd8c8a89534d2a5bf42b6e1f9da99610e2adc10a956e4439f0c3dadfbfc087d6fa70132beb389a9747654e7a9d87cd88327b997737c30a2c195b384f15936c3e10f73f94bcad95fd3582eaac1c3f2fb511e094d8595bf526df2088c64bddffc65a38423d708f66f3de2cf05a4763f7c3ce55495808b5143656f8f17183c24d769ac39653fb7de8589a9b80fe8e2ff6b224bf01d4eb3f5abe5f8add130ef42e6bd0406cf5b27b56866838848ca45439d50116812478f51b2fac265f9d2ce54ebc652799f2bf77680b487258f56ef876bf40d11497c07fd5290099dee939fc465b6ea9c1e4d5cca86a003ea238b2dab1a10cb994c9562886240df93071d2e42c8f96ae80be957a5d2f21d8d05b5962b1a7b7fc884f40d3b7031768d2486729861cd348a13881223dcb80a071922dbdf031d7851667f4b0084fd40705b34b1d44c448abc55ace0a770ab171de246eeef07b409fee41e722a7f5322d3f3740a8cc33a27551a2dd5772b50ac68dc8c42b7dded13524cadf0354d96c09df5887530fae7a1dc549826908c5b222366ca64edbb3d2a584edfb8870c88ec051c13b0300bcae3448bb09f0e430894944bfeac2c1c2b9f4772b30c6b5abb4050ec50dfa5068cdae22ca8f08added607bf63bf126afd04af5d4182e9f04eb58a540d90fd44a3e951219ca3d1606dc3c170f5e4f9929ad81fdf6a62622d28ac6696a7074cdfcee7566aa460af2422a8dba880e22723a19a6e485ce15f08be7de53b4888a5cdd5275020a0637c073e495119ec32c5f20e6838ae92b9b6f2fab9771a61fbf0634bfa3cfe4260de4658ca577502347b7c05333c84614724a42ba2ce660a9a058a75943b92342e153016eed1d3760acccaafdd4f1a90710edfda08605468db305acaa17de2bff9c3db57fef2ad1c21ed260046f15657ff64c0782206c1d08dcbf0055f784233b4a1935f00d27b921a99ce20114dd38919dc75a7c9f6f177ffd5cfaafacc354e1ac5182df17ecb13d974a1adeb5c419379a8c882256caf67a37a9812036d9d7ffb0cdc473659e5afe0fa37a8d6242707da3ffda876a8a285a98308dab367646c6af2cd4a935b06e9a1bd4b224a138dd82baeee3c0e57de8221d71210bee1e35ae4c45ad606695e102c8765dc717257ef9c7c54486e949b10fb12d7c564b94c2256ed0bce8eae9c20c98e9b878781365081419fecc6ddb69809a3fce71995914cead4792d3ba8aab97818288a28ef5157a640c629262169a7f451a3f64a984253f5486030edced8357c0b53a270b5f2ab0984a01ebf8bce42cdce9cd5835ab26affa48ab20ab36109c2614369bc708dbc0c8025de8608938cd45d9967e330ae39d639a45367db094e9c1cbe27fa2043ab55deb8b3d7653f9025c7f1e7ce8da6cddba15e827aed1d426dad0b31aa53bc961a67c6868188173820a7a8fcd054c5c04b6cab4d7e1213fe2337bcb45907d20c34e25e3e4c09f552e739e4b30be4abd643c52b0183204b8985c7edc5a76eaa06eef72e808c31a2474803282a1aaf43e1006d46734e09342ee3779c1b282ea736c44188202e2bebf625b7347634f5583ce59054355d01216af293e93320f735f7cbc9da627a1c7c34afa28259314936601451c3ca18674c1928d2ba6b4e5d45ab50370cfedbd225083d9124296e199dcef6c7e9c2b2a80e5789a391b541819affac9080790a13a3dbcc55aa5eed9d1bf41efb7ea45b5d46f5e465ebd3930fc34f696bcfb8b64014642b9cfd1f23ef29425f8e782d3694021d8601e1dec7fe795b3e16cb4e4219e65d10abf058cae77707b0b295d43eb8352a3751d03ff6b65708ac2d6394a1cb3c6be218b20a26821e5f3915259644f35316ccfa373a6b6362581f6d15878e5c4c55ae132c6626a8bb5c22cf16dd4585cc6c4aeda17c4ba6fba2d3a4b827e73a783f6c3cdcd63c245793af1f39d9c6bbbc4b1693f19fd4defb003aa08f48e99d349faaaf83c01839565600df3914f1702a7e4c07207a35315ef224ca6224a84ea9811c5f8388e0a73ea9ea1935d7a5ff56f30930647ee74897e41f294eda4d10ad7e9f7599c76edab9d18bc8192ae4344603b09f079ae2f92bffc675f76489b6ed8f419b4836c5769a5dc105d093c33584ada7bc78b4b975475d457473644e56f16b58d6bb3ade5fbf12df15e7067421d20f8ea5498be8c3d11bec02f6e785632506ad714efd7da86cf8841c6df6eab17fd05c2556e7b203ffbdb2eff2892e7dbe2b44c9808bc8bd4397f3d334c3f59fe8f5b07e50f87df88ae03262e466015d6063d7be858d78014a3384f7b9b8bd9de1171df9c9710e96d2b0ace1b641c4bdeaa1e38f57665977e18710351674af00315359ed99579b09ba9cd6f472dab99c9683b6b7c9a5b7234b0646d440be651da18cec465d9262bf0049eafb70a352d04031d0625695cb019226e1e903528f0452c8f0138b7aaee1ddea3fbbf20cd01487be2feafbb81d2bef98aa52b1fc320d466714f84ed0708dea8c30a90224671858d457070816bb9e5d021d331e8f47f930f3929cca9e856d69912b4b08f08ac81c5c57510a4414c7cc015f3dccf4038ca509000f8892b3a3700d5b746627fefb9cc65c95a059baeb79e406c642ce91aa9107e8473a89979bfc6f2b49a5f11c66bf16610cf560274ed26f8f31de05d73dcdba4e0300db21f213420e9a7adc30da03c52ea5b96d72949cfe510bd0ed15fbc8590daeb309679b4c879a883b61a46529eff20a0817b5dcff72287a0944a85dbec3c550bf10120720d228a27ee7a53fa46c12340b640a8dd98e7bf1d269bcc3ac404ec6680ad41cd7131d87b7500a8515896dc223bc100457b1f9292c663a48ebfe89e4f9539c56257196e6a50699f1308aa57fcb4498598084dfe5a893a8a4a5ed6f5f7f07c691d2f2a9d085a05aff7685e2b495d7b5c36dee24ace6e6ba9a24f85d6788c1c0bcb0438a20328eaf9c88836d917a7487a22e568c73bbbafbcbb0509500a883a59ec81b8965f4a08c9e4e128ece977f59248b2334f11b5bb10d52c423a1c9cb656530198f7dd4406264c6c2e13ef31e29d529aa93d85a5e392367e6474a56374c1f8486dda34901398b3cac7e91068c90dee4084cf01189ced58e12e37d3ab39a1507aaad304026d28a83c3748c5103d7bf0a7b870bd88c191b6efcaec82b91b8b99029c14f1efdeed1f68d3e5c75b0f6a0caba0d0122481477fda52b0f040b1725f709199d0fb28bf16eb982f19f4872c3526f3e64713df3a67b30222ecfa0febfd3f694602f5a6ab74348775215589ed4504b0c99ce759e6f2303a28e9df59416d069e96de64b5b40e2f7cd38716bf9c59f3e4afd274877990af1e5dffed6c2d8468920d0de5a537e3c59e1ebc5cbd5b64eacfcd5e67d1302eff223eeda97437f62d8e7d557c82997e59b7f8bf410a26dcf73407f3489acef071f976a4ea4d75bbbbebd993603866d7f2c3794e586d30b7be71d00a9ff8fd7c07060bb90b9c38366133fe829040570dddfd6d3759854b68e4ecbaa8e19ff4b07ab786d65074a959473c123981a581286a19f0db59ff3466a535f52dd105aa2d742e8bb68ae30728a3586c457ca279f9686bde991ddb3aefa0ce035c4f2f9134c5175a9b08cef34ad9fe3cc49440a205aa9d99d974db576934b9cf21de5cf54ed009a728c6255fd6a139c65c9bb08d22296c9c6a93d007ac7d12d159bab7d8a0eaa65b91d1f2124d7960c32fb609ea46ab92a918926cd292ebba7e5386c4773339fae9d75a4665f3d20b3f08e20a5e457b4bc7cd170c2aaf10f7a4f3b152123e3ecb1ce016fac0f2c4654958776be1c71d8c02c4b22a774834d0d4da8c03ef0c580a268542766f1a43d82ba9a085a57ac29a713daaa8e99ed68fb749e68bc989af46d696a38c20534a02a18a14268e8feefd43ac6446a5013332cf378386a1e21d4ae3c8e1158a34f3cdff91942fa3068e407dfb06bc4ab400c354be85d4c992d966f864d48565cda1978c7e6344ef5eb5d4dd631e7218bdff268031ec18c58a4c8fa5bfdebce9e54bea8c7ba8f80abd8b6fe689f4f06aefe0989bfa91201a952cd0a5f692a70a709d5c11edd09dfa533fd6eb2071be0fe68b422ca7fe398f51f73489e171c9f74b78bbbde488c875955ed957be2ce93a80ab9131940b1e20bfcebf5593f98e9fb3a13c49f976f41e9e31e9982f20801c2a446c32517456fad2d49b26adc9c089d6df768a0a1ff05d870c3a184f54eb67f2f71f4b06cf44a457352623887b6379dd27fcd36152e9af329dd46bf67c9fe589b06d5f5479cb24d367e07cee5d18647bb3fc01a389c863f5bfa44d9776784c62a681c207b29a7a6d651932c6dd5740236f4e78775f33d9e85a83f43529ac61cc46b37814c46138e1a165b9c02c7fd6a7cec64b65f94e9849ca059a9eb0b697b8e15f29539a26fa03782e11fda0842f47782af9eb439be94acdaa08ce90474b8d316e453d95e16108a71ec4bda277c6daaad6fd745bf7b5eb506e6f7a47bf9a9640d1294ab3837c115664576f6b98dd18d483013737397f4850f1ddc4825d368bac7fbd74a3158e45ab5be4efd2c1dfe6006cdcfbaeaa0a6ef00bfbc6841e5ae6ccdd77624610016d6a395de715294e793df4ba00a690acbb284b38e227b95aa992b03d403db4883c415a976fed757a4e2894fb61e342393229c42b3a2d6fa4bb95973f7e45e737f2cd3ebdfbafe82ddd1319c7f5a969cfe7a2ecc165227310f09e7b9c120bbe4e2095d0b3f3c897524822e1dea3280d8be06818bf09b047f350a0e8645475a52b66c2a64fbce17a6023bb6dbf59e8629b19e39c53bc3f17c16618eecb25ebdd4e8ffb41209dade649707466ac2464efcc9fd70efc72d44c6e316f28eec4ebdd9c75dd1c1ee7296040dddc4a34f24481a6d5e8daff0e7cb37b1b48f388cc05017362c6833286b05dedc2fcab048f9ea221759c2ca66017f56db6354291a996fdc029cab01cac9f3baafb8144f853f3ae1adc2418b72b91df0b644146fa5f04f7ea0fc8eafafaa0e3913a27980fd8038d63800a75dad6313dd946b3d3b2befef7626ad7e851779588c39a92e8f33e8b717382796382c51d421b8115c524075866aaa55c8c91d8aeea4be3cbc78b17daaa965d8c2e4ee70b1de0cacfb17ef646bcb46baeac77a51ea71b81e7ea8b149a890d944c71f4b5faf4aa162f62d85f171f1804825eba8c6f0ac153c0418b2918be8f6f34efe2e62528c0e64fbb9264d8d93b32a4e00f323544e496961977f607e976d25ab1c49386fb621c11430f8663dd68ec00e2f8df3f586fe35c581c4c982eea62652fb0d316ef26f4e5b9a801aa768352e30ad49841d423854cf9d94f0885fe1ca34c58f248f8a6fab5a8f7bc41d3676af5fe6d66a5ce5d5aae2010ca0fdfec56d8f16bed666ac906b2d03e8d67d5524f3611b28965ef14694924a95c295750afc431e5cd954ae1ff0e9573ec60099d8925f302aa0e01b049edf233e1b0a0c1777c9fa119f41ee602669b5e9e598e4d6ff70945281bf0965b236aec2af2f447d48facd0eb56819d77eb8fa7ca84fee212fd9a64eb37e495255016ceb2b41dce33a810868d97bb52bf33c699fe0f1f16861bfa0e982cdf0add007b1776c7d95b3728b0e8ea1192509d3850f92dc3b5d9b04747dd8e51c8b1199648c2d9e6b6ed8e722d32b09709ee61a7f5a8dc3f520405cf5f1229868c855af7e2a2f4d3ab29f00d53a42c6cc9142be0f191714da48effb585f6e39cded9040caa2e5a9aef194b5bb5e8109a4cb8aceb7372deaa60941f23b44aa74966ffd3def56312417ce52f5b8894d8c57f368efec6774d0b026d476345d2c325e24bc0854ae41936ac86f583393fa4faacf0120c852dbc8077dc60a19034ff05665cd72f23ab29ff4a170db50cc89cbd9b5583f7e3933d4896eeb5e1ff02fe55d0ddb2c65ec622ce59c0f771f7bc97ca1c37fef52aa6656ab9e34e761c224f71d876a4e0c54139498ced65a68c5fa50dd55b1248de159713db9a68e9c477dba9ab4af45935576dce55c967448636d474d00ac8f2913f46e4b98dbb02d5e2af56260a9c509b3047379c3c12d9cd1f2439ac1c617efcad23d629ca60551e2b3406f24babf9b6bfa905313da645ce10708d2aaa24a571e50299efbf4be99398ce58565fa36cab5a269ca82754342383cd30921ed0f5656d42d84721401b90896a4813e329eeb7029471659165c5af7896d1294299f2f4c4635c30355202d2c52a51078d07fc109a7c47dd8c5a39756ef98ec883321ed045cefe9dc858dabe777d492f267e0ae396cba75852845237da0c81a4152e26d4a2a2499b71bc8e1a3afb19e6aaffd738f192ae96e8c699f9c051ef6df9f916cd082bf68f7261b124cddee2a1357adbec1e9a9465e3f6524c43dbc08fa7835f95d31d5560347f3671458ea9722d2294e0062e0a5e89b1218bb51353e42d4d921d3aaa687ee2e6e65a9340611b3ad4e947c88f7f4f998a59422df941fee83a42645eb3b235299e0ba99d8f26488b9a45b3c078511675761cc371f089324bc62901bdc592033d7479bf32fbe678e4b07648246b1a3bcd7cb966866fe4df9f9d7f5cfc3397c2384022a6169b08f0d530cd22cd797bad33c86f5d7bdce4d17aa6d289885ad4cf1361efb97eaaa47229bc37be746e6fd608d0525dec28f0cb71e1ac51f0358259855b1d3cf896f2cc45f39e6bf2fe1737a0eefdcc78a01a1445829134751b3c78a01c83905479177cdf17f5384934dcd8d103f6656446b4f9f64bae84fdc3671479523eacd61742bec8a971f30ae95299e6563256662fe8e2bc68382833a959e063a1006385b5f198191092946af4ca07025e904eb8ade8930176626e8a6e88ac1bdb247c272095b0c08ae41825757f1cf391a31d7e270334f081352906b46e196f32ae7c3edbf619f7a8da77409319231c7dbfc35d8f71d8cc90e18793681f922960b93f4db317f5fab7de310531a27f7b9c3104b24449296058dc2b111b6bcd10e39ca325606edcc8f5d4510c110d0bab133fa02a9917960bbe88068fb9cd9dfd55c9183af2dc89ea9f026287d6f1863931990e5159de4e97b9e7819b22d2b9c570561cd1007dc537289719423c8b86aa2ce8580f3fd19a544479e295fe0a27466cfa648cfd6ad0284223f0e59c1c41820c826b6ee1acc4e0730a3213ec2e8837fdf6bc32818fd359ac7a6d5104c366e609062728be06e9a82faeb2d6f0aaf80c618af13ae0ce8239e02ced17abf580e900e1374cbe2bab4e6b7f9622b5f8d5ea52d81201433c940a9de5d719da4da9d64203a8d603bcc2d913b32adb19a4227ea5b843e3545e9a1302d68ec3e10c35ca159968d50dd888130e808a50543d3b780bcbf2229b8128d589eef89da2fab7ad7605d7d98b79923ec1add94e04060c230987c6b6ead82c50407bf5345e34cc82be49760566890990b3e42eb6e1116ec536a7e18d920820a5ac3162ce73921374d87fee23b4510f6bb459d738f47e6dd26af15284facb4edb2f6333af6eff3f93a50f2df6cacaa32c797315038a1b5bb7fc26a3455b906e8402206d7416b1b43b6de4693118677d24447fdd6d69a0e5b94d2c71f53808577a0a03bda4202d2bcf00b1caf29293a302a2383945aeca109c283fba5361a324d38a66c76c40369f18e5bd3b16c878c9014889b511de0e3cd173640ef461a27e93ef3bb56615864610d9033de9fd786e72a01a18be9e0d533aff1ee3b966a34687b29ffb1838535210b535caa6a0d9b9cb6f1aeef3c9f6395336ea20b0eabe4210a887aae16225080049ae446b4581e02ea75592076ee06174392e3a65da5921bba1be2c8aa609d75d1046f3ecb5f48b3c1a728cdf67c1818d2b51e17fb30e72d602407257316c039546879c39d570b0915f7ccc35a0e93323f1b2db77217e38fdd647bfeca945f86b012bee5ebd12b80ba49f3fe2e4380734ff44e23f5b9856e74f5d47dc0e1ade3084b413945fe490bad774901f04c216bed00068a01692ff350de4e6cb27c042461124f006fcf55bc546ea8e50d32b20f8f58d27a7dcb68e1e62981d43f5f27fa96451dc73b4038528fb214ea292011003ccf10fd755beaad256d1e25832011a1b66b29c046c17053a50b813d982fe3624ce531bf9576303eaf090baf3bfc2915e22cc1d32dc6b36a4c086b8f23982bdcb07924dcdefc8fa57e6983ff2f88700284918eadb32d5eae784bfe7c3695f1ab7d4822cc92c24e4b8f8947bb3e465c04008b2ffa29fcf3cc5601b37d60950eb971c97436fd3523d2fbb2389f9f1ba9a4e1466bc2ef2599bc50dc97c2f32469d90f100cefa1a40f64f8823c70e441f21dff11bc708a89561afa415ab3954cf09a1a5a5570a7e0234260a5e48e6e98ee5240cdc6cf45261b17d8ba24eb6f3a7f8749ce9ec9e2c723623ae688a4bb9d0b207dbb4b995af7c1b6510beb879419c58b35c0efcb591ea71f6b9f63ac230b7ca7587bc961bf2c85a5c2836e0fdf708d4d017a2cb9819a0e1102a5a8059f9ed88ac6e541596a0d94afc160da02a5c415bfc08f0b28f7cc82356ba22e1b0eed41e5aec12da10bf7998d93395108bc4b680f6d325b6f28eef52c1d043ac3737a88d124253fa53dbc4877e9e6784c18589984da9468ff3a17710469fbb9c819f8b59b3b81d5620bde7cd845d2433f65aa07fdde4becfd77170f1e4c19dda3d131f78006ea92b6fafc92ba18ae0a7734830952aa3579e67de88f785ecef8f001a83736c0ea41afea4ceefb34ae603126212b706b6531bcac48eb944b4c3fd3528d40a706d402c50193c5cacdd6e8ab2957dc90b92f817b713d12aa95b319baca58b3c00bb91b6c781691d8302a0b6e4a6569dbe320e03232ebcf78378057bee8a221dba8f9c11b308f07e2799b366c4c2eb96aa01f054bbcf1ddfebce750069a8bc7f2d64d7306e74d058b5eb10629d4407e0c57cf6ed8a4f7c11bbffdb98d54e9dd7b69713d7d56206ff3ba936bb4a8cbc48aab094ff775b4d99ce55e411f821441df31f1334005e45f6cf8eb48e8aa0f360b1b9e739783b1563aa0a003eb598e6000595425fd37eb622743daf004d5cb89ca7bc66b9ef514238e6efd645616a0c89aed79175f1df95d8d72ddd8839d81891d0445d147ba11abcbae380d3cf8ab0d8bf7558481cffb22d83a3eedeaa73ec6ec221b95e5f4fd2f804fe2263f3026d7fd5297ec3a56bd9e40bca2707371a0ea43b0aaf0631328a90b3fcc96d9880b3c77fcdc490a7070a607fde9bb4925a5a49ddb5e24d4cfe5e84675f76aa3362590a2062a9c47e16ef1fe0365bd6a898c377147b3c687fdfb172be39690d5eb60ce8f36bc201899b7447586889d338a09e6eb212fec1c03bd3e332e6cc17b13b774e73f2cd3c4bd818f3a0e81977b2acfa4722f32fd9ebc693c64e80827b2384336ffd60eaf71fcd9dbfaf59ed65ab61e840b34e46a270569141820238a470e98085ab104df0d40a69a1515bea9d4499b238d3fef4d52b5b367bb1306f777bd7a397ba38a42c926f799beb3fb33c1a2089e22dbfe54442a4dc870f0e496070281791f7626142c52f3baccab6a095b9dd866a7bf7ac14b84e92b7593e31f05a7bf3bf1e99e589856e2a0e6fb6472f8952ee4c9d1bc1dbc87706abb29d9c698022d8658df97e212e7469b2ed34fbdf9ef351924b51e1d00c3577d62f37949b7948d84127fc33d8e2a5066bfb08644bed15ea5f14ff2f2f7eae4aac7973d4244001b0e757cc74ff7f001d276733e5e07fa17165907dd86777496c25a241e5a8c7196772af6e6680ec89af18f6014e551597289fbaf50f6b977a950df57f24fe9f91228ed9dfde4ddfe9a12e740fd119c91fe05a1e6b1070734f1f201452c3cbf2949a433eb33c8195ac9ae1f4e9cd443533644c003bba22d6b6227e5e2a66485c7bf9c5a5c3d872985f4b93d7bcf22d7d7876a82ed8ab271e4c3c355362d8e97ae1a0b62a4b466344be695881c1b510fc77f2360693167115b9028df5cd5d14e73de757a8c47a9ea58d79ea11d86851851cc5a3c015099d22f4e28ea287426e970aeb6d2d49a6c0e9e4efc96e4982fef0122577ddd4558bca400d791c0e89027558186a0faeefec0e4faa20454608db38707a8cbe868270bf27a39d2857387603cdf5102db8fbab758d736052893682889ae06481142e4693161d56be8fcec8ff923b78f1cb269ab6db6f4cb8bfa4da36db2d305fbe38b80fca47408229664b0ceb6abd29c94dda65696baffebc9c930e4fba038248811722fc6bb01a8ceba7488aad04359d332aed7941d143feb6ef39b4590b632fc27875bfb540761611d9f5c0ba9633a460e67af3777e149b8c7455ab527d8c9bf4c357fecf7a6fd296d1eacf018d5299a68e6f6520eee0001f5ce466986ebdad84f0ee24dab79f5aebd1d2e115fe58da1fdab976bcdc1319de495ff98e1e1556123aa57bcde3d7d700833e6ce7819f6c397dd52a7538a1d0c7a539a1fff18b9a969ea8b0924b9bc6cafda31f6012720b3751f28648cc60686b5f0ba9bc291da151bc59285b9ded9bda6dcf38e9aace3a7221a23b071733804425d3de29a0e5fbb6710c547ddc2b7bbcc0bc4326159acfc2c92748cc3bd58038e4a8c5ec38640bafa87e1ddda01e2abf0d989d6b73fb4ef738e54797c47479025747fdc7b2b18522035ab066970093b1b67497c32e53e51477f755258023e728820e639bdd0219f10f3c7be414b649f22692267d8e89cb55096da27af2739d35ce40d88fe3c31a9a245bbbba9cad0eca794122632bfcb3eef0acb66ebced5022b36c87b983b2dfa86705c17d647581581c20113c9f305e1d4a3a0302b8777ce921b32f610791fc04705f08714184aa341d68b7d9f3f363a7f109e2b8574aeddea81101d1145e76492f1a0dd3662208d5b8bb453ce9c3ef9e3a1dd1040a5742cb03eb76035e922466887405ea42f4250af9d922dd8ede84c4cd62ed259c35e2276d5fa7c7ebb38cf1dee82dec7e7e315a0eccd007502e6b7e363edecda642b17962f42d953571e251e1d3f156d6a48b32a0531d2ab072f8a33a3726c3f736a590d561dbb245743137118fcf1171f82720795a6add5c37799528aefb36a9857a92f50beec3e876023d9e5077e376a77369e6585910a76c7eea3fa0222fe87136ea9548e091c1b36ea0035feceab282a556af1cef77b431d2b071c6378450eef9dd89882012fd4e04fc65fffcd366d366ae2ad6f5b36d9c9eeb9f4f3b53729ffe56a54abd5762866c407b1513f541ddf6d366e91949c5cadb6b7c3856e2979b01742c99d23cad02fba28c7470518f023605a7d2f460fe28662df428074801fa8c044f3f2ace8b98d0523bbf1ae40ff3d3183031aac15aa92008c5854e1acf19e2ef471e80d07d222701a44306134dc383129e82e0bb858b99e4a5edb5380203c29085bcbe21fed8b750409de10877b12a4ba0e5300472b140993cd1cdd10ec58e247ffcd782463dc89043849c9785949224d6ddc17138ed09bd5018ef7c0fd9a009f99f990f1c7e7d2168b961c61ecbd38e8e1f5d32b2c2374ccd8d4813b3bc8fa930a01a24a92b19f543d4b8598035e70c3f20c3730b964c70ff688ef9964a2f831506ac6d98f3b7d77c2a5134cf9b1118d0d27c35acfc6f440a5fd5c260073e39f6ff93b62fad6d501a76c297aa50b831fb4a4945bf447387e8c78bbcbc8addc4dc1553d9dceb6e8e50d22ae83231835b1e3513a0ae2e344485c5021d97d758ab8724045cee466cc9907a373271444c169e4cec052a711dabb41f4adee0a6689d5517dd2f059ec8f1c500a9a47ef93d7ac6f79937d6af96df0f8b9bb1888185fe82edda7bd6780b53d1c86780acd4ffc563db136b4da7837e146f785f8f1793e13a70d6eb2ac8cb1a24e00ff4a0e5fc982e9e55d246bf4e4a8d4881a0264bfef0551a969745bb2e158195352fa97b83b25717d34c7bd6a9cb0d5b65796495caf4f734c138870e5774b181586c2fbe524aa044ec4d839fa0789501a65d18e816dd2f098dbb3ee083d864158922d8565c4f2486b1d974bb0bef12744e31cc658208fed6c416ba21e229264a77db8c3eea37cf69a2011f553d3e84e47251b13073b9ce8fa1e820b896913297d7189886f8f793dde12aaeb06d5311108d0d6bd478c00eae2a355534ff3ae7ecd102635e165b62cb540d267c651ece63ceb75398fd1a1017b87870f4f1f76d5bea2a23ca8a9133239a58c3d1d86f6c76a200b6d1335d629ef8273664aa8b0a75da858a0d17daeb2415118541064755370e756c9b0c6b6ea9e750a4419361e29b7ad5b2e4e5b8411e7850ee825c45b1df0a5270eead076189203f05e2ebc6699c509645fb3f721ef89ad0912918e324ff2de46f7e72ae4265f84bfa36eb7514c8b497fc55fa9738e6632b8898b9d79a453459497274adafb033d3f45f305959dac6acd4c4867789693387bf2fb05824b99819cec675e534f0f820482a278b8257adb0ca201952736930b67d728ccbe9152efc799358c37e1e033da321ca452fccddc3e93fc2ad1d4543dac1e54055105712b27888f72fc0b365125eb2aaf6ef771eb23669ae243ea708944713dad40b43d44ad8bbfd8e12d87fa0f60a80c48529768c02f42e197b6a9d1b28ebc924549a16d3fde4139c793129f222b6e4476dfa25ecffc91dcc7c1d14b34cc87bc6848514d5d7697f6f3c12191e8440515427c3df08a0a30b7488cfe470572168e82b250aecc1703311797e8f3a44c4da9823a12627d70bff4b36542402ef7668fd0da94844d48a19a6c0a91d8e22eb20f5de2102d7424960ca705bce50ef2732ada44e512144939dae8cbfc18861ddfd599594fd26b1c2c4f62a40f8b11426b80a2c87724d9cae38f60a0c9ff16a835f1f5e992e929a8f8177d0a298333fa1f43428d40ba69a78738d182770d016c0f3815f3e09e6a5da9c7c026ae177d9a1d1329fb817294c2455fcbfcdeee4be98f77885a45f91cdfe47358d91664d5d3831cab03d320ea803aba546551c1e447ea48ff14e0e1fb4303a2fae168ffb7642043c537788c95e90737f1b07338a01fa510416d05e9ac4c4db9c95b73884061209d84723d88014c739c0fea0efc5d473405a6d39088e0a17122ee67165d10284dd8d59969be0b04c3ca28050240d979fa8726c4084bcee7ec639735f087ba8322ce023a4fe567805fd644879917f899261ba1448bf485ca2fd45ebdcafe98024b2d027712598f5848b955ed39a4252946ab2867ffa0d89df7bce7f7663ade6cc3dd0ae48b47f0c06ff344b1befa73f9507086111a47e4da1b3eb77090483421f4c1280fd980751cc5e5cf80c34181b4e50c9b0bece0eec0d018e0adac97a67e85e33942e77ccf9d47a9a8d0ba403edc4dba58490e26124a251a8e8f2d2d7a989c2e39f8d32656f60f23dc921fc3da4badf43c010423d74758f12bb77d1370e9b8e7add2eeda03c96e9cb5e4af1188e78341656097dd9d6070970be0a5119895de011890226c93160a4b114834e146cdc6df288bd12f4b16bccd30e5e5e4bfb2988f818ddebbcc2cefbc589a383f5d8d74a0f7a9c196243df4cc8a82d13cd2c2f9279c3e0062967858b051136caa1a9c5d8a0138573a0338ccb41c160ac4c4604815f19145f64d91c4654081d3f2c3eff4a0d976f9f264b2589dfa698af197860b7a795eb2687f6802f2b8754ebf1bec2487c72b5a712e10c6eed2b4b96633194b45b109d46a92f281c43618f6a3892672628fef762f558114045c5dc971a1ce29b92a715f65f446cf94146da6a4f8826bb78c369708f64b6de2e0a29986b72f3b49d37e4db112341a830c0d58f7cc33c56be9ab5c6bb946a051bb32ee6ee7d83bf7961b49a8fc98478a34a51d2a0f83e79d5593bcedd729e2863a2559a9f2bf2870c8c9d04e50e7efce99013b4699335ded96639a1ce25ef02697514a5019e02f947287526f0eccf3af73f582eb14e19de173c6fc196fe44856a76244e657b7fa62fdca9429d3606663916f53d6ae84c0a741867b4388f4722a234cf2cb8d26f5e6dcd8a762c31bfc7bc83dc81393a7e7ae0a298100edfded83b201ccee6535316a015b4c0b451fb59f92863d5edf776c384227c5213e090d5d4606fbff68c7860a035fba7c614be1db2a98f04a1f24c82e718cd725eaf701a2b2946626585f29b2e9453aa9b1591f697b58fef4c8a5b559d56855534bfb3c3845399efcfabf93795a562068aa7130e366d93b98a957b5bcaab94acf08c9de8d6a6480c8d70ce95747288422b6a9847dcb2d6e3a5f23e2eeb3ad4efa23fbd93f976120d3f2245071ea9c1976e5b216a82d38d6122042ad1b4b03b19beeb22107fbe010733cd8d2f2e1bd192462754197cf0f983a673b68a3c28febd756aec51acce1ad72fd2eada9b55f5346350c424c6b52cb92863ae5ed8fa58d4bb1f1d114e041b490edb492ae16b64108b5a06d798948db29bf10472f1dc0756110f7c1fcd42f953907d1604a07a6d53de7b3cfaf60ba1673e4c17157a801743cb23369659092612fdab0490665fbed7b6803bf5b61f2d320b200fa433a08a7ed80774f1676eff71db0e47f1bbc272d19430a13073b9c83886b226b8ea59d774b84ac4aa31c322c34dbb99e13c32773b21523d94911652ee04becbcd80bb2c389b31628d343192a0ab823eab1218439814115df1329881279d3befb84716f749cc7349ef4924fd2926d889b9606c66fa2f80754157d8dc7396d498eebec938acb48d23095ab25669cae4d42ef3928db61ba082fe6cc03e37cdf97e2688ecc7f36ec95b94b717087a377198cb5b25b1b0219e01f7cf69ac3b42641fb01aeafc3a1d563894f45e6fca59515d4a964c79e9a2daaae153cd692b15ad8784963686c7f4dccca43c834cc60ab21bcbaea4765e0d011e0ff885ceb0595fd630dc0067c7f1bf07a6f3695a820cf966a513d6a9afd9fd6149e950d086abc6997fa6551bd2eac312e60176796be58c7ec6a71c431f5ab417089e40497f3dc00acf2adef2bf3466435e8bf23b9411682fff672e76f765c4cca0949691de4fe73ffc1378ca6c8be87e5ffe13d9143aff7243b659c50746cec1f6a38f07e4ab2243c32ddc790d1ad2b334eaf9117fb2939ee265cfa62ef6120ae119a22e920378b6cd49bf67686d7655643e41ba143abf83e4eaae517b44687a3a6e21bea6b74588e75b1208ab60325c2d9783a1039a157a6c1381603570d1d94e4221d8ece60fe99d995ee7aa0cc5e70d89b47f8a03de3c315ef63bf49b532f343123508d18b413cbf29ff9154788ae6f008e4643fd012aaff21829aa2945464b58ed56cf177f54d1013d2c76bd9dd7a2d453445078923895910846737294bd670b08297920237fd8f7b965e5303bf04c9009d503e51b734b230f9f8393e00c8210b36b6e70109617a2abf2a2f87583d9d27b7f5735f008553dad96e219005fc42acb48f276aa0ca354b69c3431676bb143a50c9fa21901d1462b41b06a6e5a4953c9cf03c47b3fe5ff54b7446829656395ae854b8bfbfd160a1c30b1617dd9931b5537d39e0a268106b6afc7fa03055adfecc5640e6cf937300b64f53d378cb0aab3892eab04742b1b15b66db1f7d581aceff1ec4e89bc9f74ad97f68d3c0753365d3b041322cf17c4d258e08f1fc2143049d91c3035ae9460b2de861d07f0dccfab14a29d78c3617b0474ece7b4e0247bc43ed4568ffbf06be4d71b42217ce8417b8252857529edfc035f1ae99a99a357a83895db7fc0d055dbe36cb179af6dff359f079759e98d8f81b65406b17f4f572db8c453500e0bdc26e35af8ba65512a941b085fe20bde99dbb2f90f827c9bbb9babb029d7dd9d860c296d87da6e9d032290f4af945fee09fa9bcafd0618d3c68a6f33cdd6523f44e8e2e156ff857aa554f8d40a25575eb3b54377b1452a5d90eadff0da579b35761e073e979c3f54f34a42ea3c5db37b167bff06477b3148e6d9bf526db6ed84680470f6fc60a3975cf86bd0a391dec6b171c91536a8ed498ffd4e8a085d2f9818fea688b4ff8fe717b1d4a56f6131a916e2a1e157a3ea852c36f3caa16a766c6a630cccf6ff6c57ba73632c12f7c2510596b70594fde1168530e916967bc09a0a00454f4ed3319a3331914e336ed1a78cb83fef2f2a27d7955f2e501d4a0482560444bf1e41f7139db510f6255bfa118a64c1c060d7bedd813de4049c2bde69cfa3d00269ef80c480187ddda7582812081c2b004607bfe0e6fe2197495a6e3380ff4e7d6feb91d483017f7e7b7a3b8a42514026fe9feb32e1dff343a28b1a243fbf07c205e0082054ca9154fc5c7d72658b5b05aff7872648f90cde940f9902fedfd763528739486c5d0509a1616e61b2a2cbd5c4155cd0715b17545b32093b875f63ffb95690b03c063d6f225fba213eb58d6bfb9064294e4e492aeb80e799a16229052210e9295620c7cb181a70bcd785dd2a569ba6cb2136776765686e614e2aaab4467fb97f4198b6249227af78a3910ac71a0f7972a9edf910149736811b1562ba49bd5aa37ec596c1928db47eea3b10fd3e2da5c2f11f4c9ea77f498e2dc612953d3947c76d1e2bf8a9bda04a028e6823d3f819efedd1e8a1ba9ba29200fae03b17dda74d5f2515f3c076c8cf6f618dcdb3028afc5a7d9be5b4d698c3e455c737189d6d5c70eca152511bcae4263ae61869e3841470274e4fe25afcba293dfed07545e2aeb620b14c227341731283c3b7a671b5d6cadb3aeaecdac3eac546d074bc1a2032855d8088d936c04baffe4bced0b0ca455f724a9870684751d803033f7eded323ad7e34eb8b9e239229fdd5311742deba12d9be779bbbc745b58cd2728d665983ac638aa9d9e2bfd636918f084b2360954d9a97ac79cae6d0e76166b1c9e8a62f538ad072d10529f0c01a865105cc1b20bd75fd759d41bf1230a2f0de76c1d7eed8d668e489b2b505a8d592130e4b8aa8d40bc8d072a2bd4d57c813eb8ba8d31ce31df7a038f933a509cd663062ae9e6d72fa5a135e607270ccf23ee7557782024bc4b3ee45e391fd05e72d912d92459aba3550b6500d515c93b8777f8c78b9f2dcf6497c4e57d44f11d5c58f2bf5872c046601d5f47fdf8799944818e4bb4d340b60bf0fdcb31e11d77cf88a84e417ba01fb61eb4e761f73bb5fc2da1eb5d48abfe40553f8ad5ceb218494e5f30622ae8cb9edff80d901ee5ea1d3da81fbdcb7b911b63d0035a3fd0cc3ec4bf2a74950844c9572bbffef8e0d5659cb82cca8d2f51cb940ccdcedeb2baeefff0081c584e176704802691cd0ccfec184c3078b9079480bbfc520c73cd4d36dcd9eaddd21b6bb8cb1db666f3075bc1f0d065b1b13087790c68c2119b66b6dfececa46bbf5171abc0fab0a4b05bd339f7a7dff9225ee4caff37b5824de7c17fe6393b7014de2873afde488ca0a2b3042f2474a95859a4ece41f2e2d147256a770864a247f66a216724f636dbe37eef5d69e26b9a257ffdfc2af1f15a8be54e1c555557ca84ba3598f52c281780dd7e22655db21ac383712e62d4540a1bc525cc185f49e6cf1385cd1dcbbc96511185e7db3b82170a228e6a4325d3a8884a96424e14a7a649d8b592d56380966ef9b0d1f5bc1822155cdde992f87860e3b04a377bd35f061e16bd61465ba4e98905eddc21c3026a3a4363cb15cc11a3e1b9a5988ed25891573779b80d0b2d616559422b0c423d3e21b5cf0fa27fa65d741d94e56e16a1602e64147e0fecb06e6f25d78082eceaf179b321062b1801e353c9bbf873cfd9d9bdf07a8802b7a21b81e068e4fb0877cf785eaee0e56b0662f622fb0f189282b649f49bf0e965bebec64b25a1eb8293e1e0d9e39667e59f451db9d8a7f85b0d9f145b3a4d30d9f785c84b8a0b140f80b0ede2caea671af0754fb07e9e445c5963cb8da72c1f8b8a6741ff68ed28bf7d15bd84f01a343ad7042d46ce838a73d5ed19258c7c6af26bdd88ee22e229012803876c508cfb93bf59580a0ba5b187dfe546b5e1ab5a1cb862af6dea4534730d3e68658903ac739b7c1aac1b03a83b639076c052cce6df4e4911407087f0a4e6d0fdb4bc81f527b6aeb5e551d6713a4a16b7364d4daa5ab2ddda0c865cd8222e69e0dc5394fef94477245107823fd505d2b252aa0599addc18f19a79b2b4d3d1d29950e5a1521b1c528ad86a7c2b7f77c4576d04d4025ecc4202523cfecede39dac705259462924811620a852ad7d8c98fa9b5a3fa460f39e5abe453b430e171f9696fd267497064491a4c2d049024c89e4f6992f31c47362c9d910b2bc687cf9dcb8e177632533e35869885b3f08444730f4fa744728b600ac57faba7bda9c01a6971f22407f38a163e5515b142bfb6af3512580bc5be1ad9c1d14c82edfbd0cf0d02c6e2ece92dd4b5bb36e80f408a84fcff174c18a8facd9c9b216d91382729bec6f649e4badc03809e5b96db570b5e200450003898e7f8041cee434f80c96aa05234dff7176252685c7150b1678ef8b45d5b775f290a2ce70bdbd74868157ebd0a024097a9f86e1b8995571009fdbfc6dd9bbc0860d89beca5f8a967a46d04890c1891892e912efd1672d289f3fa4cb7a1cfa804f42bafed6fe9c28c81a4557732d3a0985bf2cac59d387e57fbd265c75479c5c99ce06aa5f17a64504b5b2bcec1150511b07f896a0a9009c2c0f78df30ac3cabddf6ba0df4eeab52798acd9e33b619d6c4bf35ecb60660782ce7011578a1f31f21332accaae79f4a76943e0d58f053a89c063665c3c0a52a55ec328851684ce1a0fa901ca9dfd597fa453c3130122e62f822690cdb2b33aba4563deadb3d309e8487106049f475d4b46c412bf4e7b0f262fdacc523d68e58cbdd367e2156965bc21b704c407ce426dc5e03071ee8a6e4526fd35b9ab34b15140ab250ee6606ecaf93e62ba84485a84b8fb8c05580f0be204b4a2808782025f7fab3578faa3478c344ccdcea12e47a49e674770b69d66901143c429e137dfe4776d1bc6c84d02aee76aed6f27164eca09ce296c98696281f3406b14d9a4ce0eeab7d6e7d9934956f3d70e1ca7bdcd3551cc3d456e6fc5ad1b72f96eb1ec9048900b6e344f80d8bada7f0e2d5ec6e72bde291295a9aecb1231ec2c2dfaafdfd7bda222ffcda12977e445b87d52ac501aa0a567e722c939628ebc06bebba51544f1dd5b6a4cf19756e24e997c7137c90be09d98e4396ed441e8bca25330a8fa187456de75e898dd2cc444334cacbf08c042f1bdb456db78409cd8c1a030578f7b5a5f1eac9738b168adabfd0f79bcc1a7ddcabafeb4d675908fd0d20d8f95b119778fcfeb9277e0ff2b7239ba6d1c273eafd8d8d8432ee0dfe7b48f62694adff8e7b660d590dcb7c40f907e38969757d75bcd08d9e448fd25bb9803bfbee439ae1e8734fdf8b60e58aa92c282673e21b4c8a1337889865f8863a031d5e407076a838cad597b71b862d41e8d115310e0687c0008dfe55d596f73973e566ccaed6486df61cb477989ad52647e6c5c2ae42e9540e29b36741e193a223492ef4e2c0d2b9a955b72cc5db4822f80c7824459fe81646e4e5b2fc2b849ba872b5c938503c6a4ed6d9eea8dfb085fceb85fa9b43a4902d53260b0c7d9d54cb75847c08472c4bd51f7532184723512f8aa2c78229dc9b9446e1070cb9798658838c986f232bc9729cec777ce67ef0b2ee3bebb7375fa84e8134050fa39efb55696baa974f6d5d1daea82b2b2c1ddf985ae028ba882998c43eead8551ce66580a04512bd7f5f54e8e9366cfb3febfcce23dd54369ce127f113a47d601e9e99439dcbed4e35bbe6e02f47020e50e91edea4d4a2c397f1399912013f305de1ea262bbe4e050447854075b3c6f5d9f24b4fe1dc0e5fd11165001141183760e8784010b5aebc7be9ce2833cc1997f739cca97f3bfb4fd8c87f58b4190d04aebfcc7d928b8fd05ba0c9858b126f71d4bffacc327026fe9f5bb0b1b7e5b65f84b56fa2062ede41c1d0f2e4401dde37f37cf480bfab4ed70ebc00167b7126de2c78b91ec7fef53575ec962da259c966c3244da25394d5ada96011e505c2778d72f9fa5f7072d82704702e48ccd257932eb3f4b4759d79f779dfcb069eac0a1d6739e3e95cc568baaa0c3853b444c0bad6037bcfc19fbe77b61ce003299ecd0e2a99b7ca88bc5df245a90cb67cb9f0f8aeb5fd139aa3426dc7823a0e7e9c79b05118f3d0ac6f65a7135900878de4eb0694ccda11a5840f04637de6f86a696bac6513e906d31c9bc9ebcc237dd5c17a49719e6a56fafefed2a7d98143789c0368dd577cee42ecb4f29eaa88868f5ab40d02395b70a026839e86550d625ca166b9e7eea161a81badde95cc1c6cc6ad1a1d137f8bcc98d2198aecf991cd2afec66946d60446d416c75453dfaa710d20948ce49aeae6efac22997cd917a7f19a461f871ae873b544f876735f9afa74fd9c521440fa67b64042cc644be6e42e2fd7cfa2b48b716bb0b388d8c3ab9f38dd02f3e01634188d3f424e4948be89eed57c9270b5c70ab8498a0cddf380b19f47678402fedcbe02c2a2acc93335165a88843f65dd87a3bfdbe2cf399c532af530cf0c179c26e6c5ed29ee5be885a9e0b6ca5530b5451650574ca032e255067712bbefe71c6e5194af3ac8f63c4c252b7a1a0be7c2afc76767a198b4d9cf73e578203562ee4671fcdbea06e5b12a4f3d71e63ea5d0e1f7e5719119acb94b1e93f111b21cb1ca5258337e728a3b3a43ee44c2c696f6ab5995c8f2573ab4b70a9d082f5294eb4a9aeb7352a0fe71aa63198fea8393a3de299026b2e4cc69c220a53c544818871ff2e82dd99f565d334452dbd76c01aac4280addb88793676f95d5cf42ad69715b000fae8460dc7f44f78ab95fab330f47ab793294b71430aa402f0764f9fc2de5c57ed514d8220ff76b3e916d3cd4080327749f311b5f4aada9c8904e8a7319d9bb90d494dad9adb2ddb5343a392e2544b3aefaa3c4e5a57d9e706eed10f6b23771596141869d3e7869331fd5cd533673c9687613e7bc212bf4425394ebd3ac4b32b6046866769fad88515d285c530e6ba7e18b59a730407b5f2ba606d5764e1c69058fc462648030be3adf2e09ade54adcd6a5ed894e28e84a3213a6367372e35c5c1290c6d7e9525678207494677fa3d378848e6a4f7d0b68c59c81195c44b953212002b6e462fb1cceca62c7b655af5aff2006ab15ee6f130f920a940c1cf52efd91b77481e59ca643e1a057a5d21eb710e5cd43af88533badc442cdf35ae98dbdbf8372613c57054d1ddd15e109b623cf1f82920baf1370c87de9981d69f15f89a289c68ee66d26895997692d096d6cede8bd75194d00588c412c0f5949dea8ce73492d4d78868b02746bd40579b4d85be4cde3d43858889ea5c7cae631614f992c06a825d054803338dde156c6470f5c5ca6c49598bac3076bed5e13296364fade282311dee40dd252fc3261b4c2fe959a5614d21231940b2b916ee9fc4e5c425e8056c77975febd413ba37309fad13f3cf4f6df731a4d2d6fd52663a16f8f65d07e4ad39d12660c4518b13517ada271f31d1bdee4c8fecea00e721b86257faf2ebcaa806846f3d328600a99b3be3715e9d1970385da294f99587af3f129f28e288c2165acf693452ebefe3eb6ab86ae75fe9002c45ceef45b74ecb53b0d22fbd429dfc73cbffcf1efe00b1c2de04d91c197f0a8562933e3d5c955b2326ddbe65471c57404db840e997bdafe799e6f9edd05da7d2d84ea9bd142d2c43921c93b64c59bebf19f986993f89ae2050a4f187195f6ec55b61b9070e3db40babddb99a09c20b4dd4cb4104a480b18416b6df787e1ec7c31618301ecd53a22157bf13efcec1dda83b864cd20cbbdb3aa9b1e37c4f487f9b94b3779ca05ec6a651e59cf957b2504d4c05fed14cf33395664b1a31748fc245557ce0aefed8cf9febd72c13e3403fd26003a5a84ff0d5e290f31204968c5c3b0badd75fe05ebe2e78935e047cf273dd3721bc4140869196be7da7dc599aef59fc5e3d3868bce8fb3b2f99dbd98bc8e41bbf2055af8c4b044a73cc6c39a13588fda853ae7f4a16ba71b9f4daa8c5e2e4deb9eb241b5288e8da7e820e65ddc92f4111d97c0ffd89c0c0e32087385a5c461605c7f951e1f68570861daa1e5c7cdd9485008ebca0e3c32340d41fe7dfb51988d98c0b93e00ce3b1fcb4c17c6de5595d85562bda11ded5d83f171ed103084779c2c7a8aec1669a56dce3dcabef94fd1e6557c635af7e1f110eb7d46af8d5146639f86f272e18d9f9484ec7b7ac73175038961b69e5413f7f9fef3489bcd7bca7451fd0e82d93755d4c13b98c39eb8471a5890ec4f2469241890547a39ce3c6c3cf5d2e049f11ad2c42ab5b2e7c6fd2d8f6c058ad64ab56b99e818131b7efd66594ce504fd0592941339e7df00795e75c6f8d3201bbc23bcff815bf2c9acf60074a20dacd8b7a83f1fa8a6707d8fc5651b63d15c2a96dbb4b168c48bd05fa57ac42da62e768b4a2787578cff309fb2b5841c363459870c50afd01e455c2f2f8c80cc4c2d33a65e0c39bc5f21b5d4f68785af6d2940fb09c79f3d8a9a65fecd4d9c1a0c39a1b9f1c382279eabd49418472391a298ea73826b5fa718ffa1588882daa4d91e60756de4b59e1ab63c0387c0eef6c7e97056550c3181ac9bec86051a632e3f78802577936732085a18db0f36fdd1cdcea1d14b0f36296008fa5d3ec9c7bee5754e37ea216460f5aa27d95a6e6ab2a4a7ed3e5b2f13e724bd22367b6ea67945ffed6f7b6e6be19edcbf3a41d9d69fa040e57f2e14be2b5de762a40c1196b13d466ea24f1611811962b6269097344878a4e5c2de46a7e1428bca1855b333d1cdf9a1f4f585099e7a6c5537a3bd8ac760288e9193dc00f9ca731a1bb27018c53a162a86daf36f3f8fc8639b72c4ca1df598d7ae81bc4d2f31f8218eb93a57541474385fc4817eb89a909ce5ef547c2caced76430668c9309e762cb3cd9ac902b19773d891c7ba36fb5fcd659a3dde602c11926e83f7a6f3aecf1d1971de5c84ab013f6b7bc0c0ddf9223d24f6c5e71aa8e54548ac1137058ab180b665e9537f640b7a909549cfff81782e1866c3b848330d4bf7b88828b049c07e9f5b8780cfe19fe2adf6a73b6b72ac26874e5bdac520f1c917b26bf4bb4c2155cf20be8484f40dfc1dfab30594867f9e33bd9a5f57be3fdacb2a2ab387fa7ae90fd7709e0162ec712a5bd67bc3eebe2c5d4387ad8c53400904534f1fd600452574e1a5639da87ef1b203d0adfa265456569f1889229dec7d7f7c3e06e74f8a98931e1b729598fea2e35e3275a8941d5b23c1f9a0a602ff4cc6654cd9c551997afe0d96a6d1923232e96699b27a9bcd0e95a59900c6b1c2a624a71c2415073555c12bbd45c5b8298b36d306ee74d3907ec4101dda00e29c3bb7d6681ad653716b9c102bd83bdae1613d062adc332c245289cb8f41472462db84b3a2c043ac872f754aadd83998c5f0815b8f1a5683cbe279877d60c209627a87bc1ea2dc2788fa62629f32f2322b40b04d9dd76cf1a40bc123132c366a783a2fd83ee8048572eccc225aa3c92c66b46f83fceed7ae1210751202568c343a8f9a218a6cecc30208ed13a556ff33ffb32a36763cdbb5d77d66cbc21a5cbdeb54aa7eda5d54c4b8718e059264dce06ae5bf5c569d51b5a686c97c88c6e9ce70f5b0075a10e7ba697bcacc54a69e59c8e9d1ddfb5f2b37b55d5699ed61a5529be2f824f0b4102334d093cfe70a2660539b3b9aec2216c6f5449a9c9324f2bab4a8223026eb1ba3b844c26b213209ef3d9edc8013d10261e60935de69c7353975fd50e68f020d273167ec7336c7e434488691a392ebb81ae660f5cbcfd7001693d8260d0afb5fe35de1aa0cde3bf6f4c24eddc93b0bfa5c0db6585bb397e3d97c9555dc863107ec5dd6ef1ad1a9c5cb53228de7bb30b5d94a30936f3d7dde7d4024ad87866247ee840f6c2bec74483bc5dc8122885de26fb5bc16322c436642c56ba566c85eefdd0eec38b3eb71c4eb6384761a2b33e6e139d7f9d13918520fe1a4b75ef9e8af8516fb68a9a30975acbb98fa9d679fe8294904c962983ccfe6e923c6f1e61c1c1f06f28a1fc86909a0cc7a51da482708a3d98b13d2233de6d5b34891805998a06d061de0b31c099c13f02889ba6cf36ef8c578b24bd4c5951d971947a7f722dd239241bdb8fd178495cc212ecb7275d052d0a6d890bd11cedf291d49cacbfa2aff57e5dff8d1815d254f0536cd2b822d9075d0002f882a044dc3032af6674ab1dfd4fbfa44f4fb166f22cff179076a8683c2acd259412263170bcf8b7458ecc4896408093e920c16287537e4e84faf7869a11b9bc098da8dee9972fe33f10c7a869b6cb022ea1fae19dea9b785eb0c0c32ba31b375e8255a04e72d58b663df9c9b249b8b4b1e1e246babd65b06471281f7c9a2113873a189a6a4008a2f9c11d08a3ec0613d553d4d3dce8ba4955cbb1d5284dd8111c125bfce17653fd3cefa8dd8cfef514f0f06dfbe959696e663dc3b29e137845435c14ebc36d79e3f50b823ae36df6146da8f0b22c2211b22b80db01bcad5910099175c2b1d097a7bcf995b823e4615216dccdc805e7fafd9d42091f8fa4140887f844eb4fef8db09525e01fdb7f189ab7e0a1f20f7fc928a74e8e54581e6b37628c1c48cda99e11556f81175800f718bc5957353e85095207308026edd972347f4325ce448cd6c20442b0bf0cba45a6b469f17744b73f3424071f801214c62ab7d4eee6d56259e7e48b02ef127207b208884c08b642a7ba42f9c9ca09860ee802e5e3e3758122aa16e9052c25ee22afac3a0721f62c381bdde746df4261fbb89ee70968c0403f7934679c06c398aa5c7fcd212987d8bccf4c829b6b21c8a4c34dbeccc1d09c501b0d027bf16eb3ceb1718fb8cd8c3668ec95eb54b6d15f7ba2e456f5ed72595b2fad13069dd0d5b5057bbe8607feaa42f7f6b2555371a8b08208b966e33a5824ebbd0a1210d3b14c2b7f0b7b2142c2174abdc8a6c611552910571fe20254a00bb010321fe76562861e15cb57017b81f37b90a71c7ace7d831f599f3ba3debe12d6f9f956ce0f90979b867a5ba6af42ad546fbce95d69929d495d747a2fe1a40990ae254301c3524bda581070fc0014c29a88e06324deda223c52f034613f75a9afb39d37614ae17cf51704142745d89c70edcbb5bbe573ceb0a8e68807e577b2b4fc7fbbae60da051a8d065ecb547be66fa5b8117f82faceb017b09e48bcb8fad210eda115242e55160804c38cec3a8c67dd0fcbb3c4b52b7f728d006a776fc8080386617782edfe4cc879b59609f4a3bb1dd462407babec6d57e942e6df01c44ce15462949042400c480acecab12baf425a449077d0ae3054ce56e03ac0eecce545ee8ca7f63d5537a2f98365283b65bbaa35786adfbd9c435e7af0a5b1ddde7e74bbc6723d17a2b2b7f1825e842bfa6cd27aec7f6dddd38597bb03f7213a243f8f80081595de35d0a9151a560dcb07999144ac6f4a7f970244a3ef95eec035a360521c0f63488769d78f50c119641f2ee89302ba119524e43b0a96c30dd9edce002ea7ba59ab1e83569daa2a90f347975944031a650635ddd9bf44a3afcc2a623ee50d7c7df02be9e3f15e347d418cc96643ff0a1e6d94aa5b4885e1ac1c2cff7a60b12b2434f9c44c006ee9993e0077b9098c63d5e78f641f72be67bff6a8c936d44d4b9622d6b8e43595ba8657d5b4987d5d367397eb059ee4ec9b4a027ec009d8332bf5992aea4ccb2f7b29638d751e5a076126cb43d3215bca51a231c37562a620e23e37a36f35efb01d1e6a52a7160965b1ce250eed19553dd06388133a61f278028bc766f10c89f7bb2321ac954774dbfd41a5f3aef7708f97940de679e81be14ef58fa74ac497af357c7370111e408b19dca425b4c17f3853fedd08a0362ac8ff083de89a34738c273c39833c150c7003bb837f7973d955d743d3f6b9af685bac0a50f176aa4eecf85032576c3bf531574b882d1b4fbe40187fc1a23854ed06fd35b81db843be1de5be6c9455c396ffcd49234a2ba283d613a7678f32477a211051a43970dd79b3cbb656954c6957fe0bc5a5fcf55158a0a165dd4727e9a864adc4d6ace3351fd4354db3fd92a2ea4770e5f61fc43a75394eeda16003c30a9c1df0d473972216dcae1ffb23abab04ee4737c5f2d80fa58b5dd836ac8f39e49b4452275ad132e1d27b94e61d899bc679b73d794ee0d08fbaba8f476c904790c6c350dd2c2c992529194b16d84652b69a114c44a33aea282c514979415f2724ea487c2a271e27647207d677dba40e70920b581fbebb832b1dc0032666aac8af1ebe948e99621822cf0e8656f15c309c23516e2e22b87fe355914f7d63c425f1f6aaa20300aea5686369a72ae1486eeb31584c9fd60fea8d2042bbc1e83b54088fca2edb66d6a8543b2936e708acc08c4dd35c8bdae2d4dca7befd8fcaaa5cf735ab4b788db55a2be8aa10fdd49a11a9ce8673c520d62a98a731f199aa2cfac3f43478c14692df02b82e28b64dcda9a8c69ccd1ac57fa7a9cad6eebd742d344a7477d35829752b24d6dcf7ad275f6a3712d51aa55d6befce38a069e19637feaaa3af287b5b98bae10376784e66726aaa3872e56e6861079ca0ee3c2ac835fc48ba6579cc3618e21401f141909e85e33f5bcf43dad9d06e6b0dbb96fe9d342f402e19eab3e25d62eefde32fd82d1dde8f02875ad0155112b77bd8b28f584206b45f423a992fb3b5c0dd9e254fcc6f67af9cc7ba195730b663fe631456e949b84da0f5b7927c0285084bc323ec3fe705d3cf6ce45e37ef3c2b3d7df74cfd64c28c4c5baab4a8d5512b2259af255077102758f9be0eede685152d8d8c28105ef929c3ceb423224ad206ba8371ef88982a56436072e32f63a0670381be738a9384cd94573008b3bb597cc9db94376e77ffcb541130ec1ca21ebefd3dbc49170909cdaf772829888f3b726912ed4bdc325c919ef8adf771d666808c6fee747d06b148dbe5e937e712e0e1367e77c622c475c9f19013c55eaf40e59aa1ba82d7d50fe252d5187e1a4eb3c2986d97fa6a0f8c122f55801691de9a6a8ebd047d3cc2ac189cc65c5278e5b7df2f122b04d8b1066a4ae521d528e74353a06d9e60344dfc875558f9e3fd470376a649ffc5f202a965df38eeaf19f4f814f005540d83cf6e6dde5dd068c3aca71293f7ea92da77df499c0c9767cb0ba79ef636c0d3485b664765a4d02cc1c75ee312c95245e5d73ff5df97bb390df43a2f817534ca874f8f8a7215f0c9e97a60e76c3988a6ac1bd07a9122db5f73bc372b5f099b12d8c15bcfcd55fc603c59ac90b010b792665dedd5d81bb208cd719bd003e93778531bd0d51d6a81cb1e472bf15495867a49873b5439b404a7ffa6f6c73b98d70c1f33f3739d3482ebd9d6f01d4a2fe43542674ffcad4d040ac4f02df2b11b219d4fd46ae63918f79e50099cd563e9dc286a68b40c48a25f65f83c2c4bc85731ac4b515f3b2b5627a795beebfac7769fdf488d3af638d47ea430bb26f49f7241d98954e52b903b2cd844b8f03f49f532b22adc50b12ab16d0dfb02aa93c5f3bdd0723db69c5b9e740a9857c6145345ad509dbe0c04b364ee81cd885953d9a5421e76ce209eb27b60b26da9405f0f6a84abd27500fab945d7f2d79014bfad68a4649568e2ce9e7ddc64e548e1888cd99cf0b90370fbb71da8f1dba4150276146d99ec7e1e761682eae5f438862cacadb9e2cd545700e8ee051fbebc2c69b63e591bbf06c0a45ce260eb6a1e79a374a68d8ab621b4ecfd30c832ab2bd17b56ec3ed0282fafc47db873e162ac9e015158f1bd85bccad924a37a4b8468990125f6725af4fbe3e48282be204d6ddc43005b6a53446a1ebc8ff36cbf0545350b26097e37f1b1374d2d299a072de91d2f1ed11a5db7252e011dd32a370e7084f15a9be8fdd57c7cd6faa6d90bb8d37218a04961102a0af8c93bf80b14e7cf96df3ecc04a7a4aabb16a74cc7c526de2d0c51aa19c8bd9e49f7db2479b0585642dfe185f08acc497f487b46c09334925ab59a45e546fb6a23abb6873cf33f4697828df16d2dfddf119344bda9adef37d9f38d0be78929356b884e11b019ae90c00cce04d6f84b1b896ffa0d135624c286bb30f830eaffcf8e4c5e08b2e7fafd218aebda2b57b1a9513d6f50134d520b50bda1a7d2f37622f9872fa198136f03763ad1872bd79567288fb5b4783c8592d9a2a4c18ac94e30bea1d5bb303af929ffa34ab7610233087a6bfe3dc516a2c5c806befd82478fcff001f2a5bdfcf72bb01cf909c43d03ee36f52f57971b2872793c072c5fab617fa5198ff1cdcf45509d9279d0f43fd5d9639864288da40f65ab49c9fbef20f886de4a229c4db4949755332a22d8c83313e4b2427ba73f07b90d2f98a9b115ec2b4b754104f2d3208e67bf2afe39e7f3bc5eef6ba1bf91f9185df9d63beb9c24760f476b0c8d9e37fc4d93ce12d7b20e34f40690dc272ead825cd40a8b2a81229e89717f89b93831da302ae9ea88691d442b2bbbb8e9a7d3abd2afaf2749ec42851aff4bda8be7a009708a903ad90aef012915050cfa0ba52509c733a0ef3d98a088d7e61caaf279ee5cbc7039aad270f84aa86b800be35e20031046f1a1b5bd63c02ea844c8e5d90fc1eca8799dced9f826ecf880dfbdfed49e7668789dbcc5d39863df2823288cc666199446b7d477d2836a80f03396d195fdea0f39d4182a198f39c0e1425fc164bf2ba757a8e9ba7a582083d68e0306048022fcbf63634d795ac4e696665f265c15900ba3b69ae5a6318935d528c252d14187780a5633fc9ec71b922c35f7fe52c0ea5296d8333359005bcb0640fbfb0e5e86ad1800cbe403c7a062da79146f53be2de9ac640594cdce819687c847a96091ba0069a5960a31254f731a6e2ed563786192760a11d9013c264895bf207468f37c743dd83bda7d494eb7ed664327fa256b5ffbe3e5be422712f449b62efe92ee880bcbedb110a60778fc614823b15298bcdb78a4f9dfadde9131f3e68e8708a53b728c3f34a42be2c0413b1e7e30b39e97f2862182a265fee9f079fa45b6d61226e2d81f540f3abc725a7c6f793548fc51b0b1e1101516a483d7b2a05131053b3f605bc8c7cbe80430c7f7dea2165159051b5d2d53dd9fa6972541b5b209ed45640e0e9fc8e07a756464aab27f1dc3e25c53e77bcfeb810a7858d69ab3c05b4fa17d6ef00487a71740a353fada01ae11086f36e11775a7a089e687ecf17a9be26c916678727cbbe653de56bc312effb503edee8396e9e2d4e2c4e3d6df18e32aa0e111fb42d4ffa0d9e9ef7ad3d5e60f70cbb25fa1e05ab97dd3827182c84c8f19ef828f717adce78eb2c35db70b36a62d06e5612141b1953b6c37c0fd0e82081627bc56640fafb6dde4ad209cd9e3762385f2db501690096c7b3ff0a4fc817ecba9ed92fd050990b1851e242497d8151a20851b9810c9217f33f44d2be6c1220143141dcf50390a6ff441bffce7cc0ee5b527429b7e1239bd582acd52b9821e50e0f7272eb7f71604a11f2bbfe8d91d360f8d6488efd18e57cc842dac51f2d05370344b72e300802d79d9dff5bb0428aed32c4a453f4fbd6bd6c073d7f37bf467fe9f3e411076001b6206eba11d16eb0368892447fe3425ff00e0e66b7450c50052e67b121166df2ccb379c503bcaebdfb69515632e66bc1d4c6b61b5f40fb6d10a6af53f929d5bd90a625eebb1c1e9de9d24c955dc536a5c312fadfec0f88892e0a873211890693c94bbb7d403e96c9588fbb07d07de8c60703f408f5c6ed6f132a2c641c6832058e23c9d423bfb161af6b3ae79ee6aab32f5288c32cf64ce9c1dd66ca662f92668a326018f26fc728158d615c8856798cef7294226ca630ed37449d2e0c709507a9a44413e37576ca48010ff39e9b85c220bfab52d416b3c2e9bdbbfe7bb59814681e732dfd55bf2f4fdbdb3f4355e6979fdf4c39f64f711ca13cdfad438d467eb040de0162da9d4d3f0d388c35d870a84329df2c6a9c7afc80c52399fdfea86f725079f9fdccc9dbf474ff55d4a2996290312ad3aba857ec0b7b80c92438bf8b752316ee3e9f2e1c0de563e0a69c5ec4cfb37fe13bfe5ed96bb7708a4cd97f0f53c8cd54817fb12b4b19d84822a9b1472e4264b5ce7ced4cabc48d498eded25463eb66cf024873b1edf504a9490f14fdab6350559777282475b18038edfe7c53ebdd0dec8567d61cde39ad994de1b037b891cca6869ccdc5ac89e79a2e427ba116e524ed92cfc8d7747547a048adc446d7c23e092a730865f57a1e058dd8e8ff5affbf908c5ff0af942543847179130952db3bca17fb23e81b644588ca21e59dae5359d7a8da8dfd585527af8fc3adefe1c2a559a9fff516f38c5f4b0cae077b92ffcc5e1d766c5c099545ac0b0434c6957c987505ea4e6c4489133fe0c3b2c503ea9ad793fda81f386fcd64b106951b5f3e1eb1766552ace568d03462e153f94e8b7c7db848754463315523654cb2aba54e6a256f58c2ed862fd0dc1aa8b9acada2363925cec524e7d000b9bbcd09d6786c0397b3a30db2d79314f6a5479d83b15ee574306d1cdbd6ab44e49ba868fcf89baf358baf50163e4b1305d73c94d4e1118dbfe956a7562a3b107c111f0fa1291cd4f82e3b44c0c81bc93d4fd00c718a952c8db34dfab8999c2f3b3b8c20480023f41190e07d7df799a30b19861e0c25293645700881742131ce7e5601279911244d88ca6a0b8fad09177db3899dbdae8a41300423eae070dabaa4613e88fc6a5d8efa9681d4f05fd1aa7c1a54836d30ef86254e76512beffaadc4ef849d267117dd24674c24ca7104a9607e9b63779a3ed76e4e561d73d251e3c612119fbd3a63afbe7e9f7891d8911b9c0234b8a0e861ab4db88a0c205fc24b82ff6ee75258cdca206dfdf6bb3acb87fee43210eb9984e052546947d439de4a31bbd55703d25dd404299858a1075ec80d78c66cdfb50bb5c01595ab3f5925e0d6e2c1ffa7c5d6c433f480e7864e0359871d970c6ad319f567156301f2015e1d0a5cd06209a1d0ccbeb28f9a01f663c4b07a3b0510dd700353655c93f35cd7f81a7b83d79d101091f0514e3d241bf59b68e696e984df1d984626149439f4232781d86678d6517ecd9ac57c56a3f53ceffd58754b9a6e28644075ccc980cda4034f8beb05df89969beaf6a97d8f6d4a133c741a4aab02854a77b0d0687c190885048766335f2da14126de8c512d17650dc848dfe8d8c9bc7015cb04a8ccd3d62b1cda2b19bff2620dd0970d96ae23772fb8b4ef4611c712ef5e58989bd47eff750276c0676640959ac1879ac3053607cf9690dc74fb720311d8d4520ed35d25aecfa48152364a62ebb7ba02bc753a2e8e7b90b5f538415939baf49bf0ddaf475d7c34d371ac6132d064fc346887b84681ea98e2b4841b701576b537fa1cc6f4ac48adf3140e210b968f7c7ba7f2994c586f25bac2dbbf466aaece2f572fb004bf77efaaa0805cebedc0c64ec20f78075eeda6573585415df8928e7fde4be81a7c92fa97cc6efe63be3c2183a9e583f30cad51043e3fd3b148b9f19e9cb30056bf6370dd652eecb270844c4e7a392cf50f87857bad8b38e1079984f53194f007939eba5c4c3416f4519a35876e77c299ab4e1566cae7642ae1c4e71255fc9000975fd98741f7b0916f8ca1a49798a70ad9fef378b9442bcc2569af69d238ab1d93ec43f31056b0b310310abbea04e1cba9e6ea36f59a569a5d458b157d684cf96c0cd011c5cba0ae5579ce708632340b24f8fd67dadfb2b5b7fe952dd5bdb0533784b5b84ee432de82ce023f5aa7d9a3145da25a4c7980667a28c5ede462418a6cc3c601c732f6d9fa43412925ae83d559feffa9d8258a65519dba79ad9ad61d272f450746e9c06d73948d47baa140d356948cb54e554743c211c507a3ccd2388a65f43a559d600e49058533a9beee55021f4a848fe4f28c0b6b9c3197c13a29ec0cd4ec746d0f8c894ed88bbfce6725ff6f4e288d8287542c98c279701dd99bb2c88671f501b07ee2afe338bf77e7668015c653fa8cd7b49590a453db528176d0a0934e88bf4661b727f72b733288e3bb0ca8eaa7d8f99b496154b7da774bc700901f6278a9911235329649b4931c99724061ebe035d69b7269aa48cbba5a495867996a7056afd2a0fbde10e20183ded6a59deaeb8bf369f13d35937f7187f90d0be3438d67110dcdd36640d8ddecdcdb0471ca8998bc8f76740b2666c2fe03fe7feaeda7be4dcefb55b7baf6ab3beca4265aca8c9d12dc99eb8b16568c0bd33a59fa29e2e8639723e44fbff2b5735f4e41a60e1538ab13bb3830d2fc7d946671200ec90766dec1e87495beca52b225e99f022b97276af034525af293b0f1f33408940ec483f1dc7ff20428b4040a0c3d9e3cc3215409cd335533401072cbeb8fa054874b64954ebbbfd5242b3c1afb24b99bb6aefceb3bf1314390af0da26057d9c56e3650b78f5dad417557e6825a51534a98f15e1e8f30e82dd71307fa54730e199f732962874266ec1d25e7121335af984a8d0891b6f95dcf91de8fd54e58a3a68844994a4d63ea9a460060be11bcd0245d8e40502741a1e1ae922c8d5e43b156356a918495592ebbccd8e8d0f1f4e19277c9c01418c46d5f00d1674a2ffa519ee448e717d8f3aa8b491df16dab54c1669dd2f76ec77e8ec8690c10d6929e33bdcb9caedb952d224ab3d240618687b7658aab4da1889da22f67d348be1631fe0082a0f711b7a34e97eb0a1c1b9fed4d00746ab566aa3a6e429f9e37642a12feb336abda4aae98a15b53e1bb74ce6c5cdc597a76cf7214e75e955d575998886632c05ba26217242cb97c080716d1e64ba5e514ee6137cca2b058e913571792803c40618e595536ca7090a1858ab63365c2f68adcd998c60146bb7828686077b3cb840000d055f4a4769bdef76a53d59fe25854f90e4ee5017076d125c2537e1eb0a391b0bd55d21515a43c066ff6b4b999c261cdc81dc039f59226bffaa6aeb7e0b3bc1b9b4688a1c57c5b5fadc55612efce8c61e97134b2ce9731347319fd8ddd3700376b7dac5e6ff7b4fecc29019dec6b073db29e8c9730b6f0d68ebf858fa0af6283196a2dcda8e325e81fb613ebbfb55c9e0986a8434e8e303b85c316cd043639af9aec5b665ae2f0ba12e5ec6a6a72f01ac2f7e11ad82851c043c81cf5a1f4ddd77aede69a7bf0b4087f194b2a98aa717a591504c3df42ec18a58a2bf94b6b9ec208e1493615f33a92622ca6ec71965b1675a4809103b988c40993909ac82f838cb1e11e22e79c229fdb7cd0c617925ad03b39da649134167abac709d640413eb19c842b80efe8812ac09ea1ab4456634dd01fcc03381851022f48c358f82f6e940d765c0a38b130215b1def4a1d8e94654c94703f9778c3f773224add2a34d916d6c38f30c61e82f8761622ee480b37dbdbee7c67b1429cd17a06f5146ae30345d8aa519098d82e684e190414dd78d10bfcb4f153db0d03efb3c6bc6ebdfa6cdcc072f835b8b19e05bedf10df53de7c7d3b06ee884dd59eb22d25b92f49dbcee75f37310abe8964589fa963438d1935846add7714e0627877d36f1ebebb84167b30b21e921bd98a8899ac61efc62cd705506618aaa7de857c8d01fea746679aa98f8bd370aa56ccfd923ed2e13c81d94c7bae3e13279340644713a3856e06c1652516019dc848b5072a932c0f8a8cf4f0740989c91877e8e6efaaa7c37a4a3f32ed71ab527adbae087c24490c0c5163c70f85d5b608b08515cd369e42c1ed27ceeededb4c979c2fdf47efe434cfd40e15976bffe55d7fbba456415f9b6a0bb65a47e7ca3ca2171a5957f8271ac0911adbd6756185e065da327ef7af2ba586cde56ba3511316f82c9a8a35e768c74dd45042e6afd2bb091a301b2f7317e2863876eb1c4c2f90b6a34296f02e9f4a604dc265606d2b6d4e1d37eead7311d0f2b6aba56264684ec3ea45453717fea93f29330a1c30656e14ddcc1b5c99070b97cad11f193ff2163ee8f69749846286cd29ab5e1f945e8c4f1b6bbab6b8a968f1c86254fe7d01e5bacb9f9d12de12f74b1338ff84f3827b0b490e511860083c2698f0da05b0bbc4e3f07adeb41deba91ccd0ee6aaf97aa5b105a57994a5ce91d22f162aeeda51b2b5a3254358c57dd94e210f420f9beb1953f37327ed4f863dd0a6b8329893ccf3cac619dd1f27004a21cd483482e072f5cb3268b6dbe578942233a38eaa1d9fd036c869ad79f264d15a26ee5825401aae1b3fa22c9ec9169fbb0c3d2fc75eb4ee6b39317bbdf0ef33db8c0a2a4926522342f63010d7102a53c8130741fba2eaac038425eee7d8e79f89b1aff0aabc7035c73d12f97d57fa797faed5d10a99662f9d6d6b68f51a2947f73c89d197c80c8afd18c62e5ca2d4f96398678c389c52f1c1e433ff2e6f15dec15d67f30b57de409070309e6ba3511d2492030b20e42e8f4a4485a65c472f021360a283d952960ad0e58f387e0906cf2057681a72e1eaaabe19b0bcd4beafcd93647e26d3fe0ad5f4be54dcea084398bc5ba2ceae6d71ed04d86ce89634eb25aaae9ad2664d674a5726d3ac6ef0f9cb35910cab87ce2107a0c1a28a5c543e63e5c793cef1e586fdd396f0dbe1ebb72ee98fee9a81313c474b4bf6897b1d7b9b3c4c5d0b484e1fa4981a72100b1712ca3f99b0d02257dc5daa5d843518d0d4d1ff23979f81e1c5a538ae9593277ce60a5da864eb846e0d9bf587bb1f3b219541ada92bd77c64fe2bab3032ae0874fe7a58c6160b5eed3e0515854863e3ee9c16f90d4156227c38986126c8be7c7882af7729891c19cbc1d95fa3f73b7949316d8734ece766d2e010f1910f920e768f8aa30260f80e05d6d069bc2fa746732c64e4414f3131ca8f34aaa955f14e924e68c69fb3f5803a7eb7660d63ea105c4a4596c2aa253a2060dd231a3baf2c8c714a0337b1992dfc278ab0daf32773ebad8b197c245d0f49ed7ec68bef2929a8d34dcd0e983a04ca3c53179c6940fec57fe2d1cf80682f09c6bd208132aa5c7196f017309c9b6f4a8d15f567bd7e56aba7592e388767a0ae9bfa38b7e1501ae8546a3422d48dd33423dba883c18d57ce31d3716c9f242f4d545a5139869b1f342898a6dd40f9532465c79822481458563ebe6ef98c0ffe716811c5b666434f07e05192eaf291045df8a284e85c83d46c2a8947273ea6c783a83621673e3ec9a1f78f854187a7e5108712c0f4b4061e5690fe6934630e78d8f4a48462de4d8eb6a0682c78b7af6f382f9528c0963d8be61f2bf4aed5bbafef3ebeff0036a4c6fbb2b385a2397af1712bf464a732ae16dc296c04ea900570d9b0734bd82aa985abfa11d2cf0493bd826e335b0d217abadd75eb060b3645fc8e19d025fd4fb5bc0ce78150bdb9301423a5f23e8976fe9384b5b880b2e86d954151c2b12c053ec871db160cec736850eaef292c89928399b122e20fb43048b4aa9ed8f727ab8892a08db0172cebbb6d0fae6b03fdcd0bbf853b1734b3edfafab131d9cabed57613a22aa7950b610ae2b30804c8403043451861730cfd32b16428dcc7f718f16d6a87b2849cc41a2bdae9e9a6b8a3e86a574174812d8ee7b31918ad437ee352f608eb92141bf9efbc357d2e1eec6143880337088fa13e1bd9423f50823f69fa048ba06d1cb94521d6fda2e46f516fb78c273de8e99d5b54401683d597ea20f1e39057d6552aa999cfe35370a693144857038e3fa39dc374a1a0143798e2e63cdd68cebbdd9a90cb8b72446ab60e5ea5b86919ee1cf323690ca186b1513dc719e8d7e7c45140f24b9d9f670ffdc837621457c988b2a786a079b364311e0ecf0207b6f961dafd272a4cad68fe62e42288dd583f9f42e9b002fc67f096454b9ebb3c7374eff09fa27a90d1cf65985e603286235fb67ed1c05838d9101bde6a81479575db9d4e3ca8d4376c5f7507a15231acf89d668943867f35d4c9d4ee41d31fabda2ddc34db56dad9e422d716c35a666523706593bf9031dbbfcb29bf3cf5e2c3ddf2982c2e53824821c5b9206d40fb0bcc1bfcc59d6c238521284992ba996e642c869a4d574322af17101ea09be158dbd3abd25e22261c53fba494638eceec075ebe204c2385b3662d046b1cd72d6d8a389ee778b163d5bbf74a9c750aed5621589e8fc814f8535fbb499e72c4e5082b212777c0351c4526cf8886de29211ef8276ab420fbfbd7c1a38309d4d36235b777aae85e875e2358c14e72b54a7a3eb7c948aba5dcc1c2d05b6f961992a1d93eb385c5d6e53c91072114fdcb5e77f38a8e7cfac905c871ea23eccfa877c5220580413c18b2987dfd9b14e34e6cccc6844f5530b6630e6986debe9b99689689d3d99ac0e0870c4d227551160a1af55db6e93533c089ce5ddb65b8e2df285fb0e5faad4d7361a3509a31b664f080cdbb9aee00e49c318dd04bc4b0a99d0db06f80816dd5a7ced216d4db768cac47ad6b5fd4461f80d8149e3d8c4351e62a200f7afd67e008a3af2fe99499301dc4059e7e7b076a95d13a3a8f4a34b2d725e870ae5949494e5a6dad445cbb143523517d5b32afea8dffccf93e77224e042b84db98d49c97b9f6eee6ca266759741b4d51312a54521c7d2af1ebb8d38aa16db97aeadc147bd4f2248d027a90f08696b2e53c0b009bd3a85d7d8aa218d646f57b479f78c1c4b841ccf30b823b0009a6c4ba50df8214590f8511e7bfb5727dbb9df788c1f2ea1e6f0fd0bfec05a5d889acfce3c238a3aa58bf82545eaa0175c101ec3844233b28890d24fdaa62dc433801f92335a04e069b94fb8236dea75521ff04107ad10b6204763c7573c910e57c04ab291a981f4f5604908f46bec4f0d06d4d97416d89986720907c12b5008e68e8e2324b77555124d3acaa3d647f5c4264510b4ba380564e2107a8b7c3dbdc9f74d6464ac19622fa54d90ce5b9a048a8f8dcf46f2f1029b039b3b70ea33d160177ba9af06d685a78776f1fccebb782ac1ea956d0130c353515f83197549dab49bf4d1923ca915e850e2000aa516191b59532e38ff5602eb7c87866c5b49cdce063fa82dbc67f11eee525447678db18008f240f942beed838edf80b6567bcab4e164b89c06865291cec1cb63722ddcd823d64614d02cb9d6f4299af93d798410355edc2c3cd37cf8428b181b05ee05fd6725fac744c2671466fa6687d6bbdb1696fc7db22cb057db984995696db90c94222488947c75bde3843616329b9bfb710bc9366af859d8b1b2c5eec69a4e98ecf14f688b0b82567f36ada9eaa28be75ae748dc46ac1b3cf70873ee6743e79b9dd01d48c9fe8464d9b0ad8be787d5a7d39f96a07d217585defe3d96b3812e3aafa9a51da8062b4487660e4f3b184a246b57c3ce54c2d15d45c0f0a115cd11b86dfdc4cb0e31335ccf2ad1e2b38dd41806a6812f04750b9b5c982a0856665477218796ed57ed287696365912a246e2a3fe9397fdb1b3bc453de9d2861e8f2e83087567dcb964816849182c57e8e41ee39ba6f69d3d3ca0c0265a11751a6765169cbd361f2069f31a92f6f1d2cebaf457283537fdf7e93b1177064227b190903ec90ad3ed6083acf99c6ec980195e8394659c0b27a1f6d0943640e59c8b854061e9a16b806162d79d724744ed6628afbf4e979fae13e9118dccc13819b80f97e0b96d582c74761aced8fa78473202dc7d6589587460d1982edc205ee42c1fb95a2c99730320c087e5bee5f8626719f3843ce7d52f6861b5959222cc26d8beb9fd2f3b1673b01098607f23152dde70dca8598d565c4d5bc775070b38bcf1b5a22d83d1dc00fc2e09a1b43cb2f11373677f5b4dc0fbf46c078266693524677e3e5ba8b191bd501235cfd37957492901f10cdda68e3cf1b25cf93b8d261f928db4c2630103424a6d6d738084ddd488b913e82c343df278657dc2969525104297059351576aea78389e63e75b7a35e02949d9c818467ff3521f4615a3976d4f4c741d181f665a4d8be8599127d4ceaee29f37efb19210797883229145fbc8221826e07b54b8138f598779c5df92704ad74518de3b8323e9bf22bfcf9802a27c454b5b005c0a632b8bcce423b6fe559b94d8edd6dd35376c95f7d0e010607f65d90fec95cd9e04effab3e7ab4f353ee59f742e4126c6f14a68b65f41b1b1bc7fdd1b04948f2d8d97dcfce09330dc3e1753caa90087b7102030c1bd911c3a2ac86f38e8fa081ac26399cb1a6b4a0ba87013c60944b0cabea44483837a276d414630df233fc240597a26bbe2a7d1b99b61844725d9ce71e28aaffce87154e1a3766ddad5a5164ed14797e8899fac9a732431ce94656994559afdecf654cf6393167dc3ba76c6da91e78379122bdff2fc1e91377120f9d2606bfccfea762ca6bd45d9f77e09c005c7f28ccafd5d5e27634283b46109a8e50d17b9bfd93ff1b03fc774b8b5d146ba4e69845f35b80f588586d9e819be52bd4c3598c9968415023a1c0b02e904740467dcc0db343210a4866fa9287634917560ed7477240e805e07d451988bd0e31f122901b3630f306d6cf480a0d4e4df93aa191ffa63b785f1017c595e53cd1eedebbd64bfa60a2b0464912d3d70e69500bdf2dac5620b9c1440ef2290c6f3fabb586ba450bfe9eb369711928c88cc163f0ec51dff635ce36bccb7e26313dcbf6c4e7d303109a0a303244db4140533873b601e59a22e583c4daf3a9ceb8bc083051662088199de4a82a7cf104a2aaf609369db168e3ca00a44f00c12511231e2c89d6c5d46b4605cbf52aea91015de98681b1056b9df4337667dbbbe368ae9d936c434825a91c9f1250c73d30fe03426b3a372171ce9363cbf4eeb31db899409e6ab9a61b1d3e1bb45b9a887c52871f55d9a7d35b83be0d1e72ff222346b3cfaed7fb4a5165fc981fa45f8a5fdb8fc0e1d0def0cbc17392babd6073553b09326f1975d8eaa3666aaa6ebe08b45595dc5a4e846aed309e49550a1d1a9f30106e43002332d271cd262d131c00234d4ff423011bda929319236968039b1120c7eb15687c82c88a974ec30b5c3f251433fe2578c68072adb558b08806dbca2c277c12b7c7ab80696e7301fb6d0e400d3fffeba57474cc03f8690282ee1c1acebcc6f047cbc7e2755cf17dbb177fe86a4bc4050085a1183796b668cdef73325d1f1973825d1e693422e31c816ce4a9ea3e9489228bff1b5bcc3cfed50449816913e7423e3480299a21f5cae949912fe74e71f0a62fc9e4554082fc4a3f984c316fbbc2ecf078515a57db0eb86be182f38ee2677c0712fb6d80e6237671c788c7b1afe0ea4d15904a9df6551658a198d70020d1c61bf830b9c35fd4c8d9b78010bfaf7263841ebe9479499fa0d5b14edc168fe2df7d77857e9daa58a6c31df0bfce87d7c438064495db67d5322adca8a202883242374846013140c0f3aac3c4584cd2575da7b80eb49ca7606edcd3897a3e3c353cfafbf173f39fadf9895baf32674669a5a5970f8909faec5287c047941dd2efa4bdd4b0b496f77675b27c2dcd269777c79c0a5f4e99d7f5f82a3ff2c2917bf2b7aa99886d179ac00675b79f1e9cd3427e3b33edaaac7d8a6dee14c9442ab3e795e279e788c83a9daafed540364120d028ccb83308279de6c094a4c1ef6cf5546267745010de22436b273ce9f0f29f3df8a13e7a2223fffeb385c24e86c7b239ecbf6e4e562144a1508be97e082407520795bd053dda421923c177a71d9b29553dc76cbe4f53a00fad8aea2ae5a036e8e3e18bc015f84119a6d4cca472a4f4eec08c4d728018c823427ba5b33d68dc45e65bcbccf966729d02c874830661ed687a7acd185a346eee4e935bfa385305a5ee5416afed98fc8220c5c9f90479a7dc574cfbed1c9bf916f129e389bad77f06ce985ee63f496cf749e04ecbeb2e6687a658e21eaf83ac94d51fa01f263243b35607cab7828072f549f8ef202c5db6972ab79b4ce8c563e6006b2df1507eaa797d340598dfdb75a8e7c00bffa49f3c64dabf42efaa9d8769d96ddf4a31dbcecb4b72e712bc59ce11d3793e2c0e780f60e65c651de042cbc075ad06d0b06f2dc8795713fd3393fa0fb891d8ddd919b86f0b265790f7367ba78ee5526c8dcd1eea9d0d3d6857278fdbbfd91c09102f4fe385eb9cb781a57040ff18aa1cc818fd0757547958e0c42cebcae9b3ad87865390e671020d2b1477d066108cb26cdd73214b51c670b91f7d6e43b01a1cdf70c0765220fbb4e73c92c0c7aea66162a80cb3d7ff5c9f7c581f2f8995271c6326df7693b8205a0cff6b857f967a4f2de416b874f4292327e766463cbe786fc607ec16d7285607cda6a955f49eedf5207df7e17764cf07d823cfaf9bb7241acfca371c539eedb4802ab92d5fa3efdec7458977a105ceb17d1c1a1e92eefe44d70fd9ece77c61006ec4becd0f3c4c9c3acd6084fdc29601becb3537bb473670a0029568f790f238f6d45154d092ba9218c2966e8e6f1fc39d9b238bcfbf67bb135a02f157f82585a0e9ba7e191bcea52785bad9243d17f267efe380ca055983b2a475c372bc574bddc1a4b6c24edaba028c652d3f29d9fe5e7fffb0c97d087b5dede59c51ae6f266a592c5c9ef47fbc2385183264dd8eff81d5a7549df073311e17601843183be46495cedf0d5f3a249841571492aa43a12d589048bf0146b5ae328d9322a87923274386f6a77375ecf5df6dd69fda8bcdd24e6d9091686f253283f9ddca5a7c6387dffc632f0c708b3f8f68e9867ec06e8b9e8c03c178f91dc0407edf4d5c0e915317110691aae7602d11b9111b5f0d204d777ad776e1d417bc263dba4977b811d7daf0aafade812b823f4774ff2ec183eab002390042ef7a91e27fb2dd3335df60c22fe45c4364a9693c2dfcdf41faca10a2f3e88a610d3446d756b9d10ccc230effdf6c315a90a23dad60d1bd802947da64a48a2d3853ed85cd23da5203dd140fc39799525d4a43323915c5c5459338e8b201c7970abcf124655fe004ef0f1754d4540ef0e83a4fa40f0ea16606dc21c7875d28e138372cd844c3b88683d4933beec6104ccf3d1efea3fd791097c221bb2ddcf731833b5f253292611d59faa4102fb643f6bc7a17f0ea7cdda718162b58fa1f402a5f78c2d786e9a12c63a524e433b5b36c425baf74e3761b704cce15663a9e6215a6b829356840457f0ebb817fd1be56cc29064a18da683eaa102fe23216b0b212ebe58fb2487d381f5305ff7f14ea247a65b114dbfb31887ac35b226d888c01317acbece2e7f198bd3838b3339454a1bb483149426f31863ed1536913db2420e1bc94bd4106410adaa48db3eff991f46ef4d8b4ddecd811908cf83f7eef0c5dfde57604bfb969283b0147cab67208cc5af823bf8eeb45cee84e475d99bfeadc4d21f81cc189932080de79f63e2868cf482c4834536e0e3ffca8afc77d05c0fd84a0a444329d3a91e04600e67651fffa625719e5bcad1886ca5779f785196445c17bd78f30e2bd647622a9124b8f36824fc48cfd8f48fd00a898cb14e66e443eba1bbab4e15032f41036834b216370db176b2fa5eb063862eaa49df2f40fc1f878843d303aa7e92245c0f85747f197d5095ce9616781985fee6bab82783d3265b38c2f84d9732855a89ecfe5bb46557495c74ce1165ceac289b996918be78d883d8b54562ed53d0ef308d2b969ae694479cdbd9f1567e3c8e287cff3dd99007180a1fa0727666ca18c012297e73a87f9221d942b60cea454d8a571801943693219622c6c77a44a79f4bdd874bef4dd194a00d82a1f7b021db25308c1a1605e049dfb5608ce34ed27efff84d131c32416164918982a572b976ff3422b48dbaa5ce25ceb8c976204ccffc5dec79b986d724b79e0011272274d173613d5119995b29a457be9ec819f0200cd46cb5ee63d96380b2975fcaf55d2a273a49514f5e08839de2a381e16b59846b4390cedde9d84c1e77c56f7bfd72cfbb93a9688068d0107aac860095fb6194c87b4cfae063c570c307a27e4fac9ea98a99325f27884b1bd76c186d16963105a59e662674eecd1f848a1c3554c5d159235b38ff7c04b923921a0132cfc075febfb0f3a3d0142edbf9af15e9608b4534e63fd023d6a71aeb3f29faeb705a86d69033e5e754e21e0b3fac5392c08ec2f967af1b09a85445617883efb7a5ca992edfdf063b3164d3dd60227148a3871a58a6a0994b5cfac84239bec885ee57e9f768d6effb9b1551e7dab68cff7d06cc973667ff9a2bbab129c45eca702b8efcdfc2bfe4aa7f76d914123667585efe1d28f8e93ad131e165e26625cab32f6e359589dd725bfa421f687c31ee3c46f747f29d6e00ae64a0cda18801984fe65f5c67debc4c6da15414bd73247aa9d16d5d153adc7cf2cb0142e027fad05a37fe937b316f53f4ded9557c0dcfbf7ba7774f3e6f0210c62ab07d9270994e1e39ae7fd87c3dd5eb6bac9f0f31e4dd91eddcc7915e492f28992c6dad3054d0490e46c21ca615d2d81b736e666dc06539fa1bd7ca5d25be55d67c371048e19b057f110d8e3ef87d93db81bdef7a79f53959b987c00d9f2572e01c8bf1a5d0ef888132e038cd1338dfd646d7ff851eeb6771a1f3a6ab1c8d921b8775fb14a7046d7a8110f52920093e8e3542189bc72df77d40c60bff7821d47d06fcc6c966d2598bf8e28172dff7fb8cbf566d39a23a2c62a6d141813b5375a5fcdfe1e39a9ecfea1bbb811b034eddae4fc32dea8ea1d7540081e15c3dcde83d29231c13e591ef554ce1dfe3530d96a31c803e78e7889f13180580139d57cc876e0831ac478a440d1e6a77dc6564f035b86a866a9ba446fc37cbc268cb34a4f8dbb690ae34b148cfb82c02219277fdbc989ba3560417aebc99ede74deec1992dcddd90bf2237c43758420ada9571d6f95247cecbd86946b45ff06bc1233c1de1d97ca714687f12a646957ee4a8c88cd19734a85dfe891d96178943396364c002ee2ff4c69bb62b4f9ba0eb32c113ad0613474f25de405f1bdae3eba74ba4829536dc8c928f37ba4cfadba3e1e2fabedee8efd4800150128faaeacbc45cb068378ad91d818e698d8a91c06b16f13f3b1705c8da4200290bd04136c5969832ead72fffefd485b9293f00a4f30cf9801f4ca2b4ed1a26eb93b7909f7b11970186cf30f62b4e95dfecfa9ea98cc2aa8a73b8c169c2013bc8c31d363107367b079f21bc6bdafba7321bcb16077861c167a9432c37fd5239eca46c361df2ed30f4bfa3b4c1c2dc933acbec7981ed3ece51ef1605f34604573414b2026218bd14554ebfeae386bde41ba480574f2499abd702afbc6dc6b88605dad50ace38c80c0f7e2d269282a12be0b11cc554abd792cd3689a7d8beba2a498037e158450712b3d217aad8a56966c80af8fee972dd76951910d4e5cd0e9e60a4085e74c4d36ff95f9ea93e2e8ff1f019bd33a6023ebcadc2110f4b274435d34e9a49f3b2803b38567f9db25ae4f52c7fff48260a1b31061d95ab8d2cb47582d41db5e4d2d2ce8f85371e9dd749f8976552b1fc9f65f73992fff4dfeb240a12f17d27de12ad161339f95a6affbfe6ec3f0b46bf9a2ad28db063d86330774dbd693162aa0b208bae43dcc5f37b2650b1a29538b80db101a6d25a3c2c05108830735303616a0e3c46ad6c1c0b0d8af5e3ccd5f4328b2526d1e41e76dbcf734539c650959062da98da6ebf360b74b8adfe3e80334949a0a98fecf8fa6c3b48238d0ed38993059a36a5a8dc3059c3f032d913de1f17e3ac222bab77173f767a46e7a0a98f3466ef8e4905dbc73946cc9f6e80eff63916e187ecfc2ba1f0e33f131a8b02cf48b1e8e679973e35a2f5bc3c1d5f9f164d10b0d87f7956fa1db8e18b02aaabda5505ac9253a06c039446c581dfcfe7a83386933bbeb4524736c25932033de6f1eec7c4801c80396a5b9799e1aab303fdf17ed8e060039c70ab0b1fbd1b04e002e75580210b69016d220588d8ba1549445dcaf979c35cab180af89f857b7ddeb19e08cabda74b0cc41d2fd3a5f4496da539bcba0c183ec442cc90fe27a2dbafd4e1c791aff374b5326ba16880a16d98269abb731904dd1f8eb00aaea66bfef72d5252931d84cc01cfabde3bea854b5b14b0e18782b705b94857eac009a988314d37c761c1260a24d5fff3f7ec3a53b4cb8ebd781d9d6a9acea64e6f110711f026f6c9322d757cabb1153f379d970731f15ddd37bdced843340e0679b6b4e7ed2fe318fd0cef76d160543722e0c3eac11f9f4783d1f7ed442e14caa8124ffa47e9adb0264b5115b10885223a921ceab458901ae15db25905dca7a17b81c6d51869fd12ea569fc4b072d217786b4b4d73bde5ecd262d002acd5d15b8691504d1ecd8f25eb8c03a11bd79e8547c330c71065e4b9bd9425bc87b33d6b1911e6398673939aa2f15ac505b9a1ab029b8452dd0828986f7b21b7378028ae6c6668801f323db800a582e2ea52f94379fa97faa79069f392daa28adc942272615ff2db16bcf084f01ec9fcc2f7f6a632b2bba8c4681f9e4f3a2e041411fa4d7195fd1c1690bbbf273afd6846417992590acd443ded831cec404038984bc97078ae7ad38c48e3e3ddec1cfd3e5c83707dcd73d80adb4fa2d67f01247308b129dbc4091d0eef8896a8e7b50371497dd8d44205c8a218068617936ca076aed086f093ae150d19c9df1784f6e617d637b83c86fb171ad6022bba0f2b527557ee17b4543fa609051583997c8518a9aa3ed9c813a7de5ccb506264135f67aaaf0ac7f370880bd3c21516a495362a81e52d3267a5dda30f30a624756735ec064da900053942cb9193398c3b95d7e1a2d0a705905533d4b835413de9aae7adc223dd7b45c4bf8337fe59a6b5d6b7a0063461e51afacb023f80ad5c7b125cd46c5c1aaf0eb085529cad868fdc4c846649eb5a5d822d22d14ea7fe5fe519db51486666fd8e981e422fcd48083f04599882aead27f178c0536c1716ac4aef943eb4c507baaff16741c03c5cac53156c8599e38fd43cdcc5afc502c07c38eb5aaeb4970e616f87775c2cc88e46bdb3dedfa6525323e5088ff56288416187b8bb0f0025612ffa7775ff63bcd9f37569306f86203f31bb6949909f7d1df62e001d125c69b1ba814cba09f160410a40f92aaa7d1a78e16eb2d38dd88604f9c11fe3cf65dd8dd229d3c17e3e31f0ef8c3469da6f2cd0db2d1f20bef70f22e2960f4778f1527532b91b3ce680f71b7627778a7d32bf83fd9a5215281c35fd0118387b9dd4f1280482a828c6b154d7ec21df7e3c51945b0b5416171543c72d1abf5a8a2d6b83a0eaa10894b769597a28e4cf8fed4109748727428d286f92696870e33a6951f1ffcc3e55cd283e2e19cefab86fbb884753da2ae3f17998a6375f9a2c475ffea3503638df91c51ee92be7e92285b32f3e205cdc86dfe437445b530703cbd22ee71261157a2cc4510f341593e4bb4178b050394781f980dd70b8a4c385fda0ff80cf4218374f3167e7ba1e0627fda187e013e2b471067bf8a3cd84652a7c5a9e8606a0589c08ff0b9f19ecb811f3ca7811e52cdbd4311d685b529faf0e12871c56c6de56b26da8ad8c4c3624438682744fedab7c83f471193ea0d525dc05b93e30a4f1d58ab728b8162f28e8009d75c170fa14d690872807e971422b9110198bf49d0b7cc94e8b5bfc2c264bc28ca724aeb02078c6fa8dbd7b49fb7037dd7841bbe8efc903a4a78172a787b0cc6e5aab0bf5e87a5113588d115814e3460b01f839f6e26a02d882dc19a60fa975b67cf028c8ab8269f0b684d396a87faca96dc5211f623b9931a2711166379c4858f621936c4e9ba004027579c3d92103ef929552db3591ded9d4b155b6163d3900dccbce356a0b6febebda2e5a2dab70b7b390a267cb91b5f1494082fd0a5fe0c425ca5cbcd66fb7c4b3aea865e4ab67d96729d9f098e2d528d67e0984de505f269e3c4eb8b16719bd167c8b57ebb94d45f0fe462888a3d48f3dbeef6e59df03a738b182d279bbbfadbf379081f790ac545ceef2f2ae01d4bb89bc73a596d95b151c9b4f07ef1c57a5d7978583de3d4bccdc663d3109ccb183993b79e153351a5e8ca54de8ee89a2e2ffb1f61d0dc19f0b2fb9b598b7df66c5b1a67b5dc40b6247606b3f632349cdcb5edf02a8067812fd2b373c125a3cebaf1f09d398c3abc28c1a1c837e71663e593d1ae256e56883af3c805372ae36e1986604058aace4d6aca7b679e9e44e6a2a5270a07190e060a540f02e66d661e94ee31bbc706ece94064cd46ce7bd763aeb395548e6fbc4420bd6df6159aacf8664ea05162aabf0ea4f48dadbe40fcbf923e895239e455f7f530d9e2230cc9d1bf12be4b9a09cdd9711407fc271d97480aba01f8b4eca4c93345f0ed8f2bddb7f83929a2e81c88450387362b3411aee70010f1d921ad49a5926560b1cd639a130a8a932ec5b3bd899d213505801286e4122685555ee0c933b3573200af0e30712545a0c5d6cdb09541cb16a88f853adde7c49125396abdb727a61087f89c3eed5291907e0168618e868f1f70352a5941c72e4d0d293d8f5a74596e059da45ba21cc4bbbd3644cdc406f34eeed76e6a3756ab5a79092f82a983bdeeeb035b4dc0fce1166cac489d81dbf0a65e3548d996ed6df02a42cdddf963e797779652dee033073a2f591903d11a4657da7f238885f221aacdad140ebcec05a370004a844ea36ca910a60a054fd8ea4c765777c52aa9772f77342b6884f229c8588d1a73dfc381afc4af44599a799f8a7ccc45e1ba56152a7d7f570bc253a95b650be9c7ade49fd386a9331c674d2351f3b89ae4a2ade29d110cd699a0ca15fc4d0386fe8f9336ed0e4589bb18dc64bc49c64a27fa2c83bf49a99edffc029e672a9a35c4c281359206ba60ccbba4ca76091c46ddf5feac50bf3b17577aae680314a39df1eb0bc42e506477e6ca03fdd6c5469ca2756ca486f2b3dc8c36959c7378af19d5f749f1ded308684668319258740cd96600f24d81fdbpages_0.jspages_1.jsvariables_19.jspages_2.jspages_3.jspages_4.jspages_5.jsrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootpipewire-1.0.5+git36.60deeb2-150600.3.3.5.src.rpmpipewire-docpipewire-doc(aarch-64)    rpmlib(CompressedFileNames)rpmlib(FileDigests)rpmlib(PayloadFilesHavePrefix)rpmlib(PayloadIsXz)3.0.4-14.6.0-14.0-15.2-14.14.3ff8@ffe~@e@eCeCeZeqeeԔ@e*e6@eXe@ec3@eV@eC@e?e1@e)1@e)1@e#@e!H@ed@ddd]@d9díd@d@ddOd}dw6dgddddP@dA)@d>@d:d9@@d9@@d7d.@d@d @ccck@cƍc<@cGcccj@cc@cR@c @ctc#@cc\cv"@ctctclcb[cAf@c8+c#c@b@b֜bγbb@bbb@b@bbjbX bBbBb b~b@b8b aa a@a@a@aeaaՈ@a*@a*@a*@aaa5a5aaA@aaaaaW@aya{@a{@aqV@aqV@af@aUaTU@aLl@aHwaC1a9@a(a'@a `@`]``@` @`ٹ`@```@`@`!@````}@`+```e@`u`T@`T@`Q@`P`Gc@`@`7@`7@`6?`.V`-@`@`@` l`@__@_F@_ _~@_i@_d@_G@_5+@_$__ @^^@^m@^m@^@^@^0^0^x^r @^p^f/^O@^O@^Nt]µ\9\@\n[qr[U@[M@Z@alarrosa@suse.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.comrguenther@suse.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.comdimstar@opensuse.orgalarrosa@suse.comalarrosa@suse.comsor.alexei@meowr.rualarrosa@suse.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.comsor.alexei@meowr.rualarrosa@suse.comalarrosa@suse.comsor.alexei@meowr.rualarrosa@suse.comalarrosa@suse.comsor.alexei@meowr.rualarrosa@suse.comalarrosa@suse.comsor.alexei@meowr.rualarrosa@suse.comalarrosa@suse.comllyyr.public@gmail.comsor.alexei@meowr.rusor.alexei@meowr.rualarrosa@suse.comdleuenberger@suse.comsor.alexei@meowr.rualarrosa@suse.comsor.alexei@meowr.rualarrosa@suse.comdmueller@suse.comsor.alexei@meowr.rubjorn.lie@gmail.comalarrosa@suse.comsor.alexei@meowr.rusor.alexei@meowr.rubjorn.lie@gmail.combjorn.lie@gmail.comdmueller@suse.comsor.alexei@meowr.rusor.alexei@meowr.rualarrosa@suse.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.combjorn.lie@gmail.comalarrosa@suse.compredivan@mts.rssor.alexei@meowr.rualarrosa@suse.comsor.alexei@meowr.rupredivan@mts.rspredivan@mts.rsjengelh@inai.desor.alexei@meowr.rualarrosa@suse.comalarrosa@suse.comalarrosa@suse.comsor.alexei@meowr.rutiwai@suse.comsor.alexei@meowr.rusor.alexei@meowr.rualarrosa@suse.comsor.alexei@meowr.rualarrosa@suse.comsor.alexei@meowr.rufvogt@suse.comsor.alexei@meowr.rusor.alexei@meowr.rusor.alexei@meowr.rusor.alexei@meowr.rualarrosa@suse.comsor.alexei@meowr.rusor.alexei@meowr.rusor.alexei@meowr.rualarrosa@suse.comalarrosa@suse.comsor.alexei@meowr.rusor.alexei@meowr.rusor.alexei@meowr.rualarrosa@suse.comalois1@gmx-topmail.dealarrosa@suse.comdfaggioli@suse.comalarrosa@suse.comsor.alexei@meowr.rualarrosa@suse.comalarrosa@suse.comalarrosa@suse.combjorn.lie@gmail.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.comfabian@ritter-vogt.dealarrosa@suse.comngompa@opensuse.orgalarrosa@suse.comalarrosa@suse.comalarrosa@suse.combjorn.lie@gmail.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.comfcrozat@suse.comalarrosa@suse.comalarrosa@suse.comfcrozat@suse.comalarrosa@suse.comfcrozat@suse.comfcrozat@suse.comalarrosa@suse.comalarrosa@suse.comfcrozat@suse.comadam@mizerski.plalarrosa@suse.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.comismail@i10z.comismail@i10z.comalarrosa@suse.comyfjiang@suse.comalarrosa@suse.commichael@stroeder.commichael@stroeder.comalarrosa@suse.commcepl@suse.comalarrosa@suse.comalarrosa@suse.comfcrozat@suse.comobs@haasn.xyzalarrosa@suse.comalarrosa@suse.comdimstar@opensuse.orgalarrosa@suse.comdleuenberger@suse.comdev@dominik-schmidt.dedimstar@opensuse.orgbjorn.lie@gmail.comalarrosa@suse.comfcrozat@suse.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.combjorn.lie@gmail.combjorn.lie@gmail.combjorn.lie@gmail.comalarrosa@suse.comalarrosa@suse.comalarrosa@suse.combjorn.lie@gmail.comfvogt@suse.comkamikazow@opensuse.orgfabian@ritter-vogt.debjorn.lie@gmail.combjorn.lie@gmail.combjorn.lie@gmail.comalarrosa@suse.comluc14n0@linuxmail.org- Make sure the pipewire-libjack package doesn't completely replace the original jack libraries unless the pipewire-jack package which installs the ld.so.conf.d file is installed too (boo#1222253). - Move modules jack-tunnel and jackdbus-detect to the pipewire-spa-plugins-0_2-jack since those modules should only be used when the real jack server is running. This fixes pipewire starting jackdbus on start.- Update to version 1.0.5+git36.60deeb2 to fix several crashes, NULL checks, format strings and other issues: * spa: libcamera: fix RGB mappings * pw-dump: destroy all objects not just those matching the pattern * pw-dump: fix string memory leak on error * json: fix high surrogate escapes * core: handle import errors better * gst/src: fix crash when current_caps is NULL * gst/src: Avoid unnecessary renegotiations during streaming * gst/src: Cleanups for src_negotiate() * pw-mon: fix type confusion in core event handler * gst: fix stream params memory leak * gst: handle some more errors * treewide: fix errno assignments * alsa-pcm: don't force quantum for iec958 formats * journal: prepend code location to messages at debug log levels * module-rt: fix compiler warning * filter-chain: fix arguments of calloc * combine-stream tag forward * Add album to tag metadata * impl-node: avoid bitfield races * treewide: fix some format string issues * conf: warn when match actions are missing * module-protocol-simple: handle 'node.name' property * module-ffado: only start after ports are configured * context: fill basic properties early * combine-stream: fix latency-compensate with resample.disabled=true * profiler: remove unused data-loop * v4l2: fix printf format * spa: v4l2: encode device id into a json array * spa: libcamera: encode device ids into a json array * impl-port: avoid doing work when the port is destroyed * impl-port: use 0 size when clearing IO * stream: log a warning when media.class and direction mismatch * module-loopback: only enable delay with valid rate and channels * alsa: fix race when updating the eventfd * audioconvert: also clamp monitor volume to min/max * combine-stream: actually make use of resample.disable- Update to version 1.0.5: * Highlights - pw_stream can now report timestamps on buffers and the expected amount of samples for the resampler. - The GStreamer element now has more correct timestamps using the new pw_stream timestamps as a fallback. - The FFADO module now handles suspend and resume better. - A regression in v4l2 was fixed when parsing malformed filters. - A potential memory/fd leak was fixed in client-node. - Many more small bugfixes and improvements. * PipeWire - pw_stream now reports the expected resampler input or output size in the pw_time structure. (#3750) - pw_stream now also adds a time field to the buffer, which contains the time of the graph when the buffer was received in the stream. - Fix a compiler error when compiling with -Werror=shadow. (#3915) - The config parser will warn when invalid config is detected. * Modules - The FFADO module now opens and closes when suspending. This fixes some problems when FFADO properties are changed while suspended. (#3558) - Filter-chain will now warn when invalid config is detected. - Echo-cancel will now handle manage the state of the echo-cancel plugin better, making sure run() is not called after deactivate(). - Fix some potential memory/fd leaks in client-node. * SPA - Improve reading the bound ALSA controls. - The resampler can now also report the number of expected output samples. - The ALSA ACP device objects have some more properties like the card.id and alsa.components. (#3912) - Fix a potential string corruption when parsing JSON strings. - V4l2 now sets the latency on the port. (#3910) - alsa-udev now has an option to expose the device even if busy. (#3914) - Improve null-audio-sink channel handling. (#3931) - v4l2 will now drop the first frame because it often contains wrong timestamps or garbage. (#3910) - A regression in v4l2 was fixed where invalid/empty properties in the filter would make it error early. (#3959) * GStreamer - The source now falls back to the new pw_buffer time for the timestamps. * Docs - Sync with the master branch.- Move the jack spa plugin from the pipewire-spa-plugins-0_2 package to a new pipewire-spa-plugins-0_2-jack package. This allows to not Suggest the pipewire-libjack package from pipewire-spa-plugins-0_2 since that's only used to connect pipewire as a client to a jack server which is not common at all (boo#1222253).- Avoid %if %{pkg_vcmp gcc < 8}, instead replicate the condition from the BuildRequires section.- Update to version 1.0.4: * Highlights - Track memfd better to avoid inconsistent memory. Also make sure the mixer info is removed correctly in all cases on destroyed ports. - Correctly handle removed objects in the metadata. - Add an option to set the server and client priorities instead of using a hardcoded value of 88. - The FFADO module has been fixed. Audio and MIDI now works with the same latency as the JACK driver. This has now also been tested with a Focusrite Saffire Pro 14. - The JACK library has seen some important fixes. Some ardour crackling has been fixed when looping and multiple MIDI ports on a client should now work. - Small bugfixes and improvements. * PipeWire - Track memfd better to avoid inconsistent memory. Also make sure the mixer info is removed correctly in all cases on destroyed ports. - Fix Props param emission again in pw_stream. (#3833) - Add MAPPABLE flag to buffer data to indicate that the fd can be mmapped directly. Use this on DMABUF from v4l2. (#3840) - Correctly handle removed object in the metadata. - FreeBSD build and compatibility fixes. - Add an option to set the server and client priorities instead of using a hardcoded value of 88. - Read config overrides in the right order. - Fix PIPEWIRE_QUANTUM rate handling in pw_stream and pw_filter. - Fix pw_context_parse_conf_section(), actually use the conf argument. - A new pw_stream_get_nsec() and pw_filter_get_nsec() function was added to get the current time of the stream/filter without having to assume a particular clock. - A new default.clock.quantum-floor property was added to configure the absolute lowest buffer-size. (#3908) * docs - Many doc updates. * tools - Make sure we always quit pw-cli when the server stops.(#3837) - pw-top now prints all drivers in batch mode. (#3899) * modules - Don't destroy the client in protocol-simple on EAGAIN. - Handle IPv6 better in the RTP modules. Fix IPv6 SAP header parsing. (#3851) - The FFADO module has been fixed. Audio and MIDI now works with the same latency as the JACK driver. This has now also been tested with a Focusrite Saffire Pro 14. (#3558) * pulse-server - Make sure the peer_name is filled to avoid protocol errors. * SPA - Small resampler tweaks to improve stability of adaptive resampler. - Add ALSA option to control htimestamp autodisable. - Avoid some potential crashes in audioconvert when ports are removed. - Improve HDMI jack detection on some SOCs. - The audioconvert now has a monitor.passthrough option to pass the latency information on the monitor ports. (#3888) * GStreamer - Don't use timeouts when autoconnect=false in pipewiresrc. (#3884) - pipewiresrc and pipewiresink can now be automatically selected as audio source and sink. - An invalid memory access was fixed when destroying the device provider. * JACK - Remove properties correctly with the object id, not serial. - Improve sync with the data thread by pausing the core. Also improve handling of port io to avoid invalid buffer access. - Fix PIPEWIRE_QUANTUM rate handling. - Support multiple MIDI input ports per client. (#3901) - The output buffer size is now always correctly set. (#3892) * ALSA - Handle errors from eventfd_create correctly.- Update to version 1.0.3+git51.89d8e8b: * module-ffado: make the event buffer per port * module-ffado: handle MIDI correctly * module-ffado: implement MIDI send and receive * module-ffado: various fixes to make things work * stream: add pw_stream_get_nsec() to get current time * jack: fix multiple midi input ports * pw-top: only check terminal size in non-batch mode * Specify "Audio" in gstreamer sink/src metadata to fix autodetect * Add SOC-style jack names to HDMI audio paths * gst: remove timeouts when autoconnect=false * audioconvert: handle invalid ports better * audioconvert: handle port remove * pw_context_parse_conf_section: use the conf argument instead of the context's conf * stream: FORCE_RATE should just contain the rate * jack: FORCE_RATE should just contain the rate * jack: set global_mix safely * jack: sync threads by pausing the core * alsa: Added handle for controlling htimestamp autodisable * And more - Remove patch already merged upstream: * fix-gst-sink.patch- Require pipewire-pulseaudio from pipewire-alsa so when pipewire-alsa is installed, pipewire has audio support (or put in other words, so pipewire-alsa isn't installed with the real pulseaudio). Fixes boo#1221235.- Add patch from upstream submitted at glfo#pipewire/pipewire#1932 that fixes selecting the pipewire gstreamer plugins by the autoaudiosink/autoaudiosrc plugins: * fix-gst-sink.patch- Use %patch -P N instead of deprecated %patchN.- Force using doxygen-1_10 in SLE where the default doxygen is too old and generates broken docs (boo#1217886)- Add a conflict in -pulseaudio with pipewire-modules-%{apiver} < 1.0.0 since the libpipewire-module-protocol-pulse.so module was included in - modules before 1.0.0 so we should avoid a file conflict.- Update to version 1.0.3: * Highlights - Fix ALSA version check. This should allow the alsa plugin to work again. - Some small fixes and improvements. * PipeWire - Escape @DEFAULT_SINK@ in the conf files. * Modules - Improve logging in module-pipe-tunnel. * SPA - Always recheck rate matching in ALSA when moving drivers. This fixes a potential issue where the adaptive resampler would not be activated in some cases. * ALSA - Fix ALSA version check. This should allow the alsa plugin to work again.- Update to version 1.0.2: * Highlights - Fix v4l2 enumeration with filter. This should fix negotiation in some GStreamer pipelines with capsfilter. Also probe for EXPBUF support before using it. - Fix max-latency property and Buffer param when dealing with small ALSA device buffers. This should fix stuttering with some AMD based soundcards. - More small cleanups an improvements. * Modules - Improve netjack2 channel positions. - Improve RAOP module state after suspend/resume. (#3778) - Avoid crash in some LV2 plugins by configuring the Atom ports. (#3815) * SPA - Bump libcamera requirements to 0.2.0. - Try to avoid unaligned load exceptions. (#3790) - Fix v4l2 enumeration with filter. (#1793) - Fix max-latency property and Buffer param when dealing with small ALSA device buffers. This should fix stuttering with some AMD based soundcards. (#3744,#3622) - Add a resync.ms option to node.driver to make it possible to resync fast to clock jumps. - Probe for EXPBUF support in v4l2 before using it. (#3821) * pulse-server - Also emit change events when the port list change. * Bluetooth - Log a more verbose explanation when other soundservers seem to be interfering with bluetooth. - Add quirks for Rockbox Brick. (#3786) - Add quirks for SoundCore mini2. (#2927) * JACK - Improve check for the running state of clients. (#3794) - Drop patches already included by upstream: * 0001-spa-libcamera-use-CameraConfigurationorientation.patch * 0002-spa-libcamera-bump-minimum-supported-version-to-0.2.0.patch- Add patches from upstream to fix building the package in Factory with libcamera 0.2.0: * 0001-spa-libcamera-use-CameraConfigurationorientation.patch * 0002-spa-libcamera-bump-minimum-supported-version-to-0.2.0.patch- Update to version 1.0.1: * Highlights - Work around the buggy ALSA backend in libcanberra by forcing the pulse backend in module-x11-bell. - Fix a race in the device info updates in pulse-server. - Fix timing and rate matching in ALSA sequencer. - Improve timing information in JACK and from the ALSA driver. - More small fixes and improvements. * PipeWire - Fix a build issue when examples where disabled. - Avoid some compiler warnings. - Avoid some bitfield data races. (#3706) * Modules - Bump the PTP driver priority. (#3217) - Support the previous "allowed" permission in the access module. - Fix filename leak in module-filter-chain. - Work around the buggy ALSA backend in libcanberra by forcing the pulse backend in module-x11-bell. (#3688) - Fix a race in the device info updates in pulse-server. - Fix compatibility in RAOP. (#3698) * SPA - Handle ALSA picth control errors correctly - Clamp buffer-frames correctly. (#3000) - Fix timing and rate matching in ALSA sequencer. (#3657) - Revert a commit that could result in current time in the future in the timing updates. - Improve adapter state checks. - Remove the timer from the ALSA pcm. - Fix timeout in freewheel driver. * Pulse-server - Also handle active ports for monitor sources. - Fix zeroconf-publish format properties. * JACK - Improve timing and transport calculations. - Handle -ENOENT from the core and don't error out. * GStreamer - Handle node port removal in the device provider. (#3708) - Improve error handling while connecting. - Fix dts_offset.- Update to version 1.0.0 (El Presidente): * Highlights - Fix a memfd/dmabuf leak when uploading buffers while shutting down. - Handle concurrent jack_port_get_buffer() calls because ardour seems to be doing this. - Improve time reporting (less jitter) in ALSA when using IRQ. - Many doc improvements. * PipeWire - Respect PIPEWIRE_DLCLOSE everywhere, remove pw_in_valgrind(). - Remove a warning when a client tries to change ignored properties. * Modules - Fix a memfd/dmabuf leak when uploading buffers while shutting down. - Fix a potential segfault when copying mix structures. (#3658) - Avoid races in setrlimit in module-rt. - Fix a memory leak in filter-chain. - Set rtp.ptime on senders, not receivers. - The ROC modules were ported to ROC 0.3 * SPA - Improve time reporting (less jitter) in ALSA when using IRQ. (#3657) - Add latency param query in libcamera. - Fix some compiler warnings. - The EVL plugin was updated. * Bluetooth - LC3 codec and compatibility improvements. * Pulse server - Fix emission of events when a sink/source state changes. (#3660) * JACK - Improve transport and time handling. Use unique ids to make consistent snapshots of the current time and transport. - Avoid enumerating port params that we are not going to use. - Optimize buffer reuse. - Handle concurrent jack_port_get_buffer() calls because ardour seems to be doing this. (#3632) * Docs - Many doc improvements. - Add man pages for pw-dump, pw-loopback, modules, pipewire-pulse. - Manpages are now made with Doxygen. - Add docs for pulse-modules- Update to version 0.3.85 (1.0RC5): * Highlights - Fix an issue where a link could end up paused while not negotiated. - Fix an infinite recursion issue when finding runnable nodes. - Support XDG base directories when loading ACP config. - Fix MIDI event recording preview in Ardour. - Many more small fixes, cleanups and improvements. * PipeWire - Fix an issue where a link could end up paused while not negotiated. (#3619) - Fix an infinite recursion issue when finding runnable nodes by stopping the scan on feedback links around the driver. (#3621) - The system service now has better socket permissions. * Modules - Add support for uclamp. This allows the scheduler to make better informed decisions about where tasks should be placed, and what pstate to set for the CPU it is running on. - Emit warnings when applications are not doing the right locking instead of crashing. - Improve media.name for RAOP sinks. (#3801) - Support pause/resume in pipe-tunnel. (#3197) - Remove time rlimit when probing for realtime to avoid SIGXCPU. * SPA - Fix a bug where the resampler would be activated even when there is an ALSA pitch element. (#3628) - Improve resume from suspend in ALSA. (#3646) - Add option to expose ALSA controls as prop params. - Support XDG base directories when loading ACP config. This makes it possible to override the ACP config files. * Bluetooth - Schedule nodes in the same ISO group together. - More BAP fixes and cleanups. * JACK - Fix MIDI events from peer ports. This makes the MIDI event recording preview of Ardour work correctly. * GStreamer - Fix some error handling in the source and sink. * ALSA plugin - Improve poll descriptor handling. (#3648) * Docs - Many improvements to the layout and organization.- Update to version 0.3.84 (1.0RC4): * Highlights - Fix a regression with openal because the queued buffers in the stream were not reported correctly. - Fix a bug in port busy counters that could cause random silent links. - Fix a regression in echo-cancel because it was not reporting its streams as ASYNC. - Fix a JACK regression where not all ports were enumerated in all cases. - Many more fixes and improvements. * PipeWire - pw_stream now reports the queued buffers more accurately. This fixes a regression when using openal. (#3592) - The port busy counters were not updated correctly in some cases. This could lead to negotiation errors and silent links. (#3547) - Ignore latency maximum when forcing rate/quantum. (#3613) - Nodes can now be added to multiple groups and link-groups. (#3612) * Modules - The filter-chain now also handles notify port dependencies correctly. (#3596) - Filter-chain has support for new linear, clamp, recip, exp, log, mult, sine builtin plugins. - The echo-cancel module now correctly reports its playback and capture streams as ASYNC to avoid running out of buffers. (#3593) - It is now possible to specify an array of remote names to connect to with the native protocol. - module-rtp-sap and module-rtp-sink now try to bind to the specified interface. * SPA - The alsa plugin now removes the runtime properties such as period-num, period-size and max-latency when suspended. (#3613) * Bluetooth - BAP Locations/Context is now set on endpoints as required by new bluez. - Improve selection of BAP leader. * JACK - Add a jack_set_sample_rate() extension function. - Make sure we get the info of all nodes/ports before completing the jack_client_open() operation so that we can enumerate the ports correctly in all cases. (#3618) * GStreamer - Fix types of metadata in pipewiresink. - Also copy metadata in buffers in all cases. - Fix size allocation in bufferpool for compressed formats. - Don't stop streaming thread when unlinked. (#3620) * ALSA - The ALSA plugin now handles NULL values from mmap_areas. (#3600)- Disable the WebRTC-based echo canceller in big endian architectures since webrtc-audio-processing is not available there.- Update to version 0.3.83: * Highlights - A quantum change regression was fixed. - Use a 2 socket server now for the manager and the applications with (when wireplumber is updated) different permissions. - Reduce memory usage a little in audioconvert and use fewer buffers. - Some JACK deadlocks were fixed. - More bugfixes and improvements. * PipeWire - Fix quantum change regression. - Use a 2 socket server by default. One for the session-manager and one for applications. - Fix a potential use-after-free in node and device cleanup. * modules - Some hardcoded buffer size limits were removed. - Fix ASYNC flag on combined-streams. - Add support for on-demand combined-streams using metadata. * SPA - alsa-udev will now ignore PCMs with the ACP_IGNORE udev environment variable. - The audioadapter now uses at least 2 buffers when the follower is async. - The number of buffers used by plugins was tweaked a little. Most plugins now only ask 1 buffer. - Memory usage in audioconvert was reduced. - Fix some unaligned reads and writes and undefined left shifts reported by ASAN. - Rework vulkan dependency checking. - Don't try to link ALSA devices when prepare fails. This fixes some crashes. - Fix a stall when the allowed codecs are changed in ALSA. - Improve ALSA rate control for sources to avoid xruns. - Try to fix IEC958 TrueHD and DTS playback. * Bluetooth - Improve fallback SCO mtu when the kernel doesn't tell us. * JACK - The fixed buffer size limit was removed. - Add an option to make input buffers writable (default true). - A potential deadlock was fixed when applications lock the process function. - Use a separate thread to dispatch notifications to avoid deadlocks. - Potentially fix silent export in ardour in some cases.- Update to version 0.3.82: * Highlights - Fix a regression in some devices when the Pro-Audio profile was selected. Only enable the IRQ based scheduling and device linking in specific safe cases. - Improve rate switching. In some cases the graph rate would not switch correctly. - Fix regression in alsa wakeups that would cause silence in VMs. - Fix a leak in the SBC codecs for SCO. - More improvements to the RAOP module. - Other small improvements and fixes. * PipeWire - Improve client property checks. - Allow non-power-of-2 quantums when forced. - Improve rate switching. In some cases the graph rate would not switch correctly. - The PIPEWIRE_QUANTUM env variable now forces the size and rate in the graph for the duration of the application. The softer PIPEWIRE_LATENCY and PIPEWIRE_RATE can still be used to merely suggest a maximum latency and a rate. * modules - Remove the RTSP FLUSH request in RAOP because it does not seem necessary. - The RAOP module now uses the common RTP stream functions. - Add sockets option to protocol-native to make pipewire listen on multiple sockets. * SPA - Clean up some of the log functions. - Add an option in ALSA to disable linking devices together. - Only link pcms together when 1 capture and 1 playback pcm. For more complex devices we can't be sure which ones can be linked. - Disable tsched only when using linked devices. - Add some extra checks in ALSA to avoid segfaults. - Add Tag support to alsa-sink and alsa-source. - Use dynamic pod builder when we can. - Set priority.driver on midi-bridge to allow it as a fallback driver. - Fix regression in alsa wakeups. - The PTP clock can now be found from the interface in node-driver. * pulse-server - Some small cleanups and internal improvements. - Add some memory debugging messages. - Add Tag messages to streams. * Bluetooth - Fix a leak in the SBC codecs for SCO. * JACK - Patch up midi events in the destination buffer instead of writing to the source buffer. - Group all jack clients together to avoid transport issues. * ALSA-plugins - Add also.deny option to block alsa clients from opening the PCM. - Drop patches already included upstream: * 0001-alsa-add-api.alsa.auto-link-option.patch * 0002-acp-fix-compilation.patch * 0003-acp-only-join-and-link-when-1-capture-and-1-playback.patch * 0004-acp-only-disable-tsched-when-linking.patch * 0001-alsa-dont-check-early-wakeup-when-PCM-stopped.patch- Add patches from upstream that fix pro-audio not producing any sound in 0.3.81: * 0001-alsa-add-api.alsa.auto-link-option.patch * 0002-acp-fix-compilation.patch * 0003-acp-only-join-and-link-when-1-capture-and-1-playback.patch * 0004-acp-only-disable-tsched-when-linking.patch - Add patch from upstream that fixes issues when PCM is stopped, which includes fixing sound in qemu: * 0001-alsa-dont-check-early-wakeup-when-PCM-stopped.patch- Pipewire now requires vulkan 1.3, so we have to disable vulkan support if this requirement is not fulfilled in order to build correctly in Leap.- Update to version 0.3.81: * Highlights - jackdbus support is now enabled by default. - IRQ based scheduling in ALSA was improved and enabled by default for Pro-Audio profile. It will also link the pcms together to get lower latency. This now matches what JACK does and gives equal latency to PipeWire for Pro-Audio profiles. - Support both old and new versions of webrtc-audio-processing to make the transition easier. - Forced quantum changes by nodes or metadata will now also force a suspend and resume of the graph, like the rate changes to make sure all nodes adapt to the new quantum. This is important for Pro-Audio nodes that need to reconfigure the hardware to a new period in IRQ-based scheduling. - Fix a regression in regex parsing. - Many bugfixes and improvements. * PipeWire - jackdbus is by default enabled now. The idea is that when jackdbus is installed, the real libjack.so is in the path and we can become a real JACK client. - Forces quantum changes by nodes or metadata will now also force a suspend and resume in the graph, like the rate changes to make sure all nodes adapt to the new quantum. This is important for Pro-Audio nodes that need to reconfigure the hardware to a new period. - The stream now has an EARLY_PROCESS option that can be used to implement custom buffer fill levels. - Fix a regression in regex parsing. - Fix a bug in position reporting in the driver node. - Destroying a link will now recalculate the graph correctly. - Fix the rate comparison for finding the best rate in the graph. - Use malloc_trim() when available to release memory. * Tools - pw-cat now supports DFF DSD files. - pw-cli avoid some NULL derefs in some cases. * Modules - The RAOP sink has seen some cleanups and improvements. It will now ask for feedback every 2 seconds to keep some devices alive. - A bug in filter-chain was fixed where it would fail to apply the gain when when mixing just one source. - The filter-chain can now pass the stream volume to a control in the filter-chain graph. - Improve volume handling in RAOP sink. * Pulse-server - Some cleanup in the pending_stream handling. - Fix a regression in the event emission code where it failed to emit a changed event when a node was linked. - Lower the realtime priority of pulseaudio clients. - Set pulse.module.id on the echo-cancel streams. * SPA - Support both old and new versions of webrtc-audio-processing to make the transition easier. - The ALSA driver now does the synch of all followers directly from the wakeup event. This results in more stable rate matching. - IRQ based scheduling in ALSA was improved and enabled by default for Pro-Audio profile. It will also link the pcms together to get lower latency. This now matches what JACK does and gives equal latency to PipeWire for Pro-Audio profiles. - GNU/Hurd support was added. - Some improvements to passthrough handling. * Bluetooth - Improvements to the codec handling when PipeWire is used as Audio Gateway. - Adapt to new Bluez API for BAP devices. * JACK - When the jack library is set in the default library path, avoid using LD_LIBRARY_PATH because this can cause confusion. - Handle clearing the latency on a port. - jack_property now always manages to actually change the metadata because it waits for a roundtrip before exiting.- Update to version 0.3.80: * Highlights - A new Tag param was added that allows arbitrary metadata to be transported out-of-band in the graph. - Vulkan DMA buf support was merged. - The echo-canceller was ported to webrtc-audio-processing-1. - Fix a regression in locating monitor sources by id in pulse-server. - Mixer io areas updates are now synchronized correctly with the data thread to avoid potential crashes. - Many more bugfixes and improvements. * PipeWire - Handle driver nodes that refuse to change the quantum or rate. - A new Tag param was added that allows arbitrary metadata to be transported out-of-band in the graph. * Modules - The pipe-tunnel source has been reworked to use a ringbuffer and rate adaption to keep the latency constant. It can now also function as a driver to reduce resampling. (#3478) * Tools - pw-cat will now place media properties in Tag params. - pw-mon can now filter props and params. * SPA - ALSA refuses to change quantum and rate when in IRQ mode. - ALSA will now be smarter in selecting the period size for batch devices and will make it depend on the samplerate. (#3444) - Vulkan DMA buf support was merged. - ALSA latency will now be reported in the time domain of the graph. - Add udev based autodetection for compress-offload devices. - The echo-canceller was ported to webrtc-audio-processing-1. - The v4l2 inotify code was rewritten to avoid a use-after-free and by using a separate watch (but same fd) for each device. (#3439) - The tag and latency handling was improved in audioadpter. - Don't use -Ofast on alpha because it can crash on denormalized values. (#3489) - The mixers now synchronize spa_io_buffers updates with the data thread to avoid crashes. - Handle NULL param updates. (#3504) * Pulse-server - Fix a regression in locating monitor sources by id. (#3476) - Add support for use_system_clock_for_timing in module-pipe-sink. - Add support for checking module arguments. - Avoid some useless change events. * Bluetooth - Ports are now marked as physical, which makes the bluetooth devices show up as hardware devices in Ardour and other JACK apps. (#3418) - Some fixes for LE audio support (#3479) * JACK - Also emit unregister notify even when suppressed when creating the client. - The notify callbacks now match JACK2 behaviour more. - The mixer io areas are updated and handled safely now to avoid crashes. (#3506) - Drop patches already included upstream: * 0001-pulse-server-allow-monitors-when-selecting-source-by-index.patch * 0001-Revert-v4l2-handle-inotify-errors.patch * 0002-Revert-v4l2-dont-set-inotify-on-_dev.patch * 0003-spa-v4l2-use-a-separate-watch-for-each-device.patch- Add patch from upstream to fix a regression introduced in 0.3.77 which made it fail to open a monitor device as source: * 0001-pulse-server-allow-monitors-when-selecting-source-by-index.patch - Add patch from upstream to fix a bug which caused 100% cpu usage under some circumstances: * 0001-Revert-v4l2-handle-inotify-errors.patch * 0002-Revert-v4l2-dont-set-inotify-on-_dev.patch * 0003-spa-v4l2-use-a-separate-watch-for-each-device.patch- Update to version 0.3.79: * Highlights - Fix a regression in suspend that could cause silence. - Fix a regression in JACK port registration that could cause all kinds of JACK problems. - Fix a typo in the neon sample conversion functions that could cause distortion. - Add BAP broadcast source and sink support. - pw-top now has a batch mode to dump the output to stdout. - Many more bugfixes and improvements. * PipeWire - Fix a regression in shutdown where a node might not first suspend properly. This cause loss of sound in some cases. - Failure to compile a regular expression in the config file will now be reported and ! can be used to negate the match. - Fix a regression where some nodes might not set running in some cases. - Nodes are now suspended before the format is cleared, which might fix some crashes. * Tools - pw-top now has a batch mode to dump the output to stdout. * SPA - The queued samples in audioconvert are now correctly reported in the delay. - Make it easier to add a custom profile in ACP. - Fix a typo in the neon sample conversion functions that could cause distortion. - device.profile.pro=true is added for pro audio nodes. - An xrun counter was added to spa_io_clock to detect and track skipped data because of xruns. * Pulse-server - Add alsa-sink and alsa-source modules. * Bluetooth - Fix a regression where only the BAP off profile is shown. - Add BAP broadcast source and sink support. * JACK - Also emit a latency notify when the buffer size changes. - Fix a regression in JACK port registration. - jack_port_tie() is now supported. * ALSA - Improve property handling, support lists and ranges in addition to fixed values. - Remove patches already included upstream: * 0001-jack-make-sure-we-can-always-find-our-own-ports.patch * 0001-audioconvert-fix-typo-in-neon-function.patch * 0001-impl-node-improve-suspend.patch * 0001-bluez5-fix-BAP-profiles-showing.patch- Update to version 0.3.78: * Highlights - An old regression was fixed with where some nodes would not run. - A regression was fixed where removed events would not be shown in some cases. This would result in duplicate entries in audio clients. - Fix an off-by-one in the vban audio receiver. Tweak the rate adaption a little. - ACP will now set a UCM verb before probing the pro-audio devices. - More bugfixes and improvements. * PipeWire - An old regression was fixed with where some nodes would not run. (#3405) - Suspend was improved a little to avoid races when the session manager would suspend right when a driver was starting. * Modules - module-rtp-sap does not use the deprecated inet_aton anymore. - Fix an off-by-one in the vban audio receiver. Tweak the rate adaption a little. (#3380) * SPA - ACP will now set a UCM verb before probing the pro-audio devices. (#3407) - The mandatory flag will be set now on the video modifiers. - EVL was updated to Xenomai4 r46 and xbuf creation was improved. - An option was added to force colors in the log even when logging to !tty. - The return type of spa_pod_builder_control() was fixed. - inotify errors are handled better now. (#3439) * pulse-server - A regression was fixed where removed events would not be shown in some cases. (#3414) * Bluetooth - Improve compatibility with more devices, avoid reusing the same transport for different media-sink instances to avoid encoder resets. - Improve enumeration of codec profiles for BAP and A2DP. * JACK - Ensure we can't iterate ports from a deactivated client. Also make sure the JACK clients with the node.always-process=false always show their ports. (#3416) * GStreamer - A potential crash was fixed in the device provider when stopping. - Remove patches already included upstream: * 0001-context-Dont-stop-setting-runnable-when-meeting-the-driving.patch * 0001-gst-Prevent-a-crash-when-stopping-device-provider.patch * 0001-jack-ports-become-visible-when-the-registration-is-queued.patch * 0002-jack-handle-node.always-process-=-false-jack-nodes.patch * 0001-pulse-server-set-all-change_mask-flags-when-removing.patch - Add patch from upstream to fix jack clients: * 0001-jack-make-sure-we-can-always-find-our-own-ports.patch - Add patch from upstream to fix typo in neon function that makes pipewire produce noise: * 0001-audioconvert-fix-typo-in-neon-function.patch - Add patch from upstream to fix (among others) a race when a node is suspended at the same time it is started causing silence: * 0001-impl-node-improve-suspend.patch - Add patch from upstream to fix BAP only showing off profile: * 0001-bluez5-fix-BAP-profiles-showing.patch- Fix from upstream to ensure effect and sink nodes are set to running: * 0001-context-Dont-stop-setting-runnable-when-meeting-the-driving.patch - Fix from upstream to prevent a crash when stopping a device provider: * 0001-gst-Prevent-a-crash-when-stopping-device-provider.patch - Fix from upstream to fix a regression that makes plugins/effects disappear in Carla Patchbay when there's no playback: * 0001-jack-ports-become-visible-when-the-registration-is-queued.patch * 0002-jack-handle-node.always-process-=-false-jack-nodes.patch - Fix from upstream to fix pavucontrol and plasma-pa showing duplicated sinks after resume or switching audio device profiles (boo#1214374): * 0001-pulse-server-set-all-change_mask-flags-when-removing.patch- Update to version 0.3.77: * Highlights - Fix a bug in ALSA source where the available number of samples was miscaluclated and resulted in xruns in some cases. - A new L permission was added to make it possible to force a link between nodes even when the nodes can't see eachother. - The VBAN module now supports midi send and receive as well. - Many cleanups and small fixes. * PipeWire - Global objects now only show permissions that apply to them. The permissions required to perform various API calls are documented. - A new L permission was added to make it possible to force a link between nodes even when the nodes can't see eachother. - Config files need to end with .conf. - The client.api is added the to global properties of a node. * modules - The VBAN module now supports midi send and receive as well. - Fix module-profiler alignment and make sure we don't overrun our buffers with many nodes. - Protect libcanberra calls with a mutex because it is not thread safe. * SPA - Support older compilers for spa_clear_ptr(). - Fix a bug in ALSA source where the available number of samples was miscaluclated and resulted in xruns. - Don't set inotify on /dev but on the videoX devices directly. Setting inotify on /dev would cause a lot of spurious wakeups and lock contention in the fsnotify subsystem on some benchmarks. - Audioconvert now rate limits the warnings when it runs out of buffers. * pulse-server - Some bugs and inconsistencies were fixed in device lookup. - Improve subscribe event emission, detect changes to the sink or the monitor and send the right sink/source event. * JACK - The libjack.so now has a minor version of 3 and a micro version of the pipewire version. - JACK clients will now see portregistration from other jack clients when they activate/deactivate like real JACK. * bluetooth - Use some more autoptr cleanups, fix some leaks.- Update to version 0.3.76: * Highlights - Fix a regression that would cause the MPV pipewire backend to fail because of a spurious thread-loop signal. - Fix a crash when DBus is not found. - ALSA hires timestamps are now disabled by default. - Some more fixes and improvements. * PipeWire - A new option was added to pw-thread-loop to signal when the thread starts. - This is only used in module-rt to avoid regressions in mpv. (#3374) - Fix a compilation problem. - Stream flags now only set the properties when not already set. This fixes a regression with node autoconnect. (#3382) * Tools - pw-cat will now stop when the stream is disconnected. (#2731) - Improve the pw-cat man page, mention that stdin/stdout handling is only on raw data. * modules - module-rt will now not crash when dbus is not available but error out as before. - A new VBAN (vb-audio.com) sender and receiver was added. (#3380) * SPA - Add an option in audioconvert to disable volume updates. (#3361) - ALSA hires timestamps are disabled by default because many drivers seem to give wrong timestamps and cause extra delay. * bluetooth - LE Audio support is now enabled by default when liblc3 is available now that bluez has support for detecting the hardware features.- Add code in the spec file to modify the patch file reduce-meson-dependency.patch (used to build in SLE/Leap) so that we don't need to rebase it manually for every version update. - Use gcc 11 in SLE/Leap since gcc 9 fails to build 0.3.75 with ../spa/include/spa/utils/cleanup.h:52:13: error: dereferencing pointer to incomplete type ‘DIR’ {aka ‘struct __dirstream’} 52 | __typeof__(*(ptr)) *_old_value = spa_steal_ptr(ptr); \- Update to version 0.3.75: * Highlights - Link permissions between nodes are now enforced. This avoids potential portal managed screencast nodes to link to the camera even though it was not assigned permissions to do so by the session manager (boo#1213682). - Libcamera and v4l2 devices now have properties so that duplicates can be filtered out by the session manager. - A bug with draining was fixed where a buffer would be marked EMPTY and would not play when it contained drained samples. - Many fixes and improvements. * PipeWire - Permissions for links between nodes are now enforced. The link will now check that the owner clients of the nodes can see each other before allowing the link. This avoids screensharing clients to accidentally being linked to the camera nodes by the session manager. A side effect is that patchbay tools will no longer be able to link portal managed screencast nodes to the camera, for this we need a new permission for those patchbay clients. - The stream.rules/filter.rules are now evaluated when connecting the stream/filter so that more properties can be matched. - Move some internal events from the context to the nodes to better handle per-node threads in the future. - The thread-loop will now signal when the thread is started. * modules - A timestamp workaround in module-raop was reverted because it does not work in all cases. Instead latency was increased to 1.5 seconds, which also makes the problematic device in question work. - The profiler module was reworked a bit to use the new node realtime events. It should now also handle dynamically added and removed drivers. - The module-rt now does the rtkit calls from a separate thread so that it does not block the main thread. This could cause deadlocks during startup in some cases. * SPA - Atomic operation macros were move from internal pipewire API to public API. - The video-info structure now has a new SPA_VIDEO_FLAG_MODIFIER_FIXATION_REQUIRED flag to instruct the application to fixate the modifiers. This simplifies some logic in applications a lot. - The libcamera and v4l2 nodes now have properties to enumerate the device id they are using. This can be used to match v4l2 devices and libcamera devices and filter out duplicates. - A bug with draining was fixed where a buffer would be marked EMPTY and would not- Update to version 0.3.74: * Highlights - Fix a critical bug where audio to bluetooth devices would cut out randomly. - Improve RAOP compatibility. - Avoid crashes after an update. - Small fixes and improvements. * PipeWire - Mix info on port is now created explicitly. - Remove the node as a driver peer when stopping. This caused some problem with playback on and other remote bluetooth devices. - Work on avoiding crashes when loading new modules that use internal API with old libpipewire. This is typical after an update where the old library is still loaded by an application but when a new stream is created, updated modules are loaded. * Modules - The RTP source module now has an option to ignore the SSRC, which is useful to continue to receive the stream when the sender is restarted. - The native protocol will refuse to load twice now instead of silently ignoring the error. - module-raop is compatible with more devices. * SPA - plugins will now warn when running out of buffers. This is always a bad thing. - Merge scope based cleanup macros. - Add ratelimit function.- Update to version 0.3.73: * Highlights - Fixes an ALSA resume after suspend error. - Handle and disable seemingly wrong hires timestamps from ALSA. - Filter-chain now has loadable plugin modules. The LV2 and sofa plugins are moved to a separate .so file to make things more modular. - Rate changes in the graph should now be handled more gracefully by loopback and filter-chain. - A regression in the rtp-sap module was fixed where it would in some cases fail to start. - A potential crash in the peaks resampler was fixed. - Many cleanups and other small bug fixes. * PipeWire - Fix a potential segfault when no fallback driver was set in the config. - Improve OPUS detection. - Add ASYNC flag to pw-filter and pw-stream when queue/dequeue is not called from the process function. This ensure we allocate an extra buffer. - Discard pending process callbacks when disconnecting. - Cleanups and improvements to the debug environment variable parsing. - The graph rate was tweaked to better handle very low rates   such as those requested by pavucontrol when it does the signal monitoring. * Modules - An example filter module was added. - Filter-chain and loopback now disable the resamplers if no rate is specified and will always follow the graph rate. - Improve setup of filter-chain. The graph is now created when starting because this ensure the target graph rate is known. - Filter-chain can now link notify ports to control ports in the graph. - Filter-chain now has loadable plugin modules. The LV2 and sofa plugins are moved to a separate .so file. - A regression in the rtp-sap module was fixed where it would in some cases fail to start. - Module-rt now has options to disable rlimits, portal and rtkit. - module-raop-discover now has an options to set the latency. * Tools - pw-cat now supports overriding all stream properties. * SPA - Disable rate negotiation when the resampler is disabled. We will always follow the graph rate. - Set device.icon property for UCM ports as well. - Improve ALSA recover when using hires timestamps. This fixes some problems after resume from suspend. - ALSA will now warn and disable hires timestamp when they seem wrong. They can also be disabled manually with a property. - V4l2 will now gracefully handle ENOTTY when enumerating frame sizes and frame rates. - A potential crash in the peaks resampler was fixed. * pulse-server - A client crash in pavucontrol is avoided by always setting a card name. - The graph rate is now taken correctly when using the FIX flags. - An option was added to ignore the FIX flags of a stream. Also the documentation for those options was updated. - module-raop-discover now support latency_msec. * Bluetooth - Remove an assert and issue a warning/recover instead when a buffer is too small. * GStreamer - The device provider does locking when destroying the registry.- Update to version 0.3.72: * Highlights - Fix a critical bug that would refuse to update the samplerate or buffersize in JACK clients. - A new module-netjack2-driver and module-netjack2-manager were added that are compatible with NETJACK2. This allows PipeWire to become a NETJACK2 manager or a driver between JACK2 or PipeWire servers. - Support was added for firewire devices with FFADO. This is untested for now and MIDI is not implemented yet. - The node scheduling was optimized some more. External drivers are now as efficient as in-server ones. This should improve performance of various drivers such as bluetooth and JACK based drivers. - Many, many bug fixes and a ton of improvements. * PipeWire - pw-filter can now be used to write sinks and sources. - The node activation for drivers was changed. The driver now does not need to go to the server to start the processing cycle. This makes out-of-server drivers as efficient as in-server drivers. - Don't try to use drivers with 0 priority as fallback drivers. This avoids making the screencast driver a driver for audio. - Improve xrun count reporting in pw-top and the profiler. Now each node has their own xrun counter updated when it fails to complete processing during the cycle. - pw-filter now also has support for TRIGGER. - A potential fd leak was found when fds were send to a zombie client. - Fix a bug where monitor or capture streams were logged twice in the profiler. - Remove stream hooks safely. - A bug in serialization of container properties was fixed. This could result in truncated property values. - The PIPEWIRE_AUTOCONNECT environment variable now always overrides the autoconnect settings of streams. - Node, port and link destroy now avoids some useless work. - Port will now try to renegotiate a new format when idle. * Modules - The module-sap now is more compatible with AES67. - A new FFADO driver module was added. This is completely untested because of lack of hardware. Please test and report issues. - A new NETJACK2 driver and a NETJACK2 manager module were added. These should be drop in replacements for the JACK2 parts. - The RAOP discover module now tries harder to only list devices once. - The zeroconf discover module now tries harder to only list devices once. - The RAOP sink module now handles latency better and is compatible with some more devices. - The loopback and filter-chain modules now always dequeue the last input buffer to avoid stuttering in some cases. - The SPA node factory module can now also export nodes. This is used to export the PTP clock from the AES67 config file. - A bug in module-jack-tunnel was fixed that would cause stuttering and corrupted output in some cases. - The resampler is now disabled in module-loopback and filter-chain when the samplerate is set to follow the graph rate. - The way the mixer peer is sent to clients was improved. It is now also possible to let a remote node know about mixer port removes, which can avoid memory leaks and some code simplifications. * SPA - Monitor ports now report latency correctly. - The ALSA plugin now uses htimestamp to get a more accurate ringbuffer position to estimate the clock skew. - The channelmixer now has min/max-volume settings to limit or fix the volume. - The ALSA plugin can now control the playback and capture rate of USB gadgets. This can avoid resampling and instead use the USB feedback to control the rate. - The ALSA output to multiple devices has been improved, some lockups are avoided when the device ringbuffer is full. - The compress-offload sink has improved negotiation. * pulse-server - Only try to use GSettings when the schema exists. - @DEFAULT_SOURCE@, @DEFAULT_SINK@ and @DEFAULT_MONITOR@ are now correctly handled as targets in playback and capture streams. - 2 new quirks are added to disable volume updates on sinks/sources. - The virtual-sink and virtual-source modules were added. These are really example modules but actually also work and are useful on PulseAudio so implement them as well. - Fix initial stream volumes. * Bluetooth - Only register A2DP or BAP when we have codecs. - Include codec into the media.name * JACK - Fix a critical bug that would refuse to update the samplerate or buffersize. - Improve updates of samplerate/buffersize, delay the updates until the client is activated. - Use the new mix-info updates to simplify the mixer setup and peer detection. * GStreamer - Fill default strides instead of 0 on pipewire video buffers. - Remove patch already included upstream: * 0001-jack-update-bufsize-and-samplerate-when-skipping-not.patch - Move libjack* conflicts from package pipewire-libjack-0_3 (which has coinstallable libraries) to pipewire-jack (which includes the ld.so.conf.d file).- Have pipewire-spa-plugins-0_2 suggest pipewire-libjack-%{apiver_str}: this package requires libjack.so.0, so we best use our own implementation.- Add patch from upstream to fix JACK buffersize updates: * 0001-jack-update-bufsize-and-samplerate-when-skipping-not.patch - Create a pipewire-jack package that provides jack-daemon (and conflicts with any other) and requires the pipewire-libjack library. Move the ld configuration from pipewire-libjack, so that only pipewire-jack forces PipeWire to be the default JACK.- Update to version 0.3.71: * Highlights - A new zero-latency jackdbus bridge was added. This works similar to what PulseAudio has to offer and creates a sink/source when jackdbus is started. It is however much more efficient and runs the complete PipeWire graph as a synchronous JACK client with no added latency. - Many performance improvements. Activation of remote nodes is more efficient, fewer eventfds are required on the clients, less callback overhead in performence critical paths and an optimized poll function was added. This was mainly driven by the jackdbus module to get the lowest possible overhead when running the graph. - The JACK notify callback implementation was reworked to emulate better what JACK does, improving compatibility with ardour7 and the JACK stress test. - More work on BAP devices. Device latency is now passed on to applications also for multi-device headsets, and channel allocation is handled better. - Many more improvements and bugfixes. * PipeWire - Remove the hardcoded limit on io_areas. This is used to link nodes together and exchange buffers, it was limited to 2048 but now dynamically scales based on requirements. - Rate and quantum changes are now applied correctly in more cases. (#3159) - Updates to client-node to more efficiently process the driver. - The profiler information was improved to be more accurate. It should now work better for remote drivers. - Some potential memory map errors were fixed in the protocol because in some case with large messages, some fds were closed too soon. - pw-filter now implements the pw_filter_set_active() method. - A potential out-of-buffers case was fixed in capture pw-streams where buffers were not moved to the recycle queue when the node suspended. - Nodes are now always woken up with the eventfd. Previously there were some optimiztions in the server to directly call into the node process function but that optimization is not necessary. Without this optimization it is now possible to run nodes in different threads. - pw-stream trigger is now implemented correctly in all cases. - Remote nodes now use one eventfd less because they get triggered with the node eventfd directly. - Monitor ports are now ignored in latency updates. - A potential race when reporting an error to a client was fixed. (#3192) - Fix a bug where always_process nodes would sometimes IDLE. (#3189) - Optimize peer activation. Nodes are now activated more efficiently and independent of the number of links. It also reduces the number of eventfds and memory in remote clients. - A bug in property serialization was fixed. Values with spaces would only serialize the first part of the value. * Modules - Correctly handle the echo-canceler plugin init method fallback. The samplerate was not correctly configured. This is only a regression for people that have external echo-canceler plugins. - RAOP sink now only sets the volume on the remote end when the stream is recording. (#3175) - RAOP discover now tries to deduplicate entries from the same host. - A new zero-latency jackdbus bridge was added. This works similar to what pulseaudio has to offer and creates a sink/source when jackdbus is started. It is however much more efficient and runs the complete PipeWire graph as a synchronous JACK client. - The access module uses a more secure way to check the application executable. - module-combine-stream now has configurable delay and latency for each stream. This can be used to align sinks/sources with different latencies. - A potential crash in module-pulse-tunnel was fixed when shutting down. (#3199) - Module-rt will now clamp the nice value to the min allowed value to avoid errors from rtkit. (#3186) - Fix a bug with the session counters in module-rtp-sap. Also use the right format for L24. Improve the AES67 example config. - Improve some warning and info messages in module-rt. (#3194) - module-rtp-session should now do something when started without arguments. - A potential crash in module-rtp-session was fixed. (#3217) - module-filter-chain has better error reporting when a convolver fails to load. (#3223) * SPA - Move some things around to avoid compiler warnings. (#3171) - Increase mixer ports. Reorganize some things and bump mixer input ports from 128 to 512. - Fix a potential crash when a node is scheduled before it completes the setup. - The JACK sink and source SPA plugins have seen some improvements. - Allow the peaks resampler still if we disabled resampling. - Perform more cleanup in audioadapter when in error. - An optimized non-cancellable loop implementation was added. - Callbacks were optimized with a _fast() varsion that doesn't check the version and method. When this check is performed earlier, it can be skipped in performance critical places. - Some of the callbacks and system methods are now using the fast function calls in critical paths. - A potential division by zero was fixed in the ALSA plugins. - Improve rate and quantum when starting audioconvert. - Make it possible to override node.driver in the SPA null-audio-driver. (#3220) * pulse-server - The audio info parameter parsing was refactored and improved. - Fix some races with clients exiting when playing samples. - An option was added to change or disable the dbus name registration. (#2987) * Bluetooth - Implement battery reporting using AT+XEVENT. - Disable hardware volume for 3M WorkTunes. - Implement BAP audio locations (channel positions) by using the new bluez properties. * JACK - Fix some errors reported by JACK test.cpp. (#2638) - Add jack.show-midi option to show/hide midi ports. - Add jack.max-client-ports option. JACK also has a port limit and so PipeWire needs it as well to make the tests happy. - Call the shutdown callback only when the server stopped, not when there is a random error. (#3070) - Avoid registering the same port name twice. - Call port registration callbacks in activate/deactivate. - Improve jack_port_connected(). - Improve some error reporting. - The JACK headers were updated to a newer version. - JACK callbacks are now managed with an event queue to simulate more what JACK does. This avoids emiting callbacks when a method is blocking for a reply and causing deadlocks. (#3183) - Assign unique names to JACK clients. (#2833) - Fix a potential crash when the thread_utils was used after free. - Aliases are now not filled in by default to improve JACK compatibility. (#3154) * ALSA - The ALSA plugin will now wait for negotiation to complete or an error before _prepare() completes. This makes more applications deal correctly with the potential errors. * Docs - A new document about how scheduling is implemented was added. - Update the pw-cli man page. (#2988) - Document the SPA Pod serialization. - Document the PipeWire native protocol.- Make pipewire-alsa conflict with alsa-plugins-pulse as both provide /etc/alsa/conf.d/99-*-default.conf - Replace "ffmpeg-5" with the ffmpeg_pref macro. - Drop patches already included upstream: * 0001-Revert-alsa-mixer-allow-to-re-attach-the-mixer-control.patch * 0002-alsa-fix-area-pointers.patch- Update to version 0.3.70: * Highlights: - Fix a regression in the scheduler that could keep some nodes IDLE. - Fix a regression in the biquad filters in filter-chain. - Fix a regression and potential crash in the ALSA mixer probing. - Fix a regression in pipewiresrc with timestamps that could cause cheese to record video with wrong timestamps. - Beamforming support was enabled in the echo-canceler. - pulse-tunnel and raop-sink will now proxy local volume changes to the remote end. - More bugfixes and improvements. * PipeWire - Fix a bug in the graph scheduler where some nodes might stay IDLE in some cases (like when connecting the source of the echo-canceler to the sink). - pw-metadata can now be created from the factory with initial values for the metadata. (#3076) - Conditions were added to the pipewire config file to make it possible to configure the access module and the exec sections. - Support was added in pw-stream to intercept and override properties for the adapter. This can be used to implement custom volume control, for example. * Tools - pw-metadata can now list all available metadata objects with the -l option. - A new pw-config tool was added to debug configuration file loading and parsing. * Modules - The webrtc echo canceler now supports beamforming. You can provide the coordinates of the microphones and let webrtc perform beamforming on the captured samples to improve quality and remove noise. - Fix a regression in the filter-chain with biquad filters. (#3161) and improve error reporting. - The pulse-tunnel will now proxy the volume changes to the remote end. - The RAOP sink will now send volume parameters to control the volume remotely. (#2061) * SPA - One ALSA commit was not correctly reverted and might cause crashes. - The ALSA sink and source now calculate the ALSA ringbuffer memory location more correctly wich might improve compatibility with some hardware. - v4l2 now sets the values of the controls in the Props param. * Pulse-server - The echo-canceler aec_args are now parsed like they would be under pulseaudio. * Bluetooth - More work on synchronizing BAP devices. * GStreamer - The GStreamer source can now renegotiate the format when it changes. - The GStreamer source now uses the BaseSrc clocking code to implement the clock and timing code. - Rebase patch: * reduce-meson-dependency.patch - Enable the ffmpeg plugin only in TW, since ffmpeg-5-mini doesn't seem to be available in Leap/SLE- reenable ffmpeg plugin by building against ffmpeg-5-mini- Add patch from upstream for https://bugs.archlinux.org/task/78195 * 0001-Revert-alsa-mixer-allow-to-re-attach-the-mixer-control.patch - Add patch from upstream to fix some potentially broken devices: * 0002-alsa-fix-area-pointers.patch- Only apply reduce-meson-dependency.patch when meson present during build is too old.- Add patch to build pipewire in Leap 15.4: * reduce-meson-dependency.patch- Update to version 0.3.69: * Highlights: - Reverted the UCM changes, they seem to cause regressions causing audio to be muted in some cases. - Fix a regression in the scheduler where a driver node might not be marked as runnable in some cases, like when echo-cancel is used. - Handle links from the driver to itself. This makes the midi bridge work again. - ALSA rate matching for sources was fixed. It would previously wait too long for rate matching and then cause drift. This should reduce crackling and stuttering whan capturing in low latency. - Fix the GStreamer clock to make cheese video recording work again. - More fixes and improvements. * PipeWire: - Fix a regression in the scheduler where a driver node might not be marked as runnable in some cases, like when echo-cancel is used. - Handle links from the driver to itself. This makes the midi bridge work again. - Some man pages were improved. - Fix a potential crash when thread-loop is destroyed before the loop. * Modules: - A new raw biquad filter was added to filter-chain. You can manually set the 6 parameters and you can use this to create custom filters per sample rate. - The echo-canceller now supports different channels for the capture and playback streams. * SPA: - A SB Audigy specific profile set was added to make better use of the controls. - More ALSA IRQ based scheduling improvements. - ALSA rate matching for sources was fixed. It would previously wait too long for rate matching and then cause drift. This should reduce crackling and stuttering whan capturing in low latency. - The echo-cancel plugin API has a new method to make it possible to have different channels for capture, source and playback. - Reverted the UCM changes, they seem to cause regressions causing audio to be muted in some cases. * Bluetooth: - Many more BAP fixes and improvements. Devices are now created as a set and can be combined into one device by the session manager. * GStreamer: - Fix the GStreamer clock to make cheese video recording work again. - Enable gstreamer-device-provider (rh#2183691).- Update to version 0.3.68: * Highlights: - Symbolic links to the pipewire binary are now used instead of recompiling the same binary multiple times. - Changes to the graph scheduler related to quantum/rate updates and calculation of the node states. Things should start and switch between quantums and rates more smoothly now and especially virtual devices should now only run when required. - A new RTP session module was added. This uses the Apple MIDI protocol to configure low-latency bidirectional MIDI (and with a PipeWire specific extension, also audio) between machines. OPUS encoding was added to the RTP formats. The SAP module was separated from the rtp-sink/source module to make it more usable. - A new runtime debug property was added to all streams and nodes to trigger a save of the raw samples to a wav file. Support for this has also been added to the echo-canceler to debug potential issues. - Module pulse-tunnel has improved rate matching and synchronisation support. It should also not drift anymore for capture devices. - The link-factory now ignores by default the link.passive property. This means that tools like pw-link or jack clients and wireplumber can't make passive links anymore. The reason is that there is now much more advanced logic in PipeWire itself to handle passive links based on node and port properties. - The RAOP sink was ported to new OpenSSL functions. Digest passwords are handled correctly now and support for more devices was added. - The ACP code was updated with new PulseAudio UCM code: "Create multiple profiles per verb for conflicting devices". This might change the names of devices, profiles and ports so scripts might need to be updated. - Upmixing is disabled again by default. We now ship config files that distros can install to enable upmixing again. The reason being that PipeWire should not apply fancy DSP processing to audio by default. - Many cleanups and bugfixes, including some crashes and memory corruption bugs. * PipeWire: - Don't crash when calling _connect twice in stream/filter. - Links are now installed instead of compiling the pipewire binary multiple times. - There is now a new core event bound_props that augments the bound_id event with the global properties. This can be used to get the global.serial among other global properties. It also makes it possible in the future to let the server allocate unique names or uuids. - Fix a bug where the server could go into an infinite reconfigure loop when the samplerate of a driver would change. - When a samplerate was forced, restore the previous best samplerate when the samplerate is no longer forced. - Rework how the states of the nodes in the graph are calculated. A more refined algorithm is now used that only runs nodes that need to run. - Rework how the quantum change is applied to the graph. Drivers are now responsible for using the new updated rate/quantum before starting a new cycle. This avoids starting a cycle with an old quantum first. - pw-stream and pw-filter will now ensure that the Trigger event is called from the main thread. - node.force-rate=0 will now force the node.rate on the graph, forcefully switching the hardware into the new rate if possible. - Additional checks were added to the thread-loop to check locking order. - Additional checks were added to pw-stream and pw-filter to check if methods are called from the right thread context. * modules: - A new RTP session module was added. This uses the Apple MIDI protocol to configure bidirectional MIDI (or audio) between machines. - SAP support was removed from module-rtp-source and module-rtp-sink and moved to a separate module. This makes it possible to use the RTP modules without SAP support as well. - The echo-cancel module now has support to save the signals to a wav file for debugging purposes. - The RTP modules now have support for the OPUS codec. - The RAOP module was ported to new openssl encryption functions and handles digest passwords correctly now. - module-raop-discover now has match rules to be able to select the streams and set properties. - Module pulse-tunnel has improved rate matching and synchronisation support. - Fix potential memory corruption and infinite loops because module-pulse-tunnel was unloaded from the wrong thread. - The link-factory now ignores by default the link.passive property. This means that tools like pw-link or jack clients and wireplumber can't make passive links anymore. The reason is that there is now much more advanced logic in PipeWire itself to handle passive links based on node and port properties. - module-echo-cancel will now clear its buffers after a suspend to avoid playing stray samples. - module-raop-sink will now handle 0 timing_port replies. * SPA: - The adapter module now has support for saving the raw audio   to a wav file for debugging purposes. - The ACP code was updated with new PulseAudio UCM code: "Create multiple profiles per verb for conflicting devices". This might change the names of devices, profiles and ports so scripts might need to be updated. - Upmixing was disabled again by default. We now ship config files that distros can install to enable upmixing again. - audioadapter and audioconvert have seen improvements in the experimental non-DSP/passthrough mode. - Fix a potential race where the dummy drivers could fail to stop a timer and cause endless warnings in the logs. - The ALSA plugin has experimental support for IRQ based scheduling. This should decrease latency for some (mostly USB) drivers. This should bring latency within JACK latency. - Audioconvert now has support for volume ramping. - A new loop method was added the check if a thread is currently running the loop. - channelmix.disable and resample.disable now generate an error when true and channelmixing or resampling is required in the converter. * Bluetooth: - Fix a crash in some cases when a device was disconnected. - Support async transport state changes. This avoids some lockups when the bluetooth backend is having issues. - Align BAP sinks. This improves synchronization between earpieces. * ALSA: - Improve properties in pw-top and pavucontrol. * pulse-server: - Improve error handling from pulse-tunnel. - Generate silence correctly for unsigned formats as well. - Review buffer params. The streams should now just work with 1 or 2 buffers. - module-rtp-send and module-rtp-recv now have support for the OPUS codec. * JACK: - Make sure we don't call any callbacks anymore when deactivating. * GStreamer: - Sort the device by priority in deviceprovider.- Add pkgconfig(lc3) BuildRequires, and pass bluez5-codec-lc3=enabled to meson.- Update to version 0.3.67: * Highlights: - The loopback module and other couples streams will now not randomly fail in some cases. - The RTP module now has support for sending and receiving MIDI as well. - The compress offload sink has seen many improvements. It now uses ioctls directly to bypass limitations of tinycompress (to be able to detect the available codecs, for example). - Pulse server compatibility was improved for some apps by improving the format parsing and FIX_ stream flag handling. - The min quantum in the pulse server was changed from 256/48000 to 128/48000 to fix some issues with games that expect 5ms or less of latency. - The Bluetooth plugin has seen many improvements in packet scheduling to attempt to reduce stuttering on some devices. - The ALSA plugin now handles some impossible cases better. This fixes recording in QEMU again. * PipeWire: - SPDX tags were added to the code for copyright information. - The random number functions were made more usable. - The port property code was moved from the adapter to the port implementation itself to make it more useful and unified for the cases where no adapter is used (midi and video). - Fix a potential overflow in mixer areas. - Improve runnable state calculations of nodes. This is part of ongoing work to avoid running nodes that should not need to run. - The stream will now always call the process function when using trigger, even if there are no buffers. This avoids stalls of the processing graph in some cases. - Links are now marked as passive by PipeWire itself so that the right thing happens in all cases. - Implement the in/out/true values for the node.passive property. - Place a passive state on ports to make passive links on a port by port basis. * Tools: pw-cat has seen improvements in the encoded file playback case. * Modules: - The rtp module has support for MIDI now. - DSCP is now configurable in the RTP module. - The loopback module doesn't randomly fail to work anymore. * SPA: - The null-audio sink can now be given a format and it will return this instead of the default float ones. This makes it possible to make a null-sink that has a given format. - The compress offload sink has seen many improvements. It now no longer uses tinycompress to be able to detect the available codecs. - The ALSA plugin now handles some impossible cases better. - Fix compilation on older compilers. * Pulse-server: - The FIX_ flags are now implemented more correctly by fixating the stream to the format of the sink/source they ask to be connected to. - There is now also an option to override the fixation based on rules. - Format parsing was improved and should now support all format strings supported by pulseaudio including upper and lower case variants and shortcuts. - Channelmap parsing was improved and should now reject invalid channelmaps as well as support the shortcuts supported by pulseaudio. - Escape codes in module arguments now work as it does in pulseaudio. - The min quantum was changed from 256/48000 to 128/48000 to fix some issues with games that expect 5ms or less of latency. * JACK: - jack.passive-links can now be used to have a JACK client make passive links and the node.passive property is no longer used for this because it has a different function. - The qsynth rule was updated to the new node.passive features. It is now only passive on the output side. * Bluetooth: - BAP delay and transport latency are handled now. - A2DP and SCO can now use bigger buffers to improve quality when the reception is jittery. - The AT+BCC command is now implemented. - Packet encoding now happens ahead of time when possible to avoid delays before sending it. - Source should now always produce complete (padded) buffers to avoid sync problems. - Don't set unnecessary socket options. * GStreamer: - The pipewiresrc now has an autoconnect argument. - The metadata plane count is now handled correctly in more cases. - Stream errors are now handled correctly to stop the GStreamer elements.- add a suggests on the pipewire-jack packages to avoid the jack versions getting picked for dependency resolution- Update to version 0.3.66: * Highlights - Fix a regression in the pulseaudio module-combine-stream because the new module-combine-stream was not installed. - PipeWire can now generate a limits.d config file with our recommended settings for priorities and memlock. - Modules, exec and objects can now be loaded depending on conditions. One example is the X11-bell module that can now be disabled with a custom property override. - Filter-chain has a new mysofa based spacialiser plugin. - Support was added for different clocks that allow the RTP modules to work with a PTP clock, for example. - Many bugfixes and improvements. * PipeWire - Avoid rate switches when the graph is idle. - The rate selection algorithm was improved. This ensures minimal performance and quality loss when resampling. - The default min.quantum was set to 32 again after it got erronously changed to (the too low) 16 in version 0.3.45. - Fix compilation issues with rust bindings because of macros in defines. Work around it for now. - Invalid file mappings are now refused. - Modules, exec and objects can now be loaded depending on conditions. One example is the X11-bell module that can now be disabled with a custom property override. - Filter now also supports _trigger_process() to drive the graph. - TID is now added to the journald log. - PipeWire generates and installs `/etc/security/limits.d/25-pw-rlimits.conf` that by default contains project's recommended settings. Creation of the pipewire group is left to the distro or user ( `groupadd -r pipewire` ). See the rlimits-* Meson options for controlling this behaviour. - Additionally there is now by default disabled Meson option that will install `/etc/security/limits.d/20-pw-defaults.conf` with the current Linux default memlock value. Distros with only kernels >=5.16 or always using systemd v251 or newer do not need this. But all other builds should set the `-Dpam-defaults-install=true` Meson option to ensure that the memlock value is always large enough. * modules - Install module-combine-stream. - RTP source now has support for custom channel names. - RTP source will now stop when inactive. - Filter-chain has a new mysofa based spacializer plugin. - The RTP modules can now use direct clock timestamps to send and receive packets. This makes it possible to synchronise sender and receiver with a PTP clock, for example. - Filter-chain now has an invert plugin to invert the polarity of a signal. * SPA - There is now an option to set the channels used for probing Pro Audio devices. This could unlock more samplerates for some devices when they are probed with fewer channels. - Support was added for other clocks than the MONOTONIC clock in the driver nodes. This can be used to synchronise the graph to a PTP clock, for example. - The ALSA source has some more headroom when rate matching to avoid stuttering when following another driver. - libcamera controls are now mapped to standard PipeWire property values. - The channelmixer has seen some improvements. MONO and undefined channel layouts are now upmixed and downmixed more correctly. * Bluetooth - Many BAP support fixes. * GStreamer - The gstreamer elements now support buffer video metadata so that strides are correctly handled. - pipewiresrc will now error out correctly in more cases. * JACK - The frame to/from time functions are improved to also work with negative time and frame offsets. - Drop patches already included upstream: * 0001-modules-also-install-module-combine-stream.patch- Update to version 0.3.65: * Highlights - Add back the deprecated symbols but make sure a deprecated warning is emitted for them. This fixes compilation issues in bindings. - Fix an error in the AVX code that could cause crackling in filter-chain when using the mixer. - The convolver in filter-chain can now select an IR from a list of IRs that best matches the current samplerate. Also resampling of the IR has been improved. - A new native module-combine-stream was added. You can use this to create a 5.1 device from 3 stereo soundcards, for example, or direct the output to multiple sinks at once. - Support for Bluetooth MIDI was added. This requires a wireplumber addition as well. - An ALSA plugin rule was added to tweak the buffer settings in Davinci Resolve so that it now runs with acceptable latency. - Support for compress offload was added using tinycompress. This allows compressed formats to be decoded in hardware using ALSA on some devices. - Many more buffixes and improvements. * PipeWire - Add back the deprecated symbols but make sure a deprecated warning is emitted for them. - Fix a regression when running older servers and newer clients (such as flatpaks on older server) where the server would run clients too soon, causing crashes. - Ensure that environment variables override any config values. * Tools - pw-cli has received some improvements in the output. - pw-cat can now use ffmpeg to demux streams for compress offload. * modules - The convolver IR volume is now preserved after resampling. - Adapter ports can now have a custom prefix. - module-rt now clamps the realtime priority to the user allowed one if it is within an acceptable range. Before it would fall back to RTKit immediately. - The module-echo-cancel can now have per stream channel layouts which makes it possible to link to specific audio ports on a device. - Fix an error in the AVX code that could cause crackling in filter-chain when using the mixer. - The convolver in filter-chain can now select an IR from a list of IRs that best matches the current sample-rate. - module-pipe-* now better matches the pulseaudio properties. - A new combine-stream module was added to combine multiple sinks into one sink. It is also possible to merge multiple sources into one. - module-rtp-source now has match rules to select what SAP sessions to stream from. There were also improvements to the buffering and latency handling. - module-rtp-sink now handles multicast loopback correctly. - module-rtp-sink implements min-ptime and max-ptime to control the send packet latency. * SPA - A new modifier flag was added to the video format parser helper to allow 0 (linear) as a valid modifier. - Params includes were reorganized to make it more scalable. Many compressed audio formats were added. - The alsa pcm plugin now handles invalid values from the driver gracefully. - Fix some potential stuttering cause by wrong scaling and overflow of the output buffers in audioconvert. - Debug output is now also sent to the log instead of stdout. - A debug context was added to debug macros to implement custom debug handling. This is used to redirect the debug of pods to the debug log instead of using some custom duplicated code. - Fix some warnings for potentially undefined shifts in format conversion. - Support for compress offload was added using tinycompress. This is mostly used on some embedded hardware where decoding of audio formats can be done in hardware. * Bluetooth - Some fixes for LE audio were added. - Support for Bluetooth MIDI was added. This requires a wireplumber addition as well. - Reply OK to empty commands. - Improve compatibility with some devices that send stray \n such as the Sennheiser HD 350BT. * pulse-server - Devices with unsupported formats (by the pulseaudio API) are now also listed in the pulseaudio API (with invalid formats). - The native module-combine-stream is used for module-combine-sink. * JACK - Make jack.merge-monitor default to true to better match the jack1/2 behaviour. Add an exception for mixxx, which is more usable with unmerged monitors. * ALSA - The property handling in the ALSA plugin was improved. alsa.properties and alsa.rules can now be added to the config file. - A rule was added to tweak the buffer settings in Davinci Resolve so that it can run with acceptable latency. - ALSA volume will now also use cubic volumes, like pulseaudio. - The ALSA ctl plugin now also uses the client-rt.conf file. - A new alsa.volume-method was added to configure cubic or linear volume. This can be set per application using the rules. * GStreamer - pipewiresrc will now advertise DMABUF support if the pipeline supports this. - pipewiresrc will now always be a live source unless told otherwise. - Drop reduce-meson-dependency.patch: openSUSE Leap 15.3 is no longer supported. - Add patch to install module-combine-stream: * 0001-modules-also-install-module-combine-stream.patch - Drop patches already included upstream: * 0001-cpu-arm-Fix-incorrect-free.patch * 0001-alsa-guard-against-some-invalid-values.patch * 0001-spa-Fix-audioconvert-overflow-when-scaling.patch- Add patch from upstream to avoid division by 0 and other issues with invalid values (glfo#pipewire/pipewire#2953): * 0001-alsa-guard-against-some-invalid-values.patch - Add patch from upstream to fix causing an overflow resulting in choppy sound in some cases (glfo#pipewire/pipewire#2680): * 0001-spa-Fix-audioconvert-overflow-when-scaling.patch- Add patch from upstream to fix a crash on arm: * 0001-cpu-arm-Fix-incorrect-free.patch- Update to version 0.3.64: * Highlights - Clear old buffer memory on ports to fix some SIGBUS errors. - It is now possible to assign custom port names to the ports from an adapter. This feature is helpful to those who use a multichannel interface with long-term connections. This way they can label each port with its designation, such as an instrument name or anything else to be displayed in a patchbay or DAW. - Fix some issues with node suspend and quantum and rate calculations. - Fix some regressions in pulse-tunnel and RTP-source adaptive resampling that could cause synchronization problems. - UCM devices now also have a Pro Audio profile. - NODE_TARGET (with the object.id) is now deprecated, use TARGET_OBJECT (with the object.serial, which is not reused and can avoid races). * PipeWire - Clear all peer input port buffers when suspending. This fixes some SIGBUS errors when some plugins were using old memory. (glfo#pipewire/pipewire#2914) - Fix a case where nodes that were not supposed to be suspended, were kept suspended on a rate change. (glfo#pipewire/pipewire#2929) - Fix an error in the quantum and rate calculations that could cause nodes to run with wrong quantum and rates when multiple rates were allowed. (glfo#pipewire/pipewire#2925) * Tools - pw-dump will now sort dictionaries to make it easier to compare different outputs. - Improve output of pw-reserve. - pw-loopback uses TARGET_OBJECT so you will need to use the serial id (or better the name) as the target instead of the object id. * modules - The filter-chain modules has seen some cleanups, refactoring and optimizations in the various DSP functions. - The ROC module now supports setting a custom samplerate. - ROC 0.2.X is now required. - The pulse tunnel and RTP source were not updating the rate field correctly which could cause synchronization problems. (glfo#pipewire/pipewire#2891) - The filter-chain now supports an arbitrary number of control properties. (glfo#pipewire/pipewire#2933) - It is now possible to assign custom port names to the ports from an adapter with the PW_KEY_NODE_CHANNELNAMES. - Support was added for capture and playback props in echo-cancel. (glfo#pipewire/pipewire#2939) * SPA - The ACP code now has an option to set the probe samplerate. (glfo#pipewire/pipewire#1599) - UCM devices now also have a Pro Audio profile. - Filtering of Step ranges is now implemented. * Pulse-Server - The channel-map is now set correctly on the echo-cancel module. - source_master and sink_master are now correctly handled in module echo-cancel. - Fix a regression in DRAIN where resuming after a DRAIN would fail. This caused problems for espeak. (glfo#pipewire/pipewire#2928) - TARGET_OBJECT is now used to make it possible to use the indexes as a target. - ladspa-source and remap-source can now also link to monitors. * ALSA - The ALSA plugin now handles the target.object correctly when set to -1. (glfo#pipewire/pipewire#2893) * V4L2 - The v4l2 replacement library now also follows symlinks. - Support for getting and setting controls was added. - Support for G_PARM was added. - The environment variable PIPEWIRE_V4L2_TARGET can be used to force an application onto a specific camera. * Bluetooth - Fix compilation without ldac_abr. - Fix a missing brace in CIND reply. This could cause some devices to fail. - Fix configuration of the initial latency. * GStreamer - The device provider now supports setting an fd so that it can connect to PipeWire sessions from the portal. - DMABuf support was re-enabled in gstpipewiresrc. - Rebase reduce-meson-dependency.patch. - Remove patches from upstream * 0001-pulse-server-add-channel-map-in-echo-cancel-module.patch * 0003-bluez5-backend-native-fix-missing-brace-in-CIND-reply.patch * 0001-alsa-dont-set--1-as-node.target.patch * 0001-modules-fix-rate-update.patch * 0001-alsa-fix-memory-leak-of-properties.patch * 0001-module-rt-fix-warning-when-xdg-desktop-portal-isnt-running.patch * 0001-midifile-error-won-invalid-track-size.patch * 0001-impl-node-move-2-state-variables-to-private.patch * 0001-context-rename-a-method.patch * 0002-impl-node-restore-running-state-after-reconfigure.patch * 0001-context-keep-per-node-quantum-and-rate-settings.patch * 0001-fix-use_buffers-checks.patch * 0001-pulse-server-clear-the-drained-state-correctly.patch- Add several patches from upstream to fix several issues (glfo#pipewire/pipewire#2925, glfo#pipewire/pipewire#2928, glfo#pipewire/pipewire#2929): * 0001-module-rt-fix-warning-when-xdg-desktop-portal-isnt-running.patch * 0001-midifile-error-won-invalid-track-size.patch * 0001-impl-node-move-2-state-variables-to-private.patch * 0001-context-rename-a-method.patch * 0002-impl-node-restore-running-state-after-reconfigure.patch * 0001-context-keep-per-node-quantum-and-rate-settings.patch * 0001-fix-use_buffers-checks.patch * 0001-pulse-server-clear-the-drained-state-correctly.patch- Disable ffmpeg support, only needed for pw-play and pw-record. Break a circular dependency with ffmpeg-5. Do this via disabling pkgconfig(libavcodec), pkgconfig(libavfilter) and pkgconfig(libavformat) BuildRequires as well as passing ffmpeg=disabled to meson.- Add patch from upstream to fix pulse tunnel getting out of sync/overruns (glfo#pipewire/pipewire#2891): * 0001-modules-fix-rate-update.patch - Add patch from upstream to fix memory leak of properties: * 0001-alsa-fix-memory-leak-of-properties.patch- Ship only X11 bell module in module-x11 sub-package- Split the X11 bell implementation into a separate package (overlaps with implementations in e.g. Marco). - Add patch from upstream to fix a Bluetooth regression (glfo#pipewire/pipewire#2898): * 0003-bluez5-backend-native-fix-missing-brace-in-CIND-reply.patch- Add patch from upstream to remember last routing after a reboot (glfo#pipewire/pipewire#2893): * 0001-alsa-dont-set--1-as-node.target.patch- Update to version 0.3.63: * Highlights - Fix a critical bug that causes audio distortion in some cases when using AVX2. - Fix a crash in mpv caused by deinit of PipeWire. - Resample the convolver IR to match the graph samplerate for better results. - Many more small bugfixes and improvements. * PipeWire - Fix a segfault in the PipeWire deinit code triggered by mpv in some cases. - Fix docs about SPA_PLUGIN_DIR. - Always dlclose by default (even under valgrind). Add an option with PIPEWIRE_DLCLOSE to select alternative behaviour. - Improve PIPEWIRE_DEBUG category handling. * modules - Resample the IR for the convolver when the IR samplerate and graph rate don't match. * SPA - Handle spurious reads from timerfd gracefully. - Fix potential stack-use-after-scope when starting Audacity. - Fix distorted audio when using AVX2. - Remove fallback to default channel map in channelmix. - Improve sorting of MIDI events, use the same order as Ardour. - Enable LFE downmixing by default. - Make IEC958/AC3 and IEC958/DTS work better by enforcing a fixed minimal buffering for the encoder to avoid stuttering. * Pulse-Server - Add a new pulse.cmd config section to execute pulse commands, currently only for loading modules. This removes the dependency on pactl. - Improve debug of messages. - Rebase reduce-meson-dependency.patch. - Add patch to add channel-map in the echo-cancel module: * 0001-pulse-server-add-channel-map-in-echo-cancel-module.patch- Refresh reduce-meson-dependency.patch- Update to version 0.3.62: * Highlights - A regression in screensharing was fixed. It was caused by a race when activating links and driver nodes. - Video transform metadata was added so that cameras and screen sharing can report the video orientation and transformations. - Support for the PulseAudio module-gsettings was added to make paprefs work. - Support for bluetooth offloading was added. This allows for the bluetooth reception, decoding and playback to happen completely in hardware. This also requires some support in WirePlumber. - Many bugfixes and improvements. * PipeWire - More work on stopping nodes in a more controlled way. - Fix a race in starting nodes and drivers. In some cases the driver node would already be started while the link to the peer node was not ready yet. This caused regressions in screen sharing. The driver is now only started after all the followers and links completed. - Fix a case where a slow capture stream would not recycle buffers anymore and stall. (glfo#pipewire/pipewire#2874) - Fix a subtle bug in pw_loop_invoke that could cause callbacks to be delayed and cause crashes in some cases. - Fix a case where IPC was done from the data-thread and could cause crashes. * Tools - Silence some expected errors in the pw-top output. * modules - The filter-chain has seen some optimizations in the copy plugin and the convolver. - The zeroconf plugin will now only unpublish services from the server that was removed. - Fix a potential crash when stopping pw-loopback. - Some harmless errors were turned into info messages. - Fix some cases where pw_stream methods were called from the data-thread that could cause segfaults. (glfo#pipewire/pipewire#2633) * SPA - There is now a video transform metadata that indicates how a video frame was transformed (rotated/flipped). libcamera and the GStreamer elements now have support for this metadata. - The SPA volume plugin is now disabled from the default build. - Handle missing control info in libcamera. - Handle errors from loop better, don't call the callbacks on errors. - Somewhat improve performance in some audioconvert AVX2 code for format conversion. - Fix PortConfig and EnumPortConfig params in audioconvert and audioadapter to reflect what is actually going on instead of using hardcoded values. - Pass ignore-dB property correctly in all cases. - Probing is now done in 48KHz again. (glfo#pipewire/pipewire#2857) * Pulse-server - IPv4 addresses are now added first to the list and exposed first with zeroconf discover. - module-gsettings was added to make paprefs work. - The pulse.idle.timeout option was disabled by default and only enabled for selected apps (speech-dispatcher) because it caused some problems for other apps. (glfo#pipewire/pipewire#2880) * JACK - Only process valid ports. Could fix some crashes. (glfo#pipewire/pipewire#2863) * Bluetooth - Support was added for offloading bluetooth handling. Some hardware can receive, decode and play the bluetooth audio directly in hardware.- Drop dependency on SDL2; this leads to a build cycle with SDL2 itself, and is only needed for pipewire example code anyway.- Update to version 0.3.61: * Highlights - Fix a bug in audioadapter that could cause crashes when switching bluetooth profiles. - Fix sound in QEMU, deadbeef and openal again. - libcamera plugin fixes, dynamic add and remove should now work with the next wireplumber version. - Fix a regression in pw-midiplay where the first buffer would not play and some events would be missing. - The network module now doesn't export other network sources anymore. - pulse-server now detects clients that keep underrunning for a long time and will pause them to save power. - Many more bugfixes and improvements. * PipeWire - Optimise away some useless graph recalculations. - Increase alternative sample rates from 16 to 32. - Silence some module loading errors when the error can be ignored. - Fix initial buffer requested size for pw-stream when operating in async mode. This also indirectly fixes the first buffer in pw-midiplay. * Modules - Set the network property on pulse-tunnel streams so that they are not exported anymore. - Filter-chain has optimized mix functions now. * SPA - Handle some errors in libcamera better. - Fix libcamera remove events. Fix the id allocation for devices. - Fix a bug in audioadapter where it would not renegotiate after a port reconfiguration, leading to crashes, especially when automatically switching profiles in bluetooth. - Do ALSA probing in 44100Hz again. Some devices seem to fail otherwise for some unknown reason. - Force playback start when the ALSA buffer is full. This fixes sound in QEMU. - Support Digital 5.1 AC3 for Asus Xonar SE. - Improve format renegotiation in audioadapter. This makes the ALSA plugin work again for deadbeef. - Fix latency reporting on adapter DSP ports. * pulse-server - Fix a bug where openal based applications would hang. - Improve zeroconf publish. Only publish on the address of the first running server. This avoids duplicate entries for IPv4 and IPv6. Add support for republish entries when new servers are started. - Add a pulse.idle.timeout option (default to 5 seconds) to pause streams that have been underrunning for this amount of time. Badly behaving clients will then not keep the graph and device busy so that devices can be suspended to save battery. This should give better default behaviour with speech-dispatcher. * JACK - Add an option to configure the filter character. - Fix connect_callbacks. It was only called once for output ports. - Add option to set node.passive on jack clients. Make some quirks for qsynth to make it suspend and fade out better. - Rebase reduce-meson-dependency.patch. - Drop patches already included upstream: * 0001-audioadapter-perform-setup-again-after-a-PortConfig.patch * 0001-pulse-server-also-advance-read-pointer-in-underrun.patch * 0002-audioconvert-redo-setup-when-format-changes.patch * 0003-acp-do-probing-in-44100Hz-again.patch * 0004-alsa-force-playback-start-when-buffer-is-full.patch- Add patch from upstream that fixes audio in qemu where the buffer is very small (glfo#pipewire/pipewire#2830): * 0004-alsa-force-playback-start-when-buffer-is-full.patch- Add more patches from upstream to perform setup in more cases: * 0001-audioadapter-perform-setup-again-after-a-PortConfig.patch * 0002-audioconvert-redo-setup-when-format-changes.patch - Renumber patch 0001-acp-do-probing-in-44100Hz-again.patch to * 0003-acp-do-probing-in-44100Hz-again.patch- Add patch from upstream to fix some devices that don't seem to work in 48000Hz: * 0001-acp-do-probing-in-44100Hz-again.patch - Require pulseaudio-utils from pipewire-pulseaudio to have pactl available to load modules.- Update to version 0.3.60: * Highlights - The filter-chain now handles errors better and has fixes for many crasher bugs. - A new RTP module was added with a sender and receiver. It uses SAP to announce and consume RTP streams and is compatible with the PulseAudio RTP modules. - Many small bluetooth improvements and fixes. - The alsa plugin will now only start playback when there is data. This results in better synch and lower latency between capture and playback. - The v4l2 and libcamera plugins have seen a lot of improvements. They support control properties now. Also pw-v4l2 has seen many improvements and mostly passes the v4l2-compliance test now. - Many more bugfixes and improvements. * PipeWire - Code cleanups, compiler warning fixes. - Add some extra checks to avoid scheduling an inactive node. - Rework the sequence of events to start and stop nodes. - Improve param enumeration. - An option was added to give priority to the Buffer params of the consumer. This makes it possible to use the default values of the consumer (instead of the producer) when capturing from a source. - The graph rate selection was improved to pick a rate closest to the requested one (instead of picking the default). * Modules - Fix some crashes in filter-chain. - X11 Bell module will now be loaded by default when available. - A new RTP module was added with a sender and receiver. It uses SAP to announce and consume RTP streams and is compatible with the PulseAudio RTP modules. - Improve RAOP compatibility. - The echo-cancel module now uses the resampler prefill option to align input and output samples without buffering. Better latency control when starting and stopping has been implemented. - The pulse tunnel will now write aligned samples to pulseaudio even when the ringbuffer wraps around. This fixes playback issues with multichannel sinks. - Add a delay option to module-loopback using a ringbuffer. - Implement echo-cancel params. - The filter-chain module has better error reporting. - The LADSPA search path was extended with some more common paths. - The echo-cancel input can now also be a monitor of a sink. This improves compatibility with some proton games that expect a real sink instead of a virtual one. * Tools - Better error reporting in pw-link. - pw-top now also shows IEC958 passthrough formats and JPEG/H264 video formats. - pw-top refreshes the screen faster. - pw-top now prints the state of the node and shows less info for inactive nodes. - pw-dump now uses the new seq field in the spa_param_info to discard old param updates and avoid duplicate params in the output. * Bluetooth - Add ModemManager support in the native backend. - Clean up GetManagedObjects handling. - Handle QoS from the endpoints in the codec. - Increase the socket buffer to have more control over the rate and QoS. - Simplify the packet flushing code. - Stop processing nodes before destroying them. - Fix timers when a source switches drivers. - Codecs can now share endpoints. This reduces the amount of endpoints and avoids problems with devices that can't handle a large amount of codec endpoints. - Report batery status to UPower for HFP AG. - Fix bitpool increase. * SPA - The audioresampler now avoids clicks and pops between activating and deactivating the adaptive resampler when used by the stream API. - Use default locale to parse float parameters. - The upmix functions now have SSE optimisations. - Avoid recalculating the complete channelmix setup when only the volume changes. - The alsa plugin will now only start playback when there is data. This results in better synch and lower latency between capture and playback. - The ALSA MIDI sequencer will now pull data from the graph even when it did not output anything. Fixes some graph stalls with the sequencer in some cases. - v4l2 and libcamera sources now recycle buffers when nothing is consuming them. This avoids stalling the graph. - libcamera now suggests a more appropriate frame size than the smallest poster frame. - Improve state changes in audioconvert. - A new seq field was added to spa_param_info to keep track of pending param updates. - Support speaker output only on RealTek ALC4080. - The v4l2 source now supports setting controls. - The libcamera plugin now supports enumerating and setting controls. - A new unit test for 6.1 channel mapping was added. More debug info was added to audioconvert for the channel matrix. - Audioconvert will now also upmix a rear-center channel when needed. * pulse-server - Add support for the RTP send and recv modules with the new native RTP module. - Add option to set latency for pulse-tunnel streams and module-zeroconf-discover. - The socket will now be given the same permissions as what pulseaudio did (0777). - Implement module-loopback latency_msec correctly with the new delay parameter. - sysfs.path is now filled with the same data as pulseaudio. - The manager now uses the new seq field in the spa_param_info. - Fix a bug where in some cases the read pointer would get out of synch and cause too large requests. * ALSA - The alsa plugin now reuses the stream in prepare which results in better performance. - Some deadlocks have been fixed in the ALSA plugin. - The ALSA plugin reports more accurate timing information in some cases. * V4l2 - The v4l2 compatibility layer has received a lot of updates. - Improved node names and format enumeration. - Support for multiple /dev/videoX devices, each mapped to a unique PipeWire node. - Passes the v4l2-compliance test now with both the v4l2 and libcamera backend in PipeWire. - Improved mmap support for inline buffer memory. This makes it possible to consume PipeWire streams. - Negotiation works more reliably now. * JACK - Implement jack_acquire_real_time_scheduling() and jack_drop_real_time_scheduling() by keeping the thread utils in a global state. - Fix jack_client_thread_id() to return NULL when the client is not active, just like jack1 and jack2. - An option was added to let the jack_set_buffer_size() function update the global metadata. A quirk was added so that jack_bufsize uses this new feature to make the buffer size settings persistent and global, just like jack. - jack_port_register() and jack_port_unregister() can be called on an active client so make this thread safe. - Rebase reduce-meson-dependency.patch. - Drop patches already included upstream: * 0001-filter-chain-iterate-the-port-correctly.patch * 0002-spa-support-the-speakers-output-only-case-in-report_.patch - Add patch to make Telegram playback work again: * 0001-pulse-server-also-advance-read-pointer-in-underrun.patch- Fix regression with Dell WD15 Dock and others (bsc#1204719): 0002-spa-support-the-speakers-output-only-case-in-report_.patch- Add 0001-filter-chain-iterate-the-port-correctly.patch: Fix filter-chain convolver segfault at start.- Update to version 0.3.59: * Highlights - Fix possible wrong samplerate in loopback streams after suspend and rate switch. - module-filter-chain can now adapt to the graph samplerate. - Fix some potential stuttering and crackling in pulse-server. - Add Bluetooth LE support. This requires experimental kernel and bluez support. - The ALSA plugin has more options to control the buffer size. This can be used to work around high latency in davinci resolve. - Many bugfixes and improvements. * PipeWire - Add audio capture example with volume meter. - Fix a case where a rate switch would not suspend all the nodes of the driver first. This could cause wrong samplerates in streams. - Fix a case where a node would be Paused while still added to the graph, causing potential crashes. * Modules - module-filter-chain and module-loopback now use the resample.prefill option to avoid buffering extra samples and causing unwanted latency when resampling is activated. - module-filter-chain can now adapt to the graph samplerate. - Improve module-raop to support the ALAC codec as raw PCM. - Improve RTSP parsing to improve compatibility. * Tools - Fix 100% CPU in pw-cli monitor mode. - spa-acp-tool can now be exited with ctrl-D. * SPA - Various libcamera fixes and improvements. - Set stride on audioconvert output buffers. - Make sure we always place the last requested size from the resampler on the buffers in pw-stream. - Add resample.prefill option in the resampler to fill the history with 0 so that we don't have smaller buffers at the start. - Make sure that when an overflow corrupts a POD, that it will always stay corrupted. - Rate limit some ALSA warnings and reduce some unwanted warnings. - Don't recalculate the audioconverter state for each pause/play. - Fix some POD parsing inconsistencies and potential overflows. - Add support for Asus Xonar SE. - Fix Flush command handling. It should not stop playback. - Refactor the peaks function and add some unit tests and optimisations. - The channelmix has an optimized nXm converter and new unit tests. - Normalisation in the channelmixer was fixed. * pulse-server - The requested latency of record streams was reduced to fix some stuttering in Teamspeak. - Tweak the max amount of bytes sent to a client. - Improve maxlength calculations, this fixes some crackling noise with high samplerate and channel counts in some players (audacious). * Bluetooth - Merge Bluetooth LE support. - Make sure we are backward compatible with WirePlumber. - Fix some HFP and HSP AT command parsing. - Use HFP by default over HSP. * ALSA - Increase max number of periods. - The parameters handling was improved. There is now an option to set the buffer-bytes of the ALSA plugin. - PIPEWIRE_ALSA can now be used as an environment variable to restrict the plugin formats and buffer size. - Rebase reduce-meson-dependency.patch.- Update to version 0.3.58: * Highlights - Fix a regression that could cause audio crackling. - Fix a regression in RTKit because rlimit was not set correctly. - JAVA sound applications will now alsa work with the pulseaudio-alsa plugin. - pw-top will now show the negotiated formats of devices and streams. - Fix some potential crashes when starting streams. - The ALSA plugin has had improved timing reporting and poll descriptor handling that should improve compatibility. - Many more improvements and bugfixes. * PipeWire - Avoid scheduling nodes before they are added to the graph. This could avoid some crashes when scheduling nodes that were not completely started yet. (#2677) * Tools - pw-top now also shows the negotiated formats of streams and devices. (#2566) - pw-top prints microseconds as "us" now to avoid unicode problems. * Modules - Fix compilation with newer lv2. - Fix setting realtime priority with RTKit, it was not setting rlimit correctly and RTKit would refuse to change the priority. - Fix some playback problems with RAOP sink. (#2673) - Filter chain will now warn when a non-existing control property is used in the config file. (#2685) - Filter chain can now handle control port names with ":" in the name. (#2685) - The echo-cancel module and interface now has activate/deactivate functions to make it possible for plugins to reset their state. * SPA - Make sure audioconvert uses the given channelmap and channels for the volumes, even when not negotiated yet. This makes it possible to change the volume before the node has been negotiated. - Refactor the peaks resampler. Fix an error in the SSE code. - Fix DSD min/max rates, avoid exposing impossible rates. - Set monitor port buffer size correctly. This could cause some crackling and hickups. (#2677) - Make ALSA sequencer port names unique. * Pulse-server - Rework the capture buffer attributes to better match pulseaudio. This fixes a regression where opening pavucontrol could cause crackling. (#2671) - Implement TRIGGER and PREBUF methods. - Handle clients that send more than the requested amount of data. PipeWire will now also keep this as extra buffered data like PulseAudio. This fixes JAVA sound applications when they are running on top of the PulseAudio ALSA plugin. (#2626,#2674) - Update the requested amount of bytes more like PulseAudio. Fixes stuttering after resume with the GStreamer pulseaudio sink. (#2680) * ALSA Plugin - More debug info was added. The time reporting was improved. - The poll descriptor handling was improved, avoiding some spurious wakeups. (#1697)- Update to version 0.3.57: * Highlights - Support masking of conf.d/ files. - Use org.freedesktop.portal.Realtime when available. This does the correct PID/TID mappings to make realtime also work from flatpaks. - Fix rate adjustement logic in pulse-tunnel. This would cause increasing delays and hickups when using tunnels. - Add OPUS as a new vendor codec. Add OPUS-A2DP spec. PipeWire can now send and reveive OPUS data over bluetooth. - An AAC decoder was added so that PipeWire can now also function as an A2DP AAC receiver. - Fix some issues where the wrong samplerate was used. - Fix rate match for sources. This fixes an error where follower sources would generate many resync warnings. - Many more bugfixes and improvements. * PipeWire - Support masking of conf.d/ files. - Add some more debug info to memfd. - Improve data-loop invoke method. Also flush pending items. - Add a filter-chain systemd service file than can be used to start custom filters placed in ~/.conf/pipewire/filter-chain.d/ - Improve triggered timestamps for remote nodes. - Fix some potential cross compilation problems due to wrong host_machine. - Check return values of pw_getrandom(). * Tools - Updates to pw-cli manpages. - Remove the pw-cli dump command. It is mostly implemented as part of wpctl status, pw-dump, pw-link, pw-top and others. - Clean up resource in pw-cat correctly on errors. * Modules - Fix compilation of AVB on big-endian. Enable AVB only on Linux. - Use org.freedesktop.portal.Realtime when available. This does the correct PID/TID mappings to make realtime also work from flatpaks. - Fix compilation of ROC module when headers are missing. - Improve some error cleanup paths in protocol-native. Improve connect and disconnect. - Fix a potential crash in FFT unload in filter-chain. - Implement PIPEWIRE_NOTIFICATION_FD for notification when the socket is ready. - Try to use rtkit if set_nice() fails. - Fix rate adjustement logic in pulse-tunnel. This would cause increasing delays and hickups when using tunnels. - Handle disconnect in pulse-tunnel. * Bluetooth - Add OPUS as a new vendor codec. Add OPUS-A2DP spec. PipeWire can now send and reveive OPUS data over bluetooth. - An AAC decoder was added so that PipeWire can now also function as an A2DP AAC receiver. * SPA - Tweak the resampler window function some more. - Improve format convert performance in some fallback cases. - Fix rounding in format conversion on ARM NEON. - Fix libcamera build error. - Fix some issues where the wrong samplerate was used. - Don't wait for more samples that can fit in the ringbuffer in ALSA. - Improve buffer size handling in audioconvert, scale the buffers based on the rate conversion and make things work with really large rate conversions as well. - Add more and better debug for ALSA devices. - Improve channel mix: Filter FC and LFE when copying from a different layout. Implement STEREO from FC. Avoid generating REAR from FC in PSD mode. - Fix rate match for sources. This fixes an error where follower sources would generate many resynch warnings. - Improve ALSA format negotiation. If the ALSA node is not running and there was a previously configured format, close and reopen the device to enumerate and accept all possible formats again. * ALSA - The alsa plugin will now also save the volumes set with the control API. This saves the volumes set with alsa-mixer, for example. * Pulse-server - Flatpak apps with devices=all (Zoom) will now be granted Manager permissions. - Small tweaks to the amount of data sent to clients to work around an issue in freerdp. * JACK - Clean up the transport correctly when closing a client. - Match context properties in addition to node properties for the jack client rules. - Make sure to return an error when disconnected from the server. - Fix thread cast problem in jack_client_thread_id(). - Increase jack_client_name_size() length and make sure we have space for the \0 byte. - JACK clients from the same application will be added to the same group so that they share the quantum and rate. - Rebase reduce-meson-dependency.patch. - Drop patches already included upstream: * 0001-avb-fix-compilation-on-big-endian.patch * 0002-avb-fix-compilation-on-big-endian.patch * 0003-avb-fix-compilation-on-big-endian.patch- Recommend pipewire-alsa (instead of alsa-plugins-pulse) from pipewire-pulseaudio (boo#1201409)- Update to version 0.3.56: * Highlights - A critical bug that could crash JACK applications was fixed. - Some more regressions in audiomixer were fixed. This should fix crackling and stuttering in some cases as well as some channel mapping regressions. - A bug in the alsa plugin was fixed that could cause stuttering in VMs. - Bluetooth sources should have improved latency and rate control. - Many more bugfixes and improvements. * Modules - An experimental AVB module was added. It can expose PipeWire as an AVB entity and initiate (broken) streaming between entities. - module-loopback now handles the cases where the input and output channels are different without crashing or producing silence. - The filter-chain module now correctly calculates the output size without crashing in some cases. It also skips invalid ports instead of crashing. - Handle and report pthread errors better. * SPA - The resampler qualities were tweaked a little. - A bug that would sometimes cut off the last part of a buffer was fixed in the alsa plugin. This could cause broken audio in VMs. - Access to the alsa mixer and devices is now checked more thoroughly. - The spa-resample tool can now also handle large downsampling rates without crashing. - Audioconverter now uses rounding for float to int conversions, which reduces distortions. Compilation of the C subroutines was separated and uses its own optimisation flags now. - Noise shaping was improved in audioconvert. A new Wannamaker 3 tap shaper was added. - Audioconvert now uses a pattern for generating keep alive noise. This should have much less energy and be even more inaudible. - A channel mapping bug was fixed in audioconvert. - The dsp audio mixer would sometimes not mix enough and cause dropouts. * JACK - A critical bug in the mixer was fixed. It would cause most JACK applications to segfault at start-up. * Bluetooth - A new rate control algorithm was implemented for the sources. - The media role on HSP/HFP streams is now fixed. * Pulse Server - Add the resampler delay to delay reporting as well. - Rebase reduce-meson-dependency.patch. - Drop patches already included upstream: * 0001-jack-only-mix-when-we-have-input-to-mix.patch * 0002-spa-alsa-udev-Check-accessibility-of-pcm-devices-as-well.patch - Add patches from upstream to fix compilation on big endian: * 0001-avb-fix-compilation-on-big-endian.patch * 0002-avb-fix-compilation-on-big-endian.patch * 0003-avb-fix-compilation-on-big-endian.patch- Add patch to fix audio after tty switching (boo#1201349): * 0002-spa-alsa-udev-Check-accessibility-of-pcm-devices-as-well.patch- Update to version 0.3.55: * Highlights - Fix some more critical bugs in the new audioconvert and the queueing in pw-stream that causes stuttering and hickups. - HFP hardware volumes are now saved and restored. - Format conversions and mixing was improved. - Small bug fixes and improvements. * PipeWire - The queueing in pw-stream was improved with support for buffer prefetch in asynchronous mode. - Add a pw-filter unit test. * tools - pw-midiplay should now work again after improvements in pw-stream. * modules - The RAOP module was improved to support auth_setup. - The RAOP module should now handle timing packets better. - Add some more filter-chain examples. - The filter-chain now has a separate config file with the boilerplate settings. The examples are now just config snippets that can be dropped in .conf.d/ directories, such as the filter-chain.conf.d/ one. - Start suggesting to use target.object instead of node.target in docs and examples. * SPA - Use the cosh window again for the resampler. It should now give better resampler quality. - Rework the mixer functions. They were rewritten for higher precision and better performance. Add unit tests and benchmarks. - Improve format conversion for 32bits for avoid errors in clang because of undefined behaviour at extreme ranges. - Fix a bug in audioconvert where it would not consume the right amount of samples when the resampler was disabled. This could cause skipping and hickups. - Fix bug in audioconvert where it would try to convert the input samples multiple times, causing strange artefacts when upmixing. - Be more strict about valid JSON floats. - device.vendor.id and device.product.id should now always show up in 0xXXXX format and should not be converted to floats in pw-dump anymore. - Add triangular dither, add unit tests for noise generation, add some more optimisations. * Bluetooth - HFP and A2DP now expose different routes and thus can have different volumes. - HW Volumes for HFP are now synchronised better. Volume changes from HW buttons are now also saved. - Rebase reduce-meson-dependency.patch. - Add 0001-jack-only-mix-when-we-have-input-to-mix.patch: Fix an Ardour start-up crash.- Update to version 0.3.54: * Highlights - Some critical bugs in the new audioconvert were fixed. The old adapter had internal buffering that was abused in some places. - The bluetooth sources were rewritten using a ringbuffer to make them more reliable to jitter and remove old audioconvert behaviour. - Many improvements to the audio converter. - Native DSD128 and up is now supported by pw-dsdplay. * tools - Support DSD128 to DSD512 as well by scaling the amount of samples to read per time slice. * SPA - Format conversion is now generated with macros to remove duplication of code. - 24bits conversions were rewritten to use the generic conversion functions. - Temporary buffers in audioconvert are now made large enough in all cases. - Fix draining in audioconvert. This fixes speaker-test. - Fix the channel remapping. - Audio conversion constants were tweaked to handle the maximum ranges and provide lossless conversion between 24bits and floats. - Vector code and C code are aligned and the unit tests are activated again. A new lossless conversion test was added. - Fix an underrun case where the adapter would not ask for more data. - Fix PROP_INFO for audioconvert. - Use the blackman window again for the resampler, the cosh window has some bugs that can cause distortion in some cases. - Add more unit tests for audioconvert. Add end-to-end conversion tests. - Don't leak memory in format converter. * pulse-server - Card properties are now also added to sinks and sources, just like in pulseaudio. - Increase the maxlength size to at least 4 times the fragsize to avoid xruns. - Fix a race when setting default devices. * Bluetooth - The source was rewritten to use a ringbuffer. This avoids regressions caused by audioconvert. - Drop patches already included upstream: * 0001-audioconvert-ensure-temp-buffers-are-large-enough.patch - Rebase reduce-meson-dependency.patch.- Add a patch from upstream to fix segmentation faults in MPV: * 0001-audioconvert-ensure-temp-buffers-are-large-enough.patch- Update to version 0.3.53: * Highlights - The 44.1KHz samplerate was removed again from the defaults, it caused all kinds of problems with various hardware. - The ALSA plugin should now be able to deal with unsupported samplerates and fall back to the nearest supported one. - The audioconvert plugin was rewritten to be more maintainable and quicker. It also gained support for control ports and dithering with optional noise shaping. - An impossible buffering situation is avoided in pulse-server that would cause some applications (sunshine, ...) to stutter. * PipeWire - 44.1KHz was removed from the allowed rates again. It caused all kinds of regressions due to driver bugs and timing issues on HDMI. * modules - filter-chain now does some more error checking and reporting to avoid some crashes. - filter-chain now supports more channel layouts for input and output that does not need to match the plugin layout. - Format parsing is now more consistent in the modules. * Tools - pw-cli can now also work without readline support. - pw-cat can now also read multichannel ulaw/alaw/u8/s8. * SPA - The audioconvert plugin was rewritten. This should make it more maintainable. It also fixed some issues such as CPU spikes in some cases and crashes in others. The old plugins were removed, for a code reduction of some 6000 lines. - The audioconvert plugin now supports control ports, which can be enabled on nodes in the session manager. This makes it possible to control audioconvert properties using timed events or midi. - NoteOn 0-velocity MIDI events are no longer filtered out. This is a valid event, nodes that can't deal with it should fix it up themselves. The JACK layer still filters out these events by default but this can now be configured with a per-client property. - The running status on midi events is now disabled to match what JACK does. - The ALSA plugin will now deal with driver bugs when a driver announces support for a samplerate but then refuses to use it later. - The ALSA plugin has been optimized a little for sample IO. - V4L2 now doesn't error when there are no controls. - Error handling was improved in the audio converter. - The audioconvert plugin now supports rectangular dithering and noise shaping. - The audioconvert plugin can now insert additional inaudible noise that can be used to keep some amplifiers alive. - The audioconvert format conversion was changed so that it now produces the full 32 bits range in the C fallback conversion code as well. - The resampler window function was changed to a cosh() window function. - Vendor and device id are now in hex. * pulse-server - Tweak the record buffer attributes some more and make sure we don't end up in impossible buffering situations. Fixes an issue with distorted sound in sunshine. - Fix a potential crash when updating the client property list. - Some properties on cards were aligned with pulseaudio. - Drop patches already included upstream: * 0001-settings-remove-44.1KHz-from-allowed-rates-again.patch - Rebase reduce-meson-dependency.patch.- Add patch from upstream to remove 44.1kHz from allowed rates. This reverts the new behaviour in 0.3.52 which is causing problems to too many people (boo#1200760): * 0001-settings-remove-44.1KHz-from-allowed-rates-again.patch- Update to version 0.3.52: * Highlights - Add 44.1KHz to allowed samplerates. The server can now switch by default between 48KHz and 44.1KHz. - Streams now allocate less resources. - Fix some bugs that could make the server crash. - Bluetooth now supports the LC3plus vendor codec. - Many bugfixes and improvements. * PipeWire - Add 44.1KHz to allowed samplerates. - Avoid setting the locale. - Avoid use-after-free when destroying a node from spa-node-factory. - Avoid using reallocarray when not available. - Set port alias is not otherwise set. * Modules - Improve filter-chain parsing and error reporting. Handle empty nodes. - Handle destroy of globals and factory in most modules. - Add refcounts to client and resources to handle destroy of the protocol. - Handle global node.name in filter-chain and loopback again, use it to construct unique stream names. - Avoid a wrapped pw-node in the adapter. This reduces resources allocated for streams. - Fix a crash when module-x11-bell was unloaded. - Add a new module-pipe-tunnel that can write/read data from a UNIX pipe. * Tools - Fix DSD playback again in pw-cat. - Add -n option to pw-loopback to set node names. - Add -P option to pw-cat to pass properties to the stream. - Support stdin/stdout in pw-cat. - pw-dump now also dumps object removal when monitoring * SPA - Avoid duplicate param results in pw-dump for ports. - Avoid endless loops in audioconvert for badly behaving clients. - Scale max-error in alsa based on quantum and avoid logging a warning when starting. - Improve debug of failed format conversion. - Handle offset in the audio dsp mixer inputs and clamp to the maximum buffer size. - Add option to disable locale support for JSON number conversion. - Add support for Astro A20 Gen2. - Fix some of the test sources, the flags were not set correctly. - Add camera location as property in libcamera and let the session manager generate a localised description. - Fix some crashes due to wrong vargar types in v4l2 controls. - Improve ALSA resync behaviour. - Add support for Komplete Audio 6 MK2. - Improve loop cancel while iterating. - Try not to mix surround channels and AUX channels. Make card with many ports look better when not using the Pro Audio profile. - Vulkan filters were added. * Bluetooth - Add LC3plus vendor codec. - Handle unsupported indicators better. - Ensure multiple devices on an adapter use different codecs because one endpoint can only be used by one device at a time. - Fix bitpool control as a follower. - Handle bluetooth errors better. - Speed up bluetooth connection by only waiting for the profiles supported by the adapter. - The dummy AVRCP player is disabled by default because it seems to break more devices than it fixes. * pulse-server - Add initial stream latency property so that devices can be started with a resonably accurate latency. - Fix ringbuffer underrun case. - module-native-protocol-tcp now has a auth-anonymous option to give full access to the clients. - Report a node as being moved when it is still moving. This improves compatibility with pasystray. - Avoid overallocating message memory. - Don't export NETWORK nodes in zeroconf. - Fix stride for TrueHD and DTSHD passthrough. - Make sure we don't send too small audio fragments. Fixes capture from multiple tabs in Chromium. - Rework module handling some more. - Use the new native module-pipe-tunnel for pipe-sink and pipe-source. - Implement the STREAM_MOVED message when a stream got moved. - Fix a potential segfault when stopping the server and a TCP module as still loaded. * ALSA - Add support for updating sw_params at runtime, mostly the min-avail param. - Capture and playback nodes are now assumed to use a different clock and will activate the adaptive resampler when linked. This assumption is removed in Pro Audio mode. This provide a better experience out of the box with most devices. * JACK - Fix setting properties with PIPEWIRE_PROPS again. - Don't use 64 bits atomic operations for sync_timeout. - Cleanup in error cases was improved, avoiding some crashes. * GStreamer - Fix pipewiresink in mode=provide. - Share memory into a new buffer in pipewiresrc to avoid buffer corruption. - Fixes to the source and fd use. - It is now possible to set client properties as well. - Rebase reduce-meson-dependency.patch.- Update to version 0.3.51: * Highlights - Improve graph reconfiguration. - Extra configuration options for streams and filters with config rules and environment variable. - Improve module-pulse-tunnel latency, stability and error recovery. - pw-top, pw-cli and pw-link improvements. - Fix a channelmixer upmixing clipping issue. - The ROC module has seen many improvements. - Many more bugfixes and improvements. * PipeWire - The graph reconfiguration code was reworked: * Moved nodes will update the new driver quantum correctly. * Inactive nodes are ignored more. * Nodes that require a driver are now not scheduled anymore when they are passive (unused). * Improved performance, the graph is reconfigured with a minimal amount of changes. - Method and event argument names were improved. - A linker garbage collection problem was fixed. - Properties on threads are now implemented. Use common code to set thread name and add an option to set stack-size. - Streams and filters always want a driver now. This makes it possible to just link a playback stream to a capture stream without a driver and have it work. - Streams and filters can now also have rules in the config file. - Streams, filters, JACK, ALSA and v4l2 now support PIPEWIRE_PROPS environment variable to override node properties. - Add config section extensions. This provides a way for modules to have specific config to override the default config. - Handle realloc errors better. - Improve stream and filter property updates. * Modules - The pulse-tunnel modules has improved latency management and should now work a lot better. - Module-loopback, module-echo-cancel, module-filter-chain unload the module when a stream is destroyed. - Biquads in filter-chain now can have more gain (5->20 dB). - Filter-chain now has a builtin delay line filter. - Filter-chain can now parse the config key correctly in all cases. - The ROC sink and source saw many improvements. roc-source is now a stream by default that connects to the default sink. Both modules will try to set a graph rate. Both modules have an option to select the FEC mode. The ROC source has lower latency now. - Handle realloc errors better. * tools - pw-cat does not have --list-targets anymore, use one of the more advanced and less buggy tools such as wpctl or pw-cli to list sinks and sources. - pw-top has seen many improvements. * It now has some timeouts to reset the node values to their default state when unused. * The man page was improved. * Invalid timings and errors are displayed in a better way. - pw-cli and pw-link can now create links between all ports of given nodes. - pw-cat can now save to other file formats than wav, based on the extension of the filename. * SPA - The resampler now uses a different internal method for draining. It can now also handle 0 size buffers as input without draining. - The channelmixer now uses the front channel averages for FC and LFE. This avoids clipping and results in much better upmixing. - ALSA should now work again on 32 bits. (#2271) - The JSON parser now converts escaped unicode correctly to UTF8. * bluetooth - Codec switch improvements when the device is disconnected. * pulse-server - There is a new module-roc-sink-input module, the PulseAudio equivalent. - The ROC source and sink-input module now have a much lower latency. - The ROC module now has an option to select FEC mode. - Playback and record rate adjustements should work now. * JACK - Remove some useless pthread attributes. This makes JACK work in QEMU with sandboxing enabled. - The buffer_size callback is now only called when something has changed since the last process() callback or get_buffer_size() method. This fixes a GStreamer issue and is more in line with what JACK does. - Fix a potential deadlock when the process thread is doing IPC and the IPC thread is blocking on the data thread. - Allocation errors in metadata are handled better. - Rebase reduce-meson-dependency.patch.- Update to version 0.3.50: * Highlights - pw-stream can now report more timing information and can suggest the optimal number of samples to queue for playback. - pw-dot now works again. - module-pulse-tunnel latency was improved. - Wine applications using the JACK backend should no longer crash. - The channelmixer defaults are improved and the muffled sound when playing back 5.1 and 7.1 material has been fixed. - Many fixes and improvements. * PipeWire - pw-stream now places a suggested amount of samples in the pw-buffer for playback. This allows you to remove some places where spa_io_rate_match was needed to get this information. - pw-stream has new API to request a timing update. New fields are added in the timing info, such as number of buffered samples in the resampler and the number of queued and dequeued buffers. - pw-stream has support for double controls now. More controls are exposed such as the Rate control to do adaptive resampling. - The thread-utils object was moved to the context to avoid some concurrent use cases that caused crashes. - Deactivating an exported node/stream will now remove the node from the data-thread immediately so that the process function will not be called anymore and resources can be safely freed. This could fix some of the last remaining crashes when streams are stopped. - PipeWire will now fail to load a module that tries to register the same export type twice instead of silently doing the wrong thing. * Modules - Many modules now use the NODE_WANT_DRIVER instead of the pipewire.dummy NODE_GROUP property. This makes it possible to use them with any other driver and can avoid resampling in some cases. - module-pulse-tunnel now uses an adaptive resampler to keep the latency under control. Latency should be much better than before and stay constant even when there are network delays. - There is now an option for packages to disable building the RTKit module, which is still built by default for backwards compatibility reasons. - A leak was fixed in filter-chain. - Module node names are now made more unique with the pid. * tools - pw-cat verbose output has been improved. - pw-link now has a man page. - pw-reserve now has an -r option to make it issue a RequestRelease command on the owner of the device. This makes it possible to ask WirePlumber to close and release a device. - Fix pw-dot again. It didn't work anymore because of stray done events that were emitted to notify the client of object serials. * SPA - The channelmixer now has PSD upmixing enabled again. We used the simple upmixing in the previous release but that just sounds too awful to be a good default. - The channelmixer will not upmix FC and LFE anymore when upmixing is explicitly disabled. - The channelmixer will only lowpass filter FC and LFE channels when they were upmixed. - The defaults of the channelmixer were tweaked a little. There is now a little bit more bass in the LFE channel and more high fequencies in the FC channel when upmixing. Also the channel widening has been disabled by default. - Locale independent float parsing now uses a more portable solution with uselocale. - ALSA will now only allocate a buffer size big enough to hold 4 times the quantum limit instead of as large as possible. * pulse-server - Internal cleanups in handling of modules. - A quirk to force s16 sample formats for teams-insider has been added. * JACK - The data-loop is now started in activate and stopped in deactivate. This makes the data-loop respect any custom thread functions you configure. This also makes Wine apps using the JACK backend work. - Port sorting was improved/fixed. - Rebase reduce-meson-dependency.patch. - Require RealtimeKit.- Reorder BuildRequires and space conditions a bit better in the spec file.- Update to version 0.3.49: * Highlights - Sample rate switching should work again. - pw-dot can now use the output of pw-dump to render a graph. - Bluetooth A2DP streaming was improved that would reduce stuttering on some devices. - A JACK bug was fixed that would sometimes make it impossible to add more tracks in Ardour. (#1714) - Many bugfixes and improvements. * PipeWire - Fix a potential crash when NULL params were configured. - Add some simple functional tests to avoid some recent regressions. Improve the test framework for this as well. - Improvements to the poll loop to avoid some use-after-free scenarios. - Fix samplerate switching again. - setlocale is not called anymore from the pipewire library. This should be called by the application. (#2223) - pw_init() and pw_deinit() can now be nested and called multiple times. - pw_stream will now report the resampler delay in the pw_time.queued field. * modules - module-filter-chain now supports arbitrary many properties and will use property hints to assign them the right type. - The ROC modules now accept a sink/source_properties parameter. - The module-rt can now also be built without RT-Kit support. - module-echo-cancel can now use a fraction to specify the delay for more precise control. * SPA - The channelmixer will now do upmixing by default and will not use normalization. It will also use a simple upmixing algorithm that duplicates channels by default. A more interesting upmix method is also available (PSD) but needs to be enabled manually. (#861) - Add SSE optimized (de)interleave functions for 32 bits samples with and without byteswap. - JSON parsing of empty strings will now give an invalid number instead of 0. - JSON numbers are now parsed and serialized in a locale independent way so that , and . are not mixed up. - The resampler will now report the resample delay and queued samples as the extra delay. * tools - pw-cat will read more dsf files correctly and will not crash at the end. - pw-top now has a man page. - pw-dot can now use the output of pw-dump to render a graph. * bluetooth - Improve interactions with oFono. - Fix recovery with slow connections. - Improve frame size of AptX-ll. - A2DP can now use any quantum and will flush packets in smaller chunks when needed to adapt. This improves stuttering in some cases. * pulse-server - The server configuration can now be placed in pulse.properties section, which also makes it possible to have custom overrides. - Implement FIX_ flags for capture as well. - Small fixes and improvements in module loading. * JACK - Clear the last error before executing a new action or else we could end up with error from a previous action. This causes some problems in Ardour where adding a track would fail after some time. (#1714) - Rebase reduce-meson-dependency.patch.- Update to version 0.3.48: * Highlights - Fix IEC958 passthrough again. - Fix pulse-server crashes when playing a sample. - Support for more a more advanced upmixing algorithm. - filter-chain now supports arbitrary many ports. - Fix multichannel support in WINE (with new WirePlumber). - Many bugfixes and improvements. * PipeWire - The work queue is now created in the context so we can fail early and avoid further error checking in various places. - Fix a potential use after free with threaded loops. - The protocol now has a message footer. This is used to pass around global state such as the last registered object serial number. This can be used to detect when a client tries to bind to old (but reused) object ids. This avoids some races in the session manager but also when binding objects. - The zero-denormals CPU flag is now not touched anymore unless explicitly selected by the user. Denormals are avoided in filter-chain now in software. If the zero-denormals are now only configured in the data thread. This should fix issues with luajit. - Configuration parsing will not actually fail on errors. - pw-top now correctly clips unicode characters. - Many places now use a dynamic POD builder to support arbitrary large property sets. - pw-stream now support PropInfo parameters so that they can announce custom properties. - Serial number are now also set on metadata and session-manager objects. * SPA - audioadapter is now smarter when trying to fixate the format. It will use the PortConfig format to fill in any wildcards. This results in the least amount of conversions when the stream can handle it. It also is part of a fix (also requires a session manager fix) for WINE multichannel support. - Fix 5.1 to 2 channels mixing. It was using the volume of the stereo pair on all channels. - Fix some weird volume issues when a source is capturing and channelmixing. - Add stereo to 7.1 upmixing. - The channelmix parameters can be changed at runtime now. - Many improvements to the upmixing algorithms. Rear channels are now constructed from the ambient sound and can have delay and phase shift applied to them to improve spacialisation. The stereo channels can be filtered so that the dialogue is more concentrated in the centre channel. * modules - Module X11 bell received cleanups and improvements. - The module now has a private method to schedule unload later. This simplifies cleanup in many modules. - module-filter-chain now handles arbitrary many ports and control ports. - Fix a bug in RAOP where it was reading from the wrong port. * pulse-server - Nodes with the DONT_MOVE property should fail with -EINVAL when they are moved. - Fix a segfault when playing a sample. - The _FIX flags in pulse-server also now ignore the configured sample format, just like pulseaudio does. - Fix IEC958 passthrough again. It got accidentally broken since 0.3.45 with a fix for another issue. - Fix module-null-sink device.description. * Bluetooth - Don't try to connect HSP/HFP when no backend is available. - Drop patches already included upstream: * 0001-revert-loop-remove-destroy-list.patch * 0002-pulse-server-free-pending-sample-reply.patch - Rebase reduce-meson-dependency.patch. - Enable pulseaudio-setup use on openSUSE Leap 15.4. - Some spec clean-up.- Add 0001-revert-loop-remove-destroy-list.patch: fix MPD crash. - Add 0002-pulse-server-free-pending-sample-reply.patch: fix "fast volume change".- Update to version 0.3.47: * Fix a bug in pulse-server that caused cached notifications to play multiple times. * Remove a check and warnings to catch leaked listeners on the proxy. This might access invalid memory and cause infinite loops in older wireplumber. - Rebase reduce-meson-dependency.patch.- Update to version 0.3.46: * Highlights: - Fix a critical bug in pipewire-pulse buffer size handling that made some apps (MuseScore, ... ) stutter. - Fix a critical bug where devices would not show when the kernel was compiled without VERBOSE_PROCSFS. - JACK clients will now use lock-quantum by default. This makes sure that all dynamic quantum changes are disabled while a JACK app is running. The only way to force a quantum chance is through a JACK app or with the metadata. - Almost all limits on number of ports, clients and nodes are removed. - A Dummy fallback sink is now automatically created when there are no other sinks. This avoids stalling browsers. - Sound sharing with Zoom should work better. A new WirePlumber release might be required. - Many more fixes and improvements. * PipeWire - Update docs with new config overrides. - The rule matching logic was moved to config and code is now shared with pulse-server and JACK. - Add new Romanian translation. - When a quantum is forced with metadata, any node that asked to lock-quantum is ignored so that the quantum change can happen. - Fix a bug where a mixer was removed twice, leading to potential memory corruption. - The port limits on nodes and filters are now removed. Some code was simplified. - Fix a potential leak because listeners where removed while they could be emitted. - Improve context.exec and avoid zombie processes. * Modules - The RAOP module now has a default latency of 2 seconds, like PulseAudio. - The echo-cancel module now uses the plugin loader to load the backends. This makes it possible to add custom, out of tree, echo cancel plugins. * Tools - Improve help of pw-link. - Output to stdout and error to stderr. Use setlinebuf for stdout to improve piping between apps. (#2110) * SPA - Improve removing sources when dispatching. Also improve performance now that a destroy loop can be removed. (#2114) - Fix an fd leak in the logger when logging to a file. - Improve loop enter/leave checks and support recursive loops. * pulse-server - Clamp various buffer attributes to the max length. Fixes some issues with various applications. (#2100) - Module properties are now remapped correctly from their pulseaudio variant to the PipeWire ones. - Fix module index in introspect. Use the right index when loaded from our internal modules. (#2101) - Improve argument parsing and node.description. (#2086) - The sink-index should now be filled in correctly when playing a sample. (#2129) - module-always-sink is now implemented and loaded by default. (#1838) - Add support for loading some modules only once. - Module load and unload now does extra sync to make it appear synchronous, like in PulseAudio. This improves sounds sharing in Zoom. * ALSA - Fix critical bug where alsa devices would not show when the kernel was compiled without VERBOSE_PROCFS. - Some corner cases were fixed in the ALSA timing code. When the capture node is follower, it will now not try to read too much data and xrun but it will instead produce a cycle of silence. - Various fixes and improvements to make ALSA devices resync to the driver more quickly and accurately. * JACK - Add an option to name the default device as system to improve compatibility with some applications, - Use lock-quantum by default. This makes sure that all dynamic quantum changes are disabled while a JACK app is running. The only way to force a quantum chance is through a JACK app or with the metadata. - It is now possible to do IPC calls from the data thread. Note that this is a very bad idea but required for compatibility with JACK2. * GStreamer - GStreamer sink will now set a default channelmap to make it possible to remap to the channel layout of the device. - Update patch for further uses of "new" meson features used by upstream: * reduce-meson-dependency.patch- Run ldconfig for pipewire-libjack-0_3 * The JACK libraries are made available system-wide using /etc/ld.so.conf.d. Hence, ldconfig should be run to make sure the dynamic linker picks them up.- Update to version 0.3.45: * Highlights - Zoom, telegram and other apps should be able to play sound again. - Implement a better way to force and lock JACK buffersize. - Default sink and source names and properties are improved. - The config loader can now load and merge fragments in conf.d directories for easier user configuration of config files. - Many small bug fixes and improvements. * PipeWire - pw-cli can now also send Commands to nodes. This can be used to Suspend a device, for example. - The eventfd was removed from loops and invoke is now used to stop the loop, this saves an fd. - New Alpine CI target to test musl builds, various build fixes. - Add force-quantum and force-rate properties. - The config loader can now load and merge fragments in conf.d directories. (#207) - resource error methods can be called without a resource and then just log an error message. - link-factory can now also work from the config. (#2095) * modules - module-simple-protocol has better argument parsing and can handle channelmap now. (#2068) It's also possible to configure latency and rate. - The native protocol now does extra checks for invalid data. (#2070) * ALSA - TI2902 chips as found in various Behringer cards should have inputs again. - Better handling of busy devices in udev, retry when the inotify close event is emited. * SPA - plugins now handle alignment properly and only expect the max alignment required for the CPU. (#2074) * Bluetooth - SBC-XQ is now enabled for the JBL Endurance RUN BT headset. - Support for non-hexadecimal XAPL version strings to improve compatibility. - Use HCI commands again to probe the adapter msbc capability. This improves compatibility with some adapters. (#2030) - Set the right startup volume. - Better A2DP source idle handling. - Fix a timer bug in SCO sink that could cause busy looping. * pulse-server - A playback issue when the tlength > maxlength was fixed. (#2069) This affected Zoom and other applications. - The STREAM_BUFFER_ATTR command is now implemented. - Module names are improved. (#2076) - Many small fixes and improvements. - Fix a pavucontrol crash with invalid channels. (#1442) * JACK - Use the new force-quantum and force-rate properties in the JACK API to switch quantum and ensure it can't change for the lifetime of the JACK app. (#2079) - Rebase patch: * reduce-meson-dependency.patch- pipewire should be a true dependency, not just recommended (e.g., so that any setup that use no-recommends, like MicroOS, also work)- Add patch to reduce the meson requirement so we can build pipewire with Leap 15.3. This will be dropped as soon as Leap 15.4 is released or if it becomes too hard to maintain (whatever happens before): * reduce-meson-dependency.patch- Update to version 0.3.44: * Highlights: - It is now possible to run a minimal PipeWire server without a session manager, enough to run JACK clients. - The maximum buffer size is now configurable and can be larger than the previously hardcoded limit of 8192 samples. When using high sample rates, the larger buffer size can avoid xruns. - The default maximum latency was reduced from 170ms to 42ms. This should improve overall latency for application that ask for a large latency, such as notifications. - Better JACK compatibility. Patchbays should now get less confused about ports appearing and disappearing. - Fix some bluetooth crashes. - Fix some races in ALSA device detection. - Many bug fixes and improvements all over the place. * PipeWire: - Bump the meson requirement to 0.59.0. - pw-top now reports correct times for filter-chain and loopback. - max-quantum is now also scaled with the rate. A new quantum-limit property was added as a hard limit for the quantum. This makes it possible to configure for larger than 8192 buffer sizes. Note than many JACK applications have a hardcoded 8192 limit. - The max-quantum was reduced to 2048, This gives a 42ms default latency. - pw-filter can now return a NULL buffer from _get_dsp_buffer() - Add a PIPEWIRE_RATE and PIPEWIRE_QUANTUM env variable to set the graph rate and the graph quantum and rate respectively. - Fix a potential file descriptor leak in the connection. - A new minimal.conf file was added to demonstrate a static setup of a daemon that doesn't require a session manager and is able to run JACK applicaions. - Nice levels are now only changed on the servers, not the clients. - Add an option to suspend nodes when idle. - Make it possible to avoid quantum and rate changes with pw-metadata. This is essential in a locked down system. - Handle mixer port errors better and fail to create the link instead of silently not working. - Nodes that are moved to a driver now have all the linked nodes moved as well. This makes it possible to run some graphs without a driver, such as paplay -> zita-j2n. - pw-cli and pw-dump can now also list objects by name, serial and object.path using glob style pattern matching. * modules: - filter-chain can now also configure parameters by index. - Fix the client name of module-protocol-simple. - module-rtkit was merged into module-rt. This makes it easier to ship a default config that works on more systems by default. - module-adapter can now configure the adapter node from the config. Previously, this was a task only performed by the session manager. - module-metadata can now also create metadata object from the config file. - The ROC module should now work again. - An X11-bell module was added to handle X11 bell events. - filter-chain and loopback modules now have better unique default names for the streams, which makes it possible to save and restore their volumes independently. - module-echo-cancel now has properties to control the delay and buffer size. * ALSA: - The monitor names are now correctly parsed. - The default period size for batch devices is limited now to avoid large latency. - The unused min/max-latency properties were removed. - Internal latency is now also configurable with params at runtime. - The udev rule for TI2902 was removed because it causes problems. - Fix a race where some devices would sometimes be missing. - Add some more timeouts to work around a race in udev device permission changes when switching VTs. * SPA: - Fix potential infinite loop in audioconvert. - The spa-resample tools can now also use optimised implementations. - Fix a potential crash in resampler. - audioconvert can now also handle F64 formats. - The channelmixer now does normalization by default to avoid clipping when downmixing is active. - The channelmixer will now generate LFE channels when the lfe_cutoff frequency is set, even when upmix is disabled. - The channelmixer will now always generate FC when the target has it. - Adapter now reports latency correctly, even after linking the monitor ports. - Reduce memory usage and preallocated memory in some of the audioconvert nodes. - Many properties are now exposed in adapter, such as the resample quality. - The resampler and channelmixer can now be disabled. * V4L2: - pw-v4l2 now also works for ffplay. - Take product names from udev now that the kernel returns generic name. * JACK: - The jack pkgconfig file now has the jack_implementation=pipewire variable to be able to distinguish jack implementations. - jconvolver now starts correctly again. - The object.serial is now used for the port_id. This makes it easier to track old objects in the cache. - Add a dummy jacknet implementation. - A bug in the port allocation was fixed that would make it impossible to allocate ports at some point. * Bluetooth: - Bluetooth profiles are now saved properly by the session manager. - Improved profile detections, increased timeouts for slow devices. - Implement HFP call indicator for improved compatibility. - Handle the case where bluez does not set the adapter or address properties on the device instead of crashing. - Improved support for setting the profile from the session manager. * pulse-server: - Monitor sources now have the device.class=monitor for better compatibility. - Behaviour after seeking is improved. The algorithm for requesting bytes from the client was simplified and improved. - module-ladspa-sink implements the control argument now. - A potential memory leak in the message queue was fixed. - Use the object.serial for the pulseaudio object index. The index is not supposed to be reused and this would cause problems with some clients. - Servers should now again be able to listen in IPv4. - module-x11-bell was added. - There is now support for per-application quirks and properties in the pipewire-pulse.conf file. Per-application latency and buffering properties can also be configured. - Fix a regression in telegram sounds not playing. - Drop patches already included upstream: * 0001-alsa-improve-rate-selection.patch * 0001-audioconvert-avoid-infinite-loop.patch * 0001-bluez5-dont-create-device-if-adapter-is-missing.patch * 0001-bluez5-handle-missing-device-and-adapter-in-quirks.patch * 0001-jack-remember-last-return-from-jack_get_buffer_size.patch * 0001-loop-invoke-immediately-when-loop-is-not-running.patch * 0001-merger-also-reconfigure-when-monitor-changes.patch * 0001-pulse-server-show-monitor-sources-with-device_class_monitor.patch * 0001-pw-metadata-handle-NULL-props-from-metadata-object.patch * 0001-raop-fix-errno-check.patch- Add several more patches from upstream - BlueZ may be missing adapter information for devices in some cases. Ignore devices without specified adapter: * 0001-bluez5-dont-create-device-if-adapter-is-missing.patch - Fix a case when pipewwire could never call callbacks or even block forever when loop is not running: * 0001-loop-invoke-immediately-when-loop-is-not-running.patch - Reconfigure when monitor changes * 0001-merger-also-reconfigure-when-monitor-changes.patch - Handle NULL props from metadata object * 0001-pw-metadata-handle-NULL-props-from-metadata-object.patch - Improve rate selection so we don't select an invalid rate when the default is set or the card is already opened in an unsupported rate: * 0001-alsa-improve-rate-selection.patch- Add several patches from upstream - Avoid an infinite loop when enumerating params of the converter: * 0001-audioconvert-avoid-infinite-loop.patch - When the device or adapter is NULL, skip the quirk checks instead of crashing: * 0001-bluez5-handle-missing-device-and-adapter-in-quirks.patch - Remember the last returned value from jack_get_buffer_size and only emit a buffersize change event when something new is configured. This fixes startup of jconvolver. * 0001-jack-remember-last-return-from-jack_get_buffer_size.patch - Better emulation of pulseaudio which shows monitor sources with device.class=monitor so now pipewire does that too: * 0001-pulse-server-show-monitor-sources-with-device_class_monitor.patch - Fix an errno check: * 0001-raop-fix-errno-check.patch- Added more baselibs packages and their dependencies- Update to version 0.3.43: * Highlights: - Flatpak apps such as Ardour can now remove links again. - Many fixes to pulse-server. Memory usage should be improved. Some crashes are fixed. Underrun handling should work better. Better compatibility with GStreamer based applications after seeking. - Many of the samplerate and quantum changes bugs in previous releases were fixed. This fixes some issues where the microphone would fail to work. - Many more small fixes and improvements all over the place.- Revert the merge of spa-plugins and modules into the library package. - Move some of the files between packages where they make more sense. - Rename the modules subpackage to modules-%{apiver_str} so it can be versioned more easily (there still are some unversioned files in the package, but it's a step in the right direction)- Remove unneccesary Conflicts with packages that are Obsoleted- Update to version 0.3.42: * Highlights - Fixes a bug in pulse-server underrun handling that broke qemu and orca. - A fix was added to pulse-server to handle quantum changes gracefully. - Fix module-echo-cancel again. - Fix a bug where the bluetooth headset capture was producing noise.- Remove the dependency on wireplumber-audio which was pulling in pulseaudio. We'll require wireplumber-audio directly from wireplumber. - Remove pipewire-rpmlintrc since the filters don't apply anymore- Merge the pipewire-spa-plugins-0_2 and pipewire-modules packages into the libpipewire package just as the fedora packages do and simplify the filelist a bit by using some recursive listing instead of explicitly listing all files.- Use the gcc9-c++ compiler in SLE/Leap so it builds successfully.- Update to version 0.3.41: * Highlights - Improved compatibility for flatpaks. Flatpaks with newer PipeWire version can connect to an older server in all cases. - A new RAOP module was added to stream to Apple Airplay devices. - OBS can now capture from the monitor devices again when using WirePlumber. - Improved JACK compatibility. Improved stability in Carla and Ardour when changing buffer size. Improved latency calculations and playback latency in Ardour. - Improved pulse-server handling of underruns and buffer size changes. - Many bugfixes and improvements. * PipeWire - The systemd service files now have better names. - client.access permission checks are improved. - Fix some memory leaks in error paths. - Objects now have a global serial number that is unique for the lifetime of the server. - Make clock.rate, clock.allowed-rates and clock.quantum runtime tunable parameters with the settings metadata. - Add some additional memory checks in client-node to avoid sending invalid memory to clients. (#1859) - Improve buffer memory allocation. If one of the nodes is a remote node, ensure we only use memory that can be shared. - Version checks when binding to objects is removed. This means that newer clients can now bind to older servers, which is a typical case for a flatpak. - A bug in the latency calculations was fixed where it would in some cases report the wrong minumum latency. * modules - module-echo-cancel has voice-detection enabled now. - module-raop-sink and module-raop-discover to stream audio to an Apple Airplay device. - module-filter-chain now has preliminary support for LV2 plugins. * SPA - The audio resampler now has improved buffer size calculations. In some cases it was too small and would cause distortions. - More checks are done when doing volume changes so that the channelmap is correct. - Audioadapter now exposes most config options with params so that they can be adjusted at runtime. - The resampler can now calculate the expected input buffer size before receiving the first buffer, which avoids some confusion when starting streams. - Support was added for some 10bit video formats. - MONO channel handling was improved. - Most plugins now set a clock name and this is configurable where it makes sense. The clock.system.monotonic clock name is used for most plugins that use the system clock for timing. * pulse-server - implement module-raop-discover - Use STREAM_CAPTURE_SINK property when capturing from a monitor source to better inform the session manager. This fixes some issues where OBS would capture from the microphone instead of the output monitor. - Limit the amount of cache messages to 16MB and don't add large memory blocks to the cache. This should fix some excessive memory usage that people reported. - Fix a potential memory leak when cleaning up a client. - Do some additional checks to avoid buffer overruns. - Improve recovery from underruns better. (#1857) This improves seeking in gnome-music. - Improve recovery when the quantum is forced larger that the stream configured latency. - The prebuf state is now handled correctly. * JACK - A per type object cache is now implemented. This ensures that port objects remain valid for a longer time because many JACK applications inspect objects after they are destroyed. This improves catia/carla compatibility. - Recompute the latencies when the buffer-size changes. Fix some cases where we would end up with negative latencies. - Handle regcomp errors to avoid some crashes later. - Latency calculations are improved a lot. - More care is taken to not call a process callback while a buffer size change is pending. This fixes some crashes in Carla, which expect that all clients are paused when one handles the buffersize callback. - Loopback links to a client are now handled correctly and without latency. This fixes playback latency in ardour6 (#1839) * ALSA - ALSA devices now keep track of the samplerate of the card and ensure that all PCM use the same rate. This is a workaround for a kernel bug that is fixed in 5.16. - Refactor the ALSA plugin a little. - The ALSA plugin now reports correct delay for a capture PCM. (#1697) - The ALSA nodes now expose all config options with params that can be changed at runtime. - The ALSA node has a configurable clock name. Adaptive resampling to match clock rates is avoided when the driver has the same clock name as the ALSA node. This can be used to link alsa devices together with a word clock.- Drop server packages from baselibs.conf. Only the client parts are needed in there.- Minor aesthetic changes in the spec file- Enable AAC support for Leap 15.4+- Replace the Recommends wireplumber to a Suggests since there's already a Require dependency on a pipewire-session-manager and when in doubt the Suggested package is selected.- Unconditionally enable AAC support now that fdk-aac-free is in Factory (adapted from SR 936225 by Neal Gompa )- Makes sure if we're using wireplumber and pulseaudio that we don't enable the audio devices in pipewire by requiring wireplumber-audio or pulseaudio if wireplumber is installed - Better integration with PulseAudio (bsc#1188516) made by tiwai: * Add Requires pulseaudio-setup package for the extra setups in the %post section * Add the missing Recommends alsa-plugins-pulse to pipewire-pulseaudio package- Update to version 0.3.40: * Highlights: - Producers and consumers can now incrementally negotiate a format by narrowing down the options. This can be used to select an optimal combination of format and modifiers. - Driver nodes such as the consumer of a headless compositor can now throttle the speed based on a new trigger_done event. - Headless compositors can now signal a damage event to consumers to start the processing of the graph. - Compatibility improvements in JACK. - Draining and resuming is now working correctly in pulse and alsa. - Many bugfixes and improvements. * PipeWire: - Many BSD fixes. - clang compilation fixes. - Fix map implementation on big-endian machines. - Improve tracking of param changes in pw-stream. - Add support for renegotiation. With this change, producer and consumer can incrementally renegotiate a format until it is fixed. This will be used to do complex negotiation of DRM modifiers. - Add a trigger-done event in the stream. This can be used to know when processing of the complete graph has finished after issuing a trigger_process() and it can be used to throttle processing. - Add a RequestProcess node event and command. This can be used by non-driver nodes to suggest to a driver to start processing. One case is where a compositor can emit this event as a result of a screen update to let the headless compositor start an update. - Fix zeroconf sample format. - pw-mon outputs to stderr now and has colors. * SPA: - Fix compilation on ppc and armv7. - Fix port type check for ALSA seq midi ports so that they are not falsely listed as hardware. - Fix crash when running SSE code on unsupported HW. - The libcamera plugin was rewritten. It now supports hotplug, format enumeration and an easier to read codebase. - Fix compatibility some more for cards with 64 channels. * pulse-server: - Flush data in pause in combine-sink to avoid stray audio fragments. - Fix a race where not all objects were removed correctly. - The latency calculations and setup was improved to more closely match pulseaudio behaviour. PULSE_LATENCY_MSEC should now resemble pulseaudio more closely. - The drained reply is now sent only once and new data will be accepted once the drain completes. - Fix a potential crasher bug where the stream started processing before the setup was completed. - The server will now drop the client connections when the pipewire connection is lost. * JACK: - Rework the jack_port_get_buffer() method to return the same memory when called multiple times during the process() callback. This makes things work on a new Hydrogen. - Add an option to disable showing the monitor ports. - JACK ports are now sorted per node/client and port_id. This should more closely match JACK behaviour and avoid random port order. * v4l2: - Fix v4l2 LD_PRELOAD script. - Make sure we destroy the proxy when the global is destroyed. * ALSA: - _prepare should exit the draining state. - Fix the precision of the _delay function by taking into account the amount of queued samples are the correct samplerate. - Drop patches fixed upstream: * 0001-cpu-fix-compilation-on-some-architectures.patch * 0001-map-make-_insert_at-fail-on-a-removed-item.patch * 0002-map-use-uintptr_t-for-the-next-pointer.patch- Recommend wireplumber so it's preferred to pipewire-media-session- Add patches from upstream to fix build in s390x: * 0001-map-make-_insert_at-fail-on-a-removed-item.patch * 0002-map-use-uintptr_t-for-the-next-pointer.patch- Use readline-devel instead of pkgconfig(readline) so it can be built in Leap15.3/SLE15-SP3- Fix %systemd_user_post using the now separated pipewire-media-session.service- Update to version 0.3.39 * Highlights - media-session is now moved into a separate module to speed up its deprecation in favour of WirePlumber. - There is now an LD_PRELOAD v4l2 emulation library to run some existing v4l2 applications on top of PipeWire. - Filter-chains should now flush out remaining samples when paused. There is now also the option to let a filter-chain drain so that long filters such as reverbs can fade out properly. - Stability and compatibility improvements in JACK apps. - Better Bluetooth compatibility with more devices. - libcamera plugin improvements. - Many bugfixes and improvements all over the map. * PipeWire - Fix compilation on ARM. - Log topics are added to most modules. - Documentation updates. Many improvements to the layout. Reorganisation of the modules and groups. - Share a work queue for all links and nodes. This removes the need for a separate eventfd per link and per node. - Catch errors in the map implementation. - Add option to compile without dbus support. - Fix biquad frequency. It was using the wrong sample rate. - Fix a potential crash when destroying nodes, in some cases the node would not be deactivated properly. - Add some more helpers for dealing with properties and their values. - Implement flush and reset on virtual sinks/sources. - Make it possible to let virtual sinks/filter-chains run and drain after being idle. - Fix a bug where the quantum could exceed the maximum because it was scaled with the sample rate. - Fix channel_map parsing in module-zeroconf-discover so that the remote channel map is used. - pw-stream errors emitted on the proxy are reported but not fatal any more. They are usually used by the session manager to signal status to the client but otherwise does not really cause an error on the client. - Links now also store the output and input node id in the global properties so that applications can parse and use them regardless of how the link was made. (#1723) - pw-stream and pw-filter now have an event to notify commands. - The echo-cancel module can now operate on larger quantums. - pw-cat now uses the right metadata to find the default devices in --list-targets. * media-session - Don't try to remix unpositioned streams when linking. This ensures that linking to Pro-Audio nodes does not remix the stream channels but links them as they are, one by one. - media-session is now moved to a separate module to accelerate its deprecation in favour of WirePlumber. * SPA - Many libcamera improvements, handle MemFd buffers, handle errors gracefully. - Small improvements to make interface fall-backs easier to implement. - Add support to enable flush-to-zero and denormals-are-zero to avoid high CPU usage when dealing with denormals. - AUX13 channels are no longer reported as AUX12. (#1727) - Devices with more than 32 channels in Pro-Audio mode now only uses AUX channels. - Improve windowing function of the resampler to reduce aliasing and improve the quality. * JACK - Port connect callbacks will not only be emitted after the port has negotiated buffers, which improves compatibility with applications that try to use the port right after the callback (jack_midi_latency_test). - Fix crash when midi ports were removed and being monitored, like in Ardour. * pulse-server - The pulse tunnel will now use the specified format/rate/channels. - Improve lookup of default source and fall back to the monitors when no sources are available. - Mark some nodes as network nodes so that we can set the NETWORK flag correctly. * GStreamer - The GStreamer element not releases the buffers in the stream again in all cases so that they can be reused by other streams. * v4l2 - Add a v4l2 LD_PRELOAD library to emulate v4l2 system calls on top of PipeWire. This is tested with firefox and GStreamer and is known to not work with Chrome. * Bluetooth - AAC compatibility improvements. - Disable hardware volume for "Tribit MAXSound Plus" and "SoundCore mini". - Add quirk to disable faststream. Disable faststream on "FiiO BTR3". - Add a dummy AVRCP player to improve compatibility with some devices. - Remove patch: * 0001-fix-compilation-on-ARM.patch - Add patch from upstream: * 0001-cpu-fix-compilation-on-some-architectures.patch- Add patch from upstream to fix compilation on ARM (boo#1191600): * 0001-fix-compilation-on-ARM.patch- Update to version 0.3.38: * Highlights - Topic based logging was added to improve debugging. - An off-by-one error was fixed in the audio resampler that could cause distortion when downsampling. - Various bluetooth compatibility improvements. - More fixes and improvements. * PipeWire - module-pulse-tunnel now has better default latency to make it work better in more cases. There is also an option to configure the desired latency. - pw-cli now has readline support. - Topic based logging was added. Log lines can now be filtered by topic using wildcards. This should improve debugging. - The systemd service files should now have better descriptions. - Fix a crash in module-zeroconf-discover when unloading. - Fix a crash in filter-chain when using unaligned memory. * ALSA - Sync the udev rules and profiles with pulseaudio. - Fix a memory leak. * SPA plugins - An off-by-one error was fixed in the resampler that could cause distortion when downsampling. (#1646) * Bluetooth - Avoid probing the native backend because it might block for DBus activation. This fixes some long startup times. - Fix the kernel version check, 5.14.x kernels should also support mSBC. - Fix FastStream microphone support in more cases. - Add workaround for Intel AX200. - SCO sink should now also work in follower mode. * PulseAudio server - Make the service file require a session manager.- Add BuildRequires: pkgconfig(readline) so pw-cli is built with readline support- Update to version 0.3.37: * Highlights - Capture and playback is now avoided even more on unavailable devices. This should fix some issues where an unusable microphone was selected by default. It should now also again be possible to select an unavailable device as the default. - Native DSD audio playback is now supported. pw-cat can now also play DSF files with the -d option. - JACK stability improvements with buffer-size and samplerate changes in some apps. - Many cleanups and bugfixes all over the place. * PipeWire - pw-metadata -d does not cause an infinite loop anymore. (#1622) - Increase some plugin buffer sizes to fix some issues with many channels. (#1620) - Protect the global plugin list with a lock. Make sure pw_init() is locked. Fixes some issues with concurrent ALSA plugin usage. * media-session - Unavailable devices can be set as the default again. (#1624) - Do a better check if a device has available routes and avoid selecting devices with unavailable routes as default. - Media-session was moved to its own directory. It used to live in examples but it is past the example stage and it interferes with the build options for the real examples. * Bluetooth - The hardware quirk database is now loaded by the plugin instead of the session manager. This makes it also work with wireplumber. * ALSA - The ALSA mixer now handles device removal much better. (#1627) * libcamera - Many fixes and improvement to the libcamera plugin. (#1513) * pulse-server - Improve compatibility with pulseaudio module arguments. - Parse channel_map arguments in module-loopback. (#1486) * JACK - Delay emiting the samplerate and buffersize callbacks until the client is active. This fixes some crashes with Carla and other JACK apps. - Drop patches already included upstream: * 0001-media-session-dont-use-after-free-if-linking-node-removed.patch * 0002-update-version-number-as-well.patch- Add patches from upstream to fix an "use-after-free" error and to set the version number correctly: * 0001-media-session-dont-use-after-free-if-linking-node-removed.patch * 0002-update-version-number-as-well.patch- Update to version 0.3.36: * Highlights - A quick update with mostly only bugfixes and small improvements. - Capture and playback is now avoided on unavailable devices. This should fix some issues where an unusable microphone was selected by default. - MIDI output should not stop randomly now. - The GStreamer elements are much improved, cheese should work a lot better now. - Virtual sinks and sources should now always show up immediately. - JACK processing is now delayed until buffersize and samplerate are emited. This should improve stability of many JACK apps. - JACK transport sync is now implemented correctly so that preroll in bitwig works. * PipeWire - The module dir environment variable can now contain multiple paths. - Documentation now contains dot graphs of dependencies. (#1585) - config min/max/default quantum values are now scaled with the samplerate. - A potential crash was fixed where destroyed memory was still used by a node. This could cause crashes in cheese. * pipewire-media-session - Only allow passthrough for passthrough formats (S/PDIF) for now. (#1587) - Improve bluetooth profile autoswitch. - Don't try to route audio to nodes with unavailable routes. * ALSA - Pass the right AES bits to the alsa device when opening an S/PDIF stream. - Fix a bug in the MIDI bridge port management logic. When a port was added and immediately removed, output would stop. * GStreamer - The GStreamer source now handles the flushing state correctly. - All blocking operations now have a 30 seconds timeout, to avoid infinite locks. * Plugins - V4l2 Device formats and controls are now passed on the node, just like with audio devices. - audioconvert now also exposes the softMute property. * JACK - Improve stability when changing buffer size and sample rate dynamically by pausing the processing until the application has handled the callback. - Improve handling of timebase master. When the master was moved to another driver, it did not attempt to become a new timebase master on the new driver. (#1589) - Implement transport sync to make preroll in bitwig work. (#1589) * pulse-server - Fix an issue where virtual sinks/sources would not show up immediately. (#1588)- Update to version 0.3.35: * Highlights: - S/PDIF passthrough over optical or HDMI is now implemented. - Some critical fixes to MIDI, draining of streams and various modules. - skypeforlinux should work better now after adding it to the quirks database. - Bluetooth codecs are now in separate plugins to make it easier to ship them. * PipeWire: - Drain was fixed in pw-stream. In some cases it would not clear the drain state correctly. Fixes the issue where speaker-test would only play one channel. - Loopback connections to a driver will now activate the driver. This fixes an issue where MIDI connections between devices or some applications (puredata) would not get any MIDI messages. (#1559)x. - The audiomixer can now mix more formats. Together with the passthrough improvements this can be used to avoid conversions to/from the DSP format in some cases. - Make sure we idle drivers when removing a node from it in all cases. JACK clients could keep a driver node busy. - Add new methods to accumulate object info. The old one was difficult to use when applications need to accumulate multiple changes. - A new interface to load modules has been added. Plugins can use this to ask the host (PipeWire) to load spa plugins. - Increase param buffer size to handle larger params. Nodes with a large number of channels would sometimes not have properties. (#1574) - Concurrent link negotiation that caused some links to not work, is now avoided. This fixes monitor ports in Ardour6. - Small tweaks to how the quantum and rate are handled when nodes move between drivers. Make node.lock-quantum work with node.latency * PipeWire modules: - The convolver plugin in filter-chain has been optimized some more. - The echo-cancel stream properties were improved so that it actually can remember the streams it links to. (#1557) - module-pulse-tunnel had the buffer attributes wrong and would cause high latency with older pulseaudio servers. (#1434) - module-roc had the properties configured wrongly, which would cause it to not work at all in most cases. (#1538) - There is now an example of a 7.1 virtual surround sink using the hesuvi impulse responses. - The convolver now supports dirac pulses as the IR. * ALSA: - UCM config is now cached per device, using up less memory. It also temporarily works around a problem in alsa-lib that is now being patched and rolled out. Should stop devices from disappearing when logging out and back in. (#1553) - Fix the MIDI clock rate matching. It was too sensitive to small changes and would spiral out of control and break MIDI rather quickly. * pipewire-media-session: - The media session can now save and restore IEC958 (S/PDIF) codecs for the sinks. - Passthrough of IEC958 (S/PDIF) content is now possible. If the client and the sink contain a compatible set of codecs, an exclusive connection can be made between client and sink to pass the encoded S/PDIF content directly to the device. - Use new introspection info update methods to suspend nodes in all cases. Sometimes, nodes would fail to suspend because the state info was not evaluated. - The media session can now work in non-DSP mode, which will try to avoid any audio conversions between client and device when possible. But, this will also disable compatibility with JACK applications. * Bluetooth - Bluetooth codecs are now compiled into separate plugins which are dynamically loaded. This makes it possible to change the plugin implementation or ship plugins separately without having to recompile the bluetooth module. * PulseAudio server - Delay stream create reply until the stream is linked to a sink/source. - The device-restore extension is now implemented. This makes it possible to configure the IEC958 (S/PDIF) codecs supported by the sink with pavucontrol. - skypeforlinux now uses the same quirks as teams to make the sinks show up in all cases. This fixes the issue of not being able to hear the remote end in skypeforlinux. * JACK - Improve catia and carla compatibility by caching objects a little longer after being removed. (#1531) - JACK ports now notify the negotiated format correctly. - A potential deadlock was fixed when multiple threads would perform a call that would require a roundtrip. - Improve bufsize callback, it should not be called right after doing activate() but only when the buffersize changes later. - Add tweak to disable the process lock. Some older apps might not expect it. (#1576) * Docs - man pages are now generated with rst2man. - DMA-BUF docs were updated. - Documentation updates. - Replace BuildRequires xmltoman with docutils (rst2man) - Update libcamera Buildrequires.- Add BuildRequires: pkgconfig(libcap) since it's being searched by the build scripts. - Replace BuildRequires: pkgconfig(libopenaptx) with libfreeaptx since openaptx has a license issue - Use bcond_with to enable/disable the usage of libcamera (the defaults are not changed: it's disabled in Leap since upstream doesn't recommend enabling it yet and enabled in TW since we can allow some experimental support there) - Changes suggested by darix.- Update to version 0.3.34: * Highlights - Fixes some critical issues with previous release. Such as devices not showing up and default devices being lost. - Support for consumer driver streams to make the producer v-sync to the consumer monitor in a headless compositor setup. - Improvements to routing of streams. - Bluetooth battery status support for head-set profile and using Apple extensions. aptX-LL and FastStream codec support was added. - Internal latency of ALSA devices can now be configured. - A fast convolver was added to the filter-chain to implement virtual surround sinks or reverbs. * PipeWire - Add support for streams that are driver nodes for the graph. This was already possible for source streams but it is now also possible for playback streams. This can be used to let a producer v-sync to the consumer monitor in a headless compositor setup. (#1484) - State files are now stored in XDG_STATE_HOME instead of XDG_CONFIG_HOME. They will still be loaded from the config home if they are not in the new state home, to ease migration. - Set a driver on inactive nodes to make transport work in xjadeo. (#1491) - Fix parsing of filter-chain controls. - A new FFT based convolver was added to module-filter-chain. It uses a 0-latency 2 stage convolver with small FFT for the head and a large FFT for the tail of the convolution. A convolution can be used to implement IR based reverbs, HRIR surround sound or other convolution based operations. An example HRIR virtual surround sound sink has been added as well. - module-filter-chain was reworked a bit to support more config options for the plugins. - Endian conversion and alaw/ulaw formats are now supported for streams. - pw-cat will now suggest a samplerate for the graph. - SPA_PLUGIN_DIR can now search in multiple paths separated with a ':'. - Passthrough mode has been worked on and has been partially merged. S/PDIF definitions have been added and ALSA devices updated to report and configure S/PDIF formats. The session manager changes to fully configure and enable passthrough mode will hopefully be merged next time. - Fix a race in pw-stream where it would not always emit the right events. * ALSA - Fix volume changed check. It was checking against the wrong value and this could cause rounding errors. - The ALSA plugin now also uses RT scheduling. - Fix the behringer UMC202 usb device id, it was using a generic TI chip ID that caused problems. - Fix USB devices that don't show up anymore. Use an ALSA workaround to fix this. (#1478) - Add a rule for the new firmware of Sennheiser GSX 1200. - ALSA sink and source can now use ProcessLatency param to configure the internal latency. The latencyOffsetNsec property is also exposed so that the latency can be adjusted in pavucontrol as well. * media-session - Fix a critical issue where the default device was not remembered anymore when it was removed. - Fix the issue where some apps need to be restarted when nodes go away and reappear. - Improve routing of streams. Streams that have a specific target set will now be moved to the target when it appears instead of staying on the fallback. - Small memory leak fixes. - Try to switch back to the user selected profile after finishing a Bluetooth recording. * Bluetooth - Add support for HF indicator 2 battery status. - Add support for XAPL battery status. - Set the Communication intended role for HFP profile. - Enable SBC-XQ by default if not disabled by quirks. - Fix some potential crashes due to excessive polling. - Add aptx-LL codec and enable duplex for aptx-LL devices. - Add FastStream codec. This is a codec that can use a duplex SBC channel. * PulseAudio server - Suggests a samplerate for the graph. - Support for handling S/PDIF (IEC958) formats was added. This will start working when the session manager supports configuring streams and nodes in passthrough mode. - Be smarter when handling devices without a negotiated format yet so that they are visible as well. This makes virtual devices show up immediately. * ALSA plugin - Now suggests a samplerate for the graph. * JACK - The jack.pc file can only be generated with meson >= 0.59.0. When the jack-devel option is enabled, it will generate an error with older meson. - Small stability improvements when connecting/disconnecting in Ardour.- Update to version 0.3.33: * Highlights - Better support for virtual sinks/sources for Pro Audio profile. - Better DMA-BUF format modifier negotiation. - Support multiple sample rates in the graph. Not enabled by default yet. - Bluetooth can now automatically switch between headset and audio profile. - Documentation updates. - Many improvements and crasher fixes. * PipeWire - Make AUX channels an official channel map, use this for the PRO audio profile so that we can name the channels. This make it possible to define virtual sources and sinks for Pro Audio devices in a more reliable way. - Fix scheduling of some virtual sinks/sources. (#1407) - Fix potential corruption of ringbuffer because of multiple concurrent writers. This might be the cause for many reported crashes. (#1451) - Don't place sockets in $HOME. (#1443) - Improve DMA-BUF negotiation. Add a flag to avoid fixation of a property so that producers can negotiate more efficiently. This is used to negotiate DMA-BUF modifiers, which should make more efficient use of the GPU. (#1084) - Add support for multipe sample rates. The graph can switch when IDLE to one of the supported rates. Add an option to lock the rate as well. This is not enabled by default yet because of driver bugs that need to be worked around first. - Add node.lock-quantum property that can be used to lock the quantum in place. - Improve latency reporting in the loopback module. - Make new client-node method to send the peer port id to the mixer. This can be used to know where the buffers entering the mixer are coming from. (#1471) * Tools - pw-top should now also correctly show bluetooth devices. (#1540) * media-session - Handle unset of the default node. - Added a module that can switch the bluetooth profile to headset profile when a stream wants to record from it. * JACK - Only call the jack callbacks when the client is active. Some JACK applications don't expect callbacks before the client is active and crash (x42-dpl). (#1461) - Emit client unregister event. - Add per-client match rules in the config file to set app specific configuration and tweaks. (#1456) - Use peer_id to implement jack_port_get_buffer() from one of our peer ports to get the data before it enters the mixer. Makes the capture monitors work in Ardour6.8. (#1471) * Bluetooth - Add some broken kernel versions to the mSBC blocklist - Avoid looping and consuming CPU when we can't write to the BT socket. - Use libfreeaptx instead of libopenaptx. - Fix rounding errors in HW volume conversion. * PulseAudio server - implement module-switch-on-connect to emulate pulseaudio behaviour of new devices. Some desktop environments expect this behaviour and break otherwise. - Fix stream cleanup, make sure the stream is stopped before destroying it. Might be cause for some of the reported crashes. - Update message API to use the JSON format. * Other - Many documentation updates. - Many cleanups and small improvements. - Support the latest libcamera version. (#1435) - Drop pipewire-fix-libcamera-build.patch, merged upstream.- Move with-{alsa,jack,pulseaudio} from the media-session package to the packages that implement each support.- Add patch pipewire-fix-libcamera-build.patch: fix build with latest libcamera. - Do no build libcamera support on Leap 15.3 or lower (too old libcamera) and change name of BuildRequires from camera to libcamera. - Update minimal version for alsa buildrequires.- Update to 0.3.32: * Highlights - Real-time priority handling for threads was reworked. Freewheeling will now drop RT priorities to avoid being killed. - Problems with filter chains and echo-cancel being linked in a loop was fixed. - alsamixer should now be able to see the mixer controls again. - JACK has seen some latency reporting improvements that make Ardour report latencies correctly. - Many bugfixes and improvements. * PipeWire - Fix a bug in the neon audio resampler code. - There is now a node.link-group property to relate linked streams. this can be used to track the dataflow with coupled streams. - Fix a crash when recalculating latency on a destroyed port. (#1371) - Filter chains and other modules that create streams can now also be added to the daemon config itself. (#1309) - Fix some potential deadlocks in timerfd. (#1377) - Feedback links are skipped when recalculating latency to avoid loops. - The dummy driver and null-sink now stop the timerfd when following another driver instead of generating useless graph wakeups. - rt.limit was increased to 2 seconds. Some applications got killed because they run lengthy code in the Real-Time thread. (#1344) - Fix s24_32 to float, it was not sign extending properly. (#1393) - The performance of the feedback loop check algorithm was improved a lot, making complex graphs start much much faster. - The zeroconf publish module now doesn't republish nodes every time the volume changes. (#1406) - A potential memory corruption error has been fixed in the loop that could cause random crashes. - Mempools can now be created from multiple threads at the same time. * media-session - Loops in coupled streams are now avoided. (#1394) - Port changes for inactive profiles are ignored now by the default-route module. (#1403) * ALSA - Make sure tha alibpref is not part of the device node name because it is random. (#1362) - Fixed an off-by-one that could cause midi events to end up with a wrong timestamp and thus being discarded by some apps. (#1395) - Fix some memory leaks when destroying a card object. * JACK - Fix some invalid cycle wakeups that could cause JACK application to run with a 0 buffer size. (#1386) - JACK can now use rtkit to manage realtime priorities on threads. - The Real-time priority is dropped when entering freewheel mode to make sure we don't get killed when using too much CPU. - jack_recompute_total_latencies() is now implemented, fixing the latency reporting in Ardour. (#1388) - Fix some overflows in time calculations. - Ensure frame_rate in position is never 0. - Graph callbacks are now emitted as well. * Bluetooth - RTP payload type is now set correctly for aptX, LDAC and SBC, which should improve compatibility with devices that care about this. * PulseAudio server - There is now a quirks database to deal with bad clients. The database is builtin but can be made external later. Teams is now lied to and told all sink/sources use s16 samples to make it show all sinks/sources. Firefox is forced to remove the DONT_MOVE flag on capture streams so that you can move firefox streams with other tools. - The UNDERFLOW warnings are now made into info log messages to not spam the log too much. Many application just let things underrun and PulseAudio did not warn about this either. (#910) * ALSA plugin - The alsa plugin now uses the right metadata for finding the default source and sink, which makes the volume controls reappear. (#1384) * Other - Cleanups in pulse-server and pipewire. - Documentation additions.- Make the jack replacement libraries really replace jack libraries just like Fedora does (adding the path to the pipewire replacement libraries to ld.so.conf.d and conflicting with jack). - Remove the spec code that forced the packages not to provide the jack libraries. They seem to be ready to replace jack libraries now. - Add a pipewire-libjack-0_3-devel package with development files for pipewire's jack replacement. - Enable the libcamera module- Add %pre and %post sections to the new media-session subpackage. - Move the references to the media-session service from the workaround in pipewire's %post section to the workaround in the new subpackage's %post section.- Update to 0.3.31: * Highlights - Fixes for alsa-lib 1.2.5 - New pulseaudio modules: module-avahi-zeroconf, module-pipe-source, module-roc-sink, module-roc-source - JACK has seen massive stability improvements. Locking and correctness wrt to callbacks and has been reworked. Also thread priorities have improved. - Handle various crashes and lockups when running out of file descriptors. - Bluetooth now uses a hardware database to disable non-working features on listed devices. - Scheduling quantum and rate can now be changed dynamically with pw-metadata. - Many bugfixes and improvements. * PipeWire - Improve cleanup of context in error cases. - There is now a pw-test framework for improved unit tests. - Improve property serialization to valid JSON. - Fix some macros to work with better with coverity. - Metadata permissions are checked now. Clients need the M permission on an object to be able to set metadata for it. - The core metadata object will now remove metadata for removed objects, the implementor does not need to worry about that anymore. - Audioadapter will now follow the rate of the graph with the resampler adjusting itself dynamically. - Core now has a metadata implementation helper. A context will expose a metadata with settings that can be changed at runtime. This can be used to change the lowlevel or graph quantum and samplerate on the fly. - An infinite loop was fixed in the audio converter. - Handle out-of-fds more gracefully. Handle truncated control data by dropping the client connection. - Fix profiler crash with many streams. - Improve latency handling in pw-filter. There is now a default handler and a ProcessLatency parameter to simplify latency reporting. - Latency reporting was improved in devices and streams. - And example sink/source was added. * ALSA - hardware mute and volume are now properties on the Route param to make things easier. - More fixes for alsa-ucm 1.2.5. * Tools - spa-json-dump now properly encodes string and keys - pw-dump now shows the correct subject of the metadata. * PulseAudio server - Ensure the node.description is set, some applications crash otherwise (TeamSpeak). - Module loading and unloading was improved. - module-avahi-zeroconf was implemented. - module-pipe-source was implemented - module-roc-sink and module-roc-source was implemented - The maximum amount of connections has been limited to 64, like pulseaudio. - Handle out-of-fds more gracefully. - Fix overflow of read/write pointers. - source and sink state are now decoupled from the monitor state and will report IDLE when not playing anything. * media-session - Port switching should now happen to/from the port that actually changed. * JACK - The locking was reviewed. All callbacks are not emited from the PipeWire thread with the lock released and the process function will be disabled for the duration of the callback. This ensures that no two callbacks are called at the same time. - Improve internal consistency and try to never call callbacks with invalid objects. - Monitor port can now be accessed with system:monitor_%d - client threads are now created with SCHED_FIFO and module-rt is used to create the other RT threads. This should avoid SIGKILL from RTKit in some cases. * Bluetooth - Various bugfixes to improve connections to devices. - Handle delayed UUID connection. - There is now a hardware database that can disable features in listed devices. - Use libusb to detect availability of mSBC. * ALSA - The virtual device name can now also contain a media role. - Add BuildRequires(libusb-1.0) to detect mSBC support for Bluetooth. - Move media-session to a separate package (similar to Fedora), allowing to switch to another session manager.- added pipewire-alsa to baselibs.conf pipewire-alsa-32bit is needed to run BIT.TRIP Runner 2 from Steam, which is a 32bit application and uses ALSA.- Move %{_udevrulesdir}/90-pipewire-alsa.rules to the main pipewire package (boo#1187108)- Update to 0.3.30+git~342ae0b64 (55 commits after 0.3.30) in order to include https://gitlab.freedesktop.org/pipewire/pipewire/-/merge_requests/748 and https://gitlab.freedesktop.org/pipewire/pipewire/-/merge_requests/749 to fix building on Leap 15.3- Update to 0.3.30 * This is a quick emergency release to fix some severe problems with the previous release. * Highlights - Recording from a monitor port should work again. - JACK applications should now be more stable again. - Freewheeling should not lock up anymore. - Fix lockups in many pulseaudio apps. - module-echo-cancel was implemented in pipewire-pulse - Many other stability fixes. * PipeWire - Improve module path logic. - Improve logger formatting * PulseAudio server - Make sure to pass 64 bits values for time on ARM 32 bits to avoid protocol errors. - Avoid a crash when unloading module-combine-sink. - Avoid overflow in requested bytes, resulting in stalled audio. - Implement module-echo-cancel. * Bluetooth - Handle latency parameters instead of failing. * JACK - Fix locking in many places to avoid deadlocks and crashes. - Fix port rename. - Stop freewheeling correctly instead of deadlocking.- Update to 0.3.29 * Highlights - Latency reporting is now implemented. - Many documentation updates and cleanups. - module-combine-sink was added to PulseAudio server. - Better handling of multichannel input profiles. - Fix 100% volume issue when monitor suspends or profile changes in some cases. - Bugfixes and crashes * PipeWire - A new module-rt was added to acquire real-time scheduling priviledges without using RTKit. - Documentation fixes and updates. Docs are now using a custom theme. - There is now a MANDATORY flag on properties that influence how properties are filtered. - Filter-chain now parses the LADSPA_PATH correctly when it contains a colon separated list. - Move `#pipewire` IRC channel to oftc.net. - Fix an error where param changes were not emited in all cases. - Implement Latency reporting. Latency values are propagated through the graph so that each node knows the latency to the output/input device. Synchronization in pw-stream has been updated to use this. - Some more upmix cases are added so that LFE, SIDE and REAR can be generated from a mono channel as well. - pw-stream and pw-filter will now emit the process event from the real-time thread in a safe way, potentially avoiding some of the harder to debug crashes. - Fix potential stack overflow with serialize_dict. - Add PIPEWIRE_NO_CONFIG to run without custom config files. - The WebRTC echo canceler was added. Next versions will integrate this better. * PulseAudio server - module-combine-sink was implemented. - Fix some segfaults when DBus connections fail. - Support for listening on IPv6 was added. - Fix a bug where many flushes could result in requests for too much data from the client, causing sync, latency and garbled sound problems after many seeks. * ALSA - Also probe input paths for multichannel mappings. This makes multichannel input ports show up in more cases. - Fix headphones/front volume issue on some cards. - Fix max volume issue when profile changes. - Fix issue with UCM local config that was not available when the device was opened in the server but the UCM was opened by the session manager. Fixes alsa 1.2.5 compatibility. * JACK - Implement latency reporting with the new Latency params. - Add BuildRequires: pkgconfig(webrtc-audio-processing) which is required by the new WebRTC echo canceler. - Remove patch which is already included: * 0001-alsa-mixer-only-use-switch-to-mute-Front-in-the-Headphone-path.patch- Add patch from upstream to use the independent switch to mute Lineout or Speaker instead of setting the volume, which on some soundcards might be shared by Headphone and Lineout or Headphone and Speaker (fixes boo#1186572): * 0001-alsa-mixer-only-use-switch-to-mute-Front-in-the-Headphone-path.patch- Introduce a workaround for systems where %systemd_user_post didn't enable the user services correctly due to different reasons . This workaround is only executed once, and only if it's really needed. In order to execute only once a lock file is created in /var/lib/pipewire. The lockfile can be removed when the workaround is removed. Everyone who upgraded their TW system between (aprox.) the 14th of January and the 16th of March and who didn't enable the services manually is affected by this. It also happens for everyone who installed a new TW system since (aprox.) the 14th of January and also for everyone doing a new installation of SLE15-SP3 / Leap 15.3 from the iso (new installations using online repositories will work fine once the fix in systemd-presets-common-SUSE is released). Fixes boo#1184852, boo#1183012 and boo#1186561.- Update to 0.3.28 * Highlights - Freewheeling was implemented. This makes it possible to export projects in ardour. - A new powerful filter-chain module was added that can be used to created all kinds of filter-chains from ladspa and builtin plugins. - Many more pulseaudio modules are now implemented: module-ladspa-sink, module-ladspa-source, module-pipe-sink, module-tunnel-sink, module-tunnel-source, module-zeroconf-discover - Fix a bug where devices would not appear after logout/login. - Fix a bug where the volume was reset to 0 and devices would have no audio. - Config files are now installed in the data dir, system overrides in /etc/pipewire and $HOME are checked first. * PipeWire - Implement freewheeling for JACK clients - Add filter-chain module that can be used to construct arbitrary graphs from ladspa and builtin plugins. - Add new property to easily set algorithm params - Add module-pulse-tunnel to tunnel audio to and from a PulseAudio compatible server. - Add a avahi zeroconf discover module, create pulse-tunnel when PulseAudio devices are announced. - Config files are now installed in the data dir, system overrides in /etc/pipewire and $HOME are checked first. - Applications now have their monitor ports named with the "monitor" prefix to avoid confusion with the output ports. - LICENSE clarifications. * GStreamer - fixes to the pipewiresink plugin. * SPA plugins - Fix a bug where the volume was reset to 0 - Add events to dbus plugin. This can be used to detect dbus disconnects. * Media-session - Handle dbus disconnect. - Handle device reservation errors. * PulseAudio server - Implement module-ladspa-sink and a new PipeWire-only module-ladspa-source - Implement module-pipe-sink - Implement module-tunnel-sink and module-tunnel-source - Fix a bug with module argument parsing - Implement module-zeroconf-discover * ALSA plugin - improve error handling- Add %bcond_with aptx conditional to let 3rd parties to enable aptX support.- Add %bcond_with aac conditional to let 3rd parties to enable AAC support.- Update to 0.3.27 * Highlights - Fix bug that caused bluetooth devices to stop working. - Fix session-manager crash when switching users caused by the DBus plugin cleanup errors. - Improve volume handling of monitor ports. - Fix GStreamer v4l2 support. - Implement module-remap-sink and module-remap-source in pipewire-pulse. - More fixes and improvements. * PipeWire - Move the loopback code into a module. Use this in pw-loopback and pipewire-pulse. Fix some cleanup crashes. - A dummy echo-cancel module was added. Later versions will include the webrtc echo-canceler. - State files don't have the X permission anymore. - Move i18n core into a private header file. - Stream can now advertize properties and receive property updates. - Fix an issue where the wrong index was used to address a port. It caused Bluetooth devices to stop working. * SPA plugins - Only do LFE filtering on channels we created. - Improve name and description of devices. - Improve cleanup in DBus connections and sources to avoid crash when destroying. - Improved volume handling. Hardware, Software and Monitor volumes are now properly separated and handled. - Support for S8 and S8P formats was added. * Tools - pw-cli can now also create Struct from JSON arrays. * Session-manager - The session manager can now also create passive links. This makes is possible to suspend effect chains together with the sinks when not in use. - Match rules now check the complete property value instead of only the start. - Handle multiple pending param enumerations, take only last result. This fixes some volume update issues. * GStreamer plugins - GStreamer plugins now advertize handling DMABUF explicitly. This is currently the only way to avoid a memcpy for v4l2 devices. * Device support - sync ACP with pulseaudio, merge upstream patch instead of our hack to workaround missing duplex devices. - V4l2 devices don't expose their fd anymore. Previously the fd and mmap offsets were passed to the client to access the buffer memory but that could create security issues. * Bluetooth - Don't unregister the profiles on shutdown because this can cause delay, just close the dbus connection. - Bluetooth devices now try to use the global samplerate from the graph. * PulseAudio server - Implement remap-sink and remap-source modules using the new loopback module.- Disable gstreamer device provider by now because the timestamp bug makes cheese video record abnormally longer than it should be (rh#1884260). - Replace all tab characters to space.- Add %systemd_ordering so systemd is installed before pipewire on fresh installations. This allows to set the service presets correctly on new systems since the %systemd_user_* macros don't do anything if systemd is not installed (boo#1185459).- Update to 0.3.26: + Highlights: - I18n support, with translations merged from PulseAudio. - New pw-link tool. - Many Bluetooth improvements, support for hardware volumes. - Support for 64 channel devices. - Stability fixes and improvements. + PipeWire improvements: - The link factory can now also make links between nodes and ports by name so that it can be used in scripts. - Add module-protocol-simple that can stream raw audio on a socket. - Added i18n support. Merge PulseAudio translations for the ACP library so that we don't cause regressions. - Support more than 19 channels in the channel mixer. This makes all channels usable on 32 and 64 channel cards. - Detect if we're running in a VM and allow for tweaking some settings such as the max-quantum to make things work better in VMs. - Fix a potential crash when connecting a client and updating permissions. - Fix a potential crash when trying to link incompatible ports. - Lingering links in error will now be destroyed automatically. + Tools: - Added new pw-link tool to list and monitor ports and to list, monitor, create and destroy links between them. - pw-cli can now also list params by name. - pw-dump now outputs Spa:String:JSON types in metadata as properly parsed and formatted JSON so that tools can parse the metadata values using a JSON parser. + Session-manager: - Add logind support. The bluetooth monitor can only be started for one user at the time, so use logind detect active seats. - ALSA icon names were improved to match what PulseAudio does. - Improve the bluetooth icon name. Also use the device alias as the device description, like PulseAudio. + Device support: - When devices become inaccessible, they are now removed from the PipeWire graph. - Fix datatype selection for buffers in v4l2 and libcamera. + Bluetooth: - Various memory leaks and crashes are fixed. - Added support for AVRCP hardware volume. - Added support for HSP/HFP hardware volume. + PulseAudio server: - Fix module-loopback connections to monitor ports. - Implement module-native-protocol-tcp. - Handle nodes and streams with > 32 channels. The PulseAudio API only supports up to 32 channels so only make those 32 first channels available with the PA API. - Implement module-simple-protocol-tcp. - Improve events emitted by the server. - Improvements to channels and channel_map properties on modules. One can imply the other and they should match when both given. - null-sink will now have their volume work correctly by default. + JACK: JACK developement files can now optionally be installed.- Update to 0.3.25: + This is a bugfix release that is API and ABI compatible with - previous 0.3.x releases. + Highlights - Many stability improvements. - Plug fd leak in flatpak detection - add pw-loopback tool and support module-loopback - volume restore for virtual sinks/sources or other sink/sources without hardware volume. - Fix cracks and pops in audio capture. - Many bluetooth improvements and compatibity fixes. + PipeWire improvements - Hex encode invalid SEC_LABEL properties to avoid generating invalid json. - Small fixes to how nodes are started to avoid crashes. - Make sure ports are only scheduled after being fully negotiated to avoid crashes. - Implement coverity into CI, fix some bugs detected by coverity. - Plug leak in flatpak detection. - Fix crash when removing globals in some cases. - Fix crash because the mixer info was not removed from a port in all cases. - Add PIPEWIRE_AUTOCONNECT environment variable to disable stream autoconnect. Also add a config option to disable autoconnect. - Improve wildcard in format helpers. - Add env variable to disable journald logging. + Tools - Add a new pw-loopback tool to loop a capture device to a playback device. - Display localized strings correctly in pw-top - Add some more options to pw-dot + Session-manager - When a new node is configured and some stream have this as the default target, move them to it. - Fix some crashes. - Implement volume restore on nodes without routes. This makes it possible to restore volume on purely software nodes like null-sinks. - Also try to suspend errored nodes so that they may leave the error state and be reused again. - Break endless link loops when something went wrong. + Device support - Fix monitor volumes, they are now separate from the hardware volume. - Fix cracks and pops in alsa capture caused by mismatch between resampler and capture source. - Add start-delay config option to alsa sink. - Ensure the PipeWire midi ports start from a higher number so that the lower port numbers are available to apps as before. + Bluetooth - source devices are now removed when idle - Support using pipewire as Audio Gateway. - LDAC encoding quality can be configured now - Implement codec switching for HFP - Implement codec switching with new device property. - Improved stability and compatibility - Autoconnect device profiles at startup - Add AAC bitrate mode configuration - Make it possible to use an A2DP source as an input device. You can then use your phone as an A2DP microphone, for example. - Remove battery reporting when RFCOMM connections is closed. + PulseAudio server - Add some workarounds for Blueman - Set correct errno values, fixes a hang in load-module of a non-existing module - Try to not send inconsistent information to clients. - Fix some crashes. - Add support for the new send-message API, use this to switch bluetooth codecs. - Fix draining by making sure we are started. - Handle 0 sink and source as the default sink/source. - Implement module-loopback + JACK - Fix some memory leaks when closing a client - Add self-connect config option to limit where clients can connect themselves. - Don't crash when apps call _port_get_buffer() on a port that is not their own but simply return NULL. This fixes a crash in Ardour6. - Improve client added/removed callbacks. Sometimes it would emit a client remove when there were still ports for the client. - make sure midi port names are stable across reboots.- Enable or disable the ldac codec depending if ldacBT is available or not to fix build in s390x (where it's not available) - Add some more information and fix indentation on previous changelog entries.- Update to 0.3.24: + This is a bugfix release that is API and ABI compatible with previous 0.3.x releases. + Highlights - Many JACK midi improvements and device support. - Fixes in gnome-control-center default sink/source handling. - Many small performance improvements in alsa device handling and latency. There should also be less cracks/pops and xruns now. - More bluetooth compatibility improvements. + PipeWire improvements - Implement simple upmixing - Disable the resampler when not used. This improves latency and CPU usage. - Handle max-quantum on devices and try to not make the quantum larger than the device buffer size. - improvements to how nodes and links are activated. It should now result in less xruns and cracks/pops. - meson uses the feature options everywhere now - Handle volume remap in the channelmixer. This fixes the channels on multichannel devices. - Try to escape invalid JSON string characters - Keep better track of changed parameters in audioconvert. - Improve config files, make arrays where needed. - Respect NO_COLOR where possible - Support in-place config file parsing to avoid allocations and improve startup performance. - There is no a config option to enable non-power-of-two quantums. - Preliminary support for upmixing and generating LFE channels. + Session-manager - default nodes are not stored as JSON in the metadata. This is more readable and introspectable. - More default-nodes and default-routes improvements. port switching should work better now. - Wait until all devices are scanned before linking clients. - Fixes some crashes - Sinks (monitors) can now be set as default sources. + Device support - Fix startup timers for alsa devices. - Improve timers in alsa when quantum changes. It should cause less xruns and cracks. - Fix UCM setup of capture devices. - Only disable IRQ in alsa when not batch. For batch devices the hw pointers are updated each IRQ so we need to keep them enabled. This massively improves latency on USB batch devices to the same level as JACK (with small enough period size). + Bluetooth - Improvements to profile switches. - Improvements to volume handling. - Fixes for A2DP sources - Add support for battery status when available. - Many other small improvements. + PulseAudio server - handle NULL in set_default_sink/source to clear the default - Implement a workaround for gnome-control-center when setting the default sink/source. It also sets the target in stream-restore to the new default. This fixes moving streams in gnome-control-center. - Fix some races by replying to some requests after the operation completed. - Prefer formats of the extended format API. - Create a pid file on startup to improve compatibility with apps that look for it. - Capture streams can now be moved to monitors with pavucontrol - Fixes for crashes + JACK - jack clients can now connect to the 'default' server - Move midi ports back to the midi client - Only mark midi hardware ports as terminal/physical - Use the same midi names as a2jmidid - match system ports in get_ports. - Improve compatibility with some apps that require a fixed latency. - Beginnings of the libjackserver implementation. - Switch off libopenaptx and fdk-aac (because they are patent-encumbered) and libcamera (problems in building).- systemd-rpm-macros doesn't have a consistent versioning between distributions, so better assume it's updated enough to support %systemd_user_pre- Add systemd rpm macros for pipewire.service as well as pipewire.socket . - Use the new %systemd_user_pre macro on %pre to be able to recognize when a service was installed for the first time and enable it on %systemd_user_post (boo#1183012)- Update to version 0.3.23: + Highlights - Fixes for some critical bugs in last release. - Fix bug where audio was not drained properly at the end of playback, causing repeating sound. - Profile and route switching was improved and should mimic more what pulseaudio did. - Various fixes for xruns in capture and playback. - Bluetooth now supports delay adjustment and various other improvements. - The pulseaudio server now correctly identifies AC3 and DTS streams and returns a not supported error instead of playing static. - Multichannel support was improved in the alsa plugin and the channel mixer. Channels should now play on the right speakers in all cases. + PipeWire improvements - Small fixes and improvements in JSON parsing and encoding. - Improvements to param handling in audioconverter. It would previously not always notify of changes. - Avoid updating some properties that we use internally such as the object id and the node.id. - log.level in the config files is now actually used. - the PIPEWIRE_LATENCY env variable should always override any application settings in filter/stream/jack. - The config file can now contain filer and stream properties to, for example, control the resampler, mixer and latency. - Add sandboxing to the systemd services - Various FreeBSD fixes. - Improve draining and a way to exit the drain state as well. - Many multichannel fixes. Channel remapping should now be correct. - Fix bug with repeating audio at the end of playback because the drain in the resampler was not draining all channels. - RTKit default rt.prio has been increased to 88. This will likely still be clamped to 20 until distros increase the max priority. + Session-manager - Don't try to switch to Pro Audio profile, this should be a user choice only. - Don't crash when metadata was disabled such as when not using the audio features of pipewire. - Rework the profile and route handling. - Add systemd unit files for the media-session - Device names should now also have sane names so that tab pactl completion works on them. + Device support - Fix ALSA format enumeration in more cases. Use the channels and rate as a filter. - Make sure the graph doesn't ever use buffers larger than the alsa device buffer size or we get xruns. - Tuning of the alsa device timeout handling and dynamic resampler. There should now not be any xruns when streams appear and disappear or when the quantum changes. - Fix bug in alsa device when reassigning to a new driver, in some cases the dynamic resampler was not activated and things would drift out of sync and fail. - Fixes in quantum changes for ALSA capture and how the resampler is drained and fed with the new samples. + Bluetooth - Delay adjustment has been implemented now. Bluetooth devices should now be more synchronized with video due to proper delay reporting. Because BT delays can be large, it can cause hickups in some players. - Fix volume in bluetooth devices. - Codec switch improvements. + PulseAudio server - Latency offset adjustment is now implemented and functional for bluetooth devices. It is not working for alsa devices yet. - Handle unsupported formats. Previously we would accept encoded formats and play noise. This fixes AC3 playback in vlc. - Move some of the configurable parameters to the config file. - Fix a fatal use after free when playing samples - Improve module handling. loaded modules now show up in the list of modules and can be unloaded. This also prepares the core for more module implementations later. + ALSA plugin - Fix drain with very large buffers, we need to manually start the stream before draining. - Fix the channel layout handling. - Improve compatibility with apps that expect the poll to only return when there is activity. - Fix drain for capture + JACK - Add a config option to shorten and filter client names - Increase the length of the client name size and make sure we don't exceed the allocated size. - We now include our own jack header files so we can build without depending on another jack-devel package. We don't yet install the headers or provide pkgconfig files. - Move alsa-card-profiles to modules subpackage, they are always needed.- Build/install the `pw-top` tool: + Add pkgconfig(ncurses) BuildRequires to satisfy the build deps of pw-top.- Do not provide pulseaudio, but pulseaudio-daemon so we can specify in the patterns that we prefer the pulseaudio package (boo#1182730)- Update to version 0.3.22: + Highlights - Per client config files replace the module-profiles. It's now possible to tweak settings and load custom modules. - Pro Audio card profile support. You can now select the Pro Audio profile and have raw device access with the maximum number of channels and no mixer controls. This is the usual setup for managing high end Pro Audio cards. - Many fixes and improvements in the JACK library to make devices look and integrate better. - Many bluetooth improvements. Playback should be more reliable and better synchronized. Support for the HFP HF profile. - Small fixes and improvements all over the map. + PipeWire improvements - Add support for restrictions requested by a client. This makes it possible to implement Flatpak policy for emulated PulseAudio clients as well. - Fix removal of params in objects. Previously they would not be removed from the cache. - Remove mlock warnings by default. There is an option to enable them again if you want to check if your system is optimized. - Remove LimitMEMLOCK lines from the service files. They can only lower the system settings and are thus not useful. - Implement per-client config files. Each pipewire client will now read a config file that you can use to configure the context of the client. - Implement state and config load/save in pipewire. This is used by the session manager or other apps. - Make an option to disable dbus support. - Add tool to convert pipewire config to JSON. + Session-manager - Give all permissions to Manager flatpak apps. In the future we will use the Permission store to remember user settings. - Improvements to default audio/sink handling. - Add option to configure device suspend time. - Small fixes in route handling. + Device support - Complain when ACP profile files are not found and use a fallback in order to get something working. - Add volume support to monitor ports. - Fix resume from suspend for ALSA in more cases. - ALSA ACP cards now have a Pro Audio profile that exposes the raw card devices. + Bluetooth - Enable A2DP delay reporting. This improves audio/video sync when playing audio over bluetooth. - Fix stuttering in A2DP source - Tweak buffer size and latency settings to avoid stuttering - More work on HSP and HFP support - Fix initial profile configuration - Add HFP HF support + PulseAudio server - Small tweaks in capture packet size to avoid crashes in some apps. - Detect Flatpak apps and requests the flatpak permissions from the session manager. This means that Flatpak pulseaudio apps will now run with reduced permissions. + ALSA plugin - Reduce min buffer size in the plugin for lower possible latency. + JACK - implement some missing methods to make qjackctl work again. - Use the context data thread instead of making our own. This fixes the issue where the data thread was not given RT priority correctly. - Pass extra jack flags around in port properties. This makes CV ports in carla work. - Many tweaks to the port names and aliases. Unwanted characters are filtered out, giving better names to jack apps. Default device names are now equal to those seen in pulseaudio apps. - Add an option to make a separate client for the monitor ports of a device. This makes it more usable in apps. - add support for system:playback_N and system:capture_N port names for apps that hardcode these port names.- Re-add the Provides: pulseaudio; patterns-base now suggests pulseaudio, which should help zypp in doing a smarter decision (boo#1182730).- ldacBT only builds on little endian architectures, so we can't buildrequire it on big endian systems like s390, s390x or ppc64.- Remove the pulseaudio provides from pipewire-pulseaudio: We first need to ensure our KDE patterns (and others) become smart enough to favor pulseaudio until we are ready for the switch (boo#1182730).- Update to version 0.3.21: + Highlights - Many PulseAudio compatibility fixes. Handling of corked streams, the prebuf setting, seek modes and stream flags are now implemented correctly. - Ports and Profiles are now managed by the session manager and can save and restore previous settings. ALSA device handling has been tweaked for maximum compatibility at the expense of latency. There are tuning options in the config file. - Improved Bluetooth support. HSP is disabled by default because it is old and deprecated and in some cases causes conflicts with the newer HFP profile. Codec switching is now implemented as well. PipeWire accepts donations with liberapay now. + PipeWire improvements - Improve draining in pw-stream. pw-stream now uses busy metadata by default. This makes sure that no writer can write to buffers when readers are still busy. - Fix handling of empty array/choice instead of failing. - Fix crashes when creating properties from empty strings. - Make it possible to pass an array to module-access access.allowed variables - Fix small bug in argument parsing in pw-cat + Session-manager - Restore route volumes in all cases, also when switching routes. - Use a default route volume for unknown routes instead of letting the system decide on a default. Improve profile handling. Don't try to restore unavailable profiles. Implement the profile switching in the session manager now. - Fix handling of Virtual sources as defaults. - Handle port switching in the session manager. Implement save and restore of default ports per profile. + GStreamer - Fix a crash with zero SPA_PARAM_BUFFERS_size + Device support - v4l2-source will now respect the requested memory types. - ALSA buffering has been tweaked. USB devices should have less XRuns by default. Parameters can be tweaked to decrease the latency on capable devices. Also fix a case where a quantum change would cause an xrun. - Fix mute in bluetooth devices bluetooth devices are not paused in idle anymore for improved compatibility. - Codec switching for bluetooth is implemented along with config options to select the codecs manually. - HSP for bluetooth is now disabled by default. Most devices support the newer HFP profile and some devices fail when both are available. - Reduce the amount of events the ALSA plugins emit by bundling them. + PulseAudio server - Implement the suspend command - Fixes volume in sample info - Fix playback of samples, sometimes samples would be clipped short. Also implement the target sink for the sample. - Use rate match to feed samples. This way the latency can be kept to a minimum. - Latency has been tuned some more, more closely emulating pulseaudio behaviour. - Improve default sink/source handling. Make sure all events are sent correctly when defaults change. - Handle underrun better without causing sync issues. Make sure to pause in corked state. - Implement rewind due to seeks, fixes GStreamer seeking. - Do not remove alsa-card-profiles, they are required- Provide pulseaudio by pipewire-pulseaudio: there are various packages in the distro that require pulseaudio, but essentially, they should be happy with pipewire-pulseaudio as a replacement. Do not provide the symbol though, as we do not (yet) want to automatically migrate users over.- Add pkgconfig(ldacBT-abr) and pkgconfig(ldacBT-enc) BuildRequires: Build bluetooth ldac codec support.- Update to version 0.3.20: + Highlights - Latency was reduced in ALSA and PulseAudio and time reporting has improved a lot. - Bluetooth now has a native HFP backed, SBC XQ and mSBC support. - Many bugfixes and improvements, improved device support. + PipeWire improvements - pw-dump can now dump all objects such as Endpoints - pw-dump has a -m option to monitor changes - pw-dump can now dump metadata - pw-stream can now use the rate-match io to exactly produce the required number of samples for the current cycle. When using this feature, a stream can achieve the same low-latency as pw-filter. - spa-acp-tool can now load a custom profile-set and correctly parses the volume updates - There is now a nofail option when loading modules - The connection has been made reentrant to fix some strange random problems with metadata. - Turn some errors into warnings or simply info. - Executables are now built with PIE - S24OE formats should work now (MAudio FastTrack Pro) - Remove mlock warnings. Add support for mlockall with a config option. + Session-manager - There are now config files for bluez and v4l2 modules - Improve ALSA device and node properties - Bluetooth devices have better properties now. - The default device routing has been improved. + Device support - Port priorities are updated for UCM devices - ACP devices notify change in routes in all cases - There is now RW support in ALSA devices to increase compatibility. - Many improvements to Bluetooth. SBC XQ support can now be enabled with a config option. mSBC can be enabled with an option. - Bluetooth devices not expose Routes so that they look more like how PulseAudio handles them - Gracefully handle missing profile-sets - There is now a native HFP backend - Improve card names in some cases. - pause-on-idle is now disabled for ALSA devices. This can reduce pops and clicks when the device is stopped. + ALSA plugin - Use rate-match to reduce the latency - Implement a _delay() function to get smoother timestamps. - Fix property parsing. Fixes volume changes in alsamixer. + PulseAudio server - Use rate-match to reduce the latency. This also reduces the buffering in audioconvert and improves timestamp reporting. - Implement rate changes now that we have rate-match support. - pactl stats will now work - Fix excessive memory usage when a capture client doesn't read fast enough.- Update to version 0.3.19: + Highlights - Startup after login should be fixed now with inotify used to wait for permissions. - Channels should be mapped correctly now. - Many bluetooth improvements in LDAC, AptX-HD. AAC was also added. Headsets should work better now. - pipewire-libpulse was removed. It is now completely replaced by pipewire-pulse. - Fix a crasher bug in pipewire-pulse and some memory leaks. - Fix a bug with feedback loop that would cause 100% CPU. - A new pw-top tool to display real-time graph performance. - The example session manager now has config files. - The config file format was changed to use the SPA JSON tokenizer. This makes it more flexible and extensible. + PipeWire improvements - Fix debug of id in format channels - Audioconvert should now remap channels correctly in all cases. - Feedback loops were not scheduled correctly and would cause 100% CPU usage. - Small improvements to the profiler to also log incomplete graph status. - a new tool pw-top was added that prints real-time performance stats of the graph. - the rtkit module now sets the nice level to -11 + Session-manager - The session manager would sometimes link dont-reconnect nodes to another node, which would leak monitor streams in pipewire-pulse. - The session manager now has configuration files. Config files can also be placed in the user home directory to make custom configurations. - The session managers now creates unique device and node names for alsa and v4l2 devices. + Device support - Many improvements in Bluetooth codecs, LDAC stuttering, AptX-HD negotiation, LDAC ABR support - Bluetooth supports AAC audio now. - Many fixes to Bluetooth SCO transport used in headsets. - inotify support in device monitors - ACP was synced with the latest pulseaudio code - Fix a bug in enumeration of device ports. - PulseAudio server - seek flags and offset are now supported, making gstreamer pulse elements work better. - Fix a crasher bug in pipewire-pulse, we sometimes would write too much to the ringbuffer - Fix some memory leaks in error cases. - Fix handling of NULL string to locate default sink/source + JACK layer - Ports can also be found with the aliases now, making qjackctl work in more cases. - Changes from PipeWire 0.3.18: + Highlights - More work in the PulseAudio server. It should be compatible with more applications. - Bluetooth now support extra codecs such as AptX/HD and LDAC. - Support for virtual sources and sink was improved a lot. - Added a new pw-dump tool to dump the objects in JSON formats and for filtering them with tools like jq. - Many more stability fixes and improvements. + PipeWire improvements - Silence some harmless warnings - pw-cli can now be used to set parameters. - Streams now perform the correct channel mapping when linked to non-standard multichannel devices. Previously channels would get swapped. - port, node and device params are now cached in the server. This avoids opening and closing devices whenever some client enumerates formats, which improves performance a lot, especially in cases where opening a device is slow. - Add a command to keep a device open during negotiation. This is used to enumerate and set a format while opening the device just once, improving performance. - The null-sink scheduling was fixed. - A memory corruption bug was fixed in format conversion, this could cause crashes, silent channels or other undefined behaviour. - There is now a simple JSON parser. + Session-manager - Settings files are now stored in JSON. With the json parser this is easier to parse and extend + Device support - Bluetooth now supports additional codecs: LDAC, AptX and AptX HD. LDAC is known to not work very well yet. - ALSA devices will now default to the max supported channels if nothing else is specified. This makes it possible to use 8+ channel cards with the alsa-pcm module, which is not supported with the default alsa-acp module. - Enable mSBC support in oFono. - Add an option to disable hardware mixers - ALSA now improves support for batch devices. - The udev rules had references to Pulseaudio removed in order to not create conflicts. - Fix a potential crash in bluetooth devices when disconnecting. - UCM cards now use HW volume when possible. + PulseAudio server - The id can now be used as the name to locate cards and devices - Report streams with planar formats as well - Better error reporting when stream create fails - module-null-sink can now handle channels, rate and channel_map properties - Add support for 3 types of virtual devices: source, sink and duplex. - set-port was fixed - Some buffer parameters were tweaked to improve performance, compatibility and stuttering with lower latency. - NULL can be used as a name for the device sink/source - Support lookup of monitor names - Set properties more like pulseaudio so that some clients (Teamspeak) don't crash anymore - Changes from PipeWire 0.3.17: + Highlights - Fix crasher bug for kwin when screensharing stopped. - Massive improvements and compatibility fixes in the PulseAudio server. - The session manager now has a config directory in /etc/pipewire/media-session.d/ It will look for files there to activate session manager modules. Packagers can use this to only activate the audio modules when the PulseAudio server, libjack.so or the alsa modules are installed. + PipeWire improvements - We now clear hooks before adding them. Some application did not clear them and had random data for the destroy callback. - Return -ENOENT from unknown resources so apps can handle this better. It's a common problem when an app tries to introspect and object but it disappeared before the message reached the server. Apps should ignore this. - channelmap information is now passed with the volume settings. - DMABuf is not mmapp()ed anymore with the FLAG_MAP_BUFFERS in the stream or filter. This is because DMABuf usually requires more that just a simple mmap and is better left for the application. - increase the maximum number of ports for a client-node. - adapter and node-factory now support the linger option to keep the objects alive after the creating client disconnected. + Device support - ALSA now handles error in close(), like when unplugging a USB device. + Session-manager - The session manager is now handling DONT_RECONNECT streams without a target node. They get connected to a default node once and then fail to reconnect. - The session manager now exposes the stream setting as metadata. This makes it possible for other components, such as pulse-server to use this information. Information is stored as a json object for easier consumption. - The session manager now has a config directory in /etc/pipewire/media-session.d/ packagers can use this + PulseAudio server - Pulse server now acquire the dbus name. - Improvements in timing and compatibility with many apps. - The stream-restore extension is now implemented so that the event volume can be configured. - Many stability fixes and improvements. - Fix some issues with module-load/unload - Changes from PipeWire 0.3.16: + Highlights - Fix screensharing for old 0.2 clients - Many pulse-server improvements. There is now a pipewire-pulse binary that is the prefered solution for PulseAudio compatibility. The replacement libpulse libraries are now deprecated. This also makes audio in Flatpak work. + PipeWire improvements - Fix cleanup of listeners everywhere. Force remove of listeners in _destroy to avoid crashes. - Add support for a journald logger module. - Various memory leak fixes - Silence some warnings that spammed the logs. - Fix flush in pw_stream. This fixes small glitches when switching streams in music players. - Various FreeBSD fixes and improvements. - Fix some crashes when destroying objects. + Device support - Reload the ALSA configuration when creating a node so that hotplugged devices work in all cases. - Fix memory leaks in ACP library. This also fixes issues where the mixer device was not closed. - Bluetooth now has support for the mSBC codec for SCO source and sink. + pulse-server - Many introspection and compatibility improvements. It should now be as good or better than the replacement library. - Implement sample cache to make notification events work. + JACK layer - handle errors when linking, fixes jack_connect hang when the ports were already linked. - Drop patches do-not-use-snd_pcm_ioplug_hw_avail.patch and fix-memfd_create-call.patch, no longer needed on SLE/Leap which have updated glibc / alsa. - Drop do-not-install-alsa-config-files.patch, remove files at install time instead. - pw-pulse wrapper is gone, remove all mentions of it. - Package pulseaudio replacement in a subpackage and drop pipewire-libpulse-0_3 (pipewire will use pulseaudio libraries directly). - Create an alsa subpackage and move alsa pipewire plugin to this subpackage.- Update to version 0.3.15: + Highlights - This is a quick update to fix critical issues with the 0.3.14 update, which broke screen sharing and accidentally enabled the experimental pulse-server. - Fix some compatibility issues in pulse-server with pavucontrol and fix an issue that would block the complete server. + PipeWire improvements - Permission checks for new clients are now done from a global context, which makes it possible to assign initial permissions to objects. - Handle EINTR everywhere - Fix an issue with the node state changes where a quick pause/play would hang a client. + Session manager improvements - Disable the bluez5 and pulse-bridge modules by default because they interfere with pulseaudio. These options should only be enabled if pulseaudio is removed or disabled in the system. - Fix an issue where the session manager could end up in infinite recursion while scanning for things to do. - The session manager will now always configure nodes to remix to the channel configuration of the device. This fixes the case where mono streams would only end up on one channel of a stereo device. + Device support - Initial merge of A2DP extra codec support using the new bluez5 API. + pulse-server - Create the runtime directory when it doesn't exist. - Don't ever block the server, use non-blocking IO everywhere. - Fill description of profiles with the name if not otherwise set, this fixes a crash in pavucontrol. - the connection debug catergory will now also debug pulse messages. - Respect the no_remix flag to make the control panel channel check work. + ALSA plugin - implement pause- Update to version 0.3.14: + Highlights - This release focuses on bugfixes and stability improvements. - A new experimental pulse-server module was added. This module implements the pulseaudio protocol on top of PipeWire and can be used to make flatpaks work with PipeWire. It looks like this might be a better way forward compared to the libpulse.so replacement library. - A2DP bluetooth was reworked. Playback should work a lot better now. Support was also added to automatically link an A2DP source to a playback device, which makes it possible to use PipeWire as a bluetooth receiver as well. - Improvements to the routing and volume restore features of the session manager. + PipeWire improvements - The channelmixer does not normalize volumes anymore. Volumes are only normalized for monitoring streams now. - Streams can actually start in the inactive state now. - The channelmixer can now also convert volume updates from one channel layout to another. This makes saved volumes work even when streams have different channel layouts. - Clients are only registered after the properties have been updated. - Links now have a new active state. - Drivers can now also specify a minimum quantum. This makes it possible for bluetooth devices to specify an optimum quantum for the given codec settings and MTU. - The amount of data sent over the socket was reduced by only sending the data that changed. - Client objects are now exposed after they uploaded their properties, which makes the new object more useful. + Tools improvements - pw-cat will now add metadata to the PipeWire streams. + Session manager improvements - Fix crashes when reading bad data in stored settings. - volume and routing is improved. Settings are now remembered per application or media-role. - The session manager remembers the last device used per stream - Fix a bug when moving streams where it could sometimes end up with linking a stream to multiple devices. - Use RTKit to set realtime priority on the data thread in the session manager. This improves performance of the pulse-server and bluetooth devices. - Add a new property to mark streams that want to capture from the monitor of the default sink. - NODE_TARGET can now also contain the node name. This avoids some lookups in the pulseaudio layer when selecting target nodes by name. - the -e and -d options are more usable now and can be used to add and remove modules from the default list of modules. + Device support - v4l2: add some workarounds for buggy drivers. Add Limited support for droidcam. - ACP: improve selection of default port and profiles. - ACP: add support for using the hardware mixer for more than 8 channel streams. - ACP: support the new port type and availability group found in PulseAudio. - A2DP bluetooth timings were reworked. Automatic linking of A2DP sources was added to make it possible for PipeWire to act as a bluetooth receiver. The code was reworked to allow other codecs such as APTX and LDAC in the future. - Try harder to recover from ALSA errors. + GStreamer improvements - Fix some crashes in the monitor that cause gnome-initial-setup to crash. + PulseAudio layer improvements - Many compatibility improvements. Improved playback in chrome. Fix a crash in firefox when the daemon is stopped. - Fix a leak in the formats. - Fix !ADJUST_LATENCY streams like paplay. - Make the device option in paplay work. - Fix volume/mute notifications, this makes plasma volume updates work again. - Do the conversion between PulseAudio cubic volumes and PipeWire linear volumes. Volume levels should behave now like they did with PulseAudio. + JACK layer improvements - Return an error when we run out of midi events. Some application rely on this behaviour. + ALSA plugin improvements - The ALSA plugin now also supports the node name in the playback_node and capture_node properties.- Rename 99-pipewire-default.conf to 99-pipewire-default.conf.example so it's disabled by default and all ALSA I/O doesn't get redirected to pipewire (which was only overrided by pulseaudio's configuration in alsa-plugins-pulse casually). Thanks to Takashi Iwai for noticing (boo#1178104, boo#1177166 and probably boo#1175584) - Add baselibs.conf (boo#1177555)- Update to version 0.3.13: + PipeWire improvements - Add pw-reserve tool to reserve or monitor a device on DBus. - Install spa-resample, a tool to resample a file. - Install spa-acp-tool, a tool to inspect the card profile. - Various fixes and improvements - Fix a bug in pw-stream where a capture stream could run out of buffers and become silent. - Rework the processing loops in the adapter and stream. There is now less latency in PulseAudio and ALSA layers. + Session manager improvements - Improve the device reservation code. We now try to acquire the device using the dbus device reservation API before we probe the device. This avoids conflicts with a running PulseAudio where devices would disappear (because they were locked by the other process). - Don't fail on invalid input from the config files. - Audio devices now have the same name as what PulseAudio would assign. + Device support - v4l2: try to use the format before enumerating the size and framerate. Some drivers don't check the format and might now work better. - v4l2: Fall back to MMAP when EXPBUF fails. Fix MMAP access, just export the fd and the mapoffset. This should make more devices work. - Fix crash in ALSA Card Profile (ACP) code. - ACP: fix selection of default profile. Prefer any possibly available profile over 'Off'. This makes some card at least start with something. - Fix soft volume. After setting the volume to 0, it would stay at 0 until pushed over the max volume. This should fix various volume related issues. + PulseAudio layer improvements - Rework the buffering and latency measurements and tweak the buffer attributes. This should make browsers and media players work better. This should also improve speechd performance. + JACK layer improvements - Fix compilation against newer JACK. - Rebase patch: + do-not-install-alsa-config-files.patch- Update to version 0.3.12: + PipeWire improvements - The channelmap converter now handles unknown and strange channel layouts much better. - The resampler is now cleared correctly, avoiding clicks and pops at the start of sound. - Fixes for various crasher bugs. (paplay drain, vlc shutdown, pactl info, ...) - Fix a race condition in the node state changes that caused all kinds of sync and other issues (vlc, mpv, ...) - Improve the binary name property of applications - Fix the scheduling again of nodes that always need a driver such as the jack clients. + Session manager improvements - Fix routing to default nodes. Sometimes nodes were not routed to the default node (bluetooth) + Device support - Disable channelmap from ALSA by default. This is what PulseAudio does and thus provides better compatibility. - Fix a bug in how the resampler was used in the ALSA source, causing distortion and errors when using low latency capture clients. (Discord, webrtc, ...) - Small bluetooth improvements. More work is needed for reliable bluetooth playback. + GStreamer plugins - The device provider now stops the processing loop before shutting down, which avoids crashes (gnome-initial-setup). + PulseAudio layer improvements - The buffer attributes were reworked to ensure compatibility with many more applications such as mpv and audacious. - The pulseaudio layer will now try hard to not hand out invalid channel maps to the application. (avoids crashes in gnome-volume-control). The channel map will now also look more like what PulseAudio does. - The @DEFAULT_SINK/SOURCE/MONITOR@ wildcards now work. This fixes the problem with volume keys when they are bound to scripts using pactl and the default sink/source wildcards. - The PIPEWIRE_LATENCY environment variable now works again - Fix some leaks of ports and port info. Also fix the leak of the context when the mainloop is stopped. - The sink/source format_info array is now filled up completely, this is actually not implemented yet in the real PulseAudio. + JACK layer improvements - jack now returns version 3.0.0 and has PipeWire in the version string so that apps can report this. - Drop patch: + 0001-alsa-dont-change-the-resampler-delay-value.patch- Update to version 0.3.11: + PipeWire improvements - Properly cleanup the mixer structures when a port is removed, this should fix client crashes related to port config changes and other random crashes. - Optimize the preferred formats in the audio converter. Higher quality formats with higher performance are chosen first. - Make sure the time reported by pw_stream is always increasing, even when the driver and clock changes. - There is now also a system service and socket that can be used to enable PipeWire systemwide. This is however not recommended and disabled by default. - Fix channelmixer 5.1 to stereo mix matrix. It was not reading the conversion matrix correctly and cause channels to be dropped. The channelmixer will now also normalize the volume, like what pulseaudio does. - The channelmixer will now just copy channels when no layout has been given. It has also optimized paths for this. This makes it possible for apps to request > 8 channels from the alsa plugin (ardour). - Port, Node and Link will now also emit an error on the resources in addition to updating the error in the info. This would make it easier to track negotiation errors in the session manager later. - many small fixes and cleanups. - Fix compatibility: - DOSBox: fix crash because of double free in pw_stream + Session manager improvements - The session manager will now try to configure the client to the channel configuration of the sink/source. It will only do this for downmixing, never for upmixing and also never when the client has the dont-remix property set. It will also renegotiate the channel layout when moving a stream to a new sink/source. - Configuration state is now saved in XDG_CONFIG_HOME. Previously it was saved in $HOME/.pipewire-media-session/ You can migrate the state by moving the files to $XDG_CONFIG_HOME/pipewire-media-session (or $HOME/.config/pipewire-media-session as a fallback when XDG_CONFIG_HOME is not set). + Device support - Bluetooth sources and sinks should work better now. - There is now also a new bluetooth backend using hsphfpd. - fix the ALSA UCM Off profile for alsa pcm devices - improve ALSA port and profile switching. The ACP device will now switch to the best port and profile when availability changes. + PulseAudio layer improvements - Implement some more callbacks. The pulse layer will now also notify applications of stream moved, started and latency changes. - Fix error code when an object was not found. We now return PA_ERR_NOENTITY instead of PA_ERR_INVALID. - Add some support for loading new null sinks. Applications such as pulseeffects use this. Note that pulseeffects does not yet work reliably but can start now. - Improve handling of profile and port updates, it should work much more reliable now. Apps should now also again receive volume updates from sinks/sources. - Fix compatibility: - openal-soft 1.20 - pavucontrol (checks PA_ERR_NOENTITY) + JACK layer improvements - improve default source and sink handling. It was not updated correctly in all cases. - add samplerate and period to the pw-jack wrapper to easily configure the desired samplerate and perdiod for the app. + ALSA plugin improvements - Add a mixer entry in the alsa config file. - Implement support for planar types, rework the processing function to make it more robust. - refuse to load the alsa plugin when linked against 0.2. This catches some old apps linked against 0.2 that want to use the alsa plugin. - Fix compatibility: - linphone (ALSA SIGFPE when _status() is called before _prepare()). - Includes fix for a division by 0 error (boo#1176515): + 0021-alsa-protect-against-SIGPFE.patch - Add patch from upstream to fix audio stutters in discord and probably other applications when using alsa directly. + 0001-alsa-dont-change-the-resampler-delay-value.patch- Update to version 0.3.10: + Many improvements to the pulse layer. - GStreamer pulsesink element now works. - Fixes some segfaults. - Enable rtkit for client threads. - fixes capture of monitor stream by name - implement some more extensions, this makes paman work and removes some warnings. + Many improvements to the GStreamer elements - negotiation rework, avoid calling GStreamer methods from the PipeWire callbacks because they might block and cause deadlocks. - Add support for non-string property values. - improve stability after buffer and format renegotiation. - Rework the device provider. - pipewiresink can now provide a stream that can be consumed by apps like cheese. + Many improvements to the JACK layer: - Rework the buffer_size callbacks. Make sure we call the callback from a 'safe' thread and that we don't call the process callback while the application is handling the callback. This improves stability in apps like Carla when PipeWire dynamically changes the buffer size. - Improve compatibility with apps that call get_buffer_frames() with a 0 size (calfjackrack) - JACK can now create nodes that can be set as a sink/source in PulseAudio/ALSA apps (you can make an effects rack and set that as default sink for apps). + Added a group id property for nodes. This makes it possible to schedule nodes with the same driver even when they are otherwise not linked together. To make this work well a new flag needed to be added to nodes to signal when they are ready for processing. Together with the GStreamer fixes, this makes things like: gst-launch-1.0 -v pipewiresrc path=51 stream-properties="props,node.group=1" ! audio/x-raw ! pipewiresink stream-properties="props,node.group=1" work as expected with PipeWire managing the resampling to keep the clocks of the devices in sync. This can later also be used to force devices to be grouped together to create a JACK-like scheduling group. + Streams and filter now use PIPEWIRE_NODE and PIPEWIRE_LATENCY env variables as fallback. + ACP add per device port list. This makes UCM devices expose the right ports. + Fix some segfaults in ACP and UCM. + make pw-cat use the metadata to find default devices. + The media session can now save and load audio device Profiles and Routes (volumes), stream volumes and the default sink and sources.- Update to version 0.3.9: + Fix bad audio in chrome + Remove some errors that are not real errors. + Fix 100% cpu when disconnecting devices. + Improve pulseaudio introspection of formats + Fix JACK metadata handling, carla can now monitor the port it creates and insert midi. + Add a new permission bit (M) that is needed to be able to configure metadata on an object. Improve security of metadata some more, only allow metadata on objects that are visible to the client setting the metadata. + Add support for videocrop in the GStreamer elements. + Improve handling of the runtime directory for the server sockets. Add some reasonable fallback when XDG_RUNTIME_DIR is not set, as suggested in the spec. + Improve ALSA device names from ACP. + Fix various crasher bugs. One in the pulse layer, one in the session manager. + Make alsa plugin respect the PIPEWIRE_REMOTE env variable. + Various compile fixes.- Update to version 0.3.8: + Fix an embarrassing crasher in the JACK layer when metadata keys were removed. + Make it possible to add properties to jack clients with a PIPEWIRE_PROPS env variable. This can be used to make JACK nodes look like a device (like an effects rack). + Improvements in the session manager in how it links ports. Now it will try to link matching channels first and be more intelligent otherwise. The session manager will also configure the stream to the device port configuration when needed. + Add ofono backend for Bluetooth HeadSet support. + Improve default source and sink handling. They are now stored with their id, instead of name, in the metadata. This makes it work better with JACK because of JACK's limited name length. + Improve environment variables to make it possible to create and connect to servers other than "pipewire-0". Implement this in pulseaudio, JACK and alsa layers. + Add an alsa mixer plugin so that alsamixer works with PipeWire. It will configure the default source/sink volumes. + Fix capture devices. There was something wrong with how the resampler was used that caused corruption in the signal when the resampler was active. + We now ship alsa card paths, profile-sets configuration files and udev rules so that we don't have to rely on the pulseaudio ones. + Many build and stability fixes. - Update to version 0.3.7: + Improved PulseAudio compatibility. The alsa card profile code was reused from PulseAudio. Devices now support all profiles, ports, jack detection, UCM and hardware mixers that PulseAudio implements. There should not be (almost) any difference between PipeWire and PulseAudio in how it presents and manages devices. Other missing API pieces such as the default sink/source and move_stream are implemented now. At this point it should be possible to replace PulseAudio with the compatibility layer for those who want to try. + Many fixes and improvements to the GStreamer elements. pipewiresrc now has the ability to periodically resend the last frame. This makes it possible for use-cases like screensharing to only update the screen on changes while still keeping the client side encoder busy. PipeWire elements can now also share a connection between them. + Improvements to the bluetooth nodes. Dynamically adding and removing devices should work much smoother now. Many fixes and improvements to a2dp and sco nodes. + Reduced memory usage by using less pre-allocated memory where possible. JACK clients are especially using less memory. + Support for passive links is added again. These are links that don't cause the associated driver to become active. This makes it possible to have blocks of effects+sinks go to suspend as a group when not in use. + Both consumers and producers can now ask to renegotiate the format. This required some cleanups and improvements to how links and node states were handled. More work is needed to implement more use cases. + Important fixes to how memory is shared with clients. Memory was not correctly freed in all cases, which would result in reuse of the wrong memory. + Support for planar formats for audio and video was added. + Improved error handling in the session manager. + Metadata is now used to manage default audio source and sink devices. The session manager will try to link streams to the default device. Changing the default device will move streams to the new device. PulseAudio and JACK layers respect the default source/sinks. + Metadata is used to tag the desired output device for a stream and the session manager will move streams when the metadata changes. The PulseAudio layer uses this to implement the move_stream feature. + Many fixes to the security modules. The session manager now has a flatpak module that grants permissions to flatpak apps. The PulseAudio layer now respects the permissions of objects. Security related properties are made read-only now. Different access modules can now coexist. + The portal module has been split up in 2 parts: - a part living in the daemon that monitors the portal dbus owner and tags all clients from this PID. This part has to run in the daemon in order to securely tag the clients. - a part in the session manager that uses the permission store to manage the permissions of portal managed clients. - Drop patches already included in 0.3.7: + 0001-client-node-fix-buffer-size-calculation.patch + 0002-gst-fix-proxy-leaks.patch + 0003-pulse-fix-pa_card_info-profiles2-array-to-be-NULL-terminated.patch + 0004-pulse-fix-size-calculation.patch + 0005-jack-fix-crash-on-close-when-metadata-are-not-available.patch + 0006-a2dpsink-only-request-new-data-when-buffer-is-done.patch + 0007-pulse-fix-counter-while-populating-car_info-profiles.patch + 0008-impl-link-reset-state-before-starting-allocation.patch + 0009-impl-core-clear-the-mempool.patch + 0010-mem-reset-the-map-in-clear.patch + 0011-avoid-uninitialized-variables.patch + 0012-dlclose-on-errors.patch + 0013-stream-handle-NULL-context.patch + 0014-state-always-update-state-variables.patch + 0015-spa-device-fix-leak-of-properties-in-error-case.patch + 0016-alsa-dont-leak-structure-on-error.patch + 0017-alsa-dont-leak-properties-on-error.patch + 0018-stream-fix-some-more-leaks-in-error-paths.patch + 0019-buffers-increase-max-datas-and-metadata-in-buffers.patch + 0020-gst-return-NULL-for-unknown-format.patch - Drop patch and replace it with a sed substitution since the patch context includes the package version and would have to be modified in every package update: + fix-meson-required-version.patch - Add patch to not install alsa card paths, profile-sets configuration files and udev rules which upstream installs "so that we don't have to rely on the pulseaudio ones". + do-not-install-alsa-config-files.patch- Recommend pipewire from libpipewire, so if the library is installed the daemon gets pulled in since we want a daemon to connect to. - Require pipewire-spa-plugins from pipewire instead of recommending it since the support plugin is actually required for most uses (like screen sharing in wayland, which we want to support out-of-the-box). - Enable the pipewire.socket systemd user service in %post (using pulseaudio's %post section as an example of how to do it since systemd-presets-common-SUSE currently lacks support for user services). Also disable it in %preun and %postun.- Add patches from upstream to fix many issues mainly related to memory leaks, crashes and wrong behaviour: + 0001-client-node-fix-buffer-size-calculation.patch + 0002-gst-fix-proxy-leaks.patch + 0003-pulse-fix-pa_card_info-profiles2-array-to-be-NULL-terminated.patch + 0004-pulse-fix-size-calculation.patch + 0005-jack-fix-crash-on-close-when-metadata-are-not-available.patch + 0006-a2dpsink-only-request-new-data-when-buffer-is-done.patch + 0007-pulse-fix-counter-while-populating-car_info-profiles.patch + 0008-impl-link-reset-state-before-starting-allocation.patch + 0009-impl-core-clear-the-mempool.patch + 0010-mem-reset-the-map-in-clear.patch + 0011-avoid-uninitialized-variables.patch + 0012-dlclose-on-errors.patch + 0013-stream-handle-NULL-context.patch + 0014-state-always-update-state-variables.patch + 0015-spa-device-fix-leak-of-properties-in-error-case.patch + 0016-alsa-dont-leak-structure-on-error.patch + 0017-alsa-dont-leak-properties-on-error.patch + 0018-stream-fix-some-more-leaks-in-error-paths.patch + 0019-buffers-increase-max-datas-and-metadata-in-buffers.patch + 0020-gst-return-NULL-for-unknown-format.patch- Rebase patches used in SLE/Leap: + do-not-use-snd_pcm_ioplug_hw_avail.patch + fix-memfd_create-call.patch- Update to version 0.3.6 (boo#1171433, jsc#ECO-2308): + Extensive memory leak fixing and stress testing was done. A big leak in screen sharing with DMA-BUF was fixed. + Compile fixes + Stability improvements in jack and pulseaudio layers. + Added the old portal module to make the Camera portal work again. This will be moved to the session manager in future versions. + Improvements to the GStreamer source and sink shutdown. + Fix compatibility with v2 clients again when negotiating buffers. - Disable vulkan if the vulkan package is too old (as in SLE 15 SP0 and SP1) - Add patch to build with meson >= 0.46.0 since 0.50.0 is not really needed: + fix-meson-required-version.patch- Filter out libpulse.so.0 and libjack.so.0 automatic provides so this is not considered an alternative when resolving dependencies in the distribution.- Add patch to fix build in SLE/Leap where alsa doesn't have a snd_pcm_ioplug_hw_avail function: + do-not-use-snd_pcm_ioplug_hw_avail.patch- Update to version 0.3.5: + Compiler fixes + Add pw-midiplay and pw-midirecord aliases + Add pw-mididump tool + Add pw-metadata tool to inspect, add and remove metadata for objects. + Docs updates, man pages + install alsa config files + Fix linked sink/source in pulseaudio + ratelimit graph processing warnings + improve buffer handling in GStreamer elements + Fix power usage by removing the queue for the alsa sequencer system announce messages. + Fix metadata clear() method dispatch. + Improve parameter enumeration, make it possible to detect missing parameters vs no-compatible parameters so that we can use defaults in the first case and error in the second case. + Fix cleanup of proxy objects. Stability improvements on plug/unplug in session manager. + Make it possible to set log level from config file + improve debug of param negotiation errors. Log the parameters to stderr/journal. + Make it possible to configure global logger implementation. + Fix NEON detection + JACK and PulseAudio compatibility improvements - Update to version 0.3.4: + A quick update with some important stability fixes. - Update to version 0.3.3: + NEON optimizations for audio conversion (32 and 64 bits) + rework of session manager implementation + Add option to disable modules in the session manager + Release midi hardware devices when suspended + various build fixes + Clean up options of various utils + Stability improvements + Mayor improvements in pulseaudio emulation. Improved timings and compatibility. + Implementation of drain and flush in pulse and alsa emulation. + Implement poll on file descriptors. + Improvement of metadata for jack emulation. + Fix memory and thread problems in jack emulation. + Simplification of state changes. Should make more use cases work in the jack emulation. + Improvements in the gstreamer elements. Removal of extra internal queue. pipewiresink can now be used to play audio. + Add pw-jack and pw-pulse scripts to run pulseaudio and jack applications with the right library path. - Replace libpulse* replacement packages with a single pipewire-libpulse-0_3 package that includes all libraries installed in the non-standard directory %{_libdir}/pipewire-0.3/pulse and a new pw-pulse wrapper script. Likewise for the jack replacement libraries in a new pipewire-libjack-0_3 package. - Use update-alternatives for the wrapper scripts.- Use the License rpm tag to specify that although most of pipewire is licensed under MIT, the pulseaudio replacement library is licensed under LGPL-2.1+.- Use gcc9 to build in SLE-15 / Leap 15, since at least gcc8 is needed now.- Update to version 0.3.2: + build fixes + Added support for data type negotiation. This makes it possible for a client to say that it can handle DMABuf and MemFd and then let the server select a compatible format. + Handle errors when enumerating parameters better. + Add support for rate, format, channels and period_bytes to the alsa config file to restrict what alsa apps can negotiate. + Fix JACK midi output. + Optimizations in common audio format conversions using AVX2. Small optimizations to plugins. + Change the vulkan compute example to an MIT licensed shader. + Remove some hardcoded defaults in the audio and video processing and use the values from the processing context. This also fixes the vulkan example. + Correct the documentation and defaults in the daemon config file. + Fix alsa and v4l2 buffer recycle. A paused client could cause the server to leak all buffers. + Remove some warnings that should be ignored. + Fix a crash in the bluez5 plugins. + Try to select higher quality formats first when negotiating a format with an audio device. + Fix an infinite loop in udev detection in some cases. + Add non-interactive mode to pw-cli. You can now just do "pw-cli ls Port" to get a listing of all ports. pw-cli will now also connect to the default server by default and has options to select a different server. + Allow the server to go up to the maximum quantum (8192 samples or ~=180ms) if a client explicitly wants this.- Update to version 0.3.1+48: + Fix 32bit build.- Switch to source service, update to explicit head, file with non-compliant license replaced.- Switch license to MIT and actually package it. - Add doxygen, graphviz and xmltoman BuildRequires and pass docs and man = true to meson, build documentation. Package docs in a new docs sub-package. - Add check section and run meson_test macro, run tests during build. - Add fdupes BuildRequires and pass fdupes macro, remove duplicate files.- Update to version 0.3.1: + This is a bugfix release that is API and ABI compatible with previous 0.3.x releases. + Don't load the rtkit module by default. It can cause a sigkill, which is not desirable for mutter, for example. Only enable this for the jack library for now. + Don't use pthread cancel by default because it uses a signal that might crash some apps. Only use it for the jack library because jack clients really expect this. + Build fixes for -Werror=suggest-attribute=format + improve error messages, don't report harmless errors and warnings. Try to send error messages to the proxy that started the operation or is the owner of the object. + pw-cat: midi improvement, add midi recording and dump in verbose mode + fix properties when loading spa-nodes from the config + Fix and update some examples + jack: check arguments and don't crash when invalid + Fix buffer memory upload. + jack: fix compatibility with zrythm. Fix timemaster install, improve sample_rate callback. Fix reposition handling. + fix crash in port after buffer negotiation error. + add support for control ports in pw_filter + fix cleanup of the metadata module + improve param enumeration. + Clear stream buffers when the format is cleared. + Add create-object command in the config file to create object from a factory. + Fix crash after the driver was not removed from unassigned nodes. Also properly pause inactive nodes. + Use "true" and "false" in properties when we are talking about a boolean. + pulseaudio: improve compatibility- Add patch to build correctly with glibc < 2.27 (like in SLE/Leap): + fix-memfd_create-call.patch- Add BuildRequires for pkgconfig(sndfile) and pkgconfig(vulkan) so the vulkan plugin is built. - Version the spa-plugins subpackage so different versions of the plugins can be co-installed in the future.- Update to version 0.3.0: + The 0.3 release is a major milestone in the developement of PipeWire. It features a complete redesign of the scheduling mechanisms that make it possible to run a JACK compatibility layer with comparable performance to JACK2. + The API has been reworked and is declared stable now. All developement files and runtime paths are versioned so that future incompatible changes can be done without breaking exising applications. + PipeWire 0.3 also includes a (now mandatory) session manager that populates and controls the PipeWire graph. This example session manager is very simple and not configurable. It is expected that future version will either switch to a more flexible session manager (like WirePlumber) or improve the configuration options of the example session manager. + PipeWire 0.3 includes both PulseAudio, JACK and ALSA compatibility libraries that are known to support a wide range of applications. The ALSA library is pretty complete at this point. The JACK and mostly the PulseAudio compatibility libraries need more work. See the Wiki pages for the current compatibility problems. We do not yet encourage people to switch away from their existing audio solutions (PulseAudio or JACK) but we would love to hear from people who try it anyways. Future versions will mostly focus on improving compatibility further to make PipeWire a drop-in replacement. PipeWire comes with some GStreamer plugins to consume and produce data for PipeWire. The consumer (pipewiresrc) is working well in most cases. The sink (pipewiresink) is known to be somewhat problematic for now. - Add pkgconfig(bluez) and pkgconfig(libpulse) BuildRequires: New dependencies. - Bump libpipewire, apiver and spa_ver define following upstreams changes. Also add a new sover define. - Package new subpackages: libjack-pw0_3_0, libpulse-mainloop-glib-pw0_3_0, libpulse-pw0_3_0 and libpulse-simple-pw0_3_0, as well as handle them in post(un). - Adjust options passed to meson following upstreams changes.- Update to version 0.2.7: + Add support for alsa-lib 1.1.9 which changed the include path + Improve error checking and reporting in the protocol + deviceprovider: fix probing without starting + add sentinel to some functions + compiler fixes for musl + Revert object tree permission checks that broke things, this is probably not a good idea (and the tree of objects is going to be removed later)- Update to version 0.2.6: + Improve error checking for threads. + Fix some memory and fd leaks. + Fix compilation with C++ compilers and clang. + DISABLE_RTKIT should now not try to use dbus at all. + Camera Portal fixes: - add Camera media.role. - Rename module-flatpak to module-portal. - Use the portal permissions store for camera checks. + Actually use the passed fd in pipewiresrc. + Make properties with "pipewire." prefix read-only. + Add security label to client object. + Enforce link permissions. + Permissions of objects are now combined with parent permissions. + Remove libv4l2 dependency, it is not used. + Improve format negotiation in autolink #146. + Try to avoid list corruption with event emmission #143. + Fix destroy of client-node memory corruption. + Various small improvements. - Remove pkgconfig(libv4l2) BuildRequires: follow upstreams cleanup of build dependencies. - Drop avoid-invalid-conversion-error-with-C++.patch: fixed upstream.- Add patch to fix use of headers from C++: + avoid-invalid-conversion-error-with-C++.patch- Update to version 0.2.5: + Build fixes for systemd. + Add cursor and bitmap metadata. This can be used to send a cursor sprite with the video stream. + Permissions were set too strict for non-flatpak clients. + Fix crash in loop caused by thread unsafe hook emission. + Add more error checking for thread-loop. + Small cleanups and bugfixes. - Drop libspa define and add spa_ver define, and following this drop libspa-lib1 subpackage, no longer built. - Drop doxygen BuildRequires and manpages source, follow upstream in not building docs nor manually installing manpages that have to be updated every version bump to ensure they are current. - Add pkgconfig(libsystemd) BuildRequires: New dependency. - Update options passed to meson following upstream changes.- Update to version 0.2.2: + Add apiversion to pkgconfig as well. - Add apiver define and set it to 0.2. - Bump libpipewire define to libpipewire-0_2-1 and libspa define to libspa-lib1 following upstream changes.- Update to version 0.2.1: + stream: update to latest API. + hook: add private data for future expansion.- Update to version 0.2.0 + No changelog provided by upstream. To see the changes in this version, please browse the commit logs at https://github.com/PipeWire/pipewire/commits/0.2.0 .- Initial package, version 0.1.9.h04-armsrv2 1728050940  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~1.0.5+git36.60deeb2-150600.3.3.51.0.5+git36.60deeb2-150600.3.3.5pipewirehtmlaac-types_8h_source.htmlaac-utils_8h.htmlaac-utils_8h_source.htmlaac_8h_source.htmlaec_8h_source.htmlalac-utils_8h.htmlalac-utils_8h_source.htmlalac_8h_source.htmlalloc_8h.htmlalloc_8h_source.htmlamr-types_8h_source.htmlamr-utils_8h.htmlamr-utils_8h_source.htmlamr_8h_source.htmlannotated.htmlannotated_dup.jsansi_8h.htmlansi_8h_source.htmlape-utils_8h.htmlape-utils_8h_source.htmlape_8h_source.htmlarray_8h.htmlarray_8h_source.htmlatomic_8h_source.htmlaudio-capture_8c-example.htmlaudio-dsp-filter_8c-example.htmlaudio-dsp-src_8c-example.htmlaudio-src_8c-example.htmlaudio_2dsp-utils_8h.htmlaudio_2dsp-utils_8h_source.htmlaudio_2dsp_8h_source.htmlaudio_2format-utils_8h.htmlaudio_2format-utils_8h_source.htmlaudio_2raw-types_8h.htmlaudio_2raw-types_8h_source.htmlaudio_2raw-utils_8h.htmlaudio_2raw-utils_8h_source.htmlaudio_2raw_8h.htmlaudio_2raw_8h_source.htmlaudio_8h.htmlaudio_8h_source.htmlbc_s.pngbc_sd.pngbluez-session_8c-example.htmlbuffer_2buffer_8h.htmlbuffer_2buffer_8h_source.htmlbuffer_2type-info_8h.htmlbuffer_2type-info_8h_source.htmlbuffers-types_8h.htmlbuffers-types_8h_source.htmlbuilder_8h.htmlbuilder_8h_source.htmlchroma_8h.htmlchroma_8h_source.htmlclasses.htmlcleanup_8h_source.htmlclient-node_8h.htmlclient-node_8h_source.htmlclient_8h.htmlclient_8h_source.htmlclipboard.jsclosed.pngcolor_8h.htmlcolor_8h_source.htmlcompare_8h.htmlcompare_8h_source.htmlcompressed_8h_source.htmlconf_8h.htmlconf_8h_source.htmlcontrol_2type-info_8h.htmlcontrol_2type-info_8h_source.htmlcookie.jscore_8h.htmlcore_8h_source.htmlcpu_8h.htmlcpu_8h_source.htmlcustom.cssdata-loop_8h.htmldata-loop_8h_source.htmldbus_8h.htmldbus_8h_source.htmldebug_2buffer_8h.htmldebug_2buffer_8h_source.htmldebug_2dict_8h.htmldebug_2dict_8h_source.htmldebug_2format_8h.htmldebug_2format_8h_source.htmldebug_2pod_8h.htmldebug_2pod_8h_source.htmldefs_8h.htmldefs_8h_source.htmldir_04817ca51e48fe558a7203e18f64c41a.htmldir_0b24bd5b194325df529fe025fad65461.htmldir_1fc7fb076ffdeded0fa710c385714030.htmldir_21648c7fc031422e5e89e33194b6c2db.htmldir_36f15a76b34aab76fd15ad9ec0b06ea0.htmldir_413b3620a8d75720f0a53b9a1885ab3e.htmldir_41d24b6f9fffcd4c1a989ef96d4a1949.htmldir_4bd15678142cd7a8c100cb6ff6c78d07.htmldir_4d4d314ee7f43f7dc4ee45371975ac0f.htmldir_51132c26eb7cf81ee6fe6c0c88fb466f.htmldir_5595d3405757fca7fbc886c76435514a.htmldir_59749fe04d63dd150186f21e2ceb86d3.htmldir_604f03dc507fb734ce0e8d7b070c2aaf.htmldir_652570497ce02bccf27ddba78dda491e.htmldir_6986fe1dc5665c3b6847aac90b04e9e9.htmldir_6bd25c25867debc7a223753ea0a0854b.htmldir_7129a66c92fe7beef816c2ac906ef0b3.htmldir_74ee4c511a6ff81cc2259ced20be9e7a.htmldir_829a904a692ff3f12932cec80d53c448.htmldir_847b9498d3ba6844b1972c87baa25147.htmldir_99cb2ffe0e3b417cc21a58f79c74f125.htmldir_a44cef7b128cb9c12fe6ed725c5bb6ba.htmldir_b3c2bb568534bdf2589223eda62522d4.htmldir_bb0906284b5cbe20924ccfbff6313bd7.htmldir_c6e31e2cc40bdde55a63967faafe166b.htmldir_ce8ec08451a1f81b801481b81262bca2.htmldir_cfcec03bef15df81c8ce4e7575bc0093.htmldir_ddb4d7e95cc2d6c8e1ade10a20d7247d.htmldir_e1dafc2aae721540c862e743888a2051.htmldir_e68e8157741866f444e17edd764ebbae.htmldir_e75cad33ebbdf3b470a7eac98ae5e539.htmldir_f880834161c9b0b22ffe664e43579a3f.htmldir_fdc1f3113a079005838a3ed3356ed61a.htmldll_8h_source.htmldoc.svgdocd.svgdoxygen-awesome.cssdoxygen.cssdoxygen.svgdoxygen_crawl.htmldsd-utils_8h.htmldsd-utils_8h_source.htmldsd_8h.htmldsd_8h_source.htmldynamic_8h_source.htmldynsections.jsencoded_8h_source.htmlenum-types_8h_source.htmlexamples.htmlexamples.jsexport-sink_8c-example.htmlexport-source_8c-example.htmlexport-spa-device_8c-example.htmlexport-spa_8c-example.htmlfactory_8h.htmlfactory_8h_source.htmlflac-utils_8h.htmlflac-utils_8h_source.htmlflac_8h_source.htmlfolderclosed.svgfolderclosedd.svgfolderopen.svgfolderopend.svgformat-types_8h.htmlformat-types_8h_source.htmlformat-utils_8h.htmlformat-utils_8h_source.htmlfunctions.htmlfunctions_a.htmlfunctions_b.htmlfunctions_c.htmlfunctions_d.htmlfunctions_e.htmlfunctions_f.htmlfunctions_g.htmlfunctions_h.htmlfunctions_i.htmlfunctions_j.htmlfunctions_k.htmlfunctions_l.htmlfunctions_m.htmlfunctions_n.htmlfunctions_o.htmlfunctions_p.htmlfunctions_q.htmlfunctions_r.htmlfunctions_s.htmlfunctions_t.htmlfunctions_u.htmlfunctions_v.htmlfunctions_vars.htmlfunctions_vars_a.htmlfunctions_vars_b.htmlfunctions_vars_c.htmlfunctions_vars_d.htmlfunctions_vars_e.htmlfunctions_vars_f.htmlfunctions_vars_g.htmlfunctions_vars_h.htmlfunctions_vars_i.htmlfunctions_vars_j.htmlfunctions_vars_k.htmlfunctions_vars_l.htmlfunctions_vars_m.htmlfunctions_vars_n.htmlfunctions_vars_o.htmlfunctions_vars_p.htmlfunctions_vars_q.htmlfunctions_vars_r.htmlfunctions_vars_s.htmlfunctions_vars_t.htmlfunctions_vars_u.htmlfunctions_vars_v.htmlfunctions_vars_w.htmlfunctions_vars_x.htmlfunctions_vars_y.htmlfunctions_vars_z.htmlfunctions_w.htmlfunctions_x.htmlfunctions_y.htmlfunctions_z.htmlglobal_8h.htmlglobal_8h_source.htmlglobals.htmlglobals_a.htmlglobals_b.htmlglobals_c.htmlglobals_d.htmlglobals_defs.htmlglobals_defs_a.htmlglobals_defs_b.htmlglobals_defs_c.htmlglobals_defs_d.htmlglobals_defs_e.htmlglobals_defs_f.htmlglobals_defs_g.htmlglobals_defs_h.htmlglobals_defs_i.htmlglobals_defs_j.htmlglobals_defs_k.htmlglobals_defs_l.htmlglobals_defs_m.htmlglobals_defs_n.htmlglobals_defs_p.htmlglobals_defs_r.htmlglobals_defs_s.htmlglobals_defs_t.htmlglobals_defs_u.htmlglobals_defs_v.htmlglobals_defs_w.htmlglobals_defs_z.htmlglobals_e.htmlglobals_enum.htmlglobals_eval.htmlglobals_eval_a.htmlglobals_eval_b.htmlglobals_eval_c.htmlglobals_eval_d.htmlglobals_eval_e.htmlglobals_eval_f.htmlglobals_eval_h.htmlglobals_eval_i.htmlglobals_eval_l.htmlglobals_eval_m.htmlglobals_eval_n.htmlglobals_eval_p.htmlglobals_eval_s.htmlglobals_eval_t.htmlglobals_eval_v.htmlglobals_f.htmlglobals_func.htmlglobals_func_b.htmlglobals_func_c.htmlglobals_func_d.htmlglobals_func_e.htmlglobals_func_f.htmlglobals_func_g.htmlglobals_func_h.htmlglobals_func_i.htmlglobals_func_j.htmlglobals_func_l.htmlglobals_func_m.htmlglobals_func_n.htmlglobals_func_p.htmlglobals_func_r.htmlglobals_func_s.htmlglobals_func_t.htmlglobals_func_u.htmlglobals_func_v.htmlglobals_func_w.htmlglobals_g.htmlglobals_h.htmlglobals_i.htmlglobals_j.htmlglobals_k.htmlglobals_l.htmlglobals_m.htmlglobals_n.htmlglobals_p.htmlglobals_r.htmlglobals_s.htmlglobals_t.htmlglobals_type.htmlglobals_u.htmlglobals_v.htmlglobals_vars.htmlglobals_w.htmlglobals_z.htmlgraph_8h.htmlgraph_8h_source.htmlgraph_legend.dotgraph_legend.htmlgroup__api__pw__core.htmlgroup__api__pw__core.jsgroup__api__pw__ext.htmlgroup__api__pw__ext.jsgroup__api__pw__impl.htmlgroup__api__pw__impl.jsgroup__api__pw__util.htmlgroup__api__pw__util.jsgroup__api__spa.htmlgroup__api__spa.jsgroup__pw__array.htmlgroup__pw__array.jsgroup__pw__buffers.htmlgroup__pw__buffers.jsgroup__pw__client.htmlgroup__pw__client.jsgroup__pw__client__node.htmlgroup__pw__client__node.jsgroup__pw__conf.htmlgroup__pw__conf.jsgroup__pw__context.htmlgroup__pw__context.jsgroup__pw__control.htmlgroup__pw__control.jsgroup__pw__core.htmlgroup__pw__core.jsgroup__pw__data__loop.htmlgroup__pw__data__loop.jsgroup__pw__device.htmlgroup__pw__device.jsgroup__pw__factory.htmlgroup__pw__factory.jsgroup__pw__filter.htmlgroup__pw__filter.jsgroup__pw__gettext.htmlgroup__pw__gettext.jsgroup__pw__global.htmlgroup__pw__global.jsgroup__pw__impl__client.htmlgroup__pw__impl__client.jsgroup__pw__impl__core.htmlgroup__pw__impl__core.jsgroup__pw__impl__device.htmlgroup__pw__impl__device.jsgroup__pw__impl__factory.htmlgroup__pw__impl__factory.jsgroup__pw__impl__link.htmlgroup__pw__impl__link.jsgroup__pw__impl__metadata.htmlgroup__pw__impl__metadata.jsgroup__pw__impl__module.htmlgroup__pw__impl__module.jsgroup__pw__impl__node.htmlgroup__pw__impl__node.jsgroup__pw__impl__port.htmlgroup__pw__impl__port.jsgroup__pw__keys.htmlgroup__pw__keys.jsgroup__pw__link.htmlgroup__pw__link.jsgroup__pw__log.htmlgroup__pw__log.jsgroup__pw__loop.htmlgroup__pw__loop.jsgroup__pw__main__loop.htmlgroup__pw__main__loop.jsgroup__pw__map.htmlgroup__pw__map.jsgroup__pw__memblock.htmlgroup__pw__memblock.jsgroup__pw__metadata.htmlgroup__pw__metadata.jsgroup__pw__module.htmlgroup__pw__module.jsgroup__pw__node.htmlgroup__pw__node.jsgroup__pw__permission.htmlgroup__pw__permission.jsgroup__pw__pipewire.htmlgroup__pw__pipewire.jsgroup__pw__port.htmlgroup__pw__port.jsgroup__pw__profiler.htmlgroup__pw__profiler.jsgroup__pw__properties.htmlgroup__pw__properties.jsgroup__pw__protocol.htmlgroup__pw__protocol.jsgroup__pw__protocol__native.htmlgroup__pw__protocol__native.jsgroup__pw__proxy.htmlgroup__pw__proxy.jsgroup__pw__registry.htmlgroup__pw__registry.jsgroup__pw__resource.htmlgroup__pw__resource.jsgroup__pw__session__manager.htmlgroup__pw__session__manager.jsgroup__pw__stream.htmlgroup__pw__stream.jsgroup__pw__thread.htmlgroup__pw__thread.jsgroup__pw__thread__loop.htmlgroup__pw__thread__loop.jsgroup__pw__type.htmlgroup__pw__type.jsgroup__pw__utils.htmlgroup__pw__utils.jsgroup__pw__work__queue.htmlgroup__pw__work__queue.jsgroup__spa__ansi.htmlgroup__spa__ansi.jsgroup__spa__buffer.htmlgroup__spa__buffer.jsgroup__spa__control.htmlgroup__spa__control.jsgroup__spa__cpu.htmlgroup__spa__cpu.jsgroup__spa__dbus.htmlgroup__spa__dbus.jsgroup__spa__debug.htmlgroup__spa__debug.jsgroup__spa__device.htmlgroup__spa__device.jsgroup__spa__dict.htmlgroup__spa__dict.jsgroup__spa__graph.htmlgroup__spa__graph.jsgroup__spa__handle.htmlgroup__spa__handle.jsgroup__spa__hooks.htmlgroup__spa__hooks.jsgroup__spa__i18n.htmlgroup__spa__i18n.jsgroup__spa__interfaces.htmlgroup__spa__interfaces.jsgroup__spa__json.htmlgroup__spa__json.jsgroup__spa__json__pod.htmlgroup__spa__json__pod.jsgroup__spa__keys.htmlgroup__spa__keys.jsgroup__spa__list.htmlgroup__spa__list.jsgroup__spa__log.htmlgroup__spa__log.jsgroup__spa__loop.htmlgroup__spa__loop.jsgroup__spa__names.htmlgroup__spa__names.jsgroup__spa__node.htmlgroup__spa__node.jsgroup__spa__param.htmlgroup__spa__param.jsgroup__spa__plugin__loader.htmlgroup__spa__plugin__loader.jsgroup__spa__pod.htmlgroup__spa__pod.jsgroup__spa__result.htmlgroup__spa__result.jsgroup__spa__ringbuffer.htmlgroup__spa__ringbuffer.jsgroup__spa__string.htmlgroup__spa__string.jsgroup__spa__support.htmlgroup__spa__support.jsgroup__spa__system.htmlgroup__spa__system.jsgroup__spa__thread.htmlgroup__spa__thread.jsgroup__spa__types.htmlgroup__spa__types.jsgroup__spa__utils.htmlgroup__spa__utils.jsgroup__spa__utils__defs.htmlgroup__spa__utils__defs.jsh264-utils_8h.htmlh264-utils_8h_source.htmlh264_8h.htmlh264_8h_source.htmlhook_8h.htmlhook_8h_source.htmliec958-types_8h_source.htmliec958-utils_8h.htmliec958-utils_8h_source.htmliec958_8h.htmliec958_8h_source.htmlimpl-client_8h.htmlimpl-client_8h_source.htmlimpl-core_8h.htmlimpl-core_8h_source.htmlimpl-device_8h.htmlimpl-device_8h_source.htmlimpl-factory_8h.htmlimpl-factory_8h_source.htmlimpl-interfaces_8h.htmlimpl-interfaces_8h_source.htmlimpl-link_8h.htmlimpl-link_8h_source.htmlimpl-metadata_8h.htmlimpl-metadata_8h_source.htmlimpl-module_8h.htmlimpl-module_8h_source.htmlimpl-node_8h.htmlimpl-node_8h_source.htmlimpl-port_8h.htmlimpl-port_8h_source.htmlimpl_8h.htmlimpl_8h_source.htmlindex.htmlinterfaces_8h.htmlinterfaces_8h_source.htmlinternal_8c-example.htmlintrospect-funcs_8h.htmlintrospect-funcs_8h_source.htmlintrospect_8h.htmlintrospect_8h_source.htmlio_8h.htmlio_8h_source.htmliter_8h.htmliter_8h_source.htmljquery.jsjson-pod_8h.htmljson-pod_8h_source.htmljson_8h.htmljson_8h_source.htmllatency-types_8h.htmllatency-types_8h_source.htmllatency-utils_8h.htmllatency-utils_8h_source.htmllatency_8h.htmllatency_8h_source.htmllayout_8h.htmllayout_8h_source.htmllink_8h.htmllink_8h_source.htmllist_8h.htmllist_8h_source.htmllocal-v4l2_8c-example.htmllog-impl_8h.htmllog-impl_8h_source.htmlmain-loop_8h.htmlmain-loop_8h_source.htmlmap_8h.htmlmap_8h_source.htmlmenu.jsmenudata.jsmeta_8h.htmlmeta_8h_source.htmlmetadata_8h.htmlmetadata_8h_source.htmlminus.svgminusd.svgmjpg-utils_8h.htmlmjpg-utils_8h_source.htmlmjpg_8h.htmlmjpg_8h_source.htmlmodule_8h.htmlmodule_8h_source.htmlmonitor_2event_8h.htmlmonitor_2event_8h_source.htmlmonitor_2type-info_8h.htmlmonitor_2type-info_8h_source.htmlmp3-types_8h_source.htmlmp3-utils_8h.htmlmp3-utils_8h_source.htmlmp3_8h_source.htmlmultiview_8h.htmlmultiview_8h_source.htmlnames_8h.htmlnames_8h_source.htmlnav_f.pngnav_fd.pngnav_g.pngnav_h.pngnav_hd.pngnavtree.cssnavtree.jsnavtreedata.jsnavtreeindex0.jsnavtreeindex1.jsnavtreeindex10.jsnavtreeindex11.jsnavtreeindex12.jsnavtreeindex13.jsnavtreeindex14.jsnavtreeindex15.jsnavtreeindex16.jsnavtreeindex17.jsnavtreeindex18.jsnavtreeindex19.jsnavtreeindex2.jsnavtreeindex20.jsnavtreeindex21.jsnavtreeindex3.jsnavtreeindex4.jsnavtreeindex5.jsnavtreeindex6.jsnavtreeindex7.jsnavtreeindex8.jsnavtreeindex9.jsnode_2command_8h.htmlnode_2command_8h_source.htmlnode_2event_8h.htmlnode_2event_8h_source.htmlnode_2type-info_8h.htmlnode_2type-info_8h_source.htmlopen.pngopus_8h_source.htmlpage_access.htmlpage_api.htmlpage_api.jspage_audio.htmlpage_client_impl.htmlpage_config.htmlpage_config.jspage_daemon.htmlpage_design.htmlpage_dma_buf.htmlpage_examples.htmlpage_internals.htmlpage_internals.jspage_library.htmlpage_man_libpipewire-modules_7.htmlpage_man_pipewire-client_conf_5.htmlpage_man_pipewire-devices_7.htmlpage_man_pipewire-filter-chain_conf_5.htmlpage_man_pipewire-jack_conf_5.htmlpage_man_pipewire-pulse-modules_7.htmlpage_man_pipewire-pulse_1.htmlpage_man_pipewire-pulse_conf_5.htmlpage_man_pipewire_1.htmlpage_man_pipewire_conf_5.htmlpage_man_pw-cat_1.htmlpage_man_pw-cli_1.htmlpage_man_pw-config_1.htmlpage_man_pw-dot_1.htmlpage_man_pw-dump_1.htmlpage_man_pw-jack_1.htmlpage_man_pw-link_1.htmlpage_man_pw-loopback_1.htmlpage_man_pw-metadata_1.htmlpage_man_pw-mididump_1.htmlpage_man_pw-mon_1.htmlpage_man_pw-profiler_1.htmlpage_man_pw-reserve_1.htmlpage_man_pw-top_1.htmlpage_man_pw-v4l2_1.htmlpage_man_spa-acp-tool_1.htmlpage_man_spa-inspect_1.htmlpage_man_spa-json-dump_1.htmlpage_man_spa-monitor_1.htmlpage_man_spa-resample_1.htmlpage_midi.htmlpage_module_access.htmlpage_module_adapter.htmlpage_module_avb.htmlpage_module_client_device.htmlpage_module_client_node.htmlpage_module_combine_stream.htmlpage_module_echo_cancel.htmlpage_module_example_filter.htmlpage_module_example_sink.htmlpage_module_example_source.htmlpage_module_fallback_sink.htmlpage_module_ffado_driver.htmlpage_module_filter_chain.htmlpage_module_jack_tunnel.htmlpage_module_jackdbus_detect.htmlpage_module_link_factory.htmlpage_module_loopback.htmlpage_module_metadata.htmlpage_module_netjack2_driver.htmlpage_module_netjack2_manager.htmlpage_module_pipe_tunnel.htmlpage_module_portal.htmlpage_module_profiler.htmlpage_module_protocol_native.htmlpage_module_protocol_pulse.htmlpage_module_protocol_simple.htmlpage_module_pulse_tunnel.htmlpage_module_raop_discover.htmlpage_module_raop_sink.htmlpage_module_roc_sink.htmlpage_module_roc_source.htmlpage_module_rt.htmlpage_module_rtp_sap.htmlpage_module_rtp_session.htmlpage_module_rtp_sink.htmlpage_module_rtp_source.htmlpage_module_session_manager.htmlpage_module_vban_recv.htmlpage_module_vban_send.htmlpage_module_x11_bell.htmlpage_module_zeroconf_discover.htmlpage_modules.htmlpage_modules.jspage_native_protocol.htmlpage_objects_design.htmlpage_overview.htmlpage_portal.htmlpage_programs.htmlpage_programs.jspage_proxy.htmlpage_pulse_module_alsa_sink.htmlpage_pulse_module_alsa_source.htmlpage_pulse_module_always_sink.htmlpage_pulse_module_combine_sink.htmlpage_pulse_module_echo_cancel.htmlpage_pulse_module_gsettings.htmlpage_pulse_module_jackdbus_detect.htmlpage_pulse_module_ladspa_sink.htmlpage_pulse_module_ladspa_source.htmlpage_pulse_module_loopback.htmlpage_pulse_module_native_protocol_tcp.htmlpage_pulse_module_null_sink.htmlpage_pulse_module_pipe_sink.htmlpage_pulse_module_pipe_source.htmlpage_pulse_module_raop_discover.htmlpage_pulse_module_remap_sink.htmlpage_pulse_module_remap_source.htmlpage_pulse_module_roc_sink.htmlpage_pulse_module_roc_sink_input.htmlpage_pulse_module_roc_source.htmlpage_pulse_module_rtp_recv.htmlpage_pulse_module_rtp_send.htmlpage_pulse_module_simple_protocol_tcp.htmlpage_pulse_module_switch_on_connect.htmlpage_pulse_module_tunnel_sink.htmlpage_pulse_module_tunnel_source.htmlpage_pulse_module_virtual_sink.htmlpage_pulse_module_virtual_source.htmlpage_pulse_module_x11_bell.htmlpage_pulse_module_zeroconf_discover.htmlpage_pulse_module_zeroconf_publish.htmlpage_pulse_modules.htmlpage_pulse_modules.jspage_pulseaudio.htmlpage_scheduling.htmlpage_session_manager.htmlpage_spa.htmlpage_spa.jspage_spa_buffer.htmlpage_spa_design.htmlpage_spa_plugins.htmlpage_spa_pod.htmlpage_streams.htmlpage_thread_loop.htmlpage_tutorial.htmlpage_tutorial.jspage_tutorial1.htmlpage_tutorial2.htmlpage_tutorial3.htmlpage_tutorial4.htmlpage_tutorial5.htmlpage_tutorial6.htmlpages.htmlparam-types_8h.htmlparam-types_8h_source.htmlparam_2audio_2format_8h.htmlparam_2audio_2format_8h_source.htmlparam_2audio_2type-info_8h_source.htmlparam_2bluetooth_2type-info_8h.htmlparam_2bluetooth_2type-info_8h_source.htmlparam_2format_8h.htmlparam_2format_8h_source.htmlparam_2type-info_8h_source.htmlparam_2video_2format_8h.htmlparam_2video_2format_8h_source.htmlparam_2video_2type-info_8h_source.htmlparam_8h.htmlparam_8h_source.htmlparser_8h.htmlparser_8h_source.htmlpermission_8h.htmlpermission_8h_source.htmlpipewire_8h.htmlpipewire_8h_source.htmlplugin-loader_8h.htmlplugin-loader_8h_source.htmlplugin_8h.htmlplugin_8h_source.htmlplus.svgplusd.svgpod_2command_8h.htmlpod_2command_8h_source.htmlpod_2event_8h.htmlpod_2event_8h_source.htmlpod_2pod_8h.htmlpod_2pod_8h_source.htmlport-config-types_8h.htmlport-config-types_8h_source.htmlport-config_8h.htmlport-config_8h_source.htmlport_8h.htmlport_8h_source.htmlprofile-types_8h.htmlprofile-types_8h_source.htmlprofile_8h.htmlprofile_8h_source.htmlprofiler-types_8h.htmlprofiler-types_8h_source.htmlproperties_8h.htmlproperties_8h_source.htmlprops-types_8h.htmlprops-types_8h_source.htmlprops_8h.htmlprops_8h_source.htmlprotocol-native_8h.htmlprotocol-native_8h_source.htmlprotocol_8h.htmlprotocol_8h_source.htmlproxy_8h.htmlproxy_8h_source.htmlra-utils_8h.htmlra-utils_8h_source.htmlra_8h_source.htmlratelimit_8h_source.htmlresize.jsresource_8h.htmlresource_8h_source.htmlresult_8h.htmlresult_8h_source.htmlringbuffer_8h.htmlringbuffer_8h_source.htmlroute-types_8h.htmlroute-types_8h_source.htmlroute_8h.htmlroute_8h_source.htmlsearchall_0.jsall_1.jsall_10.jsall_11.jsall_12.jsall_13.jsall_14.jsall_15.jsall_16.jsall_17.jsall_18.jsall_19.jsall_1a.jsall_1b.jsall_1c.jsall_1d.jsall_1e.jsall_1f.jsall_2.jsall_20.jsall_3.jsall_4.jsall_5.jsall_6.jsall_7.jsall_8.jsall_9.jsall_a.jsall_b.jsall_c.jsall_d.jsall_e.jsall_f.jsclasses_0.jsclasses_1.jsclasses_2.jsclose.svgdefines_0.jsdefines_1.jsdefines_2.jsdefines_3.jsenums_0.jsenums_1.jsenumvalues_0.jsenumvalues_1.jsenumvalues_2.jsfiles_0.jsfiles_1.jsfiles_10.jsfiles_11.jsfiles_12.jsfiles_13.jsfiles_14.jsfiles_2.jsfiles_3.jsfiles_4.jsfiles_5.jsfiles_6.jsfiles_7.jsfiles_8.jsfiles_9.jsfiles_a.jsfiles_b.jsfiles_c.jsfiles_d.jsfiles_e.jsfiles_f.jsfunctions_0.jsfunctions_1.jsgroups_0.jsgroups_1.jsgroups_10.jsgroups_11.jsgroups_12.jsgroups_13.jsgroups_14.jsgroups_2.jsgroups_3.jsgroups_4.jsgroups_5.jsgroups_6.jsgroups_7.jsgroups_8.jsgroups_9.jsgroups_a.jsgroups_b.jsgroups_c.jsgroups_d.jsgroups_e.jsgroups_f.jsmag.svgmag_d.svgmag_sel.svgmag_seld.svgpages_0.jspages_1.jspages_10.jspages_11.jspages_12.jspages_13.jspages_14.jspages_15.jspages_16.jspages_17.jspages_18.jspages_19.jspages_1a.jspages_2.jspages_3.jspages_4.jspages_5.jspages_6.jspages_7.jspages_8.jspages_9.jspages_a.jspages_b.jspages_c.jspages_d.jspages_e.jspages_f.jssearch.csssearch.jssearchdata.jstypedefs_0.jstypedefs_1.jsvariables_0.jsvariables_1.jsvariables_10.jsvariables_11.jsvariables_12.jsvariables_13.jsvariables_14.jsvariables_15.jsvariables_16.jsvariables_17.jsvariables_18.jsvariables_19.jsvariables_1a.jsvariables_2.jsvariables_3.jsvariables_4.jsvariables_5.jsvariables_6.jsvariables_7.jsvariables_8.jsvariables_9.jsvariables_a.jsvariables_b.jsvariables_c.jsvariables_d.jsvariables_e.jsvariables_f.jssession-manager_8h.htmlsession-manager_8h_source.htmlspa_2examples_2adapter-control_8c-example.htmlspa_2examples_2example-control_8c-example.htmlspa_2examples_2local-libcamera_8c-example.htmlspa_2examples_2local-v4l2_8c-example.htmlspa_2include_2spa_2control_2control_8h.htmlspa_2include_2spa_2control_2control_8h_source.htmlspa_2include_2spa_2debug_2context_8h.htmlspa_2include_2spa_2debug_2context_8h_source.htmlspa_2include_2spa_2debug_2log_8h.htmlspa_2include_2spa_2debug_2log_8h_source.htmlspa_2include_2spa_2debug_2mem_8h.htmlspa_2include_2spa_2debug_2mem_8h_source.htmlspa_2include_2spa_2debug_2node_8h.htmlspa_2include_2spa_2debug_2node_8h_source.htmlspa_2include_2spa_2monitor_2device_8h.htmlspa_2include_2spa_2monitor_2device_8h_source.htmlspa_2include_2spa_2monitor_2utils_8h.htmlspa_2include_2spa_2monitor_2utils_8h_source.htmlspa_2include_2spa_2node_2keys_8h.htmlspa_2include_2spa_2node_2keys_8h_source.htmlspa_2include_2spa_2node_2node_8h.htmlspa_2include_2spa_2node_2node_8h_source.htmlspa_2include_2spa_2node_2utils_8h.htmlspa_2include_2spa_2node_2utils_8h_source.htmlspa_2include_2spa_2param_2buffers_8h.htmlspa_2include_2spa_2param_2buffers_8h_source.htmlspa_2include_2spa_2param_2profiler_8h.htmlspa_2include_2spa_2param_2profiler_8h_source.htmlspa_2include_2spa_2pod_2filter_8h.htmlspa_2include_2spa_2pod_2filter_8h_source.htmlspa_2include_2spa_2support_2i18n_8h.htmlspa_2include_2spa_2support_2i18n_8h_source.htmlspa_2include_2spa_2support_2log_8h.htmlspa_2include_2spa_2support_2log_8h_source.htmlspa_2include_2spa_2support_2loop_8h.htmlspa_2include_2spa_2support_2loop_8h_source.htmlspa_2include_2spa_2support_2thread_8h.htmlspa_2include_2spa_2support_2thread_8h_source.htmlspa_2include_2spa_2utils_2keys_8h.htmlspa_2include_2spa_2utils_2keys_8h_source.htmlspa_2include_2spa_2utils_2type_8h.htmlspa_2include_2spa_2utils_2type_8h_source.htmlsplitbar.pngsplitbard.pngsrc_2pipewire_2buffers_8h.htmlsrc_2pipewire_2buffers_8h_source.htmlsrc_2pipewire_2context_8h.htmlsrc_2pipewire_2context_8h_source.htmlsrc_2pipewire_2control_8h.htmlsrc_2pipewire_2control_8h_source.htmlsrc_2pipewire_2device_8h.htmlsrc_2pipewire_2device_8h_source.htmlsrc_2pipewire_2extensions_2profiler_8h.htmlsrc_2pipewire_2extensions_2profiler_8h_source.htmlsrc_2pipewire_2extensions_2session-manager_2keys_8h.htmlsrc_2pipewire_2extensions_2session-manager_2keys_8h_source.htmlsrc_2pipewire_2filter_8h.htmlsrc_2pipewire_2filter_8h_source.htmlsrc_2pipewire_2i18n_8h.htmlsrc_2pipewire_2i18n_8h_source.htmlsrc_2pipewire_2keys_8h.htmlsrc_2pipewire_2keys_8h_source.htmlsrc_2pipewire_2log_8h.htmlsrc_2pipewire_2log_8h_source.htmlsrc_2pipewire_2loop_8h.htmlsrc_2pipewire_2loop_8h_source.htmlsrc_2pipewire_2mem_8h.htmlsrc_2pipewire_2mem_8h_source.htmlsrc_2pipewire_2node_8h.htmlsrc_2pipewire_2node_8h_source.htmlsrc_2pipewire_2thread_8h.htmlsrc_2pipewire_2thread_8h_source.htmlsrc_2pipewire_2type_8h.htmlsrc_2pipewire_2type_8h_source.htmlsrc_2pipewire_2utils_8h.htmlsrc_2pipewire_2utils_8h_source.htmlstream_8h.htmlstream_8h_source.htmlstring_8h.htmlstring_8h_source.htmlstructitimerspec.htmlstructpw__array.htmlstructpw__array.jsstructpw__buffer.htmlstructpw__buffer.jsstructpw__buffers.htmlstructpw__buffers.jsstructpw__client.htmlstructpw__client__endpoint.htmlstructpw__client__endpoint__events.htmlstructpw__client__endpoint__events.jsstructpw__client__endpoint__methods.htmlstructpw__client__endpoint__methods.jsstructpw__client__events.htmlstructpw__client__events.jsstructpw__client__info.htmlstructpw__client__info.jsstructpw__client__methods.htmlstructpw__client__methods.jsstructpw__client__node.htmlstructpw__client__node__buffer.htmlstructpw__client__node__buffer.jsstructpw__client__node__events.htmlstructpw__client__node__events.jsstructpw__client__node__methods.htmlstructpw__client__node__methods.jsstructpw__client__session.htmlstructpw__client__session__events.htmlstructpw__client__session__events.jsstructpw__client__session__methods.htmlstructpw__client__session__methods.jsstructpw__context.htmlstructpw__context__events.htmlstructpw__context__events.jsstructpw__control.htmlstructpw__control__events.htmlstructpw__control__events.jsstructpw__core.htmlstructpw__core__events.htmlstructpw__core__events.jsstructpw__core__info.htmlstructpw__core__info.jsstructpw__core__methods.htmlstructpw__core__methods.jsstructpw__data__loop.htmlstructpw__data__loop__events.htmlstructpw__data__loop__events.jsstructpw__device.htmlstructpw__device__events.htmlstructpw__device__events.jsstructpw__device__info.htmlstructpw__device__info.jsstructpw__device__methods.htmlstructpw__device__methods.jsstructpw__endpoint.htmlstructpw__endpoint__events.htmlstructpw__endpoint__events.jsstructpw__endpoint__info.htmlstructpw__endpoint__info.jsstructpw__endpoint__link.htmlstructpw__endpoint__link__events.htmlstructpw__endpoint__link__events.jsstructpw__endpoint__link__info.htmlstructpw__endpoint__link__info.jsstructpw__endpoint__link__methods.htmlstructpw__endpoint__link__methods.jsstructpw__endpoint__methods.htmlstructpw__endpoint__methods.jsstructpw__endpoint__stream.htmlstructpw__endpoint__stream__events.htmlstructpw__endpoint__stream__events.jsstructpw__endpoint__stream__info.htmlstructpw__endpoint__stream__info.jsstructpw__endpoint__stream__methods.htmlstructpw__endpoint__stream__methods.jsstructpw__export__type.htmlstructpw__export__type.jsstructpw__factory.htmlstructpw__factory__events.htmlstructpw__factory__events.jsstructpw__factory__info.htmlstructpw__factory__info.jsstructpw__factory__methods.htmlstructpw__factory__methods.jsstructpw__filter.htmlstructpw__filter__events.htmlstructpw__filter__events.jsstructpw__global.htmlstructpw__global__events.htmlstructpw__global__events.jsstructpw__impl__client.htmlstructpw__impl__client__events.htmlstructpw__impl__client__events.jsstructpw__impl__core.htmlstructpw__impl__core__events.htmlstructpw__impl__core__events.jsstructpw__impl__device.htmlstructpw__impl__device__events.htmlstructpw__impl__device__events.jsstructpw__impl__factory.htmlstructpw__impl__factory__events.htmlstructpw__impl__factory__events.jsstructpw__impl__factory__implementation.htmlstructpw__impl__factory__implementation.jsstructpw__impl__link.htmlstructpw__impl__link__events.htmlstructpw__impl__link__events.jsstructpw__impl__metadata.htmlstructpw__impl__metadata__events.htmlstructpw__impl__metadata__events.jsstructpw__impl__module.htmlstructpw__impl__module__events.htmlstructpw__impl__module__events.jsstructpw__impl__node.htmlstructpw__impl__node__events.htmlstructpw__impl__node__events.jsstructpw__impl__node__rt__events.htmlstructpw__impl__node__rt__events.jsstructpw__impl__port.htmlstructpw__impl__port__events.htmlstructpw__impl__port__events.jsstructpw__link.htmlstructpw__link__events.htmlstructpw__link__events.jsstructpw__link__info.htmlstructpw__link__info.jsstructpw__link__methods.htmlstructpw__link__methods.jsstructpw__loop.htmlstructpw__loop.jsstructpw__main__loop.htmlstructpw__main__loop__events.htmlstructpw__main__loop__events.jsstructpw__map.htmlstructpw__map.jsstructpw__map__range.htmlstructpw__map__range.jsstructpw__memblock.htmlstructpw__memblock.jsstructpw__memchunk.htmlstructpw__memmap.htmlstructpw__memmap.jsstructpw__mempool.htmlstructpw__mempool__events.htmlstructpw__mempool__events.jsstructpw__metadata.htmlstructpw__metadata__events.htmlstructpw__metadata__events.jsstructpw__metadata__methods.htmlstructpw__metadata__methods.jsstructpw__module.htmlstructpw__module__events.htmlstructpw__module__events.jsstructpw__module__info.htmlstructpw__module__info.jsstructpw__module__methods.htmlstructpw__module__methods.jsstructpw__node.htmlstructpw__node__events.htmlstructpw__node__events.jsstructpw__node__info.htmlstructpw__node__info.jsstructpw__node__methods.htmlstructpw__node__methods.jsstructpw__permission.htmlstructpw__permission.jsstructpw__port.htmlstructpw__port__events.htmlstructpw__port__events.jsstructpw__port__info.htmlstructpw__port__info.jsstructpw__port__methods.htmlstructpw__port__methods.jsstructpw__profiler.htmlstructpw__profiler__events.htmlstructpw__profiler__events.jsstructpw__profiler__methods.htmlstructpw__profiler__methods.jsstructpw__properties.htmlstructpw__properties.jsstructpw__protocol.htmlstructpw__protocol__client.htmlstructpw__protocol__client.jsstructpw__protocol__events.htmlstructpw__protocol__events.jsstructpw__protocol__implementation.htmlstructpw__protocol__implementation.jsstructpw__protocol__marshal.htmlstructpw__protocol__marshal.jsstructpw__protocol__native__demarshal.htmlstructpw__protocol__native__demarshal.jsstructpw__protocol__native__ext.htmlstructpw__protocol__native__ext.jsstructpw__protocol__native__message.htmlstructpw__protocol__native__message.jsstructpw__protocol__server.htmlstructpw__protocol__server.jsstructpw__proxy.htmlstructpw__proxy__events.htmlstructpw__proxy__events.jsstructpw__registry.htmlstructpw__registry__events.htmlstructpw__registry__events.jsstructpw__registry__methods.htmlstructpw__registry__methods.jsstructpw__resource.htmlstructpw__resource__events.htmlstructpw__resource__events.jsstructpw__session.htmlstructpw__session__events.htmlstructpw__session__events.jsstructpw__session__info.htmlstructpw__session__info.jsstructpw__session__methods.htmlstructpw__session__methods.jsstructpw__stream.htmlstructpw__stream__control.htmlstructpw__stream__control.jsstructpw__stream__events.htmlstructpw__stream__events.jsstructpw__thread__loop.htmlstructpw__thread__loop__events.htmlstructpw__thread__loop__events.jsstructpw__time.htmlstructpw__time.jsstructpw__work__queue.htmlstructspa__audio__aec.htmlstructspa__audio__aec.jsstructspa__audio__aec__events.htmlstructspa__audio__aec__events.jsstructspa__audio__aec__info.htmlstructspa__audio__aec__info.jsstructspa__audio__aec__methods.htmlstructspa__audio__aec__methods.jsstructspa__audio__info.htmlstructspa__audio__info.jsstructspa__audio__info__aac.htmlstructspa__audio__info__aac.jsstructspa__audio__info__alac.htmlstructspa__audio__info__alac.jsstructspa__audio__info__amr.htmlstructspa__audio__info__amr.jsstructspa__audio__info__ape.htmlstructspa__audio__info__ape.jsstructspa__audio__info__dsd.htmlstructspa__audio__info__dsd.jsstructspa__audio__info__dsp.htmlstructspa__audio__info__dsp.jsstructspa__audio__info__flac.htmlstructspa__audio__info__flac.jsstructspa__audio__info__iec958.htmlstructspa__audio__info__iec958.jsstructspa__audio__info__mp3.htmlstructspa__audio__info__mp3.jsstructspa__audio__info__opus.htmlstructspa__audio__info__opus.jsstructspa__audio__info__ra.htmlstructspa__audio__info__ra.jsstructspa__audio__info__raw.htmlstructspa__audio__info__raw.jsstructspa__audio__info__vorbis.htmlstructspa__audio__info__vorbis.jsstructspa__audio__info__wma.htmlstructspa__audio__info__wma.jsstructspa__audio__layout__info.htmlstructspa__audio__layout__info.jsstructspa__buffer.htmlstructspa__buffer.jsstructspa__buffer__alloc__info.htmlstructspa__buffer__alloc__info.jsstructspa__callbacks.htmlstructspa__callbacks.jsstructspa__chunk.htmlstructspa__chunk.jsstructspa__command.htmlstructspa__command.jsstructspa__command__body.htmlstructspa__command__body.jsstructspa__cpu.htmlstructspa__cpu.jsstructspa__cpu__methods.htmlstructspa__cpu__methods.jsstructspa__data.htmlstructspa__data.jsstructspa__dbus.htmlstructspa__dbus.jsstructspa__dbus__connection.htmlstructspa__dbus__connection.jsstructspa__dbus__connection__events.htmlstructspa__dbus__connection__events.jsstructspa__dbus__methods.htmlstructspa__dbus__methods.jsstructspa__debug__context.htmlstructspa__debug__context.jsstructspa__debug__log__ctx.htmlstructspa__debug__log__ctx.jsstructspa__device.htmlstructspa__device.jsstructspa__device__events.htmlstructspa__device__events.jsstructspa__device__info.htmlstructspa__device__info.jsstructspa__device__methods.htmlstructspa__device__methods.jsstructspa__device__object__info.htmlstructspa__device__object__info.jsstructspa__dict.htmlstructspa__dict.jsstructspa__dict__item.htmlstructspa__dict__item.jsstructspa__dll.htmlstructspa__dll.jsstructspa__event.htmlstructspa__event.jsstructspa__event__body.htmlstructspa__event__body.jsstructspa__fraction.htmlstructspa__fraction.jsstructspa__graph.htmlstructspa__graph.jsstructspa__graph__link.htmlstructspa__graph__link.jsstructspa__graph__node.htmlstructspa__graph__node.jsstructspa__graph__node__callbacks.htmlstructspa__graph__node__callbacks.jsstructspa__graph__port.htmlstructspa__graph__port.jsstructspa__graph__state.htmlstructspa__graph__state.jsstructspa__handle.htmlstructspa__handle.jsstructspa__handle__factory.htmlstructspa__handle__factory.jsstructspa__hook.htmlstructspa__hook.jsstructspa__hook__list.htmlstructspa__hook__list.jsstructspa__i18n.htmlstructspa__i18n.jsstructspa__i18n__methods.htmlstructspa__i18n__methods.jsstructspa__interface.htmlstructspa__interface.jsstructspa__interface__info.htmlstructspa__interface__info.jsstructspa__io__buffers.htmlstructspa__io__buffers.jsstructspa__io__clock.htmlstructspa__io__clock.jsstructspa__io__latency.htmlstructspa__io__latency.jsstructspa__io__memory.htmlstructspa__io__memory.jsstructspa__io__position.htmlstructspa__io__position.jsstructspa__io__range.htmlstructspa__io__range.jsstructspa__io__rate__match.htmlstructspa__io__rate__match.jsstructspa__io__segment.htmlstructspa__io__segment.jsstructspa__io__segment__bar.htmlstructspa__io__segment__bar.jsstructspa__io__segment__video.htmlstructspa__io__segment__video.jsstructspa__io__sequence.htmlstructspa__io__sequence.jsstructspa__io__video__size.htmlstructspa__io__video__size.jsstructspa__json.htmlstructspa__json.jsstructspa__latency__info.htmlstructspa__latency__info.jsstructspa__list.htmlstructspa__list.jsstructspa__log.htmlstructspa__log.jsstructspa__log__methods.htmlstructspa__log__methods.jsstructspa__log__topic.htmlstructspa__log__topic.jsstructspa__loop.htmlstructspa__loop.jsstructspa__loop__control.htmlstructspa__loop__control.jsstructspa__loop__control__hooks.htmlstructspa__loop__control__hooks.jsstructspa__loop__control__methods.htmlstructspa__loop__control__methods.jsstructspa__loop__methods.htmlstructspa__loop__methods.jsstructspa__loop__utils.htmlstructspa__loop__utils.jsstructspa__loop__utils__methods.htmlstructspa__loop__utils__methods.jsstructspa__meta.htmlstructspa__meta.jsstructspa__meta__bitmap.htmlstructspa__meta__bitmap.jsstructspa__meta__busy.htmlstructspa__meta__busy.jsstructspa__meta__control.htmlstructspa__meta__control.jsstructspa__meta__cursor.htmlstructspa__meta__cursor.jsstructspa__meta__header.htmlstructspa__meta__header.jsstructspa__meta__region.htmlstructspa__meta__region.jsstructspa__meta__videotransform.htmlstructspa__meta__videotransform.jsstructspa__node.htmlstructspa__node.jsstructspa__node__callbacks.htmlstructspa__node__callbacks.jsstructspa__node__events.htmlstructspa__node__events.jsstructspa__node__info.htmlstructspa__node__info.jsstructspa__node__methods.htmlstructspa__node__methods.jsstructspa__param__info.htmlstructspa__param__info.jsstructspa__plugin__loader.htmlstructspa__plugin__loader.jsstructspa__plugin__loader__methods.htmlstructspa__plugin__loader__methods.jsstructspa__pod.htmlstructspa__pod.jsstructspa__pod__array.htmlstructspa__pod__array.jsstructspa__pod__array__body.htmlstructspa__pod__array__body.jsstructspa__pod__bitmap.htmlstructspa__pod__bitmap.jsstructspa__pod__bool.htmlstructspa__pod__bool.jsstructspa__pod__builder.htmlstructspa__pod__builder.jsstructspa__pod__builder__callbacks.htmlstructspa__pod__builder__callbacks.jsstructspa__pod__builder__state.htmlstructspa__pod__builder__state.jsstructspa__pod__bytes.htmlstructspa__pod__bytes.jsstructspa__pod__choice.htmlstructspa__pod__choice.jsstructspa__pod__choice__body.htmlstructspa__pod__choice__body.jsstructspa__pod__control.htmlstructspa__pod__control.jsstructspa__pod__double.htmlstructspa__pod__double.jsstructspa__pod__dynamic__builder.htmlstructspa__pod__dynamic__builder.jsstructspa__pod__fd.htmlstructspa__pod__fd.jsstructspa__pod__float.htmlstructspa__pod__float.jsstructspa__pod__fraction.htmlstructspa__pod__fraction.jsstructspa__pod__frame.htmlstructspa__pod__frame.jsstructspa__pod__id.htmlstructspa__pod__id.jsstructspa__pod__int.htmlstructspa__pod__int.jsstructspa__pod__long.htmlstructspa__pod__long.jsstructspa__pod__object.htmlstructspa__pod__object.jsstructspa__pod__object__body.htmlstructspa__pod__object__body.jsstructspa__pod__parser.htmlstructspa__pod__parser.jsstructspa__pod__parser__state.htmlstructspa__pod__parser__state.jsstructspa__pod__pointer.htmlstructspa__pod__pointer.jsstructspa__pod__pointer__body.htmlstructspa__pod__pointer__body.jsstructspa__pod__prop.htmlstructspa__pod__prop.jsstructspa__pod__rectangle.htmlstructspa__pod__rectangle.jsstructspa__pod__sequence.htmlstructspa__pod__sequence.jsstructspa__pod__sequence__body.htmlstructspa__pod__sequence__body.jsstructspa__pod__string.htmlstructspa__pod__string.jsstructspa__pod__struct.htmlstructspa__pod__struct.jsstructspa__point.htmlstructspa__point.jsstructspa__poll__event.htmlstructspa__poll__event.jsstructspa__port__info.htmlstructspa__port__info.jsstructspa__process__latency__info.htmlstructspa__process__latency__info.jsstructspa__ratelimit.htmlstructspa__ratelimit.jsstructspa__rectangle.htmlstructspa__rectangle.jsstructspa__region.htmlstructspa__region.jsstructspa__result__device__params.htmlstructspa__result__device__params.jsstructspa__result__device__params__data.htmlstructspa__result__device__params__data.jsstructspa__result__node__error.htmlstructspa__result__node__error.jsstructspa__result__node__params.htmlstructspa__result__node__params.jsstructspa__result__node__params__data.htmlstructspa__result__node__params__data.jsstructspa__ringbuffer.htmlstructspa__ringbuffer.jsstructspa__source.htmlstructspa__source.jsstructspa__strbuf.htmlstructspa__strbuf.jsstructspa__support.htmlstructspa__support.jsstructspa__system.htmlstructspa__system.jsstructspa__system__methods.htmlstructspa__system__methods.jsstructspa__tag__info.htmlstructspa__tag__info.jsstructspa__thread.htmlstructspa__thread__utils.htmlstructspa__thread__utils.jsstructspa__thread__utils__methods.htmlstructspa__thread__utils__methods.jsstructspa__type__info.htmlstructspa__type__info.jsstructspa__video__colorimetry.htmlstructspa__video__colorimetry.jsstructspa__video__info.htmlstructspa__video__info.jsstructspa__video__info__dsp.htmlstructspa__video__info__dsp.jsstructspa__video__info__h264.htmlstructspa__video__info__h264.jsstructspa__video__info__mjpg.htmlstructspa__video__info__mjpg.jsstructspa__video__info__raw.htmlstructspa__video__info__raw.jssync_off.pngsync_on.pngsystem_8h.htmlsystem_8h_source.htmltab_a.pngtab_ad.pngtab_b.pngtab_bd.pngtab_h.pngtab_hd.pngtab_s.pngtab_sd.pngtabs.csstag-types_8h.htmltag-types_8h_source.htmltag-utils_8h.htmltag-utils_8h_source.htmltag_8h.htmltag_8h_source.htmlthread-loop_8h.htmlthread-loop_8h_source.htmltopics.htmltopics.jstutorial1_8c-example.htmltutorial2_8c-example.htmltutorial3_8c-example.htmltutorial4_8c-example.htmltutorial5_8c-example.htmltutorial6_8c-example.htmltypes_8h.htmltypes_8h_source.htmlutils_2dict_8h.htmlutils_2dict_8h_source.htmlutils_2type-info_8h.htmlutils_2type-info_8h_source.htmlvararg_8h.htmlvararg_8h_source.htmlvideo-dsp-play_8c-example.htmlvideo-play-fixate_8c-example.htmlvideo-play-pull_8c-example.htmlvideo-play-reneg_8c-example.htmlvideo-play_8c-example.htmlvideo-src-alloc_8c-example.htmlvideo-src-fixate_8c-example.htmlvideo-src-reneg_8c-example.htmlvideo-src_8c-example.htmlvideo_2dsp-utils_8h.htmlvideo_2dsp-utils_8h_source.htmlvideo_2dsp_8h.htmlvideo_2dsp_8h_source.htmlvideo_2format-utils_8h_source.htmlvideo_2raw-types_8h.htmlvideo_2raw-types_8h_source.htmlvideo_2raw-utils_8h.htmlvideo_2raw-utils_8h_source.htmlvideo_2raw_8h.htmlvideo_2raw_8h_source.htmlvorbis-utils_8h.htmlvorbis-utils_8h_source.htmlvorbis_8h_source.htmlwma-types_8h_source.htmlwma-utils_8h.htmlwma-utils_8h_source.htmlwma_8h_source.htmlwork-queue_8h.htmlwork-queue_8h_source.html/usr/share/doc//usr/share/doc/pipewire//usr/share/doc/pipewire/html//usr/share/doc/pipewire/html/search/-fmessage-length=0 -grecord-gcc-switches -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector-strong -funwind-tables -fasynchronous-unwind-tables -fstack-clash-protection -gobs://build.suse.de/SUSE:Maintenance:35871/SUSE_SLE-15-SP6_Update/2dc6abefe3eb478bfd9767556ab031b7-pipewire.SUSE_SLE-15-SP6_Updatedrpmxz5aarch64-suse-linux         directoryHTML document, UTF-8 Unicode text, with very long linesHTML document, ASCII text, with very long linesASCII textHTML document, UTF-8 Unicode textPNG image data, 8 x 30, 8-bit/color RGBA, non-interlacedPNG image data, 9 x 9, 8-bit/color RGBA, non-interlacedassembler source, ASCII textHTML document, ASCII textSVG Scalable Vector Graphics imageUTF-8 Unicode textUTF-8 Unicode text, with very long linesPNG image data, 1 x 56, 8-bit/color RGB, non-interlacedPNG image data, 1 x 6, 8-bit/color RGBA, non-interlacedPNG image data, 1 x 12, 8-bit/color RGB, non-interlacedASCII text, with very long linesPNG image data, 6 x 1024, 8-bit/color RGB, non-interlacedPNG image data, 24 x 24, 8-bit/color RGBA, non-interlacedPNG image data, 1 x 36, 8-bit/color RGB, non-interlacedASCII text, with very long lines, with no line terminatorsV3bY8Uy18utf-8dd17a22419faae502dbe46b0952c5f40dfd2ef2ac3c7d5953e60c70898bd0c69?P7zXZ !t/3#]"k% ?/iOI!Ҏ ǃ z4pd)mtAQkHQiL&2XEܺ'BҮ:@KhҎ7\Q{dF )Q cuv .o}ڎms |1PyDHH(Bfa$5nikW/*tk-Hc"WPR,1v2.Z O_fӆZY/cAj/v!OaXQd%}?MDŽv5A;N*<ێ0!kiqKz*~k2un](1F ͓j3.~BhE![zg [2aU^7JU'!xc5-v9m@ yq,VC/ëIE[%Ue'Z廀<4sxi a"),GvWg隦SJbgEx :q<+QPF4}ANިe5V-6\IwEWoMuY(bx1yosKѮ3ow}Cb _A>Һ F:kؐTIT5i+O`>S0Ha o@y0zT?u>fo<B)|?!9_u';wbʲX#OstMeKgc6H8Z,6w9T>P/zshJu1.\f@tL^ U+-nf% mMDWNTԼ7gb{xQW L䥡G^#N4ˆU Ƞs)G@pl,4}dgj.1;FϼB}]AL!6 [TGZp^>C6]qԗ-y}>A ª'O 'NNbisa,Mq'V0YXAIt;GqV:.)W&SPE&y佉ib!XZE$:?kT-U}k` ALn&-t󨝂p05wbUyc"GƭȬ!b_6#EM0Pꏻ2o,~id75#iI?.=h([/=OUܐUK<\M'L*Z`a5<-B"`Ee'ѧ ;wW^x10~/Ӎ[@R,TxYRZ cϙH->RqIиC@/Fv,//hS >(F5Ɔ[0PK_dsBXXRQ{#2.&]]2jTL)(Y*7׫h+nxrj{{-\{do y4 ӓ/0x c@Lo:#lFf"f%*F+FH33LFzlaNͱnx};E+FwB5;5EP/Tjqt,F hʰ 2;wTuEE4o^ 1=0ocxxthYӽhӪhڀߖaAݘH) rk~J %]p_ ƢC֬la"Ϡw TUPz9܉cӐQ~퐶bڼ.agn2r;%AUq"kY]Q l,NEvb0dOB= +k |lSQءA}OJ)Ox* \+^ː( g#$Eɛ՝kBr܁/#ՅO-i6FHm{ cx>PX_Jwoc=,@N kw&Xj*1{G[41|Mvd[ ?\+ _"uXe182 uY/cV{<\B RǃS~)ß^\-X qkR= hA5>Mc(! E8f08ۿGkDEس6 "' 6c.YL "gf]SW f91tBڰ29Իt-[h]B6@oOS`WdYd%KOեa,si|3/x7=}j&6K =k)`F_'J{xG5˖XC ؓXBKˣ!.xJ2{+t*6L&V 97]S*f$vzv n?mg%V{ U0PQ쉫zX*׵vT\R 4|ZQkܭRs?7/t?Wz2ŀ0X H5E?/A~El[.EhkFYD+䏑+GˮNfpC?88`y,zfw#u#ʊAJBqqP 7w9|[dFt;7/mALvC>1ʤ,R%-*I1%sUsTTE嬢+gW ;tesb">H%5*71ο&YD/Wua)аO?t\XaSIx 8w6GJi@]S@kM̀,$0xHh@~966;d=EX&20T@BK&DU=y|j*f֯JV0=uӬ<08 ?EU]N(O.Ơ x@MhOkzxT^A˻:fRYf,lx{(;՛9*Υ, Ix9?ɩ ckڜvQ'YjE$yYOrmYp?a|Tdҋsc%+4#ڔq<#V蚪XguX$fp\\՜|iNt.Kՠ`O`Q`p)i=~z‘kAz-͹'my=E`4X`U@rr>f:}XTF\H{)|dy >yWv:.jeod--*dsrY-=3̓r)Eҗ禃yڊ0_c XiLSnߔ{?@/eN-+̓* 7~Eiox`"Pաw5]`~r!vm;0%cEZ椨;zz“ žJ2:E3UUPHᒵ5*|MDq2uPc1t?AD`c2ݩF*e#N4ZMpknLdY4^ (jRDގ9#={l *G 5xH֧џ7 =VߎB!#4ڴ-aQ s]f9/ Ug6┸nh = K( J_!x[-f3U*ybIpwxG~>MlIur|u$-ε9  <ĴVU"_l(YSa5T 4utąߍ1vJ<#oVYь_u~cAdYߍZhk{PI+@ޔE\ç?R qTTGBY!G"<>(gIN8@X{? 㟼Xzp2*C\_֮w<䁉2W7%  ܔWo6sD>Hš [T:bxCe02MЎ\zuB2pe^C08z}u2 p@ep?1l q^,_=UZ$1i .zLOMurC&0NYŶ%-|jIӖ :ϙAWUPssB75@#mG`lr}-CT噷 w.Cdk2FדNzשN)zMJޜ"]?w[כ&u`C0eoDե|S%M viD9}!˺Em)8qjeOd!Y "/ůQA ʋezj߈IO$;~-d,!<3kD8`7I->SA{"!=1 ID 3A 7Ibutt0)| {Lpq1kq=<]s0N ?S{4M"ZV97:S K"6l1ϔf{'Qӯ 7UYPpdY\C`>Ƭ|S)Ľ}Q>%\I {(I r=ۙÎ(|zN& EQͥ]1B7={$}6 x Ua3?2,@up'>5ŅFx,miV6+ {q ucc A#O.$i˅@bTBT״qs#Z (,j])䀃mXBB.)FV7]hxz%orXaZ*V)Qf&Z N&5 FOb \r(JvUB ? ?H5LoҪVrr'#%W&@^2_$(|&Wo',+[gIbr31rpkJ׉w!=xt-V-),SG)J!9`HPV Yⲍqdm>j@ ]T@xS/w&2Lo L͉jNv0Z,vV:mI 1B+-/fV'tNTFy `S l;gWHht+,J=f'}8ٵMҳb@HM 2  b< I2WYOR\OS\cNIM"SqƍhqfpcrP[c3g&QwPil9S÷4=;Y}$~+|f滹2*KnF@:^Ӧ%bfӪP܍z]tJm<Ș$hE]`5-[zP'f$3}J}_UQPUqǾjsA"R o{<5;]4>0< rbEc1*S(ߪt1TMm. Yq;)@2+ѿ qۓӮ2omhC; c+x ӊ}!ZRJ8sn{No6)?Ue \]ߜt^CCs"P*rg%EUa/"vS>ن$3xGgK+Ƕ YZ