From c16691952762d9b6cdc09f94abac347e0bd07866 Mon Sep 17 00:00:00 2001 From: Nezumi <123229563+Nez27@users.noreply.github.com> Date: Thu, 23 Mar 2023 21:26:31 +0700 Subject: [PATCH] Add Zalo payment method --- app/build.gradle | 2 + app/libs/zpdk-release-v3.1.aar | Bin 0 -> 72798 bytes app/src/main/AndroidManifest.xml | 12 +- .../Activity/OrderCheckOutActivity.java | 123 +++++++++++++++++- .../foodify/ZaloPay/Api/CreateOrder.java | 70 ++++++++++ .../foodify/ZaloPay/Api/HttpProvider.java | 58 +++++++++ .../foodify/ZaloPay/Constant/AppInfo.java | 7 + .../foodify/ZaloPay/Helper/HMac/HMacUtil.java | 93 +++++++++++++ .../ZaloPay/Helper/HMac/HexStringUtil.java | 69 ++++++++++ .../foodify/ZaloPay/Helper/Helpers.java | 35 +++++ 10 files changed, 467 insertions(+), 2 deletions(-) create mode 100644 app/libs/zpdk-release-v3.1.aar create mode 100644 app/src/main/java/com/capstone/foodify/ZaloPay/Api/CreateOrder.java create mode 100644 app/src/main/java/com/capstone/foodify/ZaloPay/Api/HttpProvider.java create mode 100644 app/src/main/java/com/capstone/foodify/ZaloPay/Constant/AppInfo.java create mode 100644 app/src/main/java/com/capstone/foodify/ZaloPay/Helper/HMac/HMacUtil.java create mode 100644 app/src/main/java/com/capstone/foodify/ZaloPay/Helper/HMac/HexStringUtil.java create mode 100644 app/src/main/java/com/capstone/foodify/ZaloPay/Helper/Helpers.java diff --git a/app/build.gradle b/app/build.gradle index 7a83652..8b521db 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -51,6 +51,7 @@ dependencies { implementation 'com.google.android.gms:play-services-auth:20.4.1' implementation 'com.google.android.gms:play-services-auth-api-phone:18.0.1' implementation 'com.google.android.gms:play-services-maps:18.1.0' + implementation files('libs/zpdk-release-v3.1.aar') testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' @@ -83,4 +84,5 @@ dependencies { //Firebase implementation platform('com.google.firebase:firebase-bom:31.2.3') implementation("com.squareup.okhttp3:okhttp:4.10.0") + } \ No newline at end of file diff --git a/app/libs/zpdk-release-v3.1.aar b/app/libs/zpdk-release-v3.1.aar new file mode 100644 index 0000000000000000000000000000000000000000..88d750531197dc5b489d45264c905b69796046a3 GIT binary patch literal 72798 zcmV)NK)1h8O9KQ7000OG0000%0Kpm}DTpcn08beK00jU508%b=cy#T3TXWnvvgZ5# z3jct4Q0ZptQI^_mNBE*+soOKLvB6*!QB^!#0;ICCmqeH-o9`nyDt+IVW2! zou=VcxtZ#&eOnIq^$%XcK%{<{*x_xt`Of?O*j5DS0ebUk&kl?LJl6jrllrEf9;fGq z1O(Ea%5@wONq%C#g5`(W^{uXUY@!iIKBg_1`TfxK_uWq#@UeWhCc%>OiM2+Bg3a* zATcE9Vd#XaxNFLB^a1{?*-s+zM?F2??K>_Y1E73mG;Eme>$2%~va-MPuIaFIw+eS$$;fZrXbixy)=Q zZ|ZUC?z%(Yu!+G;ruvSw8$CzC#G_{vltSnErCC|lM%awXtfn%3d^h=j)j zpIp9F&+yI9@z8DdZ1a8H{qhthl2{d(EgM*;pqakM+}`oEZPPVP*^hkr;u@!&?%B8* z>K>GyALq#)FT&!{?PkN=ri+ASd3e`!T!vg#BtfE+K6eA}S5Gojcj%g1(7@&7P978T zzTWK{{(oOh6of40H?G5cO?w#XLpeOtDfi{@-IMzGvz|8lr~UD;_Lq4$)RV7=V`C%I zKeSxK{pKnmC-GZ7?Qg}RHqy9{Y>T>UN&V{U%_W(uvmurYwfM|uDyR@&Yxtm0M#QG$ zYOHR{sT-s``zFG1^#0H5GjY+D|i=|7Hacz%!OXeF27ZfM!?wXEvn=u78|%9afS zs~*a#LULSD%WzeXeN#Sv={>_x`F1Vp;rni=|HXU9l^c~zR6?Zv$<2a#gNVw&!pkP4 zu;Es$;kbV*W#E6TM@km~q*9Q%n?MP@XIOk#RZpPTs4>^+9(!LWd8)t-+aDhJV!!&b zt!|a=X4{c|i*s8KBd^=Yn!06A-BZ{58nNwMA%Z9G%0t~eh1HrR61vx4vR_wEQ-NnXQF zA=Yfq6A60NRXZkEKmG&NTwrRQ>`hgTcGCD0ZyUM3((=bo?8 z2Ud>9fr0rV8VX}wH_mEx;4`|GGC&PoJDVmkyL&-mwYQ{UCDR@cY#?{;9bfghIe+V! zb-nCJIg3AcULSVxTAv;@(mmP#6V_O&H~#52SO;#TcI2Wl zh;5d?G&_yZRW`^obw}Z`gL+{(m1)#-LQRc~efL**6dp@3(?U*s3iWpOf;jkn_w#m? zTO*vJ^t6Wq#;4~gmhq8yV8gC6QniGUD=PGgqb83p$Dzsf=FdZq+lKy zpQ;sda1dau3vA$AJ@6E}J6jtn-Tq(M$XC!uuQ1Sf&x~`xP|-kN3Ar&0F}lYDQkMP4 z;I{1~tJe1HG_6Y@Lhr=F~g6kl!_@5kY8hetf; zUEPuiZ=F+NCmC55Mw-XEFjAk)!(=DT9e|it38|EjK7qsObvZ2lCvsg@NFrsb`*+>I zq^k7QL1BjSK%RCg3|^%sydH>09zoHMJ)=KuxWT}F*-wA)75ziIZTK?cJ5&21RzPG8 z{1n#Ktv-SdCVmn2>objkss=#s>R+sq2L7k=Kiz)Cn7R#M#G(++Mnb4u^uj{sF$1U^ zT%&r;M_t58$n(pB%UHn!j^AjzD{(JQaTB!GOW@XPr<3?!wM~B7mf-o zKehv^9KWNJ3{G{T11C8F+4n-2A|yg?M#yAg02lTeq%h*xFx)o|#Md8&=GdxJ#$cX7 ze58QHe8brdLVFmqUCpXU_6fAK;_8+!mm|w84YAS+%PSJ*IXVzuHdTGd?))ex zp`eWXgV{1Ts#c3pC{HiWmtkTZQ|mV`knWP|%ajKDvYr#y&5;$mfjt**&d%bXnpIJ3UKj^QPzQ;(Z0^czna$ z@nq{k*_l-$KF`^>s^}qkN{jbb2^`*hy<-0h&up<8~@S=7c69YEB!qH{wwKDx3h1Abu*>g7eez)%z*R$E;pb;WTg) zrq)lBr>@UnDqEC;)8%a8h(?`4nTI081?P7m!`2KZP@wlcgvtuBU9c)yPRRWn$rh@Q zMVX~HPSDbpRf;C1l(Q+vO(~}kYmcMo<`Iq;*f^1Lr#xr~t0 zp^#C{sDTMHUyY_Jd=RmZ3HU9zITw*O9hniV<_DRnTy*5I!<@hMN3sr$k{) zB>MyeQOsEztiAyZS3Z3Z&6>v1Qk$uO(J)?_G2#so!jOo=sij|sjzScgT)C(z zWg(@TPPMo(BZg8415p`pg-N8GWb;Zv_KwR)(?TvQGGw!lO8Wnce|a!MSVc?o6rzZy z5t>bALG`{4Vlmc;P`1iX3Wq~N35w7ydTsH;sk(qi5~?9Qil%*;QZJJ_H!6h)j$U`J zMNJ%KTldbX?*fosHhDwLUnJx|2i4zVD1Q}!`Ka{;T!_S8CScw)6R{2~v2 znFimpvVy42G;{-z7irJ~pWDZv$}q8f*6l^0LPR*f?x_Ze_1B|K%M-)M?9?%0YPJO2m%Y#1Dn@TKU+$r?^Lz_o*L(xBsfUf2k5+(> z2dsTCYHvJRaXTKoA#q+QrNBPXw6KS=7M|zhp*2n7AcgDfvS`Ii%n41EM^;JQEukY^ zevw!gsko&_d@*eN_5(!}inJVMw*@&|o2N(u*r&V-2@o|@)_Jl-Yj>cv*Ca58e)YFp z1HFT#6Zw4F)T0h-EqIlNvgo#3uJ_Xz)1J@Beb=}R*KpUzM!=p`p5knIPiztL-+|(5?@1XW) z#!*rNdUX{*t0`)Ai3P??WVei9b#$RT0>L zU)l%n;p&^5x~SJcVCR!qBdJRh&^i4G#*Z5M)pcO#4ctW{?($6xw=bJ*a^VIzUIPOh ztcD2r&FC;^Vd4vJ=h(TXtTJL*OSerqRNvXN_Md{V9Lyj~ ziy<%SGncY3UcP`QtTz3IUPN>kMkJFxCShn& zFT!Dcsz5u~Sk7R_ZH~hj&v%L1=5x5M8YYg9WC^r}2+{(&!oxe%mG~#SK$DnPq%=nJ zOEh?q0;PnN`i7>Y0h1hSE0)C2mc9d6w`iN<1W9%tdSFaZDj{j+)@2u3`Spo*BWo^E}VW$sWM^W8ZKb%zewO%`!N(>e~hAbzts7JPyK5^iS&^EO^>lT`6xF)7jK) z^kpP4uv(cfr1J!Lsp5y-7ohHXpH#vG**ZfX>#3ed?V|8)cwaot8T42Nzb7{e=gbOiFhEgzo zH6(=yN!lDq0taSrtE@M1kMH#3$-)(EJ#ZEMa^i%a!r_wnl<#a9Yn>-u)693hz^x*I z0L8-vWmnNp4SpGbTyN+OSc}KmalEjklc|Hys zq-=FmlJIAtlFWD@5cD5zC-KpqHb*U(JV=OWiGae;iWKk06>p>;~?|XyyUl7U3TmjSoK>SH64oULVM1u_)< zw3LhtRT^q7EHo^+XnXlLaMEjR1_?$oHV6@!2A@sA z50KpGJ`H4uaw=U?!9BRVYOLj&d_c9QD zm4^4&{6TyVA$dH%n#VE(V=c}6*NbLr<1Zn1s z(*RprXC;AMR#AB_>GZ>4tCj?|&%hHouyjtu|GBZCf)Mx{+~RN!W_PcWF}5!Vj1V-X2>y zixcr&AD5}vabItf`$OzIlflo21ZY379$pTPBh|7DG0t?dP(_AHlyOlRc-u!8$IHh# z1hG}lAPB#K7Y{*4Qor}=rhOHN1n;irGh(`1nOTMYtV?L=(H;~K1ba`c0ihk8Ufc{4 zTy|(&v{~Hty>kz308@OlTww~yH=DA|1?OC+9ssI)bqzNc4SsU$K#7Fg?~9Zs(Lisz zBs{foG@5E5$p|!4zq}0Z9SR@Ha`j}m*@zg1+c$HbhArN5TVa*WIL~9)Ud$BAUFpuW zIOkq2>3OYDq`U?x(#0vH%Pi7+WprebKFB-AvN-l<36dG7l_i|;@)MfHeBtmZRq$tI z-?*HT(I@c+;t7K)K})gFlOx*9MM%{(>$N*__;}6Bb*GSuEdw zDDIs1N%J#%c@8fa74v%#r|_2*#kraPq&)JMx4&RvQ(4IGDxSiGbU4Z`9;H(-u`jhi z&)NN^&KN{HPR-;=ZOSs{7?}q>!QcZ0>T2|eQSC)8dL@HneGfAYep)%?wkSxDJF*NK zxmOeTgl;wW0`SjfB3Ca59%&*%e%rH_o||4uq&qNP+;MMxL^94nUsDNCQoCDO%pg8- z>A|$*o;C4V{c94_d)Z=T^|i$e_4uFXtNb}NlfnY;f#qdNk3R_x7I20tiNZRY9Y9Lfrmhmd*NZD)L(YKzD-luYZQ{TBw z#Rmoz*DIteX>{?}HMQ6F4RD^yb$&sdM72H4qI#HOk(-Mkp}2!M9xFO7nfk@=9uG0I z3KHLbl}EejoslS~h?voT5}GOsGrI77DK*Y4JYW6GVuf~kB>Sb6KA}u<3xx>qkN6&< zDhr~W-Wt(P8QibSws?|JF{H5(_`~we z=Onybe)1Hz!^u$JE;B=kd#K5sLU2PqlaxG?)tThtPX=ai^7Q*h*9ll}U&F(3BIrQ9$mQ zFu=P5nqf(v!wA~v35-#Kl>!eyv@RAXmfuxMepjjaC5qwKsnHEj50fxRp=}W4;gQ4; zTh>9H8*Pwig{ZS`&Mea6alIxl9Q)l0V$RLw(S6@4I|KQSl>H^^+)O<7P6pZI#}Ba$ z{rjohWsaRBQ)_(&QwWV4sglcggI03*|KWuG}<|!-O>7+=f%pj)|Fa0%f zOD_*uIw6Ob*X8sMS?DL$B5$$I44QgTywrPP(FW-7dOL#F-|mz>@FHj#WzK0bUz0;M1&Ga``jgWK~l@} z8l2J2tmY+%T|%H+M!?D`;ceNGZKs5$`8nyMP9u|JU^2sBawA`|gI==ZU2%85ZLr^lz96q=G9m2yf< zNoqJrMkGmQ5XnjLBWWaJD|cGlNh0e7Wu|m{UaZQAVJfM#lS<7OnapLu!%bZrOsa5% zWH&H#!BE5#mJMasoG`;BGaS+rAcewoGDDkAjcOuzWC#g`SJ4;qXZB}$3o2w0e?d?#T}CiRLR{9Nl;hJed%Sl ztmwhix7M%dQDhDKA#1pzhfjSKctsD}o|p4Q%uC)0kK&^8S1WqJ;8w@m@sEC4J680N z0a$g)iXJR+73_*0AiloB4Vwp;+)OWyk3t8m=)r*-Dj(DrWmoi&@V$EX>YN^kb{<_} zubYA8UyN7Wk`>U%8ecvH>)?a zx>ZsDN_Ta(Iy+lm(CSWNi?XeTuCCPmyTxuOVMFqY(&;+BRfXvs20XYe;E>xZ59oP|F@1R1;{?mM8HZ)a@fnPQSRA~#pJPHIBAiqEgu!Fqv zc9^@%{I75?IdFATwNBB7yEIeo^%sDA9qDFNxAjz)&78#hR&}dgWy8leOY`>pr1jmn z)6N!lTwwz$FK2~l&wKIRYc%u-D=yA|lCT=Lc6W0wJ z86zEKFvh(Kv zw?%x7xV$WvpX=r4O?uOo0$$KSPbS-;JAA0ph1ipY_yCj~@MH=0WHWUi)HcWNa=jN8 zrvZ~8;1?bwU_Q{N4HixVdlPt zkD=17)o}Re>nDhUA)D$VpMnkcp<~SkyX8G=dSvrX#M4Y!O=qaJSfWI_eem? zpbN>Nl@;Ph06qCN2Cc4-@S!;`$_h+cWA(`1EHAH`?0_{zH!nnCvXv zJK-DCA4R>0NzOu4CB?*LAxLd`5t9?ONBAk^dHx8ADlH}|7Wu>YuIWTr$E%B&%y>e& zRFM&hS0N6umzehw4n2M4&2Ix8>37R4e;_HY2XtZihWbko-$#rDx z>m__&?S&$v4hNU=+;D00Qrzo^8~|HwY0bmn*AZc8j5u3W&4@TOcC@V`MWmr2q~LW# z3J9KjkL`6t9tg5rcV0)t1CiC_6%Odv5ow{w(h2=KA~`)Aj2m+QCL%Zj4}%DEO=^ud z5oxg~GPvYTL{fSkhpaZ~5i#jq5qT34kzskaM-d{jG3fAL1&>IB4PPeKn}{ITJSjYH zBI7^K0mQ0qkr5x|Nst8JM21^_HyKhKm()#U&?%zvQrb;K2-Fvs&6grnr6b~?hzcAL zg;A{L3LB9E`(Q#Sh9$KACL$9KSp}KAx`~K{pZ3VOO;Lf3a}yB{f-gktCL$^}cW$b> z*J5=R5gwavULZ8zPOv(Q$Pt~#lgc0>MNS6L?q$qYXAx1F^b&8ZbMw%x&LXlkvt_;i z7#hxr$(Rf?UqWgvN7z|R$Rt~%W3nah8+z9bOwLZ_-aCuQl;REL!Se8(MdS&-Z2O_z z!gt_@yQbtiU={O@s(t<(v%ZQsM;(H?pMmota$@qpIkXTXA|i?611oaP|5W}bbYjd& zig|S_co6|Hcw#Zt#YH3o(Nt*>5s@_groApJA|DP(l@t*UN&4KWd3}zL`R3P*jZj*A z2IHXM3-(|Za507L5YAOjP#qOB2S3fnau=&5xS_m4#bG)xvEP^Itj7mb{wPUs1v@|x z`%rnt`pFom;Sr4vCV<5*pzb1u zq0_$Jd~ad@fWw^MEzv8PZyzj75d!ltbke(VocP4>%|wE5$F0N>4H5x<$HdNqZ~E8{ zPrDEa?j!TXrW2e8uI9=e9ytOouR+EU!wVdK&1&%KVvh5>x|r9>t0fTd>SB%*ypoZE zxq||~mN;1`oE{H^RmN~S;ZKOY7N<&Vg8ldy7#l?X=6`{NU`*5ILtC+5fuRw2(PnoZ zc`(Ys7zg4ux`v>K^vxgK^k$BXx>_y5 zwpsw?<$|piz#@XH)!*jQRts%~gwCqsVsMFLP+4tP^g@ikBe@Hq|A7R}k7jzO=1Lg} z|2q;e68aA$XMX5TJypjOuFUyKBgD7Ly1VigAp9MPTmbwJ6s6+_Pjw?NAVFJD0uRBL zD{LlOX#3rX@@kPk9QBNdj(H!fmWA)OTW$$?Ojx+?Qg4LhUTdk``SPmI`D^|2teh42 z*=Ctj=Wmh}HZE@2O{h50+os-$_xMky-tFtAk_yJ1TY*e=gmD|7@P(iEw*NJr0PUxA z{2vc!%6UloC1-ca(a`x^FU~lyay$+UUgj3QN;vZ2eTQbAhYIhXsS}>@6@IDJ!|?Bo zlw%Rx?&CW0@HLGZg5?)5VB5?Ri#;GLJ1r{gS| z@p6Floi8W0U!a$&Ws3p{vyx(j8ylo+_P~r)bcYo$R9t0VYsB9l^in-k!CG9Y^whk z*+wzQGZgHA+fkm1;E>}PrVfO}6-DRRvuoTLp$*DKahxx2lwT~W=VDPO=bPo{qOs)5 zG65}Oy;8OpN0x8tizP5)UNZH|8@|?Cl-fQb_sJ^4%S#MKF=cPXF@R5C5zPtW_X)4X z`JvYDd&1sC1aEw;Pml$xhnL}o9}HUa*q0kHPnqzlZyGjVJs3DeaiB#nHy83%zR#Tw`*ypGpgnc{e0+y$W!#82?-8nUF)9}O;(XBp zE81Il@;h3_g?o$NZgUh<5Vh0;t`BU!y($6S_DA{NrmGG-;6wTA+p;n6W93~ouynhV z-UM}rLp=$UJJStR#kS?KnS{IdJ)qqAZD4nu$jzP91_BlzSWl|A&-XH8WLy~N#(z%Ze_DU_}#(A3z?Gyx{Lp^e@_ z6Yu`Og)??hBHj-zu_AayDs_|6BX%#%`eQtx&r!5H@?H;7e$Vh-j07n%uSJoe@V@#_4`ogV~e4hcn* zBu4OBXfe{qy8Vu3On@ZTEO*X?@M25l&K`=u&ERdh@k}9yU`Pj=Ne>^xe+$ zmSZ{JT3!Ad+#o?r8gDd;G~?P%Mv_DxbF*Hjo`tJ_(B8=<#aQ; z0Re$!AA4>(rhGg6e=&uZ=#8;&36p~6gD8L0Z=QXonJzoq9Tj=u6tT60#AO%jT#k2E zT}ImIQjHh~(lhPlEqHI}bpnS7!j|um9oNnV$v71}+ZreP=iX*68JNdNzJ~db@&%E~ za}_4RX!M=F{|``00|W{H00;;G002P%2Bk~$&j0`bu>k-86951JL2hJnZ)s#rVQy(= zWpi{ccx`NzkikyFFbsz8eTvBUB@78^s?zQukhq)H>!L1BiPH-9^mHW)NL;|T{P{oY zlkM@{U(`ZTT;K-w`T-Pi7kbA-19Lj<4sdKM>yh1wB&oH|QX}^go&bZ7D? zI_J6z-rzKvNMdpZm0D-QZp48aSXf{25+?l6(vP6pYWugdknGlEd)+4EwRim7k1xga z34T=)#(~n$*5d(`xvzekDLRt2a5meN1&sbnZS~g+58sNf`)$#`$-huH#5n3)$J4TA0xqSsOSx zxg?Cs0tvu}{vd+F_xtQT72}#N*$<}IMT6o503@D(Z4yzxjULloX5 z*5EPiV9H1+TVK}jGmR|0EOdX-yGY->#p#j(bjs&hSAY(9oO@%e52GJwW2hA%N}KX^ z?$oZ{sRR7K=ZHR`u9jV+6cHf+X~d7K z)R5GWzhebRhZN`wRqhs`R`}xqist=48m%qcyLVeFNyd zuhsCjR1w;&o?ES+)0z84S-H66jpL{D%Sf+eH_q~U`F(iKOzHi6KZE%TcrOMTxl6&G z9MU8AJ7mZ0+Gxw$Gek=vFcTs4(~A|!oBqNhzo z4`sv)snXVlIS@rlNXRzpV=@^`T@P@jE78~P>VU9eEScE4IBqee$=HSL@n=SL8D)9I zq)BQL?!qwymuTmDW$!6_YM8sVo20!)9v|CTiE!De*RUE!i7Zl(PUP}f9!lG3H%K)9 z=``uc@qs3*LaAb@L028OFP`vFO5X+vHT*4`Q~hN-wpfD^T8co3p}AN}&v;}wV_)h% zLnzB^bFrDZ7fZ1U*eD??${`J5z)pnfrW2H^^VGiiM=l^VyCI)})P^lxN z8Q}iN~l}PJ7Z!c6S>2rvy?mfrK@tE#krC_f)@m@e0NMi$odL$a8JLeb>F4-l0fTmrZ}+?QBW;j%|Ks4 z1h7>(U0u-uD>afZ7!nJQaj5Ek2&7e&TWQre&!Q;wA|p_0Nw`8-B6F4$xs8%LS%vz5 z2*s_gaG#b}^$x<3l6N?fF4b@?qh3N{*sQH=w{H(x*1uO4;gbM~@{F+h!C2CXG;{H1TE(QL9#v=YlqYA4ZP zIx=zS?jBV*(W@xF!n1GOg*KjogDtDGcV$N1c;Xis#vSc8s$ zSrYnJ>E)Pdeh_9r^_G(pdS`Bz3}d|oE> z^SpaPk29SDB_g|E-T)7JzeO}6S;PhUAU3U0f})Nf)5(of*^nW{PYT8@;FO$5Zow19NvxS|lilfE9kBKIZ z|B+Lxm38Eh1dw@@G+Ta0g#_a7gXvS*h@irYkViI&<6A&$?gpSWUcu7WZRxnR3V*6( zqSN!D=Y9757IKvCt z)7N^12F9vMuLYd}qKnWUcAB!}fRF7yj?h+7Cw)P0GTAuR-DdR8TZ}9j$gS>Wp&n&< zcG=lnuBejPQ^C|oZ98(LyK5bK6iP_^G(MFqfeN+pjHP$U0^)pB=^~lvoP@%> zKV7oNVM90l>E2qDdDdoT*d$(r9xo-7=<*x$XWqxmmFrBB&f!5cQyH97U0lk%SQ}C; zTKsN=l*&G(*BoEAFgfkUk1W`**Rjo_tK8hsW8f|t0EU>&SyV&H$*rtWjof^ZK%XQ9 zJrxa~HyN-;!8s+yBBKkY-y^6H5Uhb`6vZXl$TSE8@2(ww6z>i76`+gJRBL$)9%!entOHgH<`aGs4m!#KL-=4@a3& z%g1n!7kZ?UIb!tq1^Q1eW^X}5mi}_l_?HWb|1U0-3~Y@B?cDzr3ax*G;ybj3nmP&} zpEA6#WzJEHzssIQ9v`uam?nQ0IHLs^+S)Da4+WrK3MnZ((idRQYcb!bdrNh>KPb|R zf$409U5`_q+|IV&FZxgnB!f-Xd4Dd_YeLKXGT3g={ikBNUs8DyzR>CDL-BxF1uWh4 zy~(=bHP$tyN?B2pXJ(C5&@>e~J+n4pog1#ARA;twjLf7wtE-#KR+|(Mq3aZ9l01X( zkz_0A0}^y{>!r!g!w-rCR7;SvoP_ufj++_>lAw+%7%N;0W~b}q6Mqt)k403^q1_&w zw)-m+ok-3OLk#Ouwbjat2YvM5y$PCc)@$1jP~HlzPF}1XEu<<3Acm3lkV7KBQ&I#Y zjDz$dd2_|*>+g-XT|-(Rgv($g4@(d^x+}4PiJ*b+pw@9RpcxgM=%?b_Zc#v)4pNk5 zsVDH6a!!E50wdMU1)b_P>FF)^a7Umw&BVXMe$#iY&3By2t+m`75xad}%BMJmpMDXx zzO^70;%oDuqfbb($;B{`Z_(U1sHDfn2!G{HO^7Zew0D=hovoQCPpo`4W~DZECaXii z&6)2JV8U=W(8odmC!vL+2C;rPH!-llEhE0&zhGkSK`lwR)P0ewdr<$B{s1%x#1BlAx3!fUwM|_ z;6zV(rnhuVF`O%XjneOA-)5S8qB-wdWps8s_D*a`e7pSGW+g(etW0rO2Uae=0l)M{ zqhd}#LL)jIn7(h;GVx|3;9nw;l!8_pi;-3C0Zj}WJa+phI_IyAy%B%Wp$7#35d8l_ z=f5&jqI@BXqyYadYp1nxL`eRZnLz7F6M?%xc;rgqM9&Bn#JAQf+&g}+mOopB@1(qe ze#k|jz$0L{1<_6|%_NFK5Lr!5rti~iOgq`vwL6`BfYJxCusEf$Nc0=0$%=XwI7R4- z^aVr#5->`fi4(f3^waUwG>~WD?IUwJI<0IrRpyf{RA}zVStfH*9M>NMDU+~5hO*)a zQ%u6sOOQg;2b|djOjN{v+7w6aFPk%H?S_s}t`5V`!S`1E>bIJ&(A`xg_3{v#AKY|- zXu0aY!wUy_K#epcuT3IbZkz_D&DctwW@tN1KB|wnuvAAj@f4Jx(1jY(<^?{;LM`Ll6dGNBv~rnv$=p=XN=lb z@Sv@Q#E7|aAnOdmgfcXWEL3PTFO97b3sw0@S0Fgr4pZHd6r^tMV6zttvCT!$0)wu@ zIOppO$^f_8YYjpVF3g|!p0~@Ez{gL0*v;=6z%LJ@gig&v9h>_^U9Wsw0*8I_x@EgC zINN<(Esx1+s@U6U=O6SCi_IGFRc3it`m>?$(i8 z9lRBjd`DJ%R5fscgz;I5D!j6jMdjju4jJqD4!i6ki~|0|(R=jXuU4JxiB8IZwjh3G}>+JHUM8`=`+D-dLN4U;zMX2mt`7{<}i|Pep4& zXk(qE_`&@miXuR_zFdpN;R3{h$G5g78*xPh97uo(#0Tt`t%P3iA4Mgij0u-WT9U~c zk;uBVT`YF!5OZCuaogZYv<{SLlv(Fl-@5j(+vvXe=xN=!{D~12M0A91VPLxH+`jW0 zeeroXu-f?^*br{Y%hMFoc`OBsqZ>P*vG^{Q*L#%5>Aos(JC(wHXZ%VITX>5d50$y68XsX&aAO!ec`nZ3`twwoyFCSlp zT=P5!;pv6bJqQV4eUv&Chk-O%?#NrQ9cd1b9zi8 zpVcaP!g|&vQGO+O1%GZ@;M(DlHqc7$O||%(z&o{6{?=G6P>J2fSeHT)lY%qguT6ravX(7c_?Ld<-pRqCx zi)kUn7Gm|X+jZt8E=7FO1fs|3yOL%fy1@H8lU1?N!^APF&*8wDxMX-H(5Khb!sE$} ziNeFjOOnH?G*!JWI-M?-r3X7mcQBgEJ2Sf(UfySj9_9kJG>B$3U;lzVsfrFGtlA|g zv?7eLQOT3CP=>@gfE;5H@j!DTzGd;OK^DuRl&54sQe?B5?ARJ)D}p;X(pNUlgxdbh z0z(+TI8k)7Y`(&a}e@Q zLHCzZ%5;jws!B<}wgaHjC`xInW{#FBR?BV^fz6Dl%pMP9D}Q@2M`alk1e8NPw10&b zZ*Z-RCQIS$1b`lFr0*oFDGpP-^t7dFLH85Y8op&&Ljq!S&}pc9&2goe6$5dqvu>U+X5&u-n`=aZ`(79UJKHG@WuiyC0$caCbl$b4e+(i zI=W^gM$TvdTqsOf{o@Qw@Vm2rUvevDN@EhoEZzif3#1hixb=| z`aJbRT-B<9U8gR!J{W@uH!DqyI%%y;M;H-#g)a@pvkQmx(kDrN0`@D!RDqP|4$ytU z&{>bA@s^D`7-~-%cGp4I!*Zg$eT_o zzp)c}zNFSkot<$kdHR&B7tMfkA6PRf0Ar0oq=0#V=a3QY^#mhuVO^?m5OcygwGI$b z?hF=DhW(j!eo$#)Ng?7cT{t;?kgis%cT#R;q)?Kjr;K|D9(bwb9w*DlR0DxmTFO{D z2ol9$a$V=8*<9&C2o@!d5!-I{P4|KA@aoUZk8IBN`~% zt77y5m!)m-PJ!VK3Qggz%35HL(xEGZZAvf-&S92LQTO-M^_^7Y=x>Bip|Wz-NE@8( z|Dw#w7S^Us`{-w+YLkU73OzW zK7yOD?}g4oI~PLqDDkDF6(bV^dg!n)aQl6Bel2Wsb$)riUUqNvX^_H4D2+u6wi;jU+NIs-aBVn8hmCDDs?A(_9&bXmk!oTeRq?qh)SUJyV;KF83jd zm>JTzewp5sZks+|?Qp4fD-V8R$T6J8L$p%rLWRwDA#DQLoXpXr9kWSZq@khLH z*M@4(jnQiju2@lG_Ym_I49o$PCPkC|;&#Gk_gsrvULtcQpU7$_5=kH-`5vroB#|U& zJOg8ITM@KViApYGz|e=DnGrPtbZ}nZe3K9Tau!v({km-r!7r729kGk{QpIc|O8iOW zcaW2vLR=&{hSb3fbI?Rc)xo_CTowd<<1Z;GKC_fw{qnQIqsA)U)#@WbpAaNk{@*et zQwB~`;n}ihn7ixR;e6L&rJKJlGi<3cCXZrB6tlf6P>a|fpbF7=~#{a+(s64YIS^Tgh zqn7`PmkYB89W};Lo2MGXon0333TnR5cKj{)`gpOJ`H+$CQs)e5O#X21W9g2m)hYY{ z*$Ib+4L)+nUw0uH`icXzy$;atlc5Z0pax+1)a1i%#5v!fn6zAC%3-GZ$G87kuZ6j$ z%Y3VO0mEt?{D`z3n@_r^ielU<1s_2ZU@J7$F;#iLcy>uul$TrMd$NCzF==v7+qW6Z z_e!VExovHE!Lt$#h3i9sIB|Aonx@P%=qSk+A07QN?p;i@P*E-+mZHlJzvxsnfAxWl@~{QIoVJ3 zNDaYoTSV4UMxkPc5cPgsbV!lU;1?iRePCs)!=L#*es%d~j^$}&HI4HDIUI&FWeF{d zROvYh!pi*aC44peIT**6kxta!hev$VY+x5iD$3jKP1lUdjZ|?B!WY77uOMxkZMJZ| z<_zlH_K3<`YeKXuLbffzr={qgt;cvC)5d(bxj|vpCvag#U)&NnQ;<7il?`lK&t5^? z8$u7-g_f4p2)&|A&?lM7>f%r=%3g67siyDcXF8>?sP?_k&D+q=+q81tU;(w!izbHz zOfqcGMM9eviyOqPHgPS|F1z`aaaOxgll2yHHl4yOFYRH%);3fNu~-^p9w;Te(yKmU zXl0NN#ii=oB|lS559Y(Ob+2lu;{q zzzpV_Ml4sQnsiBxOwB-aCRp#OKyHPQiv=uQ0PxC0xo?O$qKS6aE-TQpxWaOj?#|;_DIyOFiACdV{WR0Y23h5OqDKxo8TCnEyEI;s&mk zA*>_2hT>UFiU`?W7>vX`6aqczZnExBcf;r;GH#xYQWWK4Y}~sX=AV) zK6g`Z@H^g)GIp)js73f^PRrT&o)HJf(yndLitIiI=?ccpk0r-q3>WQ|2}UtJ2!v&vh;-ys?b_#A50lec|~) zeAmnxcs+kkp!m(hbDY(L+-@R1C=1KG7q4E~zzg%V2Z}VMrRV~snEMl}y#I9a5o2`9 z&cE!I^8q!-KO;!!s&*d!To>HeJ1LaP0tkobw2f>BQ-mtpP9)XbI%4GE3L<(t%TA`y zg>l2OtyaKBukfQp6>a?+!u*RGa+M6>Vpd@5#9**YzFe1IR44dFkJ^4aqifhq|IW-N zs_Yajp%LX#=v3u_htIn6!RgVXtj0^ftnDGt$gI3*X(pDCi!1U{_`=6r;C zb@=zC`+qNn6-}I79BqZ{j7|RY?0lvha)2HgWY?*>|w81^kg<9nACJmKY!a z0Pg>>>rT!Fw$4uf(NmT9e%S$j_|PAL5)_aC_qkVCEtXAg8*!50b=&g9QIt zf|3aC%zwWlU<*TuYs$DI{hh)0aQF5MtMA_v(h>r@_Zr|8u=}ETyB8d%efEHrHurK| zsVH0OydQkTxIB(hz%%8dK&dmM+!ASnjo{h*nYSXEW{|ArmM2adoZY@? zkNwK(8LXOKo2uZQW6DtQ(AcW~q%t5;lG8kKAL8i}S!QX~7$P9M5pP0i25gh8#4=XEkiMh_S#J^bAJlwMPMPr*G&Hh>g*9-7Z zk9|Gg!9V@=7VTdf%fEU|#Mafq(azS!#MYVkfBRQ8aI`Qmv^M!qN9HJQ*e>$J^JG=o zNMi|VNwznYP{;tSLEM507OEt`D?}hGM~ucCfVR%q8gr>ms-ZwA|3bv;6C*H{5f8MC zkEEWSnabtxGUeX!^L_)}WjN=&S7#dgP31J|9~(o+s!~_5R})%ISP30<(@wYXdH80( zc07Y{)9K~C%b2Vc#(mr}E3$Jf96Z8AKb}?>AbZI zbMr1y@7&fq3oJK$U`*?I5&{j?N%#yz0a_F8OGIwdgFFD^>Wv#pY29LIKxHB1YZ%r| z^0N@KH-VKls%P}Jw3=Wgj;l3^&Nl1^_wKE#+RO-*UE?})$x`Vk0u>Nh;#c-R*y zvV*C{NS!06Y0xSmS?a0h2B$-2sQ&hmq+S%WXhBv%QIg&TonUVA1iRq9x zKB?auNO9aHc`UORpe+!D6K46k%{^=Gyyg+*t<{XYt1>MrukXAJDVM`|+&0iP_p=%z zPjsi5VduX0wTZdMOW7yy6YS(o60=6`)t1zn|C*_xY#iRylju+qlQAi@D*^u-drhpa zqOK`mOA>Qx*VRzXfyE+iUIxSjo$tSpXa5YLst*hRAPx3^yrJ{IY3DyBqpYKZqyf*9 zCe3JojV}y6QTQ5=DNG`u;1(hRUnnY=NGSfMV6tqIJ{>DdTH&oy&u8v)XMpCaW=TVn z_oa}!m6k6cM4b`lRd(Z?$LrH^;`{pg!v&x;_98ea1I%}ThEv38i-A7Gj5l+8Pes@0 z?YhB_?j(SH;Io~7z$F0PSl`DR#i_`74GCS+RjNeeMY2&;ZGgWuoBu(j$ zN`Uwo#PH$Kv3E&g+6t6LQ)7cMR4~)5i4v*y846N}=ki@-G-D5Io<}+*c((UCk6u2- z7HAT7)JV@kB~3CL`5yns-KBL=ldYOsyY56Oy<;x~anVjggo_xA*+i=I%a9d;Wp3q_ z`+N#zVHa6Pt;Lh zB&o4XIC69I<= zS*Afntc8Y4O`A_kMv8b&;Rnv?2VC<+fm)HyFDbC;CEOunMh-TKv{ihakneV+O%VTQ zgKYzQKXW*zDE~R|)--FJZuSVJe5kt@s1f3O9*@++u+He5=!Vkz}~<+f?tFO z|2954a%TmnFDy~`p4v8eJ-hjOu|oCw{=7oy!&dQ1ztU6i4<*CRn@U638;J5F<=&TR zY)`%2K|cWH9)!R_L0^BRtp3$xgfoFilwt+Ej76n3~f1nBKH?Zjr1f#3m)&{7o=sQ?>^_T-I(2~PWeFPi z=0Sq+mgI%vsk0VmTT1HnvyahA$MI1km@?z!x<$4=sADH=IBH0AoP!d!_a z>w^9mj-2RtMM_K3R)PnfCiJJweFy07*2s+Vv0-W)V_jPMCaIF&m1BR*MUtYrW(Ya$ z^ICS@fs`i)yPIhc=n#+)1l5Pg_q#M64J3vbb>Hd+%n*ZnY-Cd%GlHTe-8ih>n7qg6 zkLeY-5VwuP*^tlNF}>Rj%&)V1L=zoxihtYfup(5g$M&17K`w)S-yj%<(w2y;jfLp` znv+zkknww%^WwVJxDoJ)g^gI3#f(s#Eq@X28T?X#J1bnNf@>+v(wqn9hr^Zk6Y1l1 za!4%HS!(^obG2>d&W8ow8VmneA$#uSES-iB={q3k=NS$N#Ix{M*<^5;hs+?IKQh-v zzWiixm<8wqMoF8sH}|Arleq^GCcP%>Py%u}$U?V9Yov7Q_kzt`dSE+acXo+u69v)bo+=M7PAUH!u9t zAhO#!Kgy4KM1`=4L3tAHtmGpycfPw>L=#=!FIlah3r*-UpR?VGx}}6`5Wzi1$imUv zLwiBnC8T!Nx`0#N`tD)Vx78k9IFi>7v=eM9$8?KIaGfY!aO@-d&N@@yk$!6ROVydB zu6{rRRy&TMDt|b;8!bL)Y@BYgPRKz+h!~`S&0O()5$p4iv852h%^S?7s zB@;(i3nLQ=8++^jz^z#wLL2)C<;Sm%ev&@em;gPo9D=}@pbs&rJcM`xr4bNy0?5KJ z1-26jy^*VPW~OjRbJkqW2FuI*W^ucE1%RQtyLnx+>UnP4?aJh4vgO>Xad3cE3g~!s zhwiQCMdzmbr}LNwj>qf92cRW_6r-D+@_@BVVkGMh6+_6~3IV81X9UMRD>~}VRktT7 z%x%IQZF_pjEAmdaOK#x9BzYJ3^E8NibDW!ZXerF&HC$Sak8;n5QFZ^|^AHJYVDO8Z8-K5gv1QjBq2DW>ftUEe>eZ70cZALT24VYyR4I<}30)~}@)fm* z=78&!mM(8Mh|I(rZYS*)n9cWeB+mWmfRJ%E$hs&j{T)Jy&*WU86xZn70XKK|C<)P* zbngVwmp~rfCT8@@0B{eDJf?*NsiS}d(W^;Zn+fE+V-#k`fCVwC3aLlz(+S?Q#?@vLFQc|a|vS|H9ebVPX&((+TENEdS=P7l^^KL$Uq)NE)ra-s@&H|ee?kU9i%rX>d-<>sbd+Qua(MNR#q z%WFWOO{-tk=@Mskt_IB-<0=`m?8&COH7(f<^R*$&KH64lL9cC$- zrTTeZGW@ZlNv7jlw9MG69F>ieAbq2DBwo7%`F1Tp{D$(7p$&V3`5wmg z+)rvDVRuU)b)$VD{FH9pK7|C}ff2te_y>D`RXVQ1jN-YT>3jUB-a>yD?eWB&`~(Rdqj?*(Nzcid_ zh*CnC(y&>bD55!%T`9XHyz$K#heP?dS!HAeOt?g$CIXg73^D5+a4n(bS-Q3Wd3+l#-H?k6OZQQB6hc2=t2cQ{Md_Q2P=&Vj-;wkC*ibvSnIPhX3u4@c<)hpfpv8G zN`E>A&S6SlgTgdsp&h1AJn$nR8ade+hi6n`uqnu3SauZREX=d)4&a5F&I+ zryCCpcsqvb;Wg8lm8__2g|;Z=>?R}gB%As9<6P%j9>Qg=#|_7Em+p@tCsF4Hu^eZw zrK{qiFDEY*i7FW5yJAQ@ENM9uc5?t*c5%QMiisrQfk!`h6yn-55M$x+bw}z-xYT-z zCb@+IDl^@ZZ*C=vDQgs))it|eV~fdSVH7LBDV+Va1hoBvYFj+NmFSwQek`^|+ky7v z92&2yR(*!1Ms7)lQXKL$cmlzn{1aQGa*bqf+pdN+mjyT^Ceva}SrNI%c{dh}hRbyk zlXw5V5UI0qr!qwiLuyx%N~6*S&b`MT6sAsBA?_3YKUX)G*XXua7g*13@eHDi5#pF{ zX1v!e@HN;)**6Pqm=c!VU=cQ@7CBhjnM|50hNyCg#}C~PTuX0U%@3_(EEGI&k1%kL zt)PK}z}-4IfRK~(m)3d-9q5;*n7HScaPMAcs^jLzVTK;(Gyc70PVDS+>x*e`N7?!1 zQHW*o3(Vsnz>irCVsXN+vp~kl-H!p8-J3WEeH0JZIaMrnEycsopj;neT6E{o&~rCy zA&jNV1nirqgILA)l9dg3#+^Q`URYdSs1HU=4{RYgs1!Qup8>FbyM^t?Sy{{Gf&ks{ zr$JD-wpD8s`;2y^$E}2YyO($&YB7PQ3$~RS&&J(OH@i> zesc-7^Ef>!jc>lc*SI0xe8*f~@?QbluJjpfG-2T%c9#kJn#dj^NeTI)t8t9w;iFRjzWB9rlP9Q>-`{AE z$k+$kJ+CCh98mLYU1*>;NZd7DBe}|KnFUp<;Kr4TAP$F7^eu~3TNW_(XHI$#C*L8y z4z>XHgPdP4@PQm+!=6E7H<81=bHTmy)=}H$;L4HvN|Z}Cz$)Ahr{qs_(+Qz$l>?3f zh%0*<;f+R5)ilJ6uBC1da;r_*C^> zapUVm@rP~-vYk@v9*2FexBa){J3aVp&L?mlliNYEx)8$S?A-Ux`jp7U77J^>Sf_{j zIM$h>n1{tGwE0SoZp)03Sc^;PTDSQ#kcwqy+Q%l3^>HwqM&5FP1RdP1Vo4H`D^kgg zE8`>C$anmZd-%6U#Rbn5x!Y`nJ08+g9@s zH?gdLx)T;+2RY){w?)fRl6~E7Ke_)oA1+3z14RV^0N{WI03iO?`LMi!$G`0b{j>6? zSyf93Sq%AmUBpyFtRDt(*a}(#RTV>?nS8`JL_{^sBn1R$M89!ke{8NXBZI`yux4aa zDMd{0A+b{Vh=4-Gu<{-_F)!g0s!EZAhl`xnt*Sw5(dYefb%*2c_h{A+?;9{5cxPFk zPqwm93Z;yY-G7ykJ!X}q3qh1H&@wwBAB#s)Qgkjtmm~*fdETAmi9$zmu$_KJEMByi zl2MW)-@T!-Ek6@&5FMJRY^VSe+Nc=R&X75}o~A9hm05e`wk6a7)F)I+hWjRisg!MU zF8;V-cg?hacepSC{80zmAcV?3j)}R%tk@w*%QayZ)7D@jy#;E(F@`!X2X)~>jRsTU zN{4Bylr_{RQmG6DW62rB-r;Mo zNT&JvjFVM5SE(h~1mzL$Fd0dSeFx2TM_?wHs!Lr(jwzC(Wa30RqlS%SoF|4WuPcw; z2PM&wTJR3%>D{L?A022YQIPBSc$Ds<+ZDz4%7u3*YCbE)L+VwgV}qXi>SbUk6(>8X zb62#QGxksvXXb5UEc!ajp$jsl*&{-Gn06L8PJt`c%1FVULWwg)& zS&-Sfwrpll(wZplb{wC=4)w$a>>r*g1P1f{(6KabpxkI1a=cl4HExNKcgVSTGtFc@ zg+&}9nm^JKs|TqhkkFl~^h?|$bwsJYj1dB}1;w{-SX8e`jw8<296B>25_=$~=0$`0=RX_!abc2s7(%fUr7Vt} zqkK*K^(0$WZP>>lg0;hB79y^riWlixotas#rN){dDa1xrQw{A6A7?O0PUK6-%lh$| z0!n>bC3{+-GiEq5bvhx%hC-&PI&)^O39MJah!~uPSY;Z>%S4owK~^SHp)loN^;<`3 zAUR#JY3|-{E<>r*&aIVp?mAQ^{)Lq^H-AL1T>F2DCVmQF-g~zw{-wvXCjLa){+Id8Y1SujY-*Z$4p0=fZOl30}7Iho|EIxEp?CSEp=bC(Odp7(!;y&G!iSywYM*A-=A1*h&IMh1$xi|+f9)3? zD61l2itoaw!0-z3zzzaaQ^2TLy z2#fA7jU)T_%yG9&3E)MDwayr9gr8@K**Je-7ZL$VQykxJa<@wwg&U8?wJ9CjwMA`< zeD(wEd+R#T#$Ra%T@C@+uS)V;GJi*IMSkEu3%`7a`l!e&K)xw-h}Q#no}%OsSD<;> zry4GVsU;9zaX{~J(=HmlL%yG7Bn5;4Zi=Gr902*|&+{3;^AUxG1%F22F8LWP#k~UV z*OJ8&u}j`P*>lH}_w-Xb0?5ovn_KQaX3J)~W;XMoa(kjdt!6qBDl7kx?<{X*;f z2L5MWwQTwQQ-l77I zA1RMqusbF#HV*{X#lB$*rno>%Nu(^nS*}Kx^QfcZ8T?yo;D&3ous&(G(!RMf?*g1 zHGH&sQ40xOAsBMwIDNR1s`{uixIV$ad}K5E(0*iR-$;sH=oD)58i#?okO32Fzr8Y^ zMUI~8u3MEF+&Lmu8b5x?$i~)YCH^sn@!Sd%S75csp!&95X?4-uV7Io?VMVG2C{9G-5SrIk7tv;Xa94KInUsu0D-vAtxMVDQlo zH@eOGqvv4SQs7lx#oSK2dfz-%VV#AilTkx~zQ_=j1H~y{Rm3`NUwMkCVmBfZgj$iP z+rK)JJ2CNN-E^CIf{RLuGBsX#J}3*iNNv|WQ)5y??dIrZWX=i0U-Y7OX5In&+S7Sh z=&TXgt7RTKrXT$`SIcld_QN?Z7jh6;5mI%JJ+S&H2zn^%HT%GV-b!$1>x7OjN{{nw z-rzYTx7@O7<&!{RjdIk$L-_|4=lkgv>FGSvCO=dnv668JJgJ|!EUHIMl36yjC}XAx z7`P8O{nY|&*Up?km8O_{sqI*trw_7?JZn2!BBY<7G2VP~;#c?@FQ$@%VvU3dNl8Sq z4|6Y{><(1O%1!t#Sms^Q1UBN49(um@;2|Fcmm=K;&>Ldx#7sPNLbNel-^|ITE*Q2` zto-|ifV!VQ9zWXn_bzYfd<45fr5{8CUhokeU69!6C(J()pfG0|EcuH7^Irrw|9c4h zUn+odlx_a%AKtg7sW_P5LVz+bysJe;T;aE%LNSP#DQ6_=YaiN4J{x={DT4&YdF=uQ z7&hN4@TWqo7X`36AjZR<>r4Aq_lfJv{ln@D9>8&3Wg*M~rD3`}J&K5=2qs25clf>m zn2l^zdH}A7DrTbscjA5huM=c$gK*T;$tpb7oiudB65zkff+Q_3&p&Q3R&=v-Dor%A zC#k)|(;fQedd$>=e*JT)l6DNiQLZ6#>f?1oS)MjxZCKu;$c!1?lhZWUm?I#e9Qz@`CUr1~=VQkK|ipvz0q|`sn zf3+X0mk_Eh=2|>4mnE5IzR?^LX$zr8R@N0*25nSvp)`AZbR{UJ5t`uV!B}q6d3_zJ zCTjn{_iSb?!}3@tNBe@zZIu3zr-hKR)!U2Sig}R9U>j9_|GcsIiA8SKoajm+h+FV^gdl3GbQF_OJSHzU3 zdhYf~#0b4(CV=$3wq@SsulAL9B9t$(TU;{=h|&XOMqAL6nRJ7ykr;e=*{+&fZFf_< z2Eq#BxMJ%lZ_Wp7emkYD2Gi}8NU3l6pM*4~XgWofQ#Ci-au2qwP@)%{U>3E`*kkd8 zCrQVn2&Ui0V^ay*A|#STC0NhaAqDsR;{94kC5IxC=vaBomkx@@dwOSH&$o88qeS=) z9b;HWl02p=96c2;FLss`Au5SVHgfjkmEwaAS*QxHlXYf-kyr^qSczdk9VFg68I@&; zy9)3IEgPLl`Zw{*_R*ef?l`j_U>8Jg!VQQ5|1fM4a9}POAp*-sC_WGYjfEWL(Z-yh zzy25T?^?JFRQ(k{94G()(|=F=|5f!V$vd)00>~r16dSZUXqpOu2nc}9G=8Y?BELuk znG=->DiX)GT5@&=T>q_z=asYvL>E1pnAcx!H%0d}M7M%YpSw{<>sRDlv6HFU%-dD= zP4*wS-kokR`Tz}>GWueHQTc4sK}Yn2paKJABgz^pc?Y3k85jo(yNYzf@D$W7LN|={ z2CL&xi?vd97RMf|h-C}V=42;I+W;o>66_c5Ndzbn$jtiSqa71-$&xgTWREg&+KAsI zuLqJ8vs+}Q+sBD#$kJYaoN3;$X(_**CXK{vlB-FaE-I|1Rj9ex1AFj)xt-W7KCpYB z|A8^+Vzw!>w#CqO*usB7MEe%9O>5_>f(D5^+Cq{*YC?>u zE4+tH68OvlIut73K6Z@fGT;?Eo_>ct0dy|OO}MZr=uSRGqYl(+;E^2iBL{zz+Lk3a z%9b-~M7KM;GzY+kU|lWD|Dfz0!#w$#Ez#<#`ju_lHo9!vwry8;*|u%lc9(72wr;;O z@62=0|C}>-?uUGy9Xmhm%oUNb*Ung>&qH`Iw_AJiV};${#}4Q`i2=|W$?It=$_FNR z(#5ZmdrxavlY1@bGweFk*%i^6Y5v&K2$sz!KAcndMXwD>)sG}GstW6%WK5j*aAAL1 zQBom=F9LN+K!f}OpPyijk5c}|@e>7B&5t3*;q7Hy?u~;i@ADu37?2ik=zt*t0SS@= z0TKOwVE^AcN=-;_lw+4)@VE_{uxOfe& z&y1dYmbt#JU!rrmZ!1!KBSP73)Syb^y03?i!S7!4SbmW##B3@H*R-9wya};?B7P3a zh@Hl4J^+16{P?8&ToC!CD*j9M*KU4~@=49c!}0?=)MpjUXI8{l_wVpieB&WLs7E=$ z&j$Nf^gQ3jzZ^@kfZB# zOZ9PQiLOWA^Y>Q4jV8OxEH=|uuzi=nE)+YUO>vis{c+9;@bFU&M5mhaK(jibSS|fg zkQJgyw)D|l)z?`2t*CdXObzxk_mk z-B!`fB-DFaGTdOl&YC+vvmjS~i09re?wCDE;YgZtkHN|9QE0OG31pBPGi}4M>rg@7 zK`dr8meM@x)<9z~-n8-F)!ifflk+>c7j`PQ4R|BtB=&41qFrxfNK{;v^nFHwX#WCC zgIWa1;{@t?=5V#Fg;1UXgB>)v^d`d6qK#4Tb1hofaHE4Ak@F0;Lokx=#CfEUuO-tU z4HoQhQ(i#qYJQrg<~iG-jOOZa8V;*aL}bP;p&f)(CneYpZ#j1H4W-+XApci$Eh1YB z^P-A&kYQ4nblc=C0t~$+G`6RhqjL@(yyZJl`wlAZ98s4hH;qjR^YRA1EJIZ$<>2g@ zDGyS^gM-MNIOQ9m4~2!HgOLa}4sJ}akS;CS{oBq^T`gy~3t5ALIf{h4n>l2cj<}Q@ zSile_oiz_j;Rp$gaQacLp=P`es8aS&lEtD)QJlfvf0KJP$idisPc1TSS2(wI687CT~nnSq_y!il&jXimQmQgOFB%unVf zJskw;fp#WnP{5e`AQ&`Z1vapFsTO?D{#)$od=$*MM7TO@av#Jj(5hii6*g5!(fX0b zm{XA^%FlSM%3goTkX$v> zFk^}&Cx=g!S|-6L3Pu>cxiIKt)3&PMPj?x4l7c$6{Kpzhpdf5*%poX}mzS5BaWjWp zJ!wBCMc+Gx9`7t-r`suIu!Ix*#?2L9UD;9-3tfmP?Kv~H6|IYeE71{o)F}5Pe@H{F z5(qwN(;7P2-d*vtVB*iY1y^l4VU_$0BTm|qa;tDopDK0E)>S<9dH9i(U4pLM9%84^ zs&xnij(Vlgmh!IbOa5HJ-Rp(gt#Y{j;!2ju1g_$XP8_FNELcX9Nx>{{KAwMDZ-4`g z^!~#JH(H1}L1@>93U{Bdcrj%}_AnNL<_Wv5kdml>I28>tIp^u{1Q()d>~0)|fIwu$0#9P=oQ=c}Z6;TqrS>=v!Q< z5f$0mGROFkwCaut*YZ1z?XtP?2gxJVRsUgrh8Y}4c-)7UQg3l-Z1jph^;(Nn8Dp)4 z;1o&l%)PBrWb|&L#Yg8K`kQ0aFMrTYbd|4onCp~XCBdv@VJ&8}BD@nzTp^6zPI>j7Znz9- zA0401pGngKxhngDgbS+GysrOjCp&LaoZ3 z*QoL&@(J}YSM4{4x40OVb}wi`nxou>n(mqZTqC9}wi0!2K*y%mp7W~+)=sa-3p*xv zW=8mVB5iV3I_fCu#bt>ejLfC9UK(@&MD+&a3-aVs&WaZUT(XhH%XfuY#9U-L1-$=< znpX-as&v=0?uG(Y}M6hy=s*#^W{|pN`pRQ$+9OyN zW-#^Cq*HB zThPKjemUiqLBY6%d5buF-fz1SQ|M>3oHViA+{Pj+R%?BmQgt~*^S6H5q;Rk{#E5V)F8>G zbf09+pJJj;5N3+&av7iWW4=G!TJv~EcUU<|gd?B(J!596P3UKo#nU3)i~UGz*+5ns zYLb_menPzvYihNz6!p{9jaf}U*JqUtZ9sQ*wSd(ChJ+o)ihj|QwAWeP)`Te~Tg&^r zCtbY=tTQZFhYzk_pZ;;SYM}4z=tNY}N;U;$oNVkX@w^;5^aZEDFRycbf)lIjbl(lE z5#OkKZEoWcR|f9#mJnh@55f?gjvuoN2hFAYjkShu#Y=N-thB}CGiy92>x)#7?JHOP zmvkrBH-N)x@CSl%$+198wn{VAoQ;l+rHB+4WwSMB)FA3l7;=?y=0jp^&fA5LxKq@1 zf#viatLBAx3usYO)Gd@w0livs{Y@oYcjo2<5hWs!DnI^kt=Z8B8^5!%xbRR)S&zm@ zxOv1GH^f=)yS&e<$S1bO?S$DaNjwjiAD3~*XdhD}-_JAPjQc{lPl|A+h_qEd#a>ks z3Z>(%{GoIUH_Fe@!{oH2c_XipLdnW=wKaw4G^K`=!@8;7LRn4ga%1MYgwY-uLybS) z9onbS2C)vcaAcK#Wo;}XANa;fR!kw~?psZHEL6NENvgK!UJ_+z9(~Bipg9UT1+2KwI5oNEN&P2aDUHi{PvH6 zl0J^qyvh&N5Jl^IpZF!VKo?gMnFN}AivA!sGLcr2Y$K}rdmN8t2<_<7Yiln-ff@+u zSzPTeFjxT=8qg*9E60OuKRJsM8hHt*rjD-b$?Zl-Z>(gwpBCpZGHIXb;Dc)5XNwnSojucryY zbHuu{`~quc-cM1Dx7=b~_(ZloVZL5DO?xDs9SM;{h=_t$G=-^_c%dd$iL0V#jgYV_ ziw!{*J|9|5`sfiQ#CDF^JXbXk3ne@v2g9{aQFtJ!;NN(p+{RP?zGY4DmhhYcnW4DAPeu<%hKtIv~^BxAF`#t#b!E1d~--WVuD1cHAMD2Jo_Xb z35?rk*mVOoHlnBFMI}a};OA^v*ktC8hCi4aP5S1L51y=Tlx5@hR+mEm%q!PMkVO2LTmFV~X`WMfln!Zm+bBCDOTa47L3VPabUN3C1OvG>7V>6`p#%!xmcP}c zXu=WwmxWte#{T_1s8Z>yovMN~(Q^lwP zIb9NHBsyK9&=e&ru*hAI1p!o1XflE)a#>oI7}UeDA^0GxdPAprW2bt9r+TNPpL#h% z``|Z!0DsMl+Ig}|<=^nBb3FboK7)LAVHF2et-{DvQuJuN(ZqV?oYCu%TwpLxmEPn#c zAVmBA;WMDIVeWy{K>F+?Yo=p^KYBNRb|8eS4$r#{8m;j%FR0j<%4Ol+12 z+qruUreBJ}@y9nc!5cdyO$wZqU0^SJ&^=>PSV&yZkOUl(rq&7x$;h@Br;%TtAg-`VHW?DLVWN_& zfuyjc+0sg@sad7qsaDN%h0P)fK`BOeZS9@c`qD?Qd9k_q_N6Or)x-dO@NQ&c-DCSb zdi(i(>m4tK*J~RDD81+oA$boBlO4=n2|~nO3qo!82w^MQEpW!)?N2M|Z>^!5W}xUG zd#)=4zAKm=9l}oRYe+)>=kVFTL-=d>9grX141w^w?hrmNwUIG_4CwfAxQLSp+-FUt1z%Rv-b`lh;rP%FV8vZrazAd1?GB|T3D6VHJIm{LUBovU zoC|4oFji{)RB@@G^t7@nLmObQSuAGF@1Us|bo7ZRTRl}zv2ZRzh7?swa_}>kyUFiY zgg1BQG-)yJv&mj-=nQi`K6Ka4=Q4u4FOHATH5bjqu~eb8v1tfAba|awM*kDMJz4gP zzexpBF(Tzr!@_Wb|Xv11vL(d|XRxAzvY4)Sdxr9GPO%JdsSQ zNOxPgbjxT6&X#bAAM-Zn-G-R#u_;>v6(>r;Q6Qe1bu%`&v>!~+Sb&qZip7#@rBDm# z5>i%nf|0>`Tx&84H2|Ls?LwSMsnLr3bd>{{p3N@y78i572s3$|C%=`SMvyBQ>VCVQyLpY z<3I!GGB~ej4XND30`$1wg2kmAET_x_z>0W#?O?{ZVBjO))TGN?Qmluw>nbPT;3Sh_ ziM!C07+6IwDq}Fz?Mx*Ac5phTpNWrlJ}C_ganC!6k$s?9VGASAs<3e#?KvrgB>?-F zdaA6wUJVTvl6g-`^`S5m&IU<6>~qfCxwi=BO4^h-5S4i`;nq6tlLBVtToL@JBSe)E zQXshajQRn@mv~DI;2SoAss@_=?U5kME_hI??`SqOnRlYlj)@8k6}^|VL7GuOttK*^ za*GV$8`_7e9zOQ~g~e7NBP4R}HUd=DAX)ZCWoyw}X^HAj9^itklMnxSw<9HU%G#nYft#=~!J)PBpo zIe}Aq4~v&Rk>y`GprFbGSO~kd*sTv(!G|C|8P; z#!pB~{SbkYB!sMhTXUVucaC2~#buf73naTkX%H?7yX^m?rW{^EGLfYXUuD6wd(+NV zpj7+Du;}?}dS&Eo<8aa=5r<-d*3g-$QX7UcMN|JI*C8$V8EGXG_ea=e!A#kUHL1Wo z;`x+GYXLKfJ-TC-1?2XRVAeKheCx{1OlE6V1Hmv~<9fcljG&r^dCrlpR%yh}6?2G} z4_wqbQ`WA3`UP&aBQTg@Ngfs8pCX2!~>eNTn2AF(~P2#G=x z^E=`@flHPL*;XIkCt_JFVztcga)cf$Kae}6AshdDy6-w1v*3FHh!KMc| z_)4fN_2xaDN)DVKpvlnpjUU+CvTF!N!ryh|=e)sVBh|WZ2}aK>!`xoy5t2pV9^YegEW44RxR0fp z50E1K`lCSd#{9&De!DFC!U6n;sDvO(K;hSl8`Ky0YZ1hH=C>Kjtp&+08XIoSPo3OnosA;Npwe%^)gb^BK zW&OD&K@B-$$D`MKiwq}h;XdKMyr561sdMd6AFF%~eBMKUM+9CGD&TrxI1Uis?!}0v77B#jSh2t^f2DuQ8L0(vMJcTZivLBUBR54IE~# zx-VT|^pD6RW&02zRpSg~Dr{wAdmE*?5m~Xp+|svHMHU4qG|yg$AWN4^`-@9KJ}K2$ z#XG~#?f|jCw^Z;bE;3BX540+Xa`ZGXzIQlmShJ$~f6$Y@kEh;B4mbavr6p1s!Bi6} z0M87yVmPVIi=V-F#yGy~SCceNOu&>yG7Wn;{rwCR<`sRshwKggTPsY$#cbb#CU$1g z84H>eXTSp|lX{nsM)Nx7x(EE2F*x0b;%VFGqirOnptHdNMauix=oBM4t{*s!jKzo% zvw6d3tRk&YeW20CBwP6RWMa9&2_%ez3!@2a>OyC5 zEQv#rQ2}eljcUmRNg?-D+g&oa5NUXhA5nl>^21(JK2@*! ziW}Qj z04h0X=p$Yz2?+WtV+eOe27j1<@1jEAgbJgZQ`j^T5lLs5eX)OB4^&MtzEhYEQjL>+ z`6C-FA9EdbheaSE54kzbK2;yQL~&7UYlCN``|mhNxA$p+Iec3P_P0~5o|-%}7#X9` zY{AL~My;xQ?1AGL!^7<18>-uIhUD=5gN_zgm#sC(rmoOK09j2sWkt~BK~Y+Of$9rl zzXwam?dNLZvsa$7QH0W^ZFztp`33=Ty?y4*C*1C4*D-ACFsxkq{tOhu$c#6P)U>|L zH)SQP9z(bb&A7`h^s7F~xoBN?M4a&vJ4(7+!2^-jbIBUDOi%2?7rl}iiRKdc5Ut@f-t2FSb zD3}-W)X-#RSCB_f5|f+!8JoXj~#Yh#1| zmxsx!CXP-PcDDcT!(<<29VKiN6yGi51et!pfsr}IctzS7Z*xV9K20bzMC&yaD*1(I zbe(uWa`0yBDnpgq6vvkPaguXm)+xsTEHm!k9IBtX<^%l;wgfH54H*<_Ui#_6WBS=+ z%Hz34t>^p44is-p9&C!yL9h`1O zx9w^&I~{^_5jr4IqQn|1lS;FhQ%O&cX%k>nCMY2`ONp5zGSGC;MycGXQbA^4-D+^$ z!$u{$=$=`VgnxuC(_+f`B-5bCx~cG^>7Y^#HU$q|X^7QmU{nppiw-MRIuBC`JmIR zb*tOy9>H}|vrDiz$$xHuOLXyCdq|9m4Dfb*)@)Xl0q`0q*HGSI)i&CEkap{D#+|-_ z0KPq?$8ueDsdVgCtx?5Y9>@N!xMz;$QL0f^pX|k+G$&S?udX;)$u?MJZQo+oDOojt zhMYm0dk)hJgRekEE788!erh$YR(I{A%ZPDLbvv^i%WVE&#K+W;1zWI(azMqmO6_k9 zma|t9`q9F&A*vA1g=NZ6u}jCh$PnTIi)qYCvy&Yx;!PIoKJN-K2w$G9qsc6_g{V+~ z==Wq4U^?>d?r}s+-^1@X-9QDZ-DIhBu5w++e{CR7rUvV_^-*rSM(U(YgnZN&3-@Nw zAd1@UXDJbBn$kv9CMZyC(x|Fe&T2KM6!airwMc6trzq?WX}N)R-4q$J>?saEtF`T*q!Ja`r@>MJ4_q2`2kurb^(buZ%=A&0^zSPd?IxZe^GbKxk2D%jvbl&$S3{6y&u&k9%a=tb@!XT0O@HFqZ8 zQ%ueH+YM&US33|xtLy8XAI)Z~*bIZ}DQz}tE6WTOScXMvKHN-^SjV#60dA*=`eK|t zT&6@sQCr{+VNAPj=t4K7!1>Sk`Q$g*J>^2*{~#+cj6EsCfq{UM{>~Bp=a8iNcPww< zA>!z0_wR@lq^Ki@C4j;M0^PB*2M$HGW~rqmphb!H4q!xzfTW}=gl21mHy)zZ>7bhg zCVR4bh*6fdoG*@={#1~;jx6k3IN{x3HoNLFo0{0#{?+{r94pEO1PSl2E}$qXJv>0r zFMeBFuFow#rlNZ*E)Zy>DUi6I?k^D?gDUOdO|(xLpuMPTS+tBb5Ve<=@L{}C6*H_* z-}OxR8oXq(PjTH&%RYcWd2G4vQKdMYH11NRTxOS4z6KpU>#tg^dIspyopE&>0=6l8 zy>u*6{gt#_F$5LRm_&_oS_+Ub*|MB@$j5R~y=s~oLtb5x#HQs%HXuIhC|%`M zYt@cwv|Nm<5t_KgShzRjvp*xg7CbL~hP&*To;Ju@ziU`wu)-B=<IB8hGJbR&1` ztR2>Ad=G2{Y@S+Ma)<>#J~iCTeTu;;C^MYXSea(0I^03JH1r1H&>%j9Qknrq?_p%e zYK1l=Iy;mctTV;+c~Ugwq6)TqxY(v~J#E}~SY&ZRG@Oh@djD!W^+*?}UmU-{C-Y(- zWn>nkhr&f1LLaOlH;l|RBlcGx-in(0)Xt}1q-d;FL}tp_F~fF^+yJp_fPuv+wzpZV zd)KkxCvEtd2kPlIqK79-xHh2(s;;1ig~t=h*FN={$;SRt9fjqdd~B|}?E$k+;IB#i zSWAOdFQ`M%9|HdI1Va9$yaIy$Fz*0NL}O(%W9e6kiS>fE3JD&VQ&v5A!mguh1L2x6 zp2$;j{gH27Qc=-Y>fjyZbCLQqGAqvdt5YqV{`%hcf3j{tP?35=e}Vk`cMku*1+tQ` z)W3g7OtAWw5P$IYsm*#3I~2eIQLD2_yM4a_-0)aN3^f+`k2PM?Lz?1}Hs}8%Rn!c!W$T?)y zsiWcha|EHL#Wi~haGE(3WPe|sH#LC;~PB&>(qQhxA{p1%uaR(x4EgHEIRPrfE$PtpUde2I3u0`e^|&^BtGeeB64Ju zN&2bmO;oj#9VSm*U;Ie2YY%l~X)=BN+ZaF3c+oOlrfS=4^i$+Mf8iURj%+<-myCTa zx|%9tlmDT6876pP)rmW;XSO)+F#Hv^orSQSIX8ne;)g;af=qEujB9WlXjEW5z@0FA z)=i%efiu{QdH1sSIqDAnrpE=b;32vl930_ysyoUt#l8Pf7+bJ%%2WCY-kYiTCvKc@ z?>k@)(LZDa!lt;GD|R~o*I;J`71}!dcfZ!}&Y@AYOpg6VCqJk{3$uejF{@*p98BpM zy!QrguvJ@+Thy2w1x$s2Hdf=5I5N9^6q)RH9|`Kcl6WQDKr>!KCYQ())AoQBu@`u` zZ*GARVFUcz022IRk!8&zVd>ReE!NX?V_OnwPm1mXMY`{QG_BBnn8*VB^#D7N|B__a zw6~D6H~CjRhNyv&vz?>I|8#^XB^kSUegvO&Zw{G_m{$Be+8ISnao|C8Srk8E@uE-) zNUE{C6m#SnO>{Gxs^z5q8hSs@y(=XLvRL}kO9M|{nCU|H6 zB$ylv9%juk+nZcAf7EQ-izr%^BX;!0LnscL^!Qy)ok==`JoI4#3 zziTj5O>f2;^te!7x^3Kp@YV?(SNUMIX7P_^JI1_2c-hI* zj~+7;{Z^AA-%gTJd2`=@qBM%@u#F98qIMyAPA?i`$%B8{Nmoozrd|8CZpPu|760u6 zKkK{5m`q`^mW}=*l+4ag6j^^o6c2Dmc8M074}TkzI|@~0eHZCn{DycT1gt@t@rfuL zSIMcRrB0kP@RQASj5a@Fnuhuj@|2QEwfScdqsY~#T(Qg_P>IplP+$jIrCXxQnl##e z6eMrTI(B(kCUfNz*3FTnf3$Fra2&I~_zNU6Fd!hx{|qDpTLWtkXA2{GfqxI2{&yQS z<#k150R$eQ-$N#TzYzziEqf6Nuu*RP^M5Pw+hQH`wHPpyLZ4SQb%X`c`zEL$&4Tmw z#?)WP8Y&j$4k{Owl(f7*oMxZCe(j&L11YU=2jLZ}N7jpHgc?l@a*#o<(1WAu?& zu}g0ZqFA-4OW%jAXSD`&fL&pxGTQ6qHjs1`Qc>d4qJqAux|&F=WiQlRdZVj_rM7qmKDU7V^un7Gtz!cTsIC^1u72b<9@wI-kjP?$bQJ%+mTT0eW&V z))pS|}O3pBR7?GAwW2vD7sYwG8|53|(bmL!Dw%qmSEuBnFYb(mwW>@_$! zs`8%9>#MtAOSxgr8!jG5_2;wwD?)5z`J2QD@v35Y zB6ZF|8H220wUXbTira9CgG5fYx`y-M&B4P%QP7L?;ZbS{^bJ=pMHylC!TQa*MsUtX z{F7Hp?C`R%v*OXgcKrwolt~76K)PU1g3jTCe)e%ZK}}%H1!bsM_KaG;Bt4I{J&4eg zVjtl|ga+?84#Zq$K^2SJQ$y>7?{~uitN0qtrIv+E;RqbT+&;Lugd7e*@>k?i4C=KL z$@&;}YxF%yRd{wUKs#S$hsmVM(1*ZIv;}@P`3qD*l#7#+s+}iz$#Rq%Y?`x=i{JSUoEM2q+T<2#Eau#%2EPFlt_E$YLnpw8Cr} zs=cB4FBGa&KazsVSAdI#5J-|j;z6aFiUv#rlO}C9vH*40$7VN1jh=8bp0e-1_>|?Y zNeChR5ym)I+uWYIkJ;T!zdx^QdVXk+)F1}N#l|?mUba>l5=9mUBk(TTgC|fG_opr~ z1a#av$nl!87RD~c_GKz}*6cCE(x%!C9=qr65_ZSN&=07~->P6p4@g+pAQp#L0`r`5 zY(%V2Jh#>4dayarCx{oJ&yAH0N|RObOHgrOx#8+Dh)pnZ?L7AGI02$g!&V1RR{9@K zlm!Kx?-;dAf+sUciAlM~HL!@f9xlv3WF6n0`Uj=Mtu5M6o_)q$;tx2bBU>!fv<0RQ z%8j^+!h#?cm!_WBg! z$z^`lr`qrk%dmfJ}cd5J3sV75{HEfp^?i@^AEZ?uAw$>>*yKl#uqTxF!!90kX8HK|pcd;fsTs1;Xah`l4d&^7$Vj#M zncX=^E!C9KtW$5EpA35aq}%h4#%M=%R`LJC;Tt>Mk-f8;#{Ha{JA*7IlbsUie?MP+ zqThU3eQO<}vXO*_+&MstBDA(og?Fm%U$oQjS4Yj!KqI_`&k_lIR!Y!C8nvY&He`fL zUF&kNb7CK-wtI>IpdK# z5)y11qX?F#FSBxTd{La40>B}HokdF8A9I^bb+C23hj#BV+<;2*^ydh{pfPS% z$1wA=h}W{J3&}ggK)3chRarvtf+?tB8PJRaWlaSIdf4M|m5+-D28LD^7|sao^h1 zhCmuc)I?K|kvQ-^`RA?UOLqb-ZV!v{&MD(~BT%`R=E@9erdjo-?#u*QrB;zbMZ0x& zQ9-?oi(3*&GbMv_H9Fvgx-R1NS)whJudDO^-d+6?0@d^Q+#EWqOXqW|++&T*0xn6~}jM8?eEQDitd%+5FC^HKUVQ*>>lVUN} z`MWv(QR9Hic7Iz4Gy5QlE{dp%lOjgo0_)Qs5`Wx|n{!2pv1g)TdAIrZ!5+A@IMy11 zic{pjD6nly68SA~@>sAaXUL%VBnfkh>|1a}PG#_u_u$+()IF8 zx{vRYWN_Y*XMb*_Je^knU-vuAB|QBM|LN?LEE2a6CD=y7`a6Tvyg#nEoo$oRXn$3 ze2%_zOJTiKJld-&=iZm#QE%7@WcU-R?3CC#n}a2EiC+He^eIc)C1)OFo zf)5qSFXjioy2$wl##>O{D9p+^j92{s7ncU2D73yXsJ zE_WVee(X(jI&Uw;M}DBVg3*bBP1bXNmJeor_zy~c?j>4(3YV(-urMpbU}Cy+-`^=l zWI7>5L?}gIVuJDypBFeT zJPOP{>pE&o$7S%%lE(ld(neitLm!XU)M8HEPSSxnwa&T)R1Bexi_UJ<&y8mQZK4%d z^=mR$mQA9?Kbh`AOAILYLPka2wi^A<$C5>g6u%ZgP{DkF;@FFX95v#p z$qCe0<&WoXvJOpNB~ZmmOO%$lbf%GFtStL3ylc=!kD|Qw+qjD6D@*K|E=OEnFjr3NYB= z5VoPmnOM$H{HQ|>(2x_0yhKt5QAC0*CMbG8?VRm7a9?WioHyr2pbw^ z1~#X6JN=tVHC0WbHaZsGV`dz4VpCi14e)1Uad-sTLY27%r=G?%4*Eg#a=oGA(!nlU zxJgBdMS~++3)!k-CCg;L;hr}1!Nqa@CWzEWi0}_vY-uEP34A>MtL(Sbh9enH-x%&H ztkZjIzmHCi3DX6Z*=y46lp;&dBQ9XAuiB8WJBS&f4b~0SbI5!6D-hcegPEPNo$6^4 zKK>y#p!?oOlJFPRL}34AALsuL)&E;u;D5ANET+|Ir$ejL?hMF($hW3;2Qlg|B9RFf zUWNDSizY)WnhLIvHgr|LHaGE;sKECs5xPRWR;R8CV zDwIpBuAquQZSy;0{o*$Jwo3*|-lJ$)#0pAm$jP4a=c9-ac_SW&t<@IvdcvO2Q!@hCO**CSn*HYO8X{ z(lF!6B>^`ol5{_2osS?ccC_nisn|SlW-&R!-!1hmczPoZnag4+Ev1priT)hq20W~d zkl6f_Zg-DlMU40X1e5^+1jP1#gYJKecar=E&ZbFeToQy4g{Q2^$jWE&8M{wJg`wLO zRRAhqURfR#fPTti={zwityzY@^L!#He*^MCaZ3hA2Ud2} ze$tjm2$~q#0j4dW7Vp(jYLyn=H>J^?5{oDXh8ye)`4kfHEOPHvW0Uc~FjV`n++c9h z6yQPdz`0$aE19F}_?8nQj9$M|E;&IUgTCQQ$aQo4ZyoT4U&Qx8o&Im&q=|jPR$@yUP`;HQ({f*GM zjiL)Xa<=mV{2wH=zWVIYzY>vusoVemc)kCo;$phOff*4-zW3FfAA66sdJS#p)K)aY zG6^8i@Scod>aptM2ZJ7Gt8adIQ!rAig8PHqD}4A4Oguih{b1-1;U}6wJwY6dR2kKg zIGL zL~tn2`z*y}F_I%vh*{-7hWkfzg!v@Xx4*V1%>Ow@`8PfPUq6>BH47~iF$7;PH-lgo z6dXnhyq&mKoN)?E!$D|ykT@w<(jTk_sW!=e2BukQB1<^&spB}7@p7+#*Gz5))>{c* ze&0m7a_gr~U?3Qg``p3CFyk0u`&6PPg~o*@+6jzg`?Q#L&;t&2?1aJRNVbD@(CkAo zZi6>hXwrf)`@qG<7)VSG_R`~{;U1!u8Azt26O7hr*Y}^=H71VhW*ls_`c`hv<720Q z$?*w`_9`vFHVaF}dke0cYzCo?%}`;4K>D@Ig$48YOnshU z#Jwwj3wys&iUf6=#MjXGYTF4NO$gPdCI-b2#cZ~OVMBG}|L#4_9Pda@q ze^LWoe;Mhb%ucJD@#4|GEm)2#giw^meuW#TXbSP%pgaTCsq9V*lU8cNk{vW{03O5* zoK2q6{kXElkA`f2ZgD$-J{uY;iX9)YAjy%EN#pj|0(Gnh?I|YMO?F(Zj7OY~3eIae zayf|?{=Se_snshsm~3KrmkJfgB||2&)33(;sf0awxAtEbNKG4tOap-2LZKou7kC{U z+^e2aeMo%D7mQ~VZ+|Zsa`qwn*hj~3&rE578z;fOk{9W|;}^kxAAsH-H9&74JDBGO z2=}};QSR!v(oHsdR!b!?p?aR9yJa$VcOWluGdY&myXV9W8Ff8(f_7>sZ`@ z*q3Ft>e8huS*C&6T7a|;Zo6q&22wt1jP>1cUZPpsc7fMNx_SSb@VKXqx=d34C5#YL zovT-sNL#K5$lDat2kfbCfJy8-GaP3`6imrnUiC{n>1)*bhbt!()k=8b!#bOr7wzUf zhsxb10=viS$>UDQf!I;b39iP}5zlox*Ove4j*n2>+Nthfw zsy5$%D^!T&pJFnaYvxRuho0DJo9vr1Gb(V&MuICCFt3EN_jQqb!hS0^XX0ul_hoR^ z?LU3{zY*i91{}Gg3m%HCfd|Gz`BC*mJ)O(<_Qjn7zcgn>J1$A0=C3Ixo2uk`HP`Wo z=hnV3W^;gtjP=n99Jr#WENem5G0P z&o`Kc`*QM&Z_xQ7%IJh;Ot2ygFkg}G?@HDRs4iBB>kFDqveN4+D$-mFp6QaRToLYN zM6BEc)wj*$D>}kPh+e_w#PJ`fUc?-@>$ud0+wi3-&tkvC=9O5!Aw+oOOn85gWp_wOM>{>qEpvZE7(BTkT$b>bI;2wz&bV8bvY9&apbc+qb z>lAa!glm)h2HOyr)ccRYRBqUHaO|%I`1^HX{67R!V*_UcdSMeMXA4_{e@So&*xUcR z`ONfWcs~OI_|3Pv&G|Bw=bD*11G-&ycs&7)CIYv6Tpd_gaN&yjjM#lG{EiSUc2{W# z=A9AQz{KVC8?=6?ZJ=u)yx{-C**ic<`Xue*J#9?ewtL#PZQEUK+qP}nwr$&-w#}J4 zyWj5r-2MIU-S6&qPQ7nckoG5+%={HN`oTtIS^4BR&XgkZh5 zOa>Bwxw%0#BKd8qdKefw1rKhBY^*dqlvtx3P$&{<3u}eqO)*t%&&kCvAbLS!euO;P zu$6U=RX~oWkeRK+%IMP7NV(KdiMHKMA39kRKz4I#(%wA6I|VchaxhYftz|vDc7j}N zIOeKZyjk){;mgk%BItO4BTimHT>(T+sRUn*dhpip2j?@mXj`7L*f2$ z2>hx9mJmXCG030d0a5lqlp*|i79=w1(Z$J)jgrI4_I@A`>~{aS4HHw^r2|IDqXCQ#5=Frw5zhewn6Yr8NkS-8B z01sC|sx{ej29a({_h)0gB@1+Nv@t4FHtm!A4xaJQqSTt*ENQ93{#`W1_Mvmj!p?M> z%9EBi%|M^oR(yY^8fuid(2z}J{csvqx_&6HSEHu37FuoNhjg4RE%ezs+{@gMAWEL3 zyo}Rx+iD6-bw}R$sRCMp;F)VkM)72`@ zmo^o9cWYcq)Jvl4Y~}JguyvOG@)kmDR$6KfQw>a`xmJT_iCi;A?*sdtf z8k7T{4@1UEoi`a_m}x)C&M9rKM@Swakbr4T=ue@{#^7S_{-0gh+92w5+`b?Uo2D#sNsP54M9X+%8!G*X|uRNYw%J#Q%*S*y+w$=v~ zK7C=IUBc*tbAz~j_CG0(5-oqd9?=SRbi*oi9c1o0HEdIU`ROtIjAtdg6g7-NoN0e@yq7D`?2@DA@ z45xv3B&GG$%IgaWMFk}I77}DnB;^?6Vi=G1@ClS64kLUkekAjR62AC^Z^BZHu(K}W z@3&$kqb&ru#BV5pycYuZIM;~d8rE`*^EqBMq#UI;5@e$HVBp^Cfk$2E<6u7|SS9b1 zQ;bFB5~Ab1q6Kyz3EIoV0nH@s6yvR$2~r*j+EGUk-{0#Y#!W=-yPnao=e0f)Q;cPO zBcn0KS;4;+0*!UI55TPD-V1r&bfg-}ZX|r8j^w_-S3-=VE+^p=%!4X4Hf91Z)dJC*Q0dvARg}46qzwKbYw;ffscx< zt@U6`SsbaW)WHU~GEnSF8cbPp!bXr`B%DncQV)QvGig{QCS+g zsPY;Q6bmB9qt`N!^axGVhS8%bEw~XC#z#+9kCq+Tb1Sr?%Pu4xY)G+?5jbTv!YOeU zb~Z91FRw?KfP>onp0}zD02JOVy@i>;pY2Ztx?xslCBq>WM^3{F4xLROEq*Oo3G3@~ zFe1cqo*?aIx=r7e8pn##XzU8?-8QVuS9I-ZbLZa(Hu6tJQtlU5CN^mrkaF^82g>d| zi}I=&(uvaM%MexiHJ7aE6_CJlPKN`g@~$1_W=t~K+y)?fsn#rL=BFnmSm2{qUsOTw zFPksY`H_zMIt?`fXi-uNa#Qbk&T$)>L?F z9OvE+KkK%Mb4G=_zQbVf$Us)CD|22vQtL2@JW{`P3u@-FwUy7bkAb)QARQz8B&9Tf znnbEO3<&~NC6OkeF-Tq~Y2;E*qz^WSg8l%kl`?jYTV=2R0AS;g4k%nV*rFMHTb1+7 z&03cO)?_{xm2`{?lqm0zO`;#--PLVABl*4wSGnPWB)Yawx1uRKpz`d-wB)oTg5-^& z9$)dC8B`xpuwsu?v!3Hw!I;Xjz?C)0?inKcZunSw=Vqmo~YBbgCur81oPS@FPshwT{~kbha;?z7Nn^FMbBi%_X~GunDdS?j!b4+kB{LeUgSNT47~30Lg7bd$3{(dw^YYprTg4 zMv>!!x+uRol#{XcTPu+LfJ#+cE(J?2raeMM&0egK{hCVG6%_(|c(UdIc2#jay13(z zs^`MPq3rI+8ND9f)@Tv&Mc(#d_65CzHJCWd8z9C9SBD82J-}n?nH13IxA6;dz+lio z=Gg$9n#-blJ;L>J$M~6chd4OwCEkf>r!{vDWsEM#PWGC1U*xSAX=aix)lR^tI4IIV z4ytw{Rq`}hk9xo1(*w#ow3&u(@xl*K8eH%}>EO45&~3-YY4=S)yCDCXI2HnbZQX)d ziTe~UgYg|qLe27WJp2u1BWYqV?hd+g1V5BE2kIT!@c zQ=|eN`ya)cKQ$3UJ`#R%uxTh#9sW?@I`dUX(rDjyCq#&#s=dT+Zda_fVK_>q8zk>_{?^%2d=+!j)u*yH= zdBlE$TMlOb{L6Zjx;GvB}@j zFAo8Ze2i^R1tlKvd)t~#{giXjCGxhMU_Q?50OD2%bM|V2wKYLK@n??Xren@S=Sj}> z>dg(`x1_o%A~2m`XdV$=0a}rEnlTdv0g2!MQm|MQZh$zeo>S1z8a52F3eT=V=R~c} z_YzC&m22q0jnA>^6>z>dL<>hH_L%vGBeG>LYVDmpT2pau7MejFlQ4ke=J$HZN=1dj?+q(=(<8amN%*`#6s0N(w*duU z5T~n+$d>26n16WS=RB%a%Z7_i7jxI!>%~`B7aS~R)@ocx$$pmh$Ppu4G~w@?;v&g( z1Hw;hM&oy-yPg*EbJ{`eG$FIH2>?rBq zuxdWWXDKw%6z>~%5vK8Bm+6!i8ps)zVIN3~Tn7_P+AzhDu*o!FN!n4Rk+2Ch3X3K% zNm{)Vxco`(3=-7*Nn8UZ4v0x?Dat*-$9Zy%Ipateq#F>$9r)5n7z7(cB=Bbl-1icv z2reR%%~FgBpCFR5xw!-!FicH>#I7t%j_7Wvlg33q6--8j#+g6}?(oEM8q*#Y@I3Aw z+Js#Kx=;jU=P^!<)ydxeLiAo+y$SpOnd=JRKtS~W(Omz>99Pl#+d>u3Vv0>Cjr?S& zUm1alRJl$BBvn~>9u$-h2`R}tt2KFB-FC)Rz(H-mkmTQ2TTQxL)nQma^v?#T+8bZC zxL&fXKQ3Nga)DBAr-p#8(=mj{h50U-gJGg3qR=q6O`C>JzZIH*P~&hj-;VVefm8yo zl$=odZYNi#SU_RS!sE2oc=;f0Ult$Jul#`d3ZzLzArH%tGZrR~@y&@qEB2@JPDB<&_em> z>XXvQTf$BUuV#k-%5m_ud`bk4*LRucITiB?^{HoI2kxpj2cGqW^4H_ctUyeUKkWQb z3tT{&;1nwfr3r=LwEI~+7+qA8W@m@0bpT)Y~v#Vd< z^n*nG2>7!RsvD(fmuZ$G=5~%~V$0X7+t?`&$u8Sm_o$IIm57}IU)K3syi&lzLHo;L z*cX>m!FA&bbp|?Z$`M0+5%_i2esfvah4=LU%Vg3a{GK^07sGZQiZjSB-+Ft9Afz6Z z=Kxn!<*%B&W7AWvd(3yxgWJE%@AC)2`EwKU+ye?F zB1KYIRz3d)C;qqAS5t(WE4XV9S1)lQDcj@ep4i7u#EBx1Te)Y zGZQ2=3F<_5;Nff%+QjzRLs}#|WOuT_JIe&HH>7)CpmyN)mL=;nD;RY|flbcc8aDP? zN!ZjO)B0xn;JxE8&Ng)DlCqOcsihcZD=G#}fE3tG!eT2;(eZs%WT7dh(^kpmWYR*? zDRA&Hb;l4p=}fLNLn3gHluSQ0^WghuWWUa1bBsyz$aT?a0z5BO#-O;CyT%f0&J&Es zpCc(4!aS8z0p{3|)|G}$6J3gIVVw#;pGbEYB~l|5PC%6C#kI{cpEBkR^U$p~&8An{ z5x{xb8|@ZptL{7s$JJm8S`_zKYil_H&GLtEbOeUZVAOWOwVJQzj%_Z&Ap->@sjy;b zNb7Y;67w2qGpM63NL(Y`?3h#Y-F$=X49jpP!gF>E=q;Owi9IW*dSc9aYNrKKGR@wx za|^4C>Q(NuJFV>5nY)PE697X%yua=!)X{IBxanxy9b{e;1XvK*F7iRE;1>SDG~Ft$ zdZr>~lvkimwdS1DxqrSg@&$h;@@XpMbdhmOiAmRRb80MXCvu`=Q6>0fM4!ItaaD>W zZ(zsR`XrN?RuG8uW`=`oJBq#Axn$N_F(Q&U^BOjAj^W$`2eBUq7f4?;XhdH%NQ=~I z5DQ1lyeVafAFhD(F@6p7oe5)?3dN*?k-d5Q*YJ$HlQNx}4TcIg%V?`E7C63*5#KL9 z;mu8nv_3g$G(JTv;j$I>Ncr|{`&69z(`$C3r*4NW@=*nj>(pNm+TQRpb};_^hh^D) z@%tE)yTM~2md`=bFm>PxuNZKL(l1ea5^h*x;IsU);1o{4pP=5ZoZk+v56C4?7{;Vd z9?WFIk>2KIPA6+2?tLRRN{C0)9xU7H8J9J{N}RAbkwFr`@+K?cAgYrn9CqaC^qvnfo>VoiK`Oy0?jRp7akpP`wMJ1uDoLD4C@-lbk1D}8?;UFMU049M)B>`9_(F{8> zb$Ty`7|$YcmvGO0gt$r6OC~{Iev$AEJ92e;|MNej?zvr6RpEG5TfpG!u}e_ECPW(~Z%7jr$Ro-uo?$104IWWWDH?M6o3qLG0C0a<M#WvE!!l+2%Fg^DD+lu(bl@*}ig5Vx07*B(X_7)pt*2Fm~Fx%u!l zGaYNQ0c@oI^7~aLd*iJre0wS-$lK+3z0CEZ+x;gp_Wk{Ffe$2hXNdx#FJh0-TDTVR z2AOUGK>b_kmqx5cuBr1WtSKA-%+xhw=jbJGqX+;#t$XGY7GTThNgdU??j|^1fp9~Fzq7k@{2Xv)ZI`YAY)8l^Y>nsJAXxy$H7e&{)ZKk&*Bl{@gN5s=Vq z-Izm#9UZbBhrrvbpDYE)#)|?l8J!6_I5fn`NXd`dV7o>Ouh*R*Whk{?wi`g%yUtD- z3*<^3HwEz8b0j7rIBqX$0xIIV;>OQ_J}3X^6V5xmM0D;Dbspp?}4 zos3G07a`kol@BF92sP7f(w>g8%(<*iRfm^w3Ka{tQ%S6<%!=Q-G;GyXHa4{+GGRv> zU_+%NDDz8+3^7HX?INPHq+Ycn4LM+82tqQwN)rW=0?V>=3sb`ev$fAd#m($61b!!6$zucj8Y(94wCRrU}k~JD@ zup3PhH#L4>{p?a`U3<>bnfVb3(6^iBFh?0^qz+_i`jtRB=2&w0RMc3T+p!=OGx~va za{-?r63kj-fst9MDcWCVzI~*<-6CV$%0@dfFsikBh4zz8E=Xg!NB8Be0$kMkA;&jS zv}})@J%LM(9>h`&56yAW{xU!xJuZ((l*Mwe$2?B6+guCS7@UI~ zst?zT0EjF(da$!(=^)?M6@l>X*+)dm$LY5jz-0qoQDn!x1!;k!v&$3{R~v1{(_j6R(P3_QPYe78->;xTtwf z$l#T)(*h&K)4T(5eF!)MI=Dnvd7Nd)YIDvi22P4>IP)wNt*wK&K~RD<65Wyo(jM0x zYLXyWD~wkVo!&P}p#ct(0g7vIx~L&F7JeL$H8NggiW!KApDuTA{0!a*UiP7MF~4@m z@L*B&pr)#tOnXo$a-dLNnj#(j4=Vi+)H~g%jnQ-Oc z`WlEkP=#Ry5J?gz92}CNGgRUJ7E`vF>89yj5{`S`D08WtYiXF;(HVZS%p-HDqGxs> z@>ERrzVwR>e92qpQtw_0mp^HR)?*NX0kgYlccuQCzX?tYyf}d}Sfdu#wcsJRtYDAO5y5suBtjjwwA=8bJ2& z^mPXX^fK3&XDtA+PezhD!X&wse?zW|A)Npfe0^w#MfmtxTt!M(6p_n zqDjS*I84^K54>+7tc##1ID0gLNLr{KRr+U`b%JJWgv5!SiLq%BH4Cn`9abiyV817|BI@jsu1tjzyL68%dGT(N?Tl;EEL`fydrvseT3O0#JW z4c4HEl7zm9-$DWM$LL8>;v%=ZE%T+?vLwYR#A9Ir7hS$cW|_v8Bi}5~p!aV#cMvIVIA?$l!vmB1PI= z;($x};qSUypsZ1V@4wm^7%j{ZM-!mQv&;8m1w)M(4()x1f)PCcDt*yS@CM8WLYAYS z$~zI^Ev84UO$j5{G?204dI%B*=4yqizi~I&V58A%2P9C&S{xiI`OvPm!^>~u14r#% z*{Z)!|MpJEzf`vSG3BTCd~K{>ANw75vKu8WQH)hiAutXR;CiAzE78usqJx4lHy7vC z_uFCsNfi=?BEO4ZO_tODlUk9@u_$-U6iSRX9aF)ZWxraV!=Qv(>B#5;`CkV~12n8^ z1_}s>2n`5``+q!0|J>FDrHyie`rEe?rt#8;pjDsfpqrr0;ubgn5vBMWNq{EvYF$)a z!&D7dBXEnkN2___T4%Ji%g`J)+isWp z=*zF0*BB!PRcz@Pu8=Fm!{H-jDClWVMg;7d+6q!*sRJ zgfK6R?Q;EJG~Q9`wFdW^_zicQ$K5$< z&@UeL8GO0>sj&?1Y2$%b`-prA7*B`vGmMx@w`KU)_Okt>Z|*tWJR?WQyxM)_>0S}z zrRgu2V7V%{Z2_}T6w?-CQ6plY#*sCacO_vK7#W0dY-^|toQ3({rllj3TJaQP%LWB> zm;yr(ppRcaLd-H_sk=nEr1_12Rl}BFfQj0bS&h8*x#z>3IOYY1+0HJOvQ374c@$xKLQ#AOb3C#KZvhp_tHuJAeIN^O1nfra%iK!|Nhv zC6cN$vUas5gC9xs|_XF$fh!V}f95nzN{PO`V;*}^`s(R`eI%8o?*gKYd@ zd>tpen6bmB!R+giqQnvF9K}nwA00A+m#SKrq#<HASgPmJU4kt$#hE>>&vNoa7#xZ9G8-XX)@0=GezO?;khQxy66+f`xRC!8N)Z~TsYb~>uDI+Yj>6m`i?5;_mAtPG+QaCbz zPQnXQFWzhfF1+@@61s=>4%SPl00tMSmBAee-P}j^QZQWC%xYf?X?Mic%t_Z;4{3M! zg#^xk|KP1n>fod51LRZwKl zqTy8+qZS?!a6!6}eE;}Xzak=`f05m}ehMArx@isw3m)jbwg#Az{0cM$JJ!qpX0C4? z|4K(Ip-nax4oRs!Pz@Q2f=Q$VE#g)@hSa01ocJLE&F4FjZK0chnTxVcBo^ULq=x9O zcoYdt2|Z6Ff|zK?pr=3BoGlI9uTe@>Ja1=RlTs{qaVc>JQ1@^{m#`a9+jw>b-ho?7DMVEQMt>}aGGZ3I5Un7?8rW3UEI-b zO#XAU+sG50Wsl`m(X93AoB%dwpfBn~NkN}8HB?oWx#Ua+SvCla(%bY@nse>#QaV@3 zopKz?)P+{YoP54K?_PYAVF49ysQ_xRV|2b~oT5Fyk(}BCZf02mPEuL9(DP`Le71F) z{m>CUn2A3%jOy+D^sqJl7fYkHa4EP(rA>>FML>+snXHMOyT-?D2?27O4Uulwx~%Go zP)4vOS+-_|Y_qR-p1B8GjNV6usl~)^;+y6gw`{M_+%2zcw378i3=%xq*wq7xgYx>x zz(PHijb?*Ra`OwkZI5(rk*t6^%kc_y*Lprp@ z+EWn(v!dT#J+0*5Jjtt3+wNN_haB#f7hH%ZBzOXO@l4nx+%{(jD>HFlMfYuMWd(KlU8+kPmV|&g z3e&_Y6^>FoDiX#T)7~Ud)FTH-A|!c?i`tULJ{>8}jzuUF!K7=9mM`R*<1NxZxY4pj z-Y{u+O|1E(*%pIk`I|vePp2apQ4o(zD8&5s^rA`2`W3grOhA7-K)Znjw5NAa@ui*lBl% zyCq;bBya&5XdoaGNvaf2)Jpe+{a;IYtPMruDRd7&b5}=+e zAsz{)*6Uad|gzZ;SZ_AzqwEL!O(X0a}2-qvVuV>Z7c6QQ=|N%?23ERh?| zFGacQ6q1!o>L+=Jm20D}m1tKP%qNf+8*t~^*eWz6S3RngL{Rur}+t)cazgn#%J~YBYy1x2e8cQUaEv5d|hGpmy_)6Rki4SaDRp+$R@Q| zgYG=ZvbO}vQn(@a@U!bortgS$@%8j*Ey~$367YxxTUrq^CJa0Z zWe{A$Z8k)A!?Qn2tx`hv%yLiHdZXWp9qf(BmDqCP%(nOZRgv_9M>V$t^}xt>#kNXi z;0fABcszfCuKsOHrn_Iivka!i5L>d`$b&vD{pl~xJaa(LW5*u}?%V(IFxdaIpZNE% zNYTXJ*~HOF(AL=f|0@^~-5>EML=vuabuLt(N5Ao0dw>f#&{4Q02=M7oW5&YuU}h3M zD0Tna4i@{NO}y5Onv#75XJ2hwpm#HoFd}BCyNR5Lq|$Z+L083wS5kbr%g-^u@{Me2 z#$39%Mb)GUlWA|WMo=0(jfhTDJ%kQr>QyqDHC1k@06e^m-pP1F

#D}9#6{+z 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 euzv|D-2Z + android:launchMode="singleTask" + android:exported="true"> + + + + + + + + diff --git a/app/src/main/java/com/capstone/foodify/Activity/OrderCheckOutActivity.java b/app/src/main/java/com/capstone/foodify/Activity/OrderCheckOutActivity.java index 9d3c407..ecef400 100644 --- a/app/src/main/java/com/capstone/foodify/Activity/OrderCheckOutActivity.java +++ b/app/src/main/java/com/capstone/foodify/Activity/OrderCheckOutActivity.java @@ -1,9 +1,15 @@ package com.capstone.foodify.Activity; +import android.annotation.SuppressLint; +import android.app.AlertDialog; import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; import android.graphics.Typeface; +import android.os.Build; import android.os.Bundle; +import android.os.StrictMode; +import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; @@ -17,6 +23,8 @@ import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.annotation.RequiresApi; import androidx.appcompat.app.AppCompatActivity; import androidx.constraintlayout.widget.ConstraintLayout; import androidx.core.widget.NestedScrollView; @@ -31,8 +39,15 @@ import com.capstone.foodify.Model.Address; import com.capstone.foodify.Model.DistrictWardResponse; import com.capstone.foodify.Model.GoogleMap.GoogleMapResponse; import com.capstone.foodify.R; +import com.capstone.foodify.ZaloPay.Api.CreateOrder; import com.google.android.gms.maps.model.LatLng; import com.google.android.material.textfield.TextInputLayout; +import com.thecode.aestheticdialogs.AestheticDialog; +import com.thecode.aestheticdialogs.DialogStyle; +import com.thecode.aestheticdialogs.DialogType; +import com.thecode.aestheticdialogs.OnDialogClickListener; + +import org.json.JSONObject; import java.text.DecimalFormat; import java.util.ArrayList; @@ -41,6 +56,10 @@ import java.util.List; import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; +import vn.zalopay.sdk.Environment; +import vn.zalopay.sdk.ZaloPayError; +import vn.zalopay.sdk.ZaloPaySDK; +import vn.zalopay.sdk.listeners.PayOrderListener; public class OrderCheckOutActivity extends AppCompatActivity { private static final Double LAT_SHOP = 16.0500622; @@ -54,7 +73,7 @@ public class OrderCheckOutActivity extends AppCompatActivity { EditText edt_address; Spinner spn_list_address, spn_district, spn_ward; ConstraintLayout manual_input_address_layout; - Button change_address_button, confirm_address_button; + Button change_address_button, confirm_address_button, btn_ZaloPay; RadioButton list_address_input, auto_detect_location, manual_input_address, radio_button_selected, take_food_from_shop; RadioGroup address_option; ConstraintLayout progress_layout; @@ -97,6 +116,7 @@ public class OrderCheckOutActivity extends AppCompatActivity { progress_layout = findViewById(R.id.progress_layout); txt_distance = findViewById(R.id.txt_distance); txt_ship_cost = findViewById(R.id.txt_ship_cost); + btn_ZaloPay = findViewById(R.id.btnZaloPay); if(getIntent() != null){ @@ -104,6 +124,13 @@ public class OrderCheckOutActivity extends AppCompatActivity { txt_total.setText(Common.changeCurrencyUnit(total)); } + StrictMode.ThreadPolicy policy = new + StrictMode.ThreadPolicy.Builder().permitAll().build(); + StrictMode.setThreadPolicy(policy); + + // ZaloPay SDK Init + ZaloPaySDK.init(2553, Environment.SANDBOX); + //Show list food in basket LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, RecyclerView.VERTICAL, false); recyclerView.setLayoutManager(linearLayoutManager); @@ -170,6 +197,8 @@ public class OrderCheckOutActivity extends AppCompatActivity { disableAllInputAddressOption(); getDistanceAndCalculateShipCost(finalAddress); + + progress_layout.setVisibility(View.GONE); } } }); @@ -181,6 +210,92 @@ public class OrderCheckOutActivity extends AppCompatActivity { onBackPressed(); } }); + + initZaloPaymentMethod(); + } + + private void initZaloPaymentMethod(){ + // handle CreateOrder + btn_ZaloPay.setOnClickListener(new View.OnClickListener() { + @RequiresApi(api = Build.VERSION_CODES.O) + @SuppressLint("SetTextI18n") + @Override + public void onClick(View v) { + + //Check address is null or not + if(finalAddress != null){ + + CreateOrder orderApi = new CreateOrder(); + + try { + JSONObject data = orderApi.createOrder(String.valueOf((int) total)); + String code = data.getString("return_code"); + + + if (code.equals("1")) { + //Success create order + String token = data.getString("zp_trans_token"); + + ZaloPaySDK.getInstance().payOrder(OrderCheckOutActivity.this, token, "demozpdk://app", new PayOrderListener() { + @Override + public void onPaymentSucceeded(final String transactionId, final String transToken, final String appTransID) { + runOnUiThread(new Runnable() { + @Override + public void run() { + new AestheticDialog.Builder(OrderCheckOutActivity.this, DialogStyle.FLAT, DialogType.SUCCESS) + .setTitle("Thành công!") + .setMessage("Bạn đã thanh toán thành công cho đơn hàng #" + transactionId) + .setCancelable(true) + .setOnClickListener(new OnDialogClickListener() { + @Override + public void onClick(@NonNull AestheticDialog.Builder builder) { + Common.LIST_BASKET_FOOD.clear(); + startActivity(new Intent(OrderCheckOutActivity.this, MainActivity.class)); + finish(); + } + }) + .show(); + } + + }); + } + + @Override + public void onPaymentCanceled(String zpTransToken, String appTransID) { + new AestheticDialog.Builder(OrderCheckOutActivity.this, DialogStyle.RAINBOW, DialogType.INFO) + .setTitle("Thông báo!") + .setMessage("Huỷ thanh toán thành công!") + .setCancelable(true) + .show(); + } + + @Override + public void onPaymentError(ZaloPayError zaloPayError, String zpTransToken, String appTransID) { + new AestheticDialog.Builder(OrderCheckOutActivity.this, DialogStyle.FLAT, DialogType.ERROR) + .setTitle("Thanh toán chưa thành công!") + .setMessage("Xin vui lòng thử lại!") + .setCancelable(true) + .setOnClickListener(new OnDialogClickListener() { + @Override + public void onClick(@NonNull AestheticDialog.Builder builder) { + Common.LIST_BASKET_FOOD.clear(); + startActivity(new Intent(OrderCheckOutActivity.this, MainActivity.class)); + finish(); + } + }) + .show(); + } + }); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } else { + Toast.makeText(OrderCheckOutActivity.this, "Bạn chưa chọn địa chỉ!", Toast.LENGTH_SHORT).show(); + } + } + }); } private void getDistanceAndCalculateShipCost(String address) { @@ -510,4 +625,10 @@ public class OrderCheckOutActivity extends AppCompatActivity { return view; } } + + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + ZaloPaySDK.getInstance().onResult(intent); + } } \ No newline at end of file diff --git a/app/src/main/java/com/capstone/foodify/ZaloPay/Api/CreateOrder.java b/app/src/main/java/com/capstone/foodify/ZaloPay/Api/CreateOrder.java new file mode 100644 index 0000000..a12d407 --- /dev/null +++ b/app/src/main/java/com/capstone/foodify/ZaloPay/Api/CreateOrder.java @@ -0,0 +1,70 @@ +package com.capstone.foodify.ZaloPay.Api; + +import com.capstone.foodify.ZaloPay.Constant.AppInfo; +import com.capstone.foodify.ZaloPay.Helper.Helpers; + +import org.json.JSONObject; + +import java.util.Date; + +import okhttp3.FormBody; +import okhttp3.RequestBody; + +public class CreateOrder { + private class CreateOrderData { + String AppId; + String AppUser; + String AppTime; + String Amount; + String AppTransId; + String EmbedData; + String Items; + String BankCode; + String Description; + String Mac; + + private CreateOrderData(String amount) throws Exception { + long appTime = new Date().getTime(); + AppId = String.valueOf(AppInfo.APP_ID); + AppUser = "Android_Demo"; + AppTime = String.valueOf(appTime); + Amount = amount; + AppTransId = Helpers.getAppTransId(); + EmbedData = "{}"; + Items = "[]"; + BankCode = "zalopayapp"; + Description = "Hoá đơn thanh toán cho đơn hàng #" + Helpers.getAppTransId(); + String inputHMac = String.format("%s|%s|%s|%s|%s|%s|%s", + this.AppId, + this.AppTransId, + this.AppUser, + this.Amount, + this.AppTime, + this.EmbedData, + this.Items); + + Mac = Helpers.getMac(AppInfo.MAC_KEY, inputHMac); + } + } + + public JSONObject createOrder(String amount) throws Exception { + CreateOrderData input = new CreateOrderData(amount); + + RequestBody formBody = new FormBody.Builder() + .add("app_id", input.AppId) + .add("app_user", input.AppUser) + .add("app_time", input.AppTime) + .add("amount", input.Amount) + .add("app_trans_id", input.AppTransId) + .add("embed_data", input.EmbedData) + .add("item", input.Items) + .add("bank_code", input.BankCode) + .add("description", input.Description) + .add("mac", input.Mac) + .build(); + + JSONObject data = HttpProvider.sendPost(AppInfo.URL_CREATE_ORDER, formBody); + return data; + } +} + diff --git a/app/src/main/java/com/capstone/foodify/ZaloPay/Api/HttpProvider.java b/app/src/main/java/com/capstone/foodify/ZaloPay/Api/HttpProvider.java new file mode 100644 index 0000000..0a2c72b --- /dev/null +++ b/app/src/main/java/com/capstone/foodify/ZaloPay/Api/HttpProvider.java @@ -0,0 +1,58 @@ +package com.capstone.foodify.ZaloPay.Api; + +import android.util.Log; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; +import java.util.Collections; +import java.util.concurrent.TimeUnit; + +import okhttp3.CipherSuite; +import okhttp3.ConnectionSpec; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.RequestBody; +import okhttp3.Response; +import okhttp3.TlsVersion; + +public class HttpProvider { + public static JSONObject sendPost(String URL, RequestBody formBody) { + JSONObject data = new JSONObject(); + try { + ConnectionSpec spec = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS) + .tlsVersions(TlsVersion.TLS_1_2) + .cipherSuites( + CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, + CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, + CipherSuite.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256) + .build(); + + OkHttpClient client = new OkHttpClient.Builder() + .connectionSpecs(Collections.singletonList(spec)) + .callTimeout(5000, TimeUnit.MILLISECONDS) + .build(); + + Request request = new Request.Builder() + .url(URL) + .addHeader("Content-Type", "application/x-www-form-urlencoded") + .post(formBody) + .build(); + + Response response = client.newCall(request).execute(); + + if (!response.isSuccessful()) { + Log.println(Log.ERROR, "BAD_REQUEST", response.body().string()); + data = null; + } else { + data = new JSONObject(response.body().string()); + } + + } catch (IOException | JSONException e) { + e.printStackTrace(); + } + + return data; + } +} diff --git a/app/src/main/java/com/capstone/foodify/ZaloPay/Constant/AppInfo.java b/app/src/main/java/com/capstone/foodify/ZaloPay/Constant/AppInfo.java new file mode 100644 index 0000000..45e77ff --- /dev/null +++ b/app/src/main/java/com/capstone/foodify/ZaloPay/Constant/AppInfo.java @@ -0,0 +1,7 @@ +package com.capstone.foodify.ZaloPay.Constant; + +public class AppInfo { + public static final int APP_ID = 2553; + public static final String MAC_KEY = "PcY4iZIKFCIdgZvA6ueMcMHHUbRLYjPL"; + public static final String URL_CREATE_ORDER = "https://sb-openapi.zalopay.vn/v2/create"; +} diff --git a/app/src/main/java/com/capstone/foodify/ZaloPay/Helper/HMac/HMacUtil.java b/app/src/main/java/com/capstone/foodify/ZaloPay/Helper/HMac/HMacUtil.java new file mode 100644 index 0000000..f9a6ec9 --- /dev/null +++ b/app/src/main/java/com/capstone/foodify/ZaloPay/Helper/HMac/HMacUtil.java @@ -0,0 +1,93 @@ +package com.capstone.foodify.ZaloPay.Helper.HMac; + +import android.os.Build; + +import androidx.annotation.RequiresApi; + +import java.io.UnsupportedEncodingException; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.Base64; +import java.util.LinkedList; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; + +public class HMacUtil { + public final static String HMACMD5 = "HmacMD5"; + public final static String HMACSHA1 = "HmacSHA1"; + public final static String HMACSHA256 = "HmacSHA256"; + public final static String HMACSHA512 = "HmacSHA512"; + public final static Charset UTF8CHARSET = StandardCharsets.UTF_8; + + public final static LinkedList HMACS = new LinkedList(Arrays.asList("UnSupport", "HmacSHA256", "HmacMD5", "HmacSHA384", "HMacSHA1", "HmacSHA512")); + // @formatter:on + + private static byte[] HMacEncode(final String algorithm, final String key, final String data) { + Mac macGenerator = null; + try { + macGenerator = Mac.getInstance(algorithm); + SecretKeySpec signingKey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), algorithm); + macGenerator.init(signingKey); + } catch (Exception ex) { + } + + if (macGenerator == null) { + return null; + } + + byte[] dataByte = null; + try { + dataByte = data.getBytes("UTF-8"); + } catch (UnsupportedEncodingException e) { + } + + return macGenerator.doFinal(dataByte); + } + + /** + * Calculating a message authentication code (MAC) involving a cryptographic + * hash function in combination with a secret cryptographic key. + * + * The result will be represented base64-encoded string. + * + * @param algorithm A cryptographic hash function (such as MD5 or SHA-1) + * + * @param key A secret cryptographic key + * + * @param data The message to be authenticated + * + * @return Base64-encoded HMAC String + */ + @RequiresApi(api = Build.VERSION_CODES.O) + public static String HMacBase64Encode(final String algorithm, final String key, final String data) { + byte[] hmacEncodeBytes = HMacEncode(algorithm, key, data); + if (hmacEncodeBytes == null) { + return null; + } + return Base64.getEncoder().encodeToString(hmacEncodeBytes); + } + + /** + * Calculating a message authentication code (MAC) involving a cryptographic + * hash function in combination with a secret cryptographic key. + * + * The result will be represented hex string. + * + * @param algorithm A cryptographic hash function (such as MD5 or SHA-1) + * + * @param key A secret cryptographic key + * + * @param data The message to be authenticated + * + * @return Hex HMAC String + */ + public static String HMacHexStringEncode(final String algorithm, final String key, final String data) { + byte[] hmacEncodeBytes = HMacEncode(algorithm, key, data); + if (hmacEncodeBytes == null) { + return null; + } + return HexStringUtil.byteArrayToHexString(hmacEncodeBytes); + } +} diff --git a/app/src/main/java/com/capstone/foodify/ZaloPay/Helper/HMac/HexStringUtil.java b/app/src/main/java/com/capstone/foodify/ZaloPay/Helper/HMac/HexStringUtil.java new file mode 100644 index 0000000..80cee8c --- /dev/null +++ b/app/src/main/java/com/capstone/foodify/ZaloPay/Helper/HMac/HexStringUtil.java @@ -0,0 +1,69 @@ +package com.capstone.foodify.ZaloPay.Helper.HMac; + +import java.util.Locale; + +public class HexStringUtil { + private static final byte[] HEX_CHAR_TABLE = { + (byte) '0', (byte) '1', (byte) '2', (byte) '3', + (byte) '4', (byte) '5', (byte) '6', (byte) '7', + (byte) '8', (byte) '9', (byte) 'a', (byte) 'b', + (byte) 'c', (byte) 'd', (byte) 'e', (byte) 'f' + }; + // @formatter:on + + /** + * Convert a byte array to a hexadecimal string + * + * @param raw + * A raw byte array + * + * @return Hexadecimal string + */ + public static String byteArrayToHexString(byte[] raw) { + byte[] hex = new byte[2 * raw.length]; + int index = 0; + + for (byte b : raw) { + int v = b & 0xFF; + hex[index++] = HEX_CHAR_TABLE[v >>> 4]; + hex[index++] = HEX_CHAR_TABLE[v & 0xF]; + } + return new String(hex); + } + + /** + * Convert a hexadecimal string to a byte array + * + * @param hex + * A hexadecimal string + * + * @return The byte array + */ + public static byte[] hexStringToByteArray(String hex) { + String hexstandard = hex.toLowerCase(Locale.ENGLISH); + int sz = hexstandard.length() / 2; + byte[] bytesResult = new byte[sz]; + + int idx = 0; + for (int i = 0; i < sz; i++) { + bytesResult[i] = (byte) (hexstandard.charAt(idx)); + ++idx; + byte tmp = (byte) (hexstandard.charAt(idx)); + ++idx; + + if (bytesResult[i] > HEX_CHAR_TABLE[9]) { + bytesResult[i] -= ((byte) ('a') - 10); + } else { + bytesResult[i] -= (byte) ('0'); + } + if (tmp > HEX_CHAR_TABLE[9]) { + tmp -= ((byte) ('a') - 10); + } else { + tmp -= (byte) ('0'); + } + + bytesResult[i] = (byte) (bytesResult[i] * 16 + tmp); + } + return bytesResult; + } +} diff --git a/app/src/main/java/com/capstone/foodify/ZaloPay/Helper/Helpers.java b/app/src/main/java/com/capstone/foodify/ZaloPay/Helper/Helpers.java new file mode 100644 index 0000000..0b03a5b --- /dev/null +++ b/app/src/main/java/com/capstone/foodify/ZaloPay/Helper/Helpers.java @@ -0,0 +1,35 @@ +package com.capstone.foodify.ZaloPay.Helper; + +import android.annotation.SuppressLint; + +import com.capstone.foodify.ZaloPay.Helper.HMac.HMacUtil; + +import org.jetbrains.annotations.NotNull; + +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Objects; + +public class Helpers { + private static int transIdDefault = 1; + + @NotNull + @SuppressLint("DefaultLocale") + public static String getAppTransId() { + if (transIdDefault >= 100000) { + transIdDefault = 1; + } + + transIdDefault += 1; + @SuppressLint("SimpleDateFormat") SimpleDateFormat formatDateTime = new SimpleDateFormat("yyMMdd_hhmmss"); + String timeString = formatDateTime.format(new Date()); + return String.format("%s%06d", timeString, transIdDefault); + } + + @NotNull + public static String getMac(@NotNull String key, @NotNull String data) throws NoSuchAlgorithmException, InvalidKeyException { + return Objects.requireNonNull(HMacUtil.HMacHexStringEncode(HMacUtil.HMACSHA256, key, data)); + } +}