From 252f0af6fa9d1d22333eb9cd2f9ddbf8be6a2854 Mon Sep 17 00:00:00 2001 From: unlimitedengineer <277619522+unlimitedengineer@users.noreply.github.com> Date: Mon, 24 Aug 2026 17:26:49 +0100 Subject: [PATCH 001/310] feat: add reconnecting state with automatic retry to wallet connection flow Closes #752 --- src/components/common/ConnectWalletButton.tsx | 42 ++- .../__tests__/useWalletReconnect.test.ts | 354 ++++++++++++++++++ src/hooks/useWalletReconnect.ts | 121 ++++++ 3 files changed, 509 insertions(+), 8 deletions(-) create mode 100644 src/hooks/__tests__/useWalletReconnect.test.ts create mode 100644 src/hooks/useWalletReconnect.ts diff --git a/src/components/common/ConnectWalletButton.tsx b/src/components/common/ConnectWalletButton.tsx index d2ca0811..729f7219 100644 --- a/src/components/common/ConnectWalletButton.tsx +++ b/src/components/common/ConnectWalletButton.tsx @@ -1,6 +1,6 @@ -import { useEffect, useRef, useState } from 'react'; +import { useCallback, useEffect, useRef, useState } from 'react'; import { useAccount, useConnect, useDisconnect } from 'wagmi'; -import { Copy, Check } from 'lucide-react'; +import { Copy, Check, Loader2 } from 'lucide-react'; import { Dialog, DialogClose, @@ -21,6 +21,7 @@ import { WALLET_CONNECTION_AD_BLOCKER_MESSAGE, useWalletConnectionStallDetection, } from '@/hooks/useWalletConnectionStallDetection'; +import { useWalletReconnect } from '@/hooks/useWalletReconnect'; import { useCopySuccessAnnouncement } from '@/hooks/useCopySuccessAnnouncement'; import CopySuccessAnnouncement from '@/components/common/CopySuccessAnnouncement'; import showToast from '@/utils/toast.util'; @@ -43,6 +44,20 @@ function ConnectWalletButton() { hasWalletResponse: isConnected || Boolean(error), }); + const { showWaiting, showFailed, cancelAndReset } = useWalletReconnect({ + isPending, + isConnected, + hasError: Boolean(error), + onRetry: useCallback(() => { + if (primaryConnector) connect({ connector: primaryConnector }); + }, [connect, primaryConnector]), + }); + + const handleConnect = () => { + cancelAndReset(); + if (primaryConnector) connect({ connector: primaryConnector }); + }; + const handleCopyAddress = async () => { if (!address) return; try { @@ -173,19 +188,30 @@ function ConnectWalletButton() { ); } + const connectLabel = showWaiting + ? 'Waiting for wallet…' + : isPending + ? 'Connecting...' + : 'Connect Wallet'; + return (
+ Could not connect — please try again +
+ ) : error ? ({error.message}
) : null} {showAdBlockerSuggestion ? ( diff --git a/src/hooks/__tests__/useWalletReconnect.test.ts b/src/hooks/__tests__/useWalletReconnect.test.ts new file mode 100644 index 00000000..8657b59f --- /dev/null +++ b/src/hooks/__tests__/useWalletReconnect.test.ts @@ -0,0 +1,354 @@ +import { act, renderHook } from '@testing-library/react'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; +import { + MAX_RETRIES, + RETRY_INTERVAL_MS, + WAITING_THRESHOLD_MS, + useWalletReconnect, +} from '@/hooks/useWalletReconnect'; + +function makeOptions(overrides: PartialU!rvEw--q=>wvJ;NkU4 zg^Ahn>Ji&rGU}&F9ju24&+~|ry|xo@^xxNhW<$@UksfjZ%* z0Ass^4h~k`)KoT1abQXkhkD&7Fw|pGsX~ADA36D_KY?@R1kwxQR+5dEw5!SXzyPb_ zaZJ=n Lf;-;Lqvcs)KV5JSa3x@@*$wyiGHE`!O;GGj`+_@t`0r@>fmT@c% k#n));fMlwX;Nzi@W>45V0P$mPBCxYjHhv%g6w{65!94V ztp6WP=lzg`_i*9N(#n;Y6Gvrf<-n2R#I)3gqwz^C_qN2n1+lUmDb7-JQCeD=dyC=( zHTNDk!Mzbh5QMMq5AR=b?>+aN=dp_e^0ytJ^IP 2_#q%+82aah z9jTf9U9sP=zq@;F^z *1Xf+gp&<5O z9@kvy$=`gNWTeI)B7bG!le18spk`fL4W0wVA(^p|(X03!YC3Y>Vp}*zPrd2Sjg$@l zi9W+%)#c x~4Xsqf4Ml&vRl|HL z1ON8WqwN)v$PHjlmfFU(S`6>~J{IdPk8eAjsp$T+KBPo7(=kA&eQ-ozX6&qli>4xV zW3JD1d3=tX@8v#I4V*I_*^AP0e>%J6O~xvqynE38S~vk|$~v^J3vMwe8}7?03VF-B z52!IGh>?h+$=xi8lyeed>5Cs>x=pYm4~=r9r!OY&zg3DtQBJ>r$}uhYD|+#tGX=h9 zN6r>4k8=$9#+?08XF=rFKEVy4zW1qmz9`{jRk}tii#1)d&PipDU!u`3A+H;HZR^Zt z22HdE`Ya~YAhY}@I(=@sO2%yae%_pU`v-wO3>)7iNXLf3b|$QvXZBZXsF_FEsQD$5 zwc1GJnVDX%@u*aJ_=2Rx{58H~tVR7r;cIV LYj-aAW}Re7A5$74E8YhOBx-jgXjMlBw&nj~~?+_kjh5)$JO0cBl6JHvfMX zK;5RY&49H>6)5QUi!m)4=a56BjriU6QEW!Fbhu-cj9l=knQ0M3eZIZQ6>Q4!v1!y% znqyMw7anruUKGxlcTfLhJ&wtdwz2VQsJpvki2iC$U9zSPm|{_-`~a1YjrR$>J|Ue0 z@D%vLNAB}y2|1PF9XF(z>D}M&1u|+0)So#)q{RM9bz06%#*9JJzV00=ngW^r@2_2u zkt%$mZ-qF9mG>H3ozPG#rz(R(%BPDm;}}636kth8vdsg}z7z85;A=llY1_%+Cgy!4 z*(iHwrum`%e$>L?xc2lSL_VDXF^v>S{nX`D16N~Iml!|TGot$5u0K3;RWvgy oqX9jJ3)cd>0bhv2j;29t5(=n!iALgO*0mOv6pW^dIfhA8wymH7+ zNc0?Y;qd9;7FT%H&K}Zsx#n#rv~_8sbS(FLWCbQ;WqG8l_$2*fN&AofTUxQmg~c+= zQZyIk;|uO6WP=XB^_o+;rc #hOJ|kV(XJPKX{*g)#2M- z7Ij;`W90qa%E1~9ky!w9|IahNs$h|t0MmlZ$3Qlc-|3Sh?(-imdhPUAa~<2{bCx16 z$QZRyuwIXs|8-|VM^zywa#p0OVlY#D-!tr4Ce%7}E*X`cq#LfP1KlK+29)ft9p*>U zBf^g{7r-I^T+2LwcT^PzxGSs@-BC@W3)sgV6%jqFZ&xfs9N_mHVg4G&wbRX3kQ5dA zS_q-D{wXrpYBrnRix@o>=3U6As%XbSvkx?4r?o7Q4qX78!NL!7z+M?hAh$#~4u&jZ zENsGf#<~vUN5dHD`4}|29;uKNQ^JEdkccdzg2M>3O^(IIGAc%rH&(Op>z%py+btDx zAx?BcnMSkt;aN}duqqk}8u%e@m4>p&N*D=F=OZExVyO#YI9!3P)&R27_AsT!^>90_ zv>*-k&K9EDo;Ra?4g5G^+FJXOr*VpO&gSRGO| --?f4$VZ4{9?x9*ALd9JlKx(&qk!_g=&sg?U&N+MoH>)R^gjVh> z=2@TqeDk=t8E~<7_0IQZr(G?LFv!%~{00OeoImTa877$%(3JScJH;^ShZ-{L7;t}Z zGxuBWw%GO1>gdM>2rlp2VwO&0%jvMdK@imNkYDCgp2HYDQBL5)g=R~qbpOD2S+f-k zC;Vm2Q05RSPXT>Cs<;tVUk$ww0CLnwv+$12UaZ&i1-~DqdM9Vchcg6lmp&sw^PCFr z^l6RcKK*@?D_a@6U73Y%+t4>3=j%M@=Zdv;hGf_kwjA$Q0d+EAa2g7&d|QBw&eYvR zb6l?T5v=up+M~M4rKO?PwY}m1mJOIeL~D2s;pe)u0n%)FEUPoFDKSA9?`+6NMA4aU zMNE54!%OiUBUqd!E2H$gZ4S#wb=M8tuxi-q4r<5q+Koe}jNLW05ZJxNSEtv-H2H2v z-)}2*7%#I3d(zKdl_ZlB8&K(5z{AO(u$Xk!Jcq}e@6u_MRwkE^mydcVM$@)_^>yRL ze`_CD8c$4ZD?Ebb*a>qE4RQ3*U{gk(8vct;DgAr+iyqIi8y&`)9Xau6%;0F` kV(Vo&XADKO@o zbTM6)SqzTbffgJG)qIO}V8kcrOvXhCOL3#8g#LVC9|2rmy{PAmPpY9TN=Ps!5>EwQ z!IBbEI_bKujgTjTRLAPqh4*?EnlKyfMr5pU0bYs?_8OX!op}wga*)z?(U MKfBF27sOqxi29@F1S~^T0?CT`@t=F=&hJL zN+OrB=|UbxM13vzyuD!o>UZKN)hhF%H?V~g @A|J7;doSfXQGN=Sg=)Dq%<)TzXl3J{KEmm(mn30;TSR;sB5u(&jaUA!_gQ%(Mn z<8j0Ybt$gulr1_y0xZ?dOSHDZ)=1Fzy&XGd+uu8f>`_w^x>5=@(`TLJ`89@XK>5l# zPj%GGHO`ElmNcEOr6OU+^+zYTV188()! Dno2A|dax1(v zEl&}1?$)rrj$1r!#cGr00=|J%32yIzo4z+_$Ph4-G-2=A!APtO!;+ti$*{P4HG~`` zgMnW#Q#78iMUh_%(PIV2lv8Z sXn1n2;pp_|&G4upTfVsC44oF~h#q+c6Q5?Olh54F3IYQo3sQN<2 zxv2o3B_M$mUcGQ_1&m?JoZ?)iCG&pZoug=#4cEglHpD%TQcVlt2k3zLNhRGTs&!e3 z{T=f{yJ)n|;xwf}BOg3?==tCV!(Z(|udij}`u=)D-6~|kkorx^ws(=X*9I8FzR?=X zJ&Yt#?d$Z%_5d|1BcuN;k+Ze$0kflXXBri6?Ri1CZ)sXb-RJA+b-k^Cv`CSQx@Iq_ zv*()XYPr(5ng(onDKTzSs6sC~(5_W `Vf7z_0o8FE4or@Gv`)K z1!X}iu-aT{jUi~R(zL_hkgB2d+|NlK6ng?6+#o8`YdWn(8FB#dg1rp@wdGzmB=r(} z;hlcYCiKh%9>U9w8Mkrtft$4h>!yLd#XO~}$y|qEn>An<;k++a%OuQ31!M&Wzk1a; zmnE@9=hLZc6H3TKe2n`kQ?A KMkjA?_TEu+DdcTbbk z!PXSE!iT_D$QczQ7`HNPNtWP~d! 5D6|3A)jk9F<5b0we zJjC|J9ian{P3)DOpq(}K`s%sk0%qZff>zQ$W-v$chM;$KV;=9fnf9$|E@h=NaM*eA z==TnLmop?1?X7(V(i`{#oB7^Ga)){)1sy-_d;PXzz)<;2<=&l_rMGJ4ea=d&hqFH9 zG;%n)v0Z-qpG@uKm%m}e01wQ!Gn$&ao5exLPM*2c%EXY^vBkii*}xiPoaL|K*Uy6a znA&H9LC_m=&>e$ees^C^(aaXNJu`*t%uAA!rMuscrD9g)?XM1;NHK-NbKATe`{fgp zyS}KRr*oaV-0b(=%j|SL2$Nj1SN}2R?4W{gL{BMmZt8LXZDU(dSMw5HbQgN}N*%we zYY7Y8{mv`6WmBQ9aeiZh>uGt7T32dVQwEFuo}CW5%fzuGd^_Dyc7Qs1`pnhI6$KyP ztFSus!*_BKuzDE#>YlWC{!J;DnM|yEp%38)SanMWk@{HPqO0s~`wE3f`kHwYwwOzY zGy!B#zx4#B8!wBh?$CVs%CBLAu$KNS;cDA-%KC&<2{*FrVAE*J_x&$R^Z3mT?#(PMeSCsn_quD-}FOH?)3!#ZdK3J%}g zyO O=&jgEk$r1xj z@2VX-LQ={fO4lO}yxXgLPpnI;lh;f~gUa?sZk3PLbFZE-ncG&=6J~=?)P~)}o$TJ# zkOi8t%L#>g=WzYeo%FTuZBMFQ`9y)P 5;wILT@u358HFUCK+n?a9Ll}8L4VMt^ z>VLZ&)h-L}qlWYxB;M+if6qO &xOQcNrpiO}z?- ztokQF$e#&|vYx~}+Pe~9R5TSkNH++qdJDuios|VFu8taaR7AwHowcDRe2Pb`yotWq zzUR2{aLvmD3erX|-D#{k-VLG~3cfoyT M16Z zyNSON%&b?1wx=d;N}*az!vUgh3#g2Sv8oflqWVt{2dYz7BK5awl^N%)ud}Pn0si_7 zr@ZIWi(^Y^WfthsaKGJ2uI_GVbi3^VeP!=iApN7*q@7%H?c_bV>CA$)l6#Dy7*CqR zsedOcT_M3F{Aver-O_NSBNNzj%S-MGxpuKEQ=a5Z>n)npU+l-cpFZ->@WKKH3R17| zz6|>vR+aCkbg+vmGs0?*s#Z=8rMy6TYC#-z`0Pkd>r10c!!YZkn1$FGrK?hqlrJUo z6LelP&}Yoh2IkViWQfHmOO+|gu@)GJPcYvqdln1qscGV
VKQ|PMzHptSFS&+bXp->EtCUH2rx8!>})E(+=j& zVnC|-r_)Jk&jYTHb-nLSjqW0tD^BSM3<@A&^+&I^5Lw(-mJwAt!k{KO230taqTt47 z%3!=Kym3#|Zm^HdXPIL|<*4$vBg`Sfqil6&>8W7ypu2S5Too`%LzlF7U;5P@RZ{A- zW2TQM_dJLt%ycZvUA|)ywlQy;-Zy?2e%@(pDNpN>nV*!iTkyH~d6;Q#*%r**Q}2CR z$za8JZMX+W%7g*qPf|%|41Z~&YN1zL%f9X`M_e9RF)VW4K; I8<<77Urc5y6W$%OP@x=zyv>4+Ts(`sI^k(QC>rj0o>JZkwnTl z>b)4Y%+t)hKs@2IcN=QptxZa08X{u8AxwJc?Q9w})z6b29$johwRZ3fR%-412%8`> z9q3t-kNHmvKBut+Q+(FmT{yG2Ap`mlL?0kS%iQ)%#Gy9ajSU3gTdLp0l&N{8rD=W| zq#hAa=9mME_o+Xu3c#8h {%xr8cl`$JyB@gzoushoF$ W^? z&CZsMTZvj5XBEq=8$97DE3t-Kq}M~0b?80+dPm)(ATAFq?N0t2 =M`qZ}?B ztQ&cdEXx@Js~8zV9E alJ0&dB@om^^@?`+@ttc? zxM_jO)x|4eptQ`i+-`PnjX)kkS7=pdUHX=b>e22m9$I~~gSR_5r5}hbqr^%00CfI2 z^HdCMO}FtMz6hd=yH@(2KaZ^6df82}L6p04YNvSZ)JvX6M}E+u4)wozMV>vD2?QX9!^Bgqh``f>zY<6)zA2&EJTr8D0 z8+@6_+1@-h35-x9UV70|x2W2Z&aW0_|JM1Q<%rhPTp4ly`uVh9ZZG{SJEV0xUeE-J zb`4|ww}gg%Q?{-Z`UQG5k5!#LZ&cdx ~UZsK^?ap%oLK6?vqA_8@KusDzcFiPR}^~^v>*;&%;=IPJVkG243F5zw>8ajxUYp z>SLkq&RzHY7z5Fuh$5Zd8;V{S+`I}E)QXESkU)MLcdC#ae~0-Hk!I*?7d!rHQZ6;+ zp%*}-JlOO^_=%&bvEwiUfw3Ql4b#q6bLlATdNuU{4OI>tF9u)gLj2_?_KSmSMKx*X zEx{kUx&FH*_k$l4?dn&3TW@o>zN{^XXdr!9<6WR0$=^iY^QPW60ajZ6GQYEw6w|7f zOHvLAQPjd39iw=kGposvkl34jQ1IKI#hCHl${Fu2soIb05;Zi}hk}CiebO5CU;J^M zYOS15oH`*wN40FkbQ=IzrC{nFhSXW%{H3Rd*MQup(vpOdo3@D6>2}f{kT@vw=903` zX`#9--(PbZyO}=*XU%_pwm-~&&Z$uM_9Z$pjo!{Bap0RB7qe1=*DKZfzAHs4D2dMq z%KO7O_AlN$@nwdfd)$6Mx_>R|Bpr3Bs^YGlsO%~wEj?RtVu%{HVHa-J!qx*6SL#<& zfJmkspt3DB`c{D-@%&?JLKwlMSI~5ix=4L1QH5Jn34_$Bb!6*RV)4G$ocl&!*qQN+ zOGLXl%uEE&y}+6(;85T5Bx*-CEgBUAS9E5t 5RAFA#kv4|vTI39 zY8Ti1(nT$M{b!`z)}{tG;5gGq7U+eyZ+e|Er!a^A(->+Aoz3#vH8m}t%lc(d|B#*I zRTDrk`;T(`y*pYCJH0id>3**X >cJ5`>&yTN-C={LNfjwz^r^-h^FQ96XTV2h3EK?PXK2Y_d z<1xrgzJJakP(3kml=!v*W*NRW0od?;wiRBs%z8p(jn5MWhddAfG_-qCKjxB$Q^NCb zAyy9gs=Z!=dBj%KD+4o~H;2_nvY(d}ZYXGJ2C_UyWt 3@sFn4)^uyG~_+NpaSK R)@EMM-sL`zH9dDnNzRj!yTrCbPwk~3h85SR_;7CrP*YM{ zzch-{Dn#y;$ZH^e;IOvly8>8=#gO*=Hm=TeU1wdx`qq0k%+wE*F_!wHVwmz?_^2X{ zN{$JqUtcX*N4G7SJS>Lr|3TIy{Xor{<3I`9hQGJW4&8M-F4DxzUQjcERgERZY8s%D zonDnXlvXrtta-6{Zz-(7Yv#-Zm4z#-;5h`eO`3smxx?Bnaot|w?43qP6crX#&G_tf zCK$=iv>)avmbFP0+z#q7vY~1A)CB3xjhSI0wsLkeN^+y@H|SzPE{dZk$VVO2oq~Hd z&AE}p^B=uaZW-E$Bf}T8O?QVYpz2md-rP0F`w*kvxA6zOI$TI}(U&*jj&a6m{dk^& z+S!je>T3v(ayvNaE~q0&-nI+oD9i@<>ur@C55n0LVII!{^6>AF^eek#4m61)xL0cb z4lj}QG%~Kd3?bsEUXCzjRA1$1P7ZfbZ#6=Cx^|>Qa31(KTC)*i_^T!7-)ypcxm4-- z4=nM<1|Ef&9j&IcPjF#827mEdcKikY>YAi*6U5u^&hf+n`)$Q2b? rngh|+*MIh7fWm2Txj?7az`D)*ntUC$v)2;)%A&O>~PqA>wrgcy_(Va zuFJM5`1jcW`?oiAdf@PuVViM@Oy<@~0v0^&zs06Jr4dy`pf;!to8|{2k@(*p{!_d9 zd&Mn_wW{j5tYRB$K5xz9HZj_t7R6Ip{@e)U#MJ lxegMsmL4OXnkRkiwaN7j}{m?&fB_EaT|v4a0Tr=p-d+387}`HOJPNnl3; z%##B)I6R)!9y3<%f8LZ%D46I5`b$-k;D53sdp2+(_3~_dRgT9FPE9-Xor$UW`!{67 z_CMVS?=tK-5=>OsF08H`XG3lbjT=kE5jM{CAqpqNaGlm$_yo5&Tj==5N6~4m5BnB& zqM1?3MuqHEA4g?;VkPUanth#Vwq#V0VgoE+KIyOsDM>kuCw}5Pa*e3^xi#7`I-0S_ zbu>Eb^p(aE6A;*z*B`16vF&vzxaH}1(L?p9@{GZ_sONOvPLN76K%Sd8VgTOsi8Gna zT{#tIIc#)jzYr7$1N97EX~_Bnei&RFI34^UiH&D1QE%I3?W^ZCcY9W5g9zQ52n>M) z9=8TDq{p@;6japrPBc2)+q!CxDht%9_{`)b%<3Z7MGx2p*TtJb!}Ub{@h1ztV@rN& zyN}MPB5HKnvJ^Z{m==XEA-#fU&jHj)Tbsw8?eN+ Ltqx&~EWGmHi!3yyO;Ne|? zv+6Kki7;JZ62ln@I@yV$iKTVg*F0*3Zd_Tu`%udSq|RIPR*tC2w@W=~P(SC329@~~ z&p-0MTLoOusF`TUeO+=<>84?L-`q8@##t3!`(IaTK;OOWg3up0aErtKZ}44RRZY1! zMWxnI-)h@)5!P)}ieII9K7}}~xIu7F2dbNHyC6IVp2^-w%_2Us5Ugg8X7979-je(a z%drTQ`Ez RgD{$ zuvF9<9HQjm= {Fq1(%u_=nIm|A)OmZ3*|3r2lqgp()k^apUW!El z3e|J9ou&?k;~&-^j$L5sU3j(ds2_Hz=%IcS% &t08iTg!ZEtCg=)B33lfI&*b5-{FK*ga@1*cz0@B zd8^}>^SU~h0U~Y6^s1D1 Ymp&?MGcs9u1KiwszbG|ci0Y15{K{$me10k eEcg50I;=>{xg zd^yVsvO6`xT`nM#61e4SA0XRWap3EDaQ)3u XcSWNL){ zN@uc6oena^4UGya>rKG6VPAto4|oHg3L0XyEJu>&G7pn4QIC$GYPo#f2xRRs{^y=d zm8-kh#hHo7r$yZMs(ObGz@4tg?TbQlrF#G?5RcFbXx$#fjnK)gSI23j^1z;K_yz`! zKfsPj90+$ c*oJiJoUI}Hob z<=N~`i>I#3*I$F+ETV;fEcv%6SvH)#4X+OUUJs&} J;_$z? zeG5mic;~BiN19pNZMPUJC2jtY?v>JVK9|6@tt|Nl&wn<3H)trzj}9J2gm++F%&Cqs z7h)^;Q^^+Iw>D0@XY-CcW-`6zupZVpg{O~xvRVlWDHZ+g1vXB7d5&C&;tLOZm&}zy zj8MPov0LtSAocP?MQoGra{OA-Lfr#Ls)JmB A#ZAmuqIOKX~bKV)9WP*T>%muXBe??UD$~k?{!(hlm5^m|JTv??|QfSn_n^)*Y_M zRCo{r8N-6ucIK|ES$0YOSjP?j&_SOvEv;}FiT3#8H##^BwDQN8Yr`huUnvQ2Zr@8* zMIa21hY`E;8x-nRJM$>S0PF{UH&EKAQB1-Ok{{s`8-Zg7KhXT_;c^K^F!BV1IMYH9 z`LK$V(+^UfN3hqCCoN7I%uYv=Lt__E*a5*)l-{ebwj4mzOXV92U;Np$dFkdT#lHB_ z&r^%pV1^@~W}0AL-j$rdAV&r3%} ^}S0K-KaUf^E?+vC9*2v3XsQbX|o;_^H&) zUBWo%A#yWMoe}2Blo}^Jzn0JH=_3&Y(>?DB54w8~YH=(fLZP~#D~c6L3?x&>R;Rq= zc&po&i4^56(D{d*{RwKmh7HRq!?D{*2m3eP*?j8cem=U`%%hw`~FOD*mydytIG+ zPrvc{WV)7OsE;m<-V&&IMNDpHGvx5`eMdh#TDK)*m4BwVOJkPr7qM^q!Y*t=y|eJS z+N00*kE+Q*DI>| ~Fro41MI>it^(2F%n>v#2KjU3y=x+4Q`4H8Q)pD2i z%o8*T6}z{&06En1Z1~LzKL7IXdd&==V@a1Y*souF >^yI+U9S_oMe9Or~=MGu&1 zOa_yuL_68 ?3d=j735C=EY9{sZck@y%_Ux^&9<< zr%~P}?C`!vIoehn?H$k-4eR$`24=ONPq%UapiTi>44QcCmGD}rG;3Q;4fxCN&Q2?w z+S>FhiN_IXkcl(DE}1%nU*lKY2VD6Sq%@I-xXB`&nnk@3zP0Fe?{XRAqoiiF&?e`Y zdDc0{;&x%VdZ+JKTQwscTye%5WPIt)tVe4OkNZ8p6cwxFVLLOcy|l$m!v$|r+H{(0 ztk cE;(v0`!D~G_c&{cv}nl96#Kvwm>k~Q)S@!!xba?^O*?A z;D&ZrCQ&g|HIq}21RP5eo#(dk>|W6RnRALDXF=Lpzbbi-QH`8%J#$=NCtn?GH?xf& z2k^GN!sRTw8!e_D$%mID&Z$8icVMm!)+WMy``z73i0A_pokkA5`{S|Ifd_92IEA<; z*@zck!&jf4q)I7n4JNmU!zVvR?@0aa@6{*7Tal5Q0yb2E2vtfLguNP6+= tal;0 z1yS{p&MY+MuX^0|*BO$U{gELo4Q *fk3YW#h>DCyIQuCGJvj`}%9Bt)6)G#Y zwjEPk@4Gm^0J$k9CA41#v?hKV1sj#H@mCc33GT?>cWGO#0y!8BFRzwkP~Wh9fka$~Rm54knvAp9}N4GFOh5=2j&b4+M8r9XVX7$F+7|*W?Xc8TD0w+QY zo^doN_p=px5kokF16r!n|9dX1Vhqfg_`?X^GsaKt`c%}bnQ-@X?+A!P7K~XdHzU7X zxMI+w7<*V&dlZ5`kqL~~x7Mlsur*$1Wn_+!n$9AmwV%dj*Lr5@)XYa$_f5*dzy^!2 zU)!mMxA$vnl10f&G-_{yljl_)7sZxTh0>pOf&6NA>#L_B ;pjR6hbzvp7%ypy;(SQ9v1Co; z6Z`(vy{>%X!ds2zZQt|cNP26Q_O~A#FPDdlY*&A%y5^bA*z5J_Z0dQQ64@&7fEkk4 zpw*d-P4Py;WCbbqg;J?zb`X)(4(F+4z^@mSSXBRo+4Lrq|tq*~j-xC1^yy Q oi 6?;L=vA6X0EPr2FLwUB?FOds8 znss9WkP3ArtEp5FV&-tH;KWMH5jw50vwj}1gS9wT73zeUmL%K9@0Afz1M#5xXtov~ z4UN=$UdHh;YM`2_Rfp+2e}F?4u~6pq?L96}!7c-Z8&eMoaJ>dd^rWGjc>F4v_=*!J z0Dbpe2P(wuN3qQ6df>gP9v=UB*h@KVI;K%tSkH^a-4}@+ESq2QFC$S?ZtU8^r5P}j z!PuX=pPFk)3AJ&qaWm~oM}6)ar r!W6hd3e^dR$}ifKQ5^RS^+K@>Yw;%8wt zjPC_{19>$H@&RUJ5a0KnZ*E_dmN2ooJ8|OQ%V|LvAGCEhY!r%7&Ug*8sT=(;Yw4c# zwfxH+?h!mR`R#!q)S_Wxn7x?GG-O=`vLyjj!hD*5`Ry*t?{_6ZyOZAN6%=a5`kd>0 zke`W*ZLIAV-+V=<=WIKiel*9Lki#>_#;7Q93?*x3EsO9#W!V6BmtQ`=1wr@4W>19i zh~4p~4@b;8t%HE~yxl*xl^#7z P}o4jM?C z+IV~g2XwL$|G41f=i>VsZZo`pZY-vZcdNwuI3#oOFg&z{t2U&oUP*}TCv;c>YJbC2 zR@#KmYM*eBv+(>TTB6~%`}$xBW-@?Dn5(R{U{p4)?QTW)7B{{qCoVF(=@tHn8kQXe zH7NG-=#GHcA@1pvx&Q5rcRB%gZKcnoNsFcIyy)1IdThcI-ri9p+1{c35*-y?dK4TJ zmG*dXOXO!moD QTM0^pINln;UJfpqR3(3eY(g z(bT-os9{#@v||?Koo*co#|+)sa84$CI9bj$IS8f53BA3Ey?b8I272}lN9tu5*7?L{ zc40nS>8^I^{XT_3;!vKS$cKYl*H^t3-uUp2SKKI9|L`2KbPB4}C(L`ln>;&Ok8iFT zCo@=t!90SF=YxxdowbCgjBC3VKFGGjL#O2GIn-`vd0wIf``%9vHP-o9c(3t&CIXpv zia*YBf^9+wZ6^uqU(4Q?c`EQ=vy{>H2*{N%c8wec+m^1~h+138CcB*}xx&QFG0DbY zKIOTEF4dTq-}xI`Uc){<8f5uqLpUo =f2LGS z*!cF!@PXmCaCa+>0re0EVF_}U&G5nQ_oi#TWC`+AG^y;m{<|V_W0}gUy8uZxiT?T& zNhylji}jit8q*gZDE$Kw9IEMYFc{`p6sVZESe)3WCM6cI;QLY>XyYQtu)m~3?Ek>f z{8{i4f=}NrNlaFpJr}`pb#}M4z|`u~(@-Ki?R&$um%VGKv {+CXS3j0x|d9mMnCdjEZ*vIvq z)9FdFqDV>npcZ}cRdn`ozp3T*$QKR4ZEvcI6k$49-^?g0nnu~ ytHFe?|-r0izq1mPW*EcdKlcP7+fZ}bVMXd=$oyhMXHlJ2AxS}Py_#+0$7%!1$W z{P0I&_7@A0{t8-;_bdC!edvHZ)rtFkV6WT36hJwp=L;s>vLOX4oi?I@=YtdF%sZ6@ zu4dswV}E1>Lrj$k2=k+F2T2Y-ZTWks4YYmUFm5~FRxCw?hTW?oCN^X(@Pu097G}6Q zg4-6l%&mGVKr4SdUSZw*-q%__Zn*0 |lpnX>X)-2W(kBEhlU?3HSd}?+#!il!apn&rqSCky zsAVzydqGLh`9$E(ku>gcZm=e@$?%RyXsMv~@plPm{ka*;U4nQqRqIHP;ae&6-hO{D zsU$EdcD&bl!M(_Ae6;5LrIbaRZ6qA2o!l$mS!{-Fsz7S}IkvvT5wT!wuF_mv!~OJL zduwmPVs =kvL|H4E@7o?N1%S6r{LVZ%xE^BJPF)a!vvxas7-<#6-4Ne3n{?BpN1?QgQ} z2TeiLYNyZRb45oTH7g0-2^FB@_62H}LNW*m(YiBC4ns$CUBiOv7_ZZ2mUpkLw=bsv!rP56uBDE&V{`-jc$kh3^td z<(}edO~O$nAu-nG(qa|5N6+H7>}`90@q9419dJCMF@CinHHogdf;X2N8Mb6WoFH@S z6EpL%fXrGI>_KPjOA@z4Tf6w!x%g3zquoKsm-o8a+;N(yFj)H1c4~CU4?bNLliw zE)+PaF61b>fKRq&+5Yi|H|J^dgBG9s8#WAlp0yp}NGWya41j(k5?bPsk%-A_V$WWC z-ToB@F_8*myTm+7+Y#oG@UN~=oEokw?&YADmT_HvUh4e2Z*dp{wl>R* ($~xG)`r~B>r7Fnali3E@bZ~#SoNsq{3VY) z&3l?Maf`DcVxqpp(E{D_)c9+Ba0c$s?!VCH%iR8d?L7XaSrDqGnGj`}!Mt(3J{vp? zhj=_84NQ$ysdSQMtXq1Hb(#Vs#YxQlaRFOLP`)EM7E@$670WVrcD>8raTfszoy6_V zW^zwqOtls{UeO|rBUR1 zO&`1kL60=o~MZKyr0Z+gv{tNJ+7G9Y^D+m4v0< zzJ3PYuUx@{bEg7vfDlm0T_Ww7HZ?f8>i{OUi)if;z3}PWl;^79lm1{!v~|z7#$aAI zUKKV3AF+ka!Qp6sT+wA%@(82Rq_1Pkp4xFIV68s*ilcii8KzV+0tzy$8H{`T7!?~- z `rMB!j2 z_x1U2Hj|aRTWbe&ZOqeyqkW)sq 4vr3|1rTd-gluI95gLKEh*IM3auGmEv%&>gEoWgr968ZB8 zs(*AL)(mHPw=OY6F+ev=tweEI*gz*Q@hnn;Em*_zbRi4;ABP*?rvf8eJ#N$8!3Sob z%eyEYX}&-Sdz7O2b)&bS^PlHCIc^`#-Osq!$d`H5{wixfLHV-|i~7jH!@J};7wK Spj*$I!nr^ZU;#Rq0kgya@<-f3gxJ2|u i{OkXRf)N$MW! zD!%ZB>eVRTe&a- G~ARIOLP2y{eM#JkPr+~WkI?xf81a3>r3tFvvyNXX%#xJ;B`V!)!MTY zLOo#Dys)fW_LRM{ H zg0!xZmp^p6O!F*z+LKOYg!6cdO^dx_U$tPPjnRy&*@z!xTwp8FE4;@%QmsxMEB7 z3g6ZnL8^a*U6oAcMbt@kxBc?eAlI;YQvpxrpN{ba_4 W?>PAHE^s#rxG3c|6h8pE7D6nqzDKD$amM zIY;&m%^&6y%0XUw#zwm`4$Z8^^?o9+pHs1wMc219$>z`T4aU-@2Gp_2=`_}w-U*g< zp}^2h0vh4>7cr}F!YVP`!OAyAen)5GI$-pDj6?b6D8vKx;LlqVIMiYX8n^T;@KdUe zk*`2DG}rN>sr-a%O}BGp<*ZKLTM%3!$#I6IHTH!Ee0Dkd7qYI}@8Ai2=CF0ff;9M9 zMD WNg%anGQ~@ zT5TJ8_VBXpv3HTlk}~O+h(ffJzqe}ahIHDt$Yf3aqz`GsVMRW%SbPrgb9imv89>j; z>7VTfO}PS4=LS)AcYj+?d>wI(@iwH%f1_~P`W!k%0|BW=o#h1pdCQ<7uUA>dAmG?< z6JhNma?rh_@u|nmb+`NUlK3(rtc+A4qeIVQxCM!uY7|c9qi9Gq zydwpd@rm*XisLCuXIK4|K`dC4eSNPc*o9cap-XyIAmpk=9K!5cm9Q5rg!0oxsA0nQ z;P$NVxv@2ixlGB!xs?w5Sox}*MfRtzQEkF-Y$QUA!42dC_NC)Kf^?b+eq;1|D*!Y+ zl`%LE%Mw+a^e5rcyb^R8+t=4Ep&^mTj72+;_e=e|F!7T8dxr?W^o?^{0!`ct2e|61&9NyUWYA5^wkAy ztwZVJE=uxjJkp|&D1JbLMzf&86YXRi-#}e0l&2SB{X}*!>Fh3zGh(w3*BwQ@p&Pq0 z81{qfox}!)E5qM)djT;>6H?1>8ru~Ec`_ifsd)YpS4*YI_s9LqeHGf?hn79rjBfSv z4h|E;H1_q=wx#MeixUGq64{Ib&nJZ(^oOZadA8Hj^i|5ys?Q!<#M(+)Q6m84uCP>% z>VH3;Q=YR**(ludUhwmso{yXsE%1!y{2SQ&=}(Fv&t6JnrLfa *E2p7A{om`IJ{ z4Sa>$>Y98-JJZ*(nt2Ituu{=W*KL_9au+LRs4_;Qia6qKQ;uPagoTOqPC8oX$f2vu zYSJpPm~Jc}R?Icg{V-Hspow8r6VN>-lcf9Cm|LVx%1b*Y&0Q7S+y=YPtr2G0R5kjb zrXC+HZRC5^*T}t)w)b6hptv~J>+nuBH=Xk7`)ICEkI7ci+^#vPqsWKsU%as#=da)9 z8N22-2RM!DcsFP8w95@p8MOU?hJW{$GV{CyB(0nT2Gk$8GW*8J4#qZ~0K)ZV5pBz% zw5H8)H;s1tL(zI>heT9~V{lG9eUL~|agi0dxw9?KjqczGQZEG=zFAC|fiQF!J4~`5 z!_E%({)AcVJ#u-KswzdIn~&aK=A9(tqB#*3-aP(IY_k@cna#x(9;66#2WI65pHo zeo4h;Mt_6q%bDER@q=xxly~vZTii^RS+q?QZo9g{BYh&W(wChT@+G{n*c+A;i5xaD zm9UL?4(NfKsSW7w=o{Q0PEj|5X@uMIw1`tA`b78njbPGwZ#68fl8rCmRF(w_yB-#B zJbJ*rLRfKVqp)YiTUv} 5{wB$qZ>b-nqI{I9H;j60#qrN z6#nTjsr@H>P_q*fXZE}$i}OG=^x6C+Tl!2|t+X_{Lh>CEpA->+7zKwB;S_2sHmS zzuBM&BK~|RG@liJpbv&WX*No&wB~j1U!JmGq2F-71D0|by2uaD@uCO->4H1wy|*Q2 zf^CGg7-e0D_P?^_V}pX*p^n?{nX%ejHU}k%0ky#!SsyT##})kICq}wjUEfRpqv_oL znf~8Do)pO`DW^G9ih4VYusKVLdON*4lG89D=6tr9 KYag)*YkDV9@q7_-$N_$MOLYZ>`jc-K*wz?TB5n|p8cJl_BpfaxEToG zB{k`zrR?jc#fkx~3JNeICiPj6;ndS2m4^iYCl3$X4oUk_P+(rTqE<`{Kd+6}f6H z?@A3q;N+zvt;_97lhAJ(j;93N$X>mU_+%i9Sn0w;R-8ky*1M8f@9f)S`3xG`hlGsy z*DzhvkK`mhchdjmH2wU}B_=5Lyr_Xsc9G>QQbtSRweNLIX`AY(DjSLu?XZmN6KOJ2 z5U&N58hmCXkE-}R3kPMIyXh5X5Y}mC1O=K$<4)0|zP~*Gq@WL>exuF*2v2A`$oODD z#2V=oD;3YSV8uO`7_R>U^{ZSeourSQ*PRO?Apr*)64m^ *T8gr313_9K- zt^vEOuRtlqs5rf@iia+_2`JX{-MRu42HF!@@fL`l^_|h40{XH?-F AJd1)ta_% zI+8zl91Y>m%%{cj>sKkFtdSczP1lt|nyd)dlcKu2+yA_`2>1IG9n||w2{e#TyI?9l zr9Em0e=RbVJA4@Aa2Q;i_yo522Q^isWBQ%rB_PvBER&^m-4BpL+x-HSZ?3F#!osSr z$eJSBc3Bk*dwtX`LB2eICf$@1s7?Mj3N<(`(Bn2NfUB>m7JCt=wNj)y%6cv R)LH9)S9GRw#lqtL$a*T}glI}PtzlRuXa2E7{Em~K90v_JJ zF4Nw`7!fQngzrQ$viIODGlI4Ych*+zr(5Q8u)N}dQi46kQ7| ?{8-Te#6FHj0_>4s!$N#t=Of;{GA-owRbFO zQ9b?tEP$MskLF7He6Y8(9JBCy6B+l~ {rq0~jdCrx>Y~?Zz3v!YFRyxSuxWv}ae^oiKLJZ! zm{8WnpJ~q)_jdKrPPWX``8YB9P6PJDWTIoO#jOZs2AT`fDVuVaS!JW&gA2&iJ3MLj z)~Zv-EMzBWxwBUmRhNL>RgMl2B*!jo(snV6wnq%nsto_Thv;z6*+t3W7mL?Wz^HQU z*SUq-i>Gu8`Hf~0GvAT*GA=v;L|Z U@=gqcza-8tdwF{jFRfxz}tv0l3hqT1-@%~yA^{ST!FnccM=4!rNZb|OnY;Z=G zSh+ OajD9r4Vwo`@q-j$ zYw5>E#5;d!qCNEPyK|Wqp zskMBO*|vQQBk>#=WS8=WwxH_NKsmZ}PY(e>=bG--82z<=y(H)X8f$nbAqR(7{n2vX zy#T1#Sw5JL9{;HbA8vn0lP)z)QRLGq!5H-Z3Sq3yh#v0A=7rA-YYyE<6q)WRzVGoc zvopHjgXlTfD=V;C>L1LqN<^t3_koA&(T5$9SEl(YH_T2@n&OY!e>~B4^7d&<%E@79 zZQ7&T9Q)(nQk?$G0ROSL8FZ6g$-VJN^qfFUq3~3zq%~k($oXZ zhzfcS<+;J7G_h6X9WA65+TC0O(WmO`>ll4sisKn~>oRtvwZv&pBy_pZZD+%fs7c_d zh?u6UWE^qU*SPL(K9tq{9`d63nP{!snmLhw ;v-f#>bZF49e zUMyfK)R#X$iJ!+ZabMP)lP8!j@6SDHS-g~{x wU3Bms?x7Yp0(%cO+NQfbP&>eP)N_B@ zA${J`#ivnM;h>v|-xUkO&ZRkC4*n%hYe)v`lQtI0TcLe+`y+v{&pL+T4VUKkTJ_m4 z1@`}JyKW&m%>a{f0c-8 tW|TnbiGkEj^iQ^oAHL~|-cbMTe}^;=9`%p- z;wk^se4Oga^mHD}2Ed&E12`t? dH5`o@_lZUzTfM%6JKo-4^zMv+UUQ73*25 zTeVpi*MjvYm-qgb 0XTC!w;U9) ze#erMZKnQF{>FT5lWF>FV`hP5)1GOCz@MI7&Wan>*87YBp>hVD!t=W=i|34|rm> zYVR|G6CCi-%BapyBrL!c#sa0%(gqQF*`6>x$Kz^72S4IH$SZfasm6sW$PPH(zi@0- z?_iir>d2p;YfN)JKB7YqyPsY3;^X1MqObeyE00^JR4Y5m1|#ylJu)*h-6lo3Ly+~e zW*P@`Q$5->WsW{@9qCn{ iY`Ai`_MN#ddmt_YP*$ zt!)_IqV)`eRGO%@H}6if(r`EUS0Ut^X(I50_aKri?j2?*b&jXz2`^7Hf%Tza*Yy&Q zIB#KW#b}JJ3ho5!lN|A2IW}g(T3jc`M`H`Qvba97x{q2L^13Ea1L)WL1`WLnvOmm- z?&A0a` f^JHo+?oAO4G4yu
}oRV@kyy(r=#;&c*I!b>`v=&$^WT2QRt|&^Z5&;HN1!kJj z$$+k*Z@JpY?D1^ia4(&e@o;~cg&qGPrvigrpU5COjrP6La9aERYs%|sq1;aDrBOlh z4y`Itq4%lAb-#xHAmsV+WfFN~mH``x6T3kBVflWH*86H^DT7%Or7Whj%n5q1 c5jq<5 z>2jQ9+@f7Di_^&)-a0jEt#6SS&aQ(3qeyf6Uf(Q8W;UORU_JnlcT)F{8W{dql%)7r zA_U=ml3{(z2OH#wEBJ0HMWD1qGbxk_{}pLJP&N3Sfvf`Ae*Y4-Ky -KB7tkd~YuH!oytxI>>F5u?eV)^CkJK9;>@wYK}sCY uQ z*o#fA|8AA9n0W&WVVgZ7Fjq^5*Ywf6lCW-J_3#S8MCfpy4fJJpj~PwxfT&cqo>7C~ zIu^O=3cl@fCPX~HFm2tG^n#PAWD?A(TRa{um3tRSGk 2> sw5 zxR|Y^Ys%Z`!xSqq49Q()76(;yi?7V$QnL=d8~fZG^py#^VvmTu>SN1_(UAi+b(iuo zL_teiwk1tkk-)$wNz7YlW@v>pcENtl?{B`@=h3#8VdSBI$|nCR`Ok)pL?2v_-odSn zJXIG_xLIgjDfZYEOGhLrN_Ncnuhb+5L~2j4M<`tv?>^;b;eA3bIk8Eqw5mDk2f5jJ zVWWtork(|oJtp4Rjcj8<@w?^R@^(MNDCDyJx8$0?ZeO&`qJ`75 7-e)hb zY>zbtiw>KuN-QXRRyy_^pqYfebk5Uf$L*f|XP5b3#v2dBJn_A(<5B 1To?e@#fgQgq+8*~_BVtwyCUH8@Gfw>FJ0zOx1~GpIAQi?Dp`;W+ z=Ui`ih!!3?9jZOUR>Tg!v7VxylZm?0D_4IkD@boB;hkYE;p7!7af$WgTYKHABK&rm z(`#2gZl iD)ED-L=Oz{ONG^magpKi|c_IaXYC)guC1rK9qfyrE GMW)w2@j6O7&hznJJ z%5DW9e1Bt3FRfepYrVRrJjnesFsowYT$vb9GssF=RzIOzwxSWWwmbqMB%dUJd^h`K zm~MtfmWibCmZ(6=rdaM$p?F5Z5vPEIpnsA`9R*$6xZTomm}*l4T7g-B#@NdVjy|;i z7_QJd_RP}<^{)}SU+m-b3^h4VgVbdbRBH3l9*uL?R%RTnn#I9K`a7mcqhYlx4)xt_ zE1##o#|a~0KN(`7%26$7ZCWS`2+yja*c#!TW|s$@ugg2)i%Xke&1Wr%!;`+*S#~}j z2S8fFjd~0oE*;}dy@@RcD+v06u#xus;Gn%Hul#%Q*gf_G?d~u)>C-IT$cQ`R)JNWm z@4_~P4?G@li}}g<5W}p*#RF6yTkmG;sfLa`zZ}}3=(cHpJ!j1Mjgi`q2v_T2FXFQ4 z4%CcUF6F=oCvB xH1(nMr*hC=4 Q)y7YvNs)(iP}a}EFN0?+ewYUjv^HVXyk zcVvXA2L#OZpYnX%;~EXNQPn36m$McG4ME89`bL9^wzIoAKT(6>ubbuk> j^L*M8L=<3Ejxt4{1+v!A63+ ys4%<<2Nvz#*{r;7u>bKBaFTTNVIiFpJ8E1ou&hzt z$7ACU6P|{mxr|oh#D(EtiO$yM_s2u`jyvzN3x%d*U&&Ag03}6(bWo~n`Ri*m7(p+x zVxY5Gy!`K_ow+{WHBV-Qb=xP&QvsZb9I1kgYvS} dJD^U^7si!M0(eu z3CkP^d;e7D&4Y OGSP#+%KlV*rtI!8!3aJ8PO zui}5RH=1J1Uyoc#F7eTtEqXWGMq+QkrX?_(V0;>S)jBg%!xPV^4*6vx=kD5Zv6<$U zD(MTA&k|l0fACCVjaqM)A+skPyty>DMFIdpE@k~ix*yYA6MAtWn$Zna@!>72=tF1D zG&E>$`YX9C+_~nbAFWh!wo%J37>nBJ5#O{joHoh&if^bTrcI^PfsJ%i#YD#MS(`yJ&8pDdle-Hc5_2ca*h~7-?Q0MZTb9LhIR2fv@9Rp{KWCZe~(rdT98no zjM_7etiCbscgr)-rIJkV8)dN$iJl${LTyiR3m4$|sG6?rhLA;O&RR5% K;LJx2Z`Xe6vbI43~;NZ$AqSG7qMK#zK@~dqO3dp_qT%VyOU3Vuw~o_$NSM z%CZU AQufMw0zpx#WayGC?Bhh@CB*5qf!rH}67k(41FdX6wkP1icOP%?3JM#_5Un z{m87ytvxieFK=YwnM%jE-PK<^S5m!m976HTwW7Pmqny`_!x;r(LlD(Juq$N#?@!V# zA$jEbBO)mLYCgwn!sTGCkv)8PAdX%>R;k|kU#Nw|OgC4JjLb>jrgLeY$#LK2Brn^o z8xqnS)?6ErCr^%KbbOOmF1I3`7mqi_0Nx$< ?!#uq%W-P=kLxlN{(`S5G(Z_wYLth5xk z=Kr6gi)m2C$USHAF2$+OQ5pB4Ko`~ONjI1ETpfI=t?U6)F=2k4$C2#na#D5jOz-+> zlg?F$zE hMY#U;1ZzD74Z1J?nGB5%VBvV10BU4Znu=}^Uo-Jwaf^= z;MkXTP@6X~Afir8@N>B-huR14c*t4v|FJ)ZfgxHG_#}mqHJP!QeoGzHWA>Hvm#?T$ zV5h;IHEp;uiB}owwKua~37Lf82b7k=XOyg3TkHpHYb)r%$FN9Io_b3bZB(5eJod#- zRBBE2r^H JrF2`x*EZh8`KT8gPC<5_)aEet5g=I)uu+z{ba 7AZp+8w7X~Noqum^$N zj+He6R+yDS*I?e*w2t83I`vhqZ$TVtWtqkIc%y5Aa}0XkiPTh##@#53m#gR{;3kl# zl9xuGRookvEvd~Me)0_8^qf~v6NMw`dO)MV9-)&JmKKJNBkzP2|MQqDfJ4&~(|o6- zT6GRQgSu+MrYR1+lv^9#53wE8prtKGUlrf9#sKmzV#~i=AX^s`rMK=Ma5x9y>YFas zI@VE^>W*=16T$naYVuYl40h32z8{rKy~>_lR`dPaY&hxqX6juHAPl_ODNpl6e?6Q% zIk^J0fLIa_UAfMF$Td>*yH2S(Vh`i^?l(V=+WCNNq)}&{msA9x+;!fTIK08`!rlqF za+u78DO~es*=?NNZ{X%58lyqo;u9h1Vt`5B+z5>rq2ojdKmg!=1`=}|jnrjT454m? zs5^SlSl^T0{qpnJXRFZ5b6`$>|5*1^X1xyp@V(MM`5i|uWk zmK87gP_@1dB9Q1ke6c+O5WzmpP~95MW;84O9RY;ua$Rzwy8t96Y$r`lh6G)}qjEjz zVjc{*MNg&w%Uk$j$m g;F9Bc68XT(Lg8#x;* z)eAJDH?L2TA2*M5{SX@XZw?}Jy~(If&)&U;WH`dx?eHL4aj*AG^j5V{rZu82y!#Ff zI#Ibj&cfYI1bu*1uj(t$NdOTTl|HW 6=Ud5o0q9C=Fi%jJ5B4s<4KyT59 zMnZdaI9raixAqEB`QCc_ q8f%~rnRJZ0v0k1ndIi`}S|Bj8K>gd_2zT;XX zjA?gXUn3aQMjC#AAr<@fUX;Rvi_`Z 7>5o2XGEtDkqJxw#X;o4VG2dHwxi?RQezYA42=;o@?adOWAv^foln~ zRuxVZGm $bbZ?lKg@3!IXi53x4+Te^IJiSa?zm_G@M_&PxkPZ|AJOIm?Ih5XY~g$nhJT-A z*J57QW@0V2G^d!=OP4(38Wi+o4kNU;SU^t;flKr^iW6v#j9^3%7f16TFQ+w3|6pgA z!1J9n@-s+BT@N%w651OGF+3$|3w@M`Cq5LaRdv^>c1$(<;{FT#fgO#6$*#5g@A9|k z@0VEpN 5F;aeQU zfj%;7C>1JjA_pI=K@Kp{9DezASGhYT0MA$R+GgSsF~2@+9GyyqA;FiVxrN`zHh=5d zJLyVp8pb!lo8yL6ve4icmrkFO&$-{@Pp)y53Lmd2e<^04Vzgrv|A29&?cvJ&S@V utxY5x=7tCC}DryeU~x;ATevmqPure^QrRK3GK?QR*ecd}JQ zQBv4vZAu-N&Qw@DdEd6`;#0^Rlb9CIC2(x!XPn^FBt2P?Y;MK+_i~wd99CpxmOv*u z9-b{vy0QE6UzpXwd>@sz(-<221$D+c6M2BzBF=t9vDUwzMo-4rznBD6Wn}-;mH=Hp z4Yn{2zl(N4^hH;DKfnFU^$J^Ti;(uPIL}~CT)h+P0aje{^U>;F$39Cx?+1eF?I1SW zp-QOx)?7M^yDn*I>SLo_!nv>tcnWEE(wIp*svrJ1m=RKvW#dr~*vn)O)ORJkjsJ)7 ze?H@ula;SRguYlKta!!OCj0d5Z<-}?Yz8*XFEUaKYwK){_S9(P=c&)1r*WJdusXPZ zx;+*A0$Vqj3#!uXsl1Nq)jrK {jwgWrvqydM3@gV7|E0P )3P>ERa1S7&kijJpui%!F`O%59;PoC)IdA)6A6{6y92XkM=d!Puyc> z&~&IH*9uE_wCHM-ON+Xtait)v`fP_-Pk(GXpEuFWGHxu)+HZzUZEZwu`MBKjUs4k` zTMFJIe>mNvvOHp~j8&5&T&B~mB9{_l)${!R$X1WG-x +mk1=Vgy @oC}Vf9aHN69aMXwwmKJ)oje;scq3voy{nc;|ITJ5dW@C{gidfHDZrM(B zR(1KmnCMQ$diJBg?) hyqEyQ{_$RtLGJLy8spx9=SldTlxs|cow?NBb0l`&= zE5e-aV&!{y&i>S|KVg&E(ff7brtr GZx#(om=X^9 zLpJ~RiqqXX4!1OuzvRpqc{XS57ufeLzWn8bNUWoy-qeF0nMR$5zDHt)Ke1aKV3u8e z#EV_uKR-M?20N0IY6K6(ZEVY9m@6X(u1i}I?`X+DyR4cfSlTZ2uR`Gg?ii$YV0Yz2 zL#>TN>0d0f# +HqxY_HdErJzvnW15pV_FknJAt< z7#!h_)EmRT1<-C`r_kDvU-|1R%_Avjhb`h=VO^D}oWew@M9VHJtJRY7*OCkytSAJx z#)Ma;W $D9Bn-ZHuXuL)<+kH4?Q}h zPUDUm@Zt1}i Y{DB`c%U* zn0cu-`|AbEBS~Kr(@MHCyGD2x(IX|qR(C{C8EJ^L!yJh;ktR;>zums)T(3ua?!fUN z;Y{s>#Prsm`R&B?JBMoKVO$Mxem CIF-JlJ9?$;QJ*vi?wXz)S{ofe# zNTViUFeG+3s2O^tH0YmZk7)Jt1?-t{b`^Pd5|5|DiI)K?)`|O`)S86@vbjaFUpO6` z@FmuO6B=92St$Wa%wBO1Wt^H&1C>Ul*VXZL<^2Yh9<|~7k3)2hWn|SzhK2kMjG$wD zj~Ze54QmSm@M75nKKsz-eh`y5|4p6t03#t!)&czB-97xL^0tYemCnR~c{Y7^<(!_} z0b_mFNOddC19Y~B?WW` CW#Fhnq#Vv zZApwk@$yH^ni>(JT BpyBT!eFBqVlX+q*SSvpk&qwbfq7kCCX+UUY6!33xE$0K z27s+M&G7AZhC}NGweD-9Ey_^?XHz%g3_62f#2;8#4XscM3nMI)UqyKj(?lRu-BO2( z9a~=ITDFb-3`4$Pw(~oASG!IJgX!CQm9ieekB7ISLSlSgXm^$x_;{u5JB(62IvXoI z0Q;(j*x3Nhj}8ecH+{4$ HZPBrF!(Qm;)sEUGBxj{0uJsNw1l~j>ZEmObcXu z3UQ`ZExmc@zvkn(Z7CYVruwnQ-}>fPp2X)?${%8 HxpDMQq{AFP=&h^cFvz6_f3EEz1*c&XzQF@LIgWH>k35s6H_|~TaI_aVmKVY25dk49t>5`HebJ;aoX8`H+hcG$