From 91c4a6caf1fa9e7f7d89cc7fa91042d6169bc9a9 Mon Sep 17 00:00:00 2001 From: HuanCheng65 <22636177+HuanCheng65@users.noreply.github.com> Date: Fri, 27 Jan 2023 20:57:51 +0800 Subject: [PATCH] =?UTF-8?q?pref:=20CUID=20=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/libs/common.jar | Bin 77414 -> 0 bytes .../java/com/huanchengfly/tieba/post/App.kt | 6 +- .../post/api/retrofit/RetrofitTiebaApi.kt | 16 +- .../tieba/post/ui/page/search/SearchPage.kt | 12 + .../post/ui/page/search/SearchViewModel.kt | 20 + .../tieba/post/utils/CuidUtils.kt | 10 +- .../tieba/post/utils/UIDUtil.java | 148 ---- .../huanchengfly/tieba/post/utils/UIDUtil.kt | 86 +++ .../tieba/post/utils/helios/Base32.kt | 54 ++ .../post/utils/helios/ByteArrayUtils.java | 40 + .../tieba/post/utils/helios/CRC32Encoder.java | 24 + .../tieba/post/utils/helios/EncodeResult.java | 712 ++++++++++++++++++ .../tieba/post/utils/helios/HashResult.java | 38 + .../tieba/post/utils/helios/Hasher.java | 22 + .../tieba/post/utils/helios/IEncoder.java | 24 + .../tieba/post/utils/helios/XXHash.java | 117 +++ .../post/utils/helios/XXHashEncoder.java | 16 + 17 files changed, 1180 insertions(+), 165 deletions(-) delete mode 100644 app/libs/common.jar create mode 100644 app/src/main/java/com/huanchengfly/tieba/post/ui/page/search/SearchPage.kt create mode 100644 app/src/main/java/com/huanchengfly/tieba/post/ui/page/search/SearchViewModel.kt delete mode 100644 app/src/main/java/com/huanchengfly/tieba/post/utils/UIDUtil.java create mode 100644 app/src/main/java/com/huanchengfly/tieba/post/utils/UIDUtil.kt create mode 100644 app/src/main/java/com/huanchengfly/tieba/post/utils/helios/Base32.kt create mode 100644 app/src/main/java/com/huanchengfly/tieba/post/utils/helios/ByteArrayUtils.java create mode 100644 app/src/main/java/com/huanchengfly/tieba/post/utils/helios/CRC32Encoder.java create mode 100644 app/src/main/java/com/huanchengfly/tieba/post/utils/helios/EncodeResult.java create mode 100644 app/src/main/java/com/huanchengfly/tieba/post/utils/helios/HashResult.java create mode 100644 app/src/main/java/com/huanchengfly/tieba/post/utils/helios/Hasher.java create mode 100644 app/src/main/java/com/huanchengfly/tieba/post/utils/helios/IEncoder.java create mode 100644 app/src/main/java/com/huanchengfly/tieba/post/utils/helios/XXHash.java create mode 100644 app/src/main/java/com/huanchengfly/tieba/post/utils/helios/XXHashEncoder.java diff --git a/app/libs/common.jar b/app/libs/common.jar deleted file mode 100644 index 8e925135d4c384b9f73d0bf16e9d1fc2ca33c4ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77414 zcmbrl1yEhxvM!q79#||~fCYY?NtSNvWak6QYw?&&!YS!AD?8GX# zt1XvboA16nz|a1g369EvkCU*on{b+VoY?Vvd-MF#&AyMByUJLfu0+k*IDq2>6P{z3 z!MCO9v*L0l;J7x{LI{Bgw(2~BoOU0M#-v80Wi6ux^nHw82~?71@+bcVIoi1Tt(QDj z3gLBpi?E)dUe?tH3&o#QJleQEy8$uCCYjKAhCv!?0P6`5(JyjdX^urzwNjbFHhPpl z0dj~Y_0L1F(iqKPJ8N&-znU_}6>9RQy`c{$Q)QGfz%M7Oh4mnf(*_tlivR-{<=-XS zfAHEFArMg3`ytq(=n0J`SduPGF|Mj_2I?<8rbMJ`*wG9k5l+xMPnIh?uZL?TIQt}h z6I<2Uacn=toD*yS48R5&dakWAqpvYSO0Z$3$I|=HAV|hd91bTS2=zNKvMi+2Cb>jl zrxFx|L&W+PKP?nvSfVZD=cE_pHhUkW16qo`0A}Svntc2P@Tv#d65{&tIcoOzRj(r! z+-C~M4{CV55PtD&Yi<#}0ZwsPL(Se{DCvWwfwI@?#U}8o)+Twoi-l(+&C}Jo#+W}j z*U5x1B98j=h0B~|#61LCWrd1tsoCqFno^mcx)Q|)m>F{)*+e3XhZuP{!=Zb&LQ^ZEGu))w76>xyA;c(cciR2S|rVUKYBX_dd&ui_tU^{)LL7@?_ zNi>KWD{)&e7(v&ZJxc~?uL*WxCoc*oT@$*0M=S)B#4{{uN#g4qh{u3oitThR=e^*H8*ivjc3<~6@W?#yIN$Nu z>YCIBtNvWYAgs)TGpYXAZakoJm4)QXK+Rp5DZdkFvA_L1GuRN0Ba8>Ggtd=%VpOd3 zM+bq8jAO3Ed4Lv8o9Y}`FYWFnrY09$aY9al{SyJvsxRo_2s6COB6YA3V+rX6CCp)B zH^R01vl*IWerA?}A?i0*Wtc6xv#)Omx>SXgs*VP)GL3eG4qWckg`-pAGbkT zpV{XCkF6hB&{wpu3;LhGjM4!1g|@%rA#A1ZJ8CWED%fKt%1KU?o%6RVO_EBhjl#+} z=^eQL5K^n~B{*-xQWdt`u#&i>mh!KGzDTTIoFV*1xb1OfXtrvqQdbnD?=hY{A>(UK z*qLBo)r+@Ouf6mQ9WL?AVhI^3FlJjzR^Uc)&IprL z6g6Z)YB^CefNBeK9cMscl`IEE-}>a4l=}Ku2JM!dJ8p|P-sr@|Fq)}!xIxa+ZfdHw z)^a#9lgW5AQO>M!{X0Nxj&w;D<`scWTgVUAz?*U}*eZp?B{k_Oq$FCyf!85sosIrB z6?<9bRo_OdgcP#X=^~d^P{v#)!u4QC14{k`PW~b%R8y-=XsktG8n-#3TH(fcY_^5m z80{>)u`mer$exeI?cLg_|yuxJ0(f4#KjP>OltoUFfaOW=w{y^(b(oU>ZU{jZ_$^K z?lDdobXNn8<-g8x0m8S=!KjE+XUt2|{$MXKoxQ(q%U*&oA$Tf-Ovhf8hix0&k-rzA z7cMtyj;IF!{1p2Rg%Ra_-L@IH@dwy0Wdaf3FN$vl?px^_;(o^H>Uv<5-s1J5=3{)_ z=TbfBA=_z8OJnIl82SsZgWp{|5-Rp6ynD&C4Y98Yr!6pZoagPlps~i zksK+>9#z!K9t0m(9$IPLAEzqHQcpm+yH@GZ78f#`c}#4A{n?x`vl&_7uf9;@Coc>m`06EzvVGiS+XvH|^ng z3GCem&P2ZBs!QUv6smOfji$fc*9CR+QmKp~Jji%xetwM+IG@KA8#m{=P2X4JU7JP3 zw`2Gs_@IPYb*TyWhyZh=#%OXU{mMlbGsAuV)>C&$`*urLKl9UDcS66^##Li_f&0xB z$TiMiGqWOedV`I^#e@F4bEqil;qv!er|_oG&4zzLwi8qa`pm?;uLFjVoc<$+t=`M< zF=}~XSh`UOqi+Hn)eeoMFs)$&KtpLjGs+Xc3O_1yO|Dl$#?e$y$>R?y7^23dKfM`z zg&X-jL;X!8;XIe`{Ll*JB1pSO2Ce-Ugw`OqmKL4i3NjM&7kwu^CBNxe`2oj*hH%+E zFwU$2TG69+Cnb4vxWuW7*@T)bWJ_Y`3BA$K?qBLWfyzI3K`=;B3s!iU&B&{>^xU>F zQsM1E@bcKHzE*k8-?2RUw+)KJZ#a7N#<55^{7wonndjobFseJ=7?@|_bxNHiI)1}# zJyC)n;lHUCwBT>+-)G79KXo5Gm}2-Tj-r%gZHiRMd_&>;@>MjP4B3)1-6xa zZVmz?*aZ3y4IU8?*@fEu=#_v?%PTwW_P5F>2H>oqHR#3J%MTsZ&@kY*!ucS+^xWZqD_q*J`dQ&-K zd=qjCb8Y2>Mhj{WoTri+|RFDtf z4&RP}n+@~qnKfKIXkR~QS2VY_G9-SuYq3VTxsV6lH#DeTz7kvQ^o9|Z?#4I2!mvI! zW#z9p)MrJCASuh^3#y0UZU&%-m7|yrQ?+k}y!THSmiu0v&kyavc~a9)!jFws#AK;n zP9rxqhHdp8Yr{=sh4R4l@&lo|Fbq}8>;J%L@>DmVQbUMTUB*&d_Pzz5hnm)1e!`brWgqXR z&$>84)Qf=CC({{~v7vQFuhaliEa>9*sXyd&l#W`7w*OHvhT6Dx}k%QN`;lP=AH zElwd7qG zAW%3eW;9JX4Z>gGt2ye*(Fw}sx>WndxyOSjP zJN4k^!`oxdNTi9~oFrSKBkfJS%AIs-$z@j7I}3ih@&mDCQ0g{9poe z<&9>x*A$a;%8u;C;%-N`pxgAWve{xT2eMn=x%~1X!eXn%mUYrcD>Cvi79bFU3&|$j z?8b`c=80oawDlR%=0pAuVjRLA5_4=`IWz?)%h zQ!oy+_w!zEG1oB)05^qCf1tH1@flg4G29)Or62=E+}B*HrVFu%51!#n(sEd`O>!2O zA9~kY(Vpne@FO0e%s01xm)qBLQ#>lK(VfH+6Q2~Zw%>Bc;1p ztZwf~xsWxSU*|%J%t)1u3Vv`#gwe`zl6pj}&r3ni7cF@Jo=+Y#+eC^8O^X6EuCD=G z81`fXjjA=5|BJrO)jF8z z18bSRYuC`e>g}Np7yrkLfx$~#4Bk-7Rh#bN3g*MWQEeS5AzslnAa`jn&G_`;iLGCl zGww_`CF)`Uq%Mqr!pK?U|bZJz@AAM zc5vooaFZkt+0C1GhAzt$q%Lio7IitJI%|}}w=V5Zzsz%(A)1(*8m|Z0gk@ULnPf?6 zo<*>WUQ?Pgi{i}%;zlD@s?$)fj8l#LnHZetO}@ko7K9VIl;J$vkbgZda;q7;G~u!S zT`Rn^M(YkcPP^)tFeZG;0%il^fk{nq~`H4S-!@-uh z{o(;Hr-Y**?v8WQZmqjETQv(`J6pwEYYv^6msZJ<5~-8;bqI8uIdpsUs7@CZdjUh8 zc^;8|dYEEux7nurqfXYPS*hWUR8jdmb6KZY(i`(IYpoQ3dZWdIOUf%o`s84}BOz_q zczNnDHEUN*YYGn9Q&@qg6dfQ`Fx zIB)KO^fDD;Dl@{@auwR*8dg}jB(ALkf7uuo`;5WnX@dVAF};{_NVq`Jq%MFNpnHi# zy`@G9@g~p)XLd6+6mOa2kMDUb!7kSe=ea-ZkLO3MnRAfkCA6F6VDn5rhrX*|eH9q}jK0CheEV~9 z0BLdnN`-lm7%^4O1@7llJlL{Xg~R3XDpZ16>A@?cb~6sfj0x@HQBv58edN{N6B9*II#ZEJs52*g2DRb0mMh6lu|DF{l*Rj_Yk}b^H|T|ZUB)LZ>dsQ1s{M<={VnmRclgC2d#NCfZ_+ ziKnM=lypwOjK3E6?ZIQ+IO4$2;2n|ehKsf)Rhkr{;O?o8j-%v}<1hIwClpvh>AbA2 z{1X|GZGdW-P|Q!YA=(p9*KPJlCC{;nsnm6j$2qvyMQ8E5QukT=HpO`Ye9-toGR0;k ze8{qdb}7v<5n0=Uh!%Oqnb@r5h94U5@3MI@9Rzozs=D=)Rui>_Y!3^0G(TAe=37RG zKAyELuujI%90?Qi8*@}i?&BMC;mRLtXcfB&O|_$1EjWKVCU|U+IEw-cb<+3LNt38u!g#7TWpV@QXTI))i1kJ$7;lL6*{2*tz}(YI8biSRQq z`yi^$>chnng2(3zMCXD9n>Qrc&_1;6Y_q%x~m ze&JYdmsBnQKIXxhnl-4IUsE>ag?<}uHthwrlkq{y!#3R^{- zD!p5^{Mx7NpG@h0eMS&gcg~UO*i4d|_P>*w}?PPL^MRxcDFrXmjRbj43 z+Ih}-*1CYMlp!y|a#8tkF1~ph%_Q7pKe6R;RSNYyi162M_T}-#d&#LziP}lo%WU(h zQ|D0v#m!tv3hf=0UPam9PZwt9d8<@!uk0~P9g;kGP4gEG!Y|1p2$ZwhRr3!`ig?Js zt(D!-Vl`1!C~ll&J6KR%Lrk%aHM`}otd8#~fp{$1J4#l%0Ul~HrVu&{Rhkpj1Vi`f zBO0F7&fI4wpXPv*<(-%Q8c;pcr*FQsqhJ(oGlZyG~o``Pd z5=y;h6yFa3w>PadvtPx=#&ofAZ8-zG&@Y{sVjt-K#>mbjbq4EjpFZUS|5J?oKQvC9_iNJO^r!DB-WL^B{{_CUDD||OjyOCLl(P@Ay zN}cHE_6j=@hh_QaeT1w%bw{jx5laphc|_qrHQ6cNUi7cV<@OosX* z=^u*-bt&n=!laZY#kbHx&~;|a^nM(H3D8P?%n3E(d`7kmF(W^+0e8ilJQYcy`t`EW{)N6B!JTH@C?|`pgI6q#s(CEr}ME&zs z3tr9nuI+CASY5cKEZ;%mz>}k`|9VR;%%kh^IZxAD>#reLcBJX}ek4jbADw}Jlq?z0 z{ktm=q5A5yVuI!g98N4}uP9|*OYcupGc%R49b+95R}@X7r7|&RLT^f8C{XzE+rd;S zC9i%M)80P7gB~jW=b~xT6e67E{nkTu?A6M|($5#d^uF)>&1#8pr?VW;njU0&b8ZRo6FKoyeTl2w^}Ing`|5b9N&sB`tN1Q*nfF$omlX zXtnhYIaT3UY2?Zh9k9GL7$u}ibV6aaY@@kNXPgaDB)3WE4C z6D8m=k5Lsp@6o}Y^6J<_sA&}4_~goMP2||D#OF3H+#zwe;MucOk#?>`-o(T2d?S(4UFeMGN+pBe_u+uG=`#MRZ}qYl2Nazn zZQ$)V1*J(4LnJe?>%QJc2_ln~!`Xsj<*sX*-&*0Rz`_Y8Xeh8o9rYfOzHC*8RvD(d zI&@mozy#ZRHI+>HC2tz=3bQ<=cPn@FBR&LrXAb|MW#h1Q-G1;}>KlYSO=(w&M({xW zA{PCd1g*z7@e|XMgk2kdq+uwyi!gsvL$X8rypMOsFby`2yP`92raXED`*ENpJdV-? zlh|PC4q|m8;^+r?)XzFIpRHL2)&cdh7_z2|Hn2M@RbH)%W#cl}W?kLVrAW3K?Rt#% z(37EL(kjx?I>32sQ}r$>Wf<(F18NvcnWhT=&RSbT$&79W0q;C^MJyb=BMzpNZb7Qc zteqt7=e+W5ggX>YT(_ki0t}DY$IqF+cic4#@`v?-vSm%y5(*swqWN+zO>|$t!x7(iP6j+aEQbC>SiS z{QUhj*Ks1uD0^?|t$8;Bhcabg)usv>-A)4q(za##8BY4W@p{KMV(H)1iaf>8Zm}g= zGNM=H+A3G9>-rV?^G|i&yziMSCe^swJ3UWSRP94>7hANsfDY$Y&|nqj^3ls%whA$} z58P*`=^4~cV8<5oSz#>3?YXw@bY6?Q_{H#E-&3Tv?!43fb!g?@wWj)pi1NHcZfIwk znec{?@|;_UA&R3l6Rum)8Y)IIz zuPMTrmtR;07*CrPNP&r5?-%}g20u6$b_w>9$9xrik7l4}<}$vKyx|j$!eFTgsrg21 z-5-=JVhT+t=;CE8Ku8>yG^;zClMuiBxj5Bbxm2cAj+1kD-_Nz--J;onZZC2RcfCA zvLW;j8>==oG%eZCXSpHqm4Kh`!|iXgl%4Mqqn8Z7s(s*@sHggw1`!$W^6Dk_rxCfG zc)Hue57;hOONIOChb_VRmVhn{$XJ9~rz}>LM|`)aZd5kUb&XoTtmd5(O%A#iZ~A+_ zBaKNbK{xY?jkBo6lvQoXcCmNGzJ2~imujiGEsg4xY`yJ3i?R0kxEL5m;X}nB5jIdH z9W##~w}KP5jC8o5ySZ7D%^81X zSqA{S{J#I_S{UGG7~cb{G+Ph##>%uH1?P<{$2J|1P|$q(C~W459}dpu-~*n10VL_#8^k-b2W58;S;pVHOH?4|D?a--LyL zuk2wl^VvKHh}*)R1L;K8%Nw4jE;>BRI}X;*s&wzRoN3OH#vU#*n60Fs4_Hv8)Arxhkx%`CrJ z8ooC)yf3$etF^G|a5-Gew)u{dTurX9hrHf$5bP27NOZbC)*@eH>~iel8j&0E?PBsS z;7tSiqM}DJ3;luq^@Emd1WJTK1a()UgyLS}pYkd5$<|-NG{7GrIKtRm1+fhuAOI2i zs`gD&9zo|=yWe&hbWb29e7CfRun*h2RXEF?D{~qa222KYv<^&=(cA zL>SCI`Dp33E*~0z3VfA)>-#Ll2&w2#eXQYjiHz__5E#E)>yJZO*EAzC7s)>nOWq3>0#E|jn`@AVaM@ZB z=VJB?Qwai2*co)K7>A`fZUL2Ots>D1(R>6Km!h=xgM?KK<>0UZBtiDwIBuXl0Ss8! zL6Dy{`z|2~e(mf^J_!B*bqwJM<|+tbKx{wz8EwtYerak=BJ+9H>htu3%Q_IsBaNlFhkTocM8--5_s?#@oK+hl|kF; zH!rN@?;dE=wzGa>M7{=J?+By?Z%sS26RPD`7r|Q6IjuQry@5lG5{<@;uPb5=f55TuSsCd|!-i#XJjhXX`a3EHo;p8!A*|I91Ceb;{;;P0QvA zGUu=rH;(15!{$<_yDezU%^Dh=%jaW6RZp%HvI=VET&MdjJSGXo|{OoI&6*#rd`dL6JlV$K~%4$aj4Qcib%Q~$Zh+9A3bXv8} z2nki)>;i6LH!AM-+dT4v<~pZmEco7(y^f3>yl)yg<)75?NIWW#_I18&p?)1XzzjXH z9iu-AV$^=h3-7MyB9n&74v+Vt*kXh+2IA)%itbqBGKoUvg(nbF?AYW*Vntd08iSC| zG9;=#$3^`nq(CM~F+zeB2ncv|8Z*L*WE2t2mJXQ0Ws>QYFB}z*H{-S)9E-MzPjNi_x2s7dyF-Y+S5Tj5?kpPTKq=hvC zIUL69I=a!4T?WhJB`C^B;EWrjMK$u2np6w3%lld###~cE0q|cqOu!458E|SG@#o_LBzRD1!XE2C6@MJ%RlHz9vY|Au^9M+ECv8ghYJ*?v?@w$tboi|Sj zvJ>6UOaINgm;9?b%y4_lV=#R%@Gu$v=>=e4`5q5RfuV0O_z|{HB;A5l4H3ncJz-Q1 z8^oWu&asg|?G^HFYc0~@#ZgGfTN@7Aj^TMsJJqmp?q}+rduW7Se-iyQCX{h4R*SG# zLoMdwJ3hf6XAC*Qr1La+3#~gO8Q*1uHX@~yTxG;EV%d?%RtvRPQ7+U1IPgP>~81+ffx+%>l2u(1sM{oW#{_JrA5I=G;1T0V#jD^rg zGn!vUBHNJ!gbpZXf>jQOC=~)TCigLr$mR!_QNhN?KwwLQy$XO?5&OJ|XNQu2906wd zu=Rcrlrmr(B=Weh%;^xC(qLyKK7q0PZQ|LV0A@I_yB|DAef%MoWxyN=e263nf*>em z!9=3@$HlXG{u0$EL0AZa$&mZp#qcwb$RhzLaQ@13M()!Z%MUG{4MzeJ08qq2V2gp_ z5&0~~@&`#|`;f>}z|Q*oWeOS1FD9OyM*?C16f?rk`a^Kaf~gSs$VT%kNqk7~_d^08 zI3>XLNPT+$zI;RoEaT&L9DjpEwhIXe3qauuas0uW(8n%@-&8!Cg9M}vFvEkb4}~Zd z20J76p^V{Qk;twi0l@;yC}5SnA+Y7ZDhPZgV))I)v-L?pBmjy`2u?Y$$2k5@5_uZH zAs8%B4$MV78v;O41Q0Jrp?&)f9EBxT_D7-Zfq~TX-)9yih_HzkZI&jk&qb*O!Hk>x z(=hjfVdua{*d&NHixT&PU}VhwDX_OVBar2YZ*ozrK`>Hg{%Op;jM#*z5u0Mf!ZR=) zX8yFyf?n7;JQ3CDqRk@2%!MeN(=Z{-y(-vStP%1)qQwHl+65@*Aeb35e;MXpVeFhQ z5jIJpL$buH*(jPIn0qt-6y{zE?4Bf1n2+aXU_{LQnf}EREdp7bm^&LK*W6znTc0;V z-d}W4h`4_mX2sk;h`E;uMvbcml=ItOLj z%pVzBA1MM9AnGhl%$q}hiydUF2Cqsc7D9#Nelipft*G7U3n?mxoZtB0*m z|5sBFr6}T+TO+e5BhB=S_zI_xlI*#Bx$0!`Q!vxP21g15MAXEg8KPKGTp~b2?qHBM za*1>Xg;$RB^bkscz>y_zC6G~tc!IgyQ@Ey-VhY>VL{CiwNX%xce;@`tiDZNhgHZ@? z&J4=HP&lO+0gFI_uMr^%jj0Y}+54^cE(qKap`HUZB9x&koN|o7{lE)0P?1+1mWrQq z#tk-5lb_$lLC;m!h`+@aGuT29W|-I%{c#g)&?3)z^807c{U>3D={HMYn_n&7#z!@B z=#sq}Ss{GMDygt&jkCgS7i~oM)yKm%?U_Xb?~@1eZ*`<2Nc{QLU&3`O3gfJUH(*ht zmhq_A=&~a?@k*(Dawn4+J)%Jr18(d^a-6ycd+oF(@Ym?10;mUB*y?m6T=7y5z1|e_ z=zDOEkis?76btsoItvBP;MM#;Dfx{ z8nH}Gl!I&LA(3mS&WDh&mo1)R&Yxq6Lv3}sW`$qjK7UpSS9=xhLTjIcb%72i3cXT$ zub{dH2O#BQUL5Ap#>;WGWjSPc)F>F_Jzjb#{NR9zhXF%_@L44QDFB9|AUK72J`kc+3```Je@`MijznGxK;Z*1 zvj2ENPe21(p9X;~3>FZ}|KW_EN#r2`#VD}#z7U~AK8>;bJQCR+B=RBvif{-?0w44k zerSnocM^GP00kcGO$-DaxsPfrKeOfMYmX3}|1|vPo8C{Zgt5Aq zLUekNCbn&{QwRdgLb|E?tm8JmCc!yas?!K(=7CSleVD0)-X_ixO#M>`(B@FzQwal2 z9)y|d^RQ^A5aP@NPnm__Q}uDjK|UtzQcUrMSh;3UUa4CIN0HHML5?W z#Jt162KzpOR(+f`dVgyQF}Bql9QMZMGem3PCoWLnW1$!a9R>E-W zVp+D?A{=ZGqT6BMwY?wRT6KaorW{*&0nXDj;^<-EiG3ep>*sI91uF^Zj_Pt;{WC}l zWl3eB4c&*b&6=p#p^?rP3$WmO?Ie4icq~=59fs>6#t9)qkGV&xPI-BmI zCfYz=d*|=?SGPN!Ygr5I-p`x-=LUWc1vd1k8^~mxIqe|%)2C|iZ%o=-tYAvM!inCD zihhdh^RxggrV+E`&mq*9#^s{TwyE3$Cn?j(I#G83Hvj(+fA>UG+ z3y%f*n8(P8u%zlmqp&1jQ(Tdlr1H9d@bIMO<+ZprGRgIgyBFMp8Mz79a#Ms=cM!y0 zr5aqm!o`G37?i9}GoGTe#u3FT0gpptxV~^?)(v_SL8&H?JAF zLv&rkso6yyan@|aGEIXqK9cVYWZd7hy39c|wobx0MjF?*byeYF;XSo$Q_MY|e`yjk zJkb3y5p2wTw_4Tp;+^>ke>T}3WGtI+H1JPZ>Q&_t z%Bce)JKIgHb+1>j@z_j=tFnXE!F}ZVhK^3+y*E@pW8f3?;sEj}b}sjaY&pD8HPNFF z_}HDl+S(O1cJd*H!*eeDR(^kd z6vLPjqse0a;W=OS>}%uu?)I9$r`W3A_x}3jZxvz>piR&JF#+fN^&eLu{ymyxB`+n_ z$B+D0*f^e7Hm|ucSvof>)twir2NVF_kci8zkjw((_+cfzV$@3H1$y$JtKPmkH1=fH z!q;uMbNw0LIXO53@5ZMV6oJY-8_>rTYusI_t+nQ{p{b4$K7Zp_J#lx|yKnqsNxDelQ-OH<%ODMaI< zz^TrdufizPTM1^5_+)nfz-AxJq^pj04NFHKSa*04XK$db<76K)!C9*BW>i(4QxW_Y zlA*i()v2wPyc$X8iY4=f!;b$EWoF_b{P{qK@2*9?)}wbKb$RIf3pG zdC+Mk2hG}4+S|E?Kfc*tyxFxau>jOyR3G|A$-)Up>?RH28*yH@f)xlk`^|CYl6k;= z(0)<1p|=Qm2N`I4a5KVn;MC-%N&RW z;o;>}R8vF8O&6@`5{^1VDxK`+6o?}cWXWP~08mogg3W`_pDy3{d2Z)+vYE5q9>Bp- zbss{{2I9R>Gbb14eU=*O!aZ{dMC;ubdU_|83S&}_M^9QLx*#{jx6%?@ z@&DcCa;$&YB-}h_USP#1xvtIpT1OI0jArS7y~2z@C19UOhQ`Ljd&lLXZuiXH970)^ z3AirTtg5SwJa8sl;ZWc7FnNT#>>0YXOWX^Wi+JbWu3{A1W;ghrdx>~Gm7T{gmAxa^=`N%%Gds3>OAR6=b6W-9LSmOi#5IUR_OL`jgSO zI$729Wiy#4M_^oG0(PM}_ zA0ArXQHr9(^T1{e?&dc9)b~|G5u3PCIBi6FW(28O4-5a+Rtjh#fe9AYBZuXV$k0^~ zQDz-Z={~CEVkH?DZt2V%U5F~;^u&~I6^Ko-p-O8CyMW2}25$!Oi%EG0$ldqr2IrNp zmAR-)Sr+dMx2y3VTc01VVW+Av8-GD8&D3N4?87xQ{^NY*|KU9UyNoK`0p}}^$&;0` zFh+u%+fb3UC1^RNX9+_0pE*$3mUP89YFYO6#m^23wdQb1?0fX^!l(O0CF~#UK$h@L zN=YJ7(i^7Fw~CrhJL99kXQu*h50eiQrvV_pa^Ju%h+Xhk7~R>IMsAO&wC^AdHgQ9k z5<>14%i27bPBesrru8I9bJ)_rS7&LgG~{sZ<)cY-@^A8j|Nbv{)*4Mo{`j(<|2Uod z-;PH9vyS+Gn{fW172}a34r{;#RP-!GkR77vkgS|UGsDw`maAAzk30WEXG%v0W03cRa)V?LV*MHn5?mNSA3 zoVbtsdzCd1Y$2RGDsXAq;p;E#^G)km{3wS0gFKaZ_qA`c%-r35-J=i##R7$0ae9!A z6t!TF$P(P;#o`7q2pl8p3T(vMV+dY-5lWaTQ^@1YNRx9)Mg<&Fa`=X|QRM}4E%QYU z^rg+hZ3;xWyD+D_+mmV#aRt-S)1;! zAITd#BdBNl=1xP?!!?q5lYr1*M|$%^s`V+r}nY+11hjKl}k3n5zyxiiNsM5w+D**u3NzNwHdOefnJ?Y!&vtq+;3mL2@w8!5-(TU z5DG))kcb|E0srp;80JfQL9=jv{v=f;h^^GQ-fR=8uvzZIP03%>La)i@}j`cunT^~DyvDOwN2+TnXK4>ygb zc$k!j0O8^ln6TBqY6QV*J$i{Z5?2Ogij#=CTA(0k&&y9JgF!+?a)EJZlZ{57%LcMU zIWGC56$jm%E`8P`?Rb{MfwdxZ!ZkD*eNbHYHP$4boJ$wFMi&sm63ZLwv&jZ_9upoQ z%C(;CZhwE8lzmWC?^%4~u5|c_z00I6P_LTiqWqhn!`^>l5c<$HJA6=)+(7qxS?#x1 zcJAENry7RbZ&;P4{=aW20}Y-+e;+83tJsUGgcVshH^Z7HsI^#4I8Jtocg3!to6fEQ zf|^sO@=^gR3Cwh9YY9nA3Ni^pK(sR#WtAB+x<4cEM++p%lN#LoXaXcOG$SU45hNre z*|Awl3ALJkP5>4M!(>U(YV0+_nsiD{-o|ht;D9sZt71okqcD}l;V<-gslTD`ZHZAE zd$9yE=kYLAACQN`51aaVq5RPJl=5Am*BVw`6DYBt$Da@4FIM1Ics#uPGY4OvF**64 ztZckqp#Iu@0z$u1{fEszga4->`G2tcfA26E6I~x6G7$Rm!cu9HjN#6yp|x2&b+3EQ z8WIDZb{lkd4c-yEFBz+P`PI%A-QLFj@;hKw>RYH89ydGw{kq4x8{N++xlfTG;#q$L zm+V5N1e+{)eER4K*?z%Gb&{l)u`FSM33;+;f}7Q;TGmP9v7fu)QG2Jt15>tM(q^7D zf6A0~;Q1mkF>_wa^os$M0_C;A@{Z3KtkjES(mznbbKo3O-FrK^020ZR9p)5vTVd4O zeJ-gb_8bjug+rif5Vfm=s+834px^ZdRiqW~;!O6`_VB`=k>q`SwlRxyeG!oxZ%^b0 zV8egkh zb&{&6*sO@s4a2jQq|LFXDf2B+w$xb3JI%)yN`#V~MMdp;c`2a96kA1ivax47U`gQ5 zut%UxTUWD-PGx3FX(cRjCkCe=m@5|dO)0%|L0*K>dKB-2NH7dNg2OKqdj1ZzKnqnY zi0$3s`6y&45eO8rmUP{m*hNRaB8vR1SE|ss3}lruG8d|njr3jUbkEQMTr%P-6Ux!~*B0E0fSMr%GKpn!y?>z1;s_9T~q1Rs8!c>c5d{Pg$$ zVG}L{#Wew7pe>vs!XQQoi}#D+47o6{#W`5mc4w9tWI_rM2)X!)sotM`U&o!65xWa5 z1T`1sn*)i|Ck##oYbp{esXyu;iU*Hv?^n(fIG`s#7u-vG*rC0!$D$8jFSG7g95BKB|~p*RF80v;8kwl!XgCdR;w4c$)HDBlY z`e$IZj5th@h32?u-cc%=QZfr<|5B?na6iMw>QAj=QeqW>WHzy&CLIRbEoe6ILLyF@%D(q@7zZ{JEeC&2 zUcs9;g<;kVOyb-dMwoE4Ob?(G9FH>7JDiqQBX^8b%MpzQ403Q}#G2l@D{TO+yrg%T zx<4|iQls9g@jmEiz4g|wD{s{)pS!g2IPwC-7z87slm~D{iV~a%e&>0y6=&F(!n|Uy zR`IP?W)(&8Jpb*c#TB*Cx4si4&hKUVpBXj(SF&XA|0mlqpwlD%C)>$X(sn^sM%iGK zPGgm_z=oJj3qqlkA}vAW1E5fmJQ1U>*Y#a}<{%czaAZ_u0+#&!DBJuF=y?OU#0cA9 z;VWC4C4UbIgFh&Wh=@?i|L3(@bTbz_U-Ly|W7>HALfY5$ z#>Zm9?AUn00rUKncimwjv~j;uDsC2(Q2fhiV?I;e_h-wRo0`yJQ~+WG9ASV#KiSCmquLqK~o!hJI-sP)-ZzC$$0z=aI{7eD)7)BDE-Ug{|^q*tLmT;vJTK z_4zX#cahvOQZ2qs6m}Z?!(-Ha)DtT>zNsC_clF0v_+~nJ#Fzu0c6Vn9%+~qg3(fF3 zbnt6hkxf*!PgRbuSoK~H*FO#!L@iI1P#KWZC@}y>?m-sK+uAH;2<)gB>kC`CUI6P? z&Dltq+}o5GK`P3TEMiXefmLIxNqL&aDEJWhj%$pjY*rSH(&=U!GU-Y2jaN2S>aZpN zOQ1*swd-dZkvSpQKw{coo?>jb4v|5x)x~S~&U_JikzAjIP390yCpCE6+{2t*O%erX zFjqHIwr*^4oPN>QH32TRq3XN^tW6I#%uNSSNW4SnFxzhYPKLRHg~<|vn5cth!G#gY zQYgwYhvai-O1f#XCcp}`pzT7w1z$4~0#fTgoi2&7colk>8wT5RRvoF>#cF$**@+Cz z45umkZ8jV3b-%mO0?#3$acj@>e*d_ptSB7W5_47|=r z4K2an`6y=jkQ?CRTtJnOR~&Uju6@&Fe=8Vs*avWu|d zc0fiPzVZukgg3X~9j1gQpVc&VxkuBmP@`FH|1N&*V#_mGsvdXA`Azmu#_Kp4{=-x> z{c-G7AsCeH8154c?b{^-C5s79|7l&z^Lf94)=N+D#9k>pwu=o2#-`BlLV5uZjq`C* zb-V155$Armtnp80aFuQr{70YT*O5gC#!uY5aO|5zG;7|CzEx4^rb;R*4$8w!?cYef zoE5xnD0t9S5rKaizD6(n1~r=PdE-KUM?>;bq)Q4r+tCI5x+YmVSrhkY`xxq6L^H>Q zO{f12OD0a)6t-`S_eYvHXhFbghE0@Jm@*H;6YeiJ>L4t1J@FmzPlEp^Yw~}AO5XfnOuHDi)BX)8=0C6bFeJ6tH6LJXJdBpa%?ayrvTRDXS$Xet74^}Mw|+f2gDgFLJ)sNjUFV( zgTD`fZ>!XLjkd!ED#Te(M~VY+kZ@y}vJ%Lhc8%p&2c<2mJvAk#bQa;v2>_7kb)SDc z;ImyW9*ZebF=nV@NNh2!K@-kJYa(kf5PP68AAul{?*|qr%|1(At?9w-?70?zUj55V z7!y!dbDe4J#0V=PesIAM{9x?@z+FIl$Moiw7Bj2ecPQ)5-_ zS}QC}(B$`NTZL?+uE>B6_#3Drk;B((%EU0kaG=fMcT;A>Zi{1+0f3))`_#!{#WAF@ z+ZdbOKi2R{@d`jErWK&R%}oco3-`sow1KaG(V$j$HNNUi62K`vrERa1vwsl;;f&kq z97bi$!`T9nl_@mT;D@-agx}>WyWAjIPMvG6`ML{Kxo+Go*|wdu=TJ07I~DyWAC|jP z_z{T46L#t4uoYin%e<3h;h5VIaC6^?j9!vG7No8hS>h9wRZKzWSTgTAmANuf#uqMz zrQcxfK?-`24;D6Y5z&g}sstvtA>>;Yk*)9MN{{49gfoCx)fHaSJH6en?6VhF&@pD( z@F0r_b&gH4U?BJ(ky1P=y3hep5>n1&W3rb9UY!O&6F8?m9VpoxrAGrbl=KK3*?grY z!PMuj?%ToeXZ0FLjaG-dW<-D3?v9E3@K&o>?uqzrg~P+htyEhdfIQbixyTUte8II+f zY~_0mKo**ENJc)#){e3719*tr*5`e%P8~VXZ``}s_CJs^&C6N$X?7)Y-pMHLm(fIx zl|DiCemceDY)!A>6E;NlXVaZi?HDhMHEofeDc03&B3aK=Y;e^W=De5D#_0>zb|^eb z9Zi$=W)Z&?<9JCzY2$TH2kMY}>yYya5T%)tct;lJ|B+YFyVnhOEsPGi%4uMg;GP@m zFROP;F&TXa2qKwEcv(w{=TW%&W#I+R9I@#Np?Nl`r@Rc|tYE@8P5~#}FFN!x` z*6fuUzC+Mf!pT%(TTrt>bP)M1*Dsdk6kNKt-`7G=|t!%1(UvthT z)heg{j5$RRXnH(>ih|a4eiMBaxFFbSZ>3_^&fg1F0O=Zk48T+~P{FNjpX*CarE6no^>L4p~Q7Mv5s{Go&OY|3Z`{&D9q$>Lz?%iTG3T zY*v>$hlJxeql*dGYF3Q`F8^L$d$7;C^4! zrzs__B6p@*eLtE`TgwzK~BI#4k?L% zy4-B4O)ODO-$U`O*(c4Mt#w-(!QKxat*smSC}!wxWnM>-tKEUIkZZV9kjnW#&9znbbA@mGZ&_ z0%7xfXP~k*&XlM|ILo!5p83XTE<$Or?Ql@#<$%Yxy&78KI}Xv}y@(cFXswfgiEC#t zBM~4AMeZY2hLpw4Mm?do(K40FmV7IY%hGnw+#gtB-74UYg6N#mvnc-j6NYh$ph$sM zC=iDWv0;y*2&D-I!d~gn`nD_;+WuE-d1ioBD(LrueueSJjCf~}1tr8*fse3jOM+n_ zH^e2yTUiN7sx7(zm3fJ0FI;RK;#X{|{O@D(4U38*&S zGR>He(@QM+(PiY>Pt*N6+@}GF6pkJ{Dsk@kde)L>hJX}HMTDN~;%7>z&9J=U9$yGI zV{4{k_=kro(#A4!xBQ%F@HY+-AkN@;{gsAW+Zx1@s0*v+O}g(cJz|-*WalPw%1lxG zYe=5JaW!cn$W(<|Dm&I-GB{2S=4WJ3Wtpq1?`&doe#zRl2yh%b2DT|Z?O)VYy%7F` zY{p_a+QL-!VWYP5kodu}2&lIP8G7_4?~O}v`Or_&)FVcG6WR9WKT)H0M!HprfWt`* zv*mt&wgNJN{_%aww8h6UvAt9$FaB1m0m~pmH%WwC?-jbPM#c-Ej=Os(QRAfabL_#e zy5N1LX3*BeMtxat_tMPeat9u)cGk48|1q=i%N9PP7u#Nwa%D^erjYLyk7%l*i$?A z?VG3Ktzv;y2JY@eY{N7;?`%7oGS6V#k+*i}zopmRrgBMj6h(Z!mO!UM7Oq;dVPs~H z-MCpyO_+>ol%zhULFWdJMJ|Oa?FN!fBcr_}EZKGp7p)7A^&!#Q33J^O8QN zLU2Mbp}$^|5>{CwR&1|&rh1=%^!DvCaBnT{!S+U%+{tb9ck#1`J9z;1^c+#*T-63( zGko#x?W+ExHxB6(f$BtH73#>G7}5`_ma=Qe3M2_gOI}9V_gTx$Fx|$IrqNb`TLL9J zc4$huB7341$gT%>=*Y-LMWQm`DK(6v&7!2is?ComdBOl=EiR&O*OwbUfl@e%z&&FD zPI&WaHxXpVJQIK`-wZURx;oGZA5DOXQ6yCrmy+5VAGRC1GtRZD4U zMo!ydJb?Z9(~=f)lE`(AK>uz82%n}ui9N*2{M#pqlfKTy3cDK+^CAScgdl?Qk?4Yx z)e<;29k(M9T=iaVMH@g%^*x<{UNK#7XkYUpZ;k0Dz34<;E!Wv|)j=OpUHeaaVKRRo@`bX!;ar z-VSJ>i1$b}iID$AEln+~YM49A2le1});BHwOY;5FC~tZ^m`o~@w8Q~Y79`s=Hp-bz zDKnrTU8eU|I&WIT`6n9fT&=Ae+G13%=F~GwZE*@3&3v7BxYuu@aOJ&R2yPhFXW%0I z!%EJ8EPqnb&AMg6*hvjFeeTO!YT;(U}Bh9Pp7 z=2C85jb7Z^5*YLo8RY#DnYb4(VfYl?b762D+uqMhQKN=t*!ji$k}BdQ=tfs{$KSw! z!Fr)7_vSOd`NO|s9Dlesw)V$ZFHf`pZo%dkf)+vD*H2zvh=u!ogA;?G+4H3mH6;QI z2hu0-xxS+OV9t8kn+X!kd2L1*O1LW#Z?aK8Lu%-}=i89t>iA0BlC&hvvy%N|_j%zZ zOkvdm-^!s$)4e3VUl5%`lS<}ddh$E3=mqX8$zhS+utjxh{gbmwUe=t^ULBQq++0sw_ zFvGIU9@(AzF(28ZC~;JxfWivWWelbB0~FovZZ*Vb)=U$g@NP}-QZhcO9F+Pd!b~^I z5Rwj$FAPdrib&-p>Q`Ro&n)|t+p<_Z)ZeuD@KHx$7EwBX1Yx3kpD2P@oZK_A9n+sEatz`?Hyex#@+M$z)kK()jdY6^{1c?~tDIty8_4L%$NrvDnJhc~G{xA` zm0HV3x6KuJhnqyw4R{A#(5B7@;6TpGgR;FP6d1wXrG`O~iw$efe5pb)(}wRx639Tz2QRfPJz)*R*-Wo(R0N;)qC zcUgYgiqVHltiMuspx#a>D>Q zKbk4)AklKtbo_BzmKun#A1~ofsS-Kwd%XBENo+Q>G+hyV*Sq;V1IHJFN2_FzA78}y zp^_F-IP@#b7kM2wSkfba4NHo$BO72n0{f;{+zM-CZ5$JhG4yd)S&PWKIyuea-r_Lf zhFqlS4Ax>)s6un{Lvu2!Bap%P!UpExq@3u1@mv5bE4r0bU(wKNuf-%bK{-Vth9)wX zUbnPWnp47rntoX|?$Vj0W3)YrQnbP^L8>gIigdbJ{>}P_(m}i2mgGyEpaF@xsXU}H zZ4JG={MFdjGLj7zcFJ?!Du1Lg^(zkZg-#mu23-AY$DsQA?Mg5)(kB?Sbw$5tdvVPy zr1k6B%zbl^BrFxl4md?82&ayM)hO-#a3BE}RMzOQg34+Fm=kD=#%?)*K-~RPbs}xj zEHIKR_b(gbi!7v{zCgsN8@JYntXu}zWd38Hz?d=4SqRhN&G#|Tw`_PDPG2#2qvKhZ z#`ki5Q)kr3m(fh|ZwNScAWGWZ2v5T=y2S!FfgMmU=_Lg89itfOBD%i;vAfWC#uwlY zI%$=}F~)2L4T!x0^SgpZ=7)p8a_LJU;uUVh?aBTLB~ubUb%t^(`7pW856)+Ta<~aiw$Mc9!BZu|&>Z446`Ex?~ycM6C6a zj*=pgODvTJAKmf>L9wYWUbx+l19OhQJ&S7ft_+Eo=C7rV@Q~!qj(@oBe+)-2o6U0= zhhg|`g@!2JxKRyhMH+KZcPmu~tC!zK&ag!eLwg$<+RGj?6gw8W{D1+4;Bl?V_8b4CZm72LzJ$}sM+(R(0vWrN#>}fC7v)56N<-90d#DSSvq)+>o-;OVgU)4w z3l*aZgCDU4@$O=_=+kZ59>aaXVj*{5mSPzzdL>+Wolj!QwDuiL;#thN0!WxbjA8(6 z>UX9a+xOxa()OIo_*UjtsNbVQ*38jre80>orv7l6 z{Z>fL)zoJ*Q46X!VGptDU;hI4sy`!5>Zzf5ox;^QK3<3a5o1G2A=3 z`T)WVM)UhFLa+7nc`HsOvPaF_WwpadKclx0)Heb$%2J|}#FjX59gTf7o2%1XjmtqO##{p;5}KBpi9SrUDs>-lw6D%TWTfFW%)c9gitZ9(IT~I?yCjBKao~ zZ_l;f+V?;YwH_d=$hkQt&U)cmvt6d zw0tzlVC1bM2u2m7R+YTo-9m0_?X|^ip%X){3*-k6wZ_=MT2p7h>j{OF6PbYK62q+G z$G9f=-b0M}wFH;m3jRBP6MakQsCKWu3sivrkxTOLC*~h2No3qF**Q6k!9RU5&JGYV z2u6LVD5|UlP@mx#NXG4I`n{l#kSmb|JkBIVN7NUoc3z--KA|^Zve|6>#3e2|&p8o1 zfg`#B(`An*cf3bWSx+B#PbM(BkaQ4(mRk)th#-ENQ3f1X5IxUPA3cpJ6Fe549>JUn zLP0*uAgwFqY-f>y(ta(-ivA3zE0#3(oPYrs=uC z(8GgO_|Y+MM`bo)-9+I6iI=ss>f`wPQUY&|y!1{2grv@{<|c|UDgH*>?mk|(7l-<1 zdtHj+W*f+y$x*K<%0u&!EKQFnTO9MW9Kmp*6<6*CN%13_V?8-lq(gpCYX_*31HC*E zh8K;NM0ToqY}x~{SU~5IL%O!H3R=&00et!V9-g<@>$rwuO>EGCAr_S9hbNwFO-dg! zx4$m|j1Z5|@Gg{SOa$f2Yg{|khrfCv4fEnP*JYT1p{$p-D=tJM>7da3hUMyh!U8vb@qG>W1C zEuIi9QM@j2;+$Hvl6uWhM*{QDF_jf zxs2ZEX5JJv(UBJ)kHe}l?I<0DF^mOPz8@)s ze=a*{q1b2LYzZ5vCK8~8ATpMiSO@;4M%fU;TCF@mlob*e8EaR(S|MtDnb<&Wkr%iy z#)Mx$w-=+@Ktt=!{?Q~o#@BL ze}I?c&iDddm%gx3@U_1f$W^qv*ld*q8m`ENQmc?m)Zs1ogpld}ItqCF@ZVY+002|} zkw)C3dOA$8{cd{Ov;723{R!ivW1Rc7fYuCC5hWW$s%umyLAaI8~(j-EZgosG6~TC4ed52X82e6 zkL$r^i5CnEj0j9d6s)Iz9OYyGeSQ6%`(xkmgBexG8BA0Z%(uM1R`?^MzunREE5Cex zAITZaSQN~QdEgwToL^w6eLv%Ucf8$kYd$XG9YqujZ>qh0p71E6e|L9Y9}pCb6buav zLRViGJdPU1l0ObOqy+=RSD*h!H{jo-tBRO7aIfzlnE3toKi~QPw^#TFvX4}16uJd}gpDb}fLw!VZNMG5Cx{8qbbkTuz_+H7u(V+8`(~He})* zhd+O57p6<9q^{Kb(fWdrjzUY{oq(x?twz3K+6oi1GMz0cK z*=KvYlKKKVc5f&Q^2+6BbPomLUweGi(G`+^QQjQhzaxbnAb~zz{c~Vz zIZqb`(ihjN>XOq5^9`ht#Z;9MYl`|;m>DX#tz3^64wTd6&Lj!wbg+`xj7ZhDu>QI% z2@@1E4x)HaAd~$@f&zmdpZb(H2%JmXd;#sLSFJ@0l#Fd@e2#jp(Yu(mw0R=8%S*kV zB0F+eF4#fyQDQqc)}fHrR`+dczv{qWg6;@#R8~1r5h$&am__I=uq9MisB%( z8Ix*Orh;9#&8D#YwlO0JVxcPJfT<=Q@1avVDm4S$7wY=K(>7DPSSfEohRzJr_&`gc zo(ARRod?bUuJP4r(X(iNI|JJ&V znk@7Tqbb`I^-MA=AlYL?)QeUF*Qqp=JT#mk^H)K&F>!=2;a|NF74wJ?)YB#4TI>r~ zSIXW-(4K+h`XMrQ8lakrXBgSPEEC}{00Lpa3H<9Hr&lE}o39Fqc=EeF?#7!3}+PkFElt`0g(^HEeq9>Hgzl2 zE)TwF*4@JGp%a}muC3ZsAMUa6I^RDR!2k4|gWZS$-a@#az{@F|jH_vB485O%wG9c3 ziwJ+Dz!cCjftKKmAo$mynF|xp-bjRPs9z*d`gTMdvt0|vSh2_CMu%4Re3k@t6V_e7 zp^#V}{M`nGIAU<_{T(Nw|3?bKzZ>g+h+1@u@9Gmpn&Vsc&cR zYq9{?uA&%o8&UX=GBWNp_(7jJ07h}K{8{u~1@<|ly1(KVf&BQ>VwQ?*AP-au34fqC zx7xW}XXv&?1}z=xFIh;6uRH4MjT?J6Z$~G>xw4Rqrr-#`DMkqDz=oQwGp1sS;)brE zC}WBsxhOa$&*b!XplpyStw&^P#5n8N%Jt_4_{%G{OI162WQL&X_tv+4`9DPfKRiqI6i+Bh&gYPf*y`(xqH}&n5aQ~Ot!#^ZIqnHVq@1X;MT{VG% z6@E~JKv17aP>an90F4RaEq?{!I?6*Xc zIhXmXXlRmVXliJ;1sZ7TD!r4Xa$AJxiaMsc@*!qI$D8_0g>iyiS@+&xG^BI_CWWks*b`d@-WSX#QE)swuML2R^q5WYrjbHh&HIRIDuQC-} z21inKr(y@A3BVr)HD#y|6c1~vQGbX?y8c>g<)|z?itn|a_>V!rzu!L7e+ZXKTQ+M- zD7B=zWRp+6OnOh(%U4J7W-54}S z{tD)ApT5-;2=$3c(;)m&NU10Z#SO>|$$%j?^t8iLz&2*RRy(CriB@WFn-LhLB6Rt+dXlYR?^6$gH^|cxw(?G1 z=*m=eVU4Oku5_pQBO8fqbl!@vw_dV?z7=*N?*jLC5N|$%L86Ok1x=idxyj?JGB)hbu_8rMAk>aTuaiI;Z!efeV6% zWo>(xX8%b6{4ne7;G~t#7F%m*PFV0zr8_Q@eyo9htow}4$rj9JDb4&X-pT3)NHuiY zQ;q!44q+q0!zUbW^&nfWDPiM_Zce@%B7{kCIfF@-5J&03o|Qw{2dXkuKb-8?M*#)8 zkx)~FXQOH2*AeL#X;7+Rg|-yRj`4|TUxJ>|tNRS?y+$f^`<`lt;Z?3 zDf8yyA60>6LGC56baH%(Rm&)>y2QF1wuJ|C75K&W`FAGK0>v#1^qqENek=X`&tdq# z8xgaA8Ig)BDQcaZ%W!Jp)`vD;+S8CSJ*^d(Gb2WNUI^K0LX^oQs?%&j?E-YLT1yk0~Zhg309iqc(*f*3@}>(iAA!S0ViXsZ zr~S1S73zeJgMYD?ySJ#8QA7D*+{`@Iw2U#a$&; zCjafKWOn|3x=SE{T!8`G zA28TI!A!6Q_-S|fN8+gv54yvw$@4A5mU9`{iD#aOxM}g!UZJ>j7IhM#`hpDPMaY%x z{j?6hT6D!Wv@e=v=kAeIHWgl7gtc8Ow+^(mjraKLkm4$Zg&)Ls@$ZEio7%V9|IS5i z{+Hg=`d=5JAa3J3azO~3f>0|-#Ftlk7ZRaa$PaBo$UBadH;4!oZP6GFBPk%ZdT43) z6Gp=C4rY|u5lk?ZTJKoiSh1O$%s5|r8>8~!L4o|Kw#969~K|=p*9EB0xrN~PX0&@~9L}jNP z)B7c(9aEtfuZwZfrP>cM3kl2$7V9*V9Cal#*^xPf<_s|)Y4#@2&%I>*j=&D`AtAwL z`9c`B9wH5Ob%-ozL?5*Or6^G?7Awy|`JPlWTutH7q)bS+?AI@toMY>O7cqtTQY*lV>bDj!1mu?UR(EXp_pz+9ifN z73q{svkD(OMg>M#QE9eXEoy2+`P&#>hXHjMuB!XI=r)VwH%be0gjt{6K_;V-v)xVB z^)sKWFj>F2pXj@*{lOj~B5R~kb6jj9?Drz>v<}z>X!7}y18C}nM2@quJDP5+&V{!` z_&Aj%{qX{<5#H#%Uwl7YegFjvaP?T25(vEgO|pHvV{pLyUf1CNXyyLU_fr1giSg!=j1ZYT%(rLM2#khd=t;7{JU^2qH0T3?G0f?$LmNA!K7q#?Cxmwyp z6N8{I0e3$`D+CbxF>?F4nyFwrtLUFv4fQe_(sQ?Wh+k%Te1lF|kTwR7p$t-2#|4+L z{#4h}u$qZ8zVN==f9n?q<+>%6e_#2T{|GSt_gDR=h~@Opt3IH{Kbv3B5JG?_iBh9L z3sloDSB((F+Qw?3bWMCW7UuPb`-SZGR*%s$aW%aiKBQY7SD&YplL8u5kwtG2%ELNriMosRj)S1 zYOiF}FytkinOY3dmz}*L{hA9w6GPbSG>ILSPYS?*3=n74SMp6CTC5~i;iLt0a{PW;(c{>c z2%Q#37YwH`^&}S98|)o%-N)1Z2PB+0)9Oc-b63+_hbP_U`xBqfUbEmbX-4b8Jg}si zzLM#W-YAlrw(7KAD>VmbNoQ&E5TsXD5c6Y#m>WZG>7GEj(Rp+9>tKt z89uTL@9x#70mZ%4s+O7V$pRc8z7tCmD{=WKCdxv8=7Hw+nlFvF&ROJ?*&Cz7jcD%USv#G1qc60%qf1V{0Y-r= zxl?A$c1ujJ9WXEx?yEX&>nXDqfhMnPwY>fJY#LS(gk`|TTi^cYS<&Z%8t@&3ka>Xz zt6s{mD)_43J)0Q0=YV~OP>tzj7|o4-`-y%MR6YEf&tnpj*Hycuy9QG}&Uc*nqcQ;Dh3l8{1ElTZ? zbI2N;k04xg8rXAu8cwxI%G0jSmu)pD}I;R8)2pi-XkE1FLqD5va;+f!T!0%X?j}RYShN z$A8DxK!d=dv;ZpVCDQwlvc9p!c7PY+2t8P*G&D6BHu^lZBnn|N*v0+J?_H5H=5T#u zXDR=2*6Gf3)$_H}DtHQ`d4*wr_ zpe8_u0QxF?EI0e0?RB^syRsVufe-hX#%c~h@UoIcs0?KDkN7$>#^JDeC`4yUr~Z6o z7bX%Rk}wDn#gFV`4l+w&CImXDpkOlM6IJ@SyT*Phxz_s$Dp8$=@%-XOa(UO|-$0pU z0D4uPR~`5pwfspBn9EJRMkWnyh8`btv4F*)jNTqsv2{t}wFIX`+ zn#0n5<7LUqXa2fM7%`?7(om{Bs3YeZ+8YeX98H08hMuP*Us>M_RfIov%)s~fO+KWv zE8CWi+QxYW~=mFr7en4Wp^gj{&&N8FZAhUSias72PAWILpb(RpEwgr2gDfkx>3iP)7WySv_R0LIELLyV*_nA zVrg3#(eNuhka^v0zTV?n5_(>K3d8`T)KG&*9%Yn%hHOy=xqs?;wbCt=F9NFBpBN}< zvp~ ziMGR^B*SiBv?=DJQXX;ZMU>iupI#E+mF9PKE{~(1?Pyr;hRFjP-ub?Iv9TOZ0OPJ9 zd5!8JeSM&1?kDx)aacvrjWyH5re-GGyKKcm*D(*ML|-(r<64t63}g%C5;a<}2`hhg z1=zHRbRu7`Mzw{FEf0vRg1oyZPj$Vi^jubJiu{oTF8t3 z;wL%^YJJ7QO9^oCy+Rvufwt3QO-~zcd12&UO1I8Y;N8Ezp1tH|zKsU%G-uM=dP+9|ORN!F%?n5csY zzn^x_H>=DVF3%d~=HZ`51+T}3uh-r2BtpUZmMzt%Ug1q-Ffx6!YrLTUFE@{M6l@K{ zyeU3!2*-%aWYg0p?a}^Jm-icRH@%l(2<7*{ z^RdQ!2wfO$uF*-s1dX>AvqEV1@OVl0d?YNvjd1KG23r zn0}+aBM8YaY37UOg#;xy=DnJwOj#xuaqL|gT14f- z_B26M&6I=z77YEi9AN;Px)4SawSx$9lrRRoo4l@GP_I1c))Jt7&Sy?@_VxCYaubX+ zM~})Cm&b(!+g7vgb9nhKAf8qn)`XC*$7WF&siN2QP2CQ1Fb7N-AU`?T-w*9O3^PUr=$U#@Gds-plsvN82$W|fVX)!m8+6a4>xmsX9gCzm@L>e_qPlQ?R zIZ3E0^~eiKoo6XbVvV(j8k(1@uARs_``H{ljvm5tY?=Dx1Pi$(NaD^V)-;saE|5>+ zj|ybnC{T`p)D+D3anqS#CPr0I*A~y^@JSeiy%7blO2F=E`nf_60lGxYqI@p3@28(h zKTZiee2f{K0+tj{(2qYr-$QpfH_b0qm_4zE`I5aq zkLaSUGSXggktSTl5Xgi8EogAj&5XH`9@poVr74#*E!fEQ@xE!P83CGD{;F+M}ogKP}o%mx8&q~0uXba)wxdS{R=mlVK^uAPoV|TkVkxaD{dx>3c z#n+QsxkxI2yFIchGrVt~KqA`Tg~n(m=w#}^=AwuJB=^pE{|(A38^YexeuMH8|FN$A z-%{8A>g$hGF;hi0`R?nFV^6hHg7AwBlMsQGgLMMLPDZmO0%K$CX>=9`!@x$8A|-EJ z-LPI-U+f41U(dq!xW%)!& zDZxbSLj3v4(nTr&G0cXEgacGZIx-e=fP}DWbuI&Gt?vTGUQfgY%1w|IwAayblfpOd zj;+Q#O-E10EE4<7#EQkxw=MLu2V^q==z|!hWV< zl7c3ooQ9@qm(f|{1s9edmr!Jz^VLdQRY^-hgO#_(&?$?>lJb(J{hpVv8;9WKarGXh zqFk6!LM0xwA~&TJW%BHU9;z@rDQ(1zgVq@KYu6V!g}Pl7}J{`zI)yRP)Q9{n7sqYws9j*|u#9 zS0yTK+cqkVO53(=+g_=vv~AnAZQHi<<=*$47dO6l?>YCy_kPTX^=Gb_(PtlH_R(7F zt(&IHY5A|eHvyy?zGNw<*bQW-2sg7rQtBC{*UgN@0`30lzX4O_*T=HeFstk>I0=J1 zDYIe(HPY~$?EX`G-6n^v)IoV&kP_XJc`?Q_KGe9g@8goJ`5bV^dbM)lX6x=b)cgex zx|I>@OJr4N8H&WrwXp^vps4Hf5X;s=sS&7WXsWKPd4aIj6V_C(SpbpiB!6JnG)hFd zYY^VytXcK4e!?&|teNPP595})Bw=O>0&0AW;qrE`1K%$H;h@UPX+)`)ZRE((4nL~W zTnRpqbxLFpTIlbcmlt7iGVJG?KA=yp>6W{GdlRbC(@zs?Ne@h9eDmqi(9U@Z^y!u(%I8Oq`fLRN4#2J zE!j7Eq~KBbDpFOde=j=Wb{IC^Ay%(>_gi<8>cqx@#T0B%ZEN@erG$grw=N&eV?~a1z~hD8r8qC zey=A$okhBrqe-5Nz4IQ<;cppGU@rTQRB z2}!tkd6jS)T&z^iv98{jr=;-nMZ=M-$9*R!@9lq84 zMQaa7s33o?txEHUu?;CtMS8cNZwOfuf)leZj3Lbuub(PoafWStXV$E(-z*T2$M?j< zmO0=-09(x%nN6K^%c*5%K$D!4cdeIyxC`9@E{EQ$oK|)Xv&qzyG!QLW9e@yy4`oIQ z&@wYTgN&$$i9U2_;u$r>T-^zyNe~%#qPO_2R6-0 zJM@z_oK5DOQ{wOenMEDuJ)i_CC6QQyYZ$WPPV@k~lG_oP?kf6h zy?=VH<9%yLLa=9vXO55E2Y`ms+dK`_7-@_;EFYDkp(D)TA)zCMLQL}^pq@s)AiLYB z7f0L*b)hL}Ja`pCjPh0~Y|_v^@X5$5oLnr`IINK9p)myKCeiaj@}qWuyNS;JW`rj7 z6P@`R)gSt^9F_is8xDV6|FaVMpT?{TRtkuE$lPe5D5}VFq7+1<(7&_J#{J0&rR=Md z)2gd&qMNrl>eyPtV|nv+rc_dg(d`S49e8sx<=3@DRrOqqGg}{0YtOx zSmWT6mXKG1wSM3Q9qY5AhIWgYlN4| z)YUHy8aC*gff`IwH{C_djw}TU+9lpbLc}%%=lxS&&`Fr^9NaI7C86E+{Py^WwuH8g zurp?~JIUtx>kcG{=Jgkr3rT_o4AG!qEE8#SE_&GmIqz*HA+!^E!`*7sNXD>2Pnyts26kQj zG}s==8REIFU4&>=`n5y-n=Rbe>P>=Gy={Z`tORpyofvNw;Xlhbnati!0V(fK-W#|UHv5s24 z#kFycm%0h-Gh^Y=zrwozMon(H?EV#Wt$a&_I>@$};@j40-02>PIccMt$TFVdW@wpW z)C z^fAd#(;pFog%F}piZwa|hE`Us`0r&%p?>IH>sX>v2F4Q#LluI@my<`$v1Fe;M{BVq z+3EI>pr_~2K@fvCw(X1na=jDP_)GPtA#@k}12~$bVHoYHxXN&A3>U`AYZk85lWJz3I1k`W`xr}U z^z6lIEVEvA1`Htw!b4B2+c1L~ly=)xD?b{hr<=DOr^N4QG#3+a)dFdYU>3aGU%+BlW71oiBG7^i^Cm zLtcGjQ*E4GPT}?@*8YV-I=$Nku4w2>%=_JqWn@mMtoD+u+e8uLAHq1USJQ8QAIH6` zs#ZR}Vp#t#snmbF2LIW&qHN}frGoO2L81g;9M4%gCM=Xrk%}n~{Q(b8_G1ymJeMuc z-tt6%!N80Sa0@-X$@3Mcj@*Q|^d4O9w6cy4NL&vdU{%&r%9AzK04 z50naaQ&h=P0X>nulkJ>$%!>YCC)2LTF?_m_mMj*sH+n2MzaV?;AZICE9~%iH(J4|dp#Q%9m3dr9EEW-wsWv_o*$ zdqh<7p$}A=t&)3#8b_Keh0v+9)-a7Z7Tg@y%Ah)=Hb*2dHUhPx8xy^Z(u#MUYS|Pq z>S~GSG5W0TeRnv_^R>$pT%~)#`C^VJw{9yb{r*FgV!G=&CaE1i|CewvR=9XF;fs3sgpU`1eF^+$ykJxW&)XFpmUOcRs)48!c}q zNA|o+{|53c&eZA)Rq-=+5D%Tvt*IfIa1ha$X z8mtnICXz0@q%r7LWsNzx)Ar<@N|K9Klb-|MRV#gWeaL2!dp79MXPf{hBdJckcQrGl zmFrG1zF>sR7`*OM(gfd!ObGDxx%XcDCfFRYna*OOn-xuENPXc7uPy7G|C<0!g|^Pnqhga z5vPhrLxOBvvVck5OKw=SoOu|dwV2dcYo1O|T}!@XJfy*1-2EYJzJG%1TJ+s{Q2h`- zN~=q%+Rd_a7sz=`&t!~Kq@U~IhLbU5$<6FI73l27s^Zm{gKDB<$zka+V*LgM(G{jY zN_~E=+Qh0p_QM;X6Ta9iM;J({o7#@UEZM-t7#Ufez)pM)(lGAMVT}5*`@^RfQ~T9i z`}M@Nz51Yj_P!;G2dqy7DHC`jDjycV&v`LB4BBmv_^7Hj9}p#!Xf`chV+-`*e@)rTEo634zJAGEPqcy8)!};^sm|JXf ztf$lB>cV#2x*%1y;U`xlO!vgngD|wR-JvDX#w>g7mCWKt`%wu>f4stFYI*T#=Bn-a zTJUL_#*bx=c$PL-kawr~VWE0C6|K_QKP@M~;V0O_TKAjDm2V=qK=ZAI*H>IOZ3sxk z3$k)G#W`G4m?hvVl+t$WBw}nct;9LCZ5j{G36GGkN}i$}=0-Qf*6D-5A}h38y-{bm zknPtJPkD;65?CskO0E!@r8~F4Oi-Vq^~!b&v3D$PCK>`VbxPNu5GWm?bU_`G^NVdt zo(}j21o<0zF2>uHeN_k~JYxoLUPBppz3d)5gVHp$Ss$n=T62|ET_E?f83FZO&@bsk zR%mv|(741ksCcUC|*I`ywd3 z!a_huO%;x zFMub@24HT%FFfTpzGA|=z;W8<)z${IB$DylNpW^TdvmeFYtt#;i)W|h65}TWBskDK1QXbZ(#vo7I!H89XhE1j zT}1wUYX$pFGiE~>q#b1=^&-_Ggt245uQYh2k3To6S*Pof>=vXkq8Ot1Qt&jzGU-?a zQffgX(Wxa5ajTRmsy#QRjzRk#i{?nw?9D_Td+;hTmcdTEE!{=W)I;hC(TMGIlQC{RM{uZ6sTI^{Fbt+v0czOa zhN@DA!AqFG0>zUDb&t1iy=v;YNl7cIq(H0B2*1hD`zrl^BR{w9SFWF0+hz)0`LG}eZnRll`B zxqy<0THZ8uSH~Cj8;oUT0jB=s+SOc1`refb*GkL1Zb7}gez)Bw*)rC5IQen&v-9!u z;%3w1^D|5Z&kgxkIXEP>JR&y&_iW~T?Vnu=sYpkL_2tgbEX-LFaKB}+cp`D)V$%f$Kmfz!wmCC<`b0}0U0B6P;)4T%ylv$8lA~3s8oYU2P!Dw zl8Bpla@5JdK}~?(NT|5fHPwa}IX? zUAgoprWx_G--s%laXj%(k)-^E8Dge(h}X=0F%UG_Hl+34C+k2YFb9eQkc#ed{*)L- zfeR4fg+JdT9-yGD=TY&5# zN81O&@2OegZq+KJb=_=V0?IbVwL2EVlbh6pK~b+e+%dwd1B;~?6ZA0@D$!Jxx&}{% zC9um#>8#8OT2haS12sSZuxpGcD|tghO8|}bCI3}J>Mnkk{77l7*y)K7g+OwpX~C?6 z55XFdanYrVepuL2DlhVmfq>Ox%Xmlid3TV7wco5Ph{@AITF?z1noQM!#BF{xc0xF^Bmj9(v3tPFs=doqrX zOpb{_W^)I|>{C>>Y}LoJaQhixd+oln291bsx?DYQl2hp$6G&%Xu};a8bDGGlS}yWi=3La)z01xT<-?bDZ(DRKTrT#}`S zE0CL56}=_9rl8~TlX3Xnkjj@+P_6&Mw9m3OKz5CB5uCYS&S{v|hmn!7e=N;f#+z)> zHXg$>cm{?Y6~13I{*>0kOx2;VUpmCvVw)Oso-YIuK)p$^JL;Nb*TJ8tX1f-YCK+Sq zDDPZ|d$YsUA?`Gv9BKjB$doJJMK3JXv!8nEfdv^PE!Wqc_FNyQsp?o1pBzogP)XwG zpCdYZ)TVuB^h`g04~E7ABljOHvUXP2BY0rFrZM(OZ70gQtZ_lm%!guQBcM*mxU9W{ zOXBD?x)N}i_;A>9?;-7jpnYp#84V_LTb&fWrN!WFRQ%{c07-RDn$B?kmB8Mo9%AYk zy6ib~;C18SA3o|jP_w6&;xzme3;JOqvewJGM}hi81%dthy6xvH=RN(&Z*fM8V2_>B z+6;?$IzU2R49Oq%-Ic~>(cxE_w!TU~pW!Dk?Y)JEng~vsHv`s%2EtO~`t0fH;nBe# z$MwQ;&4RUrW7*9@_4gn|1-#DVnVs&Jp6 z!m>4ojLO=5CkU>gklKQ#Llf;NMb-VehRCV&$Sn~+vk?SE?a%4W!!%{~g7qwk?GJGE zJFU@SvQzXdVS_@Z(bbVU{853+dzXaAV4+gHz8vUPa+Aoj^g%em%}v}2{Vsm{vBqoi zMTi1lLp_k{c+WboC`uZ%o5E@FooI`0n~n$B#yuEe;J@atK@r5#Uo}_}Eg_XdAZ)DC z?WO}aTdej>`>n--)Faj}`GTNCg+!eN!d&cX=1t?Y1pZK9t(Mu*0$p0Ao&`K%nA8#> zlN(p!JJY;l9ycy`d6+F7Nq#*-Yw#II8`fo}{7)%fUj>%dsI&uvB5G@RIjG0o2sO*C zji{f~DW$fpn3O*_f7sJa!=f3DA+8zduZ1wN1ZS2Rq2Mapfj(w7)_Yb|1^P{LBI*pS zRs*WoeNbxx@pPE!w*~_WF9Z5c!m)nXS1wg>2Zo5nJSr|7a#?^JKB^9((eCE#=f%(U z-q8f;QJEFMl;uSMV>n|xVP5Wp`5^#DJ4Z|7v0kM!%wA%+_Jozw`Os@@u{azU^FRRe znrog6M$2qQLym@JK3yvS%OulFz`WIX45@b-SHkUO)Dv8e4eEvBFZVh0!=N5j;xdvX zti%`tRvbRo_4qzkqBq$}#NVH2W>ErAFI@~=`)ZmO&iI(-WbB;Yx*rl8Kc>5MTC|XF z2T5~ZuhZI1@Ld*IP7HYnzjLmN(`0ozaq?+!#ScNPOWR}>SchBYz*ps-@^6EYe`le= zgw_$lSbn;sf1l`9Xfwlq)O@l-u6L*iJ~r9nt#ckRcveSvRySi7JkEkS z9k+;*w_S5yv1@M#Ne5WL=^)mo9_>~##nUkLY0mEYj>1E=gsk)it1|!gNcQDY4RPe^fC zw=NiYX6M(15Fjv7{y}+0EiCe2s6~YCcXbrf3M5&ElG`b%Xc=Z*Kx0Y=0i;+Md!~(h z7ZI<9aaNr57~u)foTJ%Y_wC`A7n2ws{5<84?g%)%v|4~q`n+~LlEvK4G0$mAaN%<3r(ZVW|hP`3~PD4 z=t(&P68Eo3tZVV&9^gB;2bsyAsmbqe?w{Xm0kGQ^st|n~tq|ydU9;jb3S1H0@=mAn6g2?%GbVsS;A8N4+H*BoG+4F8ki3{DD$?_Pz_&9BE#iw|UbW|Gs9;n(Y4-ri8dNn&LEHI-pT*PVFGHmaIe$WCy40;2pQoEE< z6B5THD_X?ZbgCx{r^zK)V$42A!BdA?<(X({NABnSioqxm*6B@bi+%n34t_vj>_6Cu zp~ZDH`0dE_S8KN6ExRDx#k0kidR003quv#ZHI&nfQc2;UD|u}1VDq{Ze|}AC1IHNn z+lAnP;g9+5S7dnppTzE;N_I)kFD4r~EwM68?hZW1e}!5#T#6E^TK0_fix|=aUXBcE ztU;va@(n>`?FMG+AHy;}Xy=_o^Zgkd$Udo1a4KxpZyk?(Hn%ZIO3^2D*}RurWD*8P z7y;?MU$)0+5JLN)hg9Ihb+wI1PT-oVdEhQlg*NICi0cmz%kPh*Qj9OiNg;%js7aAc z?`JfFYP_BRBQg-l3D;B#_VTEsr_07{-W?FV_4hopQxEFG;;#toeO>?ka{ZrX&p&(?SsRa2If=O3VLE7IE)NfQ!2-I)ic*WO3@pNmMIGH%lPTyUD zl5!-_hYjg&%IKRB5*4YcDV|%FaFo*M@)N+~VGPg&P4V{C0I_pm)h{cwmOWe1KximH z{U93J^2P|+91@N(lWLeU4c|TIyx72j=C<6brij_X9V@~4^6E!W$;=`ck7^IEZr9|6 zeIh2^8r)8+Wg@&?MTqKbOtt)MN)$>WP)lsLz5eE|I*FxwX2`1d=4c*X=xoIgwku?f|bTtWoPto z@Tb~3eZ%KZ{KcL3MjT@&0jo%KB|lkN(cCHS5*7|Cak*YM9|3lwm?iyDZ7=6Tzj)sHMFC zWMHbLXR%3pFDic$Y!tBvn)~xRe)b=~zj0dJw66jrp{Y4PcsVr8vAkak>%Qgaws(L2^)H&f zKir^ab>`S)4DoEv&y%Q#pG$lp!}o1!59cvN*#X(?I`#>c7Da95ZU|{cp?F{v+gt*s zW`Jy+ab#0Y6k-J>n(ZW;(jhxJ9YquV6suGpz@{N;_k(VEYc>|1(U_vBXg zTcv)-8)M3A&2FQ+p{77>c}05~uYM}_7fWkz>rIq*=yMSUC~1*+244_?T}(RVG4L2@ zfYD2icaIbMPnBrJdzC``SVx#`fbT3u&iyH3#UB$ufx+{rA15PZu$=(u?&cbA#MV=Q z<@R@o#$jr6=vKUiD<20w`n=v)45;m@}WIn&b%1O6-?_$Pqm zh3C+eJSqH1*KH{j?PMxsL14(FZi-=X*vsjR4(oF?RIVZRpyRC2g2Asj<9bT#NGpRr(SgR_kkKyvy!Z)oEhSAVLNCLu^s7tH)sa)R zd#I$fD+T09ddrdNnco}v#-^R24X8uS(D{(X35U+At#f&WtL0t;8^#3!P0To`_CR`M z;Gc(V{`yK+(5=igd}%bk|I6N}|LH#aPY)^u358i*WNsa(yg>3ga2|5Njkp3mCC?NP zAYQ~QNC*M1b;%pXFGV+o@u=xerOB}u)ufJ%aTo4tu*r#RgDz{IM8G)am3xx=@L&zE zv(pRA7MML)yO;8$L*v?0#^-cNGZSssbAKO^?kO5(mA-jZA*KsmJt0C#fDWsncoKB= zYcZ^oefupt*(H952|eEYt#C)fhZ~k?Lc_W3I)89XEChZi0j(7Z`{02#qm^JCJF~UI4E)?*>GBSP!xAJ>>mMpS z`kU&b^wr8+R2}_<0BCdqK_3CBXVQ3T%DHGxpj*)xVxBia{Xy%LZ+ zM{(1B;n3&7T8=n=6N{c+89XvYuo;20KZb8ewacGu&^aD}3ejL#Cv{Ysw6==-pg>io zXm%OhMU!?@USbZHUL?J(A1WDM&{v}LQQwG^gn1F6rCyoIFpy(kfsEFiU~;l>i>-7z zwup0rUg^Oj^B%j=%gq0D28>h1;URJ(R0&g zf!yRTwtY~WL>OhhBfEHqtNALkNsh64VBKQriu*VvG<;I@{53#MguG#f8U#ZR&=)+w zfLX5qEf-fW#cVN57wYZr>MWg^or<_})WG%{bpbhMqJHLyl4w6%dGzjkOmk;azembU z!y?;XuUP|F&DB7kFu#_{>oG{bjy9c-Nmp8{Bz(W~N-DScT;o4t&rcgN$5JZ?m?da! zexTT5by1@jfamf_5}^rZ6Z?-@2p!tQ-2rDd9ih*K$=TSH*sm50l!|R*%PE5qv)?xcEcT z*3p}((CzYtjv!2Ll`=!QwDEuDKWe)zp~iDUTv~M4m|Tpdu{%s8f4(urn(%twf%pdL7j{V! zt)Yt!tRfBz>iSS)LR#)!wtR`W1z?6TiOiWpb|3@0n$ibwiQpM>#{DGrv;4XI`g4LEcjrA8J-XQ*MqFJk)ML$%FsZT>wZJI@(JI0uBHT8k&*W4}F zKM_|bD}yJO(RY`HU==aA=U%5aZI~5v+Rl~G$&3v{MkSh9X!vCc%ODVh!vuO3UoC7u z(cnpRUR_AMs!3GE-8CAG*G79@7*b%VmCYwq3`KHfPEOzX24rCGIQ0MmLh8{_vDBiE zevdhz=LdKOv5R;FA+hhR?mDq0uFErw?F#%(ZSwub^E-`(VmByIg(%yfJ!OBTc*}96 zf-fJDQdQ`iAsp#4=s^ne>L(tI7=s%BP_KM%f~(S2+)-&|Am zm+^Q`_AcZC1UYAfAkBGYFierH0r!b1Z|NjSFv8qNw+nbE54&%x0tThxLk^0&Cj z-5-ZhKoIlu%yHK?x*n<30zybVaTG+)19vqNLV=CO&a_)cBHLPw*!DSX?+lP`4&-J( zh*^8y36>+-!Vy6ZU4x_GIPQ(_w1sD8Mwb@}oBdR9QQj=~&n zU~_9Ur5{U-8skA>gh7QCi~3Sar%7;`{Ki0$Vv)mk^3?1%^yD}8Ng!|{_>lzAaJy3g z0%aF~I{eV!rnk&F zX{tMt*=Vd(buz<2*1--woZJ`lg@sV!_B4V{aOd(tc1U!{uk<~ZhYm&z{2=P#onGMH^I;rL7He@9o>#>12@b7kI&uX}Us3L#28B&;#9c*#>Kp z?{!QY*L_0xo)p?23SaP=M10Ys;E85tId=tZ;7OB_UphexGkJZi8l7p|GY39)6%o;) z=6TZTi{>^VgG2v$Ga|FzIU3_}2UlYo66}*w z?qhcy7py3^^s&?JXKn^A7hDmDQBI=?y@Bj+mh_&fOqO?TBsFIGfa=F?X@R-I!Fx%$x;pk2 zjWbOOXl_eL^wO+^=){P0V=si#0q*x~RQf_s9Hs5DIJBk8yD*RCJX~l99 zAo?RyR7%lIKVJ2`N7W9(rXx^O!sRDPpi4O&MwPPip;m{Sp8Q$mOoyE;zYrMYe^XT7WsKk84=^ORT|8KEknJl zDmUb&+}P2FCSO)DV4DQt4Sfu^^m^V_uk|Ox$Vxa)FAC2TUT7USYqTb`#8hXn_JnndHjGw< zrhqc>%$wAhzWdLOCYtGIbXO* z|1$KRv%#pk_5LA*wo#VPUdSpMIsv0Z?pX(lz&MjUxtn~LPx3<&_2 zZvM8lk9b3GeVSyVB!A5|{-s?@zvQzhNqXY-ZLlBuWZrazI`gq9>6DY&KmAxdoCESD zd0)#Pt#BXfAs^cSf>tgCWfybASK-d1LtmY<;(Gt=z4w99<4-$|wT@Y0R*-bP|= zKdS~Iq*G>^yfGQXIxD=LNOeGdn}Q?-8BF@dS#H)dn`VB;uImlB*^%TX&FF9?6B>#+p zHIr`kW&{$zyaQ={5F^AV$HzG&XdGT9R}kKGq5G3mXXsgjChRMLT~GQK268o#OtAOKQD&3@Jpqq9!t2A+bS}=`wk@t@V!(}PkrY&0KW4jj*XZX>uDb+g zmIP|rOk_{MoXE~Sid9_XZ#>HP3OzHs-wj;1)p*v$o;RPn3DwhqY}=nHbFogv!+}`T zLbQL9*+o7ksTy>`UC8Ss7Qwp1Ijq{@F_?0_ zyj#qvTTtiCZVKP0$unAOQBag~O26{oAH+4;`!6LR!VFH6!+A_Q=J|L#EPxIfYy0-W zTBrsVQT?Ma1|+QDuQ z{q5T!#=n9I5&w&W%>SKZ5!QeC5C7ZI%}Q?cFQY^5SmnaV>hkjP`*+PeCFqv&CJIRY z{-CU>^`r%C85sYNGKG|zkIG-kw8&6Y?~{4lO3AyGHouuMOF98qI4V{9T6;4 zGeN{V1`<6)v7rl?;Scmc1fH;~xBwrUM?nkFq`zc4T!6`kW#^R{^)d9yCi4$;V@IKmjyt9oHc+b4H0Uv}Ekfx;TxOd8oTb)&=846ZVBQb+SzhoO zWIqG?$%vzAee>}ogWxen-m==>{Kp58b>Z1VxkA`2$v{9@W?(x0hJMGckgLSLV9V!! z30?koZ{!~gij(}P{9pdytPqaqB7XQ!zd(NK8s|91D^=(>i&f)`4HF*uYjK(lLS&Ok zvm(DxeE4c;q0=^z^lfmZ}n4{&YV~e4&+)91Hx!euh`Q zp${JoL^1lImXbJED1G7JdJ^*oMU^15?*cn=-J<7Yv+q2S^7K??a7C~M1^cN9V1Zk) z#bF^?s|ssnZdlm)xEHO(y0mFF0;yr`uG-rYB7YIdHl4ihqGXrKTJ79E*Z0Zi;yG8H zoZEN5 zKfnpS|J}*1@*g9aGr8PjS6fADga1SxXC$#m%{pr>IvHs!mQN)c9*vABi6=SOwWFn;HAVM5MSsvLOMVD!>BS)IUFx0Ds zmut^1%{4L3tW3erzWl5&uFrRqs>M{B#k4S;!oDB*Uw$&8v~u!;W(C_$*AECI zURu@G&$pZjWfp{T1!fgeJN%i^Qk7cwxG5s-Y5|!QNd`2+lw6iR+$a%hDfga1$z_Xw zClyl}Li@YfuUR#5-C`Ga$pW*AAQ@qplOgBNexRQw@yF5y4jkp?C-_1(8^nhP+;TMK zg9>60Fp$OuupX<#wi|W3>uGaLi{hpQZImYFoFchG1C(W?Q8mK^dXZh0D@I|gK;JL# z6d5hYw>tdmO%tbs!$DFCja}h7ZALNntJ7xkd3oTakF|<58I@~h?|}{zFS1QkNSz`v zv#U@WrwI&zSul(1_ajWD=*5@HbZJZ2)X}JH^>90#ps3kRRwP`#7$6VqU21qqs!Aj! zTP-H!1*wIr!3n5|Ld$_F**Pl%S;5ETW{(BAO6<`A&WVXk({`k2$;-jGWE`EKfsK%C6#o5e5SnZb7m2hKvIu|dKy%_Ych#G-LEMk*F!ptnf#NffC#`WM zPZuGnsg>56CB`jhD<;f_$w@|}L4lV@a`EiURa$Yflu1pTe&(8Z?7mcBlmzDe_!GDN zy?-NlT&U&%b#3FK23IE%+CgD3om&j1ps7>tHo>_xEUlqFbK)ACKo>#Y1?FLB31%gQ ziH~YkO|yHoDokb5nl8y_S8OuBu|CiCfucy{SAn7r+RwUC_m;PE*fZYRY$4OJKH|2- z97H75QyPuF%9}Rpu2-WrI9BOK`1mWn8u;wkw7RKeQKNc&9EB{Ko^eK=K)6|Sa-=kj zkkPy3L8)v^>x!%BnY~m#*&eI7vREgpgw`&|%jFYSPjt#BHXedq12)||9CMOzaV+m- z+6M~16LKMiMM6-5WJjag&o*6-% zT>`&bb`o7l7j#9t<*9cS*{Q#D7D7ELW`P5Bfdv)=+Q(%VUFnQbTNZaX=XkbTv?J&4 z?z3RCuxmv0qoEeTT)HrjQMD&TLkeoh0#ms#1>wC82F<-0dPbfp(pVL}UjrvMMaGNc zYJL{V>{SI;&boONk~1C*ieWtNBIh5>4WQCre%pjs^{f~Ye?rw_lQ*L&-dfdkgwuDl zS5GJ>Q>VWFJ(0F%x5KF^u$j-YY_f4*qt2WdcDnc@M_m|Bv!g^$imbiwwK>GXg2Yos zw|j0_{5%Q0P7uTK&2%A zaDimoBul?Epy;Q@kiVa6FAv60h7tEFcPG-R@MJ zjyG1*;&p_|=ZDXqYZERBOjG#curmM79kZy#P17BDx1s=bnG#9$m^0oh8R=u6>4jX) z5-mvWEy|K^pNLc0WIQNij!xoSAiCS3P?N})QE6>fDJaV%*}`DiS=Ra_?e5Q|8+5gU z(b|TPIYX2eq28Z#)SijC`pK~cTM7sAbf?2ba#9G+7sQL{)X>32#(#q;Ts=E)O*;!er^h~~yDFUiV&pl_+Z z8`PeitiP=%e$1p#{c1tL6mD->2wJ`9&S{Mx>E@-7 zY@p=lGp*$IBN3_z@+cAGiS9_EUc~K%Ts*zG!u#oFDwxVOUWM6!iZnSg1+E16{S>A9b7Pr7(KW0MSjZ5kg&gwy2kNU377b8Ytc0i2s<+xG#5ZjOQ% zX+FY4BYBs0KPs_x%N0x?rkh7ZP1CGI|Nf<4lko=-Y4g9$4wyG`{A zKG;;|r#Eb_*ohID%TiB7ELE(r!h`F-sBil6x*UelV=z9VqyQ7YAIuL*ErnMK> zD-7=J_0fs85!N=1Zn&QQ@{;t(-sUz1Nhti`kY5oAU!y zZG!zWKjhfn%BuX$M0y%f!*;M!{0xe&`oM85YCX=#t`rsyt7?)~?ZCA%ARFiA4(`}Q zrqAp$EdP|##9xRvdV*7NNxK*+r0&QGGfWyhlDl#7L~O2y^Qup^cFIGeNM9x%xzU}H zvcjyp7);Y=oZc(CetFKme@l2aYn^;da2OkjvdWk?(oqc*N|ge^p@}Dvycj_p=2cHJ zqQ4oGgPc70H^cS3AAnXTa?RS+Ayl%71Q*tQ>P{2FyNfVXcsiu`!Nr=Pe>OuIV0pSK$^yA zMqD7WZ1z8j;LBlZK>S~%y#;U`NwTPIF*CEpY_TksEM{i3n3>sPW@fUOnVFfH!IH(y z^q<)`d*9kKvp4>Dt>`!>6equ~%F2SS%F4>HWuNZ-nKNT)!2E!j5*2gEy`)>lbj3kD z%Eai2h!vL6VLece{>23`2+m7*-`Ij>G36ZzkMMBo4MMwBU3s)W31D14-o+-Q|5v;ZGTp_$bq`R7QITv$F2gc#63H zxPC`AQU2b&d__7g@KN;(+@+g9p+3Jc+~HnDdr?t!s;;Wy-2$|{uDOnjf4>fcmK+)Q;6s(e zB77J-7lpwl!*;IR)=9F#0oEbW05s}5?u~Tb{rexw(dMlkrRjhm9SDHK5&n6I`|rs5 z|GED5=j#pWJcJ9X5@x`5D`?y|AjTl)RWr3D$HvAA)rmz9UNE@{K= z)MQ_AS{kaNvcxIJ4)^aKdxf2(PZw>4Jf}|wvc!B7rUp}^#~$JPjM@LG@GCy9p%w6) zZ-*>ij|Hs{94rLCKp?^Ni}4)#5yL$y&DUh9RS<7_3oy^GRQ9|xPt)3k{d`=^ftsu| zflRO(0!)F=rU^OJs0_~jtig8x_u!jv`(y3kLAu=bXdj^yvH@Xjj@2Lhb=6jo+4^kA zPOa5BEI*y-v3)2IV6eY7#mmM+ zQt@*NS;)M@qK&*G^?)f&3Cs5cF~%~Q(ay~$Ybw>Wz)~4Gm9eq?!ii~@-->Er)U1dT zZ`9vJa#xes$J0jeY2z)an#+QG^YHwK-e=dGsp<#O@R2~`d`Cw%y9DH(7}W$AksU=I z+z^!j8xjWP5TkT1rcBEaLz3Dus#KNI*p%!MBX%W*(b5vNFY{x9q$!ytY4UKjxn`*e z4iRcD}Wd+A$BwE(WDzvqMW@#*rey$N#%yF-e=1PNY(vIWDN|R;zPezt3 z^wzQh*TO7}$3@j@DxXts6icGAenGNG)n!R-_#> zGBahpugnQhPobS(vB+mNGOuS@Ey`G4$g(cHGjeyN=X_9^k;5C8J~D7pHoi7mwbFfXw_zHtP2_m-)x>@?=RWqdAeWasl7^Eonym*=&w zdP);u?t*?KG+um1=pdX~v6K0u_ zyzev(6i!LOwlsQlwrjIusAU;Q-}1JK97t`(HkLNXA>Ds0HH^(Q>X;b^HcXCtEmwHq zq@VY83K(Gydm(3(QZuUdemlgrp18R0R9fDbl%h9&bk=XM8(WPx-#FXcW>3Y8bg`wpdhOO;$JrtIUFB0bx==5}s`4sll$q?uvXs}2ouZ)TgMop#VGHbNYA zpsv7sATU0p~0Et9&-QDe48p^ zv9*4)Hn3G{u~Xquiu=?j9td+B0j ze9@1;$lZt1eZXBT)c1*&%&AtAyHVsG*}dL>sW89KiO9;xMQ_oh=uw zZ+fehH$S0|p`0kw$kX+#Nf~9*1n#nI0eSL}XXkP20z*|N(>(@kt2wDI(j_Het69bO z;KJm6=z-it?;Tv?i1(EA6U6y6+9|R4!}=}% zgm$6l8DH7EF+~cmfZ-!kyhU8l9ozfnzq$a9bXc4Yfcr(te~s1jcQcoI|G$F2{M|f> z-oNKb%2i-oaFx*BteseEmp@syNXaJ_#3wEqeLggU0h$eBrVOYv?INpdsNOPQ5^MOw zZ{s`j166(pA{yeHFm0%wAWQ@4av!)a0!^sz&UNo+fCtot&qLrXFH@^jj}@g?)+3|6 z^M0oN8T*J}vqKxorf~BLWr{-+MOkyS7g_~*OJ%CWpK9G9j%}%y%UaO(xG_M~=uvek=m#=c zk4A<$5%bg*r(Xj2!eV}klOF0br&NvkqnXCqCN0T{X`@%(wt>4?DqNI>59o&^*QbK} zvZQIj+UKpM{#c-D4D+zbtAiy~&CX^aZIuj|Noa^fD9jy!feSMklZ6D2D$kS@!G=KA zvb7fq)8(99Op+9Y{bDXOZq&nu)*H~8Yt)G*LFSNtCVo)E}lhTnpS_O+R zp`5JoRZ}E_UoFa%osA+LjRv%^;35G*cg_uoKZ9Rsqa+*E^x%{cIAZ}xZc6_U=J|4|+VKb|3OvxmEMG@T*#mC+@dynVNp8PE`js z7hpvAC8iin_1heo+~h!+x100@@ZTK9Fk_q6zTx6wFg$7*%^CUNpO{!Q)TdT&goRc6 zs1Ga37>J}cYi~MKATF63W#t#aOKx3R1g((zd?(;vC(&7POp9+__O!RUC{mNSl+J*;c06 zU)}!`bubtDIxKlozzEu4oj;`*Sl3lBxlDUtgRo z!th|>I%w+?_G{Bf7>T^A(-MBASbq2yy9}+Icz@O%Q}XgTU0hDvdJK@S3RgFUdc%ri z*f(3);?bhCVmUU`xE1%?-EE#5P#kqqrZ z`cESe-bRW%ZCzWr-4TM`!FJ3Za#U$gLp8icN|%%ze_gom-_>Z2D2zI2>Avh{^_&_$ zknoh-NMC^Vu;BG)>x6TD2NeFEWK1n3R#a_I6H|0fmOg((MFoqkd5c~z7CDR{qE=tPlx=HjmfjQ zHrL0X56;eO(IY$~_%SDq?*0gyHg4UYo4d%=9NU>6t+!Wmuj#>_@y=W?@W5OyD1ZvB zyyCbzF}EtMqTYGDKEk|D!5zpHLRdyZSja_flkarP7=Fec4Kv~Q92HeNq-8M06MDwE zd`H8_XeYmNBR#=VaFt5o-v6`^ZrIyLr@H`1P&glx*PapX#PQHQ!2{LWugA)_tTDH*>~TA_6Mf75rq?M{Iz{> zbM1y*_Vx35TshYxily;}VbhB?6xLoQ^$4C?7SnQxtF6zceGhasq=v%dOVUh2NlB=u zJmyRIPIlKL^*!%fLWjz9)o3#b`58B+UyJP%)mxmhE3GeP6zz=5MkQTEF=;q_zGyK# zs{5Wj#t)zb+EF(4^z>v-Ely4b_>=nl4Ao3eAoeOPSKlvkL!0n&3{Q%Sy>d+u$>@s$ zw?av?qi1^-RHzcwNZs$TWsOLYEoLuCZw*WxMd8ab#WHtAJ;16QqTDRpFNTK7j`dvW zp2^#160NrELq3Gt&z1rEZoz+qdRQT`q@`5fGxMIG2dySLdOJtA?HqIyrm%M{C@wqU zd^aQm>Ap7{^~h=P&J%(mYQ#&QaHg>7OvD4V-*c+Tc-82vefJ^Db_1s5()l|9{)?LY;T5aNSV_|Q#*7XzNlKS3LY*DyKweP-k=4&+rX7=f)e8l&>eDH=P@ z$~tLIutj7}*`7$UZ`i z^`PA?4VQ}ykW@4d;#^9&d-xJ;;3gDMofy;Ka(SXS4G;d1%$3zwD1XnuYE#)7-}1Z9 zvCS*p0EF8mr9!JuIQyo2II*?g&~D{>>A>a}6*v;I@rLAKgxib5FT%jd+)QBTm}9$E zpPzW|2XV5;F~?z1>FOK_;=WaLSU+1oQtzhQE_@0Nzn#ZM$&8iR250C|G6#=1Q{GqG zjh9+R=Qw|y;AVJunk*tneQSti&~P$;IL^dg4W}!vbddj&bK#Ir#S04z{hozJz0}in@0`$4osLcTi>ZE^*10U<@fSONo8md;h|Hrrrz~ zVJfP!aUtLp!RSI3Jj(xd^VXZrkDz`|X=@Pc<%EltW|DU^h%Z6eM`tbez~B)q_UZ^k zNqw1Cpa>qumEyBMPWs_2t}vH&zAL+TizLhrZgQv&LU%f$lVJFJpzr9=b0MCF_t;hd zVOc7nvwekG)vD{pE*lGIRD&6txzx1<+bV4(EVw7N0*BtL=(hEPd!(>}p;Qe)dg7z^ z#jRfMUiK}$?WZ{QV%XTCdg(Ue+B=v_eE)MBY$BT>&KdasCC8ug(Oko-eKN{{+%-16+IWj*N zagVgR9_@vzSJAn9-*%h`Qe+1V&h>0tY-EXGh6ZWTfAiMo?x~h7ouCv_k0aRa;SbA zx#$MLRC#7oaq4nKzWh~#IICr&V_!MUaZdU%?*{85#2k9AAD;PGNPj zd9idDx8~EfhZ__OFWYC{UvZtgZ=71czdfLQvwXkArtafTxC1@b~i>hShknJ(ipofY_6iCoq*DiMMddDxsvE=1XsY z&G0yoRD!u3Dw*E-5GoXSTZ^BUTJYVld|dQEI6i#YmMbSbwImZsZbFtR?3e|PB`$JL zk+v9Ji(|K7vFa@FHf9oxN2G2 zEpj!n%a@i@J`6{@Y(J73>*!_rhtE8&YOk!-(QFWG!dn2De|f)p6cYT&JYsfI`fQ`goj& zX|wG*#iCQcMHD6~dq5h@Y8|X)ui@e*SVyy_W`W<7^YI5ivV(&7>MaSo{awjnxWzuK z`u*mChpCoguzPWUhRHsyb_9i^ucLja5Ko~8JBz;6CYhSJn49>FeStwVv3b!?52C)r zEJ(Tw4XcY9wRXK&vpjaD)EuF5-j+RX?A|b3uXJ_eXkv^2xeA9&&6fHi2%Q1S4fVox z#O%v?YS`mMITmy_E+%%9t&p}#O0~}eu5S@8v(vL`Wb$);v1&pfa!0#$dUx=Lfx~oi z%u~k$tu9eaZr)g}m>~jAiEL}3Rs$jr$r_$LvYysSlairEk~Twy%!EemVt#e;Wy6FK zQ(;oriX>7jQc^KL@v=u!>^!7tiu(CSgR5Nzp(%FxGmY6?yc^y-Il(rt<#>|lu9`iD z<;WcFnl4#4wqxiN_Io8%xCct#2qCnIx2oksl=GE^sJC{OXKTe}8cmdhI~P@x&biWg zDqX;i&$?WH!c)Po4}feaxhg(hsm6({TQa}kj_K=vuSQ0Y()_kGht+n7b08xQls4&B z0s+0WK{E&4SVbMR{u)uwk8imvPO_9NA`;Cj^r*77GMQJXOp#q#Up%W~SM1WNoXs|Q zb6so9>DLhUHP2e})7PqRITOV@>|x#XuL)bp{Q@AhE_Ji1*Q=E5vCuM1OjVk1TG-ou;5@5 zQAD+OBUu&o9gk#!lNS@u=^(J$thl!Q;O10&X=Ub8dKqPOx+Gc|P!i1dAB0DKMrhkP zJZAMDF%~cz;tW!>8EUr8b=n`$nxe#+6J2IJi`wxN-qGrZmfm;CWT_q(|d&x-=$ew?rjE-1oK1zb4 zb4KA4qo7XH8%KHU+TdQK{2+WcMg?+-I333O)~XUeBW@Wv$A&doHHYeX@%N3#2JvLU zWyQvp2|G|2yFLm^%rkZ?UyyM+}9Fg~} z7UB#Ge(nC?5!j|Hy=uBZiE>Rp^k^HeG{)}`7DDO#4p=bS55K-<<@QJ&VU5HGO851h zoSw8yx}ur~dr^mN-9th(Gh^4Ljzc)oE)1B|3l(vh)M#0012|qoSXt+fx%iPG5aAF& z&s7Sz|9LL{f63UNdygH%tKosZVEP~MuGylRP0KZzp_Io4B4!BJJ9{Oy4~gGxw)%@G zxO_k$P23=1(qSAP``4~peLhTcd-;v|9ijEgM5W$|bU4lgnQKr%Oy!p8qg>14JJcTUZH%O0Iu;AdKJ=;@qgJldL^KSD zIT4k)tT|!$7y8)P{JaL(n1sT}h5y6=0*gB*sm5*CMyv7tb{#*A6^nvpWDKNc<}aypS&r zuO9($c$_brzxs;j?)+!#jg?JrFCLJpNS2;hSv=m5Adcy`QHuDt>To5M;U()zXc)m{ zcI3gH^RTJ|UNeH>kJVo_*A^S1$rayaRI4CKAkQ|2xD;bLJ!6MXbsMR7Y5BJ^p_S~i zsRt=s zuwyn%l7;Q#1Epfe!mGnotWI{MK{DIeUQ!zUipjLY8?PRg>5=UwPp;8gPGez!`E{GsyK+0582PZvPoW2I4oaFD*060B zLtP@G)q@fR_9}JUYWRI~%MBX-9Ogw?muQe<{lR}U!U+1Fc%*O$e7 zgtDUD>m8%nE3)nD0nxE;pv6A*W2IX46?(& z^2Q<-E&B{k7~utlZ6cxF1hI3k*QL=Vy2A9H0c`y1WO5gd85+U3dt~!SkfowG@INXD zjdl$B8o(dx@W1+F{Vx^d&#mbJ^5a&>a;R^gm>iOA%V-%PEvx6`Vf;8kL&X@#_$`4c zEq8JUn&>f_`b}*NySk;pkp*p#IuGT&6!=k6<}nZ&us_JWyrR7u7t!BR#uPi5JpR$d{U-qJU_i z+QP=~)6;bXi+p~MrR*$%8oAzZbl$WZoM?W!L@S4l0~T67t)rXlZpPVgA5NIiK~g9` zjEm^SVV|v!4})z$b2McmB=lj?@n_SKc_6%F+4|RLiPON3L_FdoEw?vm3=z~v?G>jP zs!H1}ZIlhC1vc&c`6qD}V`U^tKQgGcsYL0E=ybR?y;=dsQ>N4tIHbHI ze*$^R%WWliWRAc;n|O7acsyHPU%VeA|AunHH0L-wrRl!k6nV#7-*neyX>Vbtfztqs z6rMvrP2g~<-FQ~Fy6qpOi6j=dqL&qn3c^(65P0SIwQ;O?!QH{tnib!^bu@Y|>ys$M z_alV}%o*bX!!(j?mK3k)vO0M~Kk2BUH`1Lu z4sOF^Gb?6irSng3f;$Smn}dAM08NgPg_R|N$Or31&w!7Cos+u76T0mZ5VLfVRTR3A zl}o4#N>v|sDe8=c1dDd$tWh4OK-!=83nZdAG~36EkWI{?85eC39(wUV!V#xK%IG~y zmmV|y!Jd0v?eHTBUH@=}t{sE36@RQiKP(ej7ud8#?CD>T2$n503<3eo2igBiss0&& zz)_}K9B@9fXRYODr{$7Ub%g$~tuKxIU8Vh_J6|pfZZcO?i6xX{>q5PM6mR`&1fixr z?MK$;IyRP;G(32)$_Xe^Bmep($BY}kebzQmX28dM7j z<#&X~W@Vp0=-P*S&`a8&tNB9n zw*9Z3(f>;YG5$aMbtB>}Rd9q*2j4-41UTwtzNtynRwl;CD>c2{Mm`uuX4PtnG;8m14H*orJcsAV&)jIt8dfskNu%C6{{R+2*P85i> z?Tm+37$TmolPAj&Wq4x!%;>~Xy8(&Wo1k^6$`;}X+T4i(X6rmmL5D-g@ zY0#v4VhUPGPannOt9v)$&8caCseL7&L(8N|{Z8;Df1F;mqK;jB3$WXgd5~gYfc_g3 ztU!GcHI{TM=ghi!Sl4+hapX04dzTF%Oe__z&Cx(kgN(^D$uf6w3DM=cIw~0zx>r%G zR~Psos`lcXP#|TlSv+w*YS~+^LGpu~OQRh5jb^hQ4ZlQ*P$X7cPJlIIc)bT5DpdsK za4GpP=`{;t&Ox2xNzld)BU+JQx3WMI{6aoRA~ixOuF6Hj9h<~u-FyKbx%BY0!K0y! z=Q3wgfuUib0*N_^7}c&@obF12o$9kAa`RgUB*iQHnEAXT%2*Mr!25wB>k(NVZ6uBj zv%_qYcAN|=%C?wv@8bKbCp3TO=REpGD_ocYVFGMVCVA>r@d4O_ccpxF!^s9LbM+Pp;L@WW)}$AyxgvO&jk&wDTMx)OreAu$8-qG{M6&2N#gR^ZE(=q= zDPokGJ#GymV&cQS58qxLi*|C#FFlfqgqy9BD%ptXb_(C^FdYV&os2L$Uh=ZFz^X(T z->Nq(bMLzxf_+DTO>z>f!6G|+^FpOw_AJhNb<7EQfa0g-fX$;~B;ER%>L(u(_`C>S zZ?wO+LEtESUJ!&=et~6$>c@V)k#uHi$_HlVpA&BGBZ{1|#i)fY;J_g7d9w}}ciw3C zP(FD_c1Xo~e#^{n=Dj>xdm&(Zh8=RrWZ1m{oVJwljAx8M?<+FwMAc! z6Pr{3Qwr5`b6E|fXBbNFoDvpjLXR8BQK17@BAkhJ(~th&D0Z+$^U(Bgv344YC|8&3?jAQXdnDpr>TMF3R&csAO0DtyLs zsVn#1=*sgbnGeQGq_`9cqSoXSoR5qZb?Ij2;(6sBY*fTkn|&1g5moP;NIBBku~9^z zy*xR#hE%(iP-6FIa#9Hn99gQnS%wwmN%seZ7+5$H2P4O$y1ZD3k?;Lvewe`3e8IPv z<|eF2U*iyscKK2IM4!{BjCC%wKC4-vY$_)-EXUbNbK)`*Tuok-gt4`LYv&6y4{GH; zGcPNzyN`^x*@HV}uY$GEbq8})4XMxU$mQ1HKDR*|ZH5y>U$vGb8@uZ@ z0_@RYQaFWx(9u2()%N)ssln6 zVpKo~HWi{s)U~MS%lx;{#2`kvE1(e?1Qrunyln7M0XQtw4|9ldwatyru5@vESP@BW zb#nrt6LF2CSLl6nfd+G^!L*}|Y+`RpC=6h!&-FJb)dud9)#1xbtZXI)Eguxm);_L> zRbSmohDq$wZSLg%K)sS>s;8$NA-JfJq)Nm*!V2rpGaAWeEf}e<7Nn_-EY5X(#HXvD z6-Ow~R+6NBc5?>(oE#!ag^OSno}Z05JXihI&W7I7$ak25%dZ%J6bSJHuFX z(t?%!<(n@qcv_VHi%gFamlZ!|c5~EMK2#H2&5%hnq@^?@Cd$*`Ns=&iFAW7_MFcPz zy{OvIV?~iiB~Nd4>)T(Q=9Z=?uh49XItQXm?}<8-=oQSS>D!`&PDkY^BBwGWhV-vG z`|B5flE@OBvk z*Vl^Cmp0_;_7h#Pm$nCF`UO2484Xcc$uYorltay!%QA~l#Faq1F&8Fm$fLNkCGbq1czDs24@Ldb=% z@I+Ra5!4D`gy>DD1muuQ5entE^%<)@yrYuz9NMEn3=%SzD*6xek<3#-<2Vfi^U?-) zY(HX+Kf7-+^V!5(A^I+*Fc=s;#pM?4h<@$C!bX|vo!FAKP^q#OX|%s3?G}hJXbUo( zZ`eD@gTrUG-7`7_ahk@dD_G;=eswQ^F(xk5|D0M2`z)n)YS(>av^%y9AIapHp#2dq zoYc1$(LV*6e?@lM0K9VgJ8N=`4H+X1=ms<)C_>?-6VB{Qn^>p^>=P&Cu?-uKkyTLC z9U3Q`PgnQmm-CCM(;Ml6fLfY??9QOp&@DE>2s%1uS88CVaePWc7j3uC?Slf&Gg@q# z%Vum$iNO8s-g#h^w8d>q_jMIv#g6daI(CZYYocsqKUP8BwV1)HYl<|XB&Bl9&r$nx{ ztpaZjZX&cfNX5DpB&qki(m~L~vnKo%R)ly#lo2ib%>9}Pzq_IRY&Ah<&loF*G1AJE z^wum`-2S1~RN-Pl0uIG%E%rduwrj$Ohr;f5h_bN7D_%#lL(=LaGsO$lRS2rn=?RWH zd#MUq(pltMVfoI~PEqyVqxczx?D*t<_5gHmvyc0(hxgNFuR{hcu_cX0Z=RNYnzEI! z8_u``2^vno?(s^Ep@eBE&||(Ek)`l}e6+&zz*2O|C&iNYZ|PwRpMS!9rAypkW;6?m z_0)bs_G}LA5Y^E&qmZ>vGXbiv?0(p4%yUa{uwhQ%!VOE6!|?1C(7|B2<-7mPhlOI4 zUR*3IjbzST{@K`%&tS9QT=eGQ(`?OtCvcl#Si+FUroi>|@`U%UsZ;euvY$MR%f zRQ9^w_-DT|`uL=T_Hu=@%Ci*VJM#U5(ZwD$tlo3YQ3864nqz58rT0Qe5z>Z!#J1q77{_LDiMaGeK zldd>84Wp~qrXI3%=z1kx!etLz7rkG$KRSI#h}8G1Sja;&{9s>L^4uG~ABb84AdZD{ zvcAhu9nJ6-_^7%SCd^=YnXxwlO<>ZME53G5#77joxVlzB|1L8rkB*Z)VE+%RW+W#D z0U(l~Xnk! zB*0K@Ijp50vwij;i@d%a1H6PbwXe5yQ-tMn5uMqe>sjUO0JEiHq&C!j@CBwzIS-Z! zDsfj=gbfX!L3bTYHHjW9tlCaY4M-6p{(GA&%r`nemg#392u?s%;dr&)st0xyVr`#+ zSfUN!^Oii>5=W>^s#$>{h#!q=TNBU;+%;@^d%~?8q9>wox*ARj``rEEDwG>rI$z3Q zmT8O5=2B_dK#k72d<_N%K_rjKY_%++7yY@ZGqmwS*%p^@xzB02ZcX!|wESCw233TI zCk>J#166B2BLgc3GDaq9l*vOog z*+a^j3jaM$>iv#miZ35d2zHu+Di4qpzmhf~`>n?Zlfp!03mo*%>s=1ZT^`WCn67E$sAaejw!XPw z@ZyfeZq{AN)2f>Twy*KUyTW-S>u$jc^lf2uW_A6NHA-nF-guD~Fr$%;q@O1@Z1sUVR+xTjdXM8Y^@WR@l3AouV(@}WjRb1j_OHy|k#*53&ca4vz7Qfr z0nXlWkp`OE60ucP%cDx3)JQ}fdjvB&e3R^1de(nw3gR7;F@RaB>0aI<-!3*Xa~-D7 zbOe`iH9_JXchJ_>$}M1v`bvU8yK)7qC{Pl|(RAWl>_8t0>GR|#Gb!E;joiVMt4cx8 ze&NAxF0`?zIZ?_rI_dg=%F8=iy7vv%tDDNjBIw|U_xIz{2b7oLGV{s7sk-hgWIU0X z2UFqZ=7n5j!7oU-A^BnREjHIeC6?w5Vee{tKE8cJB(3EVZTtJLq^K=@$w}`CyyU=N z65O`gNwvVeGY?M>Vowrec;7ee_~yzqNESLZg_K^vLT)icw_al%XBXKbN=&w`9`a&r zc2wyZxf0pp&-{~~Q-ib%;IvDovpzqh`98S1KC{l2*h9h#1^B=tZYCgaxr=&UHE|9i zr!0x;f(MGvXF0;`P}@-kg?aC76NIABG!d*}Pr%~5C|KB$BqH8NmN? zv`cDfvDhzqjeur#7>t_kJ*EP+k2eRp@tzF%4d#xx@k1EQ$?{4Q5148VQT!l3Dp#0` zf#|lT14XoKpklmtY5KFJ4%(W!uefXpGh^67f(ui4|SW_<*X1~gy2uw zoWQoUMn>lx;X|2{Is^jdJlIt0za7r(clO-lHp*MoPYJ*%Mc_KX#H-CuM0T7yWjE?Y z1-HS^z~jerS|+K(R%VEZ;?Jpkck}CB=4w^+jA>1z173kTW}3g5{ZtPMKQ+-Z-FR*4 zh>xnT!H6Sh-@Td%H{v<169ZJXQ96v6 zdQH|cdW|JSAY?B_&}Vc!|6@jXf{0cL9+U%_YrQM;v(SXjQJhYaO1XR~w?nI20xNA; zQT=W@TDk9Vk;Fl!4(+x1_mAHQN1lJ+TcO+@Q|hA~lx=4G2#)84h-O3i>#c4By*#`DA%!4K- zO7d}~1-z6N`UrKDnQXm_A_Q~5_o!L%$ zKKB-{L2Lb|+~=Z24Pc+8P|z#kFk@Kv`Ehh=YkrDP$Qcst%h)5tt#g1;p=*&8PTkz5 z8QhA^-Ik@$&CS$ih*d(%CpAv@URv+oNTJ4sy^1$qk-(f{4s@{)mg~ICx2YDQrL0%j zf{h$rKiz6oO{-$VpIUb8fj4;$@rIo(D7O`EjU-XL800odY(Y^YI3?>98-m!;)uNI( z7HlXJ0RtBBEYBJ>s{0Hf{pa`c!X8WTjxu)&^~BE^I4Ks{ut$E9^`xC{rEzGVn>GVw zJx#k+oTxKTLt)d1jV>TJ=6Y>ht8yaui3+{WrUMi{-4=Z>>VL3*u?%&S z?CIUz$@zgS?+Nt z-ZAuTk(nK+{m@xLx#qIC&Mebq?q*m;DdP>Z0PeW~d1O_W#Ihj2sdYc?8qn8>He066 zCDz(l&n@*#_OsqyAi@&G;X>KoH&DPOY*%b#2sD4SL<_~?dt&5da+Yp{OrdiDbDT32ByL98>+RW_rDbp*mtg*YV3`lq zK&mV<69pfX+@BQB{CUl;FHtV!LhfMT)a9f0L_NpI@}~(nTfc9AFH-h;W8P01k~a9KcFQ}@5<;dt?==|%D_<8A*8S~PhE$MW+Y>SyBXcG@)h&OL7u1aPgu_cG3u*D2(u2?)DFi6s6d$VcEiwpggVKo z`!%V;!yt{?b`J8J5mUV)-mT2+EQb~lD-A4=vjVZFWz=SH;IrAAFlmI~_s~N%nL-@v z_g;rUSzu>nB?lJ}CF8BTsWMxA?HNjjS!pskGr_g4=$&S_SDnbwx|VvS#mw-c3r zvS%8U<{#9^Q=_kxup>W6%XG!{7uiFLcY)wOijByiQ*QyOzdzhO@hmq)mGT$5zAfiU zcWFK1D#0n%onhP5onYI5bG4GW>hiikbe!N-Xc4Ie> zYtx*F5ol0`%|=UGQ-4q9*@bg~jqSW9ZGkSYS%q$OR4uPLNZ{7Vc}6qG!FMjh%X+g{ z)@tgP#}GkDr<%*(>6s#Nwv5Y?hVWW+_J0gi;)aQVFM(H08= z59AP*x~6f;A$GcCt1~p1R{a`X@2$bd(}C@KsiID1G)nN6*NbBF$gSSCih7!`h<7jh zA1Onw=vrbum}g<73%{qf_|AE*7mO2sE(ZFX<#r(tkPi6122-1U>V9B2{Ldk>6f{?IHfR|v%ICJ()Hca{zvM#0x- zlR~zrfr*O{f6&NVegU3sm1^Q5UiGXPipM?hJ;XGYH*Iw{EcMIRH<(#_k0aRk)^8mS zCDtzq*WaEvZ5PueO7U%&EzP+T~4e!?R+wXNzu*YpHeBs`@HYK`LDe)YmF`%(GPlE2}`?hUgu zQXh6j4cdFx;)2zG?I3ISX+m6z7F48-XwSJKdC&S0ueSnZvV|k!o19#`b>k)y{nw&R zD8;7?ApIomT~dtw94WMUg!77@HZb|58N!kBNkXPrJ;6XEs=fELZRY}T-pNe*QOer{ z2a-4B#?_o5W@vcuoj84MZzXYDI{aS_+Pb*fC#~*NAHRI=IimB0tc-gJTjeNuod-&? zfs}qZ`vwH=p}N?vKKGI|xUPC{?BfcQXVua91p7W9hAsWz;XHJ%Jzb5+XQ_00!cbQwbJ!4u`>IWpiaz-tr4!Ll3PSzc%!7hDXGZHeWF>rC{JXIZ%Mpeb!DN1JXV+o$~#RGL`P2^Y{ibE%4 zOD~~FZOiP10OaVC?&;>>vdc#om9AvjWnyYn&rzCT2(Cgz=B!-GC(yZPyNxlK8K`>6 zfI0Q#s7SpL!(!sa=$B&b=|-vrDay$%Q>FRCp(lkxnejBm`HY0}xDoOWRQ2z8({Hg%(DX0Fk};95_a!Vmjn}S8k5vaMWcCEfM8edf6>k)vA0>4l#0$_+6T?B; zFTazpp_}oF=&1Oyo1gE*c6gu<%_GeiG=8H%$HfchXTAh5CCCSBM zHC5c=dR7rQ#6k-bp!kE4H(3*YOOq7Ew3_;PV8;MB%tET-%)<{KD$lHA+Jc=dEMv-o zt+Hf2xpNA{>ZOiNXdN7a6eG(qSDFW~O6;Xe*45HGxF)dmL($>CZD|kBrl~*Htt4qR zlNEY+BBl<#ihJ$|h8d-A8VdQgRXmK9`muE#-LggS8bXzhE1!iH@}rc1KvbT>c#@4i z19_Ip%AS=}8T~w96>#Mm!V~K6^?iUuB(BNTk{`~ZS-H?Sy=roggwxcv0^u>dYfQf? zCPXFmt`j>SkMW|O6B}An9iSh_3N&2_bRA+H6KK#acx%ypQj}z}7frq_Mq=))c3l~K zwygF-s8IarRSYZBxWu(?eSK3jKFh=^V{DnJ&4rN}t8fG^x_MK4Gkc`!IAyEet{b~i z%HBSliZf&1s8~5U5h3&5Rk+c!aIE5ar2Krl>2YLvcTDbibb5FEU1r^?lSeKa-I<%ru|!!j)Toa|2A zd!Trfdyp=t=^Rd}b!)e<0m{+F+1K(G z1Sn;+mFJic8an<5zQ}O|^zWK{^OQ+zjvpOs?-~nWb0^@9tR3?@;IE2<@JXzP&gpaQ zYEfb>F21qVULMXT%6W#jH>>#h!`6{5|K|am}$&`{meM}&KzPujWNK|m5 zhM$svF|97>I?{hQ^~nrHEndlIS&+KDunlcXxC*)qMbGX;EGL1eH+lW0>hHwxbZde$ zbp0L0TL4O14QnkB4C;91HgOdUl-_~pa1vcj}^54 zCIRz*e+u}<47mT0(6_dTBmE+L{8!<>ihCV7 zGTs7I#0v1E#r#E_2CxG8ANd6YGW+B2|Ew+kt~HV5jtDlu`Y$-*?-XNz+W$iN(>3*X z${&yacWM2qhaa%NQS|M(Cl)B0l#83(}lH7oUhC;kuRilJtuoD2Tp!xf+^{7Uh}{hLJmL%IGy)}-eH zScVJ1?-WDgzoGntTA{7-H248I`uLX|9W(t6BfhKX1MBcwJ{y~Rb5n)bA07my;7!G`YVf=$N<%O%kQ3Du%G#J0;MTY+` zj6WR)f3N7JYB5@|0QtPXq@zRNFN{C^WPWFeDrjPC0!o(SFX@OE`U~SvZ@b?a|7jS% z+EkQe#BY!P z2f}}50C2qae_Zo2zY_kM10=lwvpIm!3I2xXPG62i~2%v{w5t_QcBmTjv@%a$Qh5)IU1YmweOzHoQ_y?mF*Rndr7FCAnCIK12`%9?=oBt&xf8XFMMP}kt0ubYW(MPJ~?}&e>Tg}j1g1~@6 z#RBxDzp516`gerM-={(|0uCtSZ!;oc|2x9;?-BoBW#<#xL=c7XTq1}HRq#-}6pcj< zhz0~v>_rp>ky7+xwWtK8hbELXVyH?k)*`l0(c&LGGzuOB8x55TDtgdr#Y#mF20@V& z52+Mw714{|v?lr9?!3)9Wg&-tznOje=IxubGw?9Khx_I zwUD2|CFP$}l}^?0)Rjr~n{0d>my~bnWVtf4cW&9%@)%N+z)1PZ6D(I|HI!wGA+w|w zI!SVu&8F%j1DoObmyq3K!!@-Qp;K?WGuL!)AH+HIDgpU4cYG+M-1y$;qM5bu{8yO7 zGTlga5y0*!>xSQ4e2Cr$(Yv(Tr?Vv1Rwd8--uGU^J-@&u>WB79D!+j*T58ar$jn&zS#eQ)ku3B87h}|@&ve~@(7uO+-6Imm*`IoB@x5i^f zT959IcWjR*V^K%_U#BhFI>x`Rf!o#Ny)JDLzfz?id$az)N_^(hrV@Pfjz6%Hi*b=i3I1}|A6UuIxZIuu{~YoMR+b`M{$jQ8 zir{@;V7p@*QYkE&6X+^!?5P{;Ub%7whh-HpKGi(4>D4@fO94nwX2cFsyqphQtra86 z;DzO!s_Jr@5ABml-RZX$%>P=qJMV_Lzf|B;UF5xtTJ?%aj1@``Sz;y&?qQTSJU9ar zp9@eYEW2UC1EUOzH{;6?y|L&)E1xXj93Ag-m%PQ3o;)R}@m^@jn}@HdoPJa`nws|T zmRHG(OnLH@*vOkLCGYAtPo5GIdB>sTwNHEUlt{??mn84Oj3-Z7>+udA$$Rw6lcxk! g{`-dX=7qn#c%_*h#F{e@XvWVH%&CT@$Xx<|0WX}DwEzGB diff --git a/app/src/main/java/com/huanchengfly/tieba/post/App.kt b/app/src/main/java/com/huanchengfly/tieba/post/App.kt index 8edb58fb..201d99ef 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/App.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/App.kt @@ -40,10 +40,10 @@ import com.huanchengfly.tieba.post.utils.EmoticonManager import com.huanchengfly.tieba.post.utils.SharedPreferencesUtil import com.huanchengfly.tieba.post.utils.ThemeUtil import com.huanchengfly.tieba.post.utils.TiebaUtil -import com.huanchengfly.tieba.post.utils.UIDUtil import com.huanchengfly.tieba.post.utils.Util import com.huanchengfly.tieba.post.utils.appPreferences import com.huanchengfly.tieba.post.utils.applicationMetaData +import com.huanchengfly.tieba.post.utils.helios.Base32 import com.huanchengfly.tieba.post.utils.launchUrl import com.microsoft.appcenter.AppCenter import com.microsoft.appcenter.analytics.Analytics @@ -65,9 +65,7 @@ class App : Application(), IApp, IGetter, SketchFactory { private val mActivityList: MutableList = mutableListOf() override fun onOAIDGetComplete(result: String) { - oaid = UIDUtil.Encoder( - "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=" - ).encode(result.encodeToByteArray()) + oaid = Base32.encode(result.encodeToByteArray()) } override fun onOAIDGetError(error: Exception) { diff --git a/app/src/main/java/com/huanchengfly/tieba/post/api/retrofit/RetrofitTiebaApi.kt b/app/src/main/java/com/huanchengfly/tieba/post/api/retrofit/RetrofitTiebaApi.kt index fe2358c4..e8957bea 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/api/retrofit/RetrofitTiebaApi.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/api/retrofit/RetrofitTiebaApi.kt @@ -1,7 +1,6 @@ package com.huanchengfly.tieba.post.api.retrofit import android.os.Build -import android.webkit.WebView import com.huanchengfly.tieba.post.App import com.huanchengfly.tieba.post.api.Header import com.huanchengfly.tieba.post.api.Param @@ -47,7 +46,8 @@ object RetrofitTiebaApi { internal val randomClientId = "wappc_${initTime}_${(Math.random() * 1000).roundToInt()}" private val stParamInterceptor = StParamInterceptor() private val connectionPool = ConnectionPool(32, 5, TimeUnit.MINUTES) - private val defaultUserAgent = WebView(App.INSTANCE).settings.userAgentString + private val defaultUserAgent: String = + "Mozilla/5.0 (Linux; Android ${Build.VERSION.RELEASE}; ${Build.MODEL} Build/TKQ1.220829.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/109.0.5414.86 Mobile Safari/537.36" private val defaultCommonParamInterceptor = CommonParamInterceptor( Param.BDUSS to { AccountUtil.getBduss() }, @@ -74,10 +74,10 @@ object RetrofitTiebaApi { defaultCommonHeaderInterceptor, CommonHeaderInterceptor( Header.USER_AGENT to { "bdtb for Android 8.2.2" }, - Header.CUID to { UIDUtil.getFinalCUID() } + Header.CUID to { UIDUtil.finalCUID } ), defaultCommonParamInterceptor + CommonParamInterceptor( - Param.CUID to { UIDUtil.getFinalCUID() }, + Param.CUID to { UIDUtil.finalCUID }, Param.FROM to { "baidu_appstore" }, Param.CLIENT_VERSION to { "8.2.2" } ), @@ -106,12 +106,12 @@ object RetrofitTiebaApi { defaultCommonHeaderInterceptor, CommonHeaderInterceptor( Header.USER_AGENT to { "bdtb for Android 7.2.0.0" }, - Header.CUID to { UIDUtil.getFinalCUID() }, - Header.CUID_GALAXY2 to { UIDUtil.getFinalCUID() } + Header.CUID to { UIDUtil.finalCUID }, + Header.CUID_GALAXY2 to { UIDUtil.finalCUID } ), defaultCommonParamInterceptor + CommonParamInterceptor( - Param.CUID to { UIDUtil.getFinalCUID() }, - Param.CUID_GALAXY2 to { UIDUtil.getFinalCUID() }, + Param.CUID to { UIDUtil.finalCUID }, + Param.CUID_GALAXY2 to { UIDUtil.finalCUID }, Param.FROM to { "1021636m" }, Param.CLIENT_VERSION to { "7.2.0.0" }, Param.SUBAPP_TYPE to { "mini" } diff --git a/app/src/main/java/com/huanchengfly/tieba/post/ui/page/search/SearchPage.kt b/app/src/main/java/com/huanchengfly/tieba/post/ui/page/search/SearchPage.kt new file mode 100644 index 00000000..c14ebf0b --- /dev/null +++ b/app/src/main/java/com/huanchengfly/tieba/post/ui/page/search/SearchPage.kt @@ -0,0 +1,12 @@ +package com.huanchengfly.tieba.post.ui.page.search + +import androidx.compose.runtime.Composable +import com.ramcosta.composedestinations.annotation.Destination + +@Destination +@Composable +fun SearchPage( + searchWord: String? = null +) { + +} \ No newline at end of file diff --git a/app/src/main/java/com/huanchengfly/tieba/post/ui/page/search/SearchViewModel.kt b/app/src/main/java/com/huanchengfly/tieba/post/ui/page/search/SearchViewModel.kt new file mode 100644 index 00000000..de18eebd --- /dev/null +++ b/app/src/main/java/com/huanchengfly/tieba/post/ui/page/search/SearchViewModel.kt @@ -0,0 +1,20 @@ +package com.huanchengfly.tieba.post.ui.page.search + +import com.huanchengfly.tieba.post.models.database.SearchHistory + +class SearchViewModel + +sealed interface SearchUiIntent { + data class Init(val keyword: String) : SearchUiIntent + + data class SubmitKeyword(val keyword: String) : SearchUiIntent +} + +sealed interface SearchPartialChange + +data class SearchUiState( + val keyword: String = "", + val searchHistories: List = emptyList() +) + +sealed interface SearchUiEvent \ No newline at end of file diff --git a/app/src/main/java/com/huanchengfly/tieba/post/utils/CuidUtils.kt b/app/src/main/java/com/huanchengfly/tieba/post/utils/CuidUtils.kt index 5b1edf79..208bf91e 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/utils/CuidUtils.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/utils/CuidUtils.kt @@ -1,12 +1,12 @@ package com.huanchengfly.tieba.post.utils +import com.huanchengfly.tieba.post.utils.helios.Base32 +import com.huanchengfly.tieba.post.utils.helios.Hasher + object CuidUtils { fun getNewCuid(): String { - val cuid = UIDUtil.getCUID() - val b = aid.common.cc.b().y(cuid.encodeToByteArray()) - val encode = UIDUtil.Encoder( - "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=" - ).encode(b) + val cuid = UIDUtil.cUID + val encode = Base32.encode(Hasher.hash(cuid.toByteArray())) return "$cuid|V$encode" } } \ No newline at end of file diff --git a/app/src/main/java/com/huanchengfly/tieba/post/utils/UIDUtil.java b/app/src/main/java/com/huanchengfly/tieba/post/utils/UIDUtil.java deleted file mode 100644 index 376422f8..00000000 --- a/app/src/main/java/com/huanchengfly/tieba/post/utils/UIDUtil.java +++ /dev/null @@ -1,148 +0,0 @@ -package com.huanchengfly.tieba.post.utils; - -import android.annotation.SuppressLint; -import android.os.Build; -import android.provider.Settings; -import android.text.TextUtils; - -import com.huanchengfly.tieba.post.App; - -import java.io.ByteArrayOutputStream; -import java.nio.charset.StandardCharsets; -import java.security.MessageDigest; -import java.util.UUID; - -public class UIDUtil { - @SuppressLint("HardwareIds") - public static String getAndroidId() { - return getAndroidId(""); - } - - @SuppressLint("HardwareIds") - public static String getAndroidId(String defaultValue) { - String androidId = Settings.Secure.getString(App.getINSTANCE().getContentResolver(), Settings.Secure.ANDROID_ID); - return androidId == null ? defaultValue : androidId; - } - - public static String getAid() { - String raw = "com.helios" + getAndroidId("000000000") + getUUID(); - byte[] bytes = getSHA1(raw); - return aid.ids.a.ag("A00", new Encoder("ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=").encode(bytes)); - } - - public static byte[] getSHA1(String str) { - byte[] sha1 = null; - try { - MessageDigest digest = MessageDigest.getInstance("SHA1"); - sha1 = digest.digest(str.getBytes(StandardCharsets.UTF_8)); - } catch (Exception e) { - e.printStackTrace(); - } - return sha1; - } - - public static String getNewCUID() { - return "baidutiebaapp" + getUUID(); - } - - public static String getCUID() { - String androidId = getAndroidId(); - String imei = MobileInfoUtil.getIMEI(App.getINSTANCE()); - if (TextUtils.isEmpty(imei)) { - imei = "0"; - } - return MD5Util.toMd5((Build.VERSION.SDK_INT < Build.VERSION_CODES.M ? imei + androidId + getUUID() : "com.baidu" + androidId).getBytes()).toUpperCase(); - } - - public static String getFinalCUID() { - String imei = MobileInfoUtil.getIMEI(App.getINSTANCE()); - if (TextUtils.isEmpty(imei)) { - imei = "0"; - } - return getCUID() + "|" + new StringBuffer(imei).reverse(); - } - - @SuppressLint("ApplySharedPref") - public static String getUUID() { - String uuid = SharedPreferencesUtil.get(App.getINSTANCE(), SharedPreferencesUtil.SP_APP_DATA) - .getString("uuid", null); - if (uuid == null) { - uuid = UUID.randomUUID().toString(); - SharedPreferencesUtil.get(App.getINSTANCE(), SharedPreferencesUtil.SP_APP_DATA) - .edit() - .putString("uuid", uuid) - .apply(); - } - return uuid; - } - - - public static class Encoder { - private final String secret; - - public Encoder(String secret) { - this.secret = secret; - } - - private static int dt(int var0) { - byte var1; - switch (var0) { - case 1: - var1 = 6; - break; - case 2: - var1 = 4; - break; - case 3: - var1 = 3; - break; - case 4: - var1 = 1; - break; - case 5: - var1 = 0; - break; - default: - var1 = -1; - } - - return var1; - } - - public String encode(byte[] bytes) { - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - - for (int i = 0; i < (bytes.length + 4) / 5; ++i) { - short[] shorts = new short[5]; - int[] ints = new int[8]; - int i1 = 0; - - int i2; - for (i2 = 5; i1 < 5; ++i1) { - if (i * 5 + i1 < bytes.length) { - shorts[i1] = (short) (bytes[i * 5 + i1] & 255); - } else { - shorts[i1] = 0; - --i2; - } - } - - int dt = dt(i2); - ints[0] = (byte) (shorts[0] >> 3 & 31); - ints[1] = (byte) ((shorts[0] & 7) << 2 | shorts[1] >> 6 & 3); - ints[2] = (byte) (shorts[1] >> 1 & 31); - ints[3] = (byte) ((shorts[1] & 1) << 4 | shorts[2] >> 4 & 15); - ints[4] = (byte) ((shorts[2] & 15) << 1 | shorts[3] >> 7 & 1); - ints[5] = (byte) (shorts[3] >> 2 & 31); - ints[6] = (byte) ((shorts[3] & 3) << 3 | shorts[4] >> 5 & 7); - ints[7] = (byte) (shorts[4] & 31); - - for (i1 = 0; i1 < ints.length - dt; ++i1) { - outputStream.write(this.secret.charAt(ints[i1])); - } - } - - return outputStream.toString(); - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/huanchengfly/tieba/post/utils/UIDUtil.kt b/app/src/main/java/com/huanchengfly/tieba/post/utils/UIDUtil.kt new file mode 100644 index 00000000..7b47553a --- /dev/null +++ b/app/src/main/java/com/huanchengfly/tieba/post/utils/UIDUtil.kt @@ -0,0 +1,86 @@ +package com.huanchengfly.tieba.post.utils + +import android.annotation.SuppressLint +import android.os.Build +import android.provider.Settings +import android.text.TextUtils +import com.huanchengfly.tieba.post.App.Companion.INSTANCE +import com.huanchengfly.tieba.post.utils.helios.Base32 +import com.huanchengfly.tieba.post.utils.helios.Hasher +import java.nio.charset.StandardCharsets +import java.security.MessageDigest +import java.util.Locale +import java.util.UUID + +object UIDUtil { + @get:SuppressLint("HardwareIds") + val androidId: String + get() = getAndroidId("") + + @SuppressLint("HardwareIds") + fun getAndroidId(defaultValue: String): String { + val androidId = + Settings.Secure.getString(INSTANCE.contentResolver, Settings.Secure.ANDROID_ID) + return androidId ?: defaultValue + } + + fun getAid(): String { + val raw = "com.helios" + getAndroidId("000000000") + uUID + val bytes = getSHA1(raw) + val encoded = Base32.encode(bytes) + val rawAid = "A00-$encoded-" + val sign = Base32.encode(Hasher.hash(rawAid.toByteArray())) + return "$rawAid$sign" + } + + private fun getSHA1(str: String): ByteArray { + var sha1: ByteArray = "".toByteArray() + try { + val digest = MessageDigest.getInstance("SHA1") + sha1 = digest.digest(str.toByteArray(StandardCharsets.UTF_8)) + } catch (e: Exception) { + e.printStackTrace() + } + return sha1 + } + + val newCUID: String + get() = "baidutiebaapp$uUID" + + val cUID: String + get() { + val androidId = androidId + var imei = MobileInfoUtil.getIMEI(INSTANCE) + if (TextUtils.isEmpty(imei)) { + imei = "0" + } + return MD5Util.toMd5((if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) imei + androidId + uUID else "com.baidu$androidId").toByteArray()) + .uppercase( + Locale.getDefault() + ) + } + + val finalCUID: String + get() { + var imei = MobileInfoUtil.getIMEI(INSTANCE) + if (TextUtils.isEmpty(imei)) { + imei = "0" + } + return cUID + "|" + StringBuffer(imei).reverse() + } + + @get:SuppressLint("ApplySharedPref") + val uUID: String + get() { + var uuid = SharedPreferencesUtil.get(INSTANCE, SharedPreferencesUtil.SP_APP_DATA) + .getString("uuid", null) + if (uuid == null) { + uuid = UUID.randomUUID().toString() + SharedPreferencesUtil.get(INSTANCE, SharedPreferencesUtil.SP_APP_DATA) + .edit() + .putString("uuid", uuid) + .apply() + } + return uuid + } +} \ No newline at end of file diff --git a/app/src/main/java/com/huanchengfly/tieba/post/utils/helios/Base32.kt b/app/src/main/java/com/huanchengfly/tieba/post/utils/helios/Base32.kt new file mode 100644 index 00000000..ef007bd5 --- /dev/null +++ b/app/src/main/java/com/huanchengfly/tieba/post/utils/helios/Base32.kt @@ -0,0 +1,54 @@ +package com.huanchengfly.tieba.post.utils.helios + +import java.io.ByteArrayOutputStream + +object Base32 { + fun encode(bytes: ByteArray): String { + val outputStream = ByteArrayOutputStream() + for (i in 0 until (bytes.size + 4) / 5) { + val shorts = ShortArray(5) + val ints = IntArray(8) + var i1 = 0 + var i2 = 5 + while (i1 < 5) { + if (i * 5 + i1 < bytes.size) { + shorts[i1] = (bytes[i * 5 + i1].toInt() and 255).toShort() + } else { + shorts[i1] = 0 + --i2 + } + ++i1 + } + val dt = transformInt(i2) + ints[0] = (shorts[0].toInt() shr 3 and 31).toByte().toInt() + ints[1] = + (shorts[0].toInt() and 7 shl 2 or (shorts[1].toInt() shr 6 and 3)).toByte().toInt() + ints[2] = (shorts[1].toInt() shr 1 and 31).toByte().toInt() + ints[3] = + (shorts[1].toInt() and 1 shl 4 or (shorts[2].toInt() shr 4 and 15)).toByte().toInt() + ints[4] = + (shorts[2].toInt() and 15 shl 1 or (shorts[3].toInt() shr 7 and 1)).toByte().toInt() + ints[5] = (shorts[3].toInt() shr 2 and 31).toByte().toInt() + ints[6] = + (shorts[3].toInt() and 3 shl 3 or (shorts[4].toInt() shr 5 and 7)).toByte().toInt() + ints[7] = (shorts[4].toInt() and 31).toByte().toInt() + i1 = 0 + while (i1 < ints.size - dt) { + outputStream.write(ALPHABET[ints[i1]].code) + ++i1 + } + } + return outputStream.toString() + } + + private const val ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=" + + private fun transformInt(i: Int): Int = when (i) { + 1 -> 6 + 2 -> 4 + 3 -> 3 + 4 -> 1 + 5 -> 0 + else -> -1 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/huanchengfly/tieba/post/utils/helios/ByteArrayUtils.java b/app/src/main/java/com/huanchengfly/tieba/post/utils/helios/ByteArrayUtils.java new file mode 100644 index 00000000..62906eb5 --- /dev/null +++ b/app/src/main/java/com/huanchengfly/tieba/post/utils/helios/ByteArrayUtils.java @@ -0,0 +1,40 @@ +package com.huanchengfly.tieba.post.utils.helios; + +import java.util.Arrays; + +class ByteArrayUtils { + public static void copyArray(byte[] dest, byte[] src, int destPos) { + if (destPos < 0) { + throw new IllegalArgumentException("start should be more than zero!"); + } else if (dest != null && dest.length != 0) { + if (src != null && src.length != 0) { + if (dest.length < src.length) { + throw new IllegalArgumentException("dst array length should be longer than:" + src.length); + } else { + int length = src.length; + if (dest.length < length + destPos) { + throw new IllegalArgumentException("start should be less than:" + (dest.length - src.length)); + } else { + System.arraycopy(src, 0, dest, destPos, src.length); + } + } + } else { + throw new IllegalArgumentException("src array should not be null or empty"); + } + } else { + throw new IllegalArgumentException("dst array should not be null or empty"); + } + } + + public static byte[] copyArray(byte[] src, int newLength) { + if (src != null && src.length != 0) { + if (newLength < 0) { + throw new IllegalArgumentException("length should be more than zero!"); + } else { + return Arrays.copyOf(src, newLength); + } + } else { + throw new IllegalArgumentException("original array should not be null or empty"); + } + } +} diff --git a/app/src/main/java/com/huanchengfly/tieba/post/utils/helios/CRC32Encoder.java b/app/src/main/java/com/huanchengfly/tieba/post/utils/helios/CRC32Encoder.java new file mode 100644 index 00000000..1848a011 --- /dev/null +++ b/app/src/main/java/com/huanchengfly/tieba/post/utils/helios/CRC32Encoder.java @@ -0,0 +1,24 @@ +package com.huanchengfly.tieba.post.utils.helios; + +import java.util.zip.CRC32; + +final class CRC32Encoder extends IEncoder { + public CRC32Encoder(int start, int flag) { + this.length = 32; + this.start = start; + this.flag = flag; + } + + public EncodeResult encode(byte[] bytes, int off, int len) { + long result; + try { + CRC32 crc32 = new CRC32(); + crc32.update(bytes, off, len); + result = crc32.getValue(); + } catch (Exception var9) { + result = 4294967295L; + } + + return EncodeResult.a(new long[]{result}); + } +} diff --git a/app/src/main/java/com/huanchengfly/tieba/post/utils/helios/EncodeResult.java b/app/src/main/java/com/huanchengfly/tieba/post/utils/helios/EncodeResult.java new file mode 100644 index 00000000..355ff2d8 --- /dev/null +++ b/app/src/main/java/com/huanchengfly/tieba/post/utils/helios/EncodeResult.java @@ -0,0 +1,712 @@ +package com.huanchengfly.tieba.post.utils.helios; + +import androidx.annotation.NonNull; + +import java.io.Serializable; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.LongBuffer; +import java.util.Arrays; + +public class EncodeResult implements Serializable, Cloneable { + static final boolean a; + + static { + a = !EncodeResult.class.desiredAssertionStatus(); + } + + private long[] g; + private transient int h = 0; + private transient boolean i = false; + + public EncodeResult() { + this.j(64); + this.i = false; + } + + public EncodeResult(int bits) { + if (bits < 0) { + throw new NegativeArraySizeException("nbits < 0: " + bits); + } else { + this.j(bits); + this.i = true; + } + } + + private EncodeResult(long[] var1) { + this.g = var1; + this.h = var1.length; + this.h(); + } + + public static EncodeResult a(ByteBuffer var0) { + int var1 = 0; + ByteBuffer var2 = var0.slice().order(ByteOrder.LITTLE_ENDIAN); + + int var3 = var2.remaining(); + while (var3 > 0 && var2.get(var3 - 1) == 0) --var3; + + long[] var5 = new long[(var3 + 7) / 8]; + var2.limit(var3); + + for (var3 = 0; var2.remaining() >= 8; ++var3) { + var5[var3] = var2.getLong(); + } + + for (int var4 = var2.remaining(); var1 < var4; ++var1) { + var5[var3] |= ((long) var2.get() & 255L) << var1 * 8; + } + + return new EncodeResult(var5); + } + + public static EncodeResult a(LongBuffer var0) { + var0 = var0.slice(); + + int var1 = var0.remaining(); + while (var1 > 0 && var0.get(var1 - 1) == 0L) --var1; + + long[] var2 = new long[var1]; + var0.get(var2); + return new EncodeResult(var2); + } + + public static EncodeResult a(byte[] var0) { + return a(ByteBuffer.wrap(var0)); + } + + public static EncodeResult a(long[] var0) { + int var1 = var0.length; + while (var1 > 0 && var0[var1 - 1] == 0) --var1; + + return new EncodeResult(Arrays.copyOf(var0, var1)); + } + + private static void checkIndex(int fromIndex, int toIndex) { + if (fromIndex < 0) { + throw new IndexOutOfBoundsException("fromIndex < 0: " + fromIndex); + } else if (toIndex < 0) { + throw new IndexOutOfBoundsException("toIndex < 0: " + toIndex); + } else if (fromIndex > toIndex) { + throw new IndexOutOfBoundsException("fromIndex: " + fromIndex + " > toIndex: " + toIndex); + } + } + + private static int i(int var0) { + return var0 >> 6; + } + + private void h() { + if (!a && this.h != 0 && this.g[this.h - 1] == 0L) { + throw new AssertionError(); + } else if (!a && this.h > this.g.length) { + throw new AssertionError(); + } else if (!a && this.h != this.g.length && this.g[this.h] != 0L) { + throw new AssertionError(); + } + } + + private void i() { + int var1 = this.h - 1; + while (var1 >= 0 && this.g[var1] == 0L) { + --var1; + } + this.h = var1 + 1; + } + + private void j() { + if (this.h != this.g.length) { + this.g = Arrays.copyOf(this.g, this.h); + this.h(); + } + } + + private void j(int bits) { + this.g = new long[i(bits - 1) + 1]; + } + + private void k(int var1) { + if (this.g.length < var1) { + var1 = Math.max(this.g.length * 2, var1); + this.g = Arrays.copyOf(this.g, var1); + this.i = false; + } + + } + + private void l(int var1) { + ++var1; + if (this.h < var1) { + this.k(var1); + this.h = var1; + } + + } + + public void a(int var1) { + if (var1 < 0) { + throw new IndexOutOfBoundsException("bitIndex < 0: " + var1); + } else { + int var2 = i(var1); + this.l(var2); + long[] var3 = this.g; + var3[var2] ^= 1L << var1; + this.i(); + this.h(); + } + } + + public void a(int fromIndex, int toIndex) { + checkIndex(fromIndex, toIndex); + if (fromIndex != toIndex) { + int var3 = i(fromIndex); + int var4 = i(toIndex - 1); + this.l(var4); + long var5 = -1L << fromIndex; + long var7 = -1L >>> -toIndex; + long[] var9 = this.g; + if (var3 == var4) { + var9[var3] ^= var5 & var7; + } else { + var9[var3] ^= var5; + + for (fromIndex = var3 + 1; fromIndex < var4; ++fromIndex) { + var9[fromIndex] = ~var9[fromIndex]; + } + + var9[var4] ^= var7; + } + + this.i(); + this.h(); + } + + } + + public void a(int fromIndex, int toIndex, boolean var3) { + if (var3) { + this.b(fromIndex, toIndex); + } else { + this.c(fromIndex, toIndex); + } + + } + + public void a(int var1, boolean var2) { + if (var2) { + this.b(var1); + } else { + this.c(var1); + } + + } + + public boolean a(EncodeResult var1) { + int var2 = Math.min(this.h, var1.h) - 1; + + boolean var3; + while (true) { + if (var2 < 0) { + var3 = false; + break; + } + + if ((this.g[var2] & var1.g[var2]) != 0L) { + var3 = true; + break; + } + + --var2; + } + + return var3; + } + + public byte[] a() { + byte var1 = 0; + int var2 = this.h; + byte[] var3; + if (var2 == 0) { + var3 = new byte[0]; + } else { + int var4 = (var2 - 1) * 8; + + long var5; + for (var5 = this.g[var2 - 1]; var5 != 0L; var5 >>>= 8) { + ++var4; + } + + byte[] var7 = new byte[var4]; + ByteBuffer var8 = ByteBuffer.wrap(var7).order(ByteOrder.LITTLE_ENDIAN); + + for (var4 = var1; var4 < var2 - 1; ++var4) { + var8.putLong(this.g[var4]); + } + + var5 = this.g[var2 - 1]; + + while (true) { + var3 = var7; + if (var5 == 0L) { + break; + } + + var8.put((byte) ((int) (255L & var5))); + var5 >>>= 8; + } + } + + return var3; + } + + public void b(int var1) { + if (var1 < 0) { + throw new IndexOutOfBoundsException("bitIndex < 0: " + var1); + } else { + int var2 = i(var1); + this.l(var2); + long[] var3 = this.g; + var3[var2] |= 1L << var1; + this.h(); + } + } + + public void b(int fromIndex, int toIndex) { + checkIndex(fromIndex, toIndex); + if (fromIndex != toIndex) { + int var3 = i(fromIndex); + int var4 = i(toIndex - 1); + this.l(var4); + long var5 = -1L << fromIndex; + long var7 = -1L >>> -toIndex; + long[] var9 = this.g; + if (var3 == var4) { + var9[var3] |= var5 & var7; + } else { + var9[var3] |= var5; + + for (fromIndex = var3 + 1; fromIndex < var4; ++fromIndex) { + this.g[fromIndex] = -1L; + } + + var9[var4] |= var7; + } + + this.h(); + } + + } + + public void b(EncodeResult var1) { + if (this != var1) { + while (true) { + long[] var2; + int var3; + if (this.h <= var1.h) { + for (var3 = 0; var3 < this.h; ++var3) { + var2 = this.g; + var2[var3] &= var1.g[var3]; + } + + this.i(); + this.h(); + break; + } + + var2 = this.g; + var3 = this.h - 1; + this.h = var3; + var2[var3] = 0L; + } + } + + } + + public long[] b() { + return Arrays.copyOf(this.g, this.h); + } + + public void c() { + while (this.h > 0) { + long[] var1 = this.g; + int var2 = this.h - 1; + this.h = var2; + var1[var2] = 0L; + } + + } + + public void c(int var1) { + if (var1 < 0) { + throw new IndexOutOfBoundsException("bitIndex < 0: " + var1); + } else { + int var2 = i(var1); + if (var2 < this.h) { + long[] var3 = this.g; + var3[var2] &= ~(1L << var1); + this.i(); + this.h(); + } + + } + } + + public void c(int fromIndex, int toIndex) { + checkIndex(fromIndex, toIndex); + if (fromIndex != toIndex) { + int var3 = i(fromIndex); + if (var3 < this.h) { + int var4 = i(toIndex - 1); + if (var4 >= this.h) { + toIndex = this.d(); + var4 = this.h - 1; + } + + long var5 = -1L << fromIndex; + long var7 = -1L >>> -toIndex; + long[] var9 = this.g; + if (var3 == var4) { + var9[var3] &= ~(var5 & var7); + } else { + var9[var3] &= ~var5; + + for (fromIndex = var3 + 1; fromIndex < var4; ++fromIndex) { + this.g[fromIndex] = 0L; + } + + var9[var4] &= ~var7; + } + + this.i(); + this.h(); + } + } + + } + + public void c(EncodeResult var1) { + if (this != var1) { + int var2 = Math.min(this.h, var1.h); + if (this.h < var1.h) { + this.k(var1.h); + this.h = var1.h; + } + + for (int var3 = 0; var3 < var2; ++var3) { + long[] var4 = this.g; + var4[var3] |= var1.g[var3]; + } + + if (var2 < var1.h) { + System.arraycopy(var1.g, var2, this.g, var2, this.h - var2); + } + + this.h(); + } + + } + + @NonNull + public Object clone() { + if (!this.i) { + this.j(); + } + + try { + EncodeResult var1 = (EncodeResult) super.clone(); + var1.g = this.g.clone(); + var1.h(); + return var1; + } catch (CloneNotSupportedException var2) { + throw new InternalError(); + } + } + + public int d() { + int var1; + if (this.h == 0) { + var1 = 0; + } else { + var1 = (this.h - 1) * 64 + (64 - Long.numberOfLeadingZeros(this.g[this.h - 1])); + } + + return var1; + } + + public EncodeResult d(int fromIndex, int toIndex) { + int var3 = 0; + checkIndex(fromIndex, toIndex); + this.h(); + int var4 = this.d(); + EncodeResult var5; + if (var4 > fromIndex && fromIndex != toIndex) { + int var6 = Math.min(toIndex, var4); + + var5 = new EncodeResult(var6 - fromIndex); + int var7 = i(var6 - fromIndex - 1) + 1; + var4 = i(fromIndex); + boolean var13; + var13 = (fromIndex & 63) == 0; + + long[] var8; + long var9; + while (var3 < var7 - 1) { + var8 = var5.g; + if (var13) { + var9 = this.g[var4]; + } else { + var9 = this.g[var4] >>> fromIndex | this.g[var4 + 1] << -fromIndex; + } + + var8[var3] = var9; + ++var3; + ++var4; + } + + var9 = -1L >>> -var6; + var8 = var5.g; + if ((var6 - 1 & 63) < (fromIndex & 63)) { + long var11 = this.g[var4]; + var9 = (var9 & this.g[var4 + 1]) << -fromIndex | var11 >>> fromIndex; + } else { + var9 = (var9 & this.g[var4]) >>> fromIndex; + } + + var8[var7 - 1] = var9; + var5.h = var7; + var5.i(); + var5.h(); + } else { + var5 = new EncodeResult(0); + } + + return var5; + } + + public void d(EncodeResult var1) { + int var2 = Math.min(this.h, var1.h); + if (this.h < var1.h) { + this.k(var1.h); + this.h = var1.h; + } + + for (int var3 = 0; var3 < var2; ++var3) { + long[] var4 = this.g; + var4[var3] ^= var1.g[var3]; + } + + if (var2 < var1.h) { + System.arraycopy(var1.g, var2, this.g, var2, var1.h - var2); + } + + this.i(); + this.h(); + } + + public boolean d(int var1) { + if (var1 < 0) { + throw new IndexOutOfBoundsException("bitIndex < 0: " + var1); + } else { + this.h(); + int var2 = i(var1); + boolean var3; + var3 = var2 < this.h && (this.g[var2] & 1L << var1) != 0L; + + return var3; + } + } + + public int e(int var1) { + byte var2 = -1; + if (var1 < 0) { + throw new IndexOutOfBoundsException("fromIndex < 0: " + var1); + } else { + this.h(); + int var3 = i(var1); + if (var3 >= this.h) { + var1 = var2; + } else { + long var4 = this.g[var3] & -1L << var1; + var1 = var3; + + while (true) { + if (var4 != 0L) { + var1 = var1 * 64 + Long.numberOfTrailingZeros(var4); + break; + } + + var3 = var1 + 1; + var1 = var2; + if (var3 == this.h) { + break; + } + + var4 = this.g[var3]; + var1 = var3; + } + } + + return var1; + } + } + + public void e(EncodeResult var1) { + for (int var2 = Math.min(this.h, var1.h) - 1; var2 >= 0; --var2) { + long[] var3 = this.g; + var3[var2] &= ~var1.g[var2]; + } + + this.i(); + this.h(); + } + + public boolean e() { + return this.h == 0; + } + + public boolean equals(Object var1) { + boolean var2 = false; + boolean var3; + if (!(var1 instanceof EncodeResult)) { + var3 = var2; + } else if (this == var1) { + var3 = true; + } else { + EncodeResult var5 = (EncodeResult) var1; + this.h(); + var5.h(); + var3 = var2; + if (this.h == var5.h) { + int var4 = 0; + + while (true) { + if (var4 >= this.h) { + var3 = true; + break; + } + + if (this.g[var4] != var5.g[var4]) { + break; + } + + ++var4; + } + } + } + + return var3; + } + + public int f() { + int var1 = 0; + + int var2; + for (var2 = 0; var1 < this.h; ++var1) { + var2 += Long.bitCount(this.g[var1]); + } + + return var2; + } + + public int f(int var1) { + if (var1 < 0) { + throw new IndexOutOfBoundsException("fromIndex < 0: " + var1); + } else { + this.h(); + int var2 = i(var1); + if (var2 < this.h) { + long var3 = ~this.g[var2] & -1L << var1; + + for (var1 = var2; var3 == 0L; var3 = ~this.g[var1]) { + ++var1; + if (var1 == this.h) { + var1 = this.h * 64; + return var1; + } + } + + var1 = var1 * 64 + Long.numberOfTrailingZeros(var3); + } + + return var1; + } + } + + public int h(int var1) { + int var2; + if (var1 < 0) { + if (var1 != -1) { + throw new IndexOutOfBoundsException("fromIndex < -1: " + var1); + } + + var2 = -1; + } else { + this.h(); + int var3 = i(var1); + var2 = var1; + if (var3 < this.h) { + long var4 = ~this.g[var3] & -1L >>> -(var1 + 1); + + for (var1 = var3; var4 == 0L; var1 = var2) { + var2 = var1 - 1; + if (var1 == 0) { + var2 = -1; + return var2; + } + + var4 = ~this.g[var2]; + } + + var2 = (var1 + 1) * 64 - 1 - Long.numberOfLeadingZeros(var4); + } + } + + return var2; + } + + public int hashCode() { + long var1 = 1234L; + int var3 = this.h; + + while (true) { + --var3; + if (var3 < 0) { + return (int) (var1 >> 32 ^ var1); + } + + var1 ^= this.g[var3] * (long) (var3 + 1); + } + } + + @NonNull + public String toString() { + this.h(); + int var1; + if (this.h > 128) { + var1 = this.f(); + } else { + var1 = this.h * 64; + } + + StringBuilder var2 = new StringBuilder(var1 * 6 + 2); + var2.append('{'); + var1 = this.e(0); + if (var1 != -1) { + var2.append(var1); + + int var4; + for (var1 = this.e(var1 + 1); var1 >= 0; var1 = this.e(var4 + 1)) { + int var3 = this.f(var1); + + do { + var2.append(", ").append(var1); + var4 = var1 + 1; + var1 = var4; + } while (var4 < var3); + } + } + + var2.append('}'); + return var2.toString(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/huanchengfly/tieba/post/utils/helios/HashResult.java b/app/src/main/java/com/huanchengfly/tieba/post/utils/helios/HashResult.java new file mode 100644 index 00000000..a682dbea --- /dev/null +++ b/app/src/main/java/com/huanchengfly/tieba/post/utils/helios/HashResult.java @@ -0,0 +1,38 @@ +package com.huanchengfly.tieba.post.utils.helios; + +class HashResult { + public static int BITS = 40; + private final EncodeResult mEncodeResult; + + public HashResult() { + this.mEncodeResult = new EncodeResult(BITS); + this.mEncodeResult.a(0, BITS, true); + } + + public void update(EncodeResult var1, int start, int length, int var4) { + EncodeResult var5 = this.mEncodeResult.d(start, start + length); + switch (var4) { + case 0: + var5.b(var1); + break; + case 2: + var5.e(var1); + break; + case 3: + var5.c(var1); + break; + case 1: + default: + var5.d(var1); + } + + for (var4 = 0; var4 < length; ++var4) { + this.mEncodeResult.a(start + var4, var5.d(var4)); + } + + } + + public byte[] getValue() { + return this.mEncodeResult.a(); + } +} diff --git a/app/src/main/java/com/huanchengfly/tieba/post/utils/helios/Hasher.java b/app/src/main/java/com/huanchengfly/tieba/post/utils/helios/Hasher.java new file mode 100644 index 00000000..2ab3a8e4 --- /dev/null +++ b/app/src/main/java/com/huanchengfly/tieba/post/utils/helios/Hasher.java @@ -0,0 +1,22 @@ +package com.huanchengfly.tieba.post.utils.helios; + +import java.util.Arrays; + +public class Hasher { + static IEncoder[] sEncoders = new IEncoder[]{new CRC32Encoder(8, 0), new XXHashEncoder(0, 1), new XXHashEncoder(1, 1), new CRC32Encoder(7, 1)}; + + public static byte[] hash(byte[] bytes) { + HashResult result = new HashResult(); + byte[] newBytes = ByteArrayUtils.copyArray(bytes, bytes.length + (sEncoders.length + 1) * 5); + ByteArrayUtils.copyArray(newBytes, result.getValue(), bytes.length); + + for (int i = 0; i < sEncoders.length; i++) { + IEncoder encoder = sEncoders[i]; + int len = bytes.length + (i + 1) * 5; + result.update(encoder.encode(newBytes, 0, len), encoder.getStart(), encoder.getLength(), encoder.getFlag()); + ByteArrayUtils.copyArray(newBytes, result.getValue(), len); + } + + return Arrays.copyOf(result.getValue(), 5); + } +} diff --git a/app/src/main/java/com/huanchengfly/tieba/post/utils/helios/IEncoder.java b/app/src/main/java/com/huanchengfly/tieba/post/utils/helios/IEncoder.java new file mode 100644 index 00000000..48b0a002 --- /dev/null +++ b/app/src/main/java/com/huanchengfly/tieba/post/utils/helios/IEncoder.java @@ -0,0 +1,24 @@ +package com.huanchengfly.tieba.post.utils.helios; + +abstract class IEncoder { + protected int length = 32; + protected int start; + protected int flag; + + IEncoder() { + } + + public int getStart() { + return this.start; + } + + public int getLength() { + return this.length; + } + + public int getFlag() { + return this.flag; + } + + public abstract EncodeResult encode(byte[] bytes, int off, int len); +} \ No newline at end of file diff --git a/app/src/main/java/com/huanchengfly/tieba/post/utils/helios/XXHash.java b/app/src/main/java/com/huanchengfly/tieba/post/utils/helios/XXHash.java new file mode 100644 index 00000000..42b5d506 --- /dev/null +++ b/app/src/main/java/com/huanchengfly/tieba/post/utils/helios/XXHash.java @@ -0,0 +1,117 @@ +package com.huanchengfly.tieba.post.utils.helios; + +class XXHash { + private final int[] i; + private final byte[] j; + private final int k; + private int l; + private int m; + + protected XXHash() { + this(0); + } + + protected XXHash(int var1) { + this.i = new int[4]; + this.j = new byte[16]; + this.k = var1; + this.c(); + } + + private static int a(byte[] var0, int var1) { + return (int) (j(var0, var1) & 4294967295L); + } + + private static long j(byte[] var0, int var1) { + if (4 > 8) { + throw new IllegalArgumentException("can't read more than eight bytes into a long value"); + } else { + long var3 = 0L; + + for (int var5 = 0; var5 < 4; ++var5) { + var3 |= ((long) var0[var1 + var5] & 255L) << var5 * 8; + } + + return var3; + } + } + + private void c() { + this.i[0] = this.k - 1640531535 - 2048144777; + this.i[1] = this.k - 2048144777; + this.i[2] = this.k; + this.i[3] = this.k + 1640531535; + } + + private void g(byte[] var1, int var2) { + int var3 = this.i[0]; + int var4 = this.i[1]; + int var5 = this.i[2]; + int var6 = this.i[3]; + var3 = Integer.rotateLeft(var3 + a(var1, var2) * -2048144777, 13); + var4 = Integer.rotateLeft(var4 + a(var1, var2 + 4) * -2048144777, 13); + var5 = Integer.rotateLeft(var5 + a(var1, var2 + 8) * -2048144777, 13); + var2 = Integer.rotateLeft(var6 + a(var1, var2 + 12) * -2048144777, 13); + this.i[0] = var3 * -1640531535; + this.i[1] = var4 * -1640531535; + this.i[2] = var5 * -1640531535; + this.i[3] = var2 * -1640531535; + this.m = 0; + } + + protected void update(byte[] var1, int var2, int var3) { + if (var3 > 0) { + this.l += var3; + int var4 = var2 + var3; + if (this.m + var3 < 16) { + System.arraycopy(var1, var2, this.j, this.m, var3); + this.m += var3; + } else { + var3 = var2; + if (this.m > 0) { + var3 = 16 - this.m; + System.arraycopy(var1, var2, this.j, this.m, var3); + this.g(this.j, 0); + var3 += var2; + } + + while (var3 <= var4 - 16) { + this.g(var1, var3); + var3 += 16; + } + + if (var3 < var4) { + this.m = var4 - var3; + System.arraycopy(var1, var3, this.j, 0, this.m); + } + } + } + + } + + protected long getValue() { + int var1; + if (this.l > 16) { + var1 = Integer.rotateLeft(this.i[0], 1) + Integer.rotateLeft(this.i[1], 7) + Integer.rotateLeft(this.i[2], 12) + Integer.rotateLeft(this.i[3], 18); + } else { + var1 = this.i[2] + 374761393; + } + + int var2 = this.l; + int var3 = this.m; + var2 += var1; + + for (var1 = 0; var1 <= var3 - 4; var1 += 4) { + var2 = Integer.rotateLeft(var2 + a(this.j, var1) * -1028477379, 17) * 668265263; + } + + while (var1 < this.m) { + var2 = Integer.rotateLeft((this.j[var1] & 255) * 374761393 + var2, 11) * -1640531535; + ++var1; + } + + var1 = (var2 >>> 15 ^ var2) * -2048144777; + var1 = (var1 ^ var1 >>> 13) * -1028477379; + return (long) (var1 ^ var1 >>> 16) & 4294967295L; + } +} diff --git a/app/src/main/java/com/huanchengfly/tieba/post/utils/helios/XXHashEncoder.java b/app/src/main/java/com/huanchengfly/tieba/post/utils/helios/XXHashEncoder.java new file mode 100644 index 00000000..ef1d17b3 --- /dev/null +++ b/app/src/main/java/com/huanchengfly/tieba/post/utils/helios/XXHashEncoder.java @@ -0,0 +1,16 @@ +package com.huanchengfly.tieba.post.utils.helios; + +final class XXHashEncoder extends IEncoder { + public XXHashEncoder(int start, int flag) { + this.length = 32; + this.start = start; + this.flag = flag; + } + + public EncodeResult encode(byte[] bytes, int off, int len) { + XXHash xxHash = new XXHash(); + xxHash.update(bytes, off, len); + return EncodeResult.a(new long[]{xxHash.getValue()}); + } +} +