From 5ee9d39e2e3afbe763b27493b01d9a86a19cf00e Mon Sep 17 00:00:00 2001 From: Stepan Mikhailiuk Date: Sun, 14 Jul 2024 21:04:55 +0200 Subject: [PATCH] feat(*): support transparent webm --- src/backends/beamcoder.ts | 17 +++++++++++--- ...-get-frame-from-webm-with-alpha-1-snap.png | Bin 0 -> 7530 bytes test/framefusion.test.ts | 21 ++++++++++++++++++ test/samples/webm-with-alpha.webm | Bin 0 -> 71876 bytes 4 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 test/__image_snapshots__/framefusion-test-ts-test-framefusion-test-ts-frame-fusion-can-get-frame-from-webm-with-alpha-1-snap.png create mode 100644 test/samples/webm-with-alpha.webm diff --git a/src/backends/beamcoder.ts b/src/backends/beamcoder.ts index ad7fead..7e0e6f0 100644 --- a/src/backends/beamcoder.ts +++ b/src/backends/beamcoder.ts @@ -22,13 +22,24 @@ const createDecoder = ({ streamIndex: number; threadCount: number; }): Decoder => { - return beamcoder.decoder({ - demuxer: demuxer, + const commonParams = { width: demuxer.streams[streamIndex].codecpar.width, height: demuxer.streams[streamIndex].codecpar.height, - stream_index: streamIndex, pix_fmt: demuxer.streams[streamIndex].codecpar.format, thread_count: threadCount, + }; + + if (demuxer.streams[streamIndex].codecpar.name === 'vp8') { + return beamcoder.decoder({ + ...commonParams, + name: 'libvpx', + }); + } + + return beamcoder.decoder({ + ...commonParams, + demuxer: demuxer, + stream_index: streamIndex, }); }; diff --git a/test/__image_snapshots__/framefusion-test-ts-test-framefusion-test-ts-frame-fusion-can-get-frame-from-webm-with-alpha-1-snap.png b/test/__image_snapshots__/framefusion-test-ts-test-framefusion-test-ts-frame-fusion-can-get-frame-from-webm-with-alpha-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..e8f798d40e68e4de3120b330b0d8032763bb1316 GIT binary patch literal 7530 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 Yx`4(grNzChkjDhOY;%eHqt}D~1kZmTvj6}9 literal 0 HcmV?d00001 diff --git a/test/framefusion.test.ts b/test/framefusion.test.ts index e12d658..88468ae 100644 --- a/test/framefusion.test.ts +++ b/test/framefusion.test.ts @@ -145,6 +145,27 @@ describe('FrameFusion', () => { await extractor.dispose(); }); + it.only('can get frame from webm with alpha', async() => { + // Arrange + const extractor = await BeamcoderExtractor.create({ + inputFileOrUrl: './test/samples/webm-with-alpha.webm', + threadCount: 8, + }); + + // Act and Assert + const imageData = await extractor.getImageDataAtTime(100); + const canvasImageData = createImageData(imageData.data, imageData.width, imageData.height); + + const canvas = createCanvas(imageData.width, imageData.height); + const ctx = canvas.getContext('2d', { alpha: true }); + + ctx.putImageData(canvasImageData, 0, 0); + expect(canvas.toBuffer('image/png')).toMatchImageSnapshot(); + + // Cleanup + await extractor.dispose(); + }); + it('can get the same frame multiple times', async() => { // When smaller increments are requested, the same frame can be returned multiple times. This happens when the // caller plays the video at a lower playback rate than the source video. diff --git a/test/samples/webm-with-alpha.webm b/test/samples/webm-with-alpha.webm new file mode 100644 index 0000000000000000000000000000000000000000..eff187ad4a98c5d44460d6515a5be55ab39b51c6 GIT binary patch literal 71876 zcmeFZ2UJr_)IT~&fY5tKARr0|N)rU7gx)(ALDFRAwNx*^%0u}@;GzCNy5Tpx1 zPyvx9N|PcYV4?Sx{7-@f@AcmIt@YlwmjAczKypqdlR3Y$XV2by_TF=NwfobPHO}H- z8Vk^C8b_fqgQM06Kka|a-b3RY4z6(q2j{lLI>P`|VBA+(jBogq8<$_SynmWQ|DKa& z4lZ^56Q|WfH|SHRad{N<9jjH1vt>>=Ov1Q48v3}&vK;y{0>Zxj-$ zN838`BbYSM#@J}1qkc{b(mP}ncF0Ie?^plzv)1`YbWJ1~1qpuB!*AfUJ8-a5&myIn zv`*H~t#seS0pZ6tBYaOdM&iKPGy81!nJGr#V4FWgoQB&U1OxGT;Rt+LIDAtQ4sMCZ z!S?2z-dl=;k!Y}b>QssY9_w6}q@8|F+eFh;OWQ*0+^;B3oqFqlzv%Gudd_vJ8(Uw6 z?!f`N2RRw&9%NDO$L;;R0?2J5wf0)5Tj`scXq~$vExjB1myzBf{k;G|%_3h^2JHwA zr08x<)r`hLcWUMdZo#(U5u4yZm-@_^$TO!S;c!63NwGkMb4+&Yxgn|;{NMk76!?z< z|63H;g(VR0n_+!ZH7{pq#*E`&cQw!dH!J_QsQsTb`;P+u6AF-KWf>8jg1(#j3J1hM zJ~d!sSq0pH`+(Fe*D@6q-5LUjps@f2D8Lo-{3IE_CN~95V=z8T;cf5#C`$1RqzAWII+LF;kn&tKXpLMx{>r6pkPkoL9W}p=bn3!|E;RMuJ z3IMQxxrco57ss_%)N{Iwb)LIC>ru+-Vo<1Yd0Z}&-8m*!lh@W&!c`D2mQ{jta<|3GBw)v4$%9E=;t@Iq67ncWT?&97>qabqs{tVl@I z;0)Cjd@ZKYob_S(7`64>CX7+aY={4b5@p@+?Tb`8)%2K8SB0G0z1L(`2&$@grut5;E;=;brV36;^U$gok%Ql4v~Ybcez_u ze!wA}m2*SP``5U&`lp8*Lg3>)w*K+ggV8jfWE{SS(|<3Y-Vj{($GLx8 z52gRwEjcV-vaqpb%&m|Ezm3;J7jQb<`?K_M>0kUyNdE_h*Kc||!RpGA^pqZ4M%>hR z@9faKH-i&bLltkSjlFut(xJ&E?mP14L}GX+hK->(RIqox@Ons-hsD|O4A*8N-NM=v z;;I`>fd`SyIGgB5`ZKIVSfc?`SX^@nGEI(V+uSgkGI1 zL!F%zp;u@0=3A#RjHzbzpk%F8P^17#|aQ>kEl>v>5c$W@@mHi;lmWu=`z3ln=yw}YE$ zu~Six9Uw;m(@I;v|B&Ei?*XRObn{t$FTUq=?!yI+J9`+?-hO?4-=Q#VE#<9yM!LgJ z`>~sE-Ot`I;$rwvaU6bsH*(c)CN`42MBvVf1eJ&UF%3s6jr~%RbsaPhHBP>9T0V9F zZcQJT?RLR}Q_rQVLU$qCf%#Q>O>@|C^TD;}#~Ek4h9tJzm|^JfP)0^~2D*csk306(#oh zAh>Y1@{@wy2fX0wtsyMj^^5ljcOY{IX8FxswP zrpE5_b=7fC(;bz={BM@;UJ7KBCakIjE}POwSo3XPEt|-VJ$V&zKnw+E2uI@Iw@K?U z$zl+_kD|_YYB*~IeL<-9GB+wvHrK5WnN%t|3P-I6rsx0{>F((J>qe)FxkMBJKtp$@ zwgB&MUJBx<2sxP;aKu1;CLni5)yO0_z^Fy^>oSG%VXY(C5pu0k_7N}0O{s{TyhOo) zJs3OZ6{7dpDlyh`4VODbKb8 zAWc#fDG4Sq107E$d2A~k*ad+Sh{4l-e&Z{zg@zK{;7~&Q96=55N2pZATAN`~1oO+* zzAgg{gcqX*&y6xTL`_7avQ|rGXV$9ndsCS#36 zsYRJ}LanDR{+bfFx4B)q7Dm8o#NdKos#+vl+v5GFC$O2e2LJ)9c5InK;gt2Gbsl!u zo8N67*5amM`7_xu10ajct{sf2_8j2l&jK^AJ>$ZaXUjeV5E3 z$@%m^1iB~>I~52DoT|b8GAX?RlV)pP+BXP}Qe1y}MRBg{ljd&OEpj*lWr`ZEi~Xx> z>&`pMA6;2%=$-cbYtm#ppi{fH(&FV}I1|66{j|xROpa#uCh=KUW2b42I9BdX_#_j3 z*Fk>S0tvQ$?ogdwhn=G6VN~dK`dFu;ui~ijz?*?A6?s=aPf8uDW@$wJ*7OxX}R5G%^`Du(ZEP=YoRr)}&H^G9=(T z7KyN)6@*&Z%XdrNBh@ zqN&fdy^C}D_yv#%S)PF|ArtZu3j^ST2+7xrB0*DDXCaRsGaq>pFNJNJjdiNDf(Uth z*9CgchDr3BO6Gje*Q@NNlZunq&!aC9(PDmj^i9;4XfSgGOr8Hf;}c*pUIB2_645lx9(gpaDMyn z?dIbNSdJ4V(L4PM&gA7uBIMBbw$ff0FgNk3mz#G{vP>9&_WY2wu~8~I0Y}3Orsx4T z1aebN=rTyUAy)t(u0un*i%OU@*}ZHd&k@)@b?|y|Ev!|dl;?zq#)okoD1MJ@vbfzg~9Mz!bS-Kqi8__!)mo7I#INLL{5>=KXL9sW>~1~n8ni-i$w;qQS1s4&4MG79>ml~_Gb<#Pp)O0ELj^rp*p}rj}S9396nbY45`bB zb#?i7U4XGurl@<2VtNFg!m=r-1+f&;h%$~Ex&bmZA7r4j$<(|9*(nPDNKN_)X4o1a z{S&X05V0_dRL;bQf&)Gesvtr}pB+{|!Io>J%H_3Rp{$MpTjVH(Z z%lVR&=euyVV+InB@0t#DAZlbaPjsAVJC1Bhx>nkz3= z2$-D**;{?srKx*y~m8AEfVP@qwy zgnPK{Gy}0veSdmt1rTfz9A%nCOgxWf#0uh*r3RE{2vo@f-tU*US%uX;KVg<4E{JME zLPUiTfgYaNhgrp7##O44p)P)Bp_DY*$2te>7S0v^M~;FMd3q>Kgq) zEK%+3Y3Vi?G03K@R)VDs|78d#5P|bLoKIbL;B|L|CTTQ^{g(S*Eic%H6aCZhoVN1pr}1AkvEan+^nJPN6>CVaT!<+4y3V zOd%leM_=mN);$!RWiKRqMXlWPOOG$q^Zr%DULsh%s%vnp&(icngZifon`zSZ$si0X z^}5drqks46`m)}H+zxun57%jzVWs-rtJ(T{qxEj1SQSzuV}JV!YB0wmw+%`jklEsm zcB{RCrTM7rVyXjvDesdbV28G%H`Z}YdBH47c5bLb0klnAH0^k9Iro}Hs`E}N^>Mu0_1ZJAghWw>&#w2}oC2{gEwFoTS_l(P5Dq+TH zXPVQqPf()pJG1jlpWWWhUckmG*>^7MbRa*qmU%;myX_^E?Q(hFmb2bvl!vhc3wKW# zouTO+vi6ofB+J#a?j2@C=dT)|cC~H=zq0WkauD#>e#Hn#t)9iaQib7WNKC z9Cqu~8{Qc*{!$0)yj|7JdRhDYj;T`QGaX{W^I6Nfi2;sRG!tzD>ILQmLO_#r%ur(I z;X0tU>&1AL&gYv!a)~5s1Mw z8wDGG_WVJSUA@x0NnF%gvUi<5=-22re4lL$lL_P`m(!9lYCdO-g=#GmpdA zBWb*hJ!8Gr)6gU|YpVrrI2-s5cE&%6CX`3PLd(3?gxUOcb`9DlMqPxL!nagOeVvON z{w%x0cU~B`U2A@&Ug}Z78+bR9k4y~w5!Kv`Jm?R+hA#+8Ule~@+EE+6CR=-A_K~F^ zg{tI}54ZdJT1|Z{{7Tl12ddNs98D)_5zg^@V<%G0>hV5E-BRo=f)lauZ9Omy9>(F3 zY2h?&p3a=kf(fv^|Pkz#Sk$m-+$j^r<@ zKkOB{N5s$7LYaDVj~eSa;y#*q@k*~j`BKAM(#_ff3ELx^Gis;K#KiV20DqX*sta@f<3>#bkPDq zZM$qIWr+xXHAt;fjic3YnTvd-n9mH?zUltDb15?q z^cTWb`g@4FV=CpvZwa0qWdzURP|t^R<5kv67^#nofMz)Gs7#N+hlJ;wo@tJQj`x{O zUrH3xOs}7^TjvqV)Gs(%F%pmbAWbpJzJykBfZhUK#H#ou%;ZLIkc4D+uJqmaL8?}C z3)UU)-zO)q-CpT5%$VS~&yuX{+t#G)&0px@8|5Jx;qLC~>fwIDgC65H78N~a{2kI-fuNk&o!z54h|JG0>xw7i0a~}lhsq;h$@3E>EZl|nU^|qo`0|60Q zD$470P)qH_(VBsL+Mmq&D~mkg%jXVH7!;z$1Z)a2;4AMk(W%XM<}1N$zuo9hTur>94&0q9&cO@#B1vn28JFRUSkDG7SXZp^d%yF*aYG1n0gDgG|j| zFTV~7i^LeSyz<3E1N*&fKbrXw3n;nBpJ6U&(vdNY{Armlg?#+>Ca4M7(SIowKR%Ol z-Iqz66hPvnO+Pq&thkjKOIitlYY>Q;vE(YTE9uN>3JvvfZH^af*8+^L;mV4|`Koh1 z)%wq;VB<5Mmgf89?a?(oF*a9q1LETwOUb{vEi8$Xen^-pdLZ=UlD{mDiWZ1{C5Hue zIm8v|jhe72G^;rS2jzRMF6#dA)DYuIs&6k-%C8eRM+)%1puZ+)6b`y z^3cHu;*-bn?8tKu7!{XYturV3lI*{Z?RasyJExM*Fqd-w_?PRf;JT{P#hMd-CmkHR z!J(7g2N-X`=BKv9lP|8s4e~tn^jPiB^mIS;!U% zDCcq>T9togS`0HCX8H132d1}G!VJI_quB({*9|jt?@y5ZG;Op)qATF&kvo;@yAoBX zKJl$hSVXZO-PH|^KV(;MWT>-}*jk<5oSn?p>#P2a-p#s5v)V~`AdagHb& z;ly^x&-SFRhllD{p&dqI#-Z(%@?`+kgn3X;J@p`LPD&_5EMe<=mGYny zVo%OiyLWSrzk9oxEtaNNpnFr~m*?!SRd@3o=r>e=%>|e30S~iZJ-x1I!$#P5wA+wR znfcBs*B%My%`1nxxd|OTJbc|ZY=m!U3U;qJY!0?`bF_4EK(Ugnb!9b3I&CPH9azXi zl}8V~|5D&a(8q0YvlLpoEL?Gb@^0t=Q~`}YWrjMOEY?=1ST>CR7c2~7er9O(%CuIo z%2wYUbZU*{V*kv-lmU6E&eor|$@|Ry;S)cr1@Zu8Y))Mi+nurgRsz*B*u_+Z?-@oA zcvStlLT!s!1_U$n=`)3snsABt-xG5DOLv$GzjjYJAy@Txr|z$-+UK);zuW`})Qs4| zFdiNIt@bu_q_Z|`EZiD(nGJtP&U;zD&jH2(L`s&7%sH zgSn4tni5&l_G=HM+hf92q$4+@Ied4+2JODt88swt4ecbz-{50-74XAb^Qk*T{%iL; zyAuz`gv!UWk1ZbGz1J-8*sevz7p(SY)Fgzw25`Eg&$_~b_;t2C!mAB1iM~K+#?IUu zf;B)kq#mz@?hzU$kqmVq z@-*f1W(CqDaS5}hZ)(0FV|FR>M;zkKN*rg**lEE`gXdN5FUY=_`gh7ekQg{}w8-)+ za#c2@V>Lw$?`fGI#xCF5CDh+rG(d3a;$xz=-9@(9cm8k@c zEDs(9dvM=m-+@R9@(eWmI(_U;736(GF2ni?1DZ~NB@JOiDRk%yKg=pa@NRdH3ged# zW8B{JDNaXsiZ)o)wO^&<)j*~s(4_m~bakt^pQXvD$3IJET#j zJ0nB5z<<%g5`#ZpHK4ZH0Q*_%%@yTFF434V3#k@f=SjSMBjH$b4Ga^Sv^9_jTg@ra zY?!i2Icg|a0}Iob-#PyYecYxpj1KX9$gqg7e^M|a@vu3Jn~s`<@^R!s&n9No ztq(JwSYDPx7+l+Cb$%7jZWo}mJGNShVhjDx!Vs=wcl>8h8~aT`eSh%Xx1;Lb=cUC<8z}LEF4$JPzm$(J zaX;W~?DVd|mA$xNEERLl*^z2=*;)5{&o-YBu9#J^s`f4Xn3f!vbj1AKVyp;MagaA}!MF$(?bQ6++o-)&OQ|8wn zzZ$@79fLbOg;tpWKFSbrYgjA56bl6Qh+OWT70cZrMsG1AFvu8Z+E7wCr~2h-4c62q zZOwEUi@dctX3lbzZc9mMk8{6@Pe!&;VEK)yssj)Gcj|=|Kjl{Cb7iA?ZVhh{aZ__- zbGpUOAiSWdMj`-IZZ<4l3TOm06}McI6&GP$nP?FD4geD@`CIav?)J4X zr3iNc@!`k$+YTaqKgm>V8sNnrZHes`C~UG)c>+&N*d`EpVcL0KZi!ikcmOzC zYeUyWRhHvH(m+J;?CsDSoMt%kf<3JymBq^w0){sv5rAUBaOI zq1lEffwjb1>km*QuwB{-fOW44O(+_G@QxHa>LsYn=DVaOK!q{t-2M_^G?(C3N<1?? z_Tt!z-M#A3NNixcyP|f{M(936YgK%@S@?sdjCs<-8aKp&? zwD4BkGy^IfEQhCv4XlXS|USCS+2hz z(ZH>IYs9I3$7D>PLjU=MuKBFgPw>kIfPNPB|aD_QL+67^6KZnc>sNdtch=B+Zw6f)RKAkVxZ25(s zZBY%d)sdnp|S+0UN?I_w65u!RYd3%hW!{sca$`uUX=pLR7u_r#5 zcpTzWk>cZwqHMJ@m{VfQyNXt=^=$dtwLcH6@w_%}*3(*Dj?eckq;W`b#zLsbc9UM} z8jda&Off(K1!zSij-}`oo8Ttq3R0XObE8Gy`2l zHiJrKSibr0&LAkMD3>U-AQVL6$lVLZsmd|M`mJgluYtzB^$)9t)B?BKI$% zMu9D%ff&vhKF09zsi@Q{v*+oV*<*DgvINUqk`IzX8?%<)C+J82Id6y5jxZE8q55AF ziwGDm2;21?;)Q440g614Vl49l6bw($Z=WlUhAS=yLElDEsU8~^%sg9_@{N=%spwc7 zT?uK`@q?BL0}w4CVp@%!a>PT0-*k;_?x4tNx>5s;6rx(?(4NDO=vrPM?~Wd6%ymXv zxqL`&UUOs$y=1{>aBn33GTVfNU3*A?VkkCJEYsskwaDtdYpPkF&sby!WbCEAb770o zy*XX0ZPzTH$!6^pG2eE~^d6Q%765T*ae;s%#(;amA_$xlbP31?X?cx3;DSi zJ*%!t;YUk57v=!Rp~P+1jP`oVtr^L_Nw|_f#y}yUcwfT&-Phn{dEbL(;WvOLbGEi| zHitp2Yoe9R?yPIFnQ!>bviF*@H>6s{X|3Zk`9>4&)EOMz04XW#$HV;aDeLUzUm8@l zc$%*<0-b&1Xwnm{V~38yQ)vyC7_k^g(Fb~4?mcO5W!6rX zVLiIyx?6K!Q>%dG<)L0KqMT}7sQv%Ps44YH5KgRczgCT zv-9hREldN83MTvm-U(gd?*hHkW=yJK2DCSt+q~#51{r1FimpI2|9gf2nZJSXl_nZ# z{ydl3nT`(^C zPvLWg8t~KF`)_S!P}P^zvf-Tn$25j@kPvr#FO+5^DTV0db@^Vie)LV9%OI~%#?2W3 z<9GRx{H5#UCQ<{L&4&BSgz0=}mTz1{T`fG9W9B%uM9CCi;x{39Y?&+RxSP%uApsf> z=RF@|vN%3!1B1I(Q%2bw`s@aYmY*+W?cJ7n;h0&rUYb=yvX!sKy}ino+s;^MeM`7> zPDQ8T=%s-<)6c+0Lfty!%JXdD*hLU9$kETe`${R%MgX@-yE)FpLnuY;b@=Lsux{L5 zdN^)jI4ONs>YmaL(>h-&k*R~Yg*Ac)fyI5?V=KLa07q$3ox z;8K*=uxhyCMS-+Q!Ku9CdXNmeaM2w_fwOG^v5NS&pm8~r2R%Fz1o&6}#TiNCc$}2$OMiegOUc>MBqfkbQUcVFpN96B*IQ0JbrrLUoLZKlkZj*AE`GJj zf)_K02rgq^Ezm1zvPwr3P)O~47{n@j^xC6A{$ka%L3xF&$1ot;=Y6F<;qP z*Vo?N#s0&Wsko7juy=TdB=WrdnTbBd40b}qzt9 zx76af0kGeeG-)B!l=}YgPwe7v{syk}y=5f4%=C!ze38-V*q7(&C z&@D){Z03=n1U%7rz%5L=CD`S;$Srt4k?%NKFe_@u{csA<--L|IZvxRj6@3#&j|JXL zIhAj_xlljdH zyjVPVvIK=z75seRnpav<1{cudjgb6pT68DRI-3vi5wNU|kNAohiCC&J8H_T!IhC;< ztX#q*#HvpAV;QXly}zgs7l0{I%ujrtqElfN_;Br!RLVEXtB~bw7JyP2Nr|G|a7PNU zEYtliBykJC>SAx!$@~d|si+b|&%ML%KS=1?&Qca%Ug19y&>cUA>9z9w^tDeVUw*H6 zm|#4oypDdslYtq9J3L#6UUzwze3-5%%oH;9FKq2&-LYU&hk7%TvqY!LCUW}xH9dg~%&Mvy{`WRvXnH#1`Ifm_Q} z#8s)nn{*`7hn@V~xBVTzy#CY6D!lubrXSEhMh8wQ)=(dPDDOMRbXUE#j-@2a==0gj zZ#tH5XQ8gi~uuUjK98( z@dA`*3t-`jiukJnF_&*QA2mq+RJGsofS|Fs>EopwC%e&?i?C^b1?SAqtL0?A#@qHU z1W?D;AFcJ?QN^?U^c4f`SdZB1jvfI)@4%*Sp^blG-nH|y!*K))nY>sdYv z*(J`?2q4F);Tnph;^DMq@vp1uZTl^W^Iq#ws}^{C?TT9UVWvqHQ@62IW;uUi>7GTD z_ulZeRSr9bA`ESEXFwf*QYpj>)&S9K)NQfj1BH&WeAsJ!PQ8yh2z@#@jp8m6@_xx_>B^#&DnNMKrCkT0qx+ zHG=xOG*(JQhvVoMe{3&eh|(LKN?W;u!bA7`Ar)vgaJh@iv z|4Kh6X`{B!`(1~$miu3ttoOTm zm)zi6JJMmohIFgv=c?jwac=glHGQyJIGWG*P&m}H!R&i~|C4Ufc$T^^$tKgcD^QpE zb&lk}M+_dP@i40SX!6EFio0~B$S0n0CdMw^MJmGB_fcz}@;m(;5p>ghv2eRlkpKdk9E`)1XAKm+6_QRVgTTJR5j_xikfm0z>`bCt?ED z+UkpW-l{HMGFf#bOHvYuc(*sNXQNmUL?g6-2^MDbnxEuc(rd;l=6MFIReQnsUT>XR#qT?O}a+E$0%Cfs*Q3%-2s&J%$7**H{ikczL&p`B6-WsxY(s7a`Y%~=z zH04N=Tywj*I26HwcJ)#QAsu-iZqcQBGDnE|sLea{()-YBS?_l|(|>t=y`Iw-G`=~5WQZ@*3T_-%=OEqA}i zC%<&yw(oly^3WmIs^K~3sl!Q+R&%3R>r>OY#f!A-j-Iu7p)h3lg}c~`!BPWI!?){< zvW#C3{>rgycyC|h%>#fK_-7cQ+e)u%M(}1F6Y1RmA&c9fm-n5s#!%^b zW%rKe$m@gea!ZmJd7|eyjm{o*YWsBX3VYz}2fIVISCvHfJ6MG@TWhn8VRaW-{8yNM zzZLIWU~wE!?YfW@9f58ZoDzB=*Bw+|m~{bFT1^jOE!D;Xn$#?qZN+5@ecEEazG8>k zS04v?weNmRGm&^MYcrP>gzrWs-ge+rq*2%|f6I%ad9+X=K1ESp5d{`PBh9LN#`_d^ zz4HpJf9dU9oPc8scte}LQwW}M;~~j`K@ueDn={l=BtfFiE5iyDzZ=khCC3WiG#kk= z2$2H*%nVBCV)dHiD3X{1#H%zjBe${0HMLk5X)Ag)u4T8y(x=c~U%#xhGWHn)(xeKH zc`=c!&Ufm|GpriX`BO4)TV%~ed>aMkbF9j@jfoq=tQ$AHQDenS5Z6ayy54pyd6$0v z7@8^qXsAEv`?lBtUOQxXv%?w2PZ$$GW7zI9U|F32HcOnzXA8Dl+jU|VzN?f*y&lc+ zYSX&}fH-UgH#04p=4K(qS zK+t=pUWpp}vF6 zBVsJ;JhG`~*zbMg9WXidZiZQl8*0T35Or^^zaZ^+f^sfuMr#-qEF&h1$veh~*XkAV zxp1GH9V?fky4qGGO=qdrN`=I38A~5Gk=XGhn9$K2XJ5Y8uATOwkGu^>F41-5ff(ix ze+u!}eA>7t_Z~kIFO*r!Et36akIMoMWgfx2r#zmFsn?hxAU{iaR1<22VL>r|I~JZ? z{<5QR?zT#TRA(&IqL$o>?3>c3Zp}L3AoO;g_askQk7(YH-&2`m0ewcwkI&GF+_M*U zk{yZbRmhbP&7>!&&)1-zsPX%1m1u3+&m?_>W&Snl+X}Eg72S?wNC42p`r#+K83{Qq z02=B-_YC{%$ERvDI4OdBg-_Wru6k3yY0OE(Vw#Q(uvIn&UcEh_RcnA*@VeBvYr<~K z<5{iTI6obgNn0ZP@bQdTx1;J!Y#*2O`EQxkoNR2*jzQFOeWW~@7)Q<4cE|E_v?b&% z+{5!ibKWbd)TD;ISfxhw71PTj6P#hv%;P8oo6M6srW zi&p`MG}wm+tYQ#w(n9h}26~jl5$Hk4JwRS|!<-|Vnv>QZX+aA~XlcHMD4?bwZGt2| zqLaDGf$W!Q7GD^K3{2??qVtTr7L;hk#j)Pc#!)gM9o z56rGahx_p!?|xFoGWFuVb#dSzoICKlTjTc*zOMjKO(8=7?9kWw5C~->6dn&&IPcD7 z2035`A7MeH6sFe59e_+|tpl044X~Nkv(}cib5fV$3)PyTFMt4=*$(=KwFSU@b6?c} zgfvu1p8e|Sspu3O10LivleZ=E?4SUa7HO81LU>XWXf&@aKk-42AE=Cu^;17DK&#BP;I>q9XXJ}yQ7QB3!LIH~o>xk;hn_z=Azwg2$ob4v zlNF_%z3HI=&)bVTw+pz`XtB&k?=(ia3~KXIU)pJ&O8-SWi8E&B(KPBj>Hrh~dN>N` z-NKd{Y{NnrpmABsK$F84=t&tCAopFG*Njq=BUGgQldZ(T6I-8bk0DLdrIo5-XKA%r zAxml8PO`#zV}}<@}W%P0SMdo0^+;b>8 zhGQ57Q!Ie<`^^`YKsOI@B%n9P(5~tNLDEh~(w=6O0B63#AFl{$#QM40n(S-6!{O?@ z0IN%nLop^UjHi|CB^Xm%%0867rk}@dv-2&&8@5*Bp3Y&!rYiF?Ab2W{;$xLbg1D-d zbyKr^(Y_|#`O;q`(=YDaSjww;Zpe18TnY<7f6@_%i7`WxHV(QYHTBrMBw9zH6`*@n zCfZp(fIN=N8R!M_{F;I!E-Ax}?AH33pC1N#f%2(aZe1H}i)~ zE8wmRPRasebcEqP(s;%svbiNq4aQ@k$EWluCq?-Rvm_^dErWEq(w1HHGzB+hlvayg zcvc(_fAh#9b$vU>-#j$yJ366I2xK|H476)=D<8aZ2m4YQ0kC0_rlGB+IAags@(U$N~+ZXz~J%W&4|jCM=Y&05BP0w>8RUFQu`gL zG&<3uQE7VO>78i;qq@VUBX-^dV!4rnf-8)-pgTUU;laIgzH^)Gd|M8l8%uY~aX9YC z=iu;rAKE!AX-1V~pdXV*B3FiKeI#J&%f3D%$EZo63dmk$oePtU)Z*2Ci6yzr7{{%4 z-^~t$-kiz_;pBQuLb3qGiGb1A@UDz`@DmoRibsW)C(d%9<#@Z!<_ zzdnQHFPnhBLS)fz2grjrpes6ZO}BSKNgXCxBx=P1WQ3O#%!zdpfaSo(1CS640q_Dm zcAbv5Q_<&ejEW>W{@4+ff8YllvA$N)11SBq#5-CcZ{BAfW?!q(-!)v?&&O)hIGge) zJEnon++fE`DFt4ExVsOlR;$muKB#VbAbxKoUQWIKYw`x{ro&~S*Bs;7U_vPT)(;Za>LHbmOX3q>7~lEX{@ z=|9|ct`@oK&TIY&gl^rZ_HKA-&8+Ilp-F{w9UXaq45 zs7?DrzYH&smt=e&y3(z-;mILCUE~{d$ubsXZWRJX60yk3OYHQJI;s8)WUo~e7#)K4 z2LKzFFbY{;EMR<$A`!mxl#{3ix1)yvxTyfRw#3K64hi2KQGh**iQNY9h|-TOpnSCU+JRPeS9-aR>KsrKvE+YO&t>MhD=**LNRL|w!ZY#y~=@U<0>`F^86u6F| zLUOtP`}S=pA$JbI+@HnNLAD$`)C~{#@IWZM3wDVQQc$FS3S|IrE`XogZ3sXq@noq| z1x;rhVO&T|&QGPY=T$Q^yPAG!PN&N{+SWX7;mfKy|> zg3SGB+xj-wH$ua#6t*WZ!2 ztfhuoQ=xUL%Zv^$DyHyw+Hr&~t5}PccUm;H^Fhg$!oYL}W^F8Kg1l6b^Ba#xj5kNq zN~X7fNI7WhEGr@k$(Iw26*+nTSh4uIl*jHJ(J8mfv*V zDhRFbN;Qe#!1JBwdE1&Dj0yThNX4xb#Q({Fkl19sQ0M`~0Z~R8G%N~QB-m{?d-@Lg zf{GWEmL9x!@#YO8jnyUd2;X$5vea00y6oG}fFk8}G?W4^6q&zX1Am@s@o@c=Jc9P5 z{RWJAz?&HeerLVYXz~b(MhA>VFrtt=Ay>qU*_iEBG?xu1jxvR_e-^Q$|brV zHFl@Ba5RN3uUN}j-?UeBx=GYj2bei>wo=kS0HNWj$w1@D!&4TwzT0i%wjeP4rm`?l z3%x53`PG2tOLdL42PYmAevM{ibsHmr+bA=6a%X5pnZMikKH`cxifSs!qgreE<3^B+^D70Pu=%YJ?rq&IYjg!So@nf%FAw8j}j+hj=XLY-(pyFggQZ z7asvwm4hB+J-O~4M*|=o_z?>=A`w}qFI6)Q$Jhz-WysI6a|YecIYb~OeUQRT@O?go zu3aOq>4`7;W4*^!${%cwd1e3nSnFbJ)qtvs^i%HZ&|?MrI-0258w|| z8ve3q9pz$@7)r5bHy%ZskZqjLtM5Jtc`1A+KdN2>)ki!0$pGuu zarruYt~v%+LKLicuoxPaQS)>**6X^OnBGM#wBf^~0-t$Noq0n-0|xJ7FtTq#+;`J- zk@B|aPHyG5*X@{I1sW8bTP&#cR(g8)LD~a{*~N3G4HDOS`4v+(f)_3Jy|Y*xe85iI z;ewWLE{nre8}36xn+_pA(s0D3*el+C>ikIYe!^+34aGydQ;zCNPgz^A|G}SRAoUa| z{P%LDmW4k;nnWm4i}~@w+r4keKlWW>`CDN%+fkjc^LvYp-EXdEVfJcxY2*7f5jnC) zWnk8401QErWJLi%kQ^oFFkjDLKt1QY_qq4|J>UFsfTx*I zUA<~|b=T^uwfF9gozr)xA-ixw>R zR8dnOc3t|xvLr`>~v2_}-CK515Vv7}Ht%ghMHzdIedEuIB>uoj>Q8LaczmodH=9Usm~pRd|b+aWl&q*ZCqI3MBn zY@&Ts;?oY|R9*YJY~Vs4ye@N#FuucE#K`3o^JP=_Dj8)C8{b7n^SF}oN7oImhE4ZR z0zd_|9Yg{GATiYg)M{uO6v5$Uix*a0>;7_d#f3!xObAS_8%G{yTm9zwOR-MM(2RVp^`&cuhV~a&1&A~$#K(@c5rgRo_3x zqkK+{DJ>5_DCCNe{Y4h-VZwn@PWRs8;cKBO1H`xMz3SmEx99MeIyI0HG*Fito214- z#lcjy&bpwl#)4l^P#=S|3Gcj5b*9H)6JZud=~-N#*I2BIBi&zykw`a5UEelBPEEaM zGN-OSc+P7xxsew}}m@4Pr(C=aFBs5>uBoMBdR++YdKh z-PcAG>)>#6?Xk^pzKMeJQ!ccJ2$_BQ8Lk+RTrnT-r9YV5RyltHl~lcThZPCybdwy9 z?@l(LXGYQs-X+>k9D0ZUdWOV^%(lUMRZ=AP8qt=Eg?8Kk0A#2P`Vk>Zgt^~1`mwH$ zH%(=Ovy!u8k5(i{5?}A{w5yG>xXnnE`yy7%fHhFpAFqzzjI{f;g)thYoinMxP=DVC zRfoI;Nd@~kAX{d}Tmie}*h02OzVwB+RKPL!=i>w6XjyK`;@fT=$f9SKdTdayxE<4`DVvl+l zqaQnU>hgqy=(BDRDQFb0KE$(?7`LVbgBSfx#7j&FFAE6B2&Ht{07+T@col#sdZJ3F z?kR{4WD!jnhz2Z+sGi>yv@l%X0*bdf-z8eMVZ7TYk!F!Y+L&NS;KOF_V34CSJ?oAA zdINnOOiO6IxVa-Ymu*Hi>ok4w67iEnE;m8KH9hI_e8> z9R*NOPA)4}A+lfcK zG72NcUUk;Qo5s2n&|1NwQ;=us&dX5BeO#malGi$SDCpyb#?4EW#77rh!WU(HDI1Fw zSA{fR7#Cf&s*+!qy%hmI+Jdpxd_0EcE-086YUxZGU3-*MbM-%|JyocaLGL_6r^2p2 zWLfgOx*WIvQp-6r(AFrUsE7@w8a+}})&PRU;L~^WTc#mGeJHgtt6e`R^Tk3;O8^zR zWoLm9L`mVrG-eq7zJ~i#u(kUmZVAli@$C!aG{@ZfG(7s1PH2R2X}J@Q+ZhNSKS$m# zUVJQZqRlt$dBas;6HfJCjvBs?dr|B?r$BZj3GUXiXRS6-%zGyUhyP*UjZ$DNDpc`u0>%jVh@+k~j>P44hf~3tCos;I30>ezMopwYNkIM%%YMxaY+?jWO=y-x8?re%* z1-Mv6v~UWoY~e44AK=~_LC=2l`6c;h&Dg*kf3c8&nXXepF=aqU+v1;po#TRS*9i2` z%Xh`U-1qR>@|A%b57IuTLf3K;tS-gn94s}B=jc#dTx`2Hlt^qBzY5G#|Fp4V8`j1* z`dR}Pue1&j9X!=`{}C72MN_BfAPD10CRSBs#i}GLBUIt5Ju0JhadQ;<;apqE19hh+ z!OfGmy4XcE3Ql!COQ!q$M(35G0rg86gQ^;U>NJx8_CE6|1JQ*& z3mxEfiJig6bn(0h5Ht~b3+ zxqiL5L@J!51OFJ_3zyp;ne~O#3Eme94>trJw7nd+z=plaE2klneJE2g`bC!SkBS#% zu;)aP1yJ9W*5S_s=2U=+JF^ceY6)D5r~{{%&a}D7JKL|(kHoe?NS#I}AW>ExmxUlH zcb>~n8=i@=ISjcAw0hap2DdKVV$HP%oi-cd1HbF~7taae!2VM(5 zW%uASBi2V9a~9rUV9KMn#&3KYjlkUMi8fM2>yet2;41grIj5P@9mkaLIZ}aI_QT2W zI#40H(Po-4&!G;9e%9IEvcyN8uHGh5kuo)S%5zh`d+XHg`LFV-e;GK3O@{s)3#Unx zhkK|R6pUxf6S;)O{*k0sw69b!!3(_+H6 zZCvJ5e5cHSx)PEyHg{dBOI#Um`0)jbnHD2MTW$+4=_{V?A&*nuQ5zgxPUsy=Ig+uX z&AYU1;`}NPa=M`CURXVBDt$Ymnc^u|>ObDFv9}oH97(DL0EJJ}$Kctya9R91a)LK) zf$yh0r~X@yMj~TT!1fo+oVom=o?M=JbTS)^eB0acu}u?zE)(w6ad%#v&DkMRFj zLSjDAeO5PaQ+K=Uvy>Zuy9}~o@v_xvou+J$2_dhd1IvCT?X*b`4LEZ$f`qdph5j-6 zg!LTk$^e_33Zp$A5m`^#+0ZsXVt--&Fy5>-{!U9_YT)T=eXShAjr&gr1PxN(%I}-+k1a{BDqole4xddy8tl0kM;~kd(NiT z*%a!3`$*D0d100M)y(Ir60qos)~dNpA?1{@F9BQRAI#U+EOyQ)wGX@6$n!>=!J9pg zi7&d59``WHJdOwUhypro`I2En^r>RC`GYjjS!erz=708x&;-n!QWrjz>j&0dlRl)F zpqmWkSn{3RAOGBiNOa;JKrHmG+>S8;fsvK(+SwHo{{T)8fUWr9c9W|tj#LI$YN69F z<;(8`dSh3O@K!Dy-tplmbSW~jBQGxtTgJ#zGarSPn!v_l@ z%+c6ICNJk_$@QLsjyS9EGcl%?sh~q2rzQRj@lFeuEqibR8a8 z|CUeS9!aWlUqz*>)I^WBZ}3i(RG^xae74qMyjh_sOkq)*pk+=lm=;o8@IH$TV3#mg zFZ@2~ZmpMhBei$&S_jToP~f#O`Z;U z?@6*$UiJ!`-r=aO_B;YVf8FTeG_$6b-0Fv$@w8JTf)``y4HqUnbQ&M&MEesRbuCsH zT6@rk>}G-Ss;kf7kC~oGiLg7?W0HAYNll`W);8 za^G(r`Hq4Em`*?twk}4BA2rnu!PtoA1F&cXRMh1r0_fn%xaT9>E4666PR~ti?5t{y z)JL^INy?80E`mZCkfnp8Cy`WYYDxzCr(m<712ivb55$bN)f3Ob{vlM&Zr^Ym;CPEP z=v>}^NSxx02TURVGrrI2B`3w>kOc0v^CAT@<1#Mkaeigr!rxuONcQ2j7^?SUemfDf z_6w5Mo%2y**&%5r?nya%K@c6Jw|wY>(OO<~${X#d;ELASs@~S6D%4rOLmNIMBs^2> z7sbPeQ(ND;Yfpq(!C|4g@?L zt=y_ej=m)O_sf~Pk*<(@H@B682>s=hinm(!`Ig7*w9yH^B1f|fC)J3pIE)Z%S9LAPP%VWR1`T4W)AO5-bmx=Blh>WL>zK)t~Bl`q=~0P$z(04pCI zUO_AOaSL#rYUQbz)FajFXV{_3M3ppOb|{{b)Qh}3fHDuf$od3;+Z(WOybWsI0QUSq zY!mZCKK;_X-I_#RfoJ>oAIK45N3A|G@@%Tl9|8&A2hTbv;n^#DJWE5mBY!Uo-a4qt z^8cc&&og#~G4!12^1RH~Vj+rw<&qeOL)M&^?_4w9DADmIj2h?ku=LoPkymH$ctC$M zT_ny~ygpQId%y;axe`xjqR9|b>K$pHt3eYRsWJ2cdCN}MQc;iU%yy`*X%WfkS99$v z!dqGka4KRtIW59=BiTi!PZrFTj=qy003crsfYF}~xLg4L0@sL;XuB~ItM3wnpUMrf zEG+ibW>zw$Nbg^ROayiD3raea#{rRM+;)U2(%|ZVz|FRemux%v)0dwz3m`=rebILi&)`a_`uge*N<#! zZ<;75;uB=7o@SOtqCr1^aLZ6%#k`KwTH5v7 zXS*T<^TZGk)LBT?IJqt9DCKjmAO;ef8sJ4RLGCyk6$~$P?O2xNn`G;kiE|C3KDMWl zE00K~mEg173Il-bIlM#XQ7h9aKt32a%fcoQL7+vjPUw!gkQEy;6tNewA}Ues9h7A0r+_}K~GBTra zFT^?*ZW&`JQgdGwr0nEyh)^@f~RuvO2Ho9e7V0l@Gi(nbT`FnFXhEBm*LP3#YoXcb8N-N%OB~DSIeE8iDvAdMY~v>9=Vwj_aUCr6uzjJX zJQz$#@@86)t}xH+jg66kjTD8o9ss@6ecCEnd1d<5M_bnPX3pz!izgSt!qFl9DaS9N zh0!UGyV$7Q2iYYHUzP}e&><;`ugt%yOx{Olz?$jBPge%eJsVE*^J>>-CXds4dhEd= zGX@@Rhr`9yo4w~<>$N7Q86KG_t>sc5^5VMJM(|nu{F>~SyKJO%0_(gZWFuD(xd^#P z`)qPR-1yd0y{9IsC-#R;q|BX>_P7(4v~o%+_NKZog6ae-OFW?DVt?7b9cZ{H-CKIv z0SRrwNHp;7$e=(;8XSnf22HLYj@9$K;vilInT5wq-(iE=^D#aO_DNuF6dl;XSKG`E*q^ z?fPFtm){fV>g^nMBrM866ktcfY;Y#>2zbx~@ib6-$F~x86yQW3I%T>q6lFlliUvsp zWDPROK}JS2C(1hD#)JlAqq0<-8nA`(9tDsXM_KSGo5;}IgsI)$P4K7L!; zbpIU3in)TV@vU>Gp5jNC|KqFnjpg-<%7!On7F75ug|(w9C`nl+!(^+RxDd2w0mvK* z0xBdhkJgB3Fmx#B1_*`@{gGeen>5L@WXi?v(>$CwjUb&VFFF>=zm;p{H@&WH`Rs-v zeE>MvF8cBPr?8zEk`VYkm~J~c)-u?&)S?r+&vM%@H}4%Rez0XlmVl72EJ%~m+M$4w zQqDzIY1>@TKh^+c&o!?&NsOiP6-WQJw7*<6i^^{LZ+b z{rlqg(IUlA%;hEsY;#l7ntZ5WKqL&nIznQY>QA{t=^HRP&%%q)iq>@sbQhx}N_XV9cZZq(+3ga10JH@`H)Pad`f61>(NEC7 z<>fH^nM=d=&8OXjUbfF(iRX09@Kx9zy3e20)l46}i}+qzgAbK40Gi-OANpwmY<{3` z8Gl|g7_Fn(e@W5wt32xJe;-_8+FKtg(CPSZ!3B$06)f&3ftiRp0?fy@f_}}jvscaz z8TjwR!`dzjmu=UE+qPT7VcSu&;i~PFbJ7&eeW*_W?R?lroeK!aTx@{wsh+ZfMd>rB zr9_Vo*Zz}rH+h+t65UkS8;-0RlNoJ?p`WD8Q5xJL<8y9A!>;n6`p3B^3reCda7okb zyo>tEZD5mv($L!sQ%ZPfFqh&l=To0i;t{J~Hus8kl!q9M5o=AI67|$9iRNmMNazzI z8u^7hwD(C?zwFD$@pEQ0_zsB(8#rX*$H7N!8DuA9W*-feN8j1d+I?A}Qkza}kVLs; z+|q~cXwSc6;OLN4r#sSa@XOE4pL=2|(d_%B)VDX;e7bvD`tzmrUlk4-lrXiNBW?SA z7yeEIJ)~nAVGb(l?&gWK7>E#2kB~kk`!pCB z;~7nAjG6EM;I8ZvXMr}huMDngvp8OZdKuv|v|KPA-V>SxBXUgf_}Y6-C&0Bhm`UO( z62Lz%LU0>Gr+JN*!6AO8t_>QqZ;ow$<){j!1fQId548nhTXf;g7Y0UGdbi#u+>7wv zxJA~gljaX0c>UQuFaAa{%%%5Q0dYW)xhjQa(1~ifrU}uYTn%d|K8b7L)#91`vk75h zNyM)HhR#w+?B%T9Wq~ml#>N&z1m=Rv%zn9VYRZ!7-3Plb z<$(PW3kYj|LUR~E>>&whS0t@Ef_hzBEu>WU)`3AW zS0lqodYRl@H!>!JX025LpF801wz0z}V%Kd~FxjU>M4MS7^icB|{ug0kVK?I=rRdb(9%ISY zs`jG&u_OGqa@e={_3e9F_MSH3Yd$+GwYE}zW- z98Sx%bb(xV24D1iam{Y|TF?Bjq^DbO>mov!gJ;t6BcM6>j(PspV#Y0Whv3?cPL=RF z<$-tI{Ss3#bj&60A`g1%n;j=$qb!yWY==}Llrx={NOSi?q|Fp!! zvM+F7KPoG^@^Ic;fD(4{a?Dh~Ia$ta5w^2!!vL8us`|q+zh&I^?7k!bplQ}UBEv|f zkmbO@d!>4<3oleVxKw`V{!tcNS^i9MAQo7TV7iDf^RXVfh=Q=7I7A@&0|SuQZzMG> zt=Wg#1$YAc8Hwi?ueKcZNir`#I*?loKKkPP&kObypn&HW+V(?C{Y#bA^#92*|9f7i ztGgs9Gp*f+8gvjM{)ur<^kgu*QrX*!Vae7R!Cj6+*cix5W31L26*p&R{w``ehHbQD zG-0lvI*`8n!1+@p3UaIJC%0h(UF-ksPxFm~ej}KvX{|ogC}4h%HNU{W3s1o+-$raR zPQd6-@iBS3h(1_g_Cx!iZm4(GQ&e2S$m72>O2PfjI242cq}wt{Pvfi19un zOxn*4^+@zL3WrT5`3K)#$DHy#r1!r8F(s|VXCEAB-ve=IU=PH%QG@dRk(&-vn?7Km z?~QAEfA##2MnqAAn_WQ`RZH#1KzWAOC4wsd}EeX2d@qXpqYIeUT0msH(~ z^NGXokA{~cluS>zD3H5dIE;U&o~+qXPsd20VaBeI9-4R~It>!cD{JRKtA1twadW9* zLS}(0#CT2oClA<@klguJX5_RVPZ5||__WD%-k%uR0<-L< z4oMm!kGr$|2{JBj^13j$tKV-X!q6hh^Wcd za;D_dkT1(cto8KEd4?O0ZKeACd8{A0^L7}z4}V^`nH>V93WCNCT6mT@4rV{x7uoT4 z>YUBdiTwo)hzL7Ay0_0Ai%yTNT0K*M;8;=vw%Sfs-ZVo02<8r1Qz7t6{`VhsP z%&5p|6@TUV6MAYMn&#*=(up+QOxBhM^QNXp(<#@&>7EfLMMOm3y6*JUWCVJIw9b2C z^ec;?I>J%vo>BWuTb@#V5UpfU)~7_#R}$9g{&~I2?_#Rvn`ttaLyQ>&&Z4804|IPC zO|Ce8L$UN`WVSEajZcqAZVRUD)E-+^X=H9M!@HtBEFjY4*S~dS5i-xxQhMbh*RkaQ z!x+du&3c1W<}cwRI+0gD8XVDKc2;MyYe4NoUsjGZ{45`nl@}U}kXfvn&^&x$AJu$9 zlJs$>imf0GZLdVZHU@L2TN5`-{7qG6?t5x#*LLPWMDu0MOpR5dU(wx6=WEyAcSo)- zu(igXO(32N^x&Bv2Tr)GpMypyH3X9ZXQw@d=yozQEE)-pn_mnHTc)KENoLn*VK^bo}x zW5?T}Ra!+6S^l}9tW+A(CnZTZXP1{OS;s~_h^(PU7Z^TEQKuh|Va$x+DY8{){ zMaw*H=kkgeAKCyg=mSfo87+zBxQO+|aH>AprVg1>i2b8G(QGZDMQ#HZ_79moq|B0S z@U0l|VeS6#fEar2l~j30LB4a7BvIefRFNgc6i@eaA|j3)r;lE^pfOsbSK}*gDD@ryZ_-Gr)V{#1T_Bw>Nf!k9u?J9@=o|5apWb7xFui7L2~4 z`m~_&BE6AZ*&xf*=KjglCqlHutUHtS!fW_g`hlu&(UexXsC+R$EwhFd zc+I%XGxB6$XdYegB!=Vzsh^nphpO4=kWlS=#AC-ih}07;-!{L*A9!(O0D$!?HUY*a zqgl;D*TX~bqxZwB#$Iss2g#|lKmU5|9p2WbY8QSLrdz@+`_<{;ljb*wFP|B?l@}N+ z0xu&bKXepP*}gv5Uo^FH>7`xgNT)r3C$A?(o@;3-mEO?H9pD3y5XVI+)5+d;%m#gz z*?muvQE+!nD~}07c&u${TvKm?VOGyyQDYaS61n6rjOf2=(Y-QwOiL8$m>{H?9ZDs} zJ?5oV&{Z%1XC7G%ewJ@9a3$h{5N#Xk*t?E#sg0tdo%%DG45?=YMrAoo#Y}A+*!CM) zX7v8A(w)~FpA>{;q-oS1laf>AhW*6K2uPg#YPKCae zT&)=wRB$5ZlnYbOz)w7JZXW)0z0WICB2NVYK3u7eW~dHfo~2d$TtdGSJDBPZVh0%I zd-8%bEhV&~G)eYJU@7Y$`eb>^+U(}59Xeydwf=?Ky4l9^!*>pC1#PYl7mS4G-EcI& zeWUWp%^i=gvV*FdtR>F&{Zif!x1Mc4c4W7vwkTIBdMjqp=$+If0p7O#*H8H#$kFtG zPi7zLRmyqv(Up8ig6K;C#rSZdPePiKwf$9vU^kC*L6j*`M%;_(GeESK}625s3;UJ->edd+2=861S&In)X+cKwtR2Y?*PN`AiSMtZv zeo}IGa$clFifAsw*{YzPUYm;_ABs}7nuWbqJ$6lEo@sgfZFPHlH3fC+v(OW%1x<@z z>?dX`zJFD7`A2ElfO}L-JV>1grEiUT73}u2om#Z7oklR!j}xSrS21jG@bFZ7Trl{N z>9li}!^O0cxIezZ7WOF0PCoLLBcf7Uuj^F&7KmrhLH`2BzaRa6{{FSs|D{i`fiWt8 zQGa7`COQ3Jjs(-<#eB5f|;0MD+Qu!8N$l(;g96pB5;}XmnaF8FKO)On8>tan(w1WrJxgsjp+9Lt-3g z7p7@i5_jIo6l5Sqw|!}_>sny)d|ZgMx*MHR?`0HJG79tuJg!WPc^+OmE0wUigwJXb zWKQbq6KouAWF>DPZPFe5j_RP(TeZx3ootWXph2GnDz!+@H^ArKCkc`k>Fp1Wcvm)W z5)qBh>bl%w-B>JhuWvf-P!e6w7AjZz!SDEvL_otj@>A2HOV_UvC@f33?Keohrwss) z@jF+beP4lhXcYM{9N<6S#gx!Z@Lq7!aiTHE316(KKNJ#&AfUX^V-`G6w?EvCzW-r$TGh0(qNSJRjX!X*$V4P)#%@?Z}I2J?XvP|G{86bZ%#%p_@!0 z#;=5Pm`~Z&2Vuq4&Q+YIdYg={5h;9)_4#HkE1vX1j@i-%ulMA_!%4WZr`xn%H$IPy zmdR$hHpWQ~yrDB~5c`Kvo zXT>_j?IuI|noc9^jvArS^*c`n*_tIgay34jZ?>^Uhvg$inFNoqmoP<+3=q9l-IPW% zYfYRY=XaVEwce+j*|8BmnNyeuA3EFL8&}i@bFGbta)p9A-2*CSbjB%MQ-^Gz7sZwM z192298Lx_1*8}K^Hmf?DJg6Nf{J?R;D*<4IHLXQ9+iP`~YlZ#DnC>lTu1^+sg)qDc?`nXlEYvv*|@MFT}k zPN8pUg^k+mxNEMWuC56gF2m8rugwh)BPdMSZ`}0^ILuOiWm6=^PF&v!WjoHDgg(d3f=%#`6GnQ5?$9F$G6*f!2hO7tQO@#TB8q;3h3;?`KxRq%&HZ$mcgh; z>s`3`PkHRTFiQo01@hPWq6M01(~4=(5zgDsNLdGD|HxyAacBf3FxXUwsk_S>$)L6a zsK>0a|1jpSl_Gbw9pfYwUH=@_%LT;PoPmv5T?@APharEf?(2Mf=9b^zi!i`&A)Ddg zjJoe`t^{z(6SU&of6a>j4-jHZ2%*Pu6G9L;Y(iztG(`^|2&je^z^WClq0;dB_FpJG zaO%CRhK6+x#aOEb(b@$ymFAF(#-0@{ISKEpDW!)x^^U~7m4HYzAr11U>+!*thLutE zGSID8&vRA{N4m~W1thA1o-H$+agPUhJF8kaCr88UVul4viI-i91G@$g0;cyD*@n3# znxaZ(Vw+TI%x)g!u>pTBc2to`BR-Dwy`Yh~IBfNih$0u2vvn=!f*#q?{%`}0Nz0)7 z^AltNSI@m?2%~GV%&XTZ>aGxLUJrC`C%l{(%5+xa5j!E-m+Bx2CK;FAe}0@8!10!& zzt{8G`e&hUWnBh)<&GH~%noF6uFJ`A6RU1sTh?#Mp!cj`9u@ngR_qSK)qh|00YL9+ zrDdB-n=JBv8}h2OpVO5`R_`PMuddn$fXWTOSdLlk8&1lmywrlnI+r$f0Qfl${+?xT zW7T&&3YD`{9|AL*fbRE&JgIMiwl33m?Kw2AGZy%?!Bj?590V2-L_NlZFw~o%G;;N; zp(&vOhMsqpLta~ilW-6olNmC2lzWnmOw#X=+-*o+ZbH7x$!Up93NA}20MEHfSK&bz zRbd11odQk^Nm>}>4fnK&8-TaYNBMpbaMeKJ1w+%W`fKhy0@NB&cw-18D?Ox*tF}Kx z{Du7Ii)UuCVaAP>zC`t>Ei_}>PXmUAr|O*^xeY;Nk+S;XC=xBzPeTbIaj>8{-n?|C zOOPjZXao~V2653lE|$6_>1`sY#>6ZfDl}y%VEwois-JLz5;r)F$HEBwP+=j9>sa-0 zx3Puic;F>^mTT;Zfkeqc53<_~jt-Fxiyc*Foj1O+uH3sZt>J|pv*TYRKnIpmqQ$O#w2}mfYV}PMQHOoT9x&AJ zISBElr2HfDMD&Kmc@2rjHGNeYU`#v&6o3QZ;Kl|4-zZy*5+w&;VE=tjqG12s0>6}g zQuk*;%-%@oUlcys-b8r}-lBxps(dg4wb+hn=#tW5GD<2Ka1?-aYs>h%T)x6R09!hS z*QWMi0Km&@vQ2o{jWgl!2fdm{0v+R)o5OZ6M0$Di*Nd$~`I2wp_5z*}t#zD2Q>7QuT*S^Cw13ef|-d{~^Zl8XEEmjOzPs=*0pY_yypv6@KFe zb>*Q|v%3<@zh0l;M$Y{|0hk1iyigcs5DKPw`j7bje>EUh z*^9#lMB=&uvGQIVHeegB8xX7U#YqDyZl@{4_~5Yt?OfQjD;9v2-Djk29u1ROjvM71TP19zCeqvfs#Me$+NFKvR9S{fLVmf185Vv8yzV zSKxZ#W};)4F%`6D)kN8BlHZ?}y72;Dq|^Oq|7kBc%-F0sp;*eMsr&vx8%NB`%f_x# zs0_VS-^6Qk{4wKfnJlkK&L4sCxqUCNr>sp=kE&MUx5E%f>}lE1@t-yB*};WoqVikI z_hP&w>DYW1s23+LgApNx=jS!j@O{gnA;gk2TmS_EHm>c=7t%vCAk5lza?CZx z!08T@Ne6H$Ek9uZV6ENmqOaHhV8pcuI~0@}A0@9nqW7Gpmex*;;F!%x{EkBn@&5FU zL_<8_6ck9?%rg|uVn$^JLvao)Z39mZN%DYg+8yCaP9G5E&)m5GU_Ts{P*w++#;;`DA%<>c`52l`$-|%`@7o~e< z-w^dOLzEuFO6n6X8l_4;O4~U#yq=@f$dz#XRKvd0A^E!M^w#1j^l>@Qe@$S4Nn>HA z#y${3^zWQK(pab49{8v})?cxN}q#c$gLGuSWHAA5*B-pQVyxi^}u%`fUya<6{A)nFeXV4~)M}I_%D2EZ_QTinn)CZACbmKnT~I;jQHBnl zq=N*9ud=20AONj+ydU3uargK_G z@%(SA4qT|#&9Ya{t)>cWUSV6aH{d!KSs*Zxt$&E)L?nlD2sPKYf4cq?VEIY{ku_ey zCYq4}-?$t5Vn<0_8Gb9bTb$>FnHh}Vqw=tsMW!e|&8vak!xC>reXsAA+C%!)%ZVEo z_cj}@JL_vsOw9$aKj^DTBk5NT%C{(0CSyr2Jr2E2eG6RhM&r{cWYGkH<1T1P?hFME zEVW_MVaHON>m>-mCdWy?RzkVc9s?QQH;-J*RI#6=kE+F|*m>J|>xG!m_38KNzk?=* zRXnYD`m#(Ips#C8*9o&`6^K2T5pJsAr#GrwF0^VO)v9J+d8||ODg8)iV$p1+#*Ocr zrat}N(U|9Hn0@Z&;Kii#tLg6D2#Wf#3cZ@s`+dU@@LNIbTlK)hZWsP6u9N+1rMtUo zOekpmRq>9Fm`5l`_Z4Ni)YVBsb(c=a*6vhKTw1LU0Vs(k0=wNeSMdMcX#HOw`LW3O za2A<1&LX>tv&d3$7Fj*cBAdfiWQ6oMiwuFY$ZT;CnIcP?0?Y^WQ=?)72LTxx3&1ib zr45#L$Mp1Dku93KUpMx;ONp3~F*7RLan(TDK%l{tdnIlqZgxalIej~Q`+Vb7*aSU@-ZkH5TfvLA!*&tX{Oh7I>0MbicJ22(ScUKZaqUE>emyP2@ljls;b zE0AR<5M$W`-aISF9{#gI`sG2!&?iT1k_pPo4a~$dKx6B{jpX3F}C-HU7Bp!%UyO^%)?)Z z#drFU(BYf-SH;tRXCl}gB5VFIGsfz5ru=HkKS=^%DGqjB1coFK4&W*>A{fph10$&5 zCgmeC##v-YoJE#}v&h>*^okp!3v4t8BENr1)U zEHV_%A{)n5WW;csMJ9u@$SiOcSuoBbE5uo3T{wtrmn4t?|B{4%Ny6Wg1QI?R?7CQz zK%$Ma$gbinvQ(T!R*$pD=5Q4mDLu|2L*OhjTbxA}frH3)NdjrknHbI@GsanDNSsBMg|o=oa2DAbt|B96!&zh}a1hxpNg#Lmmn8g468@ef zkjLX-*Ts?qaum)Y8^={-6mXnHCWEucEN~WCFwPhQ;G{se9NSsBMg|o=oa2DAbt|9{y znBwRafJt47n|BQ`Q6cUj+a(ELe!_oA!oMWpZ%G1}6%zNlE|w%vkK-z`eQ=ybCWCv( rnDkybJbD#g>;sg9uKGaceIa>sK6tMpi+yQ;l3UnMGRx+CAt(Po=!2Q> literal 0 HcmV?d00001