From 6753c378f384046417562466da506a30e211d2ee Mon Sep 17 00:00:00 2001 From: Richie Varghese Date: Mon, 6 Apr 2026 11:32:15 +0530 Subject: [PATCH 01/14] Bump version to 0.8.9 --- .gitignore | 1 + LICENSE | 2 +- package.json | 21 +- resources/sql-assistant-vsc-icon.png | Bin 0 -> 226094 bytes src/activation/providers.ts | 4 +- src/providers/ChatViewProvider.ts | 31 +- src/providers/chat/AiService.ts | 301 +++++++++++++- src/providers/chat/SessionService.ts | 48 ++- src/providers/chat/types.ts | 8 + templates/chat/index.html | 90 ++++- templates/chat/scripts.js | 304 +++++++++++++- templates/chat/styles.css | 579 +++++++++++++++++++++------ 12 files changed, 1219 insertions(+), 170 deletions(-) create mode 100644 resources/sql-assistant-vsc-icon.png diff --git a/.gitignore b/.gitignore index 7883255..63effce 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ test_* mock_ai_server.js *.pgpass src/test/unit/PgPassSupport.test.ts +.kiro/ diff --git a/LICENSE b/LICENSE index 20c1565..dd4a1c4 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2025 Richie Varghese +Copyright (c) 2026 Richie Varghese Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/package.json b/package.json index 2feb9b2..17b6241 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "postgres-explorer", "displayName": "PgStudio (PostgreSQL Explorer)", - "version": "0.8.5", + "version": "0.8.9", "description": "PostgreSQL database explorer for VS Code with notebook support", "publisher": "ric-v", "private": false, @@ -1007,7 +1007,7 @@ "activitybar": [ { "id": "postgres-explorer", - "title": "PostgreSQL Explorer", + "title": "PG Studio", "icon": "resources/postgres-vsc-icon.png" } ] @@ -1017,34 +1017,27 @@ { "id": "postgresExplorer", "name": "Connections", - "contextualTitle": "PostgreSQL Explorer", + "contextualTitle": "PG Studio", "icon": "resources/postgres-vsc-icon.png" }, { "id": "postgresExplorer.savedQueries", "name": "Saved Queries", - "contextualTitle": "PostgreSQL Explorer", + "contextualTitle": "PG Studio", "icon": "$(save)" }, { "id": "postgresExplorer.chatView", "name": "SQL Assistant", "type": "webview", - "contextualTitle": "PostgreSQL Explorer", - "icon": "resources/ai-icon.png" + "contextualTitle": "PG Studio", + "icon": "resources/sql-assistant-vsc-icon.png" }, { "id": "postgresExplorer.history", "name": "Query History", - "contextualTitle": "PostgreSQL Explorer", + "contextualTitle": "PG Studio", "icon": "$(history)" - }, - { - "id": "postgresExplorer.whatsNew", - "name": "What's New", - "type": "webview", - "contextualTitle": "PostgreSQL Explorer", - "icon": "resources/postgres-explorer.png" } ] }, diff --git a/resources/sql-assistant-vsc-icon.png b/resources/sql-assistant-vsc-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1fdadf3ebab628fb78a820200fc6281440eec95a GIT binary patch literal 226094 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

=k-nuw=6%*^m&5P+Dnnlt3jXY zJe?>7OvDnn*H;Lrg6AY5oYDAy0t8eI6$^xJlNl#FK8oCGYkSEqw(B=-zu=KKLycZt zAv;`a%-Zx+5s#v=E|khdY~wX6{!XsO?joHtiZjm^I|8?c?_to)*&l?(0xYk1A@iaz z-TxY)8qur65sjXSO4OEY+(!OC-yq-uRK<(z3a5D!S-n+wUSl_R-1A6XC3KQdHq>*P zNP&?AQo>tHn_`OB^gN=G!S=eB*5F#hss7cJNMBgtm#`)wo~=V!y3^f&65@tx-a!8H%0Ou)sq8}Bw`4L4?I-EQS;SVF_IZ&lC@dx~?4ncc~WT3hzcez2Px5xsL)h8n4Rq5=cn4#ZC z9px3AD1&I%vYIZhOk;_m<+l$=%RoMbjLUqfKix+iQo){*s+yl~#njbSZs8<*=7`LI zJ5q}jJtw?|rVx;b(HMt!FSAplSwo`2+yjgROcM#p1t~)ysv~SA$Gl*Epnr5cSXnkw zJ>W{Yh@-i0cpU>p;ZB@H+ns)E$Hi$p6ry(L*G^a0l>GMk23}!h$Z6Ie*$r z(82GFv$mR0>pFB?cEWXV-e}}PVT>&AqUM}$dQX&(6kc0X|sqy|Fre2 zxm%c9j2AUktU!dhqA%l;lAmR}IC+mES2xAU&Hk21f1R2(ZN7kxPY=U4=4*K{)Dkk4 zF+l$W1%drR_dZxxots6jA34;2zTXy%pat16y=J`Uw071f74isAal(J$>JlkLszhok z$J2M@jz$&`{TF`;f!gv<`jVV}wfjQOOkL9vnkRh?)2^3K?}E85eq^X`@A# zT(P5GQ4hi0w7a8n-3}r6ti;;XG0(1$ToIqGMzSyfnj+aVfpbgzhoug987P>o?OZ_E zz8{cteBVzjM_4RauGh(Pz1=PUh|x#S;j8<%d7IXWm#c(@Bj0(IdnSw$4V))u&-!UQ zg!<15>=K=Sh9mT);$uT1a}iZUjU+NG+)b#UIPNrCq?`q7D74B&0UwV9IzMX>ysfKbC8M2ubQ$WriouEM7c?E&& z+&oQLeL9u^erz7-@q`J}3wktba}VV|@s;v@`A`1RK(w!DyW;ap%1`k|UBGYC>}aG> z5Z>P2t_eYUK?Be4L&RoXbBRAF3C7w!ZrgEL{>k=;T{O8y{Q*_1)G+qfRH?(0AU3ew z`~L=XOyzHKaSvm#vJv}Vw@$hUhrw~(K7Dr0ay%NhR3c$smf|#=_d-PGr3TTplhXZW z?m2$`q&@d+H*lm42UVbY2~9uJhjs%9Pu3x z?hOWVh0(T$NlLB?WikuBb+6`2ha9~=f3XD;$f&}A+|eB{iT3wirWORWBzC^VLLkgT z!m{8E+JBw{zJDCY(+6~g3#uV!4!?_$dmeXuUqR@2`rVV|RQjGjprP`R_v4cacz6dE zq6k-lK*E0-8o$jO)h8sZIwgrf5r$Q|o{&DXm=9eD_Z{f`EX8NtOK#s{T7~vS8Nm9;4wkV5Nbfwzn>AMlj`{eSFhwF=nKR zp^Z5o$Q^R%kI=ZQslMaqZ?d90)nMDu;;y*k#6fX1bBNfaeB!s03vaooN?i(gzyCER zhLEDs-Mq~pifj2@6;8-M+V%z9Taso$I&W;OH{0s5k;Oe`qsF`9&q~7Y1t37Dxvj5z z+XmIm#oDT#5q*cE@*+2NAdrqxxqipfwOMegf(ZnRa1xb&-MZ@sqG#frh5s=}hMbAa z7@^$tJ_M&{gjh3-Yji^_CxL4fHz)uUCV7@91@B)Y2XwQc@!X+!Y!kTP*c*&X?$AML z&Zk!#nV;X-ea6QN36VsEga+XD5h=RdG!Z!Go8H@K=~{AJH_z5 zd#0@86$Y~J4%w}NHg&Jj@{9qfdViXX85&*!C1~h7#%NM=7C~ACs&Utwj`SBic}}IWSqZCz_L`DpH=d70M9jxL zX6nFZEh<}Y4`ZiV!RU_*C_L^LIU#-gcO!ZAF(-}iP2g-}vRZ=6>jd#4`E1>J0Neo( zM;lcfUrOGu6?-=N_EiIKLBx^a(TcGZQ8T+78K-Pc1w0dJjwzminI`n1(Fn9)BVX+e zkgxF#rcMgzbi$lPbF54ylirPlsGtv6E7n(-#p|&J?ea2zxG8S6Bd0XL0)d&FL@IH>-m4Gxm)|f5+^4t09IQp}WtHifcHDJv7 zDA^x+b}!|Jx#>yM{Oc!H0&f|m4~{po237J87~by%5`iOm3*FJ?6)iFfIeEA&YCOV`o7!_+~q`7frLLB5& zV-{+z{qG8WatY;dcEw(>M(#^q7G1$c9lYy3)W#&lB<)Uu#U}2w^@s-ue`j_UAu}f+ zfViW@zil@ETRCrx?GJ+n2Hs+q{CH{eX^ho&t11AsyM|9d;!RmexlR1AnZ*uUSR+Eh&lCsGaoh7OBwMW?E*8?8lS%ek=gvAUM z#p@@O&^0%SDnGKw2@9<{u^H;-+>lR|GWTJ>e?A{dK54Qe$KxU2Xc3Qr2YDnOph4Fg z*sfz&4VT z^NrC4r>|RT^_35Wkxuw?ZZ+Kui*ZDkwoQH#u(0yID+=pxgLWEc5{Rf?Lz&h4cXDID&_pb^NIYc+wV?M&*_~Xxj#_n zr(j94lKu^cPYNGvfg1TUE3EhCPLBg;`C@^Sa{)zHCit=gP?b#Sh`scL)Wo;Y?q4?7 z>(rTASN&KHi5akji;5)KG3s+pBlm>KgEik+nbLvc1*6^P9y5#DlD-jWVw5H#*`L)y_od!} zFbN+oRDyKJoQ_(rkiq36Rtl2GHy6PlSrq-PgPU#>*~m@xU~f(p+2Vi*SK*PrPs z^s>ikQE@II_pGUvXA*k$%|VE!s8KaqMZHM)* zaKRf+#a|!)*k#!pcFOu2xz)5M3lO4k7HY^VPw06*pI^(@{mr69oaY+AIM zkJie}P%~L%GH-JBID+vC#i3E5Uqk5?KI*#WJ_Efkz)ypebqASchS1m*^Y)I=HvI-h zoxH~@Aqru7lTXX$RiHI_JaRe!6t377;I?;*+*(XGoPUCtF_D42uAX%i{{TCwPOz&( zo7|i2BIAzzK%D|a$#{)PIg%-gSeG%vFg1PEgCn4l2(yjt!C9b2r;wU|YIV#ipVrj~ z#7ioUihZt+BK&p5Lc*u$EI2rrjpL>@CWhhm zw}a@yx2=2Nr5o&Xx>jN4b!Bh)vv(#ly4ohN9Aavk7DS($#MLvpi?Nf-eM`{KG0muM zt_a3u>~1}3QMzI?7>x*n#Q%d+O0A2WK7Xs&P__ZJaU;GjQE?9xE=2&aWzi5pJ~Q@LF7N--_cc}R&t0Yz5BVUQ(Ae7U(vD?=J zxlcZ9+Z`~|8HE&#-UwNWs(b4+F!f|nJ3*tidTMt9i}t~tS2U0*3aVf2ev>2iOmFW_ z2-nSRdK~d7_w@nFBq^b@URH`f_T77s4M5)5+s!K zzDM2AAO4qzH$5jkZX)1@PbqN7r9KE9)UFV4;76)gz-VurLZQof|GoMkuFKB-> zWvkAv34avdrkPa(mD0`iky5bkN17kzMOI= ziaMqh`DSA}%v%OF8k=pLAz-WcUC@L4Ea_kWvw}~fau=66#+2xc*;Y8Cyjv+ zcmbaBYV7jevRRm4RR?0iI`E z-pAm54lu9`q%TefQ!U*2dz!s8tU}ba(pRq1uP=dOlU};p@MeZvg&#{t1%YH-BG4tB zrsJHZH_tKFP1}SbK$s^4IG`w?yy);El0^9}qZe{zXDYrX*#2F5Dj^szImy6Ts0QI7 z0I;&x8?xU`WHCix++lar5rzCmR>6BE`=1RV$=4Z07+e^@0HTZOe8=niJ?I_(I_LDJ zfbjESm`eAi_-w`2sW8A>q6eCWzL3+_t&YIoBzV9c^$JC>+v7P#r_@YK;Y?kneLsn*3yB3YMOe5evMDW;i@RX|=%D z^2%I|l7S?P>?zsJU8fcw0Jr$~UpDumg0oITBLtpjfVk1GXY%9)2M>SnxH)T)GsUXd zK%n9@3)L2tp~3A|S))PucZ^RW7V_*V>MgIDM}EKoOZ5yWQJr`}*65j;9NFXuJ?N_q zM4t}-+l$Bc!QM497dZ%5mge)^EE?c%)&gqyDgd(+nm%zTgY%6woBQxbKDgHz#TRiX z(d6(%JWM{hH10o2VfWSv+vwU6i(ywI3)ANg9Pxiw^K(sOqhylG5C1zdvq(Pz-ffvSw1g~j#jt{9 znXzVSh6XVCQ=Zg~YpEPr{{)=}w>><*;0POoye=vN!LS^OwMc&T64yNAk|`;gExi z`B;~-PxS+t9=^gGJ$WmsWK{nh5Ev*?bpZr#zc}Z*g%`QHzyJ3G2Za|lD!lp9`Vx85 zGUU+Gvv&9JmCGFoWvc=?!SbQ5Ba&e&mq{OqrZj|QO!|@n5sth6e6nPck537yn_==4Z{<(r=bvk^r6=99gEq@g_@bwXjdF`G@h0-0(^ z83^;oZ)Y$4{(TZ50>CV>t`&I`qqAVaqRjfJ|vdk9+gOT6MNETYINW+YRY{ zw%whb8xJVzMwUvz>qAs`$^FMnOd9|sZzG?lFwwa12;wMY+!fP3JNY`u$cYJ}dygE7J6IwJIxT+6w7v5uP3>+P3#%RYx@3Sj#P+z?T9AH<*E`MXf*j0!rU=Ca__GnJ!6`? z?D8L?ce??1eI^(QA7AD(3{NTQ@Z46Urv1=waw}|bca+GPx76dLXpGsCgm3CX?(SjI z-MpSHM*M7fruEWx8hjRVT7gcaO)g2dYOp{oPW!oQNMAB}1_qvYx;O_cAW$9%<@z7m zHTf~_=t=CUnUIE0qR3-j7e z85C_VAbl|=FQpvr*mSf8%>+66Hj9WE#?J*j7BZE^VUT;FW)PvPW3DI$!pS!$D1gD+ z0w92KIqJb0#hF2j>5s`AdgLT4V7lbt!i2?)03j)NoB?OT0Ud}UWze=|KB;;&>j*f<=!=c9P+63KD zf(u@AX#Gymo+TY}I&mf$)j}euIjFhnEX$iQyYH7>_n z5W!Lf)%t-7FL%FN)mX8FXjw{10$D4sXErU(d1fY9_@VQ3n`qjw11J66A6wJ5bK0TO zakptbJs*OH@qZ};p6>nJz@Wg?Qf~}M`_Ib-mFYmkCiaPSUtdN#Qq&fyPLqnhA!75l z3=k#Ar|8)y2N5p!k?6&^Rq*uxVOI3tj_C2fA%xU8zbic|bdVDayZ5N1_Lrc-1l2e< zyCrI&){H;2eeWvS;_c!Ra6Uk(c1=2mxWWDLgX&mHcDa14}qyOI-*Wr z@RSBs?8$PJCaaw6Ria{8n&x?5Vf#oYuVF@;9n}b~q!PK?mPiw_Uo6N_R z+|AdND86k-HY{8Q{9I#->UO;ER~6#8G%z+V4&*XSeN~Jdz4F~!apGP3r;;h=WQ|-6 zjCtJa`&{=kyG490gUu(k6_}quDL>VguH~qJHum@TZ-Jg97h&0ffNw>|J_Fg;y?qGN zC-JMXli?tJKuMs=Bvs7#1OoBLFe_C}CNJz=ThZnNJ&K-NoU!DI z6$C<{JZK);z0A>X>;}uB2*zwybAvd47wvKM6`4+XFfHwiaZCa*@!kFXo>(a6?iY$^ zcuVL;jA^94h}bG41n;R(H^&*#w~N?8vIJr$!*CTMc3!bxzFT$*!OoZf3VN9Dj`2ApCkKMJ1FT``3%RWWxar&8x%cPi;Ps!{ zZS-D1Zj!eeZrWOMvKK*yZFk}e?$AElakWC_j~j9(*aGJiV$OQb;b&~w#0Ox?oFX{gIroqS8m8^Ws^EX?>)jthdHE8P=>uEZtx-cP=bkn>qnr*3whxvlLwma3%BF0rg? z{szO){`!xNV*lURmc$f9NJyA&7-R<7gZxeU668n6%gN~$v+ z?ELPIS{z|x0x;OdM#FGg+wEDMel$D3wkWl zr3vohS)wp)7W|>5TdgsI3@~fe10x3o>rlX>>>T1J_R@q+xbTb8+x_LvpN;Lu2AQM@ zB60&C*~6u(`=vZF0k-w6M;!rMJq0w)ZD+JXZGpfxljeV(?YE_HxJUU`Zbqm6c%28` z>^%GAoa zJ>kD6E;OC9`7>r{`BWx+F)ARAIW9bPF1iebxF>Ljt`#$mS7plnIoWxnQciDvsU}i7 zazw;XduGv>%`PG24KmKT6Fs8?bE3XNhM`w$xoac!jZ9yRcW)(qGK8YegJm#KwtS7XS6(m_^MMPAzOU@N~|Y61UT!&S2Ob>~FD zmv{$9n^Y;7f8DM9Z#(eA`Y*hndYQtBin@V6i0cfnV{X|H&Ef}=J6&vtMBj0IOa8sU zAI+68v6yOJRkc2b*&O(cF*uloGHXCpb))rT>_+w8)t+>lC${VN1gQ`uAOS%Z?zL9E z&K+XX)+X4h-gf8E(*9f~4k`Nbt|(EjiYfx%#|5oI0y!xP-3U`vWtI*42E4kv&mMVD zzEBHw5wX5LLT-&6Lxofu!uhV^V%>~)2Fx?VwybSM2E&0TBuQ-)0{B4ffkNDoX4nVM zpdAWzX8d7Fs(KY9c$EHE9!2>CU^{eB*RZ;VTy>xQ^R6%5I$|ldj0keJ5M4{ua00?l z0~i>jRa-ElEm@dD=tTA?#YRN5k(bP>stOI>QEo#+ee|?573nm3luEtd;WA|MPDgzd zrLbY>Cn}XtUuQhiSi)`UyOD z!45pl(ROH8IR8ELCqnR#u-_OYKiSF<>pi)X3 zERRBv*9ZRXxBuAshr#*ZflWAkwZbMdh=Al?sSpO5j``PTL0N|6bsK?W8f}`haWS1(Urht|o3FL< z9*)BW&bYIBPJ#(D3HVQ76V9ss6v3C5mZ$;-WwXca^Cjw3eaRGfol9%xRt0uA9tcE? zicpKzzQTFoV)!M9hAR1&;q7o{>^+chUBgz7e$?hI!V;&g`LA}4xO9K16n>Ba(Cr%D za!zs5CD#VyyA?VkYzsESFA^(B>UP9?D5=PLC^IYa_8!{dg7e+M!Lh)ONGwq@un0tG zbUk5@Df(8M2~4$K)42YXwN8CH`BmF=rUKhtd@9ta!+XRQ^2Zx^2cxo7!$JprKK=1Q zvf{Z7U<0Pja}qB6{YC6NWbffXe$_vwadG#Xs5dN*;Y|n^z?EdY{AW$b?Gw}1NPy8r z^NBfR{}JWt92_B?K-iE*M7 zWby<;K@(yk&kvLO`t|n?XiT`J-N3Ea4Nv%_j5GY*&%PzBj@5(S7vNHhW0wZhvxWhJ z7ZUfm1ySbk#=alqiyJ5lZpdBXRI(IUR<-)2r`fwPmkA3xTtv8sA&PDI+CEwMoJ@Ia z#@sf*N${L5+>|ow4$MkUWGX*Zw&d%uP;Chx!@*Fd=rAvUNP@e)4Sg^}2b{^V-Ks!W zn5tadXivmL>oTS%9)p=VWdf^QTs}uBbc!zIWyWKFhUe+vhXfU{)RK{1I(dOiCL28~1S9n>%`(@<2&ca5EIj-g+{GrgAw>UV=~O!K#^MKIV+;#wXQLpLQSo=;JC^F4;Q4n)arj3OYgoveI%j zFcon}pYp+5th#c)wA(7y9*P&W)xWUOVoE;fBjE;6?#6Q18uBFQ26$E`n+#S`CKY*E z6e=M`3)-c#WAFIo{?fgw`L=%Hm@HrfB4R7tlf^%-0nl)5RjuiCV9%s4o5q3Sl+Mj0 z6!Z91cNq0}Xd!DfVWao1$v}n-azjhC{Ov=#B@OL=9y_}T1SYpiKu-SkhQ~Q^%9;Tk zmC`^p9hH~5jXyKrOUWY5;)aHwr4QBcDz{`#d-huv7VKNIyx##xcT=QLO1hOvR4&xF zSaoF)lky9;2A9%uHf3mjmImjh@ahDrj9b7w8YbTjNP9I_s;G}2t|@`LnJJvGN~-kF zGUf5=+W)8P{>)_ZQ&}BI;R9S7LgY5bCj{TyyQN7 zu4h7z@H6fz(&T+(f*N&&mF7HdA1P6x>g!;6)ktVPOt@9$9u6`+o z|73d&kv#aje{Cv|RiSrR-#VnGJI(WIhYWP2cC=><2<&Os28V6u-z`miF|$CsCBGUx z{)A7&gg>{tuXkVN=Syxu>3D8r>=vTcKi@Ej&M5nwTKoN~*GW2i^|$pD_cCEOA&SF= zj#vWtn+@4KA$r`mt?1+|#*uDPVlgE7#3Nw(TQAh*Lm6zrSm9_g#HM)Raei9xh4=TF zJn)V7_F7JEO2`=iYQb>Mz}U6&kGXlD_czAQiMZ`iOECX<}NQXqJW^4s@ z6DZKzU&{im$jNW5cXPLC-L05PkZ_)MC{_G`YHylWcCA7E0_5-PoXtx@iOU$JO!J4m zO!!I=rs#1Qf4BA2QB$B|Q1iXnZwA+zPu0^Qd4qRV8?dQx3YZO~+vg%l=U2K2NZ3e| z=NmP!$tg@#Jb$sp7+9oP3rHCdmVjf6*W-kKm18Taw)lQZqk>{}cg!4671sx}k;Vv4bDFZB=Sw$n-Y>^~T3=2%# zc>ol-Lu$!OYY;*Ov^mzps-_}hv_yyx@^Ab9ypNGsg?0f*BS&d<&*6*s@|`(h*jT7+ zUtpGpw?20p>(jKMtX^7clc@N(*!D&?*sWnbgnBUVli3=vSODCKLhUXTGYJ3*i%1Ve zi?&|iqBVcni=hDCkcXZ~9&(D37c^UwmYf{J^Qkq z9iWK+nE2;=ng*_|;UeC&b);_Rg4?FRm=L{+DNrlh3j!YBiwUL zy({G4LC}$44sG4je=T{E0mmFLXZV|kWGZ1_d7+PKEXDKN_S195odHU=J#QRQ`ge~( z*|g?6`-7jGhS?xAitwM>4IkkQY!?qevlG$T|LTC@y~&V z&c0$q1@1`!vm|A zc@U9)#TRO-_Dq4zW;Zsd07t@pAo6~mJiEb8oZ-ki+o34ll)Z2F%zJm0`CGYt24G>S za6=-xO($^7)`_V=fWNijkI~8XE<%=&>{#709Zm_`Cn$&y=*g4}f-tBmdlJFj+walxN^-VS|vm#n$I{QS^J-|Q5D*oY7YAbd<0a#u$D|}o< z%%&~DZ2hz7X};OK>-!dKDV1q|`H}aaRK_P%Ko@*-20s{?E+L6p&zN%YYXj`+;G0gm zCLU^T`h=3csp4K^d8z6_Z#PvTzkuMhHq5fqdaA2NetNRvqx6FzTMd#yB;7wh&DpG|1TlMMY$ZQ%$`TYB*&&Oo6gR^+`uAntGsMyICIR%eZQxZ zgba$gX?i`|jsU8U4zix89^eP^pwj{52_QS_0_zjwGN*#JI}Lu;`A=d%FEs!BNh6pL zR0@lVMIg@~M(L3qUGK0WZ5A(|AQgkR=}kY&^E|?HNZV*&Os=es4h^(V?BQsf+0~@& z`{8wy9JXu&-4_S{lk!mmy;l=|dCCiM4Uu@G(wm>6D&Hs0Um;GFLYWfl5-(y06f^8p z8E@9RNq=IoU8dAg@=g>njo3CFN$S|_7e%5@x?WIV=W%hjYLDpls}#_H_n!US5U+$KMGiFcf1 zsh24?;WE(M>kGp8tjhiO%9r)3A?}bVg7Yyyf?91}iEtyd@|4v$1U4$x*$eon7@;`#qk42OR(PPt9w9M%DoI^mt+KkIqqr$Z4e>=1P>s`n9v$rHhYQ9K5fKT10$Q zl^me6+SR|Z+LLiUzDKJdk~Xw*=gaR4M47OMup^Jdp_H>gZJ685*MWevou!EE-`@3e zIaV&?x0-Z)ouyQpm;3w46`NM&ypW^3St9PM@&12!M8@9yX*j(jHfGze4~@vuhK?C1 zS`m@Dv{w3aC)lj0PA#!Q1b>AnLom=_?6QNd;5mpJ~KKE322-^&WnSddjP zOYF?@X&`a!;`?5$aG*F`#>;fcRY_%+gN-NODHlZcC*<%M&|3c)>iF0idLH6rWz5FS zUS`Mfh~lNZ{`XEiy;iIinhz zEA-<@#jsULCCfqET=;|9^m~qLA5J}Qe0WNzFO7iZ_S}HK7vNAg_BnKaK}YPS54lAF z`9r;axguvwOutGLpf#(6S>&```4v#cI6X>2^JCie> zKL1B*Dd6R$Kp0Wj&|SdZA5j693A>$dZbfbRg{{N`=^&ODD(}_A>8Vy-+3&7V{%Vev z6j_Ibk=g}vK0BEe+PPBD=A5*C+j`qo`%)c93K2!YyUm0k-+XsQJ2$aiDPeE0V(fpCwU^1CwB<#F+sN1_} zfS(S@ct)h!%hRu?#WQ;7EOZxPX7KsLrP{QIvBoeZ{s@XRN}%YesYut+$-7eqG)ce{ z`tOFFOOiQu@#V0gR&vxrGq7UGqGr5t|GkPO3diR3YGszVsw#hM(w==Ar%q;}n=eY1 zLdQEfG?uK*dGhaxvyeqR?VcHy=D-fncH$U7Qhu9%uFC3W!ud=eOIKa%F=`!Cqihr5rk0k5Qm>jvW>5s-Bb}BU^ z$y~#h=*}>?$m)P!7o^F6?PoJP&wFmFlmV}bE3D;{+0GuhlV-jehOd44)qop~;S{yP z0l2>`IpVwL74qsSNX(8t_*bpwIhDz#LegKB75)zcD#o!y5AEN_zMj$!73yyioE(p0 zh?lZBCs9g{(Z7rT9)1rjoFi@@&gfJph4QFnD-1*G_9^3rC-jD8KI6Eyfa_wK;QNjaNxY&?0DHryf?r#}tnsyMi zFAHgIw%iIweCeaS^M52=Wk6J2*BwGy7*do*x{>aX4#}Z&5Cka!=|+&DySrg%kWT4F zL~>{Zq`T|8&-?v`A7{?pd!Myyt;Py0eX@|+Z9N?Kfr2YH<(rm~~d79wy`FOVZxbi&t&+L^X7f~m_nTBABse=DUp@bY39#}a;}G3A}ZAs6-iOk$BQKx^DP670l&y=(W_wr zWlin?oYOH%;h8A<>@$Ufg6T|e-H~hHXb?+eJ?)k%G9~8a*7`R0UZ8VZ_>RVhKpj-N zx9y;D2noS3W14r35xZpnlxOpH-ia)f=9_}-N8y~~F%J4l&*7ziE`4!vr(fTBm(itt zXDMZo#-(a{6!J-;2Z3t^=GldCkaJ0t%&Ys%*NSb9cH6GjHf)KpCSQ4b>l!D?IKVTC zxjRH=JKOa`(TVRzS3>?m5MvdOzY41MVzNctj|wae&j2%muKy|1x&|JKs!l3{$+QB` zwgB?hf7r+T`NBK%8d4Y#lHdME0En+!J0g4!QlFbK4*0?0-AEA#RukeXrm1;exPJ^s ziSpG!v{>E4ZwmbH9CqSgf4y@WZ>j4^eOK9VEyPHBl$w^5##b7w&4LM*M!^V<<&JtC zX>X-s(fx>XW8P}hh8`J}6WT~M@Au^Cb=ZRNGduW1W@n*-up&sXmsCOKRcqnSz7 zhorej!gvlE?qV9Q!kTsYl+qvq4w-83_G^HIabv~h%4Fa0+yUb!`*nY-YkcOM9fwTd z%M-4JV)(zs@BI8tPm0EKG1t13TxQ(?uW+%Ky$IgDQGLQknk(G@W3Z<;$mn8}cIYS; zX&qJvXOr<`vc$7r1{x>5TL9#`5Fzr7x(kwPLKcS5r zr{J!ppUj#dU7K7es8(m2epiqAV=L(vm24HqzjT4Wj{b{t41O{RIv`TUtHA=jG?i(@ zz2`y4X&x687k_dtJ<^MP@3mUfl*y$Q{?m)3tyW$}MumkIoWz^)!Jn;&m-H(N8jhgW zzr{OyngP5<`vjHu3A@(UiVIyI;>IBhE<7Qh*_2cjIb@@AC@hu?IC}ddVXdj9Vp&cnzLn>mwWJ`diLrrg^C*$BM)Z_L6sER0)8>m(r$%0+oLcu z%_u4Jo0kt_c^T-*)5T2`ic8A1RS2h+|2Orb>>sqFUWAZtXUXu6$`BlVls4>-VKRiNS-PmD~)w&`zV!24n4 zg`bVx>Iy&;n`78!fAk^1G*_byLTzz=sndN%4zKGM%&C5=TTymt%T{B6J}2UKqtcu= zfy(gVQ$hhoVf^n=g^$$zpGZ+bmO`!ZbWy3_rqDK9I#ce(EfrI4?_bP~|9suRheV>m z626fY*vpo~3mi5W8K|^9I@7Mu<4%Os|Fl9AO_Q$aWM0Xfw^c|IvR0ya4`D3WW7LeN zafNmVAblbLW)RFovmb!9Xmz?dFHb_Oh%HWMLjZ_+kafdBp$hr$kWXA?cs(L=knkiP zjyQ@w;vXNFa-Z3@6uYTJA^${|v}DYOtG@n03;ZntnF8x@g5`{^%~R~zgGugV7JVwL zy=0#@r@cwwmBi(sGke0cOSsp26jAoz;3OCGA*BU?c)2C0m zf#o!P%BJ#|u>%-oY4I78uYXy{vvl4nK-H&2yR4ZQR4-&a(Y80b(e`~i7=%P*0t zv6?z!&}Ir8+L8EYoz%QN@{r#I#saBM`(a5E`VWYi>WL4#rR)CA`a*WEQA$t?56F`= z^ZUY|!KYmElJpA#JbD%dZylzQB=N*=%yp4`i_OWi*{9pu5-zJCTM8fXuNLm~Jlg{T z1L>F9lXc#O`I{2jT}4G`FAU?LeOxrncb#Glo=Jp-FBSO$9Oh5Wc~zF;oN9z^fKs9_E+4@kO|b>vI;@(Y1MSEYNd#tC?ICTXrQ zBIRw)80xE08KmQJL9X}S-j~0T-*Bxp=4X$0Cc@lOJ!t|!yKQpFk`Bx^O7B6M?>5-% z=kU2FW1^!eLD6Uy4*%UM<@9Djle80i5$ZLPH+vS=pNOcGQlkm6#(dGDx(cqG@lJJ! z`v+6+Ze;QvqJU+sg5J^Ikvqesu8%HaeYmz9RvHj?FG9-~HOYlHBT1}MQiQl;SEUbW zJB~j0XN4I4?B(Ai(OHHjkUje>2L+5OwD`uVa}nS!1SRxpLy7GLHn zEN&BJO%-hiuzH;fbd>Je%{H55DrTQcz;L37#uT%q1_H^8CxFOau5^n^JnEyME#V#< zv^xtZy3hm!PXJ@CtSBQgji$+w)q3sGsGSDB!`^ZmNlEOA3FQj>^{3`=aMK!^~Lh997{ zQ!|BksD-#8XygJ}12V6&nQP?v6T5v^Qf@!MWKiMZfW75tDfOZbAfcdD;9TKdtsv!- z86!NJ#h=>>J1ZB<8C~lB2-1+qrq7+PmM_|Ku5g*Xmiby5o)}h5VHhqht-9H4r5_MB z=4<^~K1rtarzU>ErlD;x>zgiHo>-1lh6k=S>pK47dn3eczck;K}GJrDK6x1jwsIvxq0|M4YDD$+|?4IjBkr_I0eIG_M<(5)w=w=SHT z7R>YWCGN=ZBDO`J=T^RypV?<`i>*itc15Q-w`(M($DeiZ%ReY2G2>_EcCsE0IPCl> zpK~-V-h=s2JGniU(AvSx&riBs+Q)R#NYW=)%qpNyqsEZ)J3g`;yUMo5SK1+?br02& zq?(LC5URlvG;bf|x`QwXkJRCQ7MoQYM+xZ4!fjU3}m*Q z9Cb!2p-JP8D=pi9T-yz+lc$p!$X76*#r)Pii*Vxu+*`2d;vEx~0Fl|j_P>bhzego%guC*)aopUcO*+wYae1Sg0mk$rNWv0p`ViEz6xSx zg;KO%4N2p4SZy!snB;{HwKc!UL84ElS7@F$9?}bCgDli=06H1Z**lwE4b^oUz*1!~ z-$89Hz8p$fsnz0J42$7o{-O&4_nz7{uHyWKc4G$?ADSf7MWwa861U2`9rHx?jEt>l z?fXE8ZyDR*_*O~wHC5{5{#{=``hQr&Zi8qcMBDPRoY|F!I96?s2%@mRzvn&t^&FUQbrSM#^mJ_(t2GG)v7bT>=z1E&q8nH3kT>c^bod@kIl@S_YM0f}}zs zG0WjG+`bqUg&Ma4-lK}}HNY@GA<2=B|EdouXbV#f1>^I?85jg3-n_ExggZni@Zd|! zkOe@ZOQXnMo#S!BrC#wdW-FNoDQPN|$`#~fP)vsUZ2Wgbwh`Kg&p4;*qA}be91Fh( zhN3}oLu1Bkfj`VJiKTYxZ+D7=D+ymw1|Lc2PY>yMWAv(~&*-lPejb$+OU;T+DR zEx8>Wb$-@rK+s?%?-zmh6Mm1fn5`2xV!C%uVxnqnjzcus%kA41&KmwRMl;!8-qaDK zfS}!+WW%IC-{V0fdsD>^4lN~_Ss^LD9b(hP#f9ae>@6g;5S6iA>4P$S#v{C25Bqbx zD|sH}cb9b3AR=h(yKA>)h1v-#=k#0El1)>(?@oU}j z(-Rhmf%lIxQhtz3QdjTFn^GC?s>3eqh;f$rk92r3NiG&c&&t!v$}j0JKyYNmc@Z$> z@$eReJM$vu`7g@=sq9_}N%!(gARoaS`E9i8|CvTSR9dRF0Yc4R~9N$!a zNXSyxrH<4#i3Mf#vP*YMwRYF}se(fckxW}?x0QRl^adFObAmp5t_Se=XGX=0F=v9N zens1NVISg_?U<@UE1QRT@ylS(wx={gKw}la$oIkVqCLBI&Fy8JG-y*UPOAJ zWy(N^2!YL<0I%S^UYhBJP9QZQIDec=-OUO?mdq$-@8G$Op1E6_lPN&z;t`aF9?!kj zSYWfSrtv%TnZ#`74;(5df^VqxVf?Y_C8`cX@*jGZkqwQ2?>)c%a|=-`dHEO=!PvyU zR(0Xm-&=U=Pb7++YwgH9!y(1xvjXup^oo*Gn{ zH6hUNo^0&#RzdMFHuTwoXO354iGrv$i`y@Si4a)<3M?IN93qkZS`4J{MB^~!*Th1J zAHFnCq$M^dN2NN5j{lDr59y?~sXc1YoJ=6qXD&+fbB_7@O z@^eKL&|}f5UhLpQL?-fAWEE6bkuIhYch}`#p8utRJ1Bs@_)8Xf&#Pp@I@zCDA%69Q zfx}i}h6Arj;jn_!zqA1}yA*C@+-XM4?=fEJw|&Y%wSGO%$Q$EI`X%VEKG8yrI)s?M zbnh#_;p>w1yEv#S0*)c%I`0f-Q|`ET>S^8iG26sxXM zY_dvZ5o(qAx9HT$jkzSGG=qO)3~&OXSkj)Tyz{>Qpec5Eod>#8YQ*2%PV~UaKOW3^ zGg2ZVZt6lhPR{WB12todgQMsH>b^0*2ab3+!PM~Zq?j`QK&E3&NwpqX`_ln& z_nUa=GAOWe_2PGdar;r8RRHXfn^0)iRoc$f-VtA>nM~m{01;IQ{Ti35jQdryqOG=A z=hlX~uk#HiD)c=3D}eRBCE%U6jcB6O%U#xvx{%ZMzd%yNNmrx>`tfd%>+-kp_?JnU*EJRl9c%(7 zkB>waw;0p^MLWQ}u=~t8n3>s7GqX%;GW8xpQS%H+v!T}v31@M_U`;Y!Jzrslp#0V_+PWn2tIa$zskiYo)1#VFHqIvWw-~fd9-}* z7XM3mYeq^(&fY8j*q!0kVEDS?)f1ABJ&?`K+TEw1=thlEQr#9^x_`SbC0cugl1*dx z`J+?(Clc@NU<%s3$0$%4jEj)!o978p4upxWc}`cV!s?gcQ1+K&aN|k6gv#MdI^_y( z0%V9~a?#oUb=cKqv~C4u^|l1#eh8&!ss&?7=nYgJp0h&*p@!qP ziurg)uFS7Q;g{S?W@eV(Gb$;V-B_m*PVR$>v_yMi7T;eV|8Y(@piSm3xN;WZ{I2wb z)I>@9Og4^m#9(vSLlSuY3LlQo57(*<5Cgb z4sN)HWm$Y0CwcN?>N8Lm7g2pRldlB!(?&08WLR~FL&B)yVk&j2p=r!AG9`?2`1t*L zM%U1`r0zvApCE`d2W1vAmj2&C4|VG6TxuR6b|Q-!0YXplcuMjErR{0p)#mtN+;;df zY#8TsC9&VjtmSIHT+ioX8@!$Lt@oHtA$C@!3$~o`lz&L zk`xyVMKp1wN0Le#na9+>x_nxH%TUTPq!Snyc@S5>^yV~3<@f2o=B8{koMwvo<>ja` z@-(q6b}~mv5^43=zZMJ0=XO*Ciqyr?X}I4h`+=hgI-1R9^d&9@mSMqyWRlUoA}!!q z#X%Xr9*Cn7t8y}j?;5;97`L3A#h0?a=S4`;j6TS{vR@eUoo}+MkF?lPqhpb#mWHi= z8xxJ)sDBwza$(Onm+D4)yB?as1Lns#YVA?pZVz{uBI{D4Xq+yad#_WPWLtCRvkC6uvocBh_ZJ9T zkV+5~%#2jWR9G+bwtKfmKURpHme4Y_KkOh*3nDvb!yUVU)I>;wdRPdM?TeK`h(p4w zA>)|h45PVNbn|aWY6;dIgnhT?X@#q3gC`YdIcg==hOH?yY1y#OMk^0Qv_5BhA8?zOMui(rcl4=V6b40 ziPDSycWe~2Oc7vx6DY}|JO9)@Vn-satv_})DWo4Th>ZfquVIC(aD&YDGcOv&YfXIi zVKn#VxfCM)nV%0_{Fl*phA%bM6lo%A62j@|X&2f&ZHo5vfEwsq@7bYy!nTIZmkdL2 zokt;&m;BQ0f968EME%gBGC|hhA=v+<;o)~0 zL?QC_D6E#91mU=}LkpOGMy#egBhm{{t$2Uq&03=m2gvPpRZDNUNHn1230*?Brv9Ht zreKg~2Y=2GLxy)$Pban*hzFFUZdD~ObmY?3Vg4nN*bi&85swOEbWqXjDc#AsVNPaQ zf5Vu-P@=VW2#8rrn`IM-HEXil&cza)zeJ8dgk_I~>&rwKVKwo&G;OG)#bL@n>x@?Y zGbQI*bE9@$UIxiFP6U=9u*>d9r?rM~^pVsfPv77-l&HP=FQ~c%F*^^ULN56=Y|`Q{ zkxU4)wnfoEv`AkGV;eSQN3GNEie!v>JU9q*TT=UvljuLB-e)<}m{cbmpb{t=k@UZn z(PPf4_ruHiV%-tmp)~CFopI676gt|{q+0=hMqN->8)39{C`EmPb%?fPQkZyz{Num{ zAx4EO%P~D4Hph{4aO|c zkR?Y}jX74ZY?xH_rC!+)+IogrlSFt}Xh%`OYHu#V|Geg0>w(Flq}@s(v+jtf%F0UG zU~sBDjhqcq;r?7Tr$Kfns1&|;zsTV`wLKtrv50M(Z-yJ38z6k!uuV8Cr4**We_NqS zJ6N_aj@|98X6jAxWk>9K>9+53|G9-N{9c-=;xYNwgoyemr{D!c)Z-%eq*CC!dTB^; zy^ZI3Pye&)@pi)MwCnEL#iuL?kRx?E?-=LY^li>PZ+eKf%>53e=b-$d`nLv+eS&u> z(2mmF`!)5Y8=do44|S7H=Sw_F%7e!fACpNn{}rIWf}9XF?my3aITtOLz}~dh|5x3r zpCgTAL$Sj7&*vaKJiITLds(Z_n*)Tah{olq-TfSVHX#=hfQGFnn#F`aV^V_E^>8q3 zNCy(7Z1tvm?}em*rBBXg7}nl z`6!B-0;)VwvZs0ZY%7$|hr`DV0V5z6E-$BhHG#y+84Do*`%j5*}M49 zH6pN7K#7~f9{-I2tNi*P_yZ}wep5d~<_#oFrjVvDV{__8LbqT;H^*aRxIoK$$6`?# zSQIXA-0%D|@-_;F~Yd8Yz87INKf=%z@i_FIX{ zQ1iJiB{#OjEd*W1^qxmNVlGGp&1uI4G3jnHC;ql`Gcs=W*xkpwa`f|`=4IVvHxbeF zx!ha6Hu8U{%}H0`H<41onpz7ZO4DQ7G8i$c__JChzSEO1#!NwZI0%@f-{sGz6@U1? zSL4Hf<#=Q;h$3oWb=h^9id>DKktHnos!9YVCTy)^|w-Flqi`UUK+5W8dp(`%lqm!IX60{4$Mhq3Ohj`qT zL*=oCbgM^v7l6b`JOA01wZpy6e(Sv{>KCQSKTl5jKQF&+M8?Y zyN=D%LT!AH&y(?4v)C;D3Ea{Q43L?E0+c1!Ic4$dDS4{9g_2XZPHO-HQXpNNE!bV% zBN{ztta%sFPQnYlB(w!E#y%64k6o)K4vC!i_K2nZi?@|tb<>S`ebi8G7k z`dIxviWQArDHvdU&Aq+WZ1Z23#CtMuvO` zgQc1Bni-2OK0|!7O52O=+XPhk`J)B+`6+WIcb4^Ax=_$W<$nRJ2pp29s>YwYYVF&q zb&5E@7f+&I%*d=e!}4&rgWj9rY6x+~K`i1RSqT|`NixsIEr#1x#IjPm$NI+1a0!sL zYV0C_ZIx>Kj5+C3Vd&jQSZ7+QNlQzMD{l_K?;mx2^A>FJ&_R2)n9nrSF~fkKY?O|A zrtu3KQ%a?f)_#u9=H0^M(dK5yU`lnH+)aYYgHtUN5gdnU=4scwY!3QJ9I@SuITzo08XxJ=MT9!O&V5+UY?Bc788hd-=rIp3SyWilR z)q}n5W2Os)=H3&GrIUJKLrFu2X;c#$sWjHp_vN@(^N$u%Y-xCaLausJrZ`jp>7)0& zIA4jz%_x?hBDB-KMbwD~4^sIg*B>!wPPwH{#8i%D$+wZu##y>?E{(C8+Io?K0DeQk z)J=>r@H#;|CxB+~YePds4w1zJ_Ic}*H|;JWz4+1Vh3^LqqLh(3ELja}w*2qi4ypv8 z*zg*m#5);dx3hf)cuU}Lkf=l8BBk7lX)z=O2A0mvXW|RyN=_7a<VD1Z^WHd}TNvUdbyZM9!<;k>yFLINuKU+4hU7sI=L9Dc z!UB@iZxruL{`SmQ<~^Y@{N|wNI=AD`$SN!S>+*9kZexE=V!k+0vr7#Lq0}Plw4$L* z$tVzICPnr3w-C9q3=4}p%amj|`V#IF}l|&ZV~6mRoko>n``KhyHxFXKyZl#mIg!OChXUCVXjitDpq`EAE0>D}Zde5Sp$k zsSd~=>!s?a9lAm_$sDAqt>}Zm36JOmv?RvJ$yzn{st(dCKRo^GU&HB`<6!UbLrAe% zMhUnFkh?$e+F#GW@9ZzzpV|_lqN>qqT72*TtjIb)zxZ&I&(v9OgXkJ2f0D<49MMa5 z*D2s8mZc$2g$=Vwfy?7o%p7#}ehjSN_X~?P<3O#xm{~H=TS3SOGgAcv6<~^($=j&N zGDI}NjcnzOOyO>#+1C0|9K5RME%3Wa1R{gelfy@rxNVHQ-D0mU&O5(>gVKZh`!Jv2@*MeTIQ6X>lLglj1U4q3<_z_%91@>^5EP?$Ig_ z(Y^bU9sagiq`mo8!}Oc`o!#nXdr-w>o{2e5HjuDlR{OGt=F{nIu(d?Gzx-3JMlB*0 zC3v5w5+Ar^dlu5Sy*;}R)$sX*nDLj_ywkFu^JVAuch--F=QA}h!T*-wKQ(csB5Nlp zBtZ_{lmDbS&b4d)N@QwKwa)OY*wM=6?87$gE1|PFBJ{moOriZeaOrVTY7 zv;OENjY*R))2A4pTV`9eFEn=oag^N3wUz%XcX{ zwp0IyS2ca|6ALpp54YsC+CW12B>l1$M1bvac=)d8=YoI15!KOaQ8Ty^5?C7X{Z+ry z3ADhrZ7v*&oYQTFydb*~#F3V2WToJXYdR|f&sUPwXpafgsd_v2J6{hQ40_4^^orpr za_S>Wyylk=J{u<1IpXGunjA=fdL^++zk@$|`HWfWciI9Zw=FQAFSl<1RE1^KeB9~r zF!a{(+r~=>B#!=xDG>Hb)*ShAU{^-~jtZ7GvtL9zU*J_Wxn5Mudb)FLKfkzixKTiGmd|1#X#|97 zNMB`m8S~#GAAb8nD$PV>21~?>Bx)@RuVr{0R;)qrIt{9<%)@VmH6F@|F|5gRAEe87cu^x?0xzdN#q~eahiF$Z5$o=zfK1RX59~#ea=dN zavD#3g&vW_M4uybc{~ypi_#-!C;6MksP->dK=Y{49xPx)ldenN{IYo#kc2TeLa93BM01;((lNx8TeMhM6Fo-fH)z&z*V3+>odO0UZp0dTh z@_R*y*1a6=R!ULTZBXOBIOQ+eU<|TK4mw3eNa?<&I4|hMTe$@4KVAH(9T$uQQf#NGpXxLknyh+Y z+kYFlkV$qBH?t%%83vs_!db}}jQ^5`S6#SJQf&b2&y41mlHcm-<8!V6aSR4m@r1q) zAqqZ0t)ED3c^xx|44SJp)djWI)@pQXazd2?liDi({NP-jPt{hPez-b4JuR5j`SJ?- z(BHlO(o)}&1W)qYaZ8bU&Az+yn?bfq9~St#!^I<>*;+LxKFViPV}##Nk9Pgia1oPO zp_tX5;=-M5y$6j3UO03`4uI@$3a9B)>tja;l~IFE1Mu19Xa3zU{_!3DC>qvcsm$+J zkwr-K=USi6fBDYLGlCULOMA5EH9>1rZHs8C*eA+FYI^0q;<@v0m`q@0fZRlvsHhb^ zDX&H`a&(~87cz>XUDUnUP&x5w8rNgI1o^m~z0kw<(|rPC!Eg$n>b*XoETF+_FBzC9 z%%FUBsNG<`@r|_CktcK&ire+xatYzTG28-oqxoX7Vk!#uC-+y~gAJt{(EyKnoFSao}ze*Sz;)V%Xz zc)F>pz}gJ#jAF}0jqt;YYw%KmE1_yScKudVLPge`s}283-8!Li%rv_9380>>lH%Ty z9Hi;P<2vu1-rahAl9%XuRA#z=yCG!yHh5S>TA`Y`Jg%+rk4r>-P?P^myma4Qk3yJ! z@wA0`j|QUAR;c}L-^~?xW1sB}vrtwcWAE)iOX#m2>m&B7k8ifR75;N`W0RK6s@2E& zhETt!1)Q|{@4z@xKuFxvfRFfd@u^2U(gp|{GjG)cYge(hE%Y#tO!3M!e=KvcaSO=a z5`U8+RTvLhb{`HZo8J9CEr=1n!zSOb9m&^pN#?k6nAoX3wl6bK3W0lvb7!cEtR1N# zIaHQ-0PLR8tu{~K08XMf0i}3ltd}ZF&KRLIC->oc540{fYfn%8Vl$!97IxL#p`l^n zjO8pUlOuv#Q>Ab4`y*7f{Gm$AGnJKxqi{eU(#DUIC?%DdNS1zOQ&3s$?T}ZUJY}GQ zcCZlGjw_(i_^r%^7Emdu?EUsF2k9g-Zw(1WoaEr>XrS-mu)g=3qZO`u@)lF-C++c7 z3ku`*nI@0%$anbkdTw#Wbbt8y=<$)c*hlvmTH=B@A=Ba=aAPc$G%REih{8dC0fV|7Hr~{{33ok*q0BE#Ix~4 z#|KA#(^FIH?$PoI$|iZA$ID)=f2#Lkv-?Q$d*kQ!aZ*~*zVM$*Be%xJ6%Q9j$1M_I zY&NFt*zfl5-6r0nG|qZLc%5eLnRSSzD)n^z5{GO`PtaK6UU8n6xGj>;NaedFetv$X z0P!4HXS;pI>6OB7^giu>jq}?(h@jT#hJDOX%a{A`AYMH!ou2-rim~)8V^RWPtYpvKSnfR16dD%zHZQfhp_$$bY+q_%3*)i0uesJRI6e>DW10q*f zlkxqs{j{Iy^q=QT4`E+x@zsoK0vfb{RtKwd&qr~{<5OetbG?1KW97)1h|KS{eXDFb z`c&O0)Q_^5AKs0%AiE>3vxTwa7a&SAR3m9CTrBzJk_4UVmjazoupS?Vwg`~=ZgJv;m`T@2vd=W z;Q3e%CYuwD=_95u84b_2DVW@8PXgCLo>FO5*c#qPZWlI3*cr=fT)Rg<&MyOH(w zG#OV5o-R}<2&as*V*6Q+09Ek4oHZ|LON;Fi#y_1YtzdI5TvDA ziZ7I>Gq_9P-Odc8%=B5~#s4&~hd$PwreNNj+lxFh+VeaQFFc&Ak&MJ5g6PhiP&q1t zfA$p~i%l>1S>MKd*`%Jsr}^&jR_|`ez#L$;=jU;}>p(%WI~#>L$bFcumn~eWbfh^x z$o?kHwxT%33NcHmO{R;6Il@0P(q>1uJV3iJ4w?}eZrxN}oVdz7O|o=~9FcMbc~rXr zhS7B@Vw>-ZZHL9Np%sbjcU#XxvF~9`+IizUmlnV+SR)!FoW6d&5EQ@2JBKTLSZeY< z?r=Ai@zd74d)6*Ebyrft6HtB6GQyxXjQoKl#r2se6UGLP&`kYzX^(gaSzgBGG}YA? zU7LkkSe#E2-B5)?zpAle@mIbe-K~F8QnyVjR)<;zgG;M+zKV(!(3bw%CR<6C?f`UR#Vboo5BmX64S*5) z^NV;n&s=#S8n4TW>m2#bxlIW}K4(ri)1Cc;#vaPiV*Ih(b;Z{ou6dS^094HJ@j2Aj z<{7>9H&Dgn$qj7{Mwj-*P9Ga&WVE$Yd)ojN(qZWh;E_fRFsRa341@K#1w~bi!P&gM zk`>-Lm-FwbftKFTgZ{N1Jth7IqfvYr)kqGrdyIP*SnqTM?Q*B-O=i$HRb&DM5_|ug zd-CkZzHPdElUubf7I(C2?_l?2Be}ZJpqfG#IG;ZQ65e-7vL)2UG;0VmltSVd4d1>z z7?q9$zDHH&1JIEdM^B(u8A*H4^#%dn5R5{pZ!)@*=X=%KC(itpWrJD5RYjA-zYO>)Iha*fAa3j z3@FCD^lrhXgSus>MRD?Z-dL<;KHLm9Q`6f5g7{EH#*7AQT{++8m(cdBvG)BpJz$+K7v_yb=Xv2Yu{)9`3SyQaMx{CP zLsX$YYVJ6(Z+Gp=-XZ|()yA0Pb2bPR&)mQ(bBzt9bT1Ze?9WOpmLuQg=rnKOj?pA; zmD1%`ld16o?Vg*zjO~K{a{)8b8j1eRhw0VfwM!U*5Lwv5%fAQ2AwihZAejF4G;`S3 zd)l)U?XBmE{av1y$)1g_H+I#l92Yqmtw$^YJ;lmid-2!`^X|#sR(!6b$4LiD4Ec;{ zx9!DhqFX$l)3@u}{v6gMX;|X^{R@i(=lrwJvYCd~#_x3&}?eYGI1dIa< zB;c@Qtvv-(GNJ$AmO=&1!JALny$eGwppK6MlqdcS50)vlcsv7*B3$^$#!uEy`pIu$ zPtUWeE+zERbMv0k_ywa@(caa60Mjt}})Pg%uf9nZn4!3IlDCYv{iinz}j zi6ec6Kz6WybabRVr_O=radZQ7?X0h_$NonJG(J)U(O`dTE5tK;T`-0a`N3d~$xn%z zN`QP-DBR~&z_;l+aHh~))wv}eN;P;% z%|LcW4balIQBN+~QTC`OBs|!&&_x=VlHTv^>H~KON+Sg@B(Ux{b@{X1?_ZcaTL1EY z8t=%E5Pj|V*}9!|gmFc4d(f9G#%dSb!v+*!cjPIlf^3#>9~A>c4+ z*E>8qvNLJ-aJr8c;jlkEGFfTg$@UJP?qUS3p-|}&s5PP98lWacbqAU!>ODrtTW8WC z(rSEdsxuJEMAVppIjNI7J4r+mTfWt{zMhfXtu#duorbqai^vA#Z`DmVpo0(M(sWL2 z8`XiHmRP)Mn{Qto-l8r0KR;e{qu?n(AQCL_t~M5V^I<`ZClBIeuj5K)Hs|r#(O<&n zC}CzgRtP>|JFaCjT4crNuy*h}5+#ZQ^Z%0hO+2xi|B`tPz96*}f~KP}E5@4FPGS;` z!O{$$Gvv0<(~O!=!qwV5&mWIPeIL(*S#_&|8|?+OQcMYW(>Y5*>8Q?uB&L2#yA>p z65TKfD-E$rOO=@!aEBG+|U*MQYN%hPWkYs1WyB5+rF>#dzD2d?l466OWpD>$* zpE1R~9Gh+}F7vIn$k?0|R8r+?l3e8qEwYRtbK=fc^jOgs#Uo2-HCdsX38HMG; z3P(^;Q?-PFDWKA{aVtegh!7n^I`{c|S&av04U#Uu^X+j%;UC*)TcevDkB`8huLR8i z283>u5oIfmq9b(P2;10?J-GDzmb-{!267pe!=2T6E|7DWo%!m(u4}Jned_qZPUE{S ziR>_cUoEM@PoVYID+uHOj|DM(awE3b@6i|IXa_wh&{1rhs!%tC-y)(<?$vwx{stg%2M0d;%$s3=dp&?*E z>H}cSSmJeU{kj|dd<9Us%jY)@*+bjpS<0Dc!IkWm(sZKmr-NX)``# zFzt71CD7$xEhLR3$vz6AmvJlFYwu+)@)~Wbq6Rjpm?Jh)#N~oiKo>`Crp}X_YDV|N z`K2a5$>$C566j+;3P@eqED#|wjghUA7wkr;51I~>CWFNO`Ha|%DeUlq6VM) zt$ABmx#}-}TqRlf41M^KNp$*0v}@n$MHxUH1Xl!vg-e^gcCvD==L=#w?IGCwy}Ky3 zAhcYvj0|@H*GGNsfsv@(%;%JsA%16gkxn=7PW)Bdu96<@5houl&Q~cYD11GD;TQ+{ zfs|v6`p4dC^z{i+3kQKX-SQZMt5}*q748KMTIu-UKlDmr&v8+O_aeL8)Qbcjf74OUp9rGc;AuFmQaJf^ur-Q-mT|#nZ zshA5+3)Wzgj$HN;_Z=>US2ft*e}MQZ{eEZGJ$rOi z92urxvC3_WA(e&#bVyLp`N2+f`Rue_WlSdHW7Q!ejOBYJ(eNp$^Nai41xb*46nvF0 zXR?#+d$Xl~`F48kiby7LTSpjO4v3c5UX^=5Ud#PF2c^08>t2f-#(G9;<6}i#h0=M& zPV&u{-M<=W^-N3W8&Oimb059v$_VjyH4#tCjr&zuccn=`J;%6x_?bX`dYvfUahD|Y zdKfbl_Q^JM{DesA5Li(z0ttCd)~zE3S2Cs58;k0lgjsiG4}$`XiM_~`#$8}&Ww5^$ zb%>=*%r{9}mK1e)Sn>Av5{4gby^tq|Z_L&6#88hypfvCqY^|mUX$wGsOX@sR8 zoP@&6&C1RGrd}GQoBwo1K#Yf*JG7$jJ?xEi98^OAKLXf4doAft-FFgYJm>QX5H<1y zD5^V4V)Gbev{!}U1J9kdZEqE6Q3>Xl+@cwU<40eGNXG}jS}F$C|9RZKL?8@xAIq{M zcKFw3X~F(2@Fo4kq6H%v8ESBS2m`FbqOl=aR%;F^{ISvg35c$zgeBEYwNB<1?$HoB!kJ931L;_%MFcvbp8EY-@Qp z8+U18*|ux7-E1%WW*b}fma(wxmY3i2d;f#u^TqRg9`m23Z{G0s4fATj@MYMFSd@rl zgg5cT`HQdSR95`u*dossm)pIk$L7DA=ghU42#VN3Qvr(^aO7cnhQPY@CZ57}* z?;k1n-j{8`&ms-$r{$8w zhZMt8!TK<36q)kKGOz{|6B+|2fYL`Qs?WtkbhU*eWEC{wiZ*-T&~h|xp09XjOwD;$ zmiSL49K}7|9e#g^)oA5BoSbSZj_xEhQ-)TmQSj^F<|2PwUmc5lWedlwWRXD&(K&hF8-i&Ie)jK9)?)t7q-YKvL*@FsTN zGS6DP#fM278=Hiff(y!Z*$4GawnkG3KFDjx8}nHCTYdL+*BI!6m03ym!&665wKP9| z*viGBtu*Iw8MOJ-jZ-V8`Im|}qKpR;WBx6SwPsCghFno;yns{$0s+EAG$A=~opWFV z!N2zMd|OdO)XxLMW=L;+nWyi_Blea1|?y)m`fsMY?^a+TBJ|MfeBzj zL>4158us%ZPsJ)T&nG~;t+vAr3mr*Ql9z20WvA(Je*8jfwCN?%#d_e0pA?F zK3aI-Z|dmiD36p_5V#inig$)h`wE<_&JJSE)0bqQo8FE-!6m=Svv-A|Ih#?MXj(`j z;@5?nMnGM=KBy%k<<&7M#nvq$`?}a9}`+Y0xyG?sBnvdzbZHwBr!1Vb;T)x33MODu#Y$t7@;wG zXSau&eCv9$v8$^GPu?n2L^9{B+=Fq&`%c9_=Vt_?4lOt0-@%u78;H$YV!!>~c4V;Z z_q)T`C_I5i%Qwkjo!PB;7Hg@`rxF?W1a{GzFeJM2aBqxgD1T_Sg=~k_H=#^361|V1 zN+Q6|toC8%!um_*JO)Hm9tfL!kYs30B`vpOJW0|)fbNQ_p72MpR^ybNY#YRt4jEIw zucH)V@~sJPkHE;Q@o7TxRD1Ni(h0@4USA*MWSJ!j4o5I#{l_7A(p}Vdf;}!JSLm_; zOlpBydzPS};Ms6)?)i2SZcj%gyrtPAV7ABS0P6wzD3t6k$~l0SoblgSOGRad{g$1I z3k1LrCw#Q$}qfqOKUI z`rCiLj@F4$x;JQWJl=b^*s~P3-Ot>!30dtBYHK0eT=;P7I7C)fDO>PUqO-2fXWh*K zxwea#6F&T^0rj(eZiPN(Bq90azw8qST|X!cjp!%Ymfv!7c5drG;X!+mhbQD^hA~El z9_F!&u^iX#iaUjs*YH#=EHFa~Lp_vE+c|hTjYm#ju-@>h5y57FGvISQAIVy*Pj0 z4IW(W+f}$W4$#uAr|KD0luKSdn4{znH=liM1sS7V`}a@o$L-u&6~_#SO`g+g%>6F? zC^m;c8wT1Smn;0mh%`+58!JOu;5i~RN1nM{CW*A@N3KPnX7!lLyOcTk%#y&F!QE}b z+|72Rd7_n-6)$>)TfDD%`(KsWO@t2}_oO;zrJ%sB{*jQmm@xmO`skSq?N)n^={4s? z7ii{7hE)em9i>_0(rkf@vR}b=8vh#l3wHFkj+6|Yb_b@F0Z(-Zo+%NiWBieLyz^+m zPu6|8tK?`pEPYP9=}9$};^+s#Qr`&=uK{K-oZ(g3%KG|>U$bY_9@=d2P11X`w>`#f zCXRX}_xbb|N$3}wp9uY9h%L_d?FEc|3Qe;WxJ@-Wb@KT^Qz66jPd=2}C%L!88{}(2 zo?Y&PE}%Mzw9_KZazkp0^p;%jt=sp zyYGU$zr-w{1R*~8Hs$L<%}5g>pnA}4@4DP+f8|?r%Oy*C2aGidnspJK`sWWj;$c{L zm15YyWlSmpo{Nw6RKJPBj0nkvCB0_M)n2B-uVhwiK2BGREpf<=Y1CO&xbonHTl7$?lt18Mnn}THm^8ZwAxY zS?hS?3d&Axmv3gwG_(a$SxF}r*S85etPq}?pE<7Ar6$mKkLSB+kkc)_#1Cz0fg?9G zXl*%;B}ZtvjgUWesWe;&C_!`BRx{k_voRBWwqo`Wg#1=Y5gWkdl;9Cmm+WK|AFWTm zv%mLi5#Th^zh8M($qfuEr!Xm+)8!)+#J1#=J*0>aKRHO||88QB8QN+g_!UtNl7X&C zg*m*H)f+13r3oc1%)WY~d1l)5WU>C~dtitt@9SY!ftT%fL#FkUbteG~J-swa#7c>$ z{?)${N^*iQg1b|PI`_oPyx#12ki1^YK?N1h<}<<9kuMKFfF;!U8tx3}Mo4%W8F>P; z?#Y`$>4LUJ<%RfXv6ll zg~^>A^OHtWG!r{RVPNaJYSQw*4Aj0x@LdI}7zQBNUWt%DR!9s;uXT4V^KIc&Z-8}jsv~qde zr!Y8ey|Bco6swjLEbzWvAIzN z!mRR!UM<)1*yJ;D?{VMn6}MEPvm$Oz{au_qN|3 zql1!~3cz^skPKm9w%!3Gl`|JYE`7SFrCaAc9T55QN#Axw>phkrTW)TIg_>!Y2uR$^ z;=k5pny2XKa8V9pKO3^MBQQbS3HWu(q*GP~L&otqlvW*C!=*A!bJXJ8U_aZ1ERcYhxcgypk1qp zGxo@HhP*;uqREQ6(%ZI{JVDz(bjAq!LU`ITF!`tgUq8jHqZyw92MO^oU3?9$r;YMY z0S_X6uHUe!cxlm|kA3B^l8R<+&_uH)N-ha`JY?$Ti^$}^Lg>JWb4g-OE0uSDd?jAj zQ^=t15YC39bEDt@ZcXwO^Ta8D)AS*j*}Wv?x03xR^HKTu29KWsn=w7uRPdj5qp4qD z5sPwgnf#hxw~Pwr9v2n+$&`JEuVPqs*_iO4?3?<_g*XEL+4|hH8gy^tnPU;R`eU{4 zr?qfN85;q=d$eOf0f-xUNQE~4$WHiY&1wg-5@=I@#A3?!(_@v<{^Zp0VGl=Fi_fs# z0K#HA$r@r}gZjG$3k9tRE0GS-RD4;&-+%Y036&WqU$Fp@$1zg@-=2KuCKkie({I}7 z{ThPjgt%Vex=VA=eU&9w-)i)jeaj7UPWo#WMQ{WFQBZ|XDQe2J>y#e~g-IeiS68|D zEedh}bb1`Xrde!;g7$H6Zm1A%ru^be5rYAau!`xjMM?Y_YR2)HTG}j1_3qbZ-FJ@T z|1P!U713q%x|1?W11A;DQi!(Mhs@%{J}@SH7+4wo_v-6O&Va9Q`B#z}&T%sfr?L5_ z6D8XB2F(a9B;)Q_G#OD_+jf@Cw|29prMn$2)s^Od{xzZ>SB~ez$(-Xs>=FRWb3u!& z$^`Q`(NAT+wBeeCsoT*-Pum)%)!RRUlb#LG3oD-Nb>$LC(p*KV%?T28z6fiyKN=vl z3SGeP@Pya4|qpGwvwNdhid4%2fJ+gMlKjx?$*7oR+MjC{S|l@lQQL+|a@dMw__u6v~9F|5bl zthqzLJ(x^QAh3)n@`-RE2xIp85i`QN!wYY*`UA+;!))oR zi7?^wSVCrl(sJ`3vZ$^0oNP?aJvS*}P>7%4fP=qgJ55b-Fx_BKiTYxDJ4-4XsDR8O zU1dDTN&M%2b9fpDLLXZ$MF`+b7 zE(!R=_JFl0sHkN#L5zK^1ksq1HmPVs#8eq`Xp9LrN49v5umkDq4@DdB~P1PO-;ZhZ!pLZ zD^v7uPal#fvj`D0EaCTZLgq5FqKVxO16V%9|~HdW`K`Vo~EcD`ar`B5u;kXmEh{SEn64E3p| zh-;7liIH6>qN(x3`5A*qxwM%^p5vjQy#o$2(NQ#q2PdQY$hglPM>*|-O@3xFBw3m* z5b0;>=+Q5LdUwX~BZkA{_*Ll{xnEC$F3mgifUNX7n~r{KM}RZaGiv(o?!GyP&{LBA zQ(t<=Nl~>@re;Ob#6*zp!u8kGl_4?W{}x9Pqr_?_`x0@rTnrP*%`w0CP6(6Ji7^zx z+9`8tNV*5V`lnE@Kdvh)6N2j_+@GWmmpBvjK6E9E$V8vuHFz41DZ4iY)!z2QaZiSI ztu&QETyVHC@}FS=8lT~Mxl{~2-EFVkZ}jg*1UXSvk--VOI~IC4luWOF^Wa^Iha{#o z_EIFDei?Zy^l1~TD{YpP9e|B9{OZuQu#i6o*ad=bVtTSN9Qjntf->7uF4lM*GQCcu zojHT{%x5foIG362LMq$+=6(ior$~B698dD&iVFK#;3T#KvxT#F;-df9IW2wl?d=_3 zg5k&X3F&59dVwI@YT?_T-`&1Jq3>aExP?Ya4f~iY8GTO)upC!~64i=&UB`Rn{I=Ze z%@zbp2ixNJp+*+?k9sWeT~aegUPyR4xczR%#&>HT7RA80`m$o0#3UINx?b!O*L|)m zy5xm3_YJ|~qFe%>A{0iKE!a@N1kbh3x(8z3mRgT%oZrYmyAy*Qc1_q1W?ur=^LK@4 zM%!0!`ShO1bY~BVBH{i9dPI9a#_sGF+po|Gf8A8$ndVnBer!b_$2IY?c3B`6URp#n zZzh3B_Jf&S^q@VW+4FmYWx(af0x?A$QmSW1u(3Eb#G&cRBYdtQ@-tMiTSjN;-iv6= znGo*)fMNetd|&XqZ5^EJ_3MIEZrKhh*cw$?2*L3svxd-}6ouU29js?{z2u&F%>{Xa znnJzh6rZ(8h1Ir3JN7Oc^rwg%gM3wvN4)aaugzPqcga1eNrhdS4%Eh{8?jp)k{HO7 zdR7{*-8ho2+3rCSgPVTKC1UnjnX59DT{)MX zh0oK$<>K#-SNe=}A(g7aY5r~qwW>VGv_}nW4l5?&xf=LUEsP00yjiLekM>5Up!BIj zPDJZ8hZ5Y!sY$>27$qehw}eGjd#L;&0U;CR=~Q7)b18+ zO9R$i8IWXuNV?!+sK<-v` zAS<)qmzWq8LMmvMU<|avU2(`pl;t%ti;tzl3|Q)EAhQgFwcFkWr5p45JG zmIA%TZEtSl&Yj|;XYF=VXFnJp_&ke)`1z@M`7KB2XbR6H1@3 z8k%wsnj}2bd!mPQPSEQ9Xo@0t8gQFVJwIF3G7+3I&*P~pnhgbU39PMothSvu*6;$7 z57B$3vr@VO=DJAM#qOxh`qSfxI^lSG^5t!sI8Jse_- z)x;Yt6_t!A79bhagxAcdyaal}f7U%#ITaOyjG#eo2Kf5HJo&iHXV?PFz z?&x#tMM&dVz)&-_fd>JqVM+K?9DRX zevhd{p{*CxH$I@-z{~6_%<|)~nnKC3DXc^nPnJgWNK9URKTIA$qCdG4XOP4Z=RXne zf`?a5;HFOe`t0#HSSjHifVVI%JZhJvvoO`b*P`=gZxc;%_`H!+)9#RWV@LXmzCZX8mu6Mj;Uy zS#;UTrE=ejR>|W8yWe_TER@b1Jmjb)j9ByCM$2#>jax#_=x z$mu1zXCiuo`9Gi8)pzQS83mVm>qmcP3*4MgIxgL7KFKNx5K_2bqq`^_Od2r;|9Hr> zVskJG=u@Of_*T?FDu7qJgQ6 z*UL;fj6^aXq}qb%NP5T48u#ghQZWxV83xUj{?#nhGgzo#WcHzt1i@_7WzFqSk5MR^vX2TzxjZ&~v_hc`Q{vxDst zdL=e)Ozr%f~maQ8>WhY+Ty(>M$<8V-(otP0*qM-P9D6D`S8XPs}P&<~f+ zYEC$rs5%o774^Tm!<$N;{s^VUV-MuDxy>?Mcs5-Km{zlQ^pr3pdc48=;pB{VhST3e zDdf+^)sve+{RfWaLw)V`F=u z{9=H%6p$fyw?5?f8Q=ZeihCLYCYzY!bhZtLVv|ls2_roBdCH2y8L<(1hrWaGdq70_>;+ zz>3}L;jq2&M_sJ*Jv00@U|r&!E&OadGfV9){%NhW5141H1Gc_(p*Jc5L~l%fK%o5Q zdojK%?3THPW1>!nKIsb{*mG*Ae{*IQD4hdcro?WE;v}B?-@*0?N9zeRcIE z0@>1Z#bi-xxl>kqhtJqWWW4}u!Q=d#k?Lg$FH(nCM(QcFj=a%Y0r9d|SmrbhAwv@i zK9olDb$7>mAB`*E@NkDGOp0vY8x_@Y)_uEGE%Ce<2et5^#{YVZ!0iRAQcwD{Yul)s z|Dc?%wKCqOvU)x1nTx#<0NgOs;X&J)?F#rC{PVHp<}S`+M=v+GhE2Q{gs!pz1GujO zgrj`)i{I29%V@tg;W@UYZ&=3ddo;n@8^`&?qCa>yQ3c+4Y-7086coRwxof>Xc0URW zI;}nC{Id3MX_6zjfF;QxR0d->*I?In$gnl!mA7~aO@ zcyE4h;k{%`os-wbSLT0>i7XW{T;hwD2tT~~hX&ZLZmq=b_xpPMS>?}pH$7@B9`Btt z07AC=)4fN)mnnnk9BSe+w#b&x`_~ry`tU3oZk$qkV6sPIZ>7g+1hzcM%xveN^e}uV z@!;mj80`7@!P`NDs1o#UN{`NPrK`Z``Jc*BE=dAtlp9%CTpVz+QdjO>a%#`H4Y<70 zv`3>2GsdCqtgak{gCPQ+udj9|Fi{0!tq?Hh)FWw!{RN6k93VSQxro4Fv1bdI^vZ<; zc{F>Ib_+F6d-eYbtk_6XhAk;N3K!{u<`I$uK#GuZ2Xa-zmUZA~j?j5~b*+Qtb0n5z zx?}6tv01W&w}VgXfKiJ+H?5_jFX&Q3ZKL1>&ur8|cC?<$J`W1rk@YQNQh8+OPo>6<_g}r-J)uEozt3+J;Lw zrrZ$j^GE0x9UfFoefLjDqMy8%{#fnj66#HLeY8r5jl=1iznNT@5M6vw#SiEV8WQf! zBwfCir}+1!jDg>&6XB{pk7 zz~&Uc%B7Nu){Cj(LXSx9)Y`jj)tZStxd%>Uz}zxK<-ac((gy1tBbn@IUsA`>P@@vKLhth=Jh@}b(VUccg*M$(1(MXTe~cfVZ+pF*a4v11oFb`_+=Ddt zMj$;FeKfdO*1RkMmovKV{f9prPj#R&`3*dDWR}scg+VgLCzMxM|CprcM(hq26T2!G z{lB|ZaV@rTmz8Q-HYJdL!7zGhCtRTXTOfs&UNY+;8{DpUI>QpTteUHs5lVnUUfpRWF)19MyE>tkUD>xS+%h-NT6?2ZQ?^)*Xhb6DMkeR zm8GR=qr<~Gok_aA;D*^3dFzj72ut*4`JVAXxoP<}uP%x24x8vJSV*%YXiyPfaz>NvPbTDu=_9eBOl4(lGY7u(%! zri)KKK!de>iOSZ|S2>+tT~D=i9?BJDd=bvk=lX_c*<*f!@uqUnRHx5}39w!Rq4K6Q zE|yJlcxm7EH(}~aybn%Uu4wvGd%2OxUlJ;j#4WASrKsLvO*!c3_6H#B{Rl9EuRMC{ z5{rt9QpnG~mI8(`MZL-c7e7Yy(OXZvRFjb_ zev=+g%$oSXru=?7z0NC7myKk_dx_-Q)4t6toF4_3)^@?e>-6|o*}ew{a5}vm{NdKs zsnlbG;Dy5;-pS*eR?lw6yV*zsCEpX?kdcGN29iX+*PuOXf2EYBp2j>cFloAZ=MpN6 zOn_g+5#So_;(y#(QCebNM4fzX$W_P}|CZlg zh#kyI=E8eBbucf!{j5~lS!rZ zvKDD5lVS=>)O-V-+n?r2^ynSJa5SK2;HFl0T(F3wNwVPGMw5*fbN-a`_Ts>Sn;why zmN%4a^T7j@#^q_NQG)=C_Y zG1(SNCQdTLPc;hT%YL1drG?D3k_QKHdRfvNwBe?`Lt)iSvqA|&2rBZzf~Q(c^^{ge z0#;YLJLnN;A=W&{54;F0qa#!<*7WpEc+QqTQZGtryoVB=#dfh9%HIM8DB1`B*=&bw zDy}}at;O!f09CvHZ3hSG%0y%otE}z-tE5YH>#rpa;!@~uO`{5EZo!`PRhVga(lUF0 zqmF>I7LAmi{Lu!jGzm2t(BkIbbFhuzVC#4gvznNDA8itufu>&5qMfi;HcY;wd8?j@ z`kUajhFZbY>sLFiVemISP}&FZ<{!ir-ID0w9P+&&hlPY(Ipi#QN55pIusjvRAVZHin~)bsWk1!NyNqWQ*$@Uhdt*tmf;%btkC`XH9>Fll@yf($bI~=j>rA_F zjfHFS*P<>d-{hv2k(<{f9QQliw{wZksonTPU$!<_z_frx1 zL&~|eHtxgoz*j`P-M>X+(a+`W8Zi|9u2S2B@z{&zI6&7IGoh6BO0!cI#w`xYJEbgW zKJ!~L`3lp{M+CGw@KNUC2RK~+jwrJF$f!@bu)Azhy6v>%5UKN~i`GwOq-#taiY@bK z5gm%gBAy z84Y8N%VhT()q|!wO3nWg{%M*d_KAnE|54X);beMg4+m%p7Q#6^bWGU_^pJ+N2cXFP zXF5}6vlr967pp{Ipw)e2Ci;y^jT+I}@oZHxGL0)+HH$2Yv18U_&<^Tv#(pBErOIgN zDXHemK7}6q1rJeEF+uV+dT7fnVTONWKx&3h5yG%dJc4Ugvsr++Qb67{L?LS)=nRqTtm_Adj4#TraTj^)L4XD}?Q);$DkT7cqZzOZ zr)1-qYK>b|yN&q!MEh_P@%Z0eNf$*D51-DR9M@eA{puSrPL@e5^qznyi#^|s5y?ok zd^o&C>ROl9r*Ow`Ncj8_IZNpEm%sD67*H8B4Fu=a$+bnkiFj%5jY3(yRN;oPiyr^) zJDem^?gJ)@p?SjJf2a{zKq-BcN)b32)?NZpf_3|E@h?9@?)}A~8ak)q)qeQYo;F*D zxikt!(;llP&NY|}g}0xb*`}`_)?VsP??IrWm7{=1rZ5-~aW@p%VsS*b%B;Y8^rIx0 zxb%kKoq^g=#8wsWuZl%P9SeNCe*(b!w>b>~i0&&Wq;ZS_gtAu`m}#RVKzk7|tk@q> zdmn=moSYa*7cIMWW`!e2n(O+^#WbXq9?kfY0K1{rBl`YP0Fs>TO!B1;KT%f1KE%TD z_+>ZMAp{BF(4#OP+(h64$whac{T=FR`a0MADOrd%g~L-X`%;Zt<)d^c_ryy}tHn0L z!x1IX20p7dK5eNh5wutf=@HcVcz@JmX6_wKL3dc`r0NAu7QOmu^6VH%M9FaU!K<#} zkGcAQ9U2-Kotq?6Q*cTD932KeaFkRu9n)|h+DmNrcskZuFLpT7U@ zE8C_M_sl27?B(iul^uanDlu@AocGe2&zD(1P)7isS5SlZ z3#0!p@}SW*VwgSJl@C!=wMGDyW+H@k5H+J*ul-6GIfyy9f?MA*C4tm{sst}Dd1dMD zweWg7ZX9c+8GeGN;n(^~pc&coOa0;%2*8N7ya5lBC9#ikUCYJ#+G_G;@EM!-CP^&s2vh^^`&{PB(>ow8h8~B_)~)Q_B?7fbYQRsK8vZp1b*(` zB%zRq$fM$JtI~Me4~Spk2n?InYHbl=!hFGr{GG6D^%tMm7*r)CK)gV?i5JM~d_hgcTXI{diDq&jDF4 zTwTIw#-!ZP!vsHD(8@Yo*g=x?qq>8#kTgsrcOjRxcQkP`d7Fihlws54dSL0bJpzel zN_X5Cxbz2d0U{mC8?$rAxyzM8Z@;4-1J!m$_)%n}?I9+VB9GlyQF0IOia{$An%t3v zisSOkAux}RP>CE(5ncc3yMD>YT*R%B!ML(bNl0>icFMa01OJk#KaIJh>d=rXQDSb# z@qV5x%9lXslAgF1P%!|%IW)*7yF%SYw~=}pHorl|l6Aw|DB@B3^V(-1&5^u^Bbd*W z^6DPd%qKpFajUvUIZMn>Nr;QDxJoLvhE#xI%Zuxmi{h##ksG=r5fX^dPn|cW4Mk7a_|X zQRIHPXk=i-&RMeSzg1Fe$6!Q6^g3pIFxQXT=ShO}){}QiSwRdv+bT}?)Z?#ssC8+S zN;f8A6v)g+?>GK@rB($|>N2^~q6`;gV4|2O(3JsDL;Qv7V^)Z{mrK)JNSSJ9D)_4^ ztQIYUJyWe+jc7P4d_#C14j=C{UMO@^0H}K{Lz&xw1?r1kp&lMae~BxiM#n6f;XmI` zBw>~5wo|(Ey?K&<{i7}0v?V%(NCE}0kgwFUt{0SivjXEwll69I#fU4K=*#ba*u42nirG_E zx!nNK*!8{Wf97EjcK>meZhhlXn~NuvRh<>RIHPdxa+v-a>dh2AGe^aFDP2Mow`{X@ z5;{SU@QZbe;)6k&@kHp*uQi?b8M}YY|3vYE$eP8$>8H`t8$`Khp97uRpn*5{`^cJwB=1# zSM{FYe0U2`yxZVy{p;Zx`aIk87d^r#A)~6Co-pd8VaAWc0~jy9CUHMmlS5VKGY-^z|0mWZZ{f$_J&Ytj)n7NFY(>KR;^S!V$hP8A(@Cid8lmOn#pe^J>p?oW zt-xo(^2V-73XN6emM zWb)@T?;{Hy`JvhOjs)Qt-@XWq^d>gVwWw?Q#dLZVct2AMg{cz>O62-DS@_8S?1MZr zD7vlVhO+IPGH+dqrJ-l5aqeXGqwx{PuscT=T?Lk9CLx~`|4_GIT-pd>c%6wW=I~-{ zBmuV+gadxD!ED6n|F4gkWZ-LiwL^aGrU6f}Sxj8shmTo0iNaB4z@zJM_8)y_DX_$~ z3Iuw&Qh-QlvjBIQ#ylaQ_XdUC{P!k}?~~naA5MB{?{f>qA2F-+iP+~d$y1mNkrpbR z+E#K-sV=ex?^~lpUJS%r4hu;D%vE2x2A$dyoV05n(fUL)poWbY91}Cr^UC>s|0~9C z-b*lN0hJg^gFR=L(8Qsy56^TMD`$yj-2klOX0DkbA2Qiu7X_nS~rm#SM_>{Tut^7 z$OVUD-jmeLz}MDc#h*coENSVNr_-^;MH>f(S$_#debLA*<_!m!ggC2(D@XZRm{;PL zQZ_#@yUaz9;eI9#-i0fUALlb2N%%`EWXtB-eNtkhrUzH8>^{d-t;TrhnNXU8VbBbUSW@nV}7@h}8VaqVBeLL->PB=sS+c|U~d$L2`)7m|aa9``hS0|#Y0A87x z9lIyXTq&AvooUz~RWO``%L$#jy^xclVYo>%kKZ~%K?z2s_TP62b}X7584*EnBihye z7EX#sS5OCMvFSLy05*uMpk$>5u?8lkYL!D~$y6gXnxpECf^p<5MjSHq4?K5PE5l(l z4vvoOs}+|az=%&rDKRSKy#Ru*e&RyZD#``l&u#|z(2qlgMh9}Hup!)=+Z#9hy@;eK z?pL4gv4F@$UpV~NI~mO?(+4}7raPb;Px#|B;iK}L6c8bkAPG_7_0vM@{M93F(%T@Z zwfxGUyEZfLZ0TfLllN;p^|%HGu5GL0uPu*J+;>~UQ&w@>9gpL`t4~k94Y(O~(vQ6{ zz-%kC?0sXB@ogAbzT0Ssk!a`|w$yyH7yCt^hg=@1j;4Xc8?ui}7_OwW@UHJ~7bsMX zNg$vjK3GqxPoza}e*maMY*vhIf`T}++v6&*y4(*;=Nc!nBCJ2B=YQ~uH>hZ%|J2f} zz}z+4eevq?apvp1jR`h1O!^GO~!j;!9zLPzTpOUfl&tgQZD6n#seGyFiajD>?zhbc1V zf|_dS$`MBUF=QJCPL9BlM%#1EoWb}3K?h3DF0UF@PQLmd^)st#uWr#Ze|&{GBEHXG z71=ZiI$K5lt!#*DZrh41m^J&az9Swglv)fcS=H?qB$jd6Elj1|4tc+OG)}oFim{tT zo4dL<=o=ZX)0OqMYwY2)6F`pbztDn7-$$Pk+{)6Oik&q{zUX9OIzFa%a21psLjh-SMi3KaZI0FW=4u)Q(ToW<8V$}Y*$Wh@ePd4lUJo2ULC^5RTut%p95@1|o3HL!xb*YERdi-*+8q%! za{>oIfR(&cHM&0j?)r6ty%Ta@?{8q~uP3&$fm8TJQQ3Cwv)jPeI-pLRYd$$LgAsFc z7CXO@m|SNs&TM^{jH*jOiDm)eLlq3a+G;=TcUI+!dYCOBex?cV+y~wmH3jo^*W3D$ z)g$&^w@251?Lmc77iBU~6c=@H0l>Tq~MqsrxA_DNNRRW>FcHe)lL%mlaIg>L#wz_QzR@$6g7 z3IrBgRW@lMH9z{n%_!}iSX~HUQ70QMu~m+V%SEVxvoU-D|O?5`V%0+SF z)i2^Oq~A?qBUqAmw`a--g@XdQ~&^UTP_M_eNnCCp4*pz4k54vl#sb>xJ~V zC@-EXKBqKv3yF(A`yfjEYIfienLVQG&2XKU$zZ7f000Wa#fZj3<5uk(9D}M-Y{F!A zvS44%(h(^&dZX>_hlyHI|1pjR*|R+qIXSr?7}6QfkXC))MiMt^&h=v)=jXLJQzhAs z>SDaUKY#vwf7rcj7k8=S|K6rg(}Fo9huTxvtCBE_k6&q4=O8Nx@!KBQ6OxL}fI;a} zW#|*9cK~BTT8-j=cabBrxeE_b?q~z$CcG&=R4M#}5)~2c6m?Q^-cRIVb#t%5JeDkw z4EXZO;?E{a5HqNF_*JukkYYc)zyJ?Rc)%`l$=*{pb>{&x{V{*^duQM-`{~n{;41QF zX;ym6U9!)URt=mhi>>Y@g{e>|y-urm*>E$`9aWtV{f!p^i4F1H|9HB}u%_OyKRT37 zrALiU>1Ieb13@~5AdQryNQ}|lAtj8E?q+nih=fR|fV9B7|MkAtyHESJbM`#vIrn}4 zN{T%MxtO_Wy3rTDn%ngL#6Av7fc@TI+G!TIVp;Hh=bp+wB5F8r*#v-Oqj%;B#Qs6QE6A$ z2N>qyGL4UX%Im@UREc$1>7?PDXV$K7!4O=|)wQ+c_eNswi(fb?ETzk&4_3K~^!-c_ zA%Clyb6!QOpwYK!R|>JA9B5b(+6Y+u--$yef85xcp7SUQ0J~}}Ncl(UN%c&buXv3o zlunpP>W|z(n-)bOJ(n@`K6B5QRcao=A;|X^btOQOFB7q`7rp+V0QyhfHqX&1E+Q&+ zw&vetLZvWr?(xF<)V$3va_|@Vx!%iyMbE zKUhROScw`}ZN90oMkF1%4aC44pJPHVN_r)o8A>=QUsM4Ls@ zuNOu)|NQy$KI#@-pApc}!pAF_^Y`xh>W3bSWOCxqswxLZ-qG`s{?Gl_Q_%WGjokkV zKgkyEpce&-iCdk$tGN1aXt*uR{K{|9C!*&m3;jdDsbhs2nk#GV_4S?7Qjus=VXL{0 z#c)rXFU8VVyS*59YT znXlSz)e6=IBN#c(Yz1#?OC1&$)nn>A&?aBz`5x7Nrr!Lmxl-ouK#o99me^!^))N+c zEM^hvD6~QWMpqyuAryckQj~OqKI)Pu>obU2%Ej|GzQrd1SIV7m{-OhM%k06YZas+J z&$_IFFqL#=@DAt1H=KItGxlbOeSEh3Kq={Xb<%FZ!+Fvf-}=X<0(&H^J>MVtliwA? zTI$87-tl9M&aqYgTp{3vC~?DC5HuS92F5%5@7nCKP%d1MMo%l8V@a9Iyx-<`xj&vi zQhH>9)bE{NeSym=gpGZ&dHVYCQ}-Coece{hTpnm;*_+}m2$&=XHc3rp0Ku(M-b8t1 zw!(S;Lf}W26RhJmrCm3WL>p0Py2(k3H)3`j&u4j2v(c6 zGBA&TyD_>Y3I8XA3uZVx9M^8lMsdE5-x=8@3#Ld{h#kd~0b9q1cMb7;FCG zDxMNPs<--SjM8`8d!-2`Ku=45BFmpWv1p=PdDQ1Cz>hM~Nz8EdHmio5o9$Cn!8^X2 zDw4eYC*l9WK)T@zKp0t=;LYly!?% z3bOEq{1i%fF_4OrgH?7=y%PsCUhuy$k~+t{ya8S2D&1lJ4lkvtnS4h`^fmcx@cL`Y zRp7W#BEiwVS@=Quo;o8|3%7cMv!?|&eBH~C{U?ReZ3tqXo?c(@v+l&7YhU~XaW~#3 zPvz7kS9UEpouyZMBW&+0D)3%A2Fvs5n$Lf10ZY-4;_**??zE(~lPV14WfqM>?|-A9 z?blNli{z+EkUnFAkO5doW40pkgk`MsnMcKba9LnC^5PD7{ZCFl#Q&EoYW>ibz=Ryo$cHJ~P-te`J1bih25=Z&0H3nKaO1$m+`J;=_JO$?RT^I~_{1^51in8{f)b`sb!Z$9 zf{I>{L#(-+6z~20`K|=$N8SlYUK@r;QfzD7TLvQA&`Wx4Eds1m0C^`T5y zraj}cTKQB+s=nLSbePrEvxmdHf`l^?D1iV-Nc8^R-xbqs)i8Hh%!A;m%tj*jA5dsA z3ao_*j*YMl%GqfklRvRot`=UwNZ`ac$nku)vQuR6`+Rfir2sl0l&D!iAI?(x8ngIQ znl#}%gE*R`WerC5-P+&v<5Gs4V%E3-ON=Tgxo!Oe|tm;1ngbHT~F8?C|uy z(^V(wHd^e=jSaA8C%Mu*vlTU))j*?1u#;iUkoQmt%_TmYCEk-E=4LE$NEbC%r(@X5_QoAOf(xHB2PfnOP{~;vn&UyTE$b^crdU8t_JIzm`Onqf1Vxv?99D(k`g1c5W+KFQg$#%jYlhh7$201 z-{fptU)L(fGPH!Qy+-D~YtTyKC>ZHacyQ5DUXc0%olFOi?$QSA<*^`^icQZfpZd~k zifBxASxBAkGMoih0k=#1&555`_k*}dlEHW^FCAp^J3Fe`iA)3Fha}2~8H;CP{!b6r zR7$sTWt(%O-a9dbQR4nrp$2iz(;^fAG1d4I&?s(Cs@<(fbpqU-bYl zYE6yWq%EM{eVv)@4;u<}Moi}rE8{#8Wi)}o{b^|NGRv`9-h;ZZ90bSvEhIJb`d!C2 zW>Q|$mKxDa4f7YD*Y)SLib)F}wn$bQwyo$XY_oi{f2ls~i<(5=PQ(wgsyfNaiS<#GeD!*Abv|G$mb1V>TyoY!!>DV5;r& z_nCrUtHO!}Mr@JIbmF{Ms3C~Oitt26m~_&nGG^7`NO0sZ2GIH^3NIw3r{!r%Qv*1a zs3yB^UsbEc8D|=2HQj1Zh}Q<*!$^8OTDddJS%6rzx`o2xi9jipb6ARXu8FCm6PTDp z*E-IADv##tay&hZ*2wU)gz^p1GE5OCTUS+gyP;R$)Fy^Jp4zf2qdNw6a=nIusp<`U z#h~DdLymBq{asvNP=}~ptCW4;XtMUPL9DMLoY*>sWTjVnq{;i9n39zZRM3Q7hd`N~ zo-rBpc*ad%e|*Q7L`60e8~3b)mUzl%CSmh|GGc|0fblk?YI4%RR{%3>qExni*=Z2u z-uG&WKMwuC;Xxhwfp<`4uQB9-UrJQph8=1@tG|*M;pEpbsAOE|EUInB?PI8d6Hkry zw)LG75=%f4k|O80N%LlJ$V6AqJ%XcYzUT{fnqMlKv{~k9wK~a6d+T?H%9) z-S^KaqA8>G+gZEF0CQWG0p<{mpp(}7lcjXXWdwDHk*>J#s9r^S_eAGGc7{SKypTNV zj4i}`TtgWVAya!&p@NUT)u;VBM1Si$tlNtYXpQZh-sC>1B)96}&fmRwGxaEc?Vw~_ z`CXtK#6H_Q2;#;?FJ@2k1kjTv$XL6Spef*TbJjX!G3YNGb{&8RUoC**@K4(B^L!+C z?n6(>3um&-9MdAeDuju)LgKfsp=Ely2E>U71Y$R~VkMRusM28u;es~3Q+8B%VANn* ziAdvYB*>v9DIg7Brb`$Jd`-*bMzfQ!mm$v6lCTu79p|EM#{Fwj?+`PDc-!mK4Q*mf zu`iNXB6qS&n?;70H3Vi|3TK?N=v6!Vica1dhz3rmLwtC$d(kx@)7cN+{fYN9jrgN8~XuI*Z^fSg&CV#-_3elkGHxhIjzBJoWj-tDq8mI ztqeN$WV6w1jF@mHOarfni0Wsq*!(+LEHTA5R==a3GitHTJ(VJM>&(fbuA#)(74bz& zIMB38e2VNgJ87=2wCY?x-y7$4rF8c7uu;XKh3!Ymx9j(RSrdE;*AX zH3$>XAZ0)r^CiJLi6Ze6HKfXkttUpY%{A%7vxzIL3)2F@n1H`bJcBVV#k(%ON!-@t z$13Tgz2vpGEzVZcc(pKB_Rq3dmjW~Il8J`;) ztI62MEmC2$0C1Ex2)>!6+C&L5?3ZN{rk*(iCXonAGtqwmAr8IZ#VO%V?P@fTlpp%Bg8;9V8wv|6a8yBod_j{ zA&ANjYu$@MID55)npSpGA`-rakW)oEd{|%~ruL~5Nsan*6&r}=Q=zyfT3cC_ixCLJhpG(JCp}xf{l!Bg(#KHga=u4L(rEtxYU~}y#Ia^<2P;m&R zUj(ihStH!X$A=x2gC$17gNqdD({0L8Ncd6J`1nl@UZ8(YBH|XYaH>)NgPc`R?%m?y zdW^t{*}u#sAyi@VM-C-A_zL{yGW1stHuKR$)|`$w`PiV$PuM@NZ7*RwWVB8J<}Q$% zE^47ZC&A3i7kd3QvqfYsU!(n1v+bXcyeT>0yL9L@pbTCJ`k9M3Y2zCY+G1>DOn!90 zKViww!(I*)?35PG$MLTonMn2q3#-|@mcpIeKDf`kMN7=kBN2{mjsd^?Hcr%u{|StQ z*u@h6=7~EKP|~H1lDM-o{zoC;dX(znQE3|>Gm&JMztRuH1lN#yHNm&&z#g$+`2HMZ zn+=+d?$AldvOX6SkTX4n`}f;ir)a3gf#fN?&ev9PoKhIAWT@k>hsUo1b8o_}F#!dKKjs(> z_IR?De4E&Gl6wzV=u2$$b(RIk#tH)n>f=~_;-~|jYa1;5aIxh5k{&TT(r8!c!4)h<)}gI8rFg98 zJjV2Hb1aa0xUDI6-BfpPXJf-PdT;Vqb8L&2e4$5Z?(ZC~L>BR3wr+ME2j*q(3v@tX zv4{H68f{-d3^{|qO|?H8Nhwl;cp?e+Vk=?|%s3@r+|$C~MmE1 zL1J|zLqt76acwFt9|hROC+N-BlfDzGySUxVWV#~)jUm*?#+G?|NRN|r=DJ!!>t5UX zo1Rl3P_Ps3TD{GZ6KbbFV>%*=qe0bY%8?hllihjWbI*DY6H-{r7TrD;?RICP6AeG- zAP0ulfj(b9UTs_ZIhwAzAZ-}#zte%(;^>mfwS{(e`kg)uEN|&MhLy6bBLvk|m~v!; zcg#2bWxVr2ZUkPV0S?UZtwde?F(P?$>!#mKV3_dI!)ivZ?2)kO8JERw%>q&Xb*xGE zEE)P_u0`7*2Nv-}8+0@!WBrtyYppyn_rot&z7&7rd^(Esm1u0fH(jH}Yf~rvYIyZl zlUP!jDa_b}?N&t*+y!4=-7-z=DxQh?7puRSdt6}q(gV}Z_p6}0A>>ptSEKaXPvMEc zqE%o1xPT(DHebSK=M{~E5m&@;7YrLfnT8P|JzHAK=TaKDM-(*%u!AT;y}^H5m8)d7 zP^3)a?OLFokdT3=wA#y;uUF<*RNlM#h33LoBUCiVvo+^pu>b7!`aD9tvGlbyo0{vU zq=&hECC_ZttRdK-Jn4Hm$!Y_!%}%RMbD!w#gC~NSbuP+S5;fqJyvZ|wy4)TI+b6I* zs{g!R_3Zfvgm(Rym9d-7d#5GA>SW|4iK!Nfc3hj?(w#NM!SBSC)*Rm3%w0})Q4if=Z5ekh{|_6OyTN4NjNIEhMrU!WRL9`%(#qGS`FlUE`VH(}kE27DO}gftJcRU}{E}alZaqse z2uEEa4@pVPF^Mvk=z73VQivcQ+yQC(o}-DWLs-c1+pMEGidfy}{<-!X3A_G0QR+Z7 zwoRl4vj;nMq*A_SS#A5$;EOZkt-)4|sOElu=Irx~q$@1*o8#(cUF9R`bS!+U+KL&e zxUKC^^<1BoWSY-gQ31Tw?xt?Gw0$M5jDs>pRhkpdpPb}b7E}{766$lU|8!MpKls)> zk*x0i8&Tn&G&qc{ewoOBJr2+N6pNW7DCPUg$_3<=pI1z+<|UfHU09U}RAf-37`uaj zg;~6F9@*$NNkSqZ6wEY(ik8ir@ml>2GqW4`QFUCL0NakvUM)f<=s%YFVXy&pDIiLa zG#}233|k+hPMR5>-emZ~?8C}pj#j8POW*Uq7g%aYPEO3i3&5bt8SMJmdgBvBc#TFO zJ*7;<-}ZGsP-4XRl5qTBpG$nml)U=;`nvy&wfm-Hm4`B*XWSv zNjlTa3y!)VbGnRvYaOE;OHKwLPGzX#)aH&Z)alvwl88~v=pDvmTQNrVsye+tC5IUY z{+SeDaLT&;hNR{*{g+1)kw|WVu2DLd&s=y>ZdjN#Cm59TFT-WXd*rvVkQUu?X@~yt z2cr}_Cy_(#wdGYhR`Ml2++s-$(>IvP;z~qhHgz^lx>glp#SR{^Fh*S`cqhobUn0#$ z(vjGbkU}fb+B0H5$mNA{79oFrKHPqJ&0zG5ce+LI7wkHI0(#NoB=NLB+?NL{4sk<# z=da;-xG-Int6F=sm0)K0HxbgYoEjVPRV)nF&6FW9dru8RP0OH2Yl z;3o~VQmWiX70deN;3&kJ?coO$v-LwhZs);TU2ny6fTpFbml*`rCXmE zjQ#7l|L(hz=qhMR+(*Rsn=Kx{3PA%y*VVB8+79}Chy|Q28eV|lj1|Z$JG>JCC_A%A zZk~q%HkwvkvJt~EnE+}gEo@mX^jD2+^{InJcf*B^JiiT5x+{@Eu~GIoY6YtN!X6}4 zd9F&`X8)K+%Vj-}Rry_`p%Ny_vMcdJ4i@#Tk42=RVjFuM{BodC^!uCFm2yazmk0JNdU%INhuqroywQJb^+K3pTWL3XA|kq zh)XsxcE@_e5Mg9dLMQ4~nj}dmD8dm1ZYPbC`(hg}&Jx_79!>*RZS|fI*N>rUhVwpSWG70lW*z6%3=_i`{#u^vmPDpEP&d!Vff zq{9MuYq8$EHMktc$^~C4Aw2YT(-8PON7XFe8_gIVTN9H)}tR_ER zSSh#?Uu~f#!iFyTxwGqq;YGPl1ScHfYi4X%Bn(9=hNCREPkkm=e|I+X+p@*0?Bnk# z+b!-SG_eI4LsF}kaPn*4aOXeUfb*qlfZqds4>=#UOQ||lHR2Xf?vUw@WCDxvENZ3* z`la zgnIX>he7KfQEKky+sVirXXR3^onj6duqn2_VR`M>)zXX2x-u1r_W@kCg?p@`D`^_W z^^Bp<6C&`clf$mpO|~|#Qu6Yy^{BsTJ`)`N%qWk^()9QUx6fy_YTUHgVe)7yYF7Bq z;;()0OWu%-H%dqn$yG_8$K31*=zq^b!hfptM+nM~j4X5=27XrXl1YRjEp{T}%Wq-w z&-xUc6FtVMX!~XtxeH_^^DtoM$6~GP?Q}ilqw6QZ3TJ+-4BwS;xTh{ zf!};vx=-FeqAD7^m|g1Fm)sXI&B?PT(1DZoH|g$-jmCxLDz2FM)>5@PsuD0)69y~= z7AV-GJPj2nOKQFA?0O??(UWOHI2m=qVLHZXu9l?&NxsOM_V%}Bdxao;to@pn25TM3 z#Yz=5Se+4ms7eezWL0<`nRiay1f3(URtJ8+=(8h3G!d~c<<801}F$?1^2 zW3zj)k4h!19cJ%R(1B2pd>WAggs`ZS=@&4bZEP7F2kzgO3)aI_1hRP!ijbeLuCHa& zGkkJ9by9zx`q!@$8C#}V5z}gaA_eLu{!@xlLBYt&0grFjno);=Vo##O^C2{^#ybb} zT!N+q<;jByF{GV=UMvMVhn|MrPp-C~mg?_r}_&06+*k|_d z==6(HP1vNyzFCBNnz~A=U$#+c)_|VgU-j`VKQg9_zQW3_clCN?HF+;%kb^U-OPT$$ z<##XytfzI;k_E|3k9YFzP&QK&+RZY<0Q*ZB_VMy#R*oQ*9f4rIJw(aaPywv<>6>wt zp{PZ`;~2pZFCf9-Qr7H^D^0RPL$&QXuZ0v#APv?hC0lO;-)Se2;4YX{BM3j8SMso! z;~w=Skj{pPOE>dXfpZQt>j$Y-!ThMSFbneSH`zB#8!EyPzeDd&gLhZdjB=hah2Wwq zfu|fpm}==9KarBq(<>Hk=5P_SYDL%G6x4Cs--eJZVSGR<>@z3^hv<#A?d=ZT!FtnJ z*?*T?jtXEAM6z?fHdXpNIe`-#xi648fG){PP{ff)#)7T@rK_Z)rq%@tTzvd*$(j3B z*6AzA+SiLV?%S&|NVrPEB!xs5wKyEO#xoeTt%*t8Aq(?PB2!Ra*-8Y0>o`9Ej>fp$ z5q&?|bNq6+i=ZMjBWeMY*~moZtl)4ImnnckXx(}i&+94|WJG`Pexbtn&L9dH-bZjX zp7bpB#bzLizqlUgR&%}Uyb_1kN`!{m^bH9g^`6q;N9wbGqgBjv+*dwayz#zA*bgjf zM`_$3vXr`w%%LWsOwq&-Cf|{R(B@%K33! zo|UM2xUX!mV;-7Q>8SVZlDVvmYZNXAMpwes&2`NCJDk8FuyU`(=Xk~f1 z)g46~$I;4@GA1jt^;TOn#BGiG>!F`&z{x?zHd@Rf%?U`cJ2N?bDC3ZMxp$g=`h&=3 z6N_|N&K28fK!GtmX_T}t#U=TqN@X5V8AMgk87*Ujghk@#eluK08w~7vzuYHk++Cft z!(JBz6g5abrH)!eWT~u(FpQ7q@8-07q$U|)Xw1!I_t1)HNy)f^PfV_`a1kgXF=K_J zSNMZt(^4ek%WnD}n;fo$@A8|th|V;GD5efeP(l;kCM7=85KGtlOgZOzKD-+2b5Cr*U2tLJ_uh9RpL&cdQ>DzU$3(mkP8AvQnbdZ=o0gqVo76*` zcWcJ@ve|J=+%S;B_>pL~rb_Io4hF6JWsONynhrON z&K6WrCt0!Fy$f=u*X{?}0D;fT+CtZVHXVcVsn3Sbnwp1hKU_=FQC$xbN8HUjIi54D zq-n-OJ=hE&WU&H2nV22}3pe4zpbQSi1y_b)$rzyCf$RuqhcLyNqntEZmqFKffcjfQ z^$lu-Z^10@$_Gd1(13<9W&3ZP)&}ODz_J<{oFEA{dh1@8WhvVyW5oXzfBiiwa6TS# zz^LPy=MlWV>kuYJblB9^(?#)>Fgv1J2T+$wiRweAS`mkPf!FgTvB>C#V5EQ&?k{7& z@_7*=#rD<8azvNBvA_&1|71fZu1=H&*rv6b8HVzYh=%Pid(ck;guc`aok<+gJoTX{Ib75L}gdXAWy|Ch#e#EKI{2@8yQL_3OD zM2(E=4JD)5%}5wZ%J4SGL6mQA2C3_g7tz8S?4^G<{}@Oiv?x1({FaaYZ~04a=j*D| zkk3(JOoJ0m7QK0;uBy=6Pckx2#L;!NcN?fe%g0rO%3QMA^7@b4!pna5!NBXz3p2Z4 zYb>OlaF`uz#Urb~Hox!O-imC?;r)3W7?Zd{A=i`NJC=`)bI>k7UcBR)K_#qw0=rIi z8fVP!YS;yk6=)>#7e?CZHXyAb%(hI2I{)s`fj??ZUqaeDTfsJ2e4(9n*%GjI5=Map zuAjXh=VHQqktHDwk5{Lp94B~PzrjtUD&+m;0k&~D>>?1QG7u-pf&=a^8nmvX8Ef6l zVz-)7mD=t4>xR|BAA2~tAv`phMfwj^S!SAgmAYMe5QewpO4itc7VJ9RruEB@(-#9xRzytsAyKs)yk!O!ThOwpXKym!xX=}RG9d6hP+0$ zlaC3d_$Q}DrMfKzrBb7493F3P7pIk-IaA{kej&S)E{Xv(a4Ww3-TqvPW$AOpGJK(A zZ|DBF=+4sRe;zSseP2Gm?yxXT9dsL)2h#nWH{#lT>U#dc=kll9*ju0FhG%$%o{@%=PyD$dVWwyO&{f$@Q*f{F=QTCY@|c1U zM|rO;4khv^JO34=8u1d~SQa3CVHZt_>fb%JU-CS?7QbdGXb$5bS?*IW?wD9} z8T(5D;4G5eS;zeZ9Gpgf>4_ckYLiK?Fm}11OK~M}u@C}w-sVDfK6HM2_f}R76ekdh z425Ojr9fYPT!9KXc6Msu)A}R!gCS(U#dc5BUcr_7eZe)Ryy|l7HX=4dQG8@1 zMwghVLtFRK_B^T#G1m029`@H|mUj2*z$x*K4qI$bS~tzMFby8aNvXX;0bY(uvS#*{ z#7wK)AGX?1q;?C`F*LmL2W(w7s|Nhp${_jyy}&0C_qhQx)8kjawh=qodwUsBdm{kY zwRv8X>cBmET>#Dh_XV;#8kxX`r6dcgJjDA^dJC(Co}CShB(uL~lSb}6 zbva(ibYytqgahlx%29lD$?Lc}ZspAnVf@)VE*LW@bh|4Vr>={HyCpft1pW319f~r} zRJ+S;uubeHNjkZp1$P%ln7<-!aTaqG-e>#31a=`?EEfFHx|s3Fs9~eL3_d>PhBs(( z5V%ydkBl&jAl zELXm?z!1hkOhCM~3zU!6vO&aguOEncjqkO!mtO&3T4ciY^PbDP*Qf>@Z0ixXT2Ss< zuKh7paQ3(aQdZEG2PWajyd}fmO?xgCV%@ks* zA>riM?vtz8YIU(J za4)YlKkcq_8+dQ?JWmcCcx+@g{!%ttjj-XgN&AZe*uXILt~!vA#C$JD(*4Zd6d$G{ zp2CXYy!^G^P~Oe&rJkD2M{`O2ql1=w%;9WE}lj0&1E$2D|*&DVwYH6iM_;A%--$pDepGk(^=DOtjH` zOjwg;8Kldm2%fIv-rBG{4QCoeExte)uD8-WNn#m1K{LI?yD*~am$oj}3UsI(OoGNF zxMvwdNy{TVu~U@kO9+HziH;NUs#>Ic)P(H3-1inzk1@~joM^4LpF*d`kz(fMSUmI+ z&7QKrU+@n-bpk`%&ly(@L&wM<4h>qA9bZ79g`oLXbbo(;i#8J;*Y0_#-}B}AadheY z#-A>84Msn_of)S*poUXaH83sr%q1P+B8*JUn=<(F=t7_V6oS}nnF%3dWk$u;22q3d zEGv0OpPbd4mc`INO*d9$&nK_P_jVKZP&}CrVWl_J#`*F?=LWRJhOUS9zNC>aV65<4 zWTB~A{c0GPOuz&$dYVEsXKqg%P=|(ah~vE~a~y^Otl4B64_Mci>Q^oJOg*Y9_IXvH z$8!gFc1Q%e{iF;r>HzrQcK6qTGL>DZUC?f*=YyX3>bgW*>G3Ung=R%4`AcgzJ4mPh zoUl!bFVe2JxA&22xz*@?LlPAbmf2trTAlEuE)PU3=L<97R~>LD{E4R;SR$birF#rh zjx5aJEhy6~p({37g<{RcR3P36uN>K1+{@CvR%uFtO_I$}@HkULx=9hu?S(8VJI5;r z^!*t%Sn}9szk}k>(EW*?p)lPxQ=Z_2NE5gBt4My1**X0C zRajTaiimC1y91P{4g^<#4G&Ov=iu7(tqLf@9)(rj>u}B_L%&b(UQHAcZG5j-GbH`Q z*py}V(@Df85YACUcjDKrZepkw~kDzc? zT&()BPkKVhf$VCZHrGHV`M`wKbep$KDX^5NDKk~Q4pUy23+H>?YS7o5{_aR&GK_?g z-*+?0t|w6i#L*>a$gmCRg@vt?hldB*^R;;OZdrWPa7*y_&sI+>!OVY*1}EC7nB<0B zg9`l)85vb-SudNrtapa>rsu{H2sen~Y~uubrJ*EyGvNoMd&u=82WA$_XM3gU`ou_1 zgC7r2Q+StNmBXWv5km==H zurLbDODC|O)CjJqMywMu33G}_cYEpT0NyS-1aY28Vif=d2HUb=WxO^i-`G9AM(hR) zCxArd8w+e%_-0l9qJN$bJaXSKx;V;4SJ1G}xP>QLlLUM&`)N)dPU3Y?LUJqEyyQT0 zE^GVVswgBUKrVzcoY+<({~^8h`AX3cs@CNr2eef`5TLJ9gc5b~d?|KTJN{Q_*bz%j zLpIu(4PJnF@f5xxory;Eu#^nU$cMN(O^tq;bg0*|LM@(95XNT8s%>E?KS^} zwAm7;`#Ho9d#+H-@wg$sxzINH4TXk=DWuV95huUyjd>E5G%kw3HWg-_^^x%FM`Vte zHCvw;m@wHuG}T?7!m6x~VtdtW$t)2fYgDmdvr_%ARfkC9S!@Jl#R~# z)+F&v2FxpLTIBGngptO_-N3{p5#@|KacmQh_LY}5EY>HJxzhem8MdOEf}gWWZ~NO2 zL88d-2w2EnW&2Ow`%08p=78MC<~Aa+glR2D1uYw%LHZtdhSmg7_(SbGW>4S z@ZT!`AXP6yvdO6n@kPNRp6yOayOrD}adsI(TzKH45=}FnWMni11<|I#L3x#dCORcV zAF?k`f24h#TaIti6iTyd$3y|x6bdUJWSK~(z<2=SFT^0Z2jY%=k|{bHeiB!DN1Q;IV*=Qcl)Z>AyS?Fq9}7Jn@b(p3tyj zfxIB9-a+4XJ?-QdQ)C=6&T~&Css{;U(lI9Y5!GxDPQ0KM*wj-*8D#$RXuWfhJH7l; zza3GfndCU@j)qU{`}Wl5jW`ygjS{6 zB^m4@%j`nwba{j$NmYtqbzFoZ*%K7TFFYDeR_7Zgp3zdN1JyWNgp*ptnsSw2aM+fv z%sQ2OM8sle7`IikLLE^N=&B^r{(FkbQo#Rq!}1g)fNEAIA!i-m7@uj36@St9k=S25?H`$(L5y=AZ&vH1IRUk{g>ibQtg-^ z-m5m3hmotl>XOMw+@TY6vT9h~8-s2&mNoM<3bYNGHM?OEDQQu2S3Zs8Sq5h|`6y!p zv{T8fN$3+w-MwT{4!d?ood(|+4JF&xnFW5XOo5GE3?e3yiIiI$T(k69xxmwh;Bsy* zhwOcK}K+B^BbG2DnXeN$;m6FBhdeM_8{1v#CNGi0{;tLEPhVVvpeyA4c@@_-F zx1k@LL~E@Dk3_frYh7~#IIGF%F2gmTm>c<<>SgvHS&O2#^LmYj>f-iV%-iRFnqxX$ zR55FudJD$>I_t(P?l&>X!AHd5#2pz`^s*3xGsn!Ev}fql_+_lj_L5({bsa({B=oOP zUk1}5kXG)ocKHv>m&l5RgHn{a>_V$YCVK>j@tJ|@Ch@cB1}Cq&eZQ?lZ~K$VgFqZ; z^LpcPFl0gKLHxB8=YQ+JY5DEJVv@q=z8Zp_i7`Ir3$PBPfHRaiJ` z2Z=&VqCGl6=^F=@WMFjdC?;F>1TxSrq2%X%p-g1~r%39%OK=pwzPii{cTCjemBGBl zx-0hHM7FtFJIiA~1`HT!PVO^YQ-H~5wn_*8`j?C10;qa3SCjAM`JVrS4m% z9T*AVB|31jVQ710jsO%8M}gpacv}W%jqz+I0h`8CSv8|!bQs_qCp!%fK}IYhnBJxt zTR+N%XaRk=5Z#FUoBht1`Ke^sO{4A>o}qhRTQjuXIcF7}#?LZQdF;xyeX3eE-5$E$ zD3v`GH0=MBC7>3t&o42-1#9Z8$(-1cB~=jPBAweJbe_}V!Lj706&7iTr6#MhriyeWlI;{);WgXY4#p5>FeQ zyKr3S5zPe`WSuK!ioJARV4*gG@Rt+B>1S{)*go(5oGaP9TuD^--|>Ji-+3COl6rF1 z#SE~n#zW}HryV$E9sl&0A;)3`0<$!}26f8Zd|wW@lLxR-1rICs{{6X3^QHmn;eh_i zeZ-(^HbJJzJ_kx)8$D&L%Zpzp)d+YztQj-5;Wo+2XH zHXnBV!+s(FXnj-7y8E;3eRe*1qON)X9;$%mdVac+Z!qxSyhIXnTdWm2A2s(!!kKY2 zH5>4zf!`}A9HD2t_|m#1P$D;wI>axynq-N#%|**$P%2dpsA|#)PV(1ZkBppaO0oEA zt1g}hA1(f-Be01mw7kZ{&#C#O$=2(DJscq?ULyDm;bDv0^pS}v0u}1FonJ8`TMj%Ahp3|d@<=6;ngraH* z3losp$FDXFQk^jp!ScUyJSS@rK?E6m`yN@$)!dW0{?TF7Ec%7C;9)KH?74ZZyQU;I z>Z2KNkZZEqYg4;Q6n=L7#YD zq{HU;vogfJoz;=m&h0xxLvXTmdK4^xpE0$&PBe`H+~iiU{l)ll-c&s@Y2?o@ZXxE0nK(l5fbf8PwI^M@9w9} zpYn`D=f>54CyBu@C+rNt~ zQY0Cfs$j9fjnd>1Z7*kPE-h1R)Dg*vDwj@!$!6LEmpCjJ-r*rj{X=&gF&M{sROtpa zLNsdv^K*6cvOPo6|8(=lQSdz!_|Bebg1woF9g3_|(0CA!cBgEj3#R2Pah zEo5NZ>=sT+6D`)T^mxT2a*<*DlF-_kfQdiE_vC2XYm@nP2g7hc*9~FW+F@riwxju| zVXC@2T{P{r2tHWkup}xiO{pA3oOpqnjJp%Dn*^Xbv53uD4bzv}m>AI0JACB+7o)fm zt#BS)!$cMEyDX^Z@~EMf{YAX<%8qL)q><4($3WNNOWaz^?iBqGOq<&g&hIvPxM5A2 z&!8@n>yI$U|G)i$!+#%T@}Dw@9&=R2Us|z-vSGP*@nxQ{NHox0L6smL1qOx`B8Qhl zl{?YdL-!w#Lve}UZi65kC#%t&)WC3MYy)G8;_*sd>sHMJYIll)8a=0c<*?)w;eG%9&j9U>#c#!}>;Z)}|Obz82%!JZf}=n?e@jT#~2UzypO)uwP`RR|2mHF_Ro z+C?E7)oYk-0vX^93gzRJ2dAj%BF7_ zJxDkeIPN)LDA#8+;TJytp<=St>rKiCMvU`1rdVq3Oy&$*_V4uNUpedU=P4ngalB4u*TBzls%MvNy$Wv74;wLWPX?- z+J9led2}STBZSfz4EIs!SBSf=nxT;iWryLb?&fr111gO2g2Wm9g3$`VsE|#3q2p%f z3kxM>p0n*fMaLLsUgsk{Ttq^@B-MT)+z*b(N)z{a-d|@r?`2k2+1?FkLD{9Ub z$#h4EAEG+0hPSJiWc-*69&+%rR@1{PtwZ3#=}2y|fo->c*gNcnvnT9H-GJLhZffSt zMg5c|A}eKY&24xW^0IkYAti;}!8ARrr`q+)nvfN<8$s)zN29Yr@yLzjyO}~`2aTN1 zgCS-Xr+dfW(dcx1*UwPHw#4f9>-?i-yeMH-07b27RTtItedx7AO0J~3wZzq^M3@TeFYwV?I?>| z+TQrZK*P)X8%WruCu}dG&}}CQP3t7`!gBU@UwR4X79-Sa-HIH^j; z#qY3i(x*|xLvSXbTHm`?2n~@aNQptIAdfW{f6jK9L%k$6tfMXN5c=DPg z7?e9Sr05xiXrz($>V*tAQby_n2H%}Q6y}73lb3m--c)LH-Kk_vNV3aj8hK(TnZh+3 zzvLVwK8iwL(*1%lV=(kRaa0_j0*{;_6#S)GUKeaHYMQiaR0Pfo71N^FO;WrcYli9{pnzS0Obv^f@S8zYY3YZmq$*&Y zozmSI6WyYNzR>LI==rHnT^COI&)bMBo$!W#ut0Ql4JYqURHL`gQ3f){wanF6ErlJ* z2LHShDK9uuFt^|KukSkOIO2qo^FW6fp&!hyrFMTF6~w#``9519)1-n9i80j z?1;&LpOjfHTa2r0K2GUA(Qn+!^X9wtAq%Ye2Xq3PiJSk;eq`PTFnppXj%s!0A`xpB zWG>o|a#nvKsK)6w9tSU+|NOa=&xG4&J-aCb&?9~;1@)OVPBY`}bMXkPoSrZj>?{q+ zZ29+2Dl@aaRJ>&?l^xtKI!K&no&u4#Ro53>zGO9yyu5te{UYTy?Oen4WNo+;w>&^? zgGt<0?bjOdr$>oFa+CD8^s7D+BjRl613s{A=-$vO_sti_HGYA@Uhp09GWEL?Rb8Ms z%@+ws0KuQ(r3{o@LB8TdEr zHYX)d8}df~HD}&p4~5I6Xv+V*Hd5u4B61gBp9;bd7@(FPUwsUJ=K4OXN%F5eN*QW* zbZT+4TKK^gZ|$wyTn9N*vK39uO3@{L9mc(LHNx?XNh%FDf9RCiq{BfZAKelQSVlmJ zw*s~~kkr=}`_y|y&W9ZZ65l=PoKK~J)(Z3d`beaOSS8iR$XkM! z#SPbQzeXLjWQ?VT_Z8~~M~+m%c>JIVvXVK+wfE^esuvL~sZoaTsvyWx<8|!EO%i1S z=N0Fji-Btx^4{jTlk?5ATGk-AzK1E%4x*cVqem=|Zl{EE_`rwabN!t6Z~GsPuKJFyXI-Q6)tYBUJatw>Hn6p$Q9_xHTt5Bmr1-Oqil zbIuig!s>Y<&_POC!?t2o_w2;+2CFsO0Q2gT$iw*Ig|OG?>A?7Aqs}MO zN9%%}a+@JuxUU)e&N~*gpC&usu)nmU;8Qxvhw~$iZ+Pc~-bUAByzO_#UYEW6pcU}t zX6m$0aI=_=Q;45eDRr&4*d(LCH#x>dJgX9+gSg(5J5Ah^if_ASCAeS)Hz!jmC|6-4 zBb!-P(uE^$-v~SVQoi-ct&7Mf&&ihyf7vOsR?rHG4gb^RV-^NaLns?4r6Gkm?IcKikO$k00sT@ zpm`+BB9M=*KKQ2!u5m>{q#DnO7Lu*DQppNB2+SOsGDNE{%I98w#O_n|67{Sd$h5!8 zbRI5d6|onTa)ok302R ze7t*Mw~M#|n^vjlV}Q$1Cw;hsmva@vbN?f{!9P)M^{8*%W>lp30!<7}Xoo^Mw@S242E!H~qLJ*Bi z8>2vs7qGegDfvD~OG`&|icD%Of09o^*g);-`+l_6@2_iaM@GLgTTZAke|W-fT<3tU zwCr_q8AIrt{dU=ayT(yo?afoL3}T}BV3%#x5=+}J&+C+z8IF&z#{vms4rau~`WT6} z?bUV87cWP{xfUF?(pBgkR2R8EdSr@=rc0aW@|T;YQ5dd71wtk;(YpJu7FEJtk%p zD=KhPdiGuC4N%g;*9)Mjx4(d}%#^UIz3c>QPd*YlCi}e3lz>EiMKuGy8~(9X-ZP%d z^ekdpX_#&r}s^Hq2*BB^=wSMlONDequZsaDu z0w6aZulCyiAT|{SIurPM2;SktR|H~h*#pL(@?qsBkz)ls&fJKJ;b^byrk-vw42A9i zo0shgy=p@m{}_-0={GVbo}ogp`Pt5m=*qCt)3BoCeuGbGM-Y*N%x}$;6^PyUP1gj! z{*1noq#L^Qw$}Ty+hU-=q|&MMrq%{`$9Zisni4Svd7C|HT~Ddf@JVP)DBzl3zuEhq z7ZmVCS*aYd`r6Ds`Pc}ImC{!WZwS?h%;v#KHbi=lYy?TLt#*#t#OClkv1dKxga}6~6c#|0IhSP!c zL&8;0ra&1K#tVT;r0pT_8%_P^W@jfO=Us%}Om7GljT(oD3X7Zd>w}c!rY_JgARBOc zs3HBDha^4tVu+GcESrhc&=vp0@Z8r>06dNf9dC>Qq#{RCp-$t;JV{57*| z)`_4=t(>JP%lDYCMK6iyz|HS#dRDwv_IRK=H$~m&K*BI@Tcx#j6m?CJ%XV_`koMHTFwusGHDD^X=mj z6Opx;uy>cY+2HL2mVHz07$j1lLLtjK5ci1V71XfI9YeejX|SN0+ZsT}dJ*la3$?J{ zDArVhlF3D>G%g2a?;Rtsb0WoP+|zuRj5AFunWAy>G+& z+d_mGk<17mulf0UB1wz7^{jkVNrSMdN*fj?Cvl$DdE{_PiH7IYCjp0g%v9)A)P$3% zTpIDtq}vhdX07@JnLbZ5oBWH;GXfDK!YvV!rFVxH*T$*2p^-rB%n=)-9j`&KdGVxv z@$OY(nE#Cq6vnR4I;7ZiwXqp*t6KNsz*1o{KG|wLtn1I@}X@sYT!9OqP7# zod>4c#SlU{gl}B0)u~UrCHU;I=ybsEcfPkt-&P9 z%j(9Z9mo(x5dCf)qP!1@>G5t7zU(0C2nyO57_BgJ?rR1P3{taj@L(1}Ja^?OlbQO@Z{FJTn`WReRH%ozItSRbaQE z7C!~-?Ob1UU;LeKz|kwnkb?N6sQEye49aO$S8vXFkmzOXS|(Ik1b6nnTo1eDC*E)W zQCKv&JemBTc)%wlJjb~QrXcU+xlbTqKBS12wT>-kLbgdW_ut7)2%a%30<2%t)+Kiv zTD6T`b1yH2B2zWF1P<*bOO8%k4keU>#po5Wn<9gUKf`3IYHN1{yv8#30tU&M4CD`Y z>&4|y5GlUX)PkO^iM&S#DM8hMtyQCCv0--kUFy`0Gjs8tJ?Qg)=huAD*A95?eg(U} zWwd4A$($TU;&tN@f%HGP=X7aR#^7f_x%zHqCpPqJhj~vfd1d`9!jqq?{zT3;Nx(W=yw%PfxZhZ8rkLP8tYtr&m8B zx!6&67-fF*EnExGJB3fq=m7pHKcLYLxw1cdMAywTRH;fnN8M3f%J=%&=az@n^k{rO zH_qx9s?Ln&gX;&pV$`Cp9W}Rsz-f^61@aZ&EdSwS1{5(vdCJbTu);PjI$$wz>fuq+ zp3 zz;QQMlfCRnyTm_OQ7l5A8jObmRUozYy?J74sY%Pj zOi&#Dff0Evqc)dcx8ez@j&M7%pI#9n;gx4NUb z;5bqOo@!qKn(#$V`As_!jqt}H#>%}NHB~Xbr83^7%+SYj6VHLZE;c|fG{MTpGTCpH}o{A)~6SUkE(hIt&w z+5S=4oG|sNE}IcR7>Sx}knKjtEV-XQfzAFDS7v!@RJ~Y(D!}_DPVZi*BOQ&OtPs5O zS%<1PC}-=I60GeRpP7XrRH;11);i))K8r~Hhx)O)R-cvsB##ZwdKu50vctn7e*AUF zz9l_zbX2R@7UIywPBI<4~5kGQN}CHElmQ!=5K5VOl} zVwUVhml7so_i;8dK!jqDh1`NErsOGB@Sy*737t3t@eQ5IM)xC`E*Lg*#^@_D&Cl8D z3FD0eeSKFv1_%3b)vrusasl82U~U^wC$;sg#8#0~fmzDQ!S|ln#@XmhBBoHO%xMZq z!7SCOKPSK>q_zk~IHk6G9aO!$Z2#ny<3J?}&U0qB5v=tZ`A=!ccGmw1$k6;#L?GK4 zw`kbiQl#a{mY5H-Rv{u&b+@2yZv&KMp7bwges6MHL~lactf85jVQa^LbBX%{hrrZ= zL;ZIg!v_{3l4^VpV}+)r+fDlLH4GP}^nySk{Jfy&!E92DT2g=|3n+N8foOf#*LB#E zx1HNn8<-A;Lvpx-!r{~5L~+OOd(o3{1GI)e{^#WZL#~p^>19FaW-)871vlaI=RK}1 zO>V|ksU{Yh7(ncEue6*Wgn;7<8+X!vPzQSFo<&qGm9HyB4-*be&7zjUPXGqnJ|4yz zCq8e*L_Tv!NQ8SwaVX=xsw8%tT09KPUg-I|y&7+cNtA?LE%MPCDE)xWs+@YC2C|Xe zw=-Mu0t4vx36pkTBxT;EjJ}jY)_>HL+>0rEDJoMLyH%ZFl=q2U!XSh9AeoN`H z$FcX?umU737J)D!D}KO)cC&~5BI@Upw^T0App(jq&Kr0yv@NGYWPS^@U|%;|6S#mw zJDs^1_d|27>gaA(ccaBfWd;PBY1Boi&+Cv8iE)I%{J-+$X_wQeBji=(B8;>W-KMDb(Lrjc>yJ|IkN=~u znK;jzs?MZDaA<#7O&*;*(U%%IRGODJe?`NWCsa67=K!f?sRy2dOtUu|1~@A|+j)uy zcOLscQQc_mWB(K7?qTI_@X4>{+558J@9x8yr_avPY@SlSFDM0J)@2^cPjU}ID>jx}I%P$l4 z2N~5b1f40KO(l>^T(S^gF5NOSMu4O1QfAvbXNeDTMY7AVl{nR{(=uuNtZ1H{vDi%P*s#8 zVpHc>=j7tGjhM?|H`$bObh8$NW0@9l^bZfNNkA$`8r_S%j$oR{rFEiX#%sjSMzCk< zkZBc7wTFf#B!g+5yWj!i0H>aj_z>?TN@_$YgA``@dl|ttGI2gqrEFhC^cX`1b(7ntP}NyIE8%)?d|(~M&#MPyE%$~ zwyT0hM`t68I`VI!NB0Wye-O{Y0i%~E&@4VaRO4)bqNstio|g4I(O0fwR-V9zkN@@2 z+@w_lljgv;gt5XRe54>(YHdSvO3pCOTtxQ=di3vg`oOMKXjT!}6lruAm&O|ZoQ4!; zo4wWVE^^aC*`F_$qM6xQXwnPh=pH~c7Ag$nJ&Oa|q1oy-yPbz&)g9O1?IC5-1k&-% zsdxSh;=QcZFZc}I2N^loSaCC}#jwq*ZL)6#rOitz8OTqTykcw6;{KO#&;nQq6G)SBg*!|3k(B-2c)W6`dH-kaCuJv(3fD#T^iuR% z)%+f0YquJWR$s@iKFm^nUE{8{SDs*8rkGm%?t9u-5iS;xfy|0fM`pSX(pe9G7kou; zCW-y?xec zEIsST58mk8Wn}D{HLh?AvD&A8VFh_DrKiVCv4gwO3#g9s41(f+Uh-!^er=mxUFjFi zU6`P?&kSs5xWdeOr(>Q>-UqN_X1X-p8Z~xI z1Fir1d``2S_WRd#kWPwANmY!^tOb2eKLeQD_cZ>wnf-<)IU!-$DqfL1HolPeFs{#a z%iTSv0rx(7>U(j-R`G0!HK#EtuVnp^%+vSW=?_|Rfiz!ad_&@vecna+E=odBH))En}mSkIXWlX`tG=nb$j0kt+XHb{$k(4L_AVGMM{pnm^5@4 z5CZf7$zw050P&%~CsB0QJIq4ZLOoDOjr(r!|NPxW@>I$^fBfk?_IsquQkeetqt7a5 z+lq!d0&{Y>01eM&3O2uYhW2}yDJ5CrCwk@GjrR;+AwTLNUR?>~T-(!tp z=N%hK_{I!v=$@O0wi<-##cKT|Vv&?fi(M*Z8rVG=-6BC~>X=Jt z@%19221AJ^ztSs9$*ATpTVprJ*?T`Fc%L8EamNzBBnx=Ewcs^yMua%QZrf840CSJv zo42m{NO`qQf}ljRTK5nKb*eY>Qb99MulP8EiHm=oeecE{rua3O1H3I&_0@6C~ zPZ!2diZj7Up{Z5kZ3|L8Ny3}sf)(&a8M!uA4(>5mHsW4iK|_hn0M*z}lx8g*AC_v~ z1XZk?55`a4u)%dEU*$AYE{QH5eC~woo2p{die#&^^peS3aAPz)B!U>?LFD6u)4V5- zz*?ATm>+(gKPFkaXt#?>*&#Nbm#CepEI(KtvWG>!Wg03(7)&!u)}D+mU2HC-kFUI1 zM&1Zk1{!OTzY*4RjII+OZE``m{c+GVZ29+jP;jN#xM8#?OR*a*C1(>x_@DvkIS1d_pnJ2RmS=aM)R=Hm=Mp zYF71R=k-q1PxK&VWi*|Vd^@Z1C6PMjDKT@$@rH#0)iZ#t?VEMgtq?o$rTMYIU2|qN%5G$8-9q_|R@{gBs<{AH9#lF4f^_PP1Y6La` zcinMeejB%;16E@`8>e+@uLLpFF?F3BI0t#@>o~)~)FE;o+frGt%|3zCoG~VRnADeh z4-bsdOV=c2f5fHC@r_ak^YCu`>c8FxW+b#xo-A#QuD)5DcbpGu<*X*L($`PUQjSU3 zn%=9<>+kSFo3v6OBf9Bfmgdor{+s80H$giA7qNOxx66b0kbJD9M^-OCm~!A~I0ig| znp+dBN9_iVEh8gYd~QCR+S9)7X9M3JXcK7zzPg6%hhkB_$M%(x!^yv~Jxm_wf7hAA6!i!h<;l8{{ z<@!O578eQ8wnjgG2bi@RrNcU}{5=mDMHN1m8M}Gj20y8w6^0#BBkT=m$(NDO(yZ=~ zlYQ6IC}j7BN@qOfM;v;%8e5#VLR)zq2=EFNYP&HiDE8FwqPvQQCd)HwQ z_}*)*@jk51!LaG+yn+CsA(yS#{s_h3r-Q*nrn$4!;_w`q)ZTHix3LNA=K%THyy03M z=kRzHH6Wf?@-^~T9{TaI=9v9~EZ~<@<${Co-Az4xvO8+|gQAx()#^&0e!xa(JLYGS zHY1zg<DFkjwfrHth@y`~lg}{-F!1M*Ygm_OxlIM`b@3`K7Zk8z zR_VHF6^MK7xr>O;pT#I>`+xfN|3!O25CzHMdC$A?mn{((xbpbC)XNgR_+hMk!qz&_ z+P%B5X=83Lnm6e?A|3ceH)kCP)16Mw+V2^y6K71kH!H-}neBT840FZ&Cly*?Lvn$L2dco*_O%|_eV`C7Gr%Hxi?EQcF#KsSE!*_gLQlBF&h)s zO@UVUA9xA?x%uxHzctV8i2n9BK5HI=##U1-IUJ|;l?fCT_i4V#)QTw0gPGwnS=P7F z`!O4dsH=>bjU!(o7^PeF}m(AdV^K-jDg*=bQW09rFHK zzKM%Dxz6G77nJ;;2PeV3-Zq1Aq24z@Be90@Ek?@x_=8Ff-_G#)lWIk6y~>jwKhFgZ zG}qGMdo$pJqnpb0S-$}Mj$vyaIR~m-iOGMFY9g(B(l=9v-(MbULgk`?RBEga26j_5 zoj9wGcvj#x`QzW0L593Mj4R|wS()tg$%x$;#g&@QlQ?^_y7_6dC_L#wgOJlHCpG8TpXLzFv49RgwKE8antdYBMYOgNZ`(bgX(bR?v8omz9w|jeGIbMX< zf8e0u7a|2*Cfo?Z#eZ9}2BJS`sminUftw!Zar73Yh)hexNTY;Qu{@N)vQ=XsrrZUj z7Pr=G9uJKUoji3cv#)kXQ%AkmKR>a4)N#-iRZzhd9(!GjWoJbLHZNZkcoscyN7>&C zfUR+i_*^*zEPI>8R(c{?d0IbLv>jeV5EtENWV_u-NJ53S?EH3YoCD9hSgT_9YJru= zk-i&PELR)-F*(+=uD&xAW^XK=Y*NQo8yCEv$ATq ziD$ZF{k0Kq(h|M>yg4?y)@OgHD^~+U-D(3OT>qY~GS(Pppmz^KqiJu&q1Q*FmIhF( zG7LFa@$&H6$QSkxo7}lBNsV-bF;S)=Qp-p#`NuhP_Gd7<>&F;3cbE$JtFs3a+zCeq zqF;Z8N5r{(W51!!R032pI!O?1v5mjLRMZAoosiLoKLJC0tXcw{0^AoZT4#4qlp94f zT+~YPGFf; zdNjkrd(!*7FQ}8f=P{xHAlOb>YJVk*m%A?IJ^7S{?R-@~SxVE>C@tvMlN-naQj}&~ z^@8_#0UgC!1W_QM)?wUB;33!Ok%n&XQ_`8gUz+c0cQyIU+AE& z|KI>6aG~mB{5qyMAb939mv*e*eNVEmo~bCw~dn6 zI)_#90-j!DGD2+hDDF8jK34d-Ey5!1{@#$wc<-b+PmG@!PY!DBS;tx(3YVNdziq>&dXaYI%oU8G+shB zE-iqq8xbaghU~<8@{Zf_+qs`N&DOz~q522c-1mZo7T_6BgrYyd5^Y7o zZcZCn?Hf09aqSn}P1PKo5?Q!o?+fXvjx~mJD8Ghay0E>>7WtEC zagqK_sPJs9sJ=O2$71-0O0m>a>-jndwjs)l@xk7w^tanUs1RNxt?Q4%nIQc2u<>Ho z*Lm2^vcF@RxgL7xz^+q8uvdD}xo%^>`-D^cIm4b*N`}D&p)PbF(TrECnguT%Gnn~g z(b{%m*Kv(khp_A!9aM{qX?Ox^ya$+0{kd{Ik82?A`zF8OkyCfFR?F@ssFqU9%#7W{ zkjX!JV0=0+YeMg=)Mud$LLjnZirb_a1AVkegC2b2D0$TP4;`OBm&jSFjVUhRe{q}3 zwl|#X6PW)H%2{nJ%}DRf)DPerNhaR60Ij&d7UlVFZmwF+JdE-5B`Yf~F%I2DDc8Gk zW)9HK?HG7W86&2#w3ri+014^QjSqg0sZY&+XOKu8;O_pH&<#)W57TVAYV5%n17EYl zD`GMOPKpO^?7RPzmN&GPrU^vp<5n;HFT||%n06k6;3w2|D0=ig+r7AYpS~0SBAS5{{Flr#u9DUaidRJ9fQbc74>3Q z_J7>Du?A#ac;C)zo8ZC!UC8|=scz(lx;%`(57l_!X(#@&Wi?s1RWQo9vg!r!WP=cU z%UUX88y!QyAWoP}yrP(3mx-WT16(W?Yc+(gxUtcr!PG8)7^$nFkaU+L4p;vE(m}+} z)w|n3R|$GO877feP;tT(mQ{j_R2GHftIa0D-A|TwO)rUh9D*KhlMwQ^`I>rXC(zUK zMpn9X%eyHnb zTq0X)%uxkXcb*Y!LA5{sNvy!k>JjVCAka&esep{lM*of9G{4_go6V&bO0b9?H1|-L zt?8|G*|ZpM=wkpiL#RJZmM+=A!_8+>N%~JY}`eA6P)X=k? zZC&fP3&>5^mg_Z0_?uzM1f7FT6+q)m`)GhNXKv~+0$@wr7ISV*JQp@d>kvymSae$K zKzBv_(@Br9*Gk9l;gC8V7`5D{=x_@7qwr;ck6?Qh$m!hcIB%aKBe9O;A`)nOh@$bU z=e4Ds=Y>mILd70qv&YEbvvxZd)O;banY}_SBfGbSQaX!S@9p5nzY)ILkIbxTENd=k z-2Y-k#V_6)NL#?N1*W%7Ozi~^#xbeKKYwbgYv>IsVjKJS&OA<|ax4Z)HsRlpr#$^m zT@Kyu3Z)p+{~+A&_MYkO+rJ|tuKCg{_bO54LSN2}eO~8uT%89seVP*f1hJnL+|OL2 zvAA6TA6u=qF39!f7YIR|-{b@tkq#czu@=rq*z#T;wD!K^K1>RPShK8p#bW?_`(7U^ zw|HQ;U{rXm>v{XF&ntmvEC$p356!CA^}UkQAM6OrFlkT4Y=pU|e9@$Jz*l#XC#yG- z&@>CS8p-EJt6p;63?!1{eh=Y*ha0n?nuFjzF5j*D`-f~f4B;YCwJI2O0tdlsi2p)f zI;%z%qJzz5wly4ia2+ee{GKy?+8#A2SvPhKsZ$*FAeYdXGCwlhT8#0?Wz>SyGQ#;U z)uCl1NkOC*m*ZL@kPQ($%$ZGln`Os&TCLPg{wm_{JzTQ#yo!c0qDQ9fQC8z~ZtFDj z&aGu@*8o|FSHutOxJI*?i3fxJ5% zwG_ljrYdbUPp`})muXOFWbL_ImCI!&&QWti+1p&Opgi5y1`9sc0u#GoY{-y{x!1+v zneWMCO=G}SocSZ;(>NTaFqv#71Eh@uQO(ICj0Ou3*;$XzKYz%>Su@r`!>8vadvM5M z*xy>jzaq#`POh8WeljOk>Y@?2Pta%=9fbI`umDkaOHI`cQ?iO`V^6Z3ItWnZqV_uO7m4~w z#){pUNyj`36YS3Tv=G@P1B;#nukyCpO`!VrvyS9YeZAGFwMXupOdjDy>}bHpY>hhX zA(6Gw;ya%C*bCE<<$tS5rv{?0KuqXF_dvV9sn)OiB#(wsK1rIgo4hw-WvE&Vl$TRDc^DA>7*Cu_*PFB@=t8t<7 zeG?3yvV8uA)Pd7z`d5#MP&nF9_OWFD1$FqPZqj8nf|B|c6e*m0{mDw-#CCbh2PiT| zn3+SFq(qHAgUy!5>EnF_KgR`aXAG4XMn} z#=X%$dw_oqU`$vsC9F=yQiJ#6g`lbJBb?F#OglU+gT*Px@RVN+1Q&X>g|xfh5R&_* z5Z9KvxFY^yJ|`@}tL}Z-z5JrC`tmZhvV)Ifh4qj3h9)(Ck7_<)VX-cD89LV|V@Ned zrne=KK|oCHlz5;yq=V5>KBD8g01}S2EYENj%<0|jILw|XT3lLMf_0uhn6_C`V2CAkk(Wx5o84e^8P#>}U zLusUB7X9^;@>TIXOtncvzJ-6c7gTF%Z>d2vVcg3=bNX%+s381m41m3Z?%5yAHNhZi zx$4wkc{^x9(Cj|_W(GFzLh|#$nd8#5BUU@>=u9e6aB&*puO0SlOY6X&_AS1XEu;eZ zliRdF9_X6PKmu1aJ5w%Q)J$s-vi|$H1UxxV>E>hhWaM`2AR+LOB*g#sozgr7b% zW||MEW3M)XJdOPpS}5^-GyobYL@w_5*44`caQuuSnXUO;nc<``{?=ayI{BRKA3w>& zptC?F8~avnm>j*72G3Tksnhb-s>70^5g|}LBix*8#;)nYj~vZS7;PG@I`61;l(SYB zU#jd@hd&qBK~~;{V7u-Q2rCqOCnF?CzRV&z?EM$INrGv+E=GO<_Bc~fM`*xm^}Tpj z`b2I^ba(YgH}*WsKc3XCC~-uZV=~eXKU`euUhC-Br{O{U|7=%4G7GxUvnt5gZvwqw zZ=$Qoy9r;@UAuDJQmV#grJRs_Av?1hBHQPXca84C%Sv=$j{!RHC;CLR$a&8r(5grQ zcaON-gDbSl93WorwMdLN8Puvf3QqR2jsJVRPw)hGD%cZMZhLfIA^5oL<(-<>S2!;T zNOaqLp=Gw%<%FmoO_gDL4AcWQV7w45Mf)q@;<7)jJzbfZ&ob-Xj#VRxVIv=9Br1#; zlm;yW1R?L*%om~#y%JPdgxVcYDp5(2&kR2&ccs5^9yx-ms?5LY+kf}Z zCj~-n&2iz33kq9egG^fBPZOn8AVyBCPX@(%_6|i6Q)Qgv89;;q4_CGQLc6w368X+w z8{KQ3)d%j#TNJClE42=E8To6_{LDD#?0Q@0Y*A;660)JSA$@KKOn(>ob9zlutp*3a z{yju`S*@kw!y2{jJ{n3|8}onM_@Obm2LZvAvh*>D0WOfid0)!FBGl?w6mZV<>%Nd= zmyujS=JXO2iIYRgfRy$v)?X=zMnU1tqHk{tIKM?j&YsADo-ZU!Sr9Adz6cha+)@H2 zHVfJqf3gWN0De(szaLryDCT;z&9pr1o$^}5Ofogfz=bl6glE3b_WU~GpAq99dvRaejrS5_J`lD)`;5gHUQ&6;qkaFPEYXzTL+ zW%h-vmdZ^_KvvPx$ck^_C-pS^u>p*R#ZEFrf1jT_OcwH%sXq@8%Xlw%@Vxu0q5S9J zTT4zaevzo)_b-D0Ewy~f-|$xq%2?}tze}UVIiJ%Lxr(*bz&Xo#9eTNP$*HZp5k`y8 z*JtztuRj#$5%oKps0ie&y#kPKT!Tsd8YEA>02uGh=DI-*cItSn+`Q@XONqlmyjD{L zWuR3Edw1hK3^9qJOUV$(&LQjnY253mpn3kB1ojy7iS@M5A5{MZ>C4%7+W-UK`-pvYbCt!VWue+t7zf7p#8%@n) z&~|%z2cXC^a(!W{_pQKqfpv(o6FF#abH)R_a1X>u7Qc;vvOu*c-q6&$T4P#@s2FLl zVOI~r?RyoPMnvthWm)YykSvEoEMFowK*{EvKqMx!4KkMk5+q$bd9&_i1Pbn?7Lbzk zU#73>ZVo6n59r;8!MtMOZilATy9x^_c5`@9Tt_Wx6iD0SnYL}k*WZKAZ?+j~vZIJX zq!ItgT~{G_Q}+XYL6dqFFO`muBM*UC4ZWr%e`WZGR#pO{_et2Yx`hpBn!E6h?zF`D z7ho)DP6jeLP4n+{Fz0%NuLjh#46&e%d9p_!cRLM8Y>N?yt%(Wi-S6V+S+2Tiv+>A) z82-CV-mXz|-19|RnR)BQttH+p)eqRQieb^C?O1fF#G8*1*PLMAY`4MRTjQIe%jFFt z{cibR+qUyLl#?l{=kS1Z80yUiP5g3rC!QaR;)fSHE$ z<6}tym>+X58f>X>x|(<{nH18bcX|PQ-O9iFBc5oJ4nDEKZ_TjUjQdqCU*Rgo{476O z=mIa6g5+@skwq|Jp5jw>Vnfz*=!VbmEwYjG-i)^@$P@UL!vyPzk_s$}^{}@d=BTN< z1S4J4SZ2C;01MS=$AFtpP$*hxTU)@o$$9B}&Y<88&KFsok^x1zu>nwUWfErf`?R$* z9WrdNCm;yNS#KC0ybXGz=6Al~(4GzqBrW0*oM?+J7BAxqOe-zjff}Ehwr9R)8rs6S zskY4?x6OGDdTqs;pbt_S0QNUUFaJ*Q@y*pt-+Y3qyTS7?UekmMJQ}#-etE6=#go7J zE@k79U4;zhuAY|)-kEIWZ93JbztLVI@p)lx>d}=k5D6%>fQ@|`Tx|2x|AY%&?sq7$ z;ITsHAPWRY-~>CLtOj{Q7oY@M&%Dv=cuJ)2p>x`rBrnuUGvSQkQgpt+h}Nn}f9=ZT z`jPnkaY8|=RXgkW_0XuL>#V!TQkLqLhj@W*%93M4lToChQ@i|huFtHW>kpLS8}k8( zG<2bWGBn6lUzdrbiJdWnNd26#^~Ok9=Yy-nv(g%hI^%t@ zOpr7*C>n0E)BVt0cM^m^1d++K@$gRyP*3^?z30}eC>d*&K2B{!B zM|H7l{2RL;+Kuvo@hA(X|DvS`2gYYa_D7vh?Tm)mOo}O3g{vajo2u%Mu`A!}2)9HY zkQ$XIpdh;6i>%_a-ZwrQk_tx1MXQ@Lf`rH8gCxBl(nsB|*Pgt&>ps~=ckVyVWl_)d zKL#XCz06wxTGN^bIa4>Nf%^hGBmloSh07#S5x{jsDJhH8EV_Vt2l+<$?l^me#x_27N? z=pKG9Vm{Cklk(>0Wf|aEd#48#7ayFkB+=7F2nl#meEB@>dIaZkiD)m=+n}$**ZHMF=zVPsHDllUG2OUSyZ8htbBI5;v@P?12Gl zcWyDb0vvyUB+Y%QNA|qhU>xml(hS&FrW$VAHLpW3UQx62sh|WkY7p0$Ql@A=``s zGV0iPnU0U4o^<8WF%mDnxJjMzM_L{S!VFCyqWPeaQ=>BfS#pfeJO4Ov7Q2%2CfAU5KS&T#Fu_r2{X2PrFa&=>cqfO{aTC;0w+XOVIPmat zOiz1633Gc7@jgMjZ?}M;%VY#1y^d9pEMibB@rT=JX~lbdzISn$5O2wX$)1*z16tza zW>{yhN%|(g{8){Mp+p4Ex9=?3x%~|!(7c!dmMQBK$(@eF!|@NjJa2%yyHe=gWZ|1n zxI%5EFN}rKA?Qm_qqSE{s?vH`J_jk~%V-IhQ!%9zh}rdI-dUrXFN|XI*4sYV*j%VA z03=OQ-4qgetx~!pGr=#1T*x0hfQyBaf@OO+la;loJ*ghs4jj*BWP9`@T=nzKY#EqY zpHnfbh)?vjXj?HWh8XkP2TqLX=x>r7Z+!x_Qm1pKGw_<0M)}m59x5xuGzugpfn>Oc z=7U=ns1+2%_kBapQ_T~W3P($^CiR4SkjDCjDatECF933|7hwPJ6ocoqFGxN0Xo>x} zMDFy(#G$nwX;U%l65!*=C+z9M%of5y@QO}|T#wYu^G~juY8PEGO6SaO;?{^Ppj^>E zpCiW5W_;5SMz%W%z}a* z_U&74rpomnU|2xH6`MVu-JPRBW5$mZ3(*2n`6{q$Ec_?1+kL2P`5EJ2U&x!hv4;)0 zjtp*%9eGmNVMuD_RGCWPnpFPQDd;4nr|=DkuAD=jzg9x)m$F^<*)w_l6)KBME-1Ag zx+CU2u(ods`uyOWwUV;ef&2+kdz{7=DoWSLTsiWSOp~aA{hFP0RA8ylHW9O_EItzU z#oGmOaH#X-U7A#`1Ye%?>_5e)){z`kkQ3}e(aaUM=p(A6%YCA=l9Qf8?6MtVC=*IAMM5ik+!~D90pLr- zw@~Mj`d7(mHPs?qSn#QokKqqPE=9-AB06hwu;whkMz$)mGsfw&l9Zkpy6bJ?-vE2W zy?;P6?VwxDnzP=?)@VsJ>)WhRo%ao{0|DEDw;A5-C~wll_LTF|^7vPf6)HKgf3!Hj zZ26q8X-)(XQ&eiNA0zIU5XZpD{3JTkLi|gDLM325?`K@w7ftKmtlaQ*0o;=+;O{Bm z>#Wd&ZtA3|niB3lG@&i01%}7n{88zl)K4iJ_bZ>$izQ`d$ZNUi&u5Q)1A&qjxBocX z+90PfF)%}ByD4vpluLC_WVw=S9jkE(Ks**l8YJIrDtBvvRW1*}`C&fuV|a`4#k`@b zd#{6#JLWrireYb9fL%`GonlTnoGp?LW5d1UWCibLd+qN2`r#ukUl0i>pxbTGB9?da z*`DqJ4hCBS<5HdDzaki_4bYU#s-e1{&ght*3Ge^yX;nx{z;tP9vJ^pn?wbcu5g-!N zE*Zh3Q&oW3C*rydP>t;(VXo=}N&mU!@x7kS8@PqgU!r1*RWUgoZwTU!m^XeTJR$k6 zDE2M%&qf}HK;$~cPeASvSYr3)!jyx0U8sn4jOV21W_i@IW6$V=2eBF1Wt>e>FIVbQ zeeOI#vHnBuvdy?;%w|e^-e7WR0djL+OL#KYN$q)4&w0X4(r(_Qw`Qr zr7-wJH~XuaaHPq>u2C}iN^;Yt2Onk4X7h0c*MFW3F)Dyurjxvq!2|1S3-U&Pe$ItRSI9}}9(@k2PB^hc;n z-txZkeZHKJj$N)p?r)f*3y9Wh!EWt(xAL6)#@JXZoxNtXxFStau#@*W+=LznL&U zUE?Hv0NzK`?kMAufqb&q;*a_H1QygYu=T-mI_bY)#BB=EtwXECJUkBG8i(7)Z= zKJM6*-0G?nfuJt@sd0xgp3s`ae6fR$V zt(DYU4heLRJ9hRo_LoLA7p#{&q^^Ip8Db4;LLhJ&N=TW?Ny}O)&V9())L)>HliZ>T zz6a*61r7DGs_i0!pJO8a$I*E>vh{ai992}6*lLTtsxe~k*wl>C7PU96StV#|#NL~# zO{gtuSH+&C_9|+x+MDE?{l8>d0NrS4~oq@nx?!5RiBUKh)z@2|4ZZO z3-J<3G!w%SmrFOrmMdntC=OqFR67&CZ0YeQ<^n9nthG|cU^?HZNGu$G9z9cj-;9zGQ;|RAhh2=KopOv*Y&!Z}s*>GnGpGo)U}mvm|L^ivg9^#Ot6Ye&j| zel<}APaE`{e0hi{_Ehz3$Not3)tmD z`^ecm_9gS|bJz(h&3L`^s}LmV%1O)@#SPh4?pi^4u|#ws!{!U%ZRLdH5v^V|Sk?Qw zY_4%@tz5wxw!XVB*t>kX)tj?JI$W%|XWT>D<&L`BcEi^xA34@v<`VU)=Ssf1AG)=uU0ixvd9?V0YoYVDT5U;9yxJTDUms`&H6y)znCcEUtZaue^i!tbbxRi;sHg$G8peR#9S1ld?mz*MN{%K+v!*6E!7@8N z!o}AiVSDY>yh=jfe(sD=Ndch^4;koFEZ`k41nXT?NV1bX_9oV3Yn`7acpD>=`MiVX z+t#mIGU@m>%v%rJMhB_gpGOwAA;mO~BbvGBa8eusrD4))W*(&9jcCFPWJDj!#n4)Rdc;`Ug`;oM-Ap-htOAi zipMXwoV}V8FX8@%(y6inLFyOQJ#{I(2o`csX3bs4fS)35*mlHWZrwylmlCF2>mDoA zV||;P{#&)$CvofV24dlLux`%zN(lvyu+EwhcdrPF zn8(@_l7FvYIt6@6>op>9f1(3;SLtJDMs~}+p8;CQGBY2c5nDuD%Ukc^q@qL@b3+S` zR5xuwEoPi7k6HB4H%$^UeGZu~}0s zHbE7JY#;Es(+0r#=AoNzB#TROL9E^oE#bE#vsWqBuwnG+ zmf$6gB!*GQZ}-ugCbMzw^8(RBn4|~O-B*By35SnSoT7aoO62D+B%8E2WTEd7i%d2srl=9s36 zW%A}`z;g|iEkqrN_V3fT=c0Dd4w>!UFp)wmMYK|B3opC7Yd7C3Cpbt5Qv2M40pXA0 z0iK@XXH=1r%@xu)mV_!ez|#}Mq6duY7FL@o5E&je>4^4sOJ4}bp#gUJ-aFo{>TP<>p9Kxcd4=+uY(|qb<(;sn#gdqaIT_AayUDDx$eVP9IV>Jf*B2V zv$%~ob`{&PZGDbdwJ$304$Zg2USPqn?LC%I^M`L2w)j+DH;Yv_d!PZz)Jki6ba;67 zyH*1Yqr?;%tazk7@(VSvPv^S?@GZDh!i`PUcgqbq6{41U|D+Q9n;E>BuHniW@;^l{ z#t~_%BQ-dP`qAH&qX4^v^SovCMFq{OhCajcc_c^ycb;xw?3+LJm;LGF;p(B2Cvo=A z2@1Hen;Ueiu2uR}=24?|r2h=O>zZGFTLh4C@qhj+cQK?^8`uCrN%n=3D_{Rudi%j6 z%}U6N`3Jp>OVBmqc(oXuKY3gRO2)7+QrSa+#XGY;<_98d0wM`97v|`;Ye~5DxA62K zIUD5+x1r}TId7c#$=6!K-!vK8degRSfN=KqcW-J>Kisy%3b3&bTJisJfNy}Pp(lVs z7ug}(;U}wIrpRleR*zjj^sS3_>g%I55~fkh)p&1n-QWvQ?!ziAfZE-w5`el;YM{Q=#Es3@n2VB#2qwMty|A z@{uS)1tJQ?KcEL?NF{hyZGc@)5|Cq=ylch3os~DL_F&(#*+jMiwc~^R{u?T$Y$^IX z$J^r}QJ-PB-5lCiljzU@nM?JG9$$yjlEad7P%}u6Kpwz@4-5m@#wp{)+B@k&b}^LP z0E<;4q>U@W--hV$IO*R<8(po48r<`aFtZq2^nj)!G-<}HqY+0JHfy^F+^_klBPL>E z;>FXqK!{C1C(I4}bKH_B)@PSql6Oa4uA==5e`WG{-}3FQ2Zi;RouRjZT9kI^*m&*{ zJ@~_sbK`rBsXBZkk02mTdxswEzBD{Md|Bl3Mf)qIWa>-d(Po4n8sQo}hd%uU$tP_T zqN+g3cs9d42OR6KqJa!<x4YbY!i?Xm#K&!h*d8gt&qKmO!Dnsk*40*LNT{{I4HGKcOoVT^PNVx;V1wWGll z4D9xXI>vv#Qi~R+SW{a~RZl#^3V-WbDH?y*CSC->@UJ?y0qNwLcE)h6KYiR0 za&q0!B5wYvRkihJOmBZuq&G?_f3KA1lUtvkHp;yMh03YixhgIi?;CN3X68I$x$%!W zq-O6n&k{&!*ZBIF<*FwbWUFISBj{NZT|Xy6jEX4WW(acrMJZ;B41%wnt+^jQ27F-k zz}bAoeswTi2!M;Fa7rydsx-=z^??CoOwwcbzJ&{s7#!U zHAl*jk^}hA_E*+94lr6;QG_2pf5?a#oO01D5(OeH8tSSxNSyRq@RDsVpMl%lmKvrY z&0~!g7A^5d-4J7B&wOrs2WzW4Npi8z$2jq)=rqd*o0;#Gt?y}E)Pr?%6`$6720i5z%BKid&9Hr;w6z2VkGvYRvpb-uzv&uM z-N*U92x+fAxNgwopmW2qC%d{sqA0+nppY$sjHVZYSu+vD#dT(>1*<2cjDN?hFH1a0 z&YU-63H77&x$AFS!c|``4RSKv^|@FV4{;V*SXvl~)xFyOyY*-75mwyuxtG6bSewu` z;nig-`Q~Yw9PPhD?ivjKQUd9u0L9`D6ZQ>x(A0zXh~-;41p+rB#C=8+%5C@hE`#Q0 z@Efo2Z~{xc_o$EtqJ?tJ4|x;b>(l7H_@Qrmvgr);^Y4AKmS~+`69{XOyEgBk>B?&S z$3>=IpKD|GqeFZupA8&MEK<9947wTVZZ&zoj#UBddJ1_v>MPA@c2sH zze}j?TIA)S(sJy3^8_oqQ1;{^?1W!tG9s2)MkWPDSsrnqdKX#%N0iBP^s~t1^?h}@ zsLn*D!6Dbz9|2-W!3?&!R%MjSlUGEr9)~T-EX>MG2uE^~ z+IRZ8Vfx~Vzh-4suf6}$r^Y82ljP{!L@R#q%Vz-@bnW8od}}k#H@Q6D9KN^rZ4b11 zevY_EYGRBfdy4lpi6}q5ua3^*il#8ty|1odGT~87m3dtD8fk-R=c`wlvcI82m8ILJ ziv-}{(Fn|WX@90=l-ta7+Ktw7Bpu8~GWbqsSFuJM*KS3H=TA}mo6`h+=^+YE;hE2I zj!drt>9&~!K6@54;&k`7u8Znffo9l9&~OhjV|`X4YpHCg){Wo;G*rWIYF6|KHW(yn zSd!;LXV}#YpvNspZwuQF?!dusQ4SfgGCl&qh>|uh4~f>?gX^A9F3CkncFWX#&eE|Rpf`>tR3WwB?e8lBWcFMi6ueO97SPMI4Y;r2DmG=hCpJFt z_VM|1+kH$m)In_o7kRf!mN~!@@MikvC-NmaQJIH4tS((5-lb9VIjgm|*RMfe;fxzM zxUc*ix}hTA+*BzFg2bGQY8@-v-WQE}xlK<`zfbnK^ISSN3K`Xcu~EOL1`{BEV0eQA zX12&4YWXDJ5#@;rp4tqssHqKLk<{>{b7W1Jv8IHdf?FLV+*1;aBz>BQ;Y4#LymDDQ zvQ?N-{WC>3o#PF@V z5CQcA>CdWqZwH)T2`bta3^J~TcyW)V;K}~LSV}r6%%UyAm!YJW0S5~LgB!=>8wq01 zat~PkFuEPFbr4h^MIFH#u0Aq6qd#(zU;`29o)vEqq zabodK;!#&=G^?DDV^-x=HF|APsv*l?S&@FP6IVp=fj6yN_q7B{gz&X{L%tr zC0fqBu~WY*EqK0!r>gRrKl)na!f2e*#a&`{KTZ z%BwO{6MC1?;SzOQ4N_!auTizGXR`*|vH%2SRqHteaxzh^^SF}0+1qDNXHGzlGB#g_ zo~D~?K-;#Y%7%i=yNh@fN=^BHsKCmZZJJ*^$t@oBGBBK|4DZ!G$qfuSxozYUC;-f8 z46A(@AD3%mTUi!c&>OlqQ2Ae7#>60$!i;*0`sS5oQ{!bZ_)wZ9IF`rDDq3XnV*084S0M69z$-NkO7Pk*>oh+-`1t05T8ZrstDSdvA=N>&nptSX`>PadV7Dcpvu0EOpj9CTQf$QUWoh`2gP};F5|aR6@^n>-JglMR}PERu_zU* zbXVuBw#UA`cHfb;H(j(&SaWldBhzzpw}5-MlB@rv{)H{`PsdyFc;bBa@BsUaW%l9Z z@L=xl$VbOtEzK$c(nW4J~L$Jx?*8^`XUw(07QYy((uLj;CsO*bWb{1PDnB|p)sVt^4Ytc zu0~~54M^tN=!iC2ZP&k`6{z5ugJtS%Zs3BKX`#RQVlKDJ*!Di7{H) z3O=hlagEwWU`gY~S#A8Dp-M8eg@iwKyrU#cc5Y8?^Q<~Zz{GYy3xT*0()}hwta-hu ziTll_v)IfcM5pgrwL#Jv`F70*=P4g^hJ2~u8F6!pzgZ6q)Q*E?lHb<))m>{hq$H!W z9)4HnwhmEKfggfVc{rpNlv`<+Y~-!kS%HCbd@pKN=~PZP*Mb5!78e<6Nk|(9QU#?< ztfGaU(?;`b+#GKl&rD68zR!pV<_)56duW0m_AP#lB_@)7gh`?$+QOCtXT@12|L1jk z`Oe|g!TuNj>#)rNCpOKZao+2SYhTjK-%Y3iHh*`)=Mh3GC#Y-_`SqZb$F9X#NL9tn zdY4zg@N0=3a<}UYos&MU-Jr0e$pP|8ov*yZS453-LP=m)^nj2apA_Xh?LmYK|4Gw8%tt{{Zzdm zs^{L6?PkzlMz&bouZ$+PN0!d&W-PCS!$Ifipda&XNd}KwP;@1dVd=V z-zAgc*T6HlkB4rkoJH2$#{n>hQJ;nS{9pFuUwN&fj7XQ&LD7%i28DQ~nP`nYw0ma+ z=f2cpYtFNs8n+gmDYE!j#s1W|E%+rWZ_fg}d7T2QtL$G%ohw4vm?R72jBFI|4^Dm| zF@TFl$jg*6#xjvM-SOsQ@P!hsyx%T%*8KQgI_oGgy|AuTJeJo{IIfOPSM77I<{mk- zNpV$JU&xC<%1x9iSVeV+%P7IzY`q)!sA|uR;HTYP;2Z4Gz}{0qJMj^byT;Xv!_}K% zpEmu7yboB+?d&|jlS{4=RDvr0ZG|84k?&EliUW0pRGN{|MJJA&gzR*Wy>LLEzf52Z zD&WtqlX2(Ulg(d8Z@mApy38Sz;8Ru{p{OP)7c?FNRB`~rHSiTHC|AnF45^~d4Ux-3 zqKD=u@_&t#_MQ)K9Q#R}d!CNTuyG`+J+*2P41T-d+4N2`xnleJ9}?8bYVeov*Y`(p zoM6^oDj7`&3K%yEyZP3Jy}ta*iOG!5 zR&+j*yoFWencvaf-QB(Cu=!9{4Ts*m?F?PQ4l@pE$mQ;jWcX!Um;WIJ9I-L8@!!8G z^Ffm%u}5TYa(rOrPn+EL3?w5nDlDxLm(+oxC+3*gKQH1hZ@3l%9RHzRb4?BNOG;1; z!8Gc$n$*?7wJ(L7zP6jDapzSsS2b6}eXB8_nQqF&KvPAdz54T*p4Djd-WOrUXvVRy ze@c+hF!Eo$;@ZRFdU^H+=He!mS$L^5cof{xPi)H{t#6cXX=X&?dc%-l6i333mqx*` zB!h>9NX&bzKY(o14!XMM$m1MtvVH?JH{Z#LFd=DQ2q$vRmEL*5qbYTUW8N1YSUXDT z#0b&g#t~w0m`kjbmwc)nsH*>UX@`Q$n86K|{`a(xRu6}d=e!SOli;m;p-&{7>kl2B zxiv!UNG(@2py4kniF($?EQZC;X>kyyrbcd8_8OrJPs(3Un&N4RLZQtvuPH6R$6~&> zHa2=8kuYN{zT59*3Z)>|%%~a+2YvE1 zRm}fzvjbkn*YC$jZzE$EB)u|jkxAp#d;mb_OHg~g54tMms#;6y*zM3vKq<(bJ$xD`?QMm`{yvGvV+*Cur^ zr*}?{S1kChsfn?*_Tbtlr))O-oa(vx9Y4!1LSL6EtmRzQPg}=vY3&p4Un=bpq4WG3 zu3JGYIYXf_Ujdh?1l6pvO&=gMK~!seK5?(zz1oMtbgCW_I%n|L6l-y}6>z(}M-Ut` zU9|;jwL&h-ro%di8wb)$o-5IhVyHa=P0>r~2JZIiJE)}HiVElHTr6aIK8D$4Zmfjy zK9;6a8#olpgk21OMd=#cC-dy9pd*tWx(s5+!Dm!chs&`XkRJ)^sIBg0vCBPxMtjvY z54CL<*(;QN9EQ*h3hx+}&n-Y@-Eq=LvVv&9wjtPMCyBe-lhU=OnrtJBbb|Q_A8R}b zZEWS%>U{P^BYxg1*V+fr{cuC}-jj!mE{!K1#XbZhDtScf_I`;99<-KLY&U?8n=PYM z;9dj1Zt*h4eCdV-%R;MPK8vzCOjxEelnnr_G?fTaa=iDS1RL@_-Ppyn<&;eUoX#uj$3-u|DwHE5$B|JRAe{5MEU9LI!=fXLq ztxjl0)x;z_d2iV$H+)phB#ATkJ;HQKb^?rIO}j}ai8Ru2-c>9h4dv);tiJEJxhPSzm6zHOqu7R zjNF`EZoQg~=My7ao;@<~x=klro11CGr&L-?!2KRUp)vk(nq9~uHoTWsO17Sa8_Syy zHR@gcHviXV7tf)}9J;x{N3u+1ReN`KU)Fbnu@mEU1m(SbK16NkKCU;%Rw%M|TIk4l zX=SUgg>LJtgPU*&xHK_yLq9*id{3fot?I+2h zS$~yzcY==Ji4WV^MMKVPkjvOEb22sMsG%*-)w3c8Dhs^232u+&-}~ztKHO;K8ha}`o=PiY5@Jyk zujNwo*|3eHP!E*$2*wwA`4M1?34Fc!e0+Ihnwm29mIL4b{%2W{KkaM#SKl?_?o>eb zDO|cJAR`>Y(#*_?Q4}b|waQG%+@*JzgYxBxM)U%v5%W0rPpf@@0nsaGHEYS*eJhWf zpJH&~lN?&ibhg6FOXP#n98{pWY|g8)x|`PS&#jFKrRkiEF6_+)%1T-A<);1h8UCr&jo3FfH^XWFKhCHorILnF%=(KF@6k62oA zZ{yrzdeWWPCqj4&sM^Um<^+Enz(;DhS7NqpvPj3;5w+2fdi>w(k2R_CSXWwD66@dA zOsEl6jX)go=!xW}$GDTizvfk`Yh;thyE=L7v;(IU5=b|RI^BNP^ar=_n^JO%F1fz zh^F%xwqlnIm#(4b70Oj}ukx;2M@uwv2(a0v!on zVgx8r-@XkUY&D$$4~9I!dbhPzu}h|%#DVCsr`>naG^;-S7a!Gk9~gPvCbT)-d$*bl z(>l!~Ff`iOH^WU8u3L(MITbD>Jv3Pu)zX&*WV$fa-h;flzr?s)iEv_^u^=VE%^5SB z2g&_B&-E4vIT&plF?<+4W*#gFS|vsWSS;SZx1_!b@TmZa?0~Nh8IN73c79zv0w3;R zU%7+taNtt$$clH1+OL;eJ%G_j>ARQ0b^*L}f=*1C|Ll&ld_UK_IljhmXMBfZ&EX+6 zX=)%iH3cr}UDU^xbGOawI~A-O*KuJVo*)0O|CCp42Ur23LeeOb+lfWLR6IVq3FCAU zI?8c_;Q6LgX2+LP(BrST55*7U<$j$mh}h^ZGUBu{#2r^)OtC;%n#EyIrOx9y^ewOi z0ZoVxnT2+7PxZeP(-tOULVIh$+40S3m zi(>GT3Y8k8oKFpCAuFKH`@QSC7mpw{`es(qu~fs2 zoY)sO4=WgAMc*KLQ+j7VA$D514YK>(u7sbkVsk49(rW;FGV<`nmxdD!L&U^pzIJPR z`!-({!-$hjr*2aLT2Q@>$qW7AGr6gnra1Mg!>7^WgMulj<>#5u$#NJmi{~sfS`!L2 z6O$Bs{}Gu*U-5^m^S!XIane5qfTe&!(VB#QK9vDQcuqg{)>2}>q*N~u+sI_^{GcoY zAyo}mvqA!Bv*@1Hdk(TdU`V&nHg>nckZS6EV*X`T`qIh9#5^4;^mJc{KOjU)&IE?5 zB~;uQ7VF;~{>trgz{@KY5O&fa(^H4m0Z_rOBL27F{KhCy6dZe&$M+b6YtBu7S#35nN3Hs9V9UZy(0sRty++Ant3#|mY zE1#!fvGf7mi;Ih~^6%jASZ6Y)os*f1z8b5-i+eI}Yuf$vk`l671(9b|LSDP~6^zke zT75p8UulSMoU;C>MLxKw829rVsX%?`5pQtxi9X>FH~uCVHnC*t@C&xhM(UuvSpFbo zivzN42`TQgUKP#jKKQ~kUz@2ppIEYUrG~oFg7oVTpl08=JC=^?RBMU(yE4?npSO@@ z8o%I4u(oP_URY@&`D&cpKxwp|AMSM&J4+iBj?5O@^=7m>)w zvNSXttS)%S0UM`+=(FB8<;Zr4ql_#s2 zytv0B$`;t$TTWv?kR3Zrp&4=`}=%$yb7V5M^X5JVj4MQa1hdLCv?z##}utMbI zpuqz!r8?_%94Jc#nT9*+<&OfWx|h3JZVdlIgi>qynrReSz7HcyD6m!b$a}xL zhRfA^I522t>4m}mgvj4+I=9_@$7{3lv=_wys_1;DY5ybYgFVpL2*PhKDx74+VU0f_ zejtn=Q+W2vP>cRbxYiCW-}j6fyrYA3u;STcx?k3`M-JG!y4#8y1}EJ$d}hn94?h9! zkk;GRkwBJ^x$n)I6ogHag@z14!% z7#dYePjGx5l1z6e+s{eYFwlUitC{%h+|BS$E9`yXxG+A`W4rIE2B!+$T#+~bU-INf_9yKsgZedJEXU8dSr z{DXh(KLRk0U4&OJ!BWH5c^tMndP7=D;$^;rY_)6V#on|lG2%(_aI1k0{SrZ43i#e^ zXzTGkGtbg5^j_Js6z{T~D{V^x?Fwb`9LIv6-M$4xp;-Knw$n}f#o1HG2K0OiliVCFd@OA#No`ZnScY0V)lsH@jgiR>pVVh>d#oR; zCmu*q8NfSIRvZ(Zf|U3s04PS3?)W+LVnN(=_eDWT*N=>n3?wv4ghwX;$U$^&HGo&kv{Lu7ck|;AEV#Txg2aAV5rQGUPl+q>gEW!j9BvGr=mQ9o5p2HUmYQb#l`FdND*;~rLmeXu_`d(--jC0q`0R{yTP3rL zI6n6~>2NGcUE>J?W2I?12rd#O=&{-w=w*^rIlZ)WjRjdSNS>erERGBtf)T0Dynu6^ zgukv7ZeIJ>U|_YEG_4T`$YV<-@6(7drF{zhN@@M*WTq({GMpdA)-7i`_eP5G9KK(gx5WlttoE)_t)(#n12&73-8R6L~5-_BFaBLi*Qe<$2OP0sYB+Z)NRonfl$C{jsA-#lW$*k;jpa{8a4HvJeT47&|ss-;- zNczg%of(8y>+S$ZEro()-=1AgUX;j%RkpYX7s*ms`gtMUb4E|6Ff=h*9ElLf6f;W6 z`oWKw2zu5P1|S_{hCH5g$8LbH<|HhfEi5cu9Aa!G>j2@8Bupcy$;*3}G4Qm9T?<|o zWsn9UjaQsh}z>-vZ~%t(>li_8jlLH5SqAtZ625vk__otk;f_bJ$WWuFIosrSUb}J?*49W zI3d}O@<+gv4(8_P=MhuQi(YE{Y~N5QyzvK3=w={ea*?z9!T~WQEpI?9zL9+%k{r+S z31$7b`?Eq856EV~cFW6Q(fW?nmqd?JX^I~yS9z**`03L5jFYKM_D$Q3)5pXm!<4)2 zJU*-+^758b5#?9{eo|jiI9e;vxW}b4kQDr4EG0Sd6X{48me|_BQ6b!fQx2>rFR4Wx>7kxxFR;VPUu>BD^A+pfW$6a3UILddQEm6 z(y`(eRauHDVrV(mKhLffxKPnrF~JT^d5#`q?L!{8YXgl`v*CnW+K}DSkKIbHfdoFc zv5Tb$MY(Ma4GCuk7vuM6_m>O?RAo$#%`Zq5EdeY41jL-l>LwSEIReXLR$s65#&_nt zcl0^$ve8`_p|TwGz3w)&s{>c8bqE1N}Pm+K#G zBqYQvub*1Ye|b^N3R2ctzz>`i02iI*>(e#98FGp;4v)!4KEe)fUazy@M?m8EOU4K$xbhf+ULm(`v0ey{0}V-F2dv>b@4cPLMCJMGwv8A`SMl$vdyCuC zBA=d^ff2{PfHjzH`vj2w8rv1&kk9?Zg%yAKf zvuIM48$5FgfwUpwyFdH0q8k@Zuz&nEa8v!HWNj0W@N@xupv9munnK{3DdBdAys`vL zX2~2cr@21_H)*wo%D!**>2d=>C89(oze@t=7!p~;`R`Jub07r=fGOub$16F-tJ%djPVP`ZU#7aCfRbe@a-j1h^Ryn%8#^-cxQhl#em$9XosaVEH(+eo)ss^6S7EPnNBDX^;HoE*}< zP#gWPD+Z7V24MfPiX7VJ#eD{;A7WX;MGAw%S$sRzpF*8a4{O%+T>bVvw`@M*3`<5s z^yc__tD9xiZ|-170aSw5>fzsw4BJEY{9o3r+yTn}Mp^`xjC7&C}cUPPw5tXMjbq^F5ZujJ87F!pl92?p%eDq9}Ec2m;(42B;maHw}~ z%v3z6N-*V^nUVFzk&G`zVj18j!MEk%P-15))^uv}jB)A0%Oa%~1A|=f;Gp^-4}{0$ zQw<2%!75Sjzd%Abl)ot?p~cWUZ1G%JzkPF9WjptHe?XKWnU4$yctenJs=;eQ;~#lk zNs}|vF3_K6I;29YjEqj{B5Q7d(eWZ;=Uamr5l%-~U5}UP6eLtdyE_s8oF%|}>0BH8 zIe&ygpEy{gUhE0tdil-CbY3tluc)!u)rwtUH*9YX&E9jPZ1nvgdylE*rb7AWHtO!L zOfZwrqI5Y*xt!<`{-crq<5wFx!q};Bx{~eB9;-)3k*I@Olq9F^$>dyb2-1$C6e|+sDucZ&73a)2}F0B`#fCd z6dZ}!YI8$og=9>SFPby^vbW_D&Sx+}+#a)y;|D652fSI=Q8WH`F|{M-BM-y8y`k4M z|4mmd5JWvH`G*#G9E7{b-dn7utaP4-S?|os5QJbG@QcU=m!v|qR&bcTurBE*t*RtS zot~5l9J=i8y)-2__v4x~Qd$YYa>qC7LVx6?UpPG&>(lf4R6xcX^?N;I9fM1$VWbi4 zU&RXL!>F$&l=cmaN3aBCC-Or=g^yubBiz6v%~!~=u6@M`11KFRwGRC(L}$)c+n?1mJwFfF#|efwDc z1PFDVC=Ik5SDy?IV~k|yM7!n_T5yo*)(^ECT(?<;f6C*#uc|1M%^tC>q&%!VX!`t^ zL%m$|z{$TUaIx`;MX%dVY3@z%+I#-7Q z3NT=_UIRoXFD6IPjL0YdwM`_%wj%KC z2*fgcV1HWp;0Oz@@5_A~l9oJWenH=xX#|JX zboXb(gn9}mcE+{>D?eKL`px=v#VDicC+-mN@7bWS5k|?Cx_yWC~DaDoMcj!t&f+ z51|K?F7FuG0I4s($G0Z$EFtEviM(qaXu~02xcXOy5KFB#!Wk{{mj1>B7Ao*QaZyh) zLCy?mg*&F+J?AH-gzRORyH;~hqmOTGOpO8;ycQO>eU_d=MMYHz{f!8gk5M(W9=7!; zg@UYca0=r2xzBjL{_h_F-nP*!_Dl7eFwrO|hb)!CeI#xRpuM$ncJH?osQGi11FF;p zF2q|pX>sjwpv~sB6E+W?Wmc4@JC$!Qu_kA0ij5SXQH8A#F-Q{2KzL}SWA|d((`xmA zI&wX4I5`VA3y%vgP1NnxwhHX)Qz#udItKXkO&;wX{cGw-)3!v+;I5m97HVU-HfO1n zOxoxpm@*n4vP)pw_;c%c171> z2Mt+1A?IJxO_0bmv2?onBck<6hVoCurMkZqmg8A?QqYYWe zEmZqqXj2%DM(Rb8F8aZBEme}*)e~o>xWAl51n$ z3bwimUm+i;XCb`1| zP($%Eo07fAY;486$LjXH+Wy%P-R>C3`ZuKsM7RNT7bg^I*77<#RJp;7xSoDlSf!t8 zx-BQpy-x{t-Bvj2Q_UD{PTzEA2mY72=O3Urho(*kQj~H` z^uqMlJ~a>9-zf+;n*Py~Ky_9cse~VR$pDt>s=}ox^ObC~&(#S@>Gocy?=$BA#Kf|$ z?FOi*55>t4AUb(r5vRhnG_9L83y`T#D=2?vrq3l%k?iFW*563hidiozun~$5edWaND1doZe){GB01Z;$Xan=}RpXGCzB35rQz<`5jKXk*o(l?(2DUR6n`9rK-;BDfS8>lzu9V_X-IZ6pQ?{p|yU$B`CVaUB-)7pFz z+enbIvA9ltmo(9Jl93z=Qql~oqWmW&S-(WZPnwdHw~cON4<&rHYrDhi zO!2DZryhe`7GbGea+-TyO@Ue^sp>T%A55y?$G;R-cu9iFE;dOD-+%fX!7qD%V5JeA^u6OFn}3s>?>HV!>qa*8Y~ zGTms%4@f>qhdf+q1?R^QZou{3?w`;@`;#y))4L&;hJ`jCyW1lvi_K0i=?^;Ms4t`Z zv-iJG7Y>_Heb)+!M(?mf9VvOq3xD7DU4>2LP6CM=M9aVJr2^JF?(WKlQ5LdMokK%I zTh20m;z2zz+iIv(+XNUHFKh@_yEV4Hq$fuKM5KNNEIlt^FJeTY0TO4+4eQ4Ver!ZJC|8;$+HpRqK{1HZ5^;#*$iLy`z z89%6^oOwe-ZQFbgTY)FL+;!moC=`h$#`4>c$Lu0>B{tAs|GxjS zuWM{ySlbUOl;Z)UypI7BxT02$h zi+-M_k{ti4L7h1djJ5K6(Ns1j2&-|lb{Xo!N{i53Rwpl%yvCy_-1@0qH^|7q79YiI>A~>oNS* z=W6S{R=a}%4h5qeUxE^t;f0&muCYN&GxPKQi={x4v)SdK^rza1Kaz^TZna`WB>}|W zP}k6^XHk$r^P?K!`-IY(;-PQxYKswuSNf;E5{!sVFkvV0bV2foUx*tt8h zWWQ!24kI!59=f~R3WQUvd11xy{3D=jC6PqYOV%(n+cSS7M52sIYm>Z_Ps%Vt{FZMV z>Yz`U1g{bgO$5!XYV!u%4QCw62*qnc&eYjPE&j*RSq3!y^-+8vDgw$zD^jCN937I5 zl!hUQfQ*(B>F#dnl8_wT(n@!VG?N@X3F&x#|K}yIfN{C^8|Qq^FAuk?OdoD<=1;HYPbnj`$d z#7ggTQIIqi{pOm&@+<`6Sa4frSRE3;o&F|X)Z}ElHuGa?V0rRqr6w>)q#kz%&e*UUU#?#iF)~gezZ5w5D4nrzbPBRlycDrk z(9q)TnSJ@|v%$k$(J@$9&F9C60xA!9yf~umC#)^kwnYe#ePT03-H*H}U#dj6R!Zhp z+)QN@UOdA_X612t@9_P8^zhiq*9K~yHCLng{IWg49F~GYbrfM+vQ?%d9@yB~848LC zpEI5wXdnbQ*j&e74e(ND2GQy=zUy;Uha*D@oSZBE_GF*HuAR`%zAmterGBc#!DrT) zCVxjyk*32xvozrWD(K#WgPab)n@oD3GCb}!E&Yi>`q ziVob+lLU*5{WBg#e@A`q!FEUows5aiQAHC`0iZy}6j-K+{rSj5AfEPQUN+&%l_qo=8A z)t=C4#ROgLtrA=n5u9cc<$qPdc;7CD;kprEFIxjFtD=;*E{C}l@@jimrzx2{6`Vt& zrF_W`kR_zyLwfkqhCeh=S&!+K*MZ(YUNhN?sD2+qmP?5zCu1O&_s z*u{%#_u}eLj%rJ>Yg-dT=P_cc=E&HtzL=yWM?=IeTTMA?0oHrf3w~0%nu<%!!E3y! zX?rGkG)f3boP&sQ*2ok-5W9L*-e&u-O*?tKBBq919kBp#$@dcK`iXm8_Rng`@)>IJ zD0*wdgR;hmV0>mWPl`X{OXtB6@e9%?X9f%HK#ZV~n77ASIVH#a9IjnXRP%KwpbyT@ zbnP3=!_{o7eTApfT2e9l21L)2EL;0Q$_|hlZv!#z_J#=izJ!6Z7n`;A&!dGJG)G-O zFTS=KCsN5!eVm}t$Hahl;*FL2Ho@a;dnK81x~hU0(iI#7PNw7H%>Le<@6Z2M{{#z+8te+TH(PnlM_$AwenrOoYE0i9R!#e>dJH#YhOAbw_*YtY!0ksp;` z8rij1??1t!@Qjxte!#std5cj0ePLqF{U}&bg7kg%$H`oksnS9GfuS(D&D3V5$lz63 zZEZM}`WH4-!+16m3ilZff47%Z5V4z4>$kr>p7_F#`pPZr)H1)<6Ec`D{3dniQ+71} z81@~f*g_6eY=Twes}sPLYwH(IG-EZ>+u7VK^vP%YEgoe$`dB`e*7+f-f*^NmUKqDW z5gqy(%8Q5}VXMYf2cj$9J4R!hbwLxs^jZ^cdQpdf73~J6U6aYqPn}dfteA(O@@0uu zxbEBr4UTOW39eTS5fsJ(I5p)!>WTQ~T2-M<8y|eihEmD>Ba+$}+4APGC8&4ZR06%i zjDPGi8r?+m6`*d5G z>5WvWMP*|r{x=^nT9*S_-PoXW)Lfp5dL-U-x4OlF$1BYLEyUi zm$hbl1h-qSsJ}6*Z}o%egG0ulw>cG7l&T0-I~yA>^v~O$l_6jWq(~NF_i4h#m0uw07+^73(NNug6O;?4G_Mz3#*_p{@YB!pwEAYB z-8v6n`}nD4i@JM~BEvu)<})vkD|l|ozb@@Bw>+)gm1P2)xV_}mertWP$E08X;(1R* z8ag$IC>O3ThXXF#=D>Tx7z$_Yr8uxFl1LtjFGin;V&mz!KKjxhZ4$KrJsbpg3FHzI z)Ay3Y24_7j((fg<@qqNH*t*NW1GhZ|;pa-(N=$Adg_@H0!r?S1n_@W)=Dy^)T!NTf zdHh`FJm2^Hk#A#q*Nh~*cYb+}y1wgid$r6qwDa`1=lWsz)=?fCpL0R0`|rW;18WgE zAdyjPZq;Ak4l%TQ*qeKP!gI532VN3)r-yF546D!$u1YWKuc<7|>ENli@bFH98K5S; z2DS;=nPV1MakTAcR~Xe7V6jo8o|N&;W4+xR`{%?px&3Z}&fdsnmMb8HS?!)?@4|jn5y9q=Kuv=aC zye~!Nz9yTb+23bkOrk3|(`1X#=`}H|&H+hv4=VrScSKAqm?Yk5Cig_97dBaHff^bc zcQ3qd5%3d5*kF+e#wFA7er-x3%Lt1}KKbo$4)|u2j<3Bns@tX9_Q+UioJ_OcH5{a& z@wnO*>L6GlFFCI0b-4P$WvbvqqWrgsMrVUFZZkcD%?RAz^4ilbBK?g|lr9oSMfO`_ z78*qM+wM9mb`9ODOS%F1LA$|%_(;mFgSrRUFVxR6Fs#2ilAh|=U~~K9JG`$LS;ZBV zmH7gh%)m#<_tGP{%aj!yu>*+@t!!X(ax{Jj13whBmn{u16#QVdj6+2u5ewaP6?2*K z#HyZmj;JnrSkncbbpLY09DHhT{V5_U3qJ+|oj$QP^!ct7qFwMZ4&F({(kDMvFB9Jjc|2k%yR9{rxp6 zgFO#)D&EIW>TwY+vE;B9EmF{ak)_t$06SPwb`*nLZ9TuF8f}F6xSX9F7-iW{f9D!H zwB)}<6{h)8iun#-boSrH>6m(R#@`Od;>4lg{I=h|O`KC&JiHoPm`%-m&%d7y`TOXf zr80+~jQ5i=qC(+2L#w#7qvs|Ibrq;mO2tI1KG!DJP-WozY`nf1u*%oao;GbMyG|Ly zJVb9BIOu64rkhtbk(!gF%Il*rxa$ll(>nUqoFV7ro@l zSMEpa2l6i)=mcWuI+E?%H-7WP7ppz-zG_-uRMkjKG+%o1S{umpO3LOj8hUGjO3wdm ztp^#i_n(u-*`5!{8+;Uf*wIaOH`9}j3wWe78XG$RS<oSrYH(d)Nt6lcUbSo4`91ij{}rVI3?@qG~&x=ijL0 zmoQqDpwd~9v2I>doUTG%D@YQb9T$OTF9!iGlB9lCx2C5p)V-FRN4=&;e48dfVVF8S z|1+V^*i)SckMkm^aP#0vR0wGq_)oF3iaai(?JVCu8rMY^u!&99F>9u4qx;*%_2>I^ zVlHKE)Y}AaNUD3YR!nT^fZ~R>-rLok=uiTn&xas!f6z&InF46Fb*i;*(!ymZ=M}=w zqb~GZWo1uEt9!vx?p@#vQ}(iM>Z5-U%dktBV`bh8B_i7e5Xu*udAB@Ox5A`R zE3u$(UnAi*>HcdziDZab`bt`^(+{NKsg3%(@F0*v)cjdnz~92oi(T2nSZBoDX~~k9 z-6c54AG8HX)gJmW%E$E2J+Zg2@GP~xDtfs#;7uo?0W4=?u}QN^ zA@jZX17(GDZX279)Ord$YA-ZBEC+M^4=ol9jCHq6i^kirA|bS98n@0ft{q?*w?}@F z9)T%Q9@@ShTU~^J;3bcZqmiqm{$0ZFkL869IM}uq6pk?@_UxH=Z-F5safvUF*i=)W zJkyJBhg*vKc{c$y6}0di)&R@MwCRHK!OtsUWNbCT8mEkW1)uA!o+PeuxVH~iOV^cCZ&hT)#x>lG5^9AjzQ!+uK1b50ay-v+bTs#QyAt`9JlJ=ahE;9UBx=IbH;)Si zI8!^EUC*4Z;tyP-Bk2+b+$QUn0x!V_p4aDxR#W`?1~Udr{3E2YC%N!hsJR;a9YsNv z<4>4YR3{WRy{S?Qi`2G!N0#|s6|O-B3&}aY$Ske799Wtvy4?*f{s!>BG|YXB(V=6N zHjMc;Dq8s)$`%O^GsD!k#O9XgE;6TDS^zJK8fR&MM~V-m8sL8;UZbOj z|DczE!|HbKLT6~~{;10@z;hG30(dCBjz=1450|}x(37jX*~8q<6lG;q*|K!cXTXr| zBi-=!!!*ICQ9|5kA)${+3J3%P1AP!JXi3xU?#uw)HbU7$y;I}E-Ex#X(a&Soyj}Pz zayn^xnm`Je1sCDI@{-7wtmlfbW*+Ej8U$xb8{;w#clRT~< zh^vfp)gMX@(1~`;;}Vv0vEKa3_G+8WGGFzl;HH z{Es5ciIX%nwlu04zGheA<%2Sp{>Hvs)6i1>bU_;W9IR*%xOu|zL<{)6jTag!n^K2v z%K)EO5$Q?>*?D(OF{&)6a8mnqM`N3po@{XIF$Yu>&?KCmj`~V?U;Y~FqZ*SJ9eMcA zKWf0#LuG2XWASQLD|HLDchle0D*fD&`NsI7bfFw~uKG#tH{&GhJjDA!dnM-uY(mTMCW$n5W%$V~W?p8q?Ea+W(R-ynHkY zvdSFBR>pH*Bc}L6FDqIEBi_4jjpwRBymis8YJjmi%yPfY5gyd3Py>!P(g{m2ZBNV# z^T0g9Ge%maH({G^FME)u?kKmjIkdOLpUBk-kWYL#t={yvOxl{L?hPEv+de15xLzua zMUdOzcHoO+f1Fa7yaxt{_42m%L_~e6H_RMzxs{eQF5m$x%%(gdFnN zTMc^Xmui2sXa51KDq1+DGWDG8rO9f7Gonpan}s3hp_8rWT}?%-Qevs>`U<^`2PVsr zw!1-gk5>gbUdG+%99{r;e#kzQ&hH-&1)IGlz*$grwp_R`f?0lMa=ik6AA-r2roNPF=cWfZ|fp4Axwdkh=?t_?T)WGP1A?m{L)Br7pP_ z`om)k0A@%<*`Orrct`fgDLUbD*1fNHbW}$u<4zy5*a1%R-JZ2=+Q^51j&K`|Yl}Cc zTwO_LS%JpYhDyp^7+}H9ApjVdFsgh~o2do?> zSZ@s=P{1)hON;mJOX3q|+`Kcx&11be!I2iAKj1=m&&;8n+pB6F&$ofhcFCX1271ZN zui3FLB42GzQfb#HvTFNNUFnc7yLV_ObE{*9@zc;lorpu7;dQhdMP&TYUEtIVX?^L_|1(m{L!1vHZX%+WsnMBnt|&r!5xIT!^OwB=<@Md%_z6_JBRR(?XA;@?^Bl?CjTp1gx#G0@X-6 zY)+|C@$VU>WZ{$*B;fgObI)sJBBR)XnAqr5DFE)`g1Cco3eN6VJFcc`oxiyP;{v** z`NhTCF;?vN{gl^Hl*6hY2rZF&nkemjOq`Q6!E>kzU5YzdFU0Zh$WYhn6-| z==xtsv(Vmhg-cUBi+-J@Va{T9#~8ZJ$58vzt{uUU2XA=TT9PXFo;&a!yxV4UCe!nF zS=ldP{*mdMc=O3{2F6gglmJUwvy1Ouhxagy#WGoI;Mac&ZNIZcbR<*xmhCpDWMNSNgneeX;4Arr4kcLd=4E-})3VRIX;Z%HOnH@R2}c=jXTB@hY3 zk&LKx#Hg75Vv!L+EY5pBMb)1AbNurjV>sy^76J&N*)|mWcWFH4*!Ca_r?|5XN5oo( z<1)H~jl*IIiZIgMMwe!5AdCqM`)wM=rbb4x7tvxj_n;U_dk4`hTC>f&apxNgTsJ&E z%25%eM_mm@_M$FS6r7~<{Do6$S=gEWs)+pipHGh$I$sr+M{5NEKB4$LIC4`9kp39{ znzmNUZe0^ZG&i9J8$Gc0b7*wO>=3rxAsmqBrhx1L%71@XD6zp)*-AT#$T96d!rFr2 zvwX+z5okp0PD-81UF6kOOXG%*Pwq?9E~iW)CFjZ`fUG-!*bFNW`I<>VCrmS)ek?IJ?(rLF>r+l`_h1mQ!o8(1$5oVK{Oa?#kSqj<2z6@<1V`!pe!)U7uKnhkTx-`XxXq7+GO?PD2!v!(T89Gs>t-w3X;g90 z%b_7aQl7BP7Zab(TDgspFkvEYfA`BJt~Lf#!=1$3y(L3OPXa_Vunis&?=)ZbX%(q1 zkM1pNyZLtghdDGR2XwTH&@;|-<%WiNm)kI^PFQdZ(5q*jN$g?i7FRPp{}ZuUkjMU~ zg7(^~RmC3MWb#~3o9S6CbBoPb3Ett?>~Q`u4NFjbkbEYcu6$7?Ozbyme)Vc;_Bt&v zuniNrWy@*gt++~5+S2>%?A2G9A46j=DZWh1c0;p=wdYT<*jN?l;K z7(hHziLaBrl-0&C6x{11$}N+aZMU!)2_P~aeOVjG({Ry?Xw7@^G~e{kL)QjmnznzZ zm{t1yJ~kmr*~6$FixO4|=)oLNY8~ED$kaQIwhMCe0HXxsL{j*XC2&o)g43v09Z^Dh)vW*_quLKwtdwtM(GTn7FPhn2DQ z=*|B&b`F?>LXmIANNii=1O|~N&4*nKK}I6N!sqG*YoqLdLec(7?p*+Q?e$W!H)ab(o+?N7yv-$wI&oSbj;@;Us3D4E1i4y}XjzSG zV~ul3>z0GcjGomIOv^2%j{v(kBaH1(M$qm?)_mTJ{~a4|%TxA|T8C(4uw*4E42L`# z*4tof>F9{LIz4msJ@R^CE&_~c$W5-t0PYGi#9+Jitl_47I#abpx$vLEA-0p5X z^B9ALCa?#~q)@2Dt(Q2;#~aA2Pl;v$z#Wwbmj`#<UfnCw~ODU&||_X6V^;x5Bx&IG)`;NPKCVxTIMcs3Ffsi=ukg}1+_IZ-v&wS{`u z!4Zb&x_x&=R*|;=6^IVaKSBvR#=u&xF7iHL+alN&khQ-gL%enw_FuWem;s|1{|IgZ zFtL(7yq>eU+dQ67`yf#4Ds@tBFys3eM?NA?N+;m0mRZ>y(T>*6T^Exg2&_*T7@_+y zs6e4OA}%av_Z@h`P7lE&GK==jay+1m%=_*mkv%p#a|1jpZTJI}%VV}Snb&m37kg<5 z1HHOh1PnNt!#q_{=iJ_lPkl!ONTgGr+D=&}e)7~yRLdB{RCWjzcPr>yRUD2HQtrcx zcSZF8Z3XKegVCmub}W`qeYz5*Vh zIS~~#-SB9W;P$BsYnq(nnlc}NvYh?!?=HwtFq_AY2xiDZxLsA>)WnEF6HWVKfZ+sy zGV#(7?u${*RLo)whH=ZpXK3=J@yk9Kudr=mix9$J_oO_YYZ*;>R$pE1kQ$af<9zd$ z?>Oc-CaS)O>dk1a(I#P$L!A6Q{d1%mu$AABiE z8BYzc#A?aH|Bs*PwOX26ZmQpHE+Uzrs1`GU**xoP`0GVA&@U&}hP;=~Rnucz`v*|a z_-2n;_?DqC&aiXwa6UWVXiqvo%vhwcvEscT{>3jj({sU%-=l9Jft6>6M0WWqma}xn z2-p%j4}0ku#O8&kd}7~9pL!NWT&ZMp;jpYCoRkbGhl4#xV+D(m2$GvW@$tXV2)kG6 zhj_U3I!aH5yG06qguzJp&R`FA=0gw#bg`^=ZNw{$6vxM3B)uL))Le5yJ&*>|?AMQ# zrimZae^v;mqEglQX^V`Pu`i^V)m|kE|7obAleEWK7F4&-Tj&S0b|Dfxou0l1u|C!k zl5PoWs{#h-_FYZFq#_j@3A!IzR}x-=Fq%`Hh4c^!i?ehLAxr&cg|#xDZ5IIpi<4~^ z0G68m&w|g4DSbAuxw(lCM=#XxcUWMAXj+_>EJ)CcBgb9*!aR4hhGAsNOOs7v=3~d5ZD*MSLD7O+V@dO)S`A|q}{C*sH+7TgzoS& zPz&%SWm11Q;+K1+?bJE=vVm<-%__a84VognW;4^#+lB{tWWNBuB2* z{B2k-32ap5(D^)jFLGorUDMo}!aH<_G`yTBkvU#G)tR0#a7d$0TjQ7=KT$AU-IDHd z_KZ8F-OFI1o(BcQrcp-rxT7rr`Uiyp`sQ(hXB`hgizAc-qIxC+|S`dn5}$ z!1a2I4z&=&5{qDjMaJr;K79T1WRzbmY_DBYg>@aw9nT9+)63)dXB)}pP+75KWHsM& z#~FDf0B96EhkgQelXa%`-rn=u%$u7jNv-L%q40q;@E7j-r`S4*ZcR{V7`?Q=l&SR} z;#0LN5B}SP2EFSmsx_6fLWdTXo->(W|F#rIn|St`Z%g3c?PuzHR=VV!OhlQXGPS9U z-EJJc=W4)r!b1O4vaTIwXU#9QZ6FyLoecnPiMJ@9??Z@WFQu6VS#U&{RcyDZSdMYY zFpH7+r*-oAk6fdc{XceU2wG)6J(RO1%smoG#?+=a_j7iUJR;+r{J@0+c$Pz`CeFCu zM701Qk{O_~?rN|ya?WjFknp+we)r>{-7O!&8y5p;{kgfB$B3fx3m$;1+AXZ3wF~WJ z*&82(iO|`ml1VWunL-o+mQv2V2Ntb$zN&_ayr51y2Yf&6?t&Rv?Z2XS-Ms4X%(Kgb ziWKl;wR*bJN{|>^|ICZj>5|!}H)Cwo_vyI;aB!uDpSQHXMmqy8uB!_mtx?kRYlFiB zuC`4*kk7cMZ~fVQ_CH7K?2n0MH@olcv5v~B8WVn2kWHfDgoILg%+x)0$K2&vWuVIj zk79w{*4EyCv<_-mnlg*+Oxt9&CtMFvmiM}cnH=#_BOSeYnDx3!J;#ED1d={xQCI7@ zr*}LzAZeN2(DrNZG_)&1T7S(D^ekG=h*_gu!N0F`r(YzrQ19<(ZdY?#n@O+~PLPCD zIoJp7y!1Hlv-cFguNbPYqpijBs8w6?J16}n>kQ)NJ}^F{#@y&=B(7(ru*GZV)M-v~ z`gVVP0v91ZVRE0(*v7xVtv&~RR8UG#{Pgjg>Z-;0BvR^Q1|9m&8p0no3;%kl>UZBA zEqCPFFWhMWt=lLjG6T!BSf|vCRRk;FziyHU;(6f(gPIrnO*XUPN?8r&=)Cs>L3POW zN=9+kFUJ+1#V~{w{&V@*T=a6H-SOaNw5hT9Beu==7$}AwhHWL+a8(*{QP6!45?rEs znMFIl*R}c-&&LaYi8ZX>0oX%F@ajUs`KxOdSALy=OwGtk(5BNg4Q zF?A`98!Y43U2K3}D$4^L)RAvz{;j*ZxMIH-lV#R$VU5&SvKP51#=^bt{^qe6Xe7ge zZ*hL;;RfDEk%}aA2RItBma+A2{z>VcnI9hHV(PGe5U@vn#h0%*U!+z34D>~|hKljb zfDpkCtnVzEE8N`|8hrm5A4!j~vj2V^8sl|jVH0BS{+CI!)^wnILmife&~>MT53r|}c<&Ju6i#_My4!8*Z2mZ&vqnI5dQsm|L!&Io0Ks}wyYCh)aq;oWD zXUjsv71kMX^V>1god1P;;<&iDurPGrVS(pu_mLC1SRbCSO1-KH z{`=UEK2mUAFK%69f`#x_{2Cb>PR+dmK)CEA7PI?xq`AJOz-sk<$f?} zkjC-JGvz(^hkl`gTqYyw^2-KOg4(a1A}_O5rdn542bX^9r!K9*Po9C_f8?aK6IV%{ z+&2$?DO9#^iMR19K;+&=43KzfuN`YR>AcU0bA96lyJJPTzl}NsqSPC}&2L`(YN)Rl zaUKR*yBx}7xRGX76 zW@lo{SAK%daM&FCJ)yW$JOo&Ny*60z?l`_}A9YWe(Jb6;ysd_ho>uhAX@ z1%`A$gKp)Sd(lJ;nVBP_3tt)kL#z^nZ8cD>rI2i~iKUs`Y1`S(q}3sifoQ65T- zAup6tR)l*nAoC3GM+rMuAgN+PIrClpgLkU4M6cgE?&0APco*do^FE9AQO>(ou1z)a z)w#+Np*X++m}y1z24}KndbUq$#WQdq`nFoBU3IEo>`AIhzqN8c24OPmY~K(xY2>}) z3A&AyP|i06?zit4X>YXaXj75@CrR_Za7%bpyb1nY{r>!! zfsN1pdjNIGV+_d3t+fvgRHnR|9PKi)g!)QL9&kwc$sqGR`13}hRU&djQB_SZETd#h zFY?q8I*8MDdLy@^QQLbb^e(r#&_kH|`<7~$yXRCL=>x^DIA+=XLFl?dJkzn zs2M-YoI%4JnF4BWgl%xt^E|^Vm?n{9>qHe6_M}HZDEk!zHd_sf1AhbRTH6H@2mo%p zQCw&M0)u#B9IiuQU%zjAp}btlVW&c#Z@pyD^~9fKR}@x`Xh%SM6``!J2m8NpV7hpv zf&(fN*@$DI#7R_i`iSXXH%AZa8UDz~B|kfR`x$3((HE$(D45TEKMUFLvAE)FxUzg? z&5P0+nTYN<8Lj?_LM_45qfGY5pDdmEFDzvKrLQrS2l&MLsPqQ}(nGLU4$0;3ao z9`$~Af8Q2pUd87_@Vq3$=(gKjMTB0d_z2&um#7g5JUONx^!@ew5eX81tNDPw7wFZ4 zQYs!DKC^!R2@Hy2rS6jf+|I{7aCp*xnY~U;VAmZGsDIGAt6! zLBfs!buu9UmbN}u$a?F<8O?l!crMBpP-fA+_s%Z8#V#zLHXQ5F?sVm%Q16%|tZHCw z6}!!2`^^Uf9K1-ERYGD+>+}lycTKnATwwj84?_ZJUZ!wKQ~E~IC*|a zi&9!{a*gd>LyM-;w3hxo$WAY8%Wt4RU6uq^A4z#^wCWTHMR;QJ@1M72HLC?&Hauzh zAU>v#_W666RBXM)@Do87FK=``_N?6v*n{$jd0(D99JPqq3+;6BaNEm#Kj*w(1aLUV zQC!5b6GJli#4LrJ;onWoo%ep_5ee!AESaVAnO5^}Ea{~?OK|DyQYTt*#BWd{7r3i; z=li>PsH5e57y8a4Yunluri#WMpcD2Rs;iyzZ7F@XBUh!DJ%99e4&JN;y4b%8+$&Ni z!2bXprgVH3+bdZI%-I;BpFeN#{de2l?~Z3o5%+RE`*p`XwDa-v=;IQ@Dl?qGZ6ykC3luCH4I6qhJ!#B1Z3+xvNl`muM6#n*yQ^ zD<rGO6J1-t>2!Qg|3erai`G^sTHIm2b}#E8T|oAXjs zf%3~7R9=~sHY9?C4Pdm&ndP;iXm5UcHQaq_#Z7{n91zrJ5nRL)nU`^>8|D;?RizL$5sp){%~VN7U#*mmz{iYrBQ^Y!@F zwYlLcDeseg#u#M_$kfr%aXm9bZu(L90X)7`b~Oe*r(roV?1;Uw2f!)W!f$O|&d1|@ ztAXU*JOC0}H~A)=a%xU4Zu^pZ_vMmxI;(DrZUz{Vhv#JAIxljzJ%T)pP1%|KuLfa6 zp-@-tcMCNry3I^Scz4tK=7-AU2BL1F@M`;o;D!0cTVl_vBBRB#o1b%-HlhD6Qy9>2 zIZB_)L2j5Z@2y%MEOn|Yx4BN|Tpzo*JX!f0&uB?OXu|Wcz6(jl*s=Nd0Z$Q! z68zcXn_y26=N_n*ZomY%XCI1G&Xs_%|rZAfv9Mj?m*()1qw;$fAdauWCbH3emOclRF7 z+DTVHbz)4S+*}TYg}C?kyVmp<^~x_0$k2NzU=VVY|0b`S?eG*;;cMH_K__b}Ro#$M)x~b`=+;-s_lgHH<9>@4#P7%7a zrxf0lPlUNrJJeyxtJp2(8Zuf0$Tg}6afe>YasYcoNrEQ@;H^lJXQoDE%f0UJw7xZ+ zf0?^ejxgD~GOx}Vig|y*-uTt+4sAGG;!j7Id|(?LNo$7i7V&S_@dt`AghF`cr3O$@#(O<+|s+* z=Y20@8+_Fm@Kn-SE-a+bz-N~1!5d9Va%7FDB>lpl?!tFz@B&AUaD+@Q)i+&5dW7G* zE1J5uALQT<)rZ52aip~&;p2>@6L3RWrTZMXEGQ~Yr+id~I*osSftN#lw=M+|%7T%y zIxK+dRzAQ)e;8)Ye>C}&U~uP#IP+z^EVb)vop2hIAWl7nt`9{V8!9e26>yIW6LmhA z^jU{za`^u^is4>dA;5Os{`^{rx-Ms>C8VPjcI3D_!9yl zQyDXTvqI(PVmr+&ArixFJlV7SwYy`&Yi;_gD`fE~(Lky?r|hKxR~JJF zl_4vvU56a#;1{mNtG=s`e)_=4>HSI)GhoUK1bY?RmF~c0AEDw?JwXI4&hW>OkyLjV zd#0bRAvIjY(Q*l6Sz{KG@Zq-xllbkAyR_Vdq(8w%*F;j2k8m(6iUg%qyg?A4|~sDK-a z%1S%d=~Wv2iN7)#pKpd24KN8J8BjqyBU4uH7kiRQ`Y=9AraX!|H7(1P{tp$OIGmg~ zw%UE&$?H|(_R%Ev;jl#tlkegopFGiLE#By{ zmWr13DMksvVn8{1s4us6*;|37r8ZeaB9RS8kNlho){;vUqsh$DGsvd>Pv>s7nZN8h9GAn4DE=?Bu)GXCa>QF(NgN>!~ZPCh|lsF|CfDM!Q5<*&jbp9)?Fr zH$Sg7k&7?u>52&a_nA<0DiOH&}{2LdGW2dOfa_ z9#YDoX<$?I(fM2XOuA`0F9SY`DEJNk#2_Kb^F2QHRttge((7RlWYcWch=dWs!CxYT zGuHf#n^s;_o9u3xU>>9pb0J7FmEpf( z-9F1JOE0q4%y^+YrK|6+EdYivof4le&sg{j0Wm@j{<)w(Y4!|xvP8zS4y-DcBfnq; zQrRD4@IA5U3JyvRTra~^ucS1O}qQS&s-B5|zXx=!o)*1*68 zndv&d-?(%eE$pzW|LW5s5Jyg>oJoL_DmG^5^mJ2&%aom-m{q&@C3SYg6CQRGw~ZiF zqC!Y?+;onGC_?j4VKQuhr&{)Xl+;4TJF)^Gv*LCVjp91O3!?ZPWZ92Z@ksk#bd0Vu;jbC;ZcX z`jka5pl$U1|o0cz^0hoHX~v;TdhdH$j`-c8(r!3!pM#dD(PTD#9l-7(z8_meD#{BULK$2H;ZE$T7Ky%8aUw+HZLD z%j%Kv(HZAG6vNP=IAW2Q151Dn)bs?W(!ma5@`^2T6{!E(ZC|BdYelX2d!w;IRP56} zI(|~&v=yhaHMDh!BIUU7&DtMQI#Z;4KZYbsHx|oUnAcuqO5T*JgB>-)_j{6HfP!fw z>%x7v_yU@Y&gh`JfU1b7-ZIcA!u_}<%%D0*T)sC^(nx%uEzbKa4-MQt2>tvb@wqCk zrRbtcyQwEa(~PJ^9okJ*j}^1odwv;z1N2B0;9bW6U>ByrBrz!Rws3byscHc8o1g#M z$3lHtB)2bwLEM1-&=l;Qn4Ck(snQqMWowfQJ30 z93I3!LeOC0=1k(G@vHY&PtxD{=g`jo#Aypo=-JS}nR#p#E~9f#Y&N6W6?x~XajQNt zC!=N}90j1pqx|XyGyGqb!LQY}`NLgJ4>`S=wAQ=HK1;|AF4fgm@LH&#zs?Y)$ynAu znX-c8jf%V!Vd<>~uXV|;|Acji0?q9C$nk}Z@An{q7oq?w1bQR^UZ#?9>vMbMqaU?` zlZ$QSmt(=5y-IBkzBzbJIq+(r<_WK3O?#yOAv1?4c>UK@GG+Yb-QQtDJ$K}ika*)) z3mxwyaCYw86TBA&PAr{WbCYcSi~&)9SZT-Tp)aLPqPFIfnL|K%LORo1Z+ARS79!1W z6)=l2>|;%~$tf9?&cRfemby2FPtD;$6}tkx8yYBKUV>p7&b&%sK} zhd$LANGpwKh;?w3n7x3A^(|kOX1T^j<@E^(7FMQ>SrkoK%zRgXm_(s2U5*Z-t9L8u zqUEvb)1@sH=m>_FVTozs;e2gFPah50giU|3F(s`3EUBD7$Lmh|=neBkkY*V)Yj}Co ze!h^39yg84mPXj1Ve`K4?|t^iBysnpxJ)b&0u2teOv9%)AP6UYl5&JnSSF zP(fxYvq+-rmm(2sZ;Gb6>{Iu#-X)F)1m?;7|JGm4y$?pcQ?Rg1?*1XLVRlcZ+j2p! z)wQU(@M6QW69%xO)_|#Fx})7{raq*Rq2GPvx1EBD$@VXHXAZ~plPmL{a6oDvLlr8- zk^qS1PBW9@^#6+#5>#$%Y&Mqwu-9H;+^fkC9G;;;v(-)pk*KoeU(QSRr8{l&Zz~-m zcyIxOdkiuPJ;h&px7F72h32>l>f3}9Q2g%S$_Y$BCmlbu;BdY=@Im9MkJh`QX;T5J zk%INVAOyL7i0R4(xm+N;p1DBlnNDoABtW=!Jh>+Z%gcl2`-Q<70#tjclg_T4CeFRg zMU#1)fqN97)^I3!SrHu;0RYiWz-s;;d&7BIVNj2+Lo;RGtm7v#)%dAoYi9G=uH*h&;|9 zJs@XP1cZl}0DEw4^4Trie-l-Ns<~u`c)M&}VFAVtWpl;NaZg^;QWF^QO=~2VihK?I z|PH2n`pp?jS&gsmj_L zhC)?WSLgm5tR#xzy7?yB-^$*C%ZZ^oS8|y+HKV5rR>V|k>dlQ5y;sdEaI%d^2%t}l znECBoU^^q3ns(Q|+e{4#^7{LXQb-1$5aBJRjRwnBWJeYGVp~03qgGJu*dmf|32ezq z_ek=~6QjFvn-;0`inQ`oEyRiSKG%IUi(CpJellox@U7~xIZ0c=ulU-JR_p0|ZU(6I zCKFCB=X)pubC#N|hb3(Pyi0Sj0w>~3y%lT`zR!SIvjvy^$fT`C8T3t3*y8M&cgkoe zYMui#^0ULjMLzRbP|(KcV?K|X$!r*AQ2pCRm@4B^NTQ4F>$Qn>9+|B>1^8&wswl1f zV&(2aQ7~0Qt1FyBWyIF>ZMBzOhx)AsS9;<*ff2t1im_oxj%d)WCoU;i4H24ajsB;M4vN8iM}|EAFQZy1j^{>C}JSw(h22-6sYQxO)4 zNcE0|nUyK`4BLv?h}Y1+O|3=BjYwl*+0Tcmob}aZx&dIabX=0(oPUwe0)R<~NC+eV zLX^n1phOTtpuX=Vh7c5bLsi%R+j;jtySDv35Pr`wzqDC2{}4ksok;8%7>~zSH|_i@ zopXno9jU6fyb>EriT2vCwaZEm(vy761Q0Q)D*CRa(P;d~O|y8Fs-E+4QdjlA===UN z0Zc6Mfz&xpQ;n?Y=W7HkGL@z!s+0yZrXqzk ztZ|V;i=y~!RXOf`Q95?KA{s=~1w{L<3*nk;f4sTrrkn1}-rbw9CdC&Bo12?gh|2St zruj1Oi%C%wB&pVF!qPJ?N$S!cJ%_e zCt98XONzaG;f$}LEN@wuH4|tILXvHen;40ae8)`0PKlVCW)YhC{0{-#tMira-8iiw z^!uv%Hs|;aQT2_X>t44xo&I@QmakRSQY3EmedlA0E`*Lmgv69mN!2D`6-_KporssT z(P&l*>_LYLVMNM2Jho#1FsHs~xxi{AhpfCYpsFGWeNTPpDTbay=$(oLBD&2v_gD3( zesQx{{JN^XgoyvIcka*Iwtc-sd2iQs?b&y~iqUBFu(nxzq4&immf-0)$yN)&{lizB)_8&xKP^Hfm>e1-&UEe>Mna3bv5v$3_j#DnQT~}u9 zsjc&M4@5X~;yih=n$RE+DHB71`vQ1KjNzf9@#Lny?`~hK#%ru`VK5qvuMHtQ&N(+G zwuoEWWQf=~#L$a~cAev&#opd+XMg_Qh9#?6ezEg@!tBg}sLj!a zl)@~QErl~ALb)4Hunuaen=9@l4tDi^Cv9MXD4vIAF#e4=pfubygiTI9_CvV-~JN+*KynT7V8ut?L zWHQ<8`|jbP5BJ&J+^m)8kVLtz>)KE3L%5m=V}Lwz9!}a>nk>OWj8`fHMtTXXX%{=J zZX+y~8)W@dm8=p9EM49veJQO6uzY>&d+*;~7R5g@`?v4y@19cC{i5*i^}cxbd_Lb@ zJ^x3G!$*!h<z2n91drU-7R_ zpWc1>VzKzJr2Ot+XXntr-#<8bJ~JI=c3#D%sRW;0fU zy~?c*O(`Q3LlA-fW$63A8ILBvxVN`^D1fq8|ZSypUy!-6W-`lXlP}Vpf*qBToB^tlA>$<0VUv98tO$#2+{4KK2 zNtu!9wfx44`&?ntN#!+8oJ*)dySAmx%`Ls`=uxz7OCn-yIGs%-d26yV5i3_ar@Rs!bYutN5 zlgVTpV>s4z;kZaVytTPG_TIZFI#JcbBJqk4!nFV{4>4{5s0i>XLSW)lufeNr=}e{? zGXNEUgl+rfNJK3WpJe6}%)HCYZ)0{hJ4gGcPMzujES%$8ob&H1isIJ&{r$xXJ-ypF zeE7&`o;-QSFH9yIm)j`HGsof7!zjueJ*VL(f-F{_T$S0O>soYe+aEo8-%4O zPbjN9JBPo1|6uQXncX2~W=fSk2i zd1~%^=riWKm(D$19j(5epCxvk7DL%O9Ci#M5+>$Tr%rZPTygnh-v0J?T%XUs#y=~# zqeqXTX__*|FqJ4_(~=wQL*7{Lm=_WM1V0+ zz%*vg99PacYMKRNjI+X5k8hgU_4fp6+}SzwANKe6zt=gxLrhFr8BU9Go%70$Gylz# z@O+)f_9GEvfu&E_J=ueyq>fsBx`8Oi&_fk(BElP@$e&eZ`TM)OyC?67`&?s<|DU}- z4YVY=%0tm_MP%;joKtnGx~r;N1B29n0D~|#lWh!-!7}CZ2h>OQsi&WwzVVGUobSP`+KEt17z@!e+lW3%~UA%di;mQsSL;q2@*WzAYWXHepJ&oizM946#~=IRg1b!o|{Yqd@h(5;RaxRKmoHzIhaP%J z0f>KpDy1FI-YyaVcK6+vKI!V!NB{Y9wRf*T)WeLD4>YHK7I^iAc&BvCh_DFoo7N2wRY!duM=N zd*K-0$JHEbM?d(?l4{=%mU8|bf&Fqn48J&EF2CpcV~@T5UBMXdXh%1r!^6XUk$hJv z{eAr~yt@`XEM?deNiEFQv-$kxP1F9?-f8ylm=v!v<#dBu!8Gt0F zLw|C5GM~+6KX-a^_P+r7+8dv{6KS{5?(IOc+5AtM;qRL1A8y-rE*>b!+0=WB|wl~=Yj`JiKhn;oMyDe@$dBlq;C+oXTMA9`?{r1~& za0j?J@DFaf%}3{yR!Qnc{sgT2A!Zi)J&W*o4nw_P*ZH!V0EmOlZ<2f=9u*fiWanK$ zX>uzNy9mSkNlG68vkw69-h2D|4{SD@C*A2|M?1O`>B5Bzd$V@-;VI`o2f?SMl>eM+ z`O~WQi7Dle&pG{(ww--gZt{oboIeD>3suWUsOle?&lmUZ@1K9edVTg5g@c*u1Iy(K zUEjTL-*=dAn!$JeonXmHexrTz%LbsjT-=OSkWE8YLGfx&hBBy`#T=*z-wTn%g>u|3%cnhS z8ER~xFHZ8(lRTf;u{g4&Wp^m-rqbUtF_1~5X|inA>wa&4_3e*7diBA#M2L5^qjzRn zE|>4K-mE`y*3R|~!sAoH2@)SIhDf-`O9V-oLqp3P=`-*>+U;HC%u zlu~+0^6JHW^$36~r4$j7`&X;wKi_ON-)&~Md|&i;R@#B$+el5@etMGhMP~NGb~ejE z%7Eo+Kx*tl4eyN`v?e48V-lX-xWy0#E^Om(k57(8cAx`TwR(zCif`R&F*WV8noJ$v z{jZv>@i)E1e9*5?JkL?IFp2Sl+h^4UMV_C)k_aRv>$=UbT&=$I>eZ`n+!?zaJ=1Bq zTD{-;Z2c$N*?ix{A_kh6L_k>xAp9umI=#cY28bmQ^nHh>$qx>yFN4`_0mbvh;=}vC z`^Y3|H9D$84+VPV4*+7OzS)OE*_6EOljVX0_KYPK4wD6{d>De9eEc9O33AE_ zz!HM@PO168l;!=*?89L8!HeaxUG485ZO+~@Z`h7@^v+0!hlkC4wtQjH^4U2zpAN&P zG;Q<8VfX_g>D^OK`zfa;=bUoRNGVB5DZ51aR*#kp$eHV7Gk}Y#`umEO7tCh!tE<)W zcQ>2OO}B9zhT$|NylNPR|GBrf|Fet5-j8lJXaCt}Xx?RL2a0bKHBIx^MC1!3rT1%Q zGlt+9GGQk-y|-#|9A#DjOh`+nCkm$3A>Fw2o5U*uBqQK;U@Vw|Vl5@6EHR>Tcmzf* zgVoq(KZ$oNWHpV#J&CIcAH6@Z@{bo;ej@hd)i#U^ZIC3{rrYR>p!f|t1Gl4RIxSaw zzyI{~^pDTx^F0TK91x}?M2#V5lyu|3kx+CZ{{|qXWPRUB+qSPM!|)%??6w%G#bWuP zeZTpmNz&5y7_P7#9{1r$Ibw`CmbY;|gCAOG9wO#iU`sm)U@DO0m1ovI;P*DbWJey6 zSoO!P;jXBb7o?m&NRU1drhgb_A39$wmaEmd2REBrzg69ic66)h@bGXko6SGi)c#7! z?O&3FPidRxlOXaTDd#IG=XuUaa!TBxi8C_U%(#;ckX030RMb>dRs4D~fu@vlN*MsI zXesy2=5zFY|H`L2EN2*ojjI0cVljW^+1bhOoSvSZysOz`pQgKQ6e{suigM0>2f!Dn zoL|tiZ5BaBEU*FG2y*2buh7G5Hf|X)x$NMwT2cQR6OBwrLp5@*Z_Mhyc!mEkI}dV{ z(SrpGKh>5gyRi=)JG;FW7{ndcT)k&J5@eJj?iDLMzr$$t-3X5P5ol1+yo+xi`+yIDCVjvDL21kA~*H+ye;I1rntPj9*RIO*B>{euOJx! zOp6Rd!7vn*Qdn?0eMg`VfU#J0!N=pB5 zxwrbfl;tm_oIa{)XNOJGO3v954;l(PDG)$QF)c-gGDzQdIt;xOEmDR8W3Zz;sdz$; znWAYL6_F2EpRGT4wc2}c0L_i%dNR6p?b_gbp})%+<=gEk-Ud|f0+e(9JdyPIxoO`$ z=O(-EPabs;J5D6HaS&_;<8ls>ZkFlxXFfwhR|@%`o}4N)+;pOPqzJ(IylRozVyXN4 z2PkC_wK#E(fVSGEcvqAqCPCftJ7(^Y95r=RqZ)XwB=m=?Qy7$UPwEy`kaCi4v*`~G z_P*oMM<3mJig)ykr@g)X_c&YoLc1i1JIqj6K#3XShQo_Wks1>@rJT}cy|%r*)emge z>)Ud~Gq^*}hi$sijus+Z~z*{cB~MLZbOiHLANazMg4FlNGQF7woL z@iM+*JpG5Gg$UIW0Yoh2Jd>2J!1VodlRr=dA6QgBRJD9;)3hJB+S^+n9PD2^J3D)q zSSYlkcMiII`SPr7+xG(G&zjk1G&%qIl+&M^wX;viDgVKyY2G8HJg0ahh`>Z7yS(w7 zb+_NcFrbtI^Alqd*Ih<7*eFEsVP~(^B%TD*%5GdrRz4>-#_@C z&F1zT@eGDfd|2OYJ}RZO5Dv^krt1XKNTI{Ceg)tzebK{jGfUU^fn3T4_ev-3zPe5j5GLoGl+oHrSbx?tD) zFqaQG*gyFHZZ@0WET!CZCHd2(#d7rry1x5pk+kxuorvq@KEp1uU+{}*=^eBh z@0)>Jx%n&+NrW*~@c64SUr*xt!q+3Xdh}pr@!2;n_%ra_Z)T7Zk_b{tl5^gJ;N7(7 z@5{OQfF$xlGyAY%=s!kP|4=)dUpUx5|M+@+db-m)J9=yAo_p@OJLUXB0G|TLU!2bu ze_nt;opST1X7l;Sq$GbJ<>vW0rE@vw#L##S;#4*H3~CZUAp%oPMO8{sDZ>CY73G-G z<-;Jv%`PF;xuwask4mwDILU>I#|fzFY}U@+Gz|SO->%uFJAtMR_?D6Yu*1W{rWF0a zZnOUIei+_kZ*T7qkcAnFAf0advqziU{B+wce&O-QAH8;mDjYdHJj|sGU%Ecq{I%5N zXEnL;m1Q1{7u!mB=tD4Sb)8JmE7Qe~2>%^#`B!lVOBhd|uM}|)3I&PNm;eNQzrne4 zhj!`mC2TeusHy-EQ#A0!mo8oY1CKoN@PAyb_MR&#ixi$5JH-PCN zJ=72!)zf5i0L)57q*bgM;0=ag@m5O77v%-Mh8Um%r0vHzrmm~{0zlKzW}&-0%AyvM zSUaf*#Hbw2c*4D@YJtdE61*;@{F>wAqeoN9543IjoAY`53X$}>M<0E3x2wgDaCmsw zwC((IKXmsDegE8{AKv%ET^H}|`~I@2-J?a{Lo)6H(o#5M%n(PKLg!Bt0GX^T1|FaV z04POGRZY#3nfVFJ5(YNHB|&+lE7%=iaNZx?!F+_Uz)`nB08{ISL1Ff@UAOs50Ny1I z;&?hVD!I3Umdn*gi&lY2w)@Pb z!@>v{v(UQ11km>zJ2-bA@pR?NJ@5bUBM<$+e7=0Q zoU_#hE)^wC29;bC8^4Jd;|D>Zo*W;g%UACGq@(NCe#95R+;Td+aPf1FkB2(o2(zdf-oXuvx2{hN= z^F5z?^h>|=OS{wc?m)WlzUQaoJKCNxoUZy7aB^S|btKP{#75ji(|BFS>j zrlyioqJNU=MpQLx(E^cI<&=IYrTn#zKmOSLcLL}+JUm>e;>D+@$Df^Zb63+efiRPY z7LaAB{rwlG{-)fz_0upeIdO*)zZncrhntQ^N7>+gqUiv)Mt6t+Vtv2C-u{7IxpGC^ zQ(WK3fv17zY8l+=<3GG;b+I@#K$X_fRpc`716uCY76y=j*+Vfr6O3zTfTn5nQaat=+dF#n>Z5N0aR02G{m-V&uNO&=Km72+H#C3&Fvy%_rY`XVao;!E%ETuhxtqgLH4&^-! zb^(G}N;#7)VM&rPq#?zutCIJnF;k(T^NCeJO^d0Tlu}X*^s2?C{WR{~Ety;r{7tI5 zfyraAI6m!ZT}(nyY+}DDLv`{zFT`s3Gr{Z7DPw}YmdW_s-j40ZA1#rgH? zkN?e-@?UFb^XE5B(*o3*5aCoj5WtV9n4M&*iZT>UDg75U{r1z7lOG0fa>Fa0F?4u% zxG2TG>}-AZIXS0`IXC1xdQ->tW3)i!+&Y3A*}ZCLf2IP|DGCMLA410pv>v=c18^fK zRzEt`JOZQZHnO*WpjWP3k-qD!u&=~S%?u32ukUwhjylkoup$n2-9Sz%IswIF!HCG6 z$HIJZW=SZr0#Sp^X02Yo{&;uk?n@u{s#pE?&+kC-j-Kgs<;uO!dHCT6e{8whdruKb zK7AiC`!U=^$i5p@kJq1oc;`H=b?z!h#FM89P-td!8bvo74rNi?V{>Jg?@z>^@ z?@B49QK`6tiXVQdf?#naRt>Y!jGKghniA8S8B~b31>OJz6I3vcEd1?MoGB%VF*)r^ zsIBq0VY0FaBa#mV?V8pcAdhMfu!zg_avESzE);~Raf>}*FvF1~c|?FWh{$7-aC&t8 z=uB0+oYK{%ZSQZ}*{|nW`v%MT`05+qxZVMfw;PRS3BaXGmvYlI^HR#)>-G8r`>ucQ zV)~qO`v?0-X(hm+YI%1+uH>B00ce8tQ%b(}#yN*xTQVCNjP{a7ULE_0nwl1aL7_#V zsuNu6yz1jjN_&;16!!rNh2Ix5(_sFnVCW1pjX|XV40(!yVSOo|DeJS-;huZ${pdHm z;enU$?Cg`%w!*pz?d|XX%`%iP&N)A)XIpqr}XSWy-Zj)A(v@>;pT1Tjk8(pX{j_zDu zT-Izn1&VoA-3_8rCx0i65c{D5S5>tnB3(yM@jX|r$foN|OHsHmnIUb1Vg&vUN#X`Wg<$el^Zveg2b)nPE^PwFVSC!!-Ht4uLr9VrZ z;c>m|u!lG6J4=;+K$j}zn+B5!Kj*=w67|4!SsZ)%$6Y#4^kLk~T4 zTl(}}f$qKcJyyeTc9-dJS3eBz-Vgn|Y0-PM=)wNM{$AU*GXoB+=yM_Iike=?IknOM zIcJy}Qcg(=?J~ec0H&5J?hU68+00x9k~u3BRWU8_s6b#0ue1 z1ZaCT?5~;`4QcSV!A#V%9fdHIOO*+v7@z_&oUKpw%H?}L=8bQB;I`?JXF824;wH3Q zE??Mn-M20ls}E{tZPHRQH+qMe*>ndBgX0`mm}=hXBBGKKN*PRx9s&3<2>$uW@$t_9 zxGf7uZZ#bo+_e(vzx?cM{aHEZiz%hxRY!~>1`aKah;rK~nEOpl#3SuFwu_A&h<3x% zq0aru2NzC!6I?Zqi+5;dL%XZ0y8K8Vp!lA9u-RP#NQ5Iof6;NE(p2#C( zdM|><8wdDxBja{6cFOS5)WNQ%B%*58wk@td{`lFY%a=ak)vtQh&+S0*j-Kgs<;t@! zJp9O;es(cmJU=&0nuII??#)5SuL}xXc>*9{gb7lzG7PdlJJn}B>p6eq4R3h;Z3{0t ze|X`qpAZyZNGXX=1$+5i5xAy;8*g44fjo$rD=-dl?OMe3ph$oYe^`tFz+VA4AP(I# z`RZ>KQ}+WW5iZtq@18r%+#5$w5DHe|gAy-)=%WPpUr>P=0dYdW=x`c%BHA{pc_hFj z=gd>DJyOJ|zhj4tVuoIlbTE5d1Xs=QP|oRbGjvI$zkYnQDZ{Wyl1@|359OTS*yQ|h zYV*U5q-&DqCnD{7e?NDxe)X%LQI4dymY)Co=QjY-dc9t$mUDeyE)1o=w+!VurId53 zcEQY+Ma%Nud+wc=qKi_7J(wLJrMm>U2;cya1z>H?Ihh$!N~WgP!D!ZvkTGDQKRI=cZm> zGV3T80K$tg6=%}5r@<+qhV zKY6)Y>^T~W=|D{L2uFbbVn2lw(FZpvOHoxR!!Q`|^1knXbm;qkW@e8>KJSdQw|8ML zW&P6i`s}k(N_S-*p%~yl&>%;6t~e3Xc?j@ZnU|oL#>Bm^!PZr4(=!40zSk7)W{D7q zQC@_LtSKw11id1Vj(eQil`HpP(`{hN)vmFv5vPSbS3ulAa6nVXH?%rlT3=M-Rc7DE z{-YL2#0CdbDlY2UAKXBI)s*xva z!r{dhA~}gHMPv!Xo{61LDP1(xd6S!!!CF(Br<_wM1x?e4a^@O|e5r5%D{wcznJ~cD zBqcF3WbXvPd8L?De-*&laPA7Bw7%TAgrGSw4v11ATfF0O?DQfBE0JRa)(>pu+>)k#9m#Mm{l(RlqX5q>3`eb zKmYYdM~~lsySyN83!OiI{z4h_OV^wAXXd84kaIGhR`EJkVUTDyXJrS+yjjgk7=UOY z=laQ0pyJ$$9iAv{_gh5#9fhJcs!!WU=-a;A*#7=GxpL()HeF|QBJ*VvWXowB)}@xa z7Jlr{(IESDlIw&CDE48&7Jm`X3-?isJVYRxa<-F`qwcPYcfIKT`(M5D6z}L6Pj}t* zocUwd-th8SJAa?1otc>?7b6-{mw2BXn#z}$`M#qtla#dYI&9WwxbocReAt7(_xfMC zjiC5%9G{$gZIkl_5y_#k%y_EYsLxzkd68Y;r_f*%+sykk_Q}y`cy&Gdsw8OGG3r8I zv@!b&cKx)SmY+&Z%gLUD`K^x1!nd-m|A}PVQQwPKktB)F)`u34@(v3Hy zhKcb6YMt0O)|Y90OAG1eJcBJaF9L6w0O_GxNZV>DU zgLi0iRz5IWA;4-SaG2F7OZiYQfhD|&4u$pIM)nWR;mVaO*lacg#oU`148t%nWqD~hkWBfGc#A6yH(E6` zl6iy>^V6M0(>go}sHU9)0BzeAM@L89g~JOU|C-mldKXi?qdS2zfS1n~%lB{F);x^N z2eu=F86BGl9!DJSi^E^XFlcIBSue#nDw`n_KrCH~e@#1uEVxhN?$2t+)N{@p5s zP*;!^gZ8TUT#Zf2SUT(rR$Y2J`S)`OAZQGW%ZBdGroKsgy zK@!0*l$6^BTGTwuAmyAj^2|9kLn)0wQc76>%>YnJVdDnocTzLSIVF0-qdgd8l5;lW zA~s1Wp$sMNGYruA!Qn0diS5f^rUJ%(ON7pPA|F)HJO!EmHdQEh8mac&%zP`;F}jh) z3>>!9Jk0n`t5^u*d!E4he$~fLq$&vGKP>y?LB7Xt*JI(Q8FNI zOhgnWszVWxBu&$%l=F)KeA#R^`O*x$cL)xM%zcYirI?YZ1EjMJq; zq(<9zhm!f(03)IVh&5yU7Ag5Vpm9~e;16cLB_c)*M?=Ni?%ItEToZ(p!1ZIz)}I%? z-i%{cfpBpNmyiS;=3vGFG3ZsPhQOkj0ffhUu73Txmy=0-roowoBWzAB!?-iWq}6t` zqh~G^K-QGi&=UM}VH8xYS+#)6Hm{AMZw5eRJC5*n5QUnGgXR{gj%O*rpj$*J*fNfG z$Kv{jtES1-s2i11jQ{=iw7T{C#ED?8*VuBdJ!2eCr&)cs1WoX~LENhr*M!d+XV+BK zObNuGbk;z%z)VGXzyeH*m?`a_sleRC2@6Hr=E~qkV!2$- z=kr<4GRsYyn|79F^Lbj#=c#R5NhwLwWHfDSZQE*2*`obRQPZL@Q*>R2Qi_$L82UlX zG!11)r3^_;v#E}US^&vZGfb1Wy%^(Wz0LUr3?W1*MN|t)Dd_v&`o71|cj$*6LqG6- zDWVK1bPlbP5k8~9@6o3*2n#b@ITU`(IZtLEc@aS6eS++eF+yeDR5HgTM`kZRU{udC z?$>ltX^UgH_?S78mpBK6w$~E(Pu|g+qo-_~zV9vpsfBZe_hs~VbS~gt%HV{m+o?O_ z2go^=0Lu_brkahhN0OWT`*O~Ibr^J16pm;|+ zx+AD*no})cq?=s2wRx3Ui=^@l>H_LV1lt5c(xX4DUTaWmMyf zJ*|X|6L8U$S*TEhI)YZEXVJeqpf;&?wc>J!$3gQGh|_oph6$AYbx5AZvw(0hAHrLn zx%g2MfJ}R2+03#jlEJdU8dYt~tTD6JKO0m3t=gy|t7%h8Y05BURZacSi<+gO@3Z;7 zx_#egHO*QEDP<6tNhw1b`aYGumth#Pnu%&jWf*c9N*)G&SJPZno1yO-)6xuONUGYD zVQ9>>F<4TwMnoC_jcUmT%U)k+1@4aIb}E^2Kw<>FG7Lqu6b!>4!%(E}d+GZ=5B-2) z@ISv_JS@WPoH$w}o4QR(ZkKr37sk;U1iEu1*vlrvLC?|q(4gVqBFk5~k8vO$oI+=2 zL|*oR+VuL?HS+y(FuL3UHuBewo=8vGI3hBKfTLI+VT{nXGDQ4l zM^N#x-zfBpm3;DWKOoU3b+(PnU@>O#u5Bo|%? zRJg%7+-Iu}&;bD$o8<%E@i<8rup6r4a^#+eY0alc#Ft)>6p-=w))n<`)Sdwg5fG z@{AVQZ%u0D^@v++0bo*@Nu{QGWpde~?ygsaYK6eF>YdtJ{&uU=-+%+j3V1yMbyvU@ zf0TK;zahmt{590*we|$d9+F1jY^Ftw9%nJ`Y(Qs_`M$@Tt`Fy5=)#yqbD+l8IJ5@0 zha+Me+c$u=B?v=wCLo$l92xI3R$NkmYlCGq%cYbANLIC^YDvvfDJ4mgEI?MX#sE>( zq-x36pk&7c*@0`4B-xA(FNUayhht0T2q)E1f*G;{&!k$CZ~!QU=Neck1!X8GrO40^ zX()sA{UAd>2tn|`wDg*z421)_+9xAef!y>kYGn<2^8q(wZ=KRQOQ{6G53}8$C_&drwmeljQ-7`+l zXu2sVe)hAU-AGDva6{@OA^_J(u(^$_$J8;{wmN4nOoCV>7Q$@gR)3ECz|k_9w4KeQ zX_^-S@|8`~e6@&Nu7$eIbZ~HR#mv5H==)D^+Ganw(AEU3IKPk87dUs1^+IhLA-j&O z90^A4Tr+Wpt%Xo|J0^rkF!@9$PDX@ob~%cLC7!8b0DRGe7tmDFIB^SO$532D3M-j# zFu?weKPR4%I(m!hL$#4u)P%`%o>Y>Ed1#rycA$7icNR%XXB2Wyr%DQ|OWHEp@l04U zmu60|LI9MLWtfgGLNmv+b0nqp-3qK?uvtGhHfy#fYbZMR5W5<-R}AxaM8l-HLs@QErWYhD_{el zYQlJ0XD*gLf!beP8}k)3*DG&Er!!t_N8U0epDi z7mTBU5IGkzwuA9Gx<^NboZjCW<2i^Pm)7y$z||FB3+2GTQW!_30st8%C|axxy#RPa z+qTEat4pkCj| zdq+EZMpH`isM+>zI$f1AJGP6_xVAP%HIX=#U9bf5!L8`{UAdR84EdG6FmU<_F8w>QAfbKU%H!J{g$p z`(wA1R;#@a=!fB}`@aA5rpfyv0y9m{&8{#FQEZzChZALkG_7a|7N)2+xYRR6@3?>19obnrB+WSE}v5JSf zL&CQhMByaha@h+T=_&U2_o}Sl4l-`_HR`UA?s2OcR|Nt3;`hWb5Ovfkv6}8w^CmdaH~>>^OHf*Zlje4 z%}~D^KyPo2=>_0+LqvSLGINJ#-CnUVc!$e84$C`=jlHt{Z&1}^}_fw`uB!A3N0m zG!V#&q@*IEecz{{@4D6A-aktzf8D|U{(sa`&bZ$_r?xy?1s-d~Z!BUxsygcLY1lC^ zfoqIfWSK0t4ebnbqv1tno^|R6j86jq_{whIplH%2JKE7RknX$hJ_=IKZ#1A6Aeei~ z+d^GH5aHq#Lhj-vRH4*IIr$!jw~MN@hiVDcOkwt$UPuQGLbV|gKkD{ZyndnQs4PPF zkFS&1|JUt5?-;foeG-M>;At{vRrPVziA+~V=4{LD`;)ybM$h2*$Gf4krs{fH$A}%} zcV^|2h7;mIf<W|A3g)tS@4sxGhN%t0+K9 zl0;Gxp1vlMlFx`n)dI$wB%)J~{*l^zWKcE__f>{Kkcfe6$WWAx_44)<*3pbzsBVww z1sy?o0DNa3C=ymY&){c#;SB36kZ>a8zNPuelDvcT+1{EH`89VFjXh+XndiAScZ2*v) z=2gON+0r;mI*Jh%potLE z%S9oN`q$f|9&wdVmz=kZP=ioa$mBs{N`J4TnxOF^=0j}C=fjy0DvSqo@M_H>bhiH( z-%oTI`hM#j^?5G|J$w9fkMUM3xz2Y+0D>t%V6Lu80}{rqNggZ~;+!S|MZYr{&jb!K z?yKhjF{b0W2c0)D+m6lTjRm32=O#ve#3>9&5K&X%^DM5fy@|Zwwh=Hd3)dRe!h17t zVTn~h%?i=~P3#!f$h<`Ez=3FkJ-U^KZuMf2@;*hd~CpC^Of zRz31er<*oT&UI8(B~kz}Ez%DIik9hs2d;E(r12uTJAO?W+7$`tHZg-i{TS5xj3s)E zFKW?0*Z0FeS}d1;HRpUjGJI=kxmbK8%wAlE;p5w;U8a=GRL6}uD_2I)^cGQC9L@VR ztJhsEh4f4_^zVGm6~15bM}5&DFHiIK4E&jpHsNOQUEj5{+3d$*`sD!r)!BOedI06* zPs7|OTi$6AcBK=7RNaLjmx$%~G*gxdWd!cuPrvk-hwgJ!wQVl3%;1q{%je^82 zYuGzXWMc=^ytq>V8JqVx7Uos|8p7ZV#ke8iX+1D&AgOI?J1KuHDPIamoLN-!U=6*0#M5{? zMPbKxO`)V`00X!UmVin!Zg4gZ=5gl^_UMN4%sqdr3pPg(HL)`cJ=h*bZ0S>>er94C zV4Ce! zrpwoB?k@L2Id>U%9u@yixKYhyZMz^d=HvOB4-CdSIC!u4Vlrr~V=Co+F++sIM!W3j z2D&MbETwD^A`~nzP6C*jX+I3;d!EW0%r(ksWdf(@|H=hC$2{2DQ56}FkGb5ASQ%(w zXmiTew6phY+u5gYy6%5FI5_ta0A}@7H=)^V{&8ydC2IOdCFQxtRRKV9p4>7g@)uBGOW*eb(}&NWJNMP5`VZIZ zv!4O5p5!I>-+w=7j5K_)@ebxS5h51Im5ql&RQ)cXPLHH?_(mD6>P66L;IWX?TC?12 zPK|w)lZdFnOc}1@`R!;&&v23xgJ{G^!VuUCqYQ=^*6VTCm1UJwN!$+Sw#i2l*>JoJ zGgyhj(I2&iutKg4zNc}$8Y5)mfkCzWUIzjiz>n9BN{j3Kt=y;jueJ|06E(~vk4fv9 zaVv*0w2TOXx@^o|qm401h|vI4{mg%(czl|Q&$moqvFNo6;9~?)TUoOZ%J&)dE2~Do ztLMxH2iw-0#mmeV6qd&)+(rdVpOU!C)~hm7M4I?bWjBE(=ldcdM5G9JSo8WsHERnL zzypna_ul}b0G-G6wX9wg$qgR|QD)#m7cYM#VSCpb6%PQ;V?3Qu-EqvTQ$C#3-E(0w z@{IuuBlLzIQ_>dlKAWoM%fXWPCoJ4pMBlaT$lrXH?OShFyk(%1us$#Kh;naT$44<3 zoX7x9L9xD{=U<(So&bO|sf&&|n}Xe06WNVB;_PUfZVHNX-b;Wq(dyAF;OH-6Q)TFT zY`V_Oxw;NdfI6V6R0VK4vNDM&2mcGs82NSlO1Uz%l#aNM9$r@fCc&b{r=~B-5zZccNx7lpI<@osc)c`m`*(TLe#MCUM6dqaQAs$hR zS||9seNZrJIO?LHv1zKo0zf0_fVt+({)`4<6(o!n<1NjSd2srUcJvG<7l`sG1Vd~) z5vq_QN7^g#k!97H6EMN+s7KhU-fsDjfpRJ)A`0`le6P=R@E(9LaHZdONrz*CiXtjG z;)^R22Z&Abr|uAUs=z9M3^Ji-uj*jeE%i;|UvWU?r}F_|z6L5j)qMNJd)+cj_p7oHBWV+gF3Pvlo-g^8DGbMNH&g$lzTAAR;Odt?x8nAV(Lm z0OT)6zux`K-2oz9XOW-3INoo@0|duTfmgdy-H$g?#Lcl1VCz+ib`XvSYX6Nd8Rc`t zFV4IyX7r)kPxt0ci$JVBnGl!&9WM*l#d)g;_}WPlF(1%O_`jlN&o0<9u5sZaV4D26 z^Bp}o-BiiWW@YLl++rRNS4rZ>_G&58_dR?{M;$baUvMlK{mafGI-GR&7$V^M1c)JH zwHs#OPd^C{Ks%dhZkms5a`X8R`R0RzgZF*1MR@bs;zI%XA^?9Vr93k;KcOy$rBVwj zv{z%PCp=e~jo0G2c#SIzZ?$0N`n*?alC`IeJM~f$#%r-SR5U3i?)Nwhx>~Ki#mv68 zl=8BZlat3LLNFz}bm>ygISU8u0#(`w_MtmasIw@nY=7f9>Fg6>$59W{Ai!mw9Ywi} z@5UVCyT{2<6AR$GJjHiYk7Jv($BuUN45x=4dU#`|8!Lq(=GQ4;zRHWLf!bAEPf&kY z2*gB=Zfi{O=-CRmQwtry%zTJEmT*ENLJ5r^iH4i?^O-?00z#2kz&Ck@7F|tfxVcXm z^`KB;g%N?c4=mKnj&xq`s!$z2QKvxeg+6V;DPf;8hxvw7YJZz%2OSO$|=*F;54p!LoCgVa)&p$x8ze6g%s#m>@Y?9JH zeelbU_wvP-ezp8WJ@FiEst>M2YG3#-U~*_y{5Ak$lVikp^hCO8<8)o`x`cn>7Vuc0 z2$utQc1cnQjJe9ykJNO1!1Td9R94<$A-5KtIsJ?BIWUY-vn2?!0ZENVL^n-i?W}$F zY&QFgLn+_9x7z=N=@HS3#qtjr?8^ZA!zrbO5Hx$m#6);%+sLc+6ut@HPC2sHXH*-b z@bC}uS)ccZ&3{i6fP?dipnDs5lW~+TecvZDyLxc2|CMIto7d~JUj(qJ`8+9Ifk;j{ zH&RORvRBD8Y75_Ym^Q3-venYMF#@Pe2$cxW<(>h{NcR}|W*D4w|esy)e%YTwBe&QIR% zw0}`U6ShtCpZ{6ldjrIBWbd@i?;LP=ew2^eh6Jn5Zvp|g!>bI!j00ap4kHg!;9NfH zzpM{`3F`Z6ZPRG*Z|^QP&vd$J9zkYD}Y9%MkB2&c=)^KH+sC4^2Zof^S1%@dt0!3)4X(ri*BJFACt(L~%cww|;ju zCNiiN8-`w*oL^DO@RFhL|HaYK@#|yse=~ac;os1roNbhFNw`zN`$%1}QHZ=X%!kX9 zGF8Eg3Re$=x%a@^C9J3a9@}>EG)L^FfM_XdW+Dd%2a|T)(T<+k)U@pz)pQe6q@yr7 zSfDly`KWrt0VZWJJUnLS=JWLvX25P4i4F9$2{958r@4NfD72A;)4vf4HG+nTCYyK@ zd0DnpLi`ZVZfu|WWqjVRg@*D3T#^vj+8Cp-^^z%VD`z0Q$y--kQ+fS-*uqP$K*RWr zb!Yu2BY!{`JIl~KrWhN>Q7-7ABw(+=Ym!GycheJH%N5DYtc=s^uEC>S9Z}Xh(UFec z!GsLu@Xi*21)?V~H6>tmlRp`LAo`aBi^|?2qHt6O;UYu6b_B*OAVhrOoxjf0d3rXI zaTc-;XleyK6StqVKgKqx#?9l8r)0*1I%t9b-v)2m@>Us@4u5#d+#m>iBHB;j-en)0 z@P9Gl8@kU};sD6(B=z28jl{96=Mgg?eD5Tk|Cu4;|AmFD{OymMFXr^;?MXu{cjRRMGdnZ;~+S%Q_$(pD{{0J(YFwL$JQU0he=#2mO0d z0#FK-3D1RxNIRRCl+p*KCV!rGoBw_2`)^RwPe?h>__)s>k?A;TGu0|yJ=YN~wo^uP z*7KtH{ZQUDTmNbm?EACgR>%KPl}XsmQHdDbqEJV=w4`s_JQvd+fvafpkygZWRj0W zn#%-{)#{H#a5tJy_L0!D%@hhYK9M)wt6OCVQ%_H^a2k)zYt{Y+GfbJnf3xsFcq2Wb z01$=&Pu^F7Ft`VD>^>2R*bHpqaK6BM1%aPOjLP=o`a3l;o1JxkApsvhUo7W|yG&46C(|(zd&By9 zvBsB)7iyGen|>F+&*Idl;&~B4)NexZkORbt@rW@uo2-;U%%QtN{>;Dem zbeh*w(WOh5QqEa@`C~Bcw#6Tk-A!@Gps0#elOf7o1sy5qi zxOHTPHGzja0a!Zmsn|-PyS$_jo?_-ov5GGh8}(lu@yGMyhkviTRXDKn#1maIX6#C} z7R8WU5n-x%$MgE1XzR*ATp_V(r|PGjm| zO2Tcnpl0ZY@$@@#Qtey|&#=K%1Ud;hjnN_%h!3?w0ZsByF5X~%Fo;sYWQgS4G}bh^ zSu7T4+ZIim#SE#GB7CdwIOCp>%GT74^qBbH$Zh6lSJE>&jt)8OX5ocm=L<^42c5#PEY^I@$vER_%0c5C0&6T7p?HzdlM~1Wjd`z z4=)>l9Uf&8P;-n%%@ta$hQvx{?|dpN8>f~0yD!S*Z??3mT1sMC24{~Q?dZ;-ob#I` zrGBD8=+_A~<9}iNs+uIA@f~dVteW0sX15I#Hz^&PnL>=Qi;gy2WU2SZKk9F|=AEcF z-lsOkSUe%w-AykW$Jb z5H;O@D(v^JOgC+q&1N$&D#1_}Uh$UImA-yq>liqW_8{Dq!iF;3Fgo<9k{h-aiEmY* z1(Q<+kz-<-AsE?HaKwm2=4583no^<@K>*C!d797WCV&<#W@ZwT7UIvkG>&S-gaqPTbruK zpVPBpFe~cEh!!`-JKE7Rlb*o4Nz#K*8~mOK5eM}{{KqFJSY>OYe?G;joqe-(+hU4E z@*^VX`JMavx*m>`LyQ`ddVBJqW0Q$T%SM1gs4wEq2X}<{RKKTi7!bQ1gbks7^-s?( z%3wnMq*KsB#XM^7TAIL7G#%VuIO-Rpd}=w@d9K%ar`CiWH@;}A%lTH)`hd!H3M$>o4Ym4R@76-8IF5 z1%WKf7X1-`+N;Q%#JsP$UW#|3J(&-H>XnZhfO?;ruTAIu+L&(7$pjB7WF7)%sA^odH-WaYZQ= z1^KX@wX#~RB&WtoDPS54a2iO^IT{rudU1jS{jRa>tT!QjH3i-n{$pAl|4`xX3<+kI zQc_j3zV9+%XZ!mH-(ZGs+-x>K2;d|#dYVL8HsdyL-sIkKGEoW`>o`_81e;e~ahPds z2fr{egVA_?fild20yUJXDMWmG3WDsEM$h$*c62AueBNG7Id!I`>M>Vg;P((iqoy0> zZ@lkDSXB>lzI`#p*N?6}48>U~#bOqVtK7xclaW|pV031L=BG)Z?7N<+=|g`AjPf3; zP%vtEo8VLCit6ecmFWn&92FYs)>;+UklZYVw_6=L_~5>#3LrCm&_Af#CwHjM=!K(F zBj{n@);1yNqJ0W11nS7q64FLZvadkbagWeOItUWiu@e0=>f;H?xX&;DrBxyz4;?Mu zgDf*+0pfWtVYF?v#nIAysrMKXZD+J63m$t+`#_1O&5b49YESRyvF-tCZy>3!2K*f$ z%P_6ma(|2Sh=5W2V~)VmpPERJrIWB6P1E5iMk1dCm2heUn`3M zjvxG?$b?C1drli-(t>1!Z5a$1V_BVN;NZuHJ2o^aU442p&hHv@Qw2Ml%?y*FO6_R! zudwskXH}WiUibMHf3lQ7F=-Y?7`$r=^gFp8A(r&_}9JebsK|qrIgUM0>JT+ zLoU~4Vcx2KjZ8dPP0cRc&hUw|v$IXpHm@_)o~j)dvA$cy2ER@;LVS-+8LIKTB8 zUg07v>W}RM7%=LY3U27#inz!~F_wZro6e7_az;=dX2T=5+#c|0Y9?c;C4d887|)M3 z4)78~!XW_GNo3oWQjhv=*YjJAMRyXy=6Pe$q}IF$dq8cy%@LClMg3U*F;U$Enq?(d zP1Jt1ov!$e`Wb+aKmuS!gYsF6Hb8BC7Q!Z0c!Gf4<4m_I)B08MdeO#sQdfsM1YAF%Ux| z1X!Ak@Iy|vDL9iI73zgUR8`%m*%3Eqm&%ErQ*@=X&vaJHueuOV870_`9&OGbxh59h zOSh^N*21i4fh56lxsb(Ti6kOLi}>ypWap^p4R4#UquULq$#9jwN5vO3-Oa@h2LS*p zWsqSQ(rUT-cGdC~!!Ufu+1c^a4wtx*9)9>9gUuXxa(El|W$dysX4uTb=WN_8%8iDx z5loDGLda5g?l$asp%@V3p}o${p?K&LGVxKc?I^3zQ*)t4FwKP#Mxh zx*>M`=Nd;u#8fYuJ@HVYTS?31>U+%Wn&}P3H*}e+_Nop1p2!W?{0=b=X{s;-IE(}8 zs*@ZGVl)p^3S3OITa|NwSSN|_fe2CHqr|{b7k`bp^$kR^=O00OTbyUdlj$;RiMEQ)xsymDLyT;6Tdy9OG1#c8yV!UB=4XN^^7a^L~vt^>1 zxe&3Nc}tJPCcNQ-K_LCmr>1FMvtFOAC---B1Kku9w{4sJ)Eurzo;EfGIEcz(OD}Dw z1_OB?%Q=0Us{Lvy+Ig6*R!=b`)z>&%kID~~ah%AzRHh!M3URKTa;A(^2mae&s(j^a zK2NLFsx(alRYOsRR7`kLJO*f5L4L}}rhbD!_=yU7^5M+SPaB3_$}n{M`v>2sR{qgu zvw5p`mw0M=g{t-j5mBR8ycUtY7{bbMld%z5))DB20&*o-H$0z?cS9dJM7Bx(V0!L3 z2~}>7j5v}r2?cmZJGz6YZD+p)({)G(sK^*9KxCj)Wqw5{Ljep0QbZC|_2TXH6a&C! zv;HBG^l&M|q^Lx1+iK3|br`-jdYx`?1PI(C!fH+G7q^i{pgTTGcOKvE@y9jI6ikfZ zVDx%U?L_2RV?_Pk0mS@MN8ltd9)V1q=Y18~jXM8+KiX%>$fK~1c;ThCH4&fjy!Y9la&O-kf8G?-u$QUXx zv0q{pctgF!{G;>*+;sc{_((`1Y$E!5#NkfyyuT-c2HuAU6$Gdn;Kimm(t2qEwayfe!8>KSR}Tac9&zWA(?{)FYrjC-913WnFr4T)9u*b{ zm?s_!?^p3G*&&JcP?d^s7e2A0JB$PjL;Dp-I*V%#;f%_2G+kjbfvJjd{RW7t9z5Cc z^|zAF&dwfLEEYdew49iG&3qL*0jGe43l;6kbkuzA?T%`o){V8S@G;VligK)b{F>en z38Np)N9++Qs;VzcK;-DGlxY#i@{N}OzJ}idGR53IS>0470k)zJp?jlzpofRkc1%P4KQ@x5oI)~$=8ktw zIw+he;ypo_IOXd4ZmIU&-+)>^Kffc`5ucwgc0<{Tfqx z8WV=E0MJQn@)q0pXrwx)N!$4$nvy3Fj?att2fv8WU+%Ywf9o$k;GU=Ys(Q0#%GQ># zzdZ&0ck!G+OpBzP`qPt>A1|dG`<)#<3EdPFw{083ieL`|!%_iu2|HrkrP z%nS;V)7FbDqiIc-V%Bp1spe4h95^_ zAcOMg_G$QsKcP@n5s1wfbL_2FmYc?W>#`6Q;i_PV*k0L*WXM*rYWvhH0F3o8vr>u; z!yvQy?1xp$mzwFfot&IJv|Y7ZN0%;LN-1TN#O*TSTjr&dTv<>d008_XqN)_es@26Q z^rH(6r5g=bHj~jV6;|kh=*~#bK?l32$ysVqcC@2AjM`cI>yqS*qTzBg0a3p54Rs24 zXV6fsw3HU!uhstk{%!RX13=$z{!cS|Xy|){ejVL?6P4$nrveiQeAkRn9+9>>E8IA^ z4GEnw6a?~J<49w?HgPPBg)=Yn#FELD?GX3ey8Mz~}Iwd)@ujevPZ;YhLvg(Q|+~9QVfv8wIR?wG!@>n&uEMj74uzSf<(n z+LP}ro7<=DzKH^olPmrt_8r^E*bbg29r5lt=R@oZ=Wn7Uo{;A)&V8h#6@2#%wxqv; z-tG7?#z~JgjS4%HR2MieglxDBapuDxVO#fougk^q2RB{+d%Hz;H>aC|;=b?IObY>P z2$hdbs@4_@ffVtL+mde?9qh(KGavw#tGxvP8HVx`eb;?mPWc$9ufrq3eD(j>Mu z_%MFOmly*X#Yu!C_7IR1kC`v`nC4>6E%mxZxDC{G{ckQ8s~;>{j*AvcZk$mQ}1PJxEgE^2De_!oCX3ry^qg$9~wjZb z9*Mkm^yG9?Q2fwC4{7mDWZ_*9TFLMf#BrFySTP|0cL{NqSRy3h*I_U)n#kei^T;~k$R0dQqp&E%`ZU75z(#Li-$a?%f-L%`~H^!bmQxG^knpu z3O1*d>WqkYRh5bu%TO$M6L8;wGoU}i2S*?o)c5@(BJ#4my}d6PhW=Gu*Jz1XuH$V^3h*;Fz2jDWXJi#H!R9`2S-n|D*>~=^REoYq7Vtho)^%R7L$Y6-bh? z$M3$qkZV?jNP&nArAI$>d9hghkg0xUDdpeZ&TxqvX|Y)F&_GFMrcz~zJ;e?Qds0Ip z#!ju0I8qH|0RRZkZx?D=_B$#HW+Qpa8z3UdD7BPpt?q$(sK}0XbjQ#G4?J+)pl8#m z8dNJiQAs1&MAeDGkW&&fmA%#8>@CsTZ!7gf_saeKb6=NI`n|5(5Cu4}dlKadOdOYf zq2fhzq!;O3gNBabV>cWn?TCTiJtrbEDyoSW5i!vo&yO#1l;-H9mbcm<-VNXj`jV-} z#xz?UL_k&FMOQ1oPm{UA8?keJH-E=>KjjlPXW>hrUA@1{@q5{0lSt`mXE#uUl{!$6G~5N7oal6g4EsRL#PVA{d*1 zPk8ToLyoatLBdw`X6H4w7$!pP3QMTf-N7W@Sa2N#ATieY38!A}Xh(Ml6)`zdp62M6 zC@dqI@rzZSK!J&0d@dmmZ?_{_&B}k>-`oERGkZhVcjkM}Qpt}y64VhkX~c{%&l^~? zR>jqdD+DS7s-PgMV8B6&(6xGl@d#}q#46!ZWugjlMk2x+v-9oL+bfOo%N4lg9XPwKE;E)x9*M&mPPZ1K{`%={K!Cm;=->|_K| z{)3gGMwf6LCsATU)|=q7J`IfVAyeKJX3d4%o-5z(C1?H)NaLX?i;REc^?36%ReXk* zIUs^JNVU)|O;Im;=%Y6Q_fSt}Hz#PtSu57vM=5Ii*9NT5_?6nNe&5-KZ}P4l$?u!j z)ZD)Ek5vkp6Skqxo)c?%IZcu;LhLph5#U-W!#8a+q-XYT$P171ul9V_}6@j-uIo_DWUlXj`XlwyA?l_zyKvl_H8p z0)WO;FD{qMw~L%yyLN3@Z_d7Ve{cWAFndGSbpoJF0C5QRSla5CsF$gVrwW6W^zAom zZJ9?vv%2+Jy-fw}_v0ni7Syap)VKXUgwBgw9Eme8a~NgDBbIBT(WX_Je&+>3rci)7 z9tF(j=nN(R_f`sn6d`NoWpIZk05C3AgcEz9o$(A=nGxX9#Cipor#O?*bUIk{^0HcK z91M8l(ZIR~WVHE{&J%#Z&&%YuYfDd?JQfyVtW$8i0b7n1exqr&?IsS6a>xpRCfYFx zk#;1G_TZ%PgcZCA{9h2C_*>aV1j!>2SMd9IJ$S*GW85J$aa$LqjdzFL9Qn`tKHgIE zANiBtg+;Kjj^PCK!Cg(tlw6Pt0O-5U%=EOB;cJFr_<>u$&Fh^@HwDG2n!R)B;RttM z;6RX*jmo5UZB+*Bs8NA(SDzcW{suDqWEuLeNh$y9uIsL=mgL->009^AjjI>PE>jny z^UBE2+xKJG$?8;j3#Risa7G3MqRONAX7jnM_V&=Utraa&iW(6(+_6mPsA|^rT~1kE zqpB}iuQ%Uve0=?P-%+bRm&>KWAdDgrXdJ7Ks4}<1MpZ&*!{rxWy$m_dqBRrv9ydI$sXd%2B0q|=5s6_bFT=?r~U<#zE zbVfB%QB>${M=+k;2kx~Tl_mgVVw+gfdZS+VFb(P8Z)8}zTyZk#=vm?KQ|>v)ZAqyE~--Ka@5J#=CSU+!h`#G!V>q{Xc$-*_=R!o*%k z76)L_Bu2_8ff#Ra3KDKZ>I-flGxnofN`h3j-&V5fD4li{zlYDNhCndY`1}YKgW>pG zMehDKj$zDk=Cld?VZg_%6x1oeW&$q{uvHdb+wuxJzfUP@?rlHvK)pZylxh1!+^~0s zUpIp!q?8IobhBAoDdl7+!&j;5w*$By&+q7|>87B#l%g;Kxvin*HiJyYG_~_8KTP2e zk2W5?3~!D~(O(*d{-4Zdvv2B${$Vvm%2_2b1{MfbVUc|7O$B1)Cy9SJgr1hIg1;&~ zE+*47h;guAH8W9FYnleD)gBh}g{i5OQUvbxG{8zJ()V3jESCS#)LyKr|Mpg%PWN=l z{k1OrVrnKxe!+Z87~isvjbkv5=GhF?Qjg2UEU}T6(6~#q0_-diwZ5i6Ksg~L-_y&mN#U7TWPb|tPS{{ z)#~7jbISK`)@uyIfRw~UIFP00t=>|=D>OPqT&$UZ6?ep6@q;5VM=KRL6FH9NCs2`R z$FJ1=lQjN*P?vdQGwGNFuH+n|FuN!W*G`z#Fbg*;lg@LaQ(d8xjDb2CX;43t!odFs z$|eeR`aFrC+20xiq#FhU;i~{9u15>58VkZbb0>om<{<#RA0w=E1PG?LC@t?rdya+m z{Hj;k*}(7lu)zl|+m8z0F%}W1&Mr^o^{EXyg2S;HSW)jC(5oI`+fz(B#L3x*{K1h) z@ZiLtk(g+F9}q1u;q|RzM~Pz*Xe=lUEHqLLSY}IAex=;I+*G`SXzH!&0JmB-Gc_%n z^;!UVgKGIIQ~Or{9`|%RdJE~Mp!nRmb4qFB`N z`*qiK$p~7_U86O9=u@iaP%H4S6?-zxsFKB>b-YybtGarm(T)fl0B&Qfx(}=yrzs}! zvJrBc`OZa=z(JDL;(J-EO%RMuz9{IHUE3;K14V;<;LlVb8*$d#;IxjNEbKoqFb5Ta|EK+O zrixneg;9U2_}Oir&kRU%-kP*um_}g4CsU?(bj~rC&pwC)ARlc2NRk9*sqZ^%Hk;Hm z?T>3IFILrmv-1!?J-R6fdG)JbT~xynATCva^8^`Drp#S=Ig%N8+YNyw)wldaruBOL zNJ?q0L&-2el1IY^cR50@qp-?X>=WaRA;4@lFRQ&h z%T1$Y=p{?~x%21Gy+mRE$JyEG|9EE!Y=6ybUQ@cRD8KzMGu)omDE#f}QRl3~0QdfPFEfGf5tQW7d?kx5v=RC7Er_qrRy)_WW%`d2T5 zlYp~ik(axnJ-xX)oDwsbEQI1~;$go^y(*yX^fD0ejp|p}2#(hwm>gIU9%ipYb;&E`M&{cmJ=H)4Y@dEyW;E4rnX+Xso`C{7GLZRp>;`)~Dhgzxe;u3@$MW_tr$t z7MYtBEech&wr%ZT{{XZ39LweEC%dluo|B`aH@u_bhu;j9#ca-lQOu0JkrY0!1DCwI zVWtHBB~ae>WQe+lLc{axJi)saKoe23Z>EY|6z*LjFYr0;Q#skPYDYV|v&aB+=Er1) zK}P@~5gBLl#T@+vh)R+~Qc7tUh6{ek%{z>SzW>Ex=>OGF`p;{c_J>Ouy1wtSX_1r? zx6%YSB?V9`aPUjiLWNqv5wEyrjc^M#QB^8zCmJHEr0SH5*Dy;n9qo|o7R1Zr?FLSH zkz7mFFbaPz?oSFa8WQ**CX^ksw+Qp_zj)Hs9V=8%8}q)kNmi%;-hm?9h}tu3r_Z|a zX_7ZD+s5k_+nB~QJP~l^uljaxNpB#5dV}kjf7}8fEZ;Z`@vCv)>n^OV_ZveR{JQtA z+mA^@i*EqsKSweX?)YgA7FoY|udyDi_BcS$x*!iWHBoT<;J*lh<9oCh>$nAGove6R z%vL$s$2DEef6{k|;l9u~19SlsZ)!!as*aBIInBzqfz{`20s6ee??e z+-rao9c0sWQiek9L)6NOwL*eW;t*FP22)LC zC?YAz-rjzZBp;=QznoIK;5ocg(5HRcr%G-z9kW#dd&mUqR)y0;NurjcQmYB-^cvfp zKVo_a9zVwM1(lMwe)Y2inHhv$cYy&zlXJOI+3aXXcM7#_`#YtSo<@%{=nIG`ATB>H zE7crxdKe}UEv1|X-eI2NN~fo%$6ECJhhg}t<#P2^BI#9K*Xd@nNoHm#x%bXxf8rIK zQs^HCeGVT(>2Og|*q(_N_eWe8Ir)9@_H)m>+n|ZL8WGLJeh{w!Jiud;A$^Pfyr*TZ zt`o;y6dV_^{Cu(JRkbH8I@NJudTPe-EaJX{*2#u+&KRzrC-#bM;{Vszv0<5IfKzV@ zZyfHqYHR}GX>bH$wQMX20AnbnliS@%1#5Y{326Hf=93HeswH6l?&Ga6FpgOXP|J2? zXh&@Z=I{TECW@7)Nh%_!;CXy8M>%3Zj8{ByGHPehgKt|-g`fFKFuP)&fMsv#Ctr8|M% zGEfZ8q5J5uHahinjL_JBQz4Hbo!NA|gQxDZBOhno22_QjWDR+sy>PcwmaLQ7HY@c|rj-H&GJ2VX;zMi*MNxwjnZK#h)CG*8#xveKqN_l*=&D*{~hWno>D2p zFAhWhugWld;cB(_^(o0~yKZBf%|=Ysl1P!n(5e_9PwH2#MF7vKQmWoM$0nmL=2QOL zK-h%XWyqC~Omv*JR~7P0mk77i!1KEb&m*S zx-gxN$?6TS$3!i97(o22m&1QbPb$kgv0F7AIJ)8o=pB!6_Hi@@FR0JvjgLzz-gN#O zqjKjX0ri}*-KQ+#3_OlUyuFzh?^oL_>|5fF$>Kst^?LjJ$F}lvj^1Zyr8)@UTL`v; zkG2LRND*QZ?c?{o9FXdDuW$8=jNj{h2jMR0td@EE)cz4c>`(##5K(_sa(&<<#blC_ zm7-;{*`#i>>1VU~zbmDDLDzNvbiF?NDFA0RpB=qT^i-f&Qc9E;GP{c&C5O%nCgjB` zh`~3`5mZnD!OdpKFJHc#o7{X+%IS-mrhQIIO)@eopLPJ%^&R?-;kwBOwm$8~dHE_f z{va^%kk-;oHS8$VUKb`~Kt4g6m`@4v2h(_bfmu;S5|NzKbLNZ1r?+kUO$X=B{XPKi zNCOs%0RoYn#njX!5$_{zdNLRV)d8^&YimYSaD2!a!8Jx`j@o`>+q%Oh?wQ|aCX{(3 z##l<(J|}NSJG!H2u~_^hfMYeKp{;^P^(oxiEA*2%qVOwbDJ50YX1UzIO{dyD?`h?E zc6N5Xl=5GPq5o&Y(0~47KL5u8d7$e$+jJXIRTID@NpZC?nh0|hO)cV17v3U1@O$Fe z5>zSxhy|$eWbe^Zz(!EZTs&juS8Yoze{DS%10NvS$U5Ogo{~h|u_p=;Ofw#G z#&85cj5DSqZ@GE*%qC@uau^$GLdJ(i;`d-peneOhD{Lakfw!|NTf$HAWy^X@#bBnT z>pJVYwKYxi!$TRqsFeO6lv2L)^z`&9U$diIMK@J~_uY4&NJ=7%b1`3;TD6q3vPS&V z*fXQTcfKAsL{B#=1JdE)VRLqN_L7wI7c_1A9wL&R)ryb&Ij)bREVD!8*f{rmUH)qEk?dTaz*B`%je<^yZCDf_wA#Q7C2E;0K%Gant z2e<D{y;wr|8y9Jzq6Rn|4~Zm4Sm<4 z>pIb*X7Ghij$2(f6xXN;BAh4=Kujn?`w{v(v`n~nYaFOQABtzHfB16*c+ABSmJMuf zAC^?xQMFv5rEq5fflT$z!i-=$qFh|PdHw)wsOI5`Xc%Tz{28t&+k#kCKS!BUC{{xI zSVRUh-;T`l^e_iu`#|dv>m!LwhOP3YfKzx`WfX8XO%%m6=(I)Xe z+XrGwpiDO!*c^cR1S#tuyi;3Z>nPS}|5`bi#3IyqlwHWyF!;8H9)_qQNx2~2wCmQX z>pBSV^403Xm#gYmnc2TtuQ$K-bQba-92~4}hwiwO=%$Tx{rdF?&ea$NIrz1=X{yUzd|gILq{)x`fdp5hu*rb6PVIq zFcBB1#Ne0W7iEJp>3DaXY9fnH5|Ux7`WA#F8OP;bQ37e!(BrTKDd!|9f2@dn&2qW= zjFi%OX8Lxe+RjCbi3sSm;o#U6qfkuUNKgKZCgX;lq;K&Lhbp#p?CrAM~Xp*=gwxcrv+SZ zMzdMDQcC|>=g%L02!Q#G_uo?5Y&H+7mhbO}{+|wg|92LP#Y=KduN=yNVdz9lu{aRQ zy(~bqg-=0SjK1M|IHtoVI*n~7s5{tIMMkP9Z=#<9z(zjwr3hSSQM->|Da-`beJ!Xf zNb%EM*^&N!-X1k1m^}ax`BU*mUXx_Zl7H?6rQNA@1tNUH5x8uHvGEB9$!;$z785te zVMkr>dg*J)0ZRgn6*+u2+o8hIQQP~o)!_tin?WB8I0?%eU~_u84gf~u!?M$!PFl(x zYlZ;WsCm^Y@xu!gj(N6U?F%vSg=~|dk5>?Yz~?IkMCZKR#nm3zG-fT81l73~iTE5s+zib#zzIDAm`y~LI@zJ-O zE?&I2mvi&Q7Y;8z|EaLwyD~jh!(=2sjWZZXgkwhs#7t(CID}4u(S_@3#)rEGK)D@Q z<%hk!gJ%!@@HOl8+22YzUjSEz1{X75GX|g6xg9Dgfyht>Y&ILH7I+}K8BA+BzJ~Rr zril3FT3#QKa*mJaH>7M@*3f4axH$%N`4E^7Tg?=vJoTw*nh$GdvoC0x_AB=H_upZ0 z#*6vFR5{@0G?rN!`#&@$s8l9~Iuwr&EZEQ0lN^6S9Ttj-gX!q=Y7=-%$sQJaCL29O zQ?A(2j_ypFFP8tenw^BKxZ)Igt6+;qD>A9gOrYtYYof;;5V;z6-%7y-x2PB3c4#OCxET@>$Rx5hYb1uZZ%-e11=CB`{9LFpaVQctMPw?Fo4cdiA^yE6aGkGCdxg;_V&GY-uxj z&Fjxjuwdh1=&9YxNzPeUwnFY z`qx*h)q4Wx-;rUR@6>ctQ2fwC4;39sF||77ZLs9Zh=N8%0W)yU%l{~FE?4|FnQ3p@ z)g1;74$i+jU@tjapM7RZ&1HckGiv~3Vm1KO83I_%Ki(oDCX!H8WwY5xKMa<0_Q^Lv zJ-(PL^2U7w$&TWqQYvQD2@ZkRF-CpV1gA!t-JNs`>;=Diln z#a}VQH=RF!`2KJ2IOFF%?|CUV^w8&&glA?rko86Z+b22D2iOwSzx=bKnbC$a1dd{5G0NiK)A?qv2XZ(R@q~lBXm!^ZsK0wu~!@v z1pcUE6y;+Dl8-48`Nb_Z|4n9=D}UAJjb&ihay-LWW%geTJUF1Djbw@fh$cx!S2G|Y zDgsMMdI2`3R=RG3uG=Kla&0kR{PSVxKXqJ(eZH)!1ng` zf4`c3^=7mFw5FZy=cW> z9zbB|E~UFWL^`EQItK)0q+uul>FyYjX6SCd`+jS&_>Z+%_nv#s*?T|F^CSN}y|KmJ zI8si`f%vt!bhi%DF^OCHK=Zgp9pu-DS9=CcKC|;*@(tk5 zU)f?1pn1B7^G2$R`fA#-{ELh(d58PuKM7XytJoXos6SuRlbgiT4Bh7B%o9_>NIU6% z3;Yue{~Y}0JcRI%u;Lnf!CNQ~ zUaaFuCjVLVwKl==N4mXRpRtYNOGH$Z94gxExreFRmTu4I@S5rY5L%O`I7{*OSGwJv zNM!=WNzk|V4|_Q4Rn1? z_Fa`xElgJ_HEZ zVHBjv0GPo`4W@K--n?T=$`VwscomcBp+8bj)75>tDw*3E3-e{zV8LxI2@Zj&G`7fx z0ZSM3%_~~@j%Z}&xQYYp_81tmU{3z0vQU++sbc*EBCd|k`$91n9?eFZAIKA>2qy0t z7w_1aGQ{?FuS=^eD|1v{;yX({E#J!RI0Rzh#>i(jI11}bYJ&~y0}xj3m)`>=1LP2% z`7k|pIIZ9T+bx_%z}nikec_h@#;D+n7}r|XDF3MFjCHlYmeD^e%x{bn)jAi6h~p6y z((DH_Hk|UJOoznZ#D0sK;CfNob?8u0wW~@hr}oZJkGx2^NlzP2x^TBDD4#)$iHS{3 zRI!)`=lWy45@*9KlCb*=Dtx8ehw+NbYUbp_#2XWH!JxQ~lmdt?TW?*kY_n=r2LLR8ayB?8)^P0=b~j-AjgXA78%=nFABg-pAw*t?Lc}NMp^TD38Q zSG*B{w#`P59J~S2A8t$pqNUJQ{KRY5xI`Dr%F%j>Tb`Fk65o<${Qf#5W95_4jWqrW z$=hBIDC;tLhuuTtoGmt{YMJX+XqWjhz6B~cjsB;7T`H;4A|TK0a~IH?t6T7Z>zqdr zXnarT49)C^YH;e!f=zxV84NC!2oED9E4@`Zva+&R!eY(Es133im8bY<-sOx)h?bsT zY>(v!&tA7I$#gr8?UB*CZs6$jF@-VDp*|ZkFXZG|b0C;O-43akTELNj%kzO~PW9<^ ztLq=oKRz#PB}*oxXW$Jv84b^aDRuz42B9Ah94?2Tn_A7m{@S^PI*=F+zh!rM|CgXY z05bi;`=S>ZCKS48nV*h5S|mFOVz91f~Q=kLV(mZ&q@t@0~3=6wriv*?o-U znjX^%D$Fl|Ub56tIwpph&!t?H^?sl@#D6i3-WgRw=ZkK+Of|0{f>QGtXJ_|v-a-~D z4Dm1aK83d7>uA5;3G_s7o4G^g@J}4qM->G!o~Rj1>lGa2OeJ_Z40B=G0;3}2CmICj z#hKvkH%~jdw*5ygb<**lSJ)0yKBY@E&eV+>^%>DY_7neJpKu{xope#_^f0B!?qAR2 zPJJMCegmUmGZN)7=EFHan$qB}@ zH6Ow6CNGe4lA=m2Io7MwEQFv`8`_=-BR1bz;rY+cv!IR?$lJ%jh#;TZT=yJES$ec2 zMf7$2ZtGv}6p)h}&zCqA+vU2El2jBcsVP2fe3rXnp#iiw zgT=0{M>Rp!yX>MC>(YIk2X5VqaiTD+-(sldMqLM3{g{s@D_G^rCPJNVs&8=yTsqe|R|^B^CI_CHEOW>EBFm7S3a zQbvyV+B7|pXrYx*#lg(6Z90#wAFBzxRl*)@q{6fX6|}5`M;;GH)SS+2PrtZR;7>I@ z>UdsJx4tGPJ6>;FSO?B+mDDh5x;3Wd-Tq&uhH|jHIt9P=W4b z-GT$C69OiNQm%fI(snVS7$b6d&KoPkU<6sfU~kCc!Iq53E#~h1jGmBT9P{vifn{~z zF!2kf#@cfn4@AOfCQ<$vk@6lDz;|+8^<`-e%wJh$>>t zsX0iCT?<%;hDZ6x%Mjf97iB>o+&lZfN1#%EW*tY#(=L7+KpQ;XIYaXm^ySw4(>>?+ zWG2E>*_odnoM$;pDpn*PFb{3$sIS0zFI;xZVjT&2LcXHgZ*(T&Yzf}CANE~rS3R$( zaEmGJpDpB2cT(FT`>fveT}_qZS!&bKfwe)K)-i?!roU@eXn*xf zHpv59g=-DfsLWD&)(|k5l@3~}$im>*qT0IZpfVC z$8$h^7@RJ3_<`lQv`3nrHI+2Bzi;nRqFraojc+oYBFkO6Evie8XHA1=4b{xVtN8c) z@Z7noqy+SrrDdg3I5yerET3L1=($~CUzDgTFV*42XPA!VhqG4?tdGd|LqwbZ?-55lZl{VeVz$$3l^JTz( zqp_tAjs^ZkWzloRM|x7exbN%Fs}8AYlITC1?>IIa1@&7d8vjQ#_fVLcn9!KpxF3Mt z=9Yca=;a>e^?Ea(O#YcPq~#fKs)^-u1=XdlX_uxp`aOFRRH$lyxce|RDp6^>$Y6F+ z5SiK}s=~6lqH=&9vf>Q{vp-qEnoBj|&Joo|cSz_h1*qd|^8I4LCdort@C`t{4GIv* zc|rjCT7oV+<{r46ZGA-rw4$=JAUO(6b5v{hUj=vX%`3w)bPy(evGMccrqYf6yCCxb zF~ZPGMuFU7ell8zQyK7QC+5heyTyE{(mFzM#1PJ_)K+MZomuf(p+|>7CNQXj?~lp2ls808AkzKXObzC z77vyT>8H6(yQ2kY_>^UJeNOCi`UH$prx&G=?U?0-*Sq@O*_fdY^`Yfa5`-7O{?3Qv zg&M+?5LZ2R_1BjG{mK6?Mm<1CUvd4_*!V;Z+zPH54;)N3|EMe<>NaLJ$zgVV-b(d^ z>6d%W!h?XGoG@?hYUb5c>5SbGx^;PZ{``hj{#|b~>#^--E~T^UFlMx;5%>aK%c)* zJvI)4CI52Z@8z*Y-P2-BSk9g@D!cgifeQ&&gBb3{XgnS1c#C?#BQPP zfAZ+vdMEIB#3KKf8ofpY67t*F+=n|_5tz`3m7YJMw#^0n^l@xlXxr7PmK6_v44Cp< zu^zQLfMNfEC(;{5JK58*5+ypCm&)YOvc5UbC6m?kxzT?fyvjCU%YpG(qrC3IXiY}8 zkX6{)p=IQUK@HsgKZcbzx`?;WA+r>>co?yp0 z&&H20D;pz#i!Jbw`L)|=I@x58?R(5RX7N^PFO8p4s@lV7vc?wk)r2LX(CtC>bSNu8 z^3hHkrAQS5FI+Y0Dh+_J6BfwU-l1qu+cTrNb&@HOePjG*PHyyd(;cME4|(d1qZfR4 zicHy6VUX0yk#5(|KOviUmG+o_>uNu=-D9Q{BD+N@TEMQ$MyAW{*U(L>GKUrK`JNE5 zr&NM9QTLm*_3vu5g23O<;KWlD)Cmd;tY=NClpoQc)S_z(eWHI4Nl%{ZB93$F>lXct zHny)a^;UGMK-uoB7&akZnlcm8w>4^kh~lFbII;Mv`Pv59++TdsuoJeO(v?)wx&3U2mZG-55@zrG>ux+ytX z(8q?XcGbSE$x`K!lYtY{g{7t7bZFm;^>J4zEtZm~LFV6F5I=Nc1SeIboS3EI({#Y>a z$`2S;39u+lzQca%3h8$mzT2Gy?in!P+Mhqj@>+^Mb{vIla6CizdDAvD>QApZ*{Z2F zV$O`_ml05yw2TxVDc-z}D8!cWt}eZ=$$IFsa=)2#bHBF_L_8UE>;?txw9>3f3SB>q zY{7IvLXa6F@IVju$C=5=Du<#{EwN1`_4|=sdW;3@4ypP>AmL>7%EY4s*Y3Q~8HY-+ zsxlT{+vQke*>f8$gochCLC?ZtlessuZ1^&<`^1E3(Ri+(<))cBq=HqJ5ZLY{E#zIC z%p;6%M6o`28q9Zw8~(DS6Z@7rbG*=JXGAD|wDH>8um6_dO&N8MeRpu%V>Qb654{`s z2*z0y^zZmfT>)>*@TIpp<-Z`Kljw2curycz_=e2h9jB);R}Z%hOHWo*o5gIy(_DbW z(_w?-)70+n$rX;wjRfdPTlVn@kj!*ASUnY|t^q25Dc{$tdGw$kdhC)K$$=*1gVton z-DQqj!h-y=eXk9<_4b`{QGkcv&=GuC+TX8G>#s1lE6R&*DZye45AgLmShVEINCosq zHS%qRZ=?DdN?tr$@O>xuu1h`0)QtOrj5&jZ6s`Z$Ik$g>yqqDipPCH{>sx286ed!V z&Rg?824H~gCE0W+@YL*RCHYb3l_S8dgbZ$vZJ)KG|5FC5{tg?So`ztrxlgJ)I=`wicQ8>hj6(R1JAjTl()2mg^5T>EGx7^Bi@TWn*Ku7&u!+U42ZFH<)Gj# zz%{8>B;<{kVc+8m^+&a;J@~c6E<;%GoZR1pnTi%uowU3o1o{ruInf^+ z2*-Ar`>c4ej4#0E1Ql6+Q7WekA!t}JuQH*is51}*H9}GrGH zlQ$hNc8P^1sti7P@!^FQGL8G)Vn|tdAX|hz-j9TGagz*`8B`yMC@IZWJv=z?&gLA6 zii$p52+@`~l6rHbpGit$_rzK|`m>bM+hvP=VLR`@1GSkf@tN?hyZE=sADfIU(Eoh< zPa|FksUzgLS1fYYC4B4Tp6>q0#j;%+yuUYt2oQ-209M4p?!xXEFcX`@OoJq|i3^wv z$HgzQkG~68#6J%E7Z_~GDuE)+%k>jHNO_CkB^K;_EPhktv1bQ zJ)v3kXfcNupA?^o53xvpDeq;8&x_=hVsK5=-1~rP<&z)QA{bO6l~-7|Ucjo`KfPj= z?na1NpZ&%Pw}QN#5u&xbyUD0h)|PMn){h@L@6 zsv$MdIM0??XLuTDI)SBAD0$(2za;sHqe0?1cA@_6D+y6qwqEYl1}_d&G&D3bLtQ%t z>ukw~hxtl>p}3?%g1Af1mxQ-cK~xH**82 zHfQfCWw7SnS!*XM`*j@8IA58(5cTvZzvF}GbsD(ovlh@PBB8xD`}TH&h_7c#0M0`)k7 z&ds(#)klH|FSmeGQ^ev5OWsx6Hb0)^`SF-(lh54C$U?R7x3*kKnd63HyRhh}Ub%Gb zXIOWe8+o7h45aE&KL&RilklOgpVh}Cvu}O@t|ueLq+9{R4_An%SW)%=?v*V8N3dF> zz@09d0oAk53jtqWt28}U!}bb+?p#<@2_(YJ&y78U%k-ugPvZP92c@h@OTgw^n%3JL z@2#>xFT&41Zy)JV>j`-S_|RQrxRaU`?U+kHa@w%<1OGep=vJ2_V<l zio}uOFV+^(mFcPO4Y8zLV3sgf9Q_cT6d{iZGaEMn{xIR14|L00@eQM0&N`r?vcp}~ zf#DZl3MtAWa$#g~g_L~sc2GrO8D$6R5 z1O-Qs0K4loLF*;p2lwnzzfGOA1>g8B2{_wjZ%OkmQ2`uo$*^vWjr*G((#+lR3*)Ob zjDR0eRAs5OMjbnOK6&~7>ax2(iz;_gPC}BW){BcT^MHM`NU;3`N3#A|ui6K<^>7y7 z>)%|Z(`{;_!sM1o3Wze9x2Dydq3=XNu5)}X32zo78_k$zRr-*)Ka7xlFH@)Ja}yHh zX8ofzSw8K=R&Ms%-L$Wi-CYTn0{}vCajR4CMd{GyshL3j(}2@dprdGxI8!+Q#1(*Q zK|&Z`PBuupIy4B;Ei?12r#)Y=ln;A*Q^7k0n=B3%qpH&?NJ6c!oxt9y_0Bo`lv8sj zpdDy$@%&T0(PMXSD`(&jXc;8J0Gp;h=jay?IC+Le|}Spb1(W(o2ifD!s5G}CPMe~0P=eT7vM=7e_7=i+s1p4l02trZ*0sM8ONBU zO@E$K&WJ5L!_HE<>*D5N%xTny2Y1)S^NGH|j zb*m0_+-;qKj8ap-bf$+rl2Ta<(&#HI>^@5ksV5~Xve>CE#bjBKVGt=PDNB!%2O?-o z*`YD-u(4@heT9IPk|W+>7nMb0`Ym8|DuH)fDkU=A&sw}@B{D-W-KMA{k2{fb|1HU> zBzog9VaZ%~_#)rUTI%Tn;L*vOFgrRv{sClHXs`^#MijO^ai`*`D&bNfbYIDz*}>(x zH@?;>^_Z;Oko{Bv+XA2P^s4_6O!6__Ilv4v27xUc;_r4E?!~3n?2BNu=6U1qPc+>p zJG?`SBSnIOVu6A8{8*Y3f8d$ryLc%vcA(KRTUYSqFbpcJRO+Iq* z&XiMs<0hMoo@b^c_=Y@gvxL=U-LlvMspdXrfnK*VcbEWbUFSFX5HPj~R|eb@E^`-g zJYEwl#5bQESSsL+b8iwdNW7v$!@Dubml{S$1%DK*OXa{r|gkn$_ia{Efux z7LS`#1=GOuJ?~$RcU0gStnF@;K@Vn^5LQ~*6{0V2t9L}7EoUsa^)gcKjg|yD^kW_! zruZcPvwlmSzS^txX3Va5Y|Pv^K6Y8HqMqlbN|ioh6`{)9g+oV2#z8g}G_=5`Y`177 zpgF~WrmUG$wO5Ez1&KK07In7T4)qvS(Z#SgpM76)p|^$cd851>^{}6Nszi<<_q7X2 zkjr82R_ezoN5%v;yfgRh)Xs4{88Ay>Dk=ewc3N(7481l-wi~0m0I!rE|Lg4BTGE-f zp<)90W2WES{IuSbvutX@-hq6l_}pf%+S_+kon;Yt7%&sa;zsHyeJQfpk!FN$ZmA(~ zco>KVAHUn$=?;I2Y?n-IIry{ptP8Q~dUzavB(CI~?519pJd8&8j@&`fA+9TghnM;| z^#JO{akX~{ovCkWZLwc4Hu*FM-P_~z2b5Av7!IBE^tRk#IP(~k4)Q6sopD+85U{Ya z-{cf!$J(m@X!QI;KcEfTzB^9^D+x1eS}Py5UgZ(>B-r+IdF{`;I$6VPJ3b`Ai}bE~ zd-vV7J+mM(Q*xOtE5dCweE|oeFAsHZcQZ>e$sypCwXOq?-N|-S@hmkl-uUq4Z;B~p z2nQ?Jm}7Pywhfk@tc~|MU;pQ4zl%Gm%votdr!R=;{o{zruxbo`|G9tj4>Kt)PF4$0 zE#$%+966qP{9wNJDU*q{I#tLqIhTWjgAv(u#P~&3M^Z+g7}u?gf#);u9k>|MuK3bQ6B0OLyxmyK%JK=kXYf6fSa}8Y(yRJF2~m!b zF&HGZlwI~SY^hOTn=AJT8i}|&E@8>rVUW36c7F;-3Q|AZlquDI8`}<2$8d3gFoY@F zJxkIAZ(i>(+fGW(S1&nZ4BmZUxNFFFFg+!LO6OmxH^i7%rM7{Rz(46DHau%U=bp8J-6GM3bR(Co&PybfLVH2(G= zWT`)|LHbNf4$M-DmBdh*_I?)XH_g7KCIF2@b>J&KRCV^VylF@H>o#_DAS6%!y!DC{ zzB|9aAy**fG*YaZ*^AXhUd)YJpUtI0BxpMAAz)q&5?3}TL`8*NLmayhQZ+hU{q{Sw zuM>}|9hGe6_+erVh10m@3Rz?1yRVyvBiN?JBD<W(ZgVT={XlW?(i74`q9a%!C&Q@QvotCnWRpva(^>**K%uaVoFK)c{*8^o zh%%R%6Iv#rEi<&u-jVewpCrwP#0p>YE3iqifHp|o58?jx1`kO1ky=i4oKl9NVFxgw z440g~YVYg9N^-oQ{k;$m`GA3w#-f`oCX6YNCgeggi#PltX2<16*h@n)GpDz&8~Up` zUFsq$6e0CtVM{r{#vHi$UqzYEs4h049QD!O|1MGhc$UtNN9?)l_$v-ApW*#EnV2wLSX^zc-6%Sqs_>v0xJ03|-Y28PMq%tBHsDDw6wj)s0ek0t0_kntW;aKwzeWx8V>q<11zkqw`Y(udxo-} zrfIDTJo3nL%_w14Th%PmF1F{teX3rK9Ln-Dgep#=bvBs$q*Vk+$gY}|1{8u!>y{S{ z4jr6L^_>N{{z%@*mQV^h=`A&sIxYb{U*)9+KtsK`zP|qG3eW2Bm3 z@kGX_IV+m&@9(*9RFP;M7o<%3SLq@Y!H?l!@x{s18hcM?? z;@5$i?8CSxvM&Cr6f$A z8&#kEp;0lXNIA?zi^nzHmxxr`X+wbwf2rX}u?0KZSd9ep=ZrjVEwqkxu~ zo#?2Ncy@G+hI0wMl^pH*SN1keP1bNJ51j!fVfai75EN|!;mk;cPxqr+(TX_+F^n*M zhe-9Du&B7FCtnRZ*8*QZ)&%xLw&!Blpr8X0AO03;dX7f#QIO3C`s;vbKSrz)vPd!X zB)rQ(3{1|=XT7NX9G~cdvFl!PA0OkrZY83PRkWk9x8mi4HABmE(;;x4((^em%TwS| z!;=|6sNz}@Z8i13+!wb#qMu{T-s%0|z2Z6dxO%v%Tb}w@UW0rJw%Y74WzTrRRJ|?F zDf9Ks9)YA#_=#`cZ-eHWV)vh6^?;6}mzo|9$K>(jEXTbaA{76Tp<{eKoOa2xksX7w zI9c6hfR;0|<;jB7$-a1mg&EE9;l4l*)>ZnwiTpzte?4jbX0x(f&rB@36k4kHwZSok z#PDE$|Gu_)3{k(}5L9z?mpC+lBv`Pk_Y=xE4I*fx=-f=@>sY&RqR>kq}_RYc_ZpYB;dk_ z=c-eRbM;TXZq1%t{JpEPVbTipBV4$?-*BuKO>gpe2{nB(o$i12$@yin2vHs2VxQRJo@GCs%a?Docj=L$uOb$a7ZXxK*{kSe%zrP`Cn zw5|21)jJJh@rWR*o&Kn~|Bq{rL9j#iWjn_#&N?VY}u?GbP*G+xW^`>%u=#w?AL8{1^kK zFg*AczrBChWP(q1J?P`S?=vQm#QpIv0sFB|T*KV#v*VtD+C(1hhk9oNn?Dxbpuxm6l5Khx z4Im5nYkW*SFRa>bqa~>V1Nu;u-{K3heI#U06Ma(z^RL#es)M!O%~H-W{daOEj^>H` zd%{eDzk$3>dJke#&cAbEFVxlv71fM(|#XdC8-H`#;`a8dS_RTF7x zKte^^0Cqkmj4SN#(DvEQ=C^~Dnc3M>n|6~9VuvIqKZ42dm)lboKi$0{4+c>IqGrLX z>W{fu54$D1YA)tXR|2pFy2{T%6$(iiqMRsZmT?-reOuD0#C+7 zVPjcYIq*_LOKam@Lr+i7ZuYiyK_W&BI;f$sp`+knQBYvSfqaNaN0gyK=(cL4Q}Eb6 zNr8j8P~hTdRWATPd$#-82sR@=ki>QiH}khg_P4_C{DrS1XFXS*tL`wx3?I|7UAj!s zvy`@d;OBU7@~M56?x@9OX)(7UDR9?O5r)+F31;3}VN@-;4^sTL zgT4DR82+kYTej_c6JA3^lj}28yT`%H(a|B$l!e?*EY09+NIvpIdS@rO1}K%tIa2ZS zVt0=}>dLj_zrNoj53SwL!?$>5OFrf_jEIUZAtXcpMVrL%<&OcMYjDv~%bj&>cy_pI zVWJ>G9*4IEk`8nL#KEK^F#ay?^5wGu8;jTvgIc)0_LW7Oj(U~nrz)x^ZGq6p@-Pn4 z=O4L0g7Ux2dykQX;ZhKMbqg=j(AMT-FfpNR0qqy*-%x1;7E7(#SOhD|!YPsj$4JlI zTSf15=a4h8H&%7g5)Vp;&D(jc*;bd~A@_1553$V~lFxecRiUPqNnHFr)`FGIN!fhL zmCu6_FHpdv$Ib7II^2Rh)%VNKECYAf^I!ZTWBS>@Kctpf_%4 zQ!tvjAE4v)r|Oh}iX6E=`Dq*5fUSC6p}nC( z(W6xJlCQ#YIgNInh0XC2DE_|Mw`m(0r3y3w$vE(~z-MV(3C(>p33iiNLB7phCe9JO z!rO>vE@Js39fAJV+a!UekZ+MTxP*)p5<$hiIgF4%p5`q%S zN37c0J36jrN6G^KX(f+kHF$fOwwip0>uW9&P$*w#k`~G<2M}&%i@!SK>}QrVQizmkav;zg3ViDBGyClJws+Nw^2Ky$ zZIRKqY$k<;V&s1B+JfGw6uh6HNF_=}!KeOR_{~+Mn6CD~J^1PIF$)h2Ml=|4n)b2r zt^{;5!8$Lx^|?XsY)dlV6*MI<`-q*a=KFY8e6rB6$fD%ml9ofu))GK!uP!V-F$vbF ztuitC*+MjYr@@b2FgJMC2z@~GGrDCL6roj_UizK8poUi1m2%)A&46$R{*mbX>Vofz zU;VAT#tP*Cb2P`Q9YWoBH%^wgl=6l`USf}vTt=gB2EmVlBBvUH(qzG2clMH&?v*Tm zw43N6{Vr8f>-W^Tn4N9=$uR)j&0c!XLvjNSy^kYX>i}ENX@dv zW$pdq>guXKXX6o3*IdpTSLQ-~R_VF5-1$;=Dja2868kR>%kGfoltXE%mX?$=>t8*d zSYf_qjJOVD#dGD~BF-SIz;|!8h6q=rYvH6TvEY8+-rl=p?iD~g#`s9j+ znmWJ*wb#4M8ok%h&=B*$>P&ZdKX01v{ZpDl^H+6jzWyOf<5sCZOa%@yj+5iTx0qA^ zUil9gzl7B-02%;*Ym1ohJWx9iy!(8xX~LWaajMu08>w!d@m?Xd1-~TGF8&lMb6fZ& zDo^5Y!sRQjDKU1z0)JoeA0~hPNQL`P6fc}Uf%!R5lcfpG_9_nmAGI(LD}{L+(Hjut z&Dp#rwMka(OE8Z+t9&wlgM%f3I&x3mib(}`7}VToJdx6#7IZ5ro0dAFc3etdSvfe$ z!Ch26hmIb)B0$L@BqaT6D_@a^_?R*5=%_&n~;E>$UJTx3(4pf+0MC zQpd}~<6Pwp?Z%31KE`=^W1C#im3Q#f`Fi=p&Dr+0p`mC-w*J{C=F4rqQfEP!B<6f$ z)L`SN)kwaclVfltG$;tX`9+TL`2giLq6ih z0WIC80Sk|CfQ*jw?c7g2$C!sV)ymO}#y8>HsN?nD_Ye2s7sobrEJ2J={wobdtFr~J zO(VERvmVr55{LH6LK1PH6VlbnX9#KH=SCHA`n<-$hN?FZD9_TXbs=uN^tk?CM+fMN zyv=7lIOd%QkdSPxhdq=pdEPZ{oh^KFwDS1jSUPAI^43gtd5(;dP&EEmU7R}dC!B0m z(%zonb&jEptbFNMqFsuYx3~AzEnL?`;I{^n*$3MpD~U_sp@)*k=}8Rb3v!cANIwru z*E5;vXsXIb95jBov-3kd_+*mCf1?mH*pi}}s9kIKUYryW@X)8}oX?eBYm?1LTq5Q` zT4uv(&ab5Zx;DAu-lTOGeh|Lu;5{b3{WKj8q#djenL_F9ibF5B@8% zch=U{dO5e-ou=S$*PI^GzHs;%H{c#;a}srm1LqN zODAp?=UoP^W%y^jYETPTPw^sQuF%fD6 z^r+ctjePIFE0>4Ou285R! z1bRkCIa_K{EYML;C>sMIJjKqFB5!W0IQ{?lz5Z*7zYl|il8*SE3UOyL&;K0`*#+W= zoLOUvi^DEfwz&d(-yS`LA#$ZoWVy6~BPs_7;0(65a$a3robBd+=UhPbO_JL#NqNcX z7xJ!W^2!wTuXy>CKc~mo%}Z1N_1lXhC#$oeLHD<*cub5NV5TjTb!JI|hSL{V5tJul zUQu5)eBeSCe7Jb7-)RcSjK)c!+RQ#!*(}a1Z%1Tj(9{J-cr!FcaUWKv&{{k|emuV5 z(2$~5M0 z6CVZX?9qyJqWmi7rsnp%tg(}QjFGB&inpcm#4(WREPC<2RvUBnnnCDMg}**Bvhm`y zbjbAaI;}r=y|>II;OBU>$+5~Wz2UJoEbk(-Gvw-V=X5*P&V^i`DG) z%GuUCib8VX1)27s53KQ_nmGT&gYRtuo{-#V0prJqH+~#2m(G~YT%P=~kJjFEEe)PD z5vW&*iX*iol%XayBGH5Kl#OW*W~>qICxnD`{1o2^l3ZRhP111-_*pyft^GYV^IYrR zto6HY59T&L0}7+;(LCWhQyMDj`}ob-(G~DiG{{q%Dw8CtEcp(g+P_^`Sh*YQ30pey zp{+a1YaI(7xu6t;TMOi`uo3flRC*;FZRkZGm^R_N*vb=_>EKgGMSNq1U!g_ZEKT8T zx}kS!FKRFJOxqD(yI-LFQ-{RkFM0+aE%}}>%@EIdt@5e5&-0Dk0o@4Z(uEYdk(8lNB7Wx+3Z_YcSJv;E)30!ik;PMh4RE}A z4*6;6%KIwkGR+v#4s~40*va}}ncrbhnZ3NXvqsm%VPHrRkbyV?&8o@Lp{vIUwnRyR(0|qiixp$?)}y(1vpqda z!NG7nBfD%2;k%i|pSA*!XVVdq48uk)Rs?_t`umaSx3MkBcH5==%rUDcAfMKlvSq3q zy)r7`0YC#A0z>EvRbErFxD+z=0Dd2f*b;TcsrEiw_2H9Omb8lM42|U*NuDK|(dwSe z*@;vHDY?p7BUUY~FiYdPF0eJ5F$3cbRiHsM7KjkQd%4!EZQIfZTkJ=C{Ch@r zg5C8^CZE^{d?qx@v(Pu*C&{iM~j#q+bw@4B4(;`$% z&WOmexATTHdS~)l!smtAu?0&7k_xyB@Q#yuIL118B!4y^UF38A^I;8=xsl`1+nQ7Jt=QUfw)6BibI3Ll<+R zAMF*y?!7M}1u!6}ersVL3A)xMr2W?>HzgmB!-BaNh}F&^j3^=BR)Bg=zxGkka7k2j znm9UIy3!(smRX%dR74_q)9og|5KBogWLMX(d>o5J@2Kk?pRA- zvb!Fz&}VFC860kq0o_0*l{{@#0D1bV+L=z5c1vV2dBlsZ51T)WQ0X#4DDFS5gqsmc zgBVIQnV0k3?R{>0aj4BofziEw2ng-Il>znd^qoe_IrhHSDn3aL|y&;eOZ%?s984kxX(2RMg^tgqo!5 z(%5@N+*|djh?v>zCDtL~pA{>wjHrDI2il~v)MVM2)FC#3f~Zso7_9WyummIQ)8S`S z3^psPGW^2?XvHSvOQsx1k%xFwduadtDrI}HY!y+yAD*DlH9d1gLCv4}8&)AtKEuic z#O*5oZ-}d}hg}dkNdVHu(F&BF*yR;_X*p zM8G6DSa9c2#D!Q`d8kD{W!jGIP1g@4*E?n{4phfU6M4l-J4nDbNTxNRIC1g%cLHX# z>(Xyb=#4;v<{@lk%N>}0)Hfgl;t0;&K#37=R7<*5!u*y0CQ+OWN_)A<`P~MJty4%< z8)V#d>wo#vR1rf(P2G^eX?lAa3DjbBz*x3a1+^2%>NqY#3f4Sj+MNwEA>kqMGkjugEgT}c;8O8^$h!xkPBee8!Opo3ZY!>vG*TTpR1bC=}KG%+aAI$q| z^_9Yw8vhaxOM8^ z#0JQ=Cvq%JEd#Y$d8tiKZ{`AtxsILKI#w9ND8pbDUJ}(ngmX@su$l6+2KW5Nk-_); z{Gcu1P_k`kY_!f%MSujj(lc1=_y8WS%P6^3Fhjd8Sp+P!C8U$%+kUDgCH&W7|bT@*u#G$*S4&B1t z-+Q0uzCXPG!diQ;wdR~-e1=C1))eK(8^@x=i_eSiu7vh9d=E)l{JG^2yshNRw*xx} zGDV`O!@~DB?|S>?DO6b;aBv+*ca_t-w$9n~7}cM!_-b0>Bdwwb*{oGBNdPpb1k;?4 zrY&C2I7}pUK?STE0P*EOM$KBjcKf%9k{@=Q1uLt$3s-35wO{*VV2oH@>PjdHtmzik8;>^(*`GcI{Dq{qeE;Wf{0O zKZA>NS68W*s$c=Ot&L(N8gENlGR~rF2l&eOYT(Df=XY~E;rsVwSuo(}J}%#9!sIFH z2$uKoyy)xC>G#L=J5z#bNOWY2t(#Dp#gB==ad~_cV#kof*H#^UZHUKG?{Km#P${Vh zSK4BnH$L)z;;4-weO(rXC@=G!yM-+x_aAFmI3kxHv~NQCG>&hQPtU{VV6rTzSg4U& zDSR*%rt-S0?hA))YgGcB6bD(OKZWzXkg^4k?#hasC7XcIVCBKi+DUAumHbswfNMD; zbpp#z(}BNaZOmoDJ54hyU(Cl!O}qX2D_zOXJVt{}19$(}J#j zhZ7@HCma@e`#Y^__?)jIZyi^brt)O zs1=>DNZwafVWj6IeoL6vl4X^F);#%T#5|{`cp9nCXJ?WC=IM!8P4xUO0H||v|9<#K zlwX>3`IbhkrLobMoy13Wz0tEjCVaGIg{1-mKP3m#WxcZ3kt6Nn`kbS{`uCuKHef7; z+he^V6|%iu#Kz^r#UH!367W7*Q|1#paeLpJZ-tL>jXl?d6c_}3`9&$qU;FU5Dd+Ae zV$Hur;AA>DrfGb(bW)uuBhKeMGIcILu2iGSs{ENHX=sV}jtH5X%$XH0e;>7iZkAuc zSe#{}+~W?F)LH=FMljpa+U|%NP|5y7Ss&w{hU6nyK0aFG0F(cG1(p-LtxW#V&x5A3 zg;A1KM@xIhi>@ziDNoN`@O+qMb7$ve+xFafb8*VVKu;*{UX;iN!QlW)V_*)aKW40s z(Ns~;5ww^;)T}T)f+DD-tJX(V&XSylR{H?_E%7Gn8|cD&1ah!!l!1)SCB~WM#!bA( zV%5Qz;xdbC#{B`~ZS8BYosuo-fe2M$T*iUNp8^ik)%drwM{+i@VWwh{k~-Ru*Pi%6&1cpps!*St|~-KCP_mYG2Qa24KE;2Zdc!|Y&K8D!DJB`OexjfcSmi&$19?yx%$2;_ZbxC`8jqSwtmRb zUk2Z@@B@^LDk4YDz#-S-3iQH={btsu@LPU3-dlchYE(5VaAA@2gj)XJ3hz9PW_~EL!V-Eh=_DMx{P#+ERqw^9?8No)InG=0*%3-rXHYh?;n& zEiW(E8dvMCCp9d(TOMq~VlkO@eKkbX6^at@nAZCa$Mc9-C+=A?H!mU-%q{gOCPCbZ zEjmtKf8l6X(&c+RbI9AGWU4(fz7}r{&NkPA243*z9vt(-84o-%k97tXx_F0kVur|7 zKK#uJo{HkRh6uAl%xtZmb9xq=7q%-*rJ#1fA~T`-&a$Y=>bVYeuLnM=nL+Q(`0zn| z{7@hXYQ&Fou;m7txudD>Qf^j7#9fhY#%Zk&vu$t;+DMiUOMO>`>ELpKCm6Z*IB?u=$bka#U*bJomNpp}giO z;J2xS8RJWbgJAdk?dr+WoH&3H84(=c>Ag4iuZKTQ>ZKa#jEf81vCbo5>bW_;QFVJt zcudK{pJHOA#uO)7omU{bA|B&iu1Q3JjM1<#j9KxfXs%FN!~g-l)@ort4qBG-1Q5{i z2qG*TH=GiX`VZ1FSZMIRu1Rhd)0akCG}{Rt0euQT_*|vle^XQlNXe$17dVFi_Zom* z^iP5Wg7U%lGO|QMw|^Q}#Xf!<4FG0`*E2SL>8ocOSE6k4IkRc$uG;d?>l>PzmRq3@yt?(-t+eRmacpN)%Pw zBMCC#5JsEOQpF6ZzdU!Vn{SA5R+JU_aZ&9A>-N4p=%t124eQ8h=3?fKe zad!YjJ&$X_!Ts?akh29>Mzr^n+4ex;KU(rMwz(PGyxQTt{ph&bcI_vW4o5paX@v(^ zb&7wzU}ym+)_j!c`cT{L1c*9L9B0I>tc2(TUD|(ziyfZ6>V90b!)o0dPY_iTV&~JBQN;Mm_&BMzbPP5WY?*>!h=kJ$N>T2`BN=R`W)JU@z^S8bfNFz*a>EigIh#|}G zk)rv*MP-?oNnUcj-t&o@iFGzBwVT#A@m?mR zn5Lz`LQGu=1$-mz<2gMmV3^48s^iCgEu|Zz9W%Eiy5R#va z*@)}4AwW~IFvFf348IpJB9gsR0q5h5hvs2RI*2v4frAf{mePC< zOO;0Jng|$?#Y!*_QwcUv)5WslV)IXk)%j@e8E>is5}k3ALXJan_~Svn;!H$6b%*y zOOg63`W+XE`&vH4wruCleqKSgf>uJHby)!cR1u|WW@sdV$QS?Ht}ugmrZieYu~_lE z0mSy+W3Gr#lN0QO{-^H2si}!{$_QBEM@}v>DSZe&3ieMdGEI^z|(W(Mq)5`T@p=- zyugg`#f&>M(sp;O_LV4j(b@CgZh4;GWE_lX`TI?&kixNGAqcwUmXs|4l1T_XexHQJ zZ3QanOhQ3$60NwL4#99m5^oh(`5DJfUGpj^gw={_?zODMbQKb}G>y1-*4XX$kWYK> zzGzE`N28NqofRr@^Ult|jFD>0##;s>s22A0ib}+rJS* zT(aIAX1agrYwBb9gZt4KSCa|C0RbO#VSau5>YSfuzuUiTP1J+H395+~H4~3Bmw!qw z`w&8<5ynIqYlAqLk1Q-M?kIRPF0sD4`p?OA1lPmQ1jM~r!noFpmJm739NjhfUF{7& z-JU7`~I#cykq;U%V~&W(rLd zZOQHZPWHz4-EI8~BgK<#I@hY2J)2%?QlB6kWQCgeA=~(%phf%nX209k$44LQ{CIo4 zes1K>TGu0q00;M{*8vkCChnlhi}x6n5Bxog9foVR!Wmw|*g9?|!m!Xkgi$S1G+jC-) zPwzE}B>!$~rQZ#uk|kY7z5D2GCH3!{h1{)nFImP%u<4$iNrP_O( zPq;^wx2)w@j4b@-R!Q2hkJ0yh`oPWgmtL@D{cdp4{=U*^xrSmfLp_=aeAS%wXUudV zbDYGPy-@M#)no9f%c#JlK%vm4Xnf zRO+HHzCmYMP=(T!qy+*=D& zUYl?-ycjM!>Vp4Ne*RX=mvLmqV>)<(!DE^!u*~uOU9r)#9@*%*Lmyv-ewhqUyD6`_ z(nC~M*Oqw!y53@_O-K%xYhGAjO^S;+PISn&|F1QxL9YV!F}=zUA)g3o9#O6q5AMaH z55kvJm*=mTvOX7br=FbT!g<)#cDvGxZF9Q(cMUePig&-~OuC z*xo}7-lh&c2nXV+_Rl8OxlGp*$aDZJO1!sF7Y7biM4D*L}e5fxS z4TWX)C{v-x{;$+FonT!rwpAM5U-z-U$)AW}V?U9xws^87HfqU?^?mSQwU_+Jj_BL_ zUkaaSwr8m4*j1c6zCGn19njhNSF2|;xa51~`B&}cm@=d0)v>v43QqG*X$$3xl7}Fl!3B?Q z0_rsVt4;)d;SuS)Mcf>h59;e>MlL+wI9@>lUBeBvUCG{?(TFnIfqvq4kxTo%`o&{PBUp`Z9DM@U_7-uF)x18;vFl*vIdi{;MNU|kn7W<| ze+1lL@)}g8OfT_Tk5%L~)sFlVrjQ)5zNtBhJi=#uFDOsMMHSaSjEqAcGzCUHG>yD& zrp@)Ie9OY5;idKLL~Q*VYRd>Hy=4j+F>2yZl)iHpFjUjhim5ja+jNNwd?0*rW0ALmw3Tl?5(Vn?bX%2U5|-46L2qx;VtH z2l)++X2cvN{Qh{}#A45u?-t`e=^c11_vS*+A-In>bnWICO*0*H4F}oVKEEdj>(FFO zg=V@7+We*+i3DSat+nXE*EXh!_e{M5_PH1?8YpyscX=g-Uuq3v-|N-azk62=5{iEy zz|x|J@g`szOR>omRhb9|M-}qXVcaB;0htE5*jzx=(OgnuSI&+ zbt6n5hW5-y^hLgW!UDw2)7^IP3Bt?knY4o=cqeO$7m)>G*5%vpGGc!X*Ph#V|Jws0 z>?At4yK4bdZI3UAcM7m3S)I^+ji?X!Y$)}M(n>#8?|uErBwdAL-)kb}DstRACr=@OhKF>9*78BSi3N04hojC zNEV@Ju0CHZ8T6=LDHeB4!i_ywJq_QA1CYe%K%Gr!$_tF;;O^%_}iteyhJPPJmi>YOj$EBz? z@PpQyLfwuiY>fmINGk-wDvdp722##B%n|*n?A| z*4BgE#&wfpIpp_BZ~B*NP@b8_youy##p0_qehy7CCDK+Y=vUqi$(&RQ!7LzMwrMiB zkz=u0|5F$7;p7n*GIZ(0FrUTgyUkI+ z6pJ@h`1=<_^bIrvUmp}2s?b_;A?Bgr^?kBZ<6WZ&K@zG&p+SZ5CKsk685Ark^We); z^wdeLe2|Q-rXmaNevT4Lx2v1m6E2S9>es6fQ0C{t$WzFCQ#Q4BYWUK4>A{x|hAJf` zfG@Cp(N~6LcdWc+QVGy2N?7-7D(rsRb|(AS)YWM;tphEG)}!BVCIuGC8O99u6G~1o zT{|22GS+ZkG7lN~rQ0A2z8+CO4g{4Yh1A6iiUf}Kgx@0u43i{!f|{bR`gcr;1dw^3 z8pw}S?reb=x1Cix0oD<7{2u8auSC17PoqN!A?o^s)!y_=mPFL_mHu#>0_m;RtTe3leD=v01i8+Q z3oq+-z9ch@mYaABfG128E5ez!RryL^5p|<~u3t1Xs@0RI%iw(WSa!@iZhH@zMdwyM znkBTzW3!LIeK zg$=VoppmtAnR(!np)9^&V&&}dQqWCut=B!+PO9$zGU7je#2ecOGiKhENjM2IO~>RF>7tgFz*>ablDFIZC&i#Z0OLLO}*{|af2ngD~%S&|1;8^H?o z?H0`em^f{GaB7Acewacu&+rV`@EL-(HxBt~DgQy@6e{*#A%BvUQFy0omMiEWUfI)tWLhG8# zZdZ*ojBa4D<{CT3Z?G4Hucec+Qi<@(5BAaxU|$;89yLBA4swDI=Z_pcJ>j^3qzK62 z!bRWFOwN+JqUqA{`3k)lH(wl0hh{FnB@-(VWTE9B5%hnT_AWb=CMIx_aL{T<)>efa zDHV^V&%Fvg^GnyEEG4)?UFWJ*9@gZ?v77jT_c6TLY5mz>>OOH9ty!Wa>o^;*!3hyM z1vKD-F5Inl4Q;KUl0fuZ!$|9uZCK}Z+ha3yRh;rAv&>=HWp8Y;AK;|x4BG3Z0^)CW zmcvk)GD0Dso%5>iHm44$IwPBw8MMu@pdWl986%~fN==m;{e{t6(_V<=iO>LanLwbg z2*w(T>FJfCXeE|+mGSKveY2h`VJj(n=a|BkIEId=mnyxhEIBDk`kQ)0kE4QuByB3R zE>x^4nB7I3gF0{lFY^+0`%=uJ-2gIB6@el316sH?lMpCD>#?0?+K^~Hf~Tz@SAN7x zyvr!99mL&O_Uj?Ob})6iW*w_NRcWoAf-foTBEApDmbwmn;9s5OOfpwSdt*TMt5$~; zw=iJd>iVYA;a8CNs@HYgLo=t!ie;g09`!{%Iaoy{hway;N`G?v^CY#g>zWk>%N6Ms zTozIQ{=7V&Hd;+>NJ;&I3?1>^Dw;x$GO=`XbF;L%S?ijNj~KRt?5vgA5Uo@wiECj= zkM2fAcj3!j&k*$?F#!V!YuC3cV6B#?t(J3bi-j4aP^LoGhE%ra5xv8rl|W|})Idu~ zB_;C;mi;968Aq3qe?CB5geN5hg>S&fzxZlcC)JVPon6|m@Z#)J_rH@aVBXes&cMgBd}l~{$$-pmInmry z79Z=DBZ#~4x#_nq?Dr5YQ>j{B;R?aeB+S6yaWJG&c%*#hCc2umxQJ-%aM5ia7eD8u zV!`vr&uP9qHn6mcuWMGQWy9t_HmV2!bVJXqNL=tve&rW^bt5Fe zzqQi5E}IQQz2m)Z`;@oMSFUrt-vR^AftgN+SVc`%hB~u0s&D@4yY|^*6Y660VgBz$SLB=FfoqbduNN%;qyT zc!zi)2uN690|3hwl9I#;lRw%#-0hnwH*a!WjEv0CltV`z@@t#I(1MnxKy(aresmpa z!rUD=?$b#wfz70(?Cyjw=NnSi`qw%vZw~{T$@tZb9!x!zvZk%ns>VP5?*pRx!wRQo zlc)b4Fo_Iye0k*7SZ-PcJRU^=pYli2=qd|8EBK0UW6B&-L`|?yja>7WFw#0_Ol=UO zj0Y5mXD(TQU7au|1wtn^Z;zn~9MRC)H+vP>XOHlX4Ck!cDqwu)>DNdHDdU*DZHVLv z)4B+v`vuyT6kYH)xek3C4m;5oxdvwGK-Co8`=WXAG2y2Xg;Y|_wcfgYva#r8WtrEb zC3lqX*<(>Y6BFj`Q1tkm@%`p&A*;vrQb@wuL(tfl*~mzukc_)w#BLyyV;>OZH+N}f z#~0uFH5?OaGgQcUb<~>{?p%-dJQ+GsX2}jZa!{x7f!5g$K{ph7;O&YJ1_I^Ve=n>u347lrB#^u?m$C7-{IZv@czQ} z0)K=0u*=|SA1Y#mtu%|Q>$=^t2TbQ$9yp(`I{_C1uj&IY8X6jIlY^(Pw90$FX$WVA z%Y@)$p4j8J@vqm!gI{j#=Of7IZGJX6@bizKTg`MLF;9-5-F@wRK6_rvTy|J~HtV_3 zNzR;H#kn$!S7h%I@?S8GZ(YL0F!SoWe01lbHZ?$}>MBzR7P{-@4B+JOh7wA?K~9Lf zDf|AWCGz;!R_$-`c=Au>==NT?uTniaYO`JOO%>kJJ6B^P<~$_Z)S1fosdBm`KU|3et~}0u?eNH|V^r6VTR7DJAx0;>p7`HuUOtu&w&W(x zj|VO++vl{0gh80)W(V`F{d2_9aMB80rRgqsamrH{pYpojm!q4HK(cwFYWw}5;qP$R zk-Od~4=^C|Td{HXecC)ZF&g!I2?e*&Re)KC{Ww`&O6_10<~^}9=Xs$jIske&t+L6k zdst~vsT`p>cT+3iKniL6U0(Tu>OiP!$@GAjLM=iwwiJ?EJT=OfO34%xqp((bdQDGt z0<=N)H81HrFky8jW{^=>?LG3S+9TE9zXy^zn5qSc9;IKwuJQ^Nk`jAde@u;F$SB4r zeM`7Iiar)EOjJKh{^v;xUH}euQD_zA$SJ3VF76D zV{DLP1-Q;QuD#l@5dZS12~-RLNP|0W%&DmGRUF^3uv8{RT4KUA(uevKOZ?sXKR!o0@ z+EaQyzAVL~Gfh)zZLRC9x$XH(Uirs1j%Lp_*d7=~<99q}ScQd|@QyWm>uo^N#ikz6hwQ&Uq? zbco&l>lPIk{;Id!BySNZ{NLZ?!i@C#+g}jKl|T_9rM=&wIoMzESDbCP9%2dDGyn(9 z>(SkLK#dOohpXTJ@)7vm`Z03Yhh%j3q{d-A!?k;ck9VSro2?%`n(Pz1$&*-%kl5Ik z%rJh&)fevFaBNoVfWqAABaN?g70_7*T0de!W0Vl3fp# zxSTI*P$|6JB^kbbx_T1xV-){gD7{A$`Nzw@>S1al4wL`u#38w@o#ju>^>DHk^B<(_ z^rF^9FYC-q6V2WE$40dsm)}7E}|c_kVj+L}0%4$j?H>maxs9i*pI8;GCsB#S6if(rJ5?#M(I; z$?9E|idEi=8QRdmk6;zZ#(og5RUQfWNbjcxt9F#tB@`0@nwK*X!fS`;Q_s(9kMl>@ zN3<^A6k}bIs~0xFid$Hb>gCx$7h|e8jBP4WE-2XX?sa=I3j=;)5})F_=aPFhas3;` zYY`{lcJc$VQR+V2djcRuIB;n#r2#z=HSTM_0CiKi-W<%+=<#O?LG2QMXC+)v!pv%N zE(DQgLmc^RWB%qew(DqZ_IlM{$p-WWK~Vuw&+MXI?FK=eIj6#<^8LBA9!A zWkmSE%=t1mjzpl7g*SCCQbx>O*(>Ch$l!nhztFOnC)%hndb%N&H8~q>Y9zJm=1aoF z!=kSkT>g)bfhS(N%6mQBS39W)`#fW~8;6UU7}`2%(Vt8O5Kf3fbaq(KKotBfFlNq) zFA4ij`a_`6^SH12yWRt~q(@Ks^l!0*4Ai-DTzM*xo_{HkmdC9METlf>4S8v7JkJe` zdk&#pqUv@~>~KEELY@9qeHP66EwPyVqz9ePT5GX4KG(sO$f%6aO9?jSjtITQEY(H& zqgn`RU9D=&SY0w$`zNvY^I4vd#{ZNra7&H%@KKzalCo29{}~^_*ug42dy%~ttwR!7 zx5bV4v@=60i;>ob;Jv>1L?u@NJ)Tb4XMCN&%oNQj_qSMg)z!OO)c;Yq^7nEA{sSNs z!5^6bnEH;ze{Xh(Wr-*tj0<1LR_55xp5^m9odllnen6On_l4VCe5%U?8?k6Zr{CVD z_-#JS^TY@dU*{Ha?;ZDSJfAOvIH^T_aybs()xZp)i71q=0Lo)A#V3vLOt@U9HhDZp z=C-px&8nB@wjdM@zl5=~{v_NJGyj1xgYlh$8^e(Qc%uT`zF}s#hcQM!JK|{ZJ7kML zq^VT<67?w02UH1-coxe86twza^HBe&Rfg<(;*ren2eO_StYtSiJIL#H?rknStPLAb6zZ0GpaG0Uwg)B zH|He|y$irL13N?Y-_EG<@OE$lyE1nL*cCd#6^b_R&G58{i-fqbbQ7{li&G%lrn*Wh z3`7LVkPpQsC@otTLNz*5isYn?LRjP?T1EXMWrBo*Sy@9 z?nBMl)K-Jsr{F3zNRo)E>?7C_6{3cdA%`Ncf@Au_@RuqOz}@6`$QprMkXK&>f)t2b z?>Ia|C=qCB1FltL*-gI$vA!r>Z<1EY&eu#+#!!R5liQ}~oe|U8dez}zA3EUU31slG z4Zxyz|4^V}8jAd#mM4FatcC_+WN0)^&r|8oUPfDoZDySn*dF#i<=nmXC+zV-fkkbQ zAe|I4^a$HAv|ODv^3id@uRo@CoVy*wPBaQqDE9?BO$2)hewyOWU`UD06P{I`3#m{1 z^%V1-7Zn?BTEO%QUkYE!x%7Tjy{%?0$H(3Q?rXh%yS{k4s&?%s(rWCJ_urN{J*czX zC*J$6rR11YE0VAT;S1K>7Xl|x9LG{C_tcXOPue2EP>()rj?|^stbYB7@ zOsC1#m%shN!M9Bg?LxWtKs)|wtGK#)u>a`#!4KT_N!PelpX0^h^zn8t$7J|4E;#a{ zE~3NQ+Gk%30Bx*$-lj+=|0-50-Zhhv-`jw4)%2y|$B=1OId02bs?%XVyK|ApFTrbGeuKsI{?_>nk zpLLNlcQI~6i$^<7;cuUE$}G(J6Oz9ZFt6Fs{GlRAbRQACb}sp>F)8%!b={PGVughK z?ghPkZ}A=O3*~#MvNn&$J7#ayzyv=_R`3>+evw6Bv&g*pRNP0|s0xGi+j)=bs0}*c zq@Ps0rgjoITF>iH>EHq;)!&6O7sElKEsZN*O*sDT?{rBlk6D#gWQNybj;UMmu6gX< zJjwEXQo>Aaa%cqFbR}0!{maeWA|#LBfnst6us4hIwQ2+1Sv3iRS{MVsFDVn}%jVD0 zbZrq9e@5cP^IR+3Q}XPS;b&OA3u8Ymnp)%?4VUvA zI|kR1QJe%p_%y|UdP3;x!K)lZ1^aYDrCEE*RUr^97>wI-3+w0ddUExJ&`-pO{lI4@ zMxaRStf3&m^(zFCDy||f)L9VK7!M!t zYeulAVM1MBY1OV^r|u9nks$l{7V#0{Z)d*dw&h0o@$M|F(olymafyB61U(REF}#UC z!}YYH6D9v%=Ji||DRme2zX^#-t87thZ0V*xZ&w(qq>zT^Wz%rUpo(oQ276Z>@RCPcP ztoo2QH+?P>y}MqXv4Zm#FJb$z8D ztotYY(IHE_PkU}UFn=ok1@QxlB1z-p?-Aa<0>bP%$gwQnHECm+F1-;leB;hS0m+!s`;m_(Z|zA^{yNq2Yq}VosiGIyNuLw_d6yhMHTGisOrF2O2Vzix0q_z zy$(BB{^lcmwW0gZA4^@rqOI3t57ddp@RI*^6&_6>i$rdY2AOy$f9;c#~J<9=)J zlWTFtr_wlHIxeYpygUL&{C4EhH<|h^?~~V$G`gX~sg#VxSdg-@l?a~GhSwp!|_Hg$J1=>i_a7;>-E5YyyyM31)9KM}Vo z+5=H!xKl#SeI0C36r}vN9j|hgxwYn#)2ElCy2m#*me>-@GiCcz@yo2v3{-e~-p)`u z%KNo4p#^?0dvV43oo(DYg>bZP+m53HKfNuxuO`j@tA|rQdt+X|_^%RHa!cI}3Aums z$bry!zooM9eh}c!t=uY_R!%a$%z_>C<4V|1YEjL$ zTDBT?dDz(5C3f*~<9mQYeRLF0IK+(i=+%0pK)Mq4=P${s_LY(UgR|2@;I2_+`i{R+X_$I3N}x!O!34 zaRZyy69}T~hG){%@mQ=3SrV?ney7v!xqRiV05z=3x>5K!bb{ab^%Kj{<)3$W}Ieh$sK z9G`*bhgNhrD~;}MH3A3+%;?RJk2U`eb4K&Z^#9Paj3YXz7YY6u!sjPgUs%X}T@@rM zFN~B?tv+K<#CR1hfQXccx}`$M9~C!2kvG@sJT+C({$^u!7++2wJ%}-FpfMz|*85$_ z`-NWdUPmbNGecu9|IgyD z`0}3^yW+JQHRy3kTEuM^^Iz90&ErN^LZzEa8^-}R*ic7B1;!#wfeMG6{4JeaRoiZC zowAO4)d!s_xX(x{Y~>bQ(fm4k_am%wdmW&JN_hJE`d)wV@DXP{fu95{+lxQ$+QDj! zDhKlqkW~c+^INsi02F4TyAiBfx3a^yHvbk1JTD`~U2W{__UDY+@4EraS?N*REs_`Q z&9C{}`|>7-b%q{lH=|oSfK~`6N#xbN@L#`;&FpoEvtj8O?HfaXpkURt0Hl`OsBS&v z(Ee>w^kV#o)~L1^Z`c}?{8VCP?uk)pSA?!gz*#vOBqW~o!3;NeGr zNAwxdc7Fa}T65_D?&hY19w*wt>uOP< zy<*{ct||g#914`e=v|&Ojj{^&sa76@lAoCYwmcS1Y+R`=h0909Ykhk|bG}2xw1pk- zg^hod&Pi0VuHXvGIfMWGSmlq^?ZAQX^Zm8>bdyF{j@JFwXq{B|cqS%ms2ZeU}@Z6jbYB?kBYf z5y~J$dQqp}trF}dqKFIa4>>QU0ES0`Z~R!MWT)NrbaH1!Q1|n#l1Wvp6uVH)7dLva zDD!KynhJua!`*xYQztD0KxpVl0Md;04wv$Ai zN>E}T*2u@{dedBkak(c0X);Y>P?6jwb--o}1ZR*$6>kmi_?w~t*$xy+-N#krlGuoU|MEy(kZRs9-(5Aj*v?ClL_RQI(8 z9_K(=0}KilmY3Tr9Rvejf%n^M{Bon%K~HI!l=(Q1(#-oS={XWD#;j5Uo-IaYAdacw5pY~m{lohY@*1-bwp)KX^%sRo)eIY@Sb(Xa|l-OKBCx1bK?9& zywLXDHdsLK^NhnpV}=|nRMVFi!Zta-x%*K@>TWtA}TO5j4&nNJGxP zRsKX9=i0viz*l*qxp_GyoX2?5Z9_}|HQs2NG$x*HAVj?^vEF-9UmOjusSdm22u9mt z_;9XrXM(R|%=NxK*4&EW_CtG{}b~k^h#(f|D@-D&MFTm6aH*y%ho3lQ5`>)msSm4sKw4}@Xt|I_?p;?vjk&y_0 zv+)mcAvp-vk5l%CS{Qm>Z8xbm*eQw!;%SOFYalUcvE?Vqs2R8P2+XB`29p1!{pV#+ z56z})7lTgC1i2nl^{~QyrJ%bBvlZI{a&m7!LOXk@7V6*5?afg?_6~sR++-LLn^|s< z%m|e3e|WREpyJzp%w)rz;@-_t)Lt+1*H=JK(IwjoAM1Elo9C`XBamMgr3+9Y7GN9u zn8F$3j7YECU}9-h*+Zw0k}kS2fS~YQdM1@wf5S#C;<_NNKlJw}qKFKJ;JrL_E|hRXHRw$rBc?QOY_AD2yV>R(FXqk;f4!)Pu= z@I)B6+Fp8kdruU#05>{7pk(~-+^uV`_k;uKftTQS%VT@8&{gx@dM%~erKKfrxK(G@ z&8rLr6cDhXuBWwGi$0o4-OIQC+S_V;eoahFh{zTL1?kMK_XiipgYkk04O}$D#KXVi z2w0|O@uOTk8Gj3dsL*=&|654PH%jIiNvkq$8t$}=%#5K_=-O;v@lm-3&7Xd(*2$&Y&b=HUP$ikK z)9#1ibC0e2Q?SrJHF2++{nCw|G6(g+qX+MA__iFN{FM-_e@R9#5y_r>t(c5B?<8Oc z*dqg$|JPdAw|fGM`s|_F#s<#H%EXugz^;=TinxHgIb%_V^Q_{)x}@f4Dd%#V%SVr; ze*JApfG6x4zOcCX5(+#7O<6t(?)x&Pi*mNo_f(~5MyP9RQy#habRW8xOVTIcSKLv6 zBk|?`EFnUJ_c_Uc-Vz}E@Nwe``Z8RwfOQ3V%h|i62-%hR+aqvREMwDEB*xyj z@Omoy{NE9&3hv0yfhVamI0D6Y^&e67KCZ|noxE}#j1;V#*W1&qZUvr}&dl-d`IJ6AiY#ox{1 zB4+=cUlK_Wy!?L$H0LMbfXzSDUGA4dK>9(enzl8FzC;_KjddL*MRZIm-A4i*Z4n$C z9C6SFp;-CQ(++4W)yD2<zAzr4Bw)WTnb275aSK)3fv<#CMPfAu{!Sv4?!?a7k?` z>q6qR=I?p}_T4=albQ`3i<4`A=^#Ko)q&DY8&NXYNY ztao^N_lw@gD$A>uC+F!GBv>J+_3W0!BLsOPgGo-e>_W2LDoC$N%Q%%((ENH#gOIW= z_#Ca{Go}o;46_+wcXPRIi(bN(Bcv_@qsnUA8%kvef;?qIvFZE!%8Rj+jEmI2!f!tU zaHfnR=}xDkxr(2vH@;U7&)q>mLAcuzC%o~;rzgJhV>{!w&2L3ioE9oF(pF0V_Zxf- zXdK3w^g8acDh2$mQMxJ);FtL)ET83oH4&)yDHr}jg!rY?Xy4{KH*$(O+o$(X0Q!}} zP?%hq>_cC8O%MO@I(sqMiE!>D80?OK+;+{8Ieyomb`=7MZX!Ul7yp{;z3EqcZY2_T|$_A_0_xZ*t^D0wo*pujhKgwUZdv^@@kCGPs7wwlEIOqXI#BNM!X2#@u zh#5Qh1RdSJP!{*><&j=N;C7gK0{y{)VfKRmpJxsnv(v^5n(ig-bvs{SMs05|&+T?s z!I9y@;*a0F51tq(F8Kk~=F;5l+$RA69uEv*f4XJ`K0r=lcjpVtGJ4AKi1?=4HbBZN!l zYE-FE>YbhXnB)*=&{MGkhcOZ3Czb+oAHNgD1}e4F&Xm=N7;30}J4Fg=`gWVA57Hl& zy9)J~x@)(R`D*TO0NPgm#S$%5V@zkptxek z&fjsp3Ys=}_fW=TH5B*Gq!k{wZ>Dl>m%Iyd{Vq_+@?c}>U{YGdTtWhA+vqf=7yU3} z(NKkdbJB}G)e>_hA1kTAtDLsIGh=j>*Culf;8HA&cAUj2TMG$fF|KxMa?IPWwmr}u zyy+}28_>jewpeldGZpTh7Fp%eI(6waC$}#;diO#I#cva8mxCa#@;*RQ1_>j8?(eS* zEgUu0OvY)r4D27$!uLUxR9kMG^*uL{)`2b18gTsH(4CH^u+{XIu60LCvepg6+u`B4 znqXq9l<&o_<^o|IGd_GRszD;e?y1Tkn6YnyDD1V$U+bDw*^$88-%3OZ50LO(s&~xT zp_RF*FR(V9lv9)uCn7V7bFsF_+d%EvsWv%q=0zZ6&OiF-uw#e6H8m-39xb34!m199 z;SQscSSmpiykt1+pU2uSSiVWqiU&8$+kg}bX9N~TGT&x64r*)^1YL*86vix~?g~G| z0n|)C-DiYOjHSi3&Ng15*Rs+BdeBqi%t(V8AbV&y8tNW)lPckF@}&oqr)S)&9ll3v zK$Zt&t?&M`opF49?&mgWeVthbxX8na)}=bv6fE{Om_M3_Y*;_jYE`ULmfox3y>8id z+;0R0>BM#7DKr2mn1;pcmy8wHs^7ew6nlPqBd>Z-bZ!bvJFd;!^SzFr4804Jx4E|> zN=?Cxnfoy~pcp6LBLgvCcWu~ryT$M~6&~#2)~xKENa*igppoZ-^m|Ya!UHx+t=BHm zA($33x~(UMi6E|B=X{GWmbXGHXv`}uGTqx@$S zz+6?PUaH7h+}@4bah>D@{Lx6!1u!LN)|o~3c=Bxy%XuUq12Zkwf`SvEnrD8u>b*8E zbi0t>$&sP3lJSqn<)3*6{LidoHlOWvcvAatY(^K69l2mk^h;Dm7gC00o-eMmPoi=x1oW%SZ|Fnho-3PaiOu&nR84AMl1236xrm z-%aObam+OiRK`STx5XFI$hSddCrM{_MXT28UUc3Q^C&?+p=erQZEWVk`_VF)`uTUM zjmyhO-ku2=g==cb3S2HpZ0ZMwEG=4@<@rq}s&Yh;I%)<)LxV`8IgY+gQMFo|(*)Vn zZzv+15M{PVd|2fX8H5BKXaSBK=F0Hjy#TMT$?N7>ky^b`UqJ|4Btgq1f8}YIpS6 z__!9JR`Jd^oHUjdeM)qGWdkuQ&~mzn|Hio(wofjj)$Yp5h?rWTva$v)L5wm3>+4aa z!0W=eLhk+8{~6|+{mjjNCrjv@qsKcPHw+YY%&zX5sQbTpbic+l{Ba%<2YE9T?tV&L zdAs#teft4aV*SsP)=M@Y5?7F5zXJmvNbII>c6?}G9(4Z*7M|UWXY+H*S~Z~6dbh0j zR_S zm(20dV@j4On`qfU2%@F1b+gxjmV`6eIN|THdLe*jue)p7Aw($mD35y2wp3=qjH=YS z(6ptUQjr@c7nHXpP{193M5xbaeCW)IHd^upTJXYS8K7O09sd zc$Q9=hgFA;uRhncO`MBZYd}NWzlS@Me#^7Cf?oS0B|y0DTq=9K6=F>+K6`uu$~d+g z=W?j;G*^UfXlJi&^wwTZjce{Ffh=?l;oLYY{0uSj6Y>z?xo0S>TXy@~-aMWrdvG^m z>v`MLUx9Dhx$RSv{MBIW#TRg(rY|yyHK@6$%SdC;5FHah3WmtylL<<-)Z{_M)1;82+t&Au0%{aS=}k-=^eUDV*hx@%7SyP2#+n`tq5 zNh{(zjGBfQJBd==0+c8*BoGBiqsQ*l#h#;&Mhwli1PhcxJx(EO4wO#O-spIy)v zPG$<+%YGxMW!cE*&zslou2YhF)}1_csLd{y9*`C8MkH^S05{{V51@U{#DMyF8u!UA z^9N}MI&%YKb^TQ3+KJ>o&TH3sa&;vRr9Epdw|Bae4lK1Z9Dln{bgqWe&Yn`UxU1fd zt?M6yb%`zyzWf6p11f@18hZ(ek7@`vbd94JOawkzKkx zi!t3y#zx@5uKqH9DolRS{R0Ou z2cO$w>y{!u{%_;clfXuB{vQKX)R@~#$i&!RcV9nm$9p?@YoWoBj+qgr!sK72qN?Wh z61|UZTN`+JJ)d)R<2|UITx?lBLpEj8nEkI(wzmGi6ThX<#f-|Q z`!ZXt*_dZ%@~^c$9|c;^LFB|%T3OKb%A#}2iuM@!Qu?AU*^nYm;R4r4L)0Qy`HGo2 zKgM^Ru{~s49kQX31~C?xcrlkk>B6(8ZycP>+xlX=-mTssN1$U#Uq zOr|)NpGXK+ZM3nVsu$iI_@BI)*UIPo=T1AGIBR?J5z3D` zgvH!FZ$ddJ644adKip|h8@=D6;-b<`r&1lQ3DD2C8ni3Kl9v|}XyR=3dAMv`Y4f~V z`;z&83s(IoxNj4)HVQ9}(~|q*S63riqeF&KOojB-D^>|)u; z8pXG{m+h~Bj``tT#%ubbSW zSn$%&T;$Pa$vM8zp6TeK&8m{(zH9~wjgJV8 zmp_BSo?Bm=XHQR0SM;mqoeb$9-Ra+f%K)rN-vqsHh1j3XYA5Q zeC7*W82KKvf96X|3P56h5mhPVdLxMw)j#~aiCj1j9cbJboog~Y{7YWMCtVqw)a$w;knQLJRyemi+nrb+qlxKf>0NSejTii~THjpsl4rupL}GeILgx!z%kPFeY~z)8D5XjY@&rC}vij*SP;~Bmvy%HJnD3(1XcU z|K`r&ZO>*$%gT-uL4ML6fRTe!J&%6^Sv#Xe@OAyuel0; zk0lSbKhWHcYL88H=+O@`r=DL4!&7SRqJH^Q>Ljq5zz~G&yHtuFO_DGx%wWi(dFmbh zM}`bN>d({i&91i0K@dQ)U8B}(d)ghPj-xUZn551G+`^S1;VXc2tOICC^dFj=oAZQW z>OF4;onj~OibZn=pd9AK;Gpq6p3)hzuI^HwI`#cv;qN3hHZxo+5osFUy8pZ(ntUYN z!mul%i7*2HC})d~?!f)eM5Bv zjf+E#Zv~50j^UXNde&945&r9uBqmZ!8ru9`gek)GuFjv|yee7dzbU+A;m&aEgnsFh zewySs01OHJRpaIdy+GQkBTwd;hb!}s%q4|%6PA#)<9Z0RP!IOryhBl1{eDp_UnaKrDub-&Z?I%*C}p+bmjmD}DB!1t8D z{!7UHJAMR3N!j1ULx)+f@;*=pMPe1Z4O#o_0y|iLrU&b%v|%R zE|d|;z#RGaAHiPGfqcJ6gzK{u#rT3~;g|_AXtUKX*JRK#Tf5hLHy?ude}^VUfy0tb zX0MHu9&$l(0M-mf{@_Qy&&4~i0BUZh=aqRjoXcW>P_Efc+sviKj z&p{)a>F+Ap!)!-9V07?|YCExW@SbY`sJ72U=6g$(-iEbSYZLB&_l{4_&dUC{(YjS- zv`>wk&L!`vmn*3Sr6Uyx_sKBj<`^2>)OgdAeLSXkwzdfpL3!$IPHpnIuO_UF{0r*2 z$^CwTwdxTzFoIs8%qW=bS_j@TLMpK8oB_H$i=qH0^e|@GmOuAjOZWdqcTFA-Q%6-o zPB+w9i^poxvkqm1ximc7VdRbw!_Z=FL!}L368J9I-U|0V7!0VYc!)GugpCYlH%(I3 z@>_2~V6Io+o+16v9Vjv*A`(k%=^cDI7Ndl6!rVx#_%@P~Cu&!Hfmb!qE)e|tbJWAL zFYPGl>Z-nOD~w`n-j{1DslD->wO@gN`JuzQcF{*eli!)kVI z^+$<8Q5X{Ymg`?WE)kqO10xGg%u2FR5BlNV{r%!*mxEP@)~`GJ7QoQ>KXF^X>|Mw0 zVUoi0@S?3-=ae4>l_iSH$b%b;m5Yn+BvXn8>=Y%B{Fd}5*KL&sP|qjfTf-SS4KrMH z9Q<-sO6kVt@DcIga6G^L@tm^a82}g8!)W>2k)t~N0y=@BD*>NGK{^L|d&qolg-?jD z1+Evf_Tl+&t=82l5N&MRa`CspX!>zo$~-1d{A4>*fExll6_=iCcNRd0bs6wW2z1ev zCtfYKx3dH1j&j7YtQ3u8<2_{=XC);(In{$6)Vxs9&+Eq33-6Jl4-iBUwoOHo5LXK~ zC@G^un?5T?He)Bwtj3A-5~4_ba^h=A&JQ#r{X}FiSxSzEU{ zO{u#Dlein~der_0Rj6qNv(<4a(lXCpD`16_t8Hxjq~rcKW5xdT=;`@arH#SgyO;iz zJs==y?=ROH5vu{_nX=!${l@}iIuuigFNydd6?t`;fJmtvZ*Bu_r}fC5DEww780eW6 z-UK9fYO>W0BQ=d<6#m<%b5y7|Y)NT^Vr0m>1v<@G5mnL8CqK+svWhje5M-%_Sf;Io zx*dg*n_MaBvhsU_b~g*XJ1-&tPAH|C$iG&`f6CNM1|4U$*&dr0{(ncztK>3AJl02j zD@DW#x(+v5TB>YZeh!EcB|jEw%LsR;owla$e=g_}8>lP*nZnGVqwXNHh{=ICbMK9) zFrj=K_`)w(K!3Hh(!XMiH;vXvIgR7&x{V+Q?m*}&_iL-yYOSH%?raXAXZQs<`lwAs=LVZR#Yt8N^kHU)4EU}YMwmb>hb8{ zAur>1bjVMO#mJTi>$xpO{&{(b(W80Har*tDiV6_Zcc3mgRaal2qS5LBR5XC64!jM_ z<`4fs8-QNaLOI~ra92tVaLgPsi#*k2Vji~74C}tUxfqUQEN#Y(Kjv1cNkRumL3)Hk z&ub5pn!3^HSbbk{C{mQEsRKh;8rQ|)g~6FTC{XtMOCP{(xja&2aW%Ze7ij&=G$Q-Q z$%f6=dm!QDy<$2?E=+Lvniv&JuI7&n8fGF|ieK>CMUlGP>*mVsNZm`tMW^TvYp19S z;lCx+(A92A!&knPax1g9PH}k2o4WCTv{iK#oD=HYVf5Epy=@>BfTPJt$fH>mTebcP z@c!HQi9cCBzrw!kbUvrSfmR>J-2YhD1Ez2IuD0zq8gm`ru|1hFZ@qcFKh3%<^n0>H z{Dqpe?Y@3BD+63#SJ@18RBw&k;xfLo_cmx{6q?T!TeHy@m72pH(w82$Vp_x3Cwkr| zl8`Mhh!wpT)`Ts@!t^jOX^qTi&M`deyC#f2hG-Z9ncI1Jw_Sj5jTy4Fi}(DtjL{pH zy<}64@m-T>8AaY#VK`%LsN3rIjCF&MV2f1DGlghu8p7Z0ZRx7Sb&%;4LKZUfvc8)%2=oqeyEl15;#RTk)_3knew4p7l$HsL^W#14n%wR*M4kAF6Sy6n;&LD zSL{05`*bmrad-J|i#(iJgmJC0X0eRQS1rpaVkNCqT{oy>m<1S9COVqt5e_T5=Hk-y za49A#=~)?CIEa-p6j>owm!drJuM`T5bZl&Jy)rVGiuj&SxO`M1ex##sHj!0GPKFgb z7dE~?hvSx%JLo+2Y)&wszG6Z++jC04XVf?EtU4cGp2YI7mkACF;l{X9?^e7BIv(0| zfOb|qj~&YTJFy|m3X2o_eiO~0yCE6H$>fHJ^TXv%mH+d_pg(XHb}tfn|LD=|fC@(Vn zhE5TkH3RLpgky9OsVMD?3Rp4AGvoCZVT# z9Y4^~)9+}KX(gJ1{~|&;an*h(T^!+K$HYs_7;0`EJ1LP`Yxs^oL4|$tR9>1_xPWR* zmk3;+@Dp}o3OwmJYgD#Q<=snGp6WQm$)mk6#3u;gm?=%8$OF^_=2~0IpM}Y2crA)c zyC*#6YmCKvSh_vBYlImB)*Bn@Yy#Wg(jOJhY>Z?uw6)?SKAGo^%6`~WpK|#%2^w6V_(nQ20FAc zRd!1;m{E!&)a73`HtgDc9#*Tof!E^a`LEZK_@CDjh081m6e?zO0P9fIR5Gf$(c5rY zngS6PL4t`6cg9506~CH!a4>cK@BD)>%oilVi+vpdMAx$3(0ek2m7sS8iXw%}wiqKU z5Z(vF_qjoO;Kf9LUX zHDZ6-Wak77gf9I%78M)fHv8QD@tLZvEo!+%1QmC!B&tU$hJh1Rr1Tr84^>7!HwbZJ z%`xVziS8>A?fi;gz;B!1NkvIeq`%$CkOnEUMbEdi4MipL=KnNC*F~=jXhGGqaIsz* zT2rcrxWAMxCzl%hNh3?tEnEaivDlz;(H9mN&v|?=BR!Yxmy@Y6g=AuL0@V%}O*a42 zb4}G*G3-)0io6mlj>3Xb+ag-dyi#fLcx4zcfL*qxXuEBxF;*|P9Mf8ENcvVA9)9iX zP>7{Tt6ol)#^5`)|HPm!_jN4M8K>5m*8=bZC`aD<&V7@m`}kA&*QIhw;z&7dVfC|l z$@VwcDM&P;+A+tx(?pJ;RDa~eV9*1>@Phw-&3Hg{_1NNPA`IwN|NiYwVDi(ZB8?c?4NK9T*8I>fSuvk81Kl;%@Zp=lGlJj64(t;0(<5hvNV#L1sGjc< z+TLPvywh&3)0K)BYzDLU5B?JtA)-jt;G^c8(C1$JE99smc@HLa_P*yX!`t-op<@%g z$730UK|tXwBlj)+L>cMNXOBOHJ3ki^d1BQThr(|@@D?io^Nj&#gA&P6_&8F}noTc) zS2YWwEpqNDzqk$;bs3_b>|j$pVHi1~k(QpJO{*@$${y63e05*PO=DiItSAHCV)U;Y zym6}xLs;ZVbe0$bJaRf?i^EW#Elr4dQk69m)EUw!Lg?`VCPJ4+%9DGped~?P$smQ) z=p-^h8ThJdZL4iD!~>W06M~sRX6o2BTurzskT}~BZU5jBeZ_fLOf+u=f*VAt!(H?N zupv0uXLclCk5ckhjm^Tg89CGDu@`zQXGUm<=(&?1$UiS9PJ&w2+(=e;Yrq{HjGvPS zErq_)vNinQi07Z?1jd?k3cjmmo-XhJ-z34&Hno5%FVg!j%Juz3tIIrSFyU?YL2u$C z$l=7vuq4D_g}v#)%l+IG)+A&aItU_&{gL4{DF?K_S&`b`_Km}$cqEW)=w+tH5y#$^ zUKz=}~@)td}$7}rdV{n|o;Pu4etz91flq&E4 zeBp5LrNZP?t`QIEE#nt6BWFTa*_r2dh>D*^-%u|??{3nlv3HRuM^~gZSNTgd!r%fcXvt4|-zfEmESuZ!=Av}2({vc)jUHQo78e6cw$e(Kxzl*es$f=^P6K?kwZ$fXdOd?SAh zOGm!}6wy^dQS~lo*O#S=xl%_s3a8YJbkY`+P)bG2qv&%1;o9&_s?y#V$DcdzaQZ~@ zy@y#^PAP&>7pP|mVRT02-!FvfV;Ebdr@YVRH3Z2pv6Kqn2Zqg&QK)|nDEbg92{WRy ze9SA!39}l6+Cg=Zhac~JyJ7`RQHeyYkD{rMjt0Onq30EUhdsb9Yzi}2M;p+)gxK5& zBB<|AfZ^8RhqFSL}XyVw`B7DYc>rE|BM*e!c(cPE?ifXVP2F-|_wMTW&dOVQL4 z6QOT}G3Rg74`1-pMWQiKv>|&X4~n@1_wN3upb85f!v6W5k@rKvtMtAMooNwv&ia5&L>1yP4>1JhN@Z8bD69mCBmKG{)a48NAVgwg`~MAe$E=9+FJlvC=Z>Gf^c<;;MG| z#q$Fxt~9DRzr%&C`JOKl8|K%*Z3}6Kgi+}0?-cF6omxySIhV};9ZX=5RYW8mD#%rP zwwPTw%ki>tVR-lW#L$>yOZ}Kjl-%fz2eu+U%(}Ph$H+I-nLEl~Njeih_EFAZ$@4jD zBMCNx9QMx^CWjFnK)tD6G)DOH&x1%6T+)5PLg_F)s1SMU+djSoak#JbRBeu^{fw?8 z`jk_@D5%SN(yt8>7|(-jK{JsdbXnQ`#Y+-3qA`W|V%WylOFFZ6KfpWU_+wv*lrc@0 za8WejEd-x;21Gw*&S*6%EtY%{Qo?y$xoIh5w4o4X+$*jm+MYM3Z(C%6a7Wril(bZ3 zu5NnA0MJ{+&sf*=ko&m!Hnz9lx9NLh7 z6|W898%-dkyQJMuWwzI{TpJ%e6hG!n8{ttr`QHg=FM}wF8p=EFx(?YzMg?3I5LGgB z@fGF1ttYp(EgF-f47hd15E6!!++0l~ExoI<*|radDR3B|)5*NdY=k;x;odw$KTV2i)f|OM|{OZkuXd1{Yswe7KN#pjTca_57}VJv8W zVS7)5U$QfbBL4wy0>S&!la9?MIf5@MHl`Ow+d~ra>Iz~iL=^h^ypWRA7-q1Xb&sVm zshBKx_&iC`MA(92W@;|pWOV8NNQzy9m3Dne)_G=EGkO4i%kndyIZZhP;sB|!?-LX~ zU&Gr`)6i1-o%utObb-s69!9+pcls*!dO)s*K!C7=P%b1wI7139u)m!>ndK*w`aW(Y z72045JYK=JB2Ccg9P~XOzD?gczITab7tzNuI-N_a>WKpQtFDF6j87TSwY|ykwJVdo zk7oD$E+5ecbtDR?M%+7S@Jl&g)yKkgh!%NAOwvkWEuOqM%z5f;K45XWAQ(p+9fhCX z^iUCnnYWl(PW?n9B&hRXqf9Eoi-K=CprpY8?ygrPMaZfCH`Ck*BOU8!AZ)DXwUE^{ z!f~dluf`@*Nl|Oe6zQ+*Bvf^Q6@R59AwNecPPx&ftm{HZ@OU}$Y*vp!G*&GBo_T_R z!PvbT&(7Jb&(m!=?&mSS$rhw-Z=B_!nu8QPA08c!(~xT=Zsvkz4zcgBFUDXhrK+1F zX_LUz=tl;9eB{8l5<)r}=xd<3e~-fg?fs{hlt4Bsg=X^i(@MmgOFyG*PkiCMaqnSk zX|zRXy#T`lkGLC}AIfNpIO1L=v#t_@;f5fbk$==0M<)y2piO&}@Zu-IZ)8~A^~Ay! zZo83|p#;{kU2D@Zt`X>1beOq6a6M}-Se{M$MaigYiz_XjTSd#*3N8r$eL#@@uMZ9&BE`l2 z60Vsz6VOLCA|9_LYF(#2OEPoM?A5z7Y79+K0+i`HtC(qlAIR5Xl%?Kh)W1G@DixOt zL?}eR?I%SWl>}Ev^))t7$`3Z@_II6sTWo4zajAiCu_U~_WInYSNvcwl$lXRk30r?Y z4OiZejahtnBv+1s3xCgxF03LZH`5-5r)$E$8Jgx9<~5sTfOKO?2sAsyW}syn3?4Y< z>eiPhcqND3=#YAAeQDT0iey7iQ>m7K#`Vr65J27*@OnT~_Ng)f4fW0Di+y=E%^~%; zT8eF4rRyd1*Vg%X+DZ5<)-#(@U(ju)S=_YhG*f)d zHGLfC9~R=4$~OfL05|;awI8&ws{NW=x=L4gF2kO^IS$*`GnB^1Id%|iY7+OpkMz1$ zHU_6%J-s(_;z1&K^HoLif_$T!oJ<5Xn7$)UHp}ONYW_`ne0h;Dq{LIj6aS3T?;Nja z;GHV5dEeWQWEfo&*>OZzs!hVEjT@~rNCwQgMimUc1{ zCOljAd-!-gUQV0ru(-$a)7&JYEx5Ruq`raOVca>Kq>FwjcCkja&xfmYj9j&gmw8JV zI?xH7yN$Xm0Rv@Q5TZ_usv*Mm49_c+7HKC&hewq|asKs}zzk88B|~7bTAaR&c~da2 z^eTFrPrmXzA5}A)n_j@T;?Iq5jPKh#TaID2226=jC21d4pE%ta)3?IUmKtM3$d~z- zKT%L{OBhk{iT@|p1XXKStWuYf9y~HViGwM-Z2I1-ZRwmqvB(XCI+m&BVDi9Xu&^g1 zGa;}9Y^eIf;m0D-DMHs|{TvVHYaC7{FTwKD_@=936SL~!*;mh z+!j8F9S!4?SY^ZfRv+s+(H2FR`TNzbY_|1PX3e(*Q#}ysA3yb!B$kK`;wYXzTq zcmF%uczAgB-5T8dghwj(D%}^lfHPpp`2O?oi`UK2Jgdw{Okub@7^X{RC}cRgzyw03 zJZRA`QY&&e+QJBe@4I@4z{OCJ81)`|u#iovN00%yc(f75+f6a_YeLiLtm#TxSO)r7W0riU~}R*Od89 z-N3Z5mI<=5{MQ2l-NB5{9KSf`aH8%X$4`15&c$ROxC5siu~>@lvcMMg zMVcqO=$p>LHE?;KbFkC3@CSZmNZl{q!UYc!Yov$g9s$T0ySEd~(vA~30}@#m`y!uj6C+5TNlhPZj@`S3X{fee zj0(Rf?B~3m1^oUBbv>GXzS(6lbWOB(idW7S@a?tlz;WrC0%2Mq``ws8y$b zB%r1%$Q(??wod3nY9ymj9hk$ipn67Y&$E@EB#!y+`$-`ab^T>%{d!ec>3C(>&?2D* zc$=OB-{(8x*|t1qw5jWTb@}b=^9}Mk2c9P4=U++Bnja(j@fu-Q%7}RgB2$djBNP1T zOEaCv3eT48Ei9f|Q-^nE$#Vem`N4J2zmvzr51@&LlZ%X(mm|C7mkVXv&WE=~cYB3Y zVh!!Lxuw0ClBkxlf`*x2j6U52aVPkw0eeP)7J;B_&+9eOb75f&0n|2(1+XCr>JwgJ_+I45R`~00%f}^l)@I_cNP{Oy9nE%3Tc|*en@LVXm&GPn1o*#KlI}- z=&#yM7n?HXZa+FCPjVa9ua}&;Z%$clzBObDG~BULC`-ys4GgZ@L?yY&H1RQ?TQGYfeG` zdoD>4=pLpc?N2jW@#SQ*BFj^UJ00xv#k_pMZ#!zKzAtyAweEt{(OiVBAEHcke409X zJCrsb%^;W3Q7Ry2W~QS2{H?WoV|Nh;W9GacoF#sog z{$2#j1RdHl^r7-$l!&ETLLMQw%3ZPshRDMpH#j1MJP#CicRIgnZhotl;Q8i7yup3j z-!a0Qs0h>63!kUMlI+}Vc%P^7G2GO!6vOh0;7nGy?213toje;Nh=qb&+n>0eD%|=Q zOQN;-`N7X1*@whlbN09k_L5a-vQCLjua51+t+m*AhL3O11DSxGF|~>s|L9_)z;F>4 z50w;yufErX;3Mp^mTmPjb3LtwRa&> z<8Vn2xf3Pw-g%uxJ~UwqRiGe?WcHIuBYryMS6!+ffq(aXFu5m60H>!%dz{4uEv955%ewgF1^Ru(RLV){~!Iia+H3cEt z#D55>f?3AtLbMuvH;DQ%XYu#t;`D&)yRKt>dB$7HuLq z_Ax#|lJK`xM*(Bp;k~m+(4JC9Yk1`GJNE~8p$c4lUC-)w-etCKMB+2dYJZ9hcwC0?($2Be% z9}=7B)|C87C>lCk!X<8}(Lb>F(bwsN{>v$p4g(vJiL@`6pavqw;DVwVgL@>mjwCi@ z^jmRnM?1dO5GheFg=OTuhzG66IziN0VDB%VhDEsWm*Cn$4sRBf(+2R%K=bF+_cbGw zp|Dz5pMR}w^-P5u#Rn<2YT`EH5(aUZV3hQ=E)X%W|6I`(>syJ5+Wu9% z{d+&#GFo(BGe#twb-c)nNOSWT;cg{|cMGq_rj3mZYy6M(O27>dSYV4?$^Clva8b3o z`8ev>-06$x``CG$zR!4=?7QO#8Y}}m1ExcRUv}9gK5OW;lH|D-VSOKez$laHY-WdxuVf+>xF?4=&~9%z+bEP4mssx^NFk^NyAN^;H5Ko$$ zHSeuz@l)hQ8zUam!G7&WA84YW5&89zW_X961|0C5kCcz{AaMRef?(Ud(h?0%<;73f z`Dv8#8oY8^;gR^txJW4>TyPb*8T3U0I*k``tbZA(fO#Pnt897z?wrAH8f& z24ZUcCo238FE8^p!`C3lk+Ox#CD%#Y=C^uK*~_*Kor{mp1>uJr@>~48(h;C|IT6dK zCseu^kHG@CKK}cFur0oCRk27u7t4HYWbxwF+V@;MUpJ7+uA*f*;@!^kWLFVBT#1h$o*$wzRN?TXvYYx?`fB6JC>HaqJ z@X+3Bq<>(cD&hnTvJ}74l^5P(0e8o0{_H!AGv_;)z>9@Eo;KGSK0k5ci=B6%?(X^&U)`1{KuZbtOW^_!5Y{hA%(R3cD~u*9?Ax5)wmd_^(gD7(gV%^otO+!(ywg;V-s zXV)C@I2jmJjj>BjP)c^UCPPC!M(f8`B&5_0Fm41~w2}swL!SX6-uTJJPP8cT`*NC| z{Oq*n4X+(8L+F4eUR5>YJEY2K%z#!iO=!WB8gH>n9aNEMX)c;2w&Zfjrr2k)c$pDz z3Jf>3flR7FO(uY5v-rtGw9g{MZd9O7h@H{-CubEjWZQV$391Rco;R0icqqyi_sL5Q zM|NCjd_omn2dZh;mXbfp|AO>Ov^N0JSK7fw)m$IE#TFC0 zm_Zam>Z!dfn$TzLPCXUjeTfW+cHLc`TCvq6PScC8um!=E(9B0tlKGK?>XSyM&jT&# ztdEetIQoNdxQm}w#5Kqy!z6pqO)L<+egvKM_zrPHJEHkSRqxT*%?9?h#{XhY)XIOO zy^zY`HUXQGxKXTknHGz>xzwrLYjDKzQutrX#p=C=*NINViSjU!%(EFCCsF;D9;J)* zSQrno8o*>3$U&D#t?#>IkT_Q$JFgac>ti3M=9zY;QCr6(B{@|SJgch9+5m9z(-n>W zt2%Elp4sF1BU6O`JLsq~Zg77}cebsK8!X!v-QCPN@cX=h~k~v@$i@qMKdv!N`JzbtwfjJ zsU|r9tKIyvk3MaJ$OEOMs9oDPemSA`Mr(qp_&;dE_=^*(mS zvZfbX*6@;URJqeM!Kj6$?n4V2VihB~zpza*mM@08IL`r?#7yW>zqcqMtus16^Ur92 zS)Lr>1zK-`EqSoFjN`VtJNb1leN|inz>_OQn$WRnS~8F?eY`ZGrhY5Fdo78Iih4sa z{Pc&m-3S{iO{P%!z(U>Tzu`1LHwurTK9RiTw7ADDG@#lD{VMAEfgd>?M`~ciXz80 zzkul|fPZ9TD8_CQF+cx(ob7vavBHBp5`J|H_}7%#p!B8|d|z9{@jApO?v||nxXtk3 zMJ6|hSbBG{Ye~@GEZ>yLk1khKWd^m99Pas1x8jl2AMZ3`zu=AL-*IPiDNIkLKQr?A zO?td~axTY*5RBpxwONzqQs{|gW^EiES|7F#Urb({o$fv4Ae~o{3V59NEX7WZ{|x+} z_0y>N>CPpQnG_IKh^xkV+l<%Ey%PgXg2@v;U_O;o@Q^QDfh!y+4n8UiA|q|}G%@u` zHtT9a!d4HloiHrbnV%%lVATwVm=c5ghf#8O%3P$Bf3^-@VD*kg`)X#6#Gdzg=tp*n zv-x@4*X5_z0B%!>=|fvhZF-bNag#Y$VNi{xmAgx_Vq0>CA^z%gy@9Wb@bduwyRi@I zb7B$mmn`|s@x zdy5G7G4EV^YxK+}71EYI*i-rUtj|1cSKz1%o4THN; zvUg!2~>ow!RlB~;0(skoscj#dP2Czp0D|N zP}wN^5q$%sUp+j+HIu0Y^fUE{!rZH?*mZ-|%^m0lZ5=Idg<~D4i10PV{$F|5_1EOm zbrV2}ARVbvf`SK-4hc=FfYQ`Mm0qL>gia8YDuU8Pj#2|CQlw)*N@#+F-Ziu&5PA&8!vqI!1sxqX@y7Q6inpQXMsMqBVL2)umVK;elfMVNC`NTffq%GMRLEF;yfnUtEP& zJ1j8p%*@vN;$y?{d;{8{?C(vS-Jet&y{>R7vJi!dxR@Ou?-v4||9aGS8@yUH!@iW&MVGxOZ~^@$OWJ(h7wI-@QKP5y>+=1rB`Pt?i0n({Qw z7PWoZ^`ip0tKitRemDH-hEJ-co&z2Cz@5dt6Bbb$PNA2@Gez6Np_g80&l-cb*Y1A- zs&EQil=&K4VgL`g>efM4E6rk6N?uj3vf)BP@UxM~_LEFNBw=w8KLs3eHrg=xgW=~x zn{8l)2+FIQ%6O^q1%@4;2Wn93zIY%ua}itOf~@~>`dcQ)?LkCZ}ngA zV!4{d`!qfC?cvcW0MW_kmhEixNX{Srw97mDpZCYvE}WbPw7=3mC8;-A;IRxg+o9L#YrJSxZrSCgF=+JaY>Avs%*5w+#nd@dQ$_nP@y=c4 zTOXtLK~bq+E6X4G;1iP3BewWQql!kj8&gg1d8d}%m!uH44&7$Y_RFe&ik!iB`XX21 zA-r$nQ*}OuI_D_~bgC0V@=1%SNjssZGvvq%FScigzkhGCtUYbFek{}0FL6_va-f;W zEy11oxXQbvsz&>;Tiow?nd%ak-~4K!W>2^X6!_ISTK58%`}=L=bp zj$CE=8Lhv4k{t`nHcLyephn5nVju+V&>$Na z^kM_%Kno5;30}`Xy&A#PyMD3N;Ev8(OO(J2A$e!jy}c2M>w^gfy#?*9tw&aX^I;0a zc>5v_(ViN_e`_L%w$G|+YIEwXO-Cu@^G#9l-n8dGhR#jBcVws{3soD2-4UvW)cjqS zxf@hy!<*=b;Hi0a443x5Yjbr^(N{WKFS<2qr5Co9rOAwCoGjjU^rBO7&!&cCmw5EW zxE(XH#Txt;t5Tin6)~Z)l%z8FXIIrYHVLEuqfZ_Pm{#JG>$A~xs+92bUnmfsifT5v zDKGLf!uvklf1hZM8M?OWYUYG;NAik3MBStrXwJPd;TqrUSEuFDmm!u_mzBGAL9^)55w*_R-_PTQW}erI|0kMa;>dX0Fuo0Ac#EPZmYM8;F`h`2*J z=aDN}d9dqgzNvD9A}?|og~cSG*s+M*aDt0_sDCXPv%7FK-*LF`ldv9o+B`_d;y^Q& zjUZayeEDw?ey>>5s^2wDBXsNc??sN@-ZXMJf$TTBf8IEBW^Un@qpa+!Onk;12Fh@& z?d%k2Mex=3w=Ggfn>MHEm)UD^w|2_Q81JJ!+OOPGNU+ z4j=MsT^9lbzCyc zejtb^L263NT{WrO`b*sOP12tDKB613rs81KpY&5I;R7RZ1@vW;+4RXYx8S);z8L*& z1-Z!nWzp|hE|~@%fK_JjR#iiPC8M5$8U%7gCbgb!jA~xQ2|XJ>S!HAq!bQ|>CQaCu z37z&@|GQ`t1#z^*JjxjIJs(~w%3wjxC6G?Z^FCG2zsGc^n3iXR{!FR(-AME{{@wRKGm3lmx!+MY!WN!)zwOwerg-5X<4 zjLnNWtl1sXtZDU&&OrhKY;U;ExK->aZoUE5y;PpHo;P%_TRC`!ez5j4De;=fEiHw* zGdF&3w>w+&_xv3R3JZQ&$5s@z@%-^aUJ~{ls@ksD=f%pK+7I2`d|Y*!SPkYgr*^I% zq$YLB72Cf8Uj)AG4n*vi?MWbnID;?8nLS9pJSQXf;9liQUDS4WvKfmkoeR~SQ<{7_ zg|0TW1+>~D?p3~6}5p%;U|PFJh#fUimEs`u4Mji!<{m$?b8~YE48??%2A(DbEqa1yJ}3~5H+=)FyAHACn~4& zh5kKx#4Xo<^qS@EMl*}Oq!Q{~u#7z5KKj_3eEiM=dy zsa-#P7whFwrg{rKV;bx*-hCq6fbe{?P1iz3d2UB&n_2l{P`2Nw#bvMHd4o?dnsPK zN72{L!i3jV?MkGGls$=)ql_w?mM6VDur#R<5e!g^>FriCVR6L>hyc|sA03~5DTOY) zHAsFDScfjs%5!F;K6?p<6b@ONVz}M1^egK*Toq9e8yUvS{MEVvTJ_X#&^hah_-*2k zArq`UhGBR+JNXWCr#t+`lbCLe!oQ_HUeg0Gj>>d@o;jegO_lu>e9V-y`r44+p5K{K zR+dJ`@>%Yv(S)?6r%_o6SOq!5hFcf*ME$jPVknkapFft&V-W4EmV@sEgwbCiPp;B} z6@06n5)fI<$Q>D5&;hR%EMw3s}k!J$!XN=eg#wawK2rS|kujq(AeQ9%f z?QUoqZuGTww0I1A)ZG-|42^xXLvZ^nMa?QdKh|xnThe=1Pj?CJIUY5xcoiR0igBE} z#49S7*AC1Z7oBOC(Uw!x(vcXv(!K&h30$~&y+~3K<9?867*?P_qy5r5j8z51^m3Y! zT}>$7b1-qKgn_U632gXzU2#CqwSqXbM+4NeigCf-f*`QXeBS-(r00}0>S#H>#vD3V zlUGnsP?KYSa%1Ww>h}Mt2J#m}2Np5PI}#S4`sAaiuMNkqa=~VPYGm{9A}foYcwxE& z9jw#<><@d@S@=rPum{_hP95px^0rB4h90}bm>;bMd1&z%YGTgi;Zf?ZkhH)Mps!B9 zE{%9;#bKtc@K;J2!;f>Tx9HOsxI{BE@Y&*dJ?*i$_{ho6jNu-cu?z?{t8bBS zvOYq1E;^U+=-q{4b661DW4G6nYJwa^m2|)4wLTiz4GkefwuYUcQ1l%=A^N>|3RE}m zpOQLu_K-;IIJe%}DTQaicuZyD9R8G+bCwj`fk3M?G)DIkRR`i`qa%WJd%u(kn&Xcy zqHQ#}*s@DLCmH+ZaDt-Cav&u?D@aGYBX(2);V)~xJ;mMN*4GK=+lVnwPj-Aqf87)& zY2U`KSP~0a%vq7fP2$r9E!^W{3hK%wZ{9ZHw}opjG+WDZlX}vAL z%!QQ+E<%Niu!3p5%av-fg;@7c%kmx;<|GRO_zqiEmZPm)*%v4-1mUx~XV=J`rmF*O z3kNjT5UHh7aWrDHV-MZ?5Y=bqs<)6_MXPHDd8$P$V6>UVzr-PlxW=~JmIxSW&}(9? zkpee9jdL}aw$majy*)T(eNreH)cP=KB~s}R@#4r!;e~Y5H?q;IELjaOY-_*?MDM%{ zvpNs0dd`!|51KB&8T>F&zbwAFOu{}Jv=N{j1P+FceF-R3G_Ey_~s9?{nZua$S z+~Y(a(Jshzd<7t3sAW08BQGeE{xpSc$+&wM^gY&h`4fm`7jzGwd10;hWSnOJmW$M(ob*wh>NYP{Ie;jJU{yl2E4NN;Q+6{Z=YUP z2D&ETuj2~U?vkEdRdC6Rn>$k4VO|=alw`HN8uv>0YUN|{$0bfR+M$-DvKE^Jt;*b2 ziFq24Vs%`(Y*)LViTt2Wg(^GQTVRIt_Y@7Yvw|N9eEmjd7A(QHW+l;V+@iJf3a;;t zknL!0o^T0o04A2_gk;<>4ztiaeKl8K+^dZ0#`Radq|z(GipN$A_Uv zGKGmGV4kn6SYdX)QRuc>4fQh=&Dr|dS?eKdBwg8mGy^)28&WC8I zMff1G(BZR6(jldoO#6zPC#-^j+W;p7R!dk~LfM2r4!QoRE0Iow^w=lHa2pqoQ69P^ zKkoX9Nz|WS?@qVtTYcIxUVw(s86%skq&A|EC1d-QL__*Tuh zBhz!i(AUk`NJf^e1rfn}IbgQLp1+2jh2U7@W&eb1WI0L?$P~xZ(aeW27q=$hvGHp* zJT!KyEu!;Zk`#t%wP7z_=`96rJP*+H`g|yI6bR2k5-*7mNJFN*p%d7mD}0k#Utz_lQA1NWI)(jy2FTDvBb!5%q8BT8WW zK6E-AFoNycHK08nJUwtil6Sv-`^J)*n(ELNv}QWWEcNaW5o9{f_oAEY*p;;3Lf!ed znT8VF(JpT`GSZAd4)xplflu%#H4`+oRiUC7BltBcM}34vP=3)a(3Q6=iTF{$#h@@@ zDy{~|c1&T#<|^j8Yg3Sy4r&OssfHSwh%@qoD!OCeGY~(9OF8Wu7OJz!GAjdH`JWyT ziT^m$RNh;NF3-v~TWIH$1^1`)gO*>+ z^=gUouYK-dQ9v=b{}&;q0?#y$`^^>+1>|kBa9Th~x?xjAtS+uEcV*RWOG^dA0!U+bT>Ad{gA^x>LUE>Ofw>4d{I1ltZVYd-O z=II>4Hc}b0NouYA)o8p#r9~f{QwUUSb#eh~OCT^S*DY^v;O{Mf@IX&6pMcOQ4K)aD%V-A+2>KrC{=|KEbsY<6 zl9ir;b9Dj>hTFc8KbW4p)+#6vBcl{eG_%YJNlzm1@!ZvqwjwOBNqup{?%@GBC2Al# zlEvvc#lOR9{%jQ-H7m`k((cC@8ifunZfq7L3u*nY2)ps*imo4LGI4$V)lTRf^CRyx zl6zygU*ph;EA#fkbbkBk;bCXUS{r=x(`u?NBGTQx6uqN?J;~UO1ii_ywhLuCLJRN< ze|2)VzSKCju;C55zc-}GW}%c|=1v=vWqNrFE4r*}YAP6H5#OA05LKR>F3gmhjcl^1 zo>chB&<4&nFFt^RB=#d&=!|Xjz(I`MN8Yj>jWf{Q7W}i>bxF|gFPp(EdqHf?7--`@ zspEoN0Y%e9Dw*U?nI9O;?X2F>+NErQgHQ8!C@82QFL?B~n2MjCpFS^Tn*W8p`ALr< zMd_N-n5vuLXjMWi;mCch1qWzolk3{9T0&Cp4!~y-X$zfi*Z92oy_VrYq7UWV^B^1G zgYjkTLt(|hYVssqHs{1kt=euy^4AhyUmgQ`u@+$Q8Bbs^a1gBkHRZ}fgheyJf90Ch zeK7p%@QII=)oBG1=D5)YW2K1IW@l18ZPI{*6-s0R9Oj_PYpKKCSZGUL$!FlYrh$*2 zcEE;-)qid1dwyp9l+-LfB|ALw27&l3;NeylJA9{mrn}OMfn#lccTh2cSf@?WRSb7Umb_G1%}^luyL-_yze=g)@k ahYJ=W$m)G}E43kjGVb0n)vMNViv2(G8xtb{ literal 0 HcmV?d00001 diff --git a/src/activation/providers.ts b/src/activation/providers.ts index 3ecb6e8..215d616 100644 --- a/src/activation/providers.ts +++ b/src/activation/providers.ts @@ -81,7 +81,7 @@ export function registerProviders(context: vscode.ExtensionContext, outputChanne // Register Query History Provider const queryHistoryProvider = new QueryHistoryProvider(); context.subscriptions.push( - vscode.window.registerTreeDataProvider('postgresExplorer.executedQueryHistory', queryHistoryProvider) + vscode.window.registerTreeDataProvider('postgresExplorer.history', queryHistoryProvider) ); // Store query history provider instance for command access @@ -90,7 +90,7 @@ export function registerProviders(context: vscode.ExtensionContext, outputChanne // Phase 7: Register Saved Queries Tree Provider const savedQueriesTreeProvider = new SavedQueriesTreeProvider(); context.subscriptions.push( - vscode.window.registerTreeDataProvider('postgresExplorer.savedQueryLibrary', savedQueriesTreeProvider) + vscode.window.registerTreeDataProvider('postgresExplorer.savedQueries', savedQueriesTreeProvider) ); return { diff --git a/src/providers/ChatViewProvider.ts b/src/providers/ChatViewProvider.ts index b4a84af..2172577 100644 --- a/src/providers/ChatViewProvider.ts +++ b/src/providers/ChatViewProvider.ts @@ -30,6 +30,10 @@ export class ChatViewProvider implements vscode.WebviewViewProvider { private _messages: ChatMessage[] = []; private _isProcessing = false; + // Phase C: Track current connection/database context for session metadata + private _currentConnectionName: string | undefined; + private _currentDatabase: string | undefined; + // Services private _dbObjectService: DbObjectService; private _aiService: AiService; @@ -331,6 +335,15 @@ export class ChatViewProvider implements vscode.WebviewViewProvider { // aiMessage already has attachments, now add schema context if (mentions && mentions.length > 0) { console.log('[ChatView] Processing mentions for schema context...'); + + // Phase C: Capture connection context from first mention + if (mentions[0]) { + this._currentDatabase = mentions[0].database; + // Note: connectionName might not be populated in DbMention, so we use connectionId as fallback + this._currentConnectionName = mentions[0].breadcrumb?.split('.')[0] || mentions[0].connectionId; + this._sendContextUpdate(); + } + let schemaContext = '\n\n=== DATABASE SCHEMA CONTEXT (Use this information to answer the question) ===\n'; for (const mention of mentions) { @@ -634,9 +647,14 @@ export class ChatViewProvider implements vscode.WebviewViewProvider { const config = vscode.workspace.getConfiguration('postgresExplorer'); const provider = config.get('aiProvider') || 'vscode-lm'; + // Phase C: Pass metadata to session service await this._sessionService.saveSession( this._messages, - (msg) => this._aiService.generateTitle(msg, provider) + (msg) => this._aiService.generateTitle(msg, provider), + { + connectionName: this._currentConnectionName, + database: this._currentDatabase + } ); this._sendHistoryToWebview(); } @@ -672,6 +690,17 @@ export class ChatViewProvider implements vscode.WebviewViewProvider { } } + // Phase C: Send context bar update to webview + private _sendContextUpdate(): void { + if (this._view) { + this._view.webview.postMessage({ + type: 'contextUpdate', + connectionName: this._currentConnectionName || null, + database: this._currentDatabase || null + }); + } + } + // ==================== UI Helpers ==================== private _updateChatHistory(): void { diff --git a/src/providers/chat/AiService.ts b/src/providers/chat/AiService.ts index 8cbd9c0..2c56b22 100644 --- a/src/providers/chat/AiService.ts +++ b/src/providers/chat/AiService.ts @@ -115,7 +115,33 @@ IMPORTANT: At the end of each response, provide 2-4 numbered follow-up questions 2. [Second question] 3. [Third question] -Make these questions relevant to the topic discussed and progressively more advanced.`; +Make these questions relevant to the topic discussed and progressively more advanced. + +**PHASE D: NEXT STEPS SUGGESTION BUBBLES (Optional):** +After your response, you MAY optionally provide suggested follow-up actions the user might want to take. If you do, append them EXACTLY in this JSON format at the very end of your response (after the follow-up questions): + +\`\`\`json +{ + "next_steps": [ + "First suggested action or question (< 120 chars)", + "Second suggested action or question (< 120 chars)", + "Third suggested action or question (< 120 chars)" + ] +} +\`\`\` + +IMPORTANT: Only include this JSON block if you have 2-3 truly valuable next-step suggestions. The suggestions should be: +- Actionable and relevant to the current conversation +- Phrased as concise questions or prompts (< 120 characters each) +- Progressive in complexity or depth +- Examples: "Show me how to index this table", "What indexes exist on orders?", "How to optimize this JOIN?" + +Do NOT include the JSON block if: +- There are no clear follow-up actions +- The suggestions are obvious or trivial +- You're uncertain about what would be helpful next + +The JSON will be automatically parsed and shown as clickable suggestion bubbles in the UI.`; } async callVsCodeLm(userMessage: string, config: vscode.WorkspaceConfiguration, customSystemPrompt?: string): Promise<{ text: string, usage?: string }> { @@ -150,22 +176,58 @@ Make these questions relevant to the topic discussed and progressively more adva throw new Error('No AI models available via VS Code API. Please ensure GitHub Copilot Chat is installed or switch provider.'); } + console.log('[AiService] Selected model details:', JSON.stringify({ + id: model.id, + name: model.name, + family: (model as any).family, + vendor: (model as any).vendor, + version: (model as any).version, + maxInputTokens: (model as any).maxInputTokens, + maxOutputTokens: (model as any).maxOutputTokens + })); + const systemPrompt = customSystemPrompt !== undefined ? customSystemPrompt : this.buildSystemPrompt(); - const messages = []; + const messages: any[] = []; if (systemPrompt) { - messages.push(vscode.LanguageModelChatMessage.User(systemPrompt)); + const lmMessageCtor = vscode.LanguageModelChatMessage as any; + // Prefer system role when available; older API versions only expose User/Assistant. + if (typeof lmMessageCtor.System === 'function') { + messages.push(lmMessageCtor.System(systemPrompt)); + } else { + messages.push(vscode.LanguageModelChatMessage.User(systemPrompt)); + } } + const history = this._messages.slice(-10); + messages.push( - ...this._messages.slice(-10).map(msg => + ...history.map(msg => msg.role === 'user' ? vscode.LanguageModelChatMessage.User(this._sanitizeContent(this._getMessageContent(msg))) : vscode.LanguageModelChatMessage.Assistant(this._sanitizeContent(this._getMessageContent(msg))) ) ); + // Always include the latest user prompt as the final turn. + // Some models are sensitive to explicit final-turn structure. messages.push(vscode.LanguageModelChatMessage.User(userMessage)); + const compactHistory = history.map((msg, idx) => ({ + idx, + role: msg.role, + contentLength: this._getMessageContent(msg).length, + attachmentCount: msg.attachments?.length || 0, + mentionCount: msg.mentions?.length || 0 + })); + + console.log('[AiService] Prepared request payload summary:', JSON.stringify({ + totalMessages: messages.length, + historyMessages: history.length, + userMessageLength: userMessage.length, + systemPromptLength: systemPrompt.length, + history: compactHistory + })); + // Debug: Log all messages being sent to model console.log('[AiService] ========== MESSAGES SENT TO MODEL =========='); console.log('[AiService] System prompt length:', systemPrompt.length); @@ -175,11 +237,69 @@ Make these questions relevant to the topic discussed and progressively more adva this._cancellationTokenSource = new vscode.CancellationTokenSource(); try { + console.log('[AiService] sendRequest initial attempt started'); const chatRequest = await model.sendRequest(messages, {}, this._cancellationTokenSource.token); - let responseText = ''; + const rawChatRequest = chatRequest as any; + console.log('[AiService] sendRequest initial attempt resolved:', JSON.stringify({ + hasStream: !!rawChatRequest?.stream, + hasText: !!rawChatRequest?.text, + hasResult: !!rawChatRequest?.result, + resultKeys: rawChatRequest?.result ? Object.keys(rawChatRequest.result) : [] + })); + + let responseText = await this._extractVsCodeLmResponseText(chatRequest as any); + console.log('[AiService] Initial extraction result length:', responseText.length); + + // Some models may return an empty text stream on the first attempt for verbose histories. + // Retry once with a minimal context to avoid persisting blank assistant replies. + let effectiveMessagesForFallback = messages; + if (!responseText.trim()) { + console.warn('[AiService] Empty response from VS Code LM; retrying with minimal prompt context.'); + const retryMessages: any[] = []; + if (systemPrompt) { + const lmMessageCtor = vscode.LanguageModelChatMessage as any; + if (typeof lmMessageCtor.System === 'function') { + retryMessages.push(lmMessageCtor.System(systemPrompt)); + } else { + retryMessages.push(vscode.LanguageModelChatMessage.User(systemPrompt)); + } + } + retryMessages.push(vscode.LanguageModelChatMessage.User(userMessage)); + + console.log('[AiService] Retry payload summary:', JSON.stringify({ + totalMessages: retryMessages.length, + userMessageLength: userMessage.length, + systemPromptLength: systemPrompt.length + })); + + console.log('[AiService] sendRequest retry attempt started'); + const retryRequest = await model.sendRequest(retryMessages, {}, this._cancellationTokenSource.token); + const rawRetryRequest = retryRequest as any; + console.log('[AiService] sendRequest retry attempt resolved:', JSON.stringify({ + hasStream: !!rawRetryRequest?.stream, + hasText: !!rawRetryRequest?.text, + hasResult: !!rawRetryRequest?.result, + resultKeys: rawRetryRequest?.result ? Object.keys(rawRetryRequest.result) : [] + })); + + responseText = await this._extractVsCodeLmResponseText(retryRequest as any); + console.log('[AiService] Retry extraction result length:', responseText.length); + effectiveMessagesForFallback = retryMessages; + } - for await (const fragment of chatRequest.text) { - responseText += fragment; + // If the configured model yields no chunks at all, try another available model once. + if (!responseText.trim()) { + const fallbackModel = await this._findAlternateModel(model.id); + if (fallbackModel) { + console.warn('[AiService] Selected model produced empty output. Trying alternate model:', fallbackModel.name || fallbackModel.id); + const fallbackRequest = await fallbackModel.sendRequest(effectiveMessagesForFallback, {}, this._cancellationTokenSource.token); + responseText = await this._extractVsCodeLmResponseText(fallbackRequest as any); + console.log('[AiService] Alternate model extraction result length:', responseText.length); + } + } + + if (!responseText.trim()) { + throw new Error('AI model returned an empty response. Please retry or select a different model.'); } return { text: responseText }; @@ -192,6 +312,173 @@ Make these questions relevant to the topic discussed and progressively more adva } } + private async _findAlternateModel(currentModelId: string): Promise { + const allModels = await this._selectChatModelsWithTimeout({}); + if (allModels.length === 0) { + return undefined; + } + + const candidates = allModels.filter(m => m.id !== currentModelId); + if (candidates.length === 0) { + return undefined; + } + + // Prefer known stable families first if available. + const preferredFamilyOrder = ['gpt-4o', 'gpt-4.1', 'o3', 'claude']; + for (const family of preferredFamilyOrder) { + const match = candidates.find(m => (m.family || '').toLowerCase().includes(family)); + if (match) { + return match; + } + } + + return candidates[0]; + } + + private async _extractVsCodeLmResponseText(chatRequest: any): Promise { + let responseText = ''; + const streamPartDebug: string[] = []; + let streamChunkCount = 0; + let textChunkCount = 0; + + // Stream is the canonical response channel in current VS Code APIs. + if (chatRequest?.stream && Symbol.asyncIterator in Object(chatRequest.stream)) { + for await (const part of chatRequest.stream) { + streamChunkCount += 1; + responseText += this._extractTextFromStreamPart(part, streamPartDebug); + } + } + + console.log('[AiService] Stream extraction stats:', JSON.stringify({ + streamChunkCount, + streamChunkTypes: streamPartDebug, + extractedLength: responseText.length + })); + + if (responseText.trim()) { + return responseText; + } + + // Fallback for environments where text is the only available channel. + if (chatRequest?.text && Symbol.asyncIterator in Object(chatRequest.text)) { + for await (const fragment of chatRequest.text) { + textChunkCount += 1; + responseText += this._normalizeLmTextFragment(fragment); + } + } + + console.log('[AiService] Text extraction stats:', JSON.stringify({ + textChunkCount, + extractedLength: responseText.length + })); + + if (responseText.trim()) { + return responseText; + } + + // Last-resort compatibility fallback. + const resultContent = chatRequest?.result?.content; + if (typeof resultContent === 'string') { + console.log('[AiService] Using result.content string fallback with length:', resultContent.length); + return resultContent; + } + if (Array.isArray(resultContent)) { + console.log('[AiService] Using result.content array fallback with parts:', resultContent.length); + return resultContent + .map((item: any) => { + if (typeof item === 'string') return item; + if (typeof item?.text === 'string') return item.text; + if (typeof item?.value === 'string') return item.value; + return ''; + }) + .join(''); + } + + if (!responseText.trim() && streamPartDebug.length > 0) { + console.warn('[AiService] LM stream yielded non-text parts only:', streamPartDebug.join(' | ')); + } + + return responseText; + } + + private _normalizeLmTextFragment(fragment: any): string { + if (fragment === null || fragment === undefined) { + return ''; + } + if (typeof fragment === 'string') { + return fragment; + } + if (typeof fragment?.value === 'string') { + return fragment.value; + } + if (typeof fragment?.text === 'string') { + return fragment.text; + } + return ''; + } + + private _extractTextFromStreamPart(part: any, debugParts?: string[]): string { + if (!part) { + return ''; + } + + const addDebugPart = (value: string): void => { + if (!debugParts) { + return; + } + if (debugParts.length < 8) { + debugParts.push(value); + } + }; + + const ctorName = part?.constructor?.name || typeof part; + addDebugPart(ctorName); + + if (part instanceof (vscode as any).LanguageModelTextPart) { + return typeof part.value === 'string' ? part.value : ''; + } + + if (part instanceof (vscode as any).LanguageModelToolCallPart) { + addDebugPart(`tool:${part.name || 'unknown'}`); + return ''; + } + + if (typeof part === 'string') { + return part; + } + if (typeof part.text === 'string') { + return part.text; + } + if (typeof part.value === 'string') { + return part.value; + } + + const nestedText = part?.part?.text; + if (typeof nestedText === 'string') { + return nestedText; + } + + const nestedValue = part?.part?.value; + if (typeof nestedValue === 'string') { + return nestedValue; + } + + const candidates = [part?.content, part?.chunk, part?.delta]; + for (const candidate of candidates) { + if (typeof candidate === 'string') { + return candidate; + } + if (typeof candidate?.text === 'string') { + return candidate.text; + } + if (typeof candidate?.value === 'string') { + return candidate.value; + } + } + + return ''; + } + // Sanitize content to remove any HTML/CSS artifacts before sending to AI private _sanitizeContent(content: string): string { let cleaned = content; diff --git a/src/providers/chat/SessionService.ts b/src/providers/chat/SessionService.ts index 7174c89..de7af51 100644 --- a/src/providers/chat/SessionService.ts +++ b/src/providers/chat/SessionService.ts @@ -35,7 +35,7 @@ export class SessionService { this._currentSessionId = id; } - async saveSession(messages: ChatMessage[], generateTitle: (msg: string) => Promise): Promise { + async saveSession(messages: ChatMessage[], generateTitle: (msg: string) => Promise, metadata?: { connectionName?: string; database?: string }): Promise { if (messages.length === 0) return; const sessions = this.getChatSessions(); @@ -46,18 +46,56 @@ export class SessionService { if (index !== -1) { sessions[index].messages = [...messages]; sessions[index].updatedAt = now; + + // Phase C: Update metadata if provided + if (metadata?.connectionName) { + sessions[index].connectionName = metadata.connectionName; + } + if (metadata?.database) { + sessions[index].database = metadata.database; + } + + // Phase C: Extract preview from first AI response if not already set + if (!sessions[index].preview) { + const firstAiMessage = messages.find(m => m.role === 'assistant'); + if (firstAiMessage) { + // Strip markdown fence markers and take first 100 chars + const cleanContent = firstAiMessage.content + .replace(/^```[\s\S]*?```/gm, '') // Remove code blocks + .replace(/\*\*/g, '') // Remove bold markers + .replace(/\*/g, '') // Remove italic markers + .trim(); + sessions[index].preview = cleanContent.substring(0, 100); + } + } } } else { this._currentSessionId = this.generateSessionId(); const firstUserMessage = messages.find(m => m.role === 'user')?.content || 'New Chat'; const title = await generateTitle(firstUserMessage); + // Phase C: Extract preview from first AI response + let preview: string | undefined; + const firstAiMessage = messages.find(m => m.role === 'assistant'); + if (firstAiMessage) { + const cleanContent = firstAiMessage.content + .replace(/^```[\s\S]*?```/gm, '') + .replace(/\*\*/g, '') + .replace(/\*/g, '') + .trim(); + preview = cleanContent.substring(0, 100); + } + sessions.unshift({ id: this._currentSessionId, title, messages: [...messages], createdAt: now, - updatedAt: now + updatedAt: now, + // Phase C: Store metadata + preview, + connectionName: metadata?.connectionName, + database: metadata?.database }); } @@ -98,7 +136,11 @@ export class SessionService { createdAt: s.createdAt, updatedAt: s.updatedAt, messageCount: s.messages.length, - isActive: s.id === this._currentSessionId + isActive: s.id === this._currentSessionId, + // Phase C: Include metadata in summaries + preview: s.preview, + connectionName: s.connectionName, + database: s.database })); } diff --git a/src/providers/chat/types.ts b/src/providers/chat/types.ts index c943790..936de09 100644 --- a/src/providers/chat/types.ts +++ b/src/providers/chat/types.ts @@ -47,6 +47,10 @@ export interface ChatSession { messages: ChatMessage[]; createdAt: number; updatedAt: number; + // Phase C: Optional metadata for enhanced history UI + preview?: string; // First 100 chars of first AI response + connectionName?: string; // Name of the connection this session used + database?: string; // Name of the database this session used } export interface ChatSessionSummary { @@ -56,4 +60,8 @@ export interface ChatSessionSummary { updatedAt: number; messageCount: number; isActive: boolean; + // Phase C: Optional metadata for history display + preview?: string; + connectionName?: string; + database?: string; } diff --git a/templates/chat/index.html b/templates/chat/index.html index bb77abd..1313c31 100644 --- a/templates/chat/index.html +++ b/templates/chat/index.html @@ -70,23 +70,61 @@

🐘

+ + +
-
💬
-
- Ask questions about PostgreSQL
- Get help writing queries
- Generating performant SQL statements
- Explore database concepts +
+
SQL Assistant
+
+ Ask about your schema, write queries, or
pick a starting point. +
-
- Powered by You & AI + + +
+ + + +
-
- - - - + + +
+
SQL SNIPPETS
+
+ + + + + + +
@@ -100,6 +138,32 @@

🐘

+ + + + + +
🔗 Reference DB Object diff --git a/templates/chat/scripts.js b/templates/chat/scripts.js index 62e8fae..13f1bfc 100644 --- a/templates/chat/scripts.js +++ b/templates/chat/scripts.js @@ -42,6 +42,28 @@ let currentHierarchyPath = { schema: null }; +// Phase B: New state for context bar, retries, and debounced search +let currentContext = { + connectionName: null, + database: null +}; +let lastUserMessage = null; +let historySearchDebounceTimer = null; + +// Phase B: Quick actions and snippets configuration +const QUICK_ACTIONS = [ + { prompt: 'How do I write a JOIN query?', icon: '🔗', title: 'JOINs', desc: 'Query patterns' }, + { prompt: 'Explain CTEs in PostgreSQL', icon: '📋', title: 'CTEs', desc: 'Temp tables' }, + { prompt: 'How to optimize a slow query?', icon: '⚡', title: 'Optimize', desc: 'Performance' }, + { prompt: 'What are window functions?', icon: '📊', title: 'Window Fn', desc: 'Advanced SQL' } +]; + +const SNIPPETS = [ + { prompt: 'Show me a basic SELECT example', icon: '📝', text: 'SELECT Basics' }, + { prompt: 'How do I filter rows with WHERE?', icon: '🔍', text: 'WHERE Clauses' }, + { prompt: 'Explain GROUP BY and aggregation', icon: '📊', text: 'Aggregations' } +]; + // Hierarchy Navigation function navigateToRoot() { currentHierarchyPath = { connection: null, database: null, schema: null }; @@ -956,6 +978,15 @@ function sendMessage() { const message = chatInput.value.trim(); if (!message && attachedFiles.length === 0 && selectedMentions.length === 0) return; + // Phase B: Track last message for retry functionality + lastUserMessage = message; + + // Dismiss error card when sending new message + dismissError(); + + // Dismiss bubble strip when user sends a message + dismissBubbleStrip(); + vscode.postMessage({ type: 'sendMessage', message: message || (selectedMentions.length > 0 ? 'Please analyze the referenced database objects' : 'Please analyze the attached file(s)'), @@ -1588,6 +1619,16 @@ window.addEventListener('message', event => { } } break; + + // Phase B: Context bar update + case 'contextUpdate': + updateContextBar(message.connectionName || null, message.database || null); + break; + + // Phase B: Error card display + case 'error': + showErrorCard(message.title || 'Error', message.message || 'An error occurred'); + break; } }); @@ -1683,12 +1724,15 @@ function renderMessages(messages, animate = false) { // Apply typing effect for the newest assistant message const isLastMessage = idx === messages.length - 1; if (isNewAssistantMessage && isLastMessage) { + // Extract JSON next_steps and clean content + const { content: cleanContent, bubbles } = safeJsonTailExtract(msg.content); + // Will be typed out bubbleDiv.appendChild(contentDiv); messageDiv.appendChild(roleDiv); messageDiv.appendChild(bubbleDiv); messagesContainer.insertBefore(messageDiv, typingIndicator); - typeText(contentDiv, msg.content, () => { + typeText(contentDiv, cleanContent, () => { if (msg.usage) { const usageDiv = document.createElement('div'); usageDiv.className = 'message-usage'; @@ -1696,10 +1740,16 @@ function renderMessages(messages, animate = false) { messageDiv.appendChild(usageDiv); messagesContainer.scrollTo({ top: messagesContainer.scrollHeight, behavior: 'smooth' }); } + // Show bubbles after typing finishes + if (bubbles.length > 0) { + showSuggestionBubbles(bubbles); + } }); return; // Skip the normal append below } else { - contentDiv.innerHTML = parseMarkdown(msg.content); + // Extract JSON next_steps from non-typing messages + const { content: cleanContent, bubbles } = safeJsonTailExtract(msg.content); + contentDiv.innerHTML = parseMarkdown(cleanContent); } } else { contentDiv.textContent = msg.content; @@ -1726,4 +1776,254 @@ function renderMessages(messages, animate = false) { }); } +// ============================================================================ +// Phase B: Frontend Logic - Context Bar, Bubbles, Errors, and Utilities +// ============================================================================ + +/** + * Update the context bar with current connection and database + * @param {string} connectionName - Name of the active connection + * @param {string} database - Name of the active database + * @param {string} tableName - Name of the referenced table (optional) + */ +function updateContextBar(connectionName, database, tableName) { + currentContext.connectionName = connectionName; + currentContext.database = database; + + const contextBar = document.getElementById('contextBar'); + if (!contextBar) return; + + if (connectionName || database || tableName) { + contextBar.style.display = 'flex'; + const connElem = document.getElementById('contextConnection'); + const tableElem = document.getElementById('contextTable'); + + if (connElem) { + // Format: "Connection Name • database_name" + const connInfo = connectionName ? connectionName : 'Connected'; + const dbInfo = database ? database : ''; + connElem.textContent = [connInfo, dbInfo].filter(Boolean).join(' • '); + } + + if (tableElem) { + // Format: "@table_name" or "@schema.table_name" + if (tableName) { + tableElem.textContent = '@' + tableName; + tableElem.parentElement.style.display = 'flex'; + } else { + tableElem.parentElement.style.display = 'none'; + } + } + } else { + contextBar.style.display = 'none'; + } +} + +/** + * Show suggestion bubbles from AI next-step recommendations + * Expects bubbles to be an array of strings, each < 140 chars + * @param {string[]} bubbles - Array of next-step suggestion texts + */ +function showSuggestionBubbles(bubbles) { + const bubbleStrip = document.getElementById('bubbleStrip'); + const bubbleStripContent = document.getElementById('bubbleStripContent'); + + if (!bubbleStrip || !bubbleStripContent) return; + + // Filter and validate bubbles + const validBubbles = bubbles + .filter(b => typeof b === 'string' && b.length > 0 && b.length <= 200) + .slice(0, 5); // Max 5 bubbles + + if (validBubbles.length === 0) { + bubbleStrip.style.display = 'none'; + return; + } + + // Clear and rebuild + bubbleStripContent.innerHTML = ''; + validBubbles.forEach(text => { + const bubble = document.createElement('button'); + bubble.className = 'suggestion-bubble'; + bubble.textContent = text; + bubble.title = `Click to continue: ${text}`; + bubble.onclick = () => { + chatInput.value = text; + chatInput.focus(); + dismissBubbleStrip(); + // Optionally auto-send: sendMessage(); + }; + bubbleStripContent.appendChild(bubble); + }); + + bubbleStrip.style.display = 'flex'; +} + +/** + * Dismiss the suggestion bubble strip + */ +function dismissBubbleStrip() { + const bubbleStrip = document.getElementById('bubbleStrip'); + if (bubbleStrip) { + bubbleStrip.style.display = 'none'; + } +} + +/** + * Show error card with message and action buttons + * @param {string} title - Error title + * @param {string} message - Error message + */ +function showErrorCard(title, message) { + const errorCard = document.getElementById('errorCard'); + const titleElem = document.getElementById('errorCardTitle'); + const messageElem = document.getElementById('errorCardMessage'); + + if (!errorCard) return; + + if (titleElem) titleElem.textContent = title || 'Error'; + if (messageElem) messageElem.textContent = message || 'An error occurred'; + + errorCard.style.display = 'flex'; +} + +/** + * Dismiss the error card + */ +function dismissError() { + const errorCard = document.getElementById('errorCard'); + if (errorCard) { + errorCard.style.display = 'none'; + } +} + +/** + * Retry the last user message + */ +function retryLastMessage() { + if (!lastUserMessage) { + console.warn('[PgStudio] No previous message to retry'); + return; + } + + dismissError(); + chatInput.value = lastUserMessage; + chatInput.focus(); + sendMessage(); +} + +/** + * Safely extract JSON next_steps from end of model response + * Looks for { "next_steps": [...] } pattern at the end + * Removes JSON from display content and returns parsed bubbles + * @param {string} responseText - Full model response text + * @returns {object} { content: cleanedText, bubbles: string[] } + */ +function safeJsonTailExtract(responseText) { + try { + // Look for JSON-like pattern at end of text + // Match: { "next_steps": [...] } + const jsonMatch = responseText.match(/\{\s*"next_steps"\s*:\s*\[([^\]]*)\]\s*\}\s*$/i); + + if (!jsonMatch) { + return { content: responseText, bubbles: [] }; + } + + // Try to parse the full JSON object + const jsonStart = responseText.lastIndexOf('{'); + if (jsonStart === -1) { + return { content: responseText, bubbles: [] }; + } + + const jsonStr = responseText.substring(jsonStart); + const parsed = JSON.parse(jsonStr); + + if (!Array.isArray(parsed.next_steps)) { + return { content: responseText, bubbles: [] }; + } + + // Remove JSON from display content + const cleanContent = responseText.substring(0, jsonStart).trim(); + + return { + content: cleanContent, + bubbles: parsed.next_steps.slice(0, 5) // Max 5 bubbles + }; + } catch (err) { + // JSON parse failed, return original content + console.warn('[PgStudio] JSON extraction failed:', err.message); + return { content: responseText, bubbles: [] }; + } +} + +/** + * Debounced history search with delay timer + * @param {string} value - Search query + * @param {number} delay - Debounce delay in ms (default 300) + */ +function debounceHistorySearch(value, delay = 300) { + if (historySearchDebounceTimer) { + clearTimeout(historySearchDebounceTimer); + } + + historySearchDebounceTimer = setTimeout(() => { + filterHistoryHelper(value); + }, delay); +} + +/** + * Helper for history filtering (called after debounce) + * @param {string} searchTerm - Search query + */ +function filterHistoryHelper(searchTerm) { + const historyItems = document.querySelectorAll('.history-item'); + const normalizedTerm = searchTerm.toLowerCase(); + + historyItems.forEach(item => { + const title = item.querySelector('.history-item-title'); + if (!title) return; + + const matches = title.textContent.toLowerCase().includes(normalizedTerm); + item.style.display = matches ? 'block' : 'none'; + }); +} + +/** + * Group history sessions by date (Today, Yesterday, This week, Older) + * @param {array} sessions - Array of ChatSessionSummary + * @returns {object} Sessions grouped by date category + */ +function groupSessionsByDate(sessions) { + const now = new Date(); + const today = new Date(now.getFullYear(), now.getMonth(), now.getDate()); + const yesterday = new Date(today); + yesterday.setDate(yesterday.getDate() - 1); + const weekAgo = new Date(today); + weekAgo.setDate(weekAgo.getDate() - 7); + + const groups = { + today: [], + yesterday: [], + thisWeek: [], + older: [] + }; + + sessions.forEach(session => { + const sessionDate = new Date(session.createdAt); + const sessionDay = new Date(sessionDate.getFullYear(), sessionDate.getMonth(), sessionDate.getDate()); + + if (sessionDay.getTime() === today.getTime()) { + groups.today.push(session); + } else if (sessionDay.getTime() === yesterday.getTime()) { + groups.yesterday.push(session); + } else if (sessionDay.getTime() >= weekAgo.getTime()) { + groups.thisWeek.push(session); + } else { + groups.older.push(session); + } + }); + + return groups; +} + diff --git a/templates/chat/styles.css b/templates/chat/styles.css index 4707f31..914b154 100644 --- a/templates/chat/styles.css +++ b/templates/chat/styles.css @@ -151,10 +151,10 @@ } .history-item { - padding: 10px 12px; - border-radius: var(--chat-radius-sm); + padding: 11px 12px; + border-radius: 6px; cursor: pointer; - margin-bottom: 4px; + margin-bottom: 6px; transition: all var(--transition-fast); position: relative; } @@ -169,7 +169,7 @@ } .history-item-title { - font-size: 12px; + font-size: 11px; font-weight: 500; margin-bottom: 4px; white-space: nowrap; @@ -179,11 +179,12 @@ } .history-item-meta { - font-size: 10px; + font-size: 9px; color: var(--vscode-descriptionForeground); display: flex; align-items: center; - gap: 8px; + gap: 6px; + opacity: 0.75; } .history-item-delete { @@ -293,9 +294,9 @@ } .chat-header h3 { - font-size: 11px; - font-weight: 500; - letter-spacing: 0.5px; + font-size: 10px; + font-weight: 600; + letter-spacing: 0.8px; text-transform: uppercase; color: var(--vscode-descriptionForeground); display: flex; @@ -307,27 +308,26 @@ display: inline-flex; align-items: center; gap: 4px; - padding: 2px 8px; - background: var(--vscode-badge-background); - color: var(--vscode-badge-foreground); + padding: 3px 8px; + background: transparent; + color: var(--vscode-descriptionForeground); border-radius: 10px; - font-size: 10px; + font-size: 9px; font-weight: 500; cursor: pointer; transition: all var(--transition-fast); border: 1px solid var(--vscode-widget-border); - opacity: 0.9; + opacity: 0.8; } .ai-model-badge:hover { background: var(--vscode-inputOption-hoverBackground); border-color: var(--vscode-focusBorder); - transform: translateY(-1px); opacity: 1; } .ai-model-badge .sparkle-icon { - font-size: 11px; + font-size: 10px; } .header-icon { @@ -389,7 +389,7 @@ } .message-bubble { - padding: 10px 14px; + padding: 11px 14px; border-radius: var(--chat-radius); max-width: 92%; word-wrap: break-word; @@ -404,18 +404,19 @@ } .message.assistant .message-bubble { - background-color: color-mix(in srgb, var(--vscode-editor-background) 50%, var(--vscode-sideBar-background) 50%); - border: 1px solid var(--vscode-widget-border, rgba(128, 128, 128, 0.2)); + background: transparent; + border: none; border-bottom-left-radius: 4px; } .message-role { - font-size: 10px; - font-weight: 500; + font-size: 9px; + font-weight: 600; text-transform: uppercase; - letter-spacing: 0.3px; + letter-spacing: 0.4px; color: var(--vscode-descriptionForeground); padding: 0 4px; + opacity: 0.6; } .message-content { @@ -465,7 +466,8 @@ .code-block-wrapper pre { margin: 0; - padding-top: 32px; + padding: 12px; + padding-top: 44px; } .code-block-header { @@ -476,14 +478,14 @@ display: flex; justify-content: space-between; align-items: center; - padding: 4px 12px; - background: rgba(0, 0, 0, 0.15); + padding: 8px 12px; + background: rgba(0, 0, 0, 0.2); border-radius: var(--chat-radius-sm) var(--chat-radius-sm) 0 0; border-bottom: 1px solid var(--vscode-widget-border, rgba(128, 128, 128, 0.15)); } .code-language { - font-size: 11px; + font-size: 10px; font-weight: 500; color: var(--vscode-descriptionForeground); text-transform: uppercase; @@ -495,7 +497,7 @@ align-items: center; gap: 4px; padding: 4px 8px; - font-size: 11px; + font-size: 10px; color: var(--vscode-descriptionForeground); background: transparent; border: 1px solid var(--vscode-widget-border, rgba(128, 128, 128, 0.2)); @@ -531,7 +533,7 @@ align-items: center; gap: 4px; padding: 4px 8px; - font-size: 11px; + font-size: 10px; color: var(--vscode-descriptionForeground); background: transparent; border: 1px solid var(--vscode-widget-border, rgba(128, 128, 128, 0.2)); @@ -682,11 +684,40 @@ background-color: var(--vscode-keybindingTable-rowsBackground, rgba(128, 128, 128, 0.04)); } + .file-preview { + background: var(--vscode-textCodeBlock-background); + border: 1px solid var(--vscode-widget-border, rgba(128, 128, 128, 0.15)); + border-radius: var(--chat-radius-sm); + margin: 8px 0; + overflow: hidden; + } + + .file-preview-header { + display: flex; + align-items: center; + gap: 6px; + padding: 6px 10px; + background: rgba(128, 128, 128, 0.1); + font-size: 11px; + font-weight: 500; + color: var(--vscode-descriptionForeground); + } + + .file-preview-content { + padding: 8px 10px; + font-family: var(--vscode-editor-font-family); + font-size: 11px; + max-height: 150px; + overflow: auto; + white-space: pre-wrap; + word-break: break-word; + } + .input-container { display: flex; align-items: flex-end; - gap: 6px; - padding: 10px 12px; + gap: 8px; + padding: 11px 12px; background: var(--vscode-input-background); border: 1px solid var(--vscode-widget-border, rgba(128, 128, 128, 0.2)); border-radius: var(--chat-radius); @@ -737,7 +768,7 @@ background: var(--vscode-button-background); color: var(--vscode-button-foreground); border: none; - border-radius: var(--chat-radius-sm); + border-radius: 6px; cursor: pointer; display: flex; align-items: center; @@ -749,11 +780,11 @@ .send-btn:hover:not(:disabled) { opacity: 1; background: var(--vscode-button-hoverBackground); - transform: scale(1.05); + transform: scale(1.04); } .send-btn:active:not(:disabled) { - transform: scale(0.95); + transform: scale(0.96); } .send-btn:disabled { @@ -774,7 +805,7 @@ background: var(--vscode-errorForeground); color: var(--vscode-editor-background); border: none; - border-radius: var(--chat-radius-sm); + border-radius: 6px; cursor: pointer; display: flex; align-items: center; @@ -784,11 +815,11 @@ .stop-btn:hover { opacity: 0.85; - transform: scale(1.05); + transform: scale(1.04); } .stop-btn:active { - transform: scale(0.95); + transform: scale(0.96); } .stop-btn svg { @@ -804,7 +835,7 @@ background: rgba(128, 128, 128, 0.15); color: var(--vscode-descriptionForeground); border: none; - border-radius: 8px; + border-radius: 6px; cursor: pointer; display: flex; align-items: center; @@ -909,95 +940,6 @@ opacity: 0.8; } - .file-preview { - background: var(--vscode-textCodeBlock-background); - border: 1px solid var(--vscode-widget-border, rgba(128, 128, 128, 0.15)); - border-radius: var(--chat-radius-sm); - margin: 8px 0; - overflow: hidden; - } - - .file-preview-header { - display: flex; - align-items: center; - gap: 6px; - padding: 6px 10px; - background: rgba(128, 128, 128, 0.1); - font-size: 11px; - font-weight: 500; - color: var(--vscode-descriptionForeground); - } - - .file-preview-content { - padding: 8px 10px; - font-family: var(--vscode-editor-font-family); - font-size: 11px; - max-height: 150px; - overflow: auto; - white-space: pre-wrap; - word-break: break-word; - } - - .empty-state { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - flex: 1; - text-align: center; - color: var(--vscode-descriptionForeground); - padding: 24px 16px; - gap: 12px; - } - - .empty-state-icon { - font-size: 36px; - opacity: 0.6; - filter: grayscale(0.3); - } - - .empty-state-text { - font-size: 12px; - line-height: 1.6; - max-width: 220px; - opacity: 0.8; - } - - .empty-state-hint { - font-size: 10px; - opacity: 0.5; - display: flex; - align-items: center; - gap: 4px; - } - - .suggestions { - display: flex; - flex-wrap: wrap; - justify-content: center; - gap: 6px; - margin-top: 8px; - } - - .suggestion-btn { - padding: 5px 10px; - font-size: 11px; - background: transparent; - color: var(--vscode-textLink-foreground); - border: 1px solid var(--vscode-textLink-foreground); - border-radius: 20px; - cursor: pointer; - transition: all var(--transition-fast); - opacity: 0.7; - } - - .suggestion-btn:hover { - opacity: 1; - background: var(--vscode-textLink-foreground); - color: var(--vscode-button-foreground); - transform: translateY(-1px); - } - .typing-indicator { display: none; padding: 12px 16px; @@ -1145,7 +1087,7 @@ background: rgba(128, 128, 128, 0.15); color: var(--vscode-descriptionForeground); border: none; - border-radius: 8px; + border-radius: 6px; cursor: pointer; display: flex; align-items: center; @@ -1468,4 +1410,387 @@ border: 1px solid var(--vscode-inputValidation-errorBorder, #f14c4c); } + /* Context Bar - shows connection and database */ + .context-bar { + display: flex; + align-items: center; + gap: 12px; + padding: 10px 12px; + background: transparent; + border-bottom: 1px solid var(--vscode-widget-border); + font-size: 10px; + animation: slideDown 0.25s ease; + } + + @keyframes slideDown { + from { + opacity: 0; + transform: translateY(-4px); + } + to { + opacity: 1; + transform: translateY(0); + } + } + + .context-item { + display: flex; + align-items: center; + gap: 4px; + } + + .context-label { + color: var(--vscode-descriptionForeground); + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.5px; + font-size: 9px; + opacity: 0.7; + } + + .context-value { + color: var(--vscode-foreground); + font-weight: 500; + padding: 2px 8px; + background: transparent; + border-radius: 4px; + max-width: 200px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-size: 10px; + } + + .context-value.badge { + background: var(--vscode-inputOption-hoverBackground); + border: 1px solid var(--vscode-widget-border); + padding: 3px 8px; + } + + /* Empty State Restructured */ + .empty-state { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + flex: 1; + padding: 48px 24px; + gap: 32px; + color: var(--vscode-descriptionForeground); + } + + .empty-state-header { + display: flex; + flex-direction: column; + align-items: center; + gap: 10px; + text-align: center; + } + + .empty-state-title { + font-size: 24px; + font-weight: 600; + color: var(--vscode-foreground); + letter-spacing: -0.3px; + } + + .empty-state-description { + font-size: 13px; + line-height: 1.6; + max-width: 320px; + color: var(--vscode-descriptionForeground); + opacity: 0.85; + } + + /* Quick Action Grid (2x2) */ + .quick-grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 16px; + width: 100%; + max-width: 380px; + } + + .quick-card { + display: flex; + flex-direction: column; + align-items: flex-start; + justify-content: flex-start; + gap: 12px; + padding: 20px; + background: color-mix(in srgb, var(--vscode-button-secondaryBackground) 40%, transparent); + border: 1px solid var(--vscode-widget-border); + border-radius: 10px; + cursor: pointer; + transition: all 0.2s ease; + color: var(--vscode-foreground); + font-size: 11px; + font-weight: 500; + text-align: left; + } + + .quick-card:hover { + background: color-mix(in srgb, var(--vscode-button-secondaryBackground) 60%, transparent); + border-color: var(--vscode-focusBorder); + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2); + } + + .quick-card:active { + transform: translateY(0); + } + + .quick-card-icon { + font-size: 20px; + opacity: 0.8; + line-height: 1; + } + + .quick-card-title { + font-weight: 600; + font-size: 13px; + color: var(--vscode-foreground); + } + + .quick-card-description { + font-size: 11px; + opacity: 0.65; + color: var(--vscode-descriptionForeground); + line-height: 1.4; + } + + /* SQL Snippets Section */ + .snippets-section { + display: flex; + flex-direction: column; + align-items: center; + gap: 12px; + width: 100%; + max-width: 380px; + } + + .snippets-label { + font-size: 10px; + font-weight: 700; + color: var(--vscode-descriptionForeground); + letter-spacing: 1px; + text-transform: uppercase; + opacity: 0.7; + } + + .snippets-grid { + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: 8px; + width: 100%; + } + + .snippet-btn { + display: inline-flex; + align-items: center; + padding: 6px 11px; + background: var(--vscode-textCodeBlock-background); + border: 1px solid var(--vscode-widget-border); + border-radius: 5px; + cursor: pointer; + transition: all 0.15s ease; + color: var(--vscode-foreground); + font-size: 10px; + font-family: var(--vscode-editor-font-family); + font-weight: 500; + letter-spacing: 0.2px; + white-space: nowrap; + } + + .snippet-btn:hover { + border-color: var(--vscode-focusBorder); + background: color-mix(in srgb, var(--vscode-textCodeBlock-background) 80%, var(--vscode-focusBorder) 20%); + transform: translateY(-1px); + } + + .snippet-btn:active { + transform: translateY(0); + } + + /* Suggestion Bubble Strip for next steps */ + .bubble-strip { + display: flex; + align-items: center; + gap: 8px; + padding: 10px 12px; + background: color-mix(in srgb, var(--vscode-editor-background) 80%, #4caf50 10%); + border: 1px solid color-mix(in srgb, var(--vscode-widget-border) 70%, #4caf50 30%); + border-radius: var(--chat-radius-sm) var(--chat-radius-sm) 0 0; + flex-wrap: wrap; + animation: slideUp 0.3s ease; + } + + @keyframes slideUp { + from { + opacity: 0; + transform: translateY(8px); + } + to { + opacity: 1; + transform: translateY(0); + } + } + + .bubble-strip-label { + font-size: 10px; + font-weight: 600; + color: var(--vscode-descriptionForeground); + text-transform: uppercase; + letter-spacing: 0.3px; + white-space: nowrap; + } + + .bubble-strip-content { + display: flex; + gap: 6px; + flex-wrap: wrap; + flex: 1; + } + + .suggestion-bubble { + display: inline-flex; + padding: 4px 10px; + background: var(--vscode-badge-background); + border: 1px solid var(--vscode-widget-border); + border-radius: 12px; + cursor: pointer; + transition: all var(--transition-fast); + font-size: 10px; + color: var(--vscode-badge-foreground); + font-weight: 500; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + max-width: 140px; + } + + .suggestion-bubble:hover { + background: var(--vscode-button-secondaryBackground); + border-color: var(--vscode-focusBorder); + transform: translateY(-1px); + } + + /* Error Card for structured error handling */ + .error-card { + display: flex; + flex-direction: column; + gap: 8px; + padding: 10px 12px; + background: var(--vscode-inputValidation-errorBackground, #5a1d1d); + border: 1px solid var(--vscode-inputValidation-errorBorder, #be1100); + border-radius: var(--chat-radius-sm) var(--chat-radius-sm) 0 0; + animation: slideDown 0.25s ease; + } + + .error-card-header { + display: flex; + align-items: center; + gap: 6px; + font-weight: 600; + color: var(--vscode-errorForeground, #f48771); + font-size: 11px; + } + + .error-card-icon { + font-size: 14px; + } + + .error-card-title { + text-transform: uppercase; + letter-spacing: 0.3px; + } + + .error-card-message { + font-size: 10px; + color: var(--vscode-errorForeground, #f48771); + line-height: 1.4; + opacity: 0.9; + margin: 2px 0; + } + + .error-card-actions { + display: flex; + gap: 6px; + margin-top: 4px; + } + + .error-card-btn { + display: inline-flex; + align-items: center; + gap: 4px; + padding: 3px 8px; + background: transparent; + border: 1px solid var(--vscode-errorForeground, #f48771); + border-radius: 4px; + color: var(--vscode-errorForeground, #f48771); + cursor: pointer; + font-size: 9px; + font-weight: 500; + transition: all var(--transition-fast); + white-space: nowrap; + } + + .error-card-btn:hover { + background: var(--vscode-errorForeground, #f48771); + color: var(--vscode-editor-background); + } + + /* Message action buttons (Phase E prep) */ + .msg-actions { + display: flex; + gap: 4px; + margin-top: 4px; + opacity: 0; + transition: opacity var(--transition-fast); + } + + .message:hover .msg-actions { + opacity: 1; + } + + .msg-action-btn { + display: flex; + align-items: center; + gap: 3px; + padding: 2px 6px; + font-size: 9px; + background: transparent; + border: 1px solid var(--vscode-widget-border); + border-radius: 3px; + color: var(--vscode-descriptionForeground); + cursor: pointer; + transition: all var(--transition-fast); + } + + .msg-action-btn:hover { + background: var(--vscode-button-secondaryBackground); + color: var(--vscode-button-secondaryForeground); + border-color: var(--vscode-button-secondaryBackground); + } + + /* History date group headers (Phase F prep) */ + .history-date-group-header { + padding: 6px 12px 4px; + font-size: 10px; + font-weight: 600; + color: var(--vscode-descriptionForeground); + text-transform: uppercase; + letter-spacing: 0.5px; + background: var(--vscode-sideBar-background); + border-top: 1px solid var(--vscode-widget-border); + position: sticky; + top: 0; + z-index: 10; + } + + .history-date-group-header:first-child { + border-top: none; + } + /* Auto-context styles */ \ No newline at end of file From 6650bf86383086923994d5292c104a0d8edb65d6 Mon Sep 17 00:00:00 2001 From: Richie Varghese Date: Mon, 6 Apr 2026 13:25:44 +0530 Subject: [PATCH 02/14] feat: update connection timeout handling and migrate legacy settings - Adjusted connection timeout to use a configurable value for both Azure and general connections, defaulting to 15 seconds. - Implemented migration logic for legacy Azure connection timeouts from previous versions. - Enhanced AI service to retrieve API keys from a secret storage service. - Updated chat interface with improved input handling, including auto-resizing and enhanced suggestion bubbles. - Refined UI styles for better user experience in chat and connection forms. - Added support for follow-up questions in chat responses, improving interaction flow. --- CHANGELOG.md | 15 ++ README.md | 4 +- package-lock.json | 6 +- package.json | 2 +- src/aiSettingsPanel.ts | 70 ++++- src/common/types.ts | 2 +- src/connectionForm.ts | 1 + src/connectionManagement.ts | 2 +- src/extension.ts | 38 +++ src/providers/chat/AiService.ts | 45 +++- src/services/ConnectionManager.ts | 2 +- src/services/SecretStorageService.ts | 12 + templates/ai-settings/scripts.js | 20 +- templates/chat/index.html | 60 +++-- templates/chat/scripts.js | 203 +++++++++++--- templates/chat/styles.css | 382 +++++++++++++++++---------- templates/connection-form/index.html | 4 +- 17 files changed, 625 insertions(+), 243 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f21347d..20855ba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 --- +## [0.8.9] - 2026-04-06 + +### Added +- **Anthropic model discovery**: AI Settings now lists Anthropic models from the official `/v1/models` API instead of a fixed local list. +- **Guided chat responses**: Assistant replies can now include numbered follow-up questions, optional next-step suggestion bubbles, and contextual quote-style factoids or jokes when they genuinely fit. + +### Changed +- **AI key lookup**: Direct AI provider keys now resolve from `SecretStorage` first, fixing false “API key required” errors when the key is already saved. +- **Chat identity and styling**: Assistant messages are labeled **PG Studio Bot**, with improved assistant bubble contrast and quote styling for richer responses. +- **Composer UX**: The chat input and suggestion bubbles were tightened for readability, capped to a compact height, and styled to avoid carrying stale next-step actions between chats. + +### Fixed +- **Follow-up selection**: Typing a number now resolves to the corresponding numbered follow-up question from the previous assistant message, instead of being treated as a fresh prompt. +- **Next-step carry-over**: Next-step bubbles are hidden when a new follow-up is sent or when switching chats, so actions remain specific to the active conversation. + ## [0.8.8] - 2026-03-21 ### Added diff --git a/README.md b/README.md index 9228735..76e72c9 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ - 🔍 **EXPLAIN CodeLens** — One-click query analysis directly in notebooks - 🛡️ **Auto-LIMIT** — Intelligent query protection (configurable, default 1000 rows) - 🌍 **Foreign Data Wrappers** — Manage foreign servers, user mappings & tables -- 🤖 **AI-Powered** — Generate, Optimize, Explain & Analyze (OpenAI, Anthropic, Gemini) +- 🤖 **AI-Powered** — Generate, Optimize, Explain & Analyze with guided follow-ups and next-step suggestions (OpenAI, Anthropic, Gemini) - 📤 **Export Data** — Export results to CSV, JSON, or Excel --- @@ -130,7 +130,7 @@ Then: **PostgreSQL icon** → **Add Connection** → Enter details → **Connect - `SECURITY.md` - Security policy and vulnerability reporting guidance - `CHANGELOG.md` - Release notes and what changed across versions -**v0.8.8 (latest) —** Sidebar puts **Connections** and **SQL Assistant** first; **Saved Queries** and **Query History** start collapsed for fresh view state; **What’s New** is command-palette only. Notebook inline edits use **parameterized SQL inside transactions**. **Table Designer** adds **create-mode column reorder** and improved **SQL preview** styling. Details: `CHANGELOG.md`. +**v0.8.9 (latest) —** AI chat now lists Anthropic models from the official API, resolves saved AI keys from SecretStorage, and adds guided follow-up selection plus optional next-step bubbles/factoids. Assistant responses are labeled **PG Studio Bot**. Details: `CHANGELOG.md`. --- diff --git a/package-lock.json b/package-lock.json index ba9aca8..2b5b7b0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "postgres-explorer", - "version": "0.8.5", + "version": "0.8.9", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "postgres-explorer", - "version": "0.8.5", + "version": "0.8.9", "license": "MIT", "dependencies": { "@types/pg-cursor": "^2.7.2", @@ -42,7 +42,7 @@ }, "engines": { "node": ">=18.0.0", - "vscode": "^1.90.0" + "vscode": "^1.110.0" } }, "node_modules/@asamuzakjp/css-color": { diff --git a/package.json b/package.json index 17b6241..1aed4f0 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "theme": "dark" }, "engines": { - "vscode": "^1.90.0", + "vscode": "^1.110.0", "node": ">=18.0.0" }, "categories": [ diff --git a/src/aiSettingsPanel.ts b/src/aiSettingsPanel.ts index 2301b5d..08bb2f6 100644 --- a/src/aiSettingsPanel.ts +++ b/src/aiSettingsPanel.ts @@ -179,14 +179,11 @@ export class AiSettingsPanel { } models = await this._listOpenAIModels(settings.apiKey); } else if (settings.provider === 'anthropic') { - // Anthropic doesn't have a public models API, use known models - models = [ - 'claude-3-5-sonnet-20241022', - 'claude-3-5-haiku-20241022', - 'claude-3-opus-20240229', - 'claude-3-sonnet-20240229', - 'claude-3-haiku-20240307' - ]; + // Use Anthropic's models API when an API key is provided + if (!settings.apiKey) { + throw new Error('API Key is required to list models for Anthropic'); + } + models = await this._listAnthropicModels(settings.apiKey); } else if (settings.provider === 'gemini') { if (!settings.apiKey) { throw new Error('API Key is required to list models'); @@ -258,6 +255,63 @@ export class AiSettingsPanel { }); } + private async _listAnthropicModels(apiKey: string): Promise { + return new Promise((resolve, reject) => { + const options = { + hostname: 'api.anthropic.com', + path: '/v1/models', + method: 'GET', + headers: { + 'X-Api-Key': apiKey, + 'anthropic-version': '2023-06-01' + } + }; + + const req = https.request(options, (res: any) => { + let body = ''; + res.on('data', (chunk: any) => body += chunk); + res.on('end', () => { + if (res.statusCode === 200) { + try { + const data = JSON.parse(body); + + // Accept several response shapes (models, data, or array) + let list: any[] = []; + if (Array.isArray(data)) { + list = data; + } else if (Array.isArray(data.models)) { + list = data.models; + } else if (Array.isArray(data.data)) { + list = data.data; + } else { + for (const k of Object.keys(data)) { + if (Array.isArray((data as any)[k])) { + list = (data as any)[k]; + break; + } + } + } + + const models = list + .map((m: any) => m.id || m.name || m.model || (typeof m === 'string' ? m : undefined)) + .filter(Boolean) + .sort(); + + resolve(models as string[]); + } catch (e) { + reject(new Error('Failed to parse Anthropic models response')); + } + } else { + reject(new Error(`Failed to list Anthropic models: ${res.statusCode} - ${body}`)); + } + }); + }); + + req.on('error', (err: any) => reject(err)); + req.end(); + }); + } + private async _listGeminiModels(apiKey: string): Promise { return new Promise((resolve, reject) => { const options = { diff --git a/src/common/types.ts b/src/common/types.ts index 142a093..194dc68 100644 --- a/src/common/types.ts +++ b/src/common/types.ts @@ -12,7 +12,7 @@ export interface ConnectionConfig { sslKeyPath?: string; // Client key path sslRootCertPath?: string; // CA certificate path statementTimeout?: number; // milliseconds - connectTimeout?: number; // seconds (default: 5) + connectTimeout?: number; // seconds (default: 15) applicationName?: string; // Shows in pg_stat_activity options?: string; // Raw options string (e.g., "-c search_path=myschema") // Safety & confidence features diff --git a/src/connectionForm.ts b/src/connectionForm.ts index f969fa3..3624f70 100644 --- a/src/connectionForm.ts +++ b/src/connectionForm.ts @@ -81,6 +81,7 @@ export class ConnectionFormPanel { user: connection.username || undefined, password: effectivePassword, database: dbName, + connectionTimeoutMillis: (connection.connectTimeout || 15) * 1000, }; if (!forceDisableSSL) { diff --git a/src/connectionManagement.ts b/src/connectionManagement.ts index 4e9a042..2323b83 100644 --- a/src/connectionManagement.ts +++ b/src/connectionManagement.ts @@ -87,7 +87,7 @@ export class ConnectionManagementPanel { user: connection.username || undefined, password: password || undefined, database: connection.database || 'postgres', - connectionTimeoutMillis: 5000 + connectionTimeoutMillis: (connection.connectTimeout || 15) * 1000 }); await client.connect(); diff --git a/src/extension.ts b/src/extension.ts index 13a13c1..d3fe9d0 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -30,6 +30,31 @@ export let statusBar: NotebookStatusBar; let chatViewProvider: ChatViewProvider | undefined; +function isAzurePostgresHost(host?: string): boolean { + if (!host) { + return false; + } + + const normalizedHost = host.toLowerCase(); + return normalizedHost.includes('postgres.database.azure.com'); +} + +function migrateLegacyAzureConnectionTimeouts(connections: any[]): { connections: any[]; migratedCount: number } { + let migratedCount = 0; + + const migratedConnections = connections.map((connection) => { + // Legacy Azure connections from v0.8.8 commonly carried a 5s default timeout. + if (isAzurePostgresHost(connection.host) && connection.connectTimeout === 5) { + migratedCount++; + return { ...connection, connectTimeout: 15 }; + } + + return connection; + }); + + return { connections: migratedConnections, migratedCount }; +} + export function getChatViewProvider(): ChatViewProvider | undefined { return chatViewProvider; } @@ -63,6 +88,19 @@ export async function activate(context: vscode.ExtensionContext) { console.log('Migrated legacy connections to include IDs'); } + const azureTimeoutMigrationKey = 'postgresExplorer.migrations.azureConnectionTimeouts.v0_8_9'; + const azureTimeoutMigrationDone = context.globalState.get(azureTimeoutMigrationKey, false); + + if (!azureTimeoutMigrationDone) { + const timeoutMigration = migrateLegacyAzureConnectionTimeouts(migratedConnections); + if (timeoutMigration.migratedCount > 0) { + await config.update('postgresExplorer.connections', timeoutMigration.connections, vscode.ConfigurationTarget.Global); + console.log(`Migrated ${timeoutMigration.migratedCount} Azure connection(s) to a 15 second timeout`); + } + + await context.globalState.update(azureTimeoutMigrationKey, true); + } + // Phase 7: Initialize ProfileManager and SavedQueriesService ProfileManager.getInstance().initialize(context); SavedQueriesService.getInstance().initialize(context); diff --git a/src/providers/chat/AiService.ts b/src/providers/chat/AiService.ts index 2c56b22..63017a5 100644 --- a/src/providers/chat/AiService.ts +++ b/src/providers/chat/AiService.ts @@ -5,6 +5,7 @@ import * as vscode from 'vscode'; import * as https from 'https'; import * as http from 'http'; import { ChatMessage } from './types'; +import { SecretStorageService } from '../../services/SecretStorageService'; export class AiService { private _messages: ChatMessage[] = []; @@ -117,31 +118,46 @@ IMPORTANT: At the end of each response, provide 2-4 numbered follow-up questions Make these questions relevant to the topic discussed and progressively more advanced. +IMPORTANT: If there is a genuinely good factoid or contextual joke, add it immediately before the follow-up questions as a short Markdown blockquote. +- Use your judgment: this is mainly for general-knowledge, conceptual, or exploratory answers. +- For simple fix, error, or query-generation tasks, usually omit it unless there is a truly apt one-liner. +- You may include a factoid, a joke, both, or neither. +- Keep it short, self-contained, and clearly relevant to the current answer. +- Format it as quote style markdown using blockquote lines only; do not add a heading. + +IMPORTANT: Follow-up questions are distinct from next-step suggestion bubbles. +- If the user's latest message is only a number, treat it as selecting that numbered question from the immediately previous assistant response's "Follow-up questions:" list. +- Answer the selected follow-up question directly. +- Do not confuse this with next-step bubbles, which are optional model suggestions and not user selections. + **PHASE D: NEXT STEPS SUGGESTION BUBBLES (Optional):** -After your response, you MAY optionally provide suggested follow-up actions the user might want to take. If you do, append them EXACTLY in this JSON format at the very end of your response (after the follow-up questions): +After your response, you MAY optionally provide suggested follow-up actions the user might want to take. If you do, append them as a raw JSON object at the very end of your response (after the follow-up questions). Do not wrap the JSON in markdown or code fences. -\`\`\`json { "next_steps": [ - "First suggested action or question (< 120 chars)", - "Second suggested action or question (< 120 chars)", - "Third suggested action or question (< 120 chars)" + "Short action phrase, 3 to 6 words max", + "Short action phrase, 3 to 6 words max", + "Short action phrase, 3 to 6 words max" ] } -\`\`\` + IMPORTANT: Only include this JSON block if you have 2-3 truly valuable next-step suggestions. The suggestions should be: - Actionable and relevant to the current conversation -- Phrased as concise questions or prompts (< 120 characters each) +- Phrased as concise, self-contained action phrases or prompts (ideally 3-6 words, max 40 characters each) - Progressive in complexity or depth -- Examples: "Show me how to index this table", "What indexes exist on orders?", "How to optimize this JOIN?" +- Examples: "Review query plan", "Add missing index", "Compare join options" Do NOT include the JSON block if: - There are no clear follow-up actions - The suggestions are obvious or trivial - You're uncertain about what would be helpful next +- Do not invent filler suggestions just to reach 3 entries +- Do not repeat the follow-up questions in this JSON block +- If only 1 or 2 actions are appropriate, provide only those +- If no actions are appropriate, omit the JSON block entirely -The JSON will be automatically parsed and shown as clickable suggestion bubbles in the UI.`; +The UI will automatically parse this and show clickable suggestion bubbles.`; } async callVsCodeLm(userMessage: string, config: vscode.WorkspaceConfiguration, customSystemPrompt?: string): Promise<{ text: string, usage?: string }> { @@ -499,7 +515,7 @@ The JSON will be automatically parsed and shown as clickable suggestion bubbles } async callDirectApi(provider: string, userMessage: string, config: vscode.WorkspaceConfiguration, customSystemPrompt?: string): Promise<{ text: string, usage?: string }> { - const apiKey = config.get('aiApiKey'); + const apiKey = await this._getDirectApiKey(config); // API key is required for most providers, but optional for custom endpoints if (!apiKey && provider !== 'custom') { @@ -599,6 +615,15 @@ The JSON will be automatically parsed and shown as clickable suggestion bubbles return this._makeHttpRequest(endpoint, headers, body, provider); } + private async _getDirectApiKey(config: vscode.WorkspaceConfiguration): Promise { + try { + const secretApiKey = await SecretStorageService.getInstance().getAiApiKey(); + return secretApiKey || config.get('aiApiKey') || ''; + } catch { + return config.get('aiApiKey') || ''; + } + } + private _makeHttpRequest(endpoint: string, headers: any, body: any, provider: string): Promise<{ text: string, usage?: string }> { return new Promise((resolve, reject) => { const url = new URL(endpoint); diff --git a/src/services/ConnectionManager.ts b/src/services/ConnectionManager.ts index b2b1cbe..9ebecc2 100644 --- a/src/services/ConnectionManager.ts +++ b/src/services/ConnectionManager.ts @@ -427,7 +427,7 @@ export class ConnectionManager { user: config.username || undefined, password: password || undefined, database: config.database || "postgres", - connectionTimeoutMillis: (config.connectTimeout || 5) * 1000, + connectionTimeoutMillis: (config.connectTimeout || 15) * 1000, statement_timeout: config.statementTimeout || vscode.workspace diff --git a/src/services/SecretStorageService.ts b/src/services/SecretStorageService.ts index e4ff370..26df724 100644 --- a/src/services/SecretStorageService.ts +++ b/src/services/SecretStorageService.ts @@ -18,13 +18,25 @@ export class SecretStorageService { return await this.context.secrets.get(`postgres-password-${connectionId}`); } + public async getAiApiKey(): Promise { + return await this.context.secrets.get('postgresExplorer.aiApiKey'); + } + public async setPassword(connectionId: string, password: string): Promise { await this.context.secrets.store(`postgres-password-${connectionId}`, password); } + public async setAiApiKey(apiKey: string): Promise { + await this.context.secrets.store('postgresExplorer.aiApiKey', apiKey); + } + public async deletePassword(connectionId: string): Promise { await this.context.secrets.delete(`postgres-password-${connectionId}`); } + + public async deleteAiApiKey(): Promise { + await this.context.secrets.delete('postgresExplorer.aiApiKey'); + } } /** diff --git a/templates/ai-settings/scripts.js b/templates/ai-settings/scripts.js index bdac75c..cb884bb 100644 --- a/templates/ai-settings/scripts.js +++ b/templates/ai-settings/scripts.js @@ -62,15 +62,13 @@ function autoLoadModels(provider, apiKey, endpoint) { settings: { provider: 'vscode-lm', apiKey: '', endpoint: '' } }); } else if (provider === 'anthropic') { - // Anthropic has a fixed list, we can show it immediately - const anthropicModels = [ - 'claude-3-5-sonnet-20241022', - 'claude-3-5-haiku-20241022', - 'claude-3-opus-20240229', - 'claude-3-sonnet-20240229', - 'claude-3-haiku-20240307' - ]; - handleModelsListed(anthropicModels); + // Prefer to fetch Anthropic models from the API when API key is provided + if (apiKey && apiKey.length > 0) { + vscode.postMessage({ + command: 'listModels', + settings: { provider: 'anthropic', apiKey: apiKey, endpoint: endpoint } + }); + } } else if ((provider === 'openai' || provider === 'gemini') && apiKey) { // Load models if API key is available vscode.postMessage({ @@ -181,12 +179,12 @@ document.querySelectorAll('.list-models-btn').forEach(btn => { const provider = this.getAttribute('data-provider'); const settings = getFormData(); - if ((provider === 'openai' || provider === 'gemini') && !settings.apiKey) { + if ((provider === 'openai' || provider === 'gemini' || provider === 'anthropic') && !settings.apiKey) { showMessage('Please enter an API key first', true); return; } - // VS Code LM and Anthropic don't require API key check + // VS Code LM does not require an API key if (provider === 'custom' && !settings.endpoint) { showMessage('Please enter an endpoint first', true); return; diff --git a/templates/chat/index.html b/templates/chat/index.html index 1313c31..cfffdad 100644 --- a/templates/chat/index.html +++ b/templates/chat/index.html @@ -140,7 +140,16 @@

🐘

@@ -176,30 +185,33 @@

🐘

Loading database objects...
-
- - - - - +
+ +
+
diff --git a/templates/chat/scripts.js b/templates/chat/scripts.js index 13f1bfc..a3ecbdc 100644 --- a/templates/chat/scripts.js +++ b/templates/chat/scripts.js @@ -27,6 +27,9 @@ const mentionSearch = document.getElementById('mentionSearch'); const mentionList = document.getElementById('mentionList'); const mentionBtn = document.getElementById('mentionBtn'); +const CHAT_INPUT_MIN_HEIGHT = 38; +const CHAT_INPUT_MAX_VISIBLE_LINES = 5; + let attachedFiles = []; let loadingInterval = null; let typingAnimation = null; @@ -36,6 +39,7 @@ let selectedMentions = []; let mentionPickerVisible = false; let selectedMentionIndex = -1; let searchDebounceTimer = null; +let currentMessages = []; let currentHierarchyPath = { connection: null, database: null, @@ -160,6 +164,28 @@ function renderBreadcrumbs() { } } +function resizeChatInput() { + if (!chatInput) { + return; + } + + chatInput.style.height = 'auto'; + + const styles = window.getComputedStyle(chatInput); + const lineHeight = parseFloat(styles.lineHeight) || 20; + const paddingTop = parseFloat(styles.paddingTop) || 0; + const paddingBottom = parseFloat(styles.paddingBottom) || 0; + const maxHeight = Math.ceil((lineHeight * CHAT_INPUT_MAX_VISIBLE_LINES) + paddingTop + paddingBottom); + + const nextHeight = Math.max( + CHAT_INPUT_MIN_HEIGHT, + Math.min(chatInput.scrollHeight, maxHeight) + ); + + chatInput.style.height = `${nextHeight}px`; + chatInput.style.overflowY = chatInput.scrollHeight > maxHeight ? 'auto' : 'hidden'; +} + function handleContainerClick(index) { const obj = dbObjects[index]; if (obj.type === 'connection') { @@ -779,9 +805,8 @@ function handleChatInput(event) { hideMentionPicker(); } - // Auto-resize textarea - chatInput.style.height = 'auto'; - chatInput.style.height = Math.min(chatInput.scrollHeight, 120) + 'px'; + // Auto-resize textarea, capped to five visible lines + resizeChatInput(); } function handleMentionKeydown(event) { @@ -975,7 +1000,11 @@ function getFileIcon(type) { } function sendMessage() { - const message = chatInput.value.trim(); + const rawMessage = chatInput.value.trim(); + const resolvedFollowUp = (/^\d+$/.test(rawMessage) && attachedFiles.length === 0 && selectedMentions.length === 0) + ? resolveFollowUpQuestionSelection(rawMessage) + : null; + const message = resolvedFollowUp || rawMessage; if (!message && attachedFiles.length === 0 && selectedMentions.length === 0) return; // Phase B: Track last message for retry functionality @@ -995,7 +1024,7 @@ function sendMessage() { }); chatInput.value = ''; - chatInput.style.height = 'auto'; + resizeChatInput(); chatInput.disabled = true; sendBtn.disabled = true; attachBtn.disabled = true; @@ -1361,7 +1390,9 @@ function sanitizeHtml(dirty) { const allowedTags = new Set([ 'a','b','i','em','strong','code','pre','p','br','ul','ol','li', 'span','div','blockquote','hr','h1','h2','h3','h4','h5','h6', - 'table','thead','tbody','tr','th','td' + 'table','thead','tbody','tr','th','td', + // Keep buttons and simple SVG so action controls remain interactive + 'button','svg','path' ]); // Allowed attributes per tag ("*" applies to all tags) @@ -1369,8 +1400,11 @@ function sanitizeHtml(dirty) { '*': ['class'], 'a': ['href', 'title', 'rel', 'target', 'class'], 'img': ['src', 'alt', 'title', 'class'], - 'code': ['class'], + // Preserve data-raw and id on code elements so copy/notebook features work + 'code': ['class', 'data-raw', 'id'], 'pre': ['class'], + 'button': ['class', 'title', 'aria-label', 'aria-pressed', 'aria-expanded'], + 'svg': ['viewBox', 'width', 'height', 'fill', 'class'], 'span': ['class'], 'div': ['class'], 'p': ['class'], @@ -1654,15 +1688,19 @@ function showToast(text, type = 'info') { let lastMessageCount = 0; function renderMessages(messages, animate = false) { + currentMessages = Array.isArray(messages) ? [...messages] : []; + if (messages.length === 0) { emptyState.style.display = 'flex'; const messageElements = messagesContainer.querySelectorAll('.message'); messageElements.forEach(el => el.remove()); + dismissBubbleStrip(); lastMessageCount = 0; return; } emptyState.style.display = 'none'; + dismissBubbleStrip(); // Check if this is a new assistant message (for typing effect) const isNewAssistantMessage = animate && @@ -1670,6 +1708,7 @@ function renderMessages(messages, animate = false) { messages[messages.length - 1].role === 'assistant'; lastMessageCount = messages.length; + let activeSuggestionBubbles = []; // Clear existing messages (but keep typing indicator) const messageElements = messagesContainer.querySelectorAll('.message'); @@ -1682,7 +1721,8 @@ function renderMessages(messages, animate = false) { const roleDiv = document.createElement('div'); roleDiv.className = 'message-role'; - roleDiv.textContent = msg.role === 'user' ? 'You' : 'Assistant'; + const emojis = ['😒', '🙄', '😕', '🤔', '😐', '🙂', '😀', '😁', '😴']; + roleDiv.textContent = msg.role === 'user' ? ' ' + emojis[Math.floor(Math.random() * emojis.length)] + ' You' : '🤖 PG Studio Bot'; const bubbleDiv = document.createElement('div'); bubbleDiv.className = 'message-bubble'; @@ -1723,10 +1763,11 @@ function renderMessages(messages, animate = false) { } else if (msg.role === 'assistant') { // Apply typing effect for the newest assistant message const isLastMessage = idx === messages.length - 1; + const extracted = safeJsonTailExtract(msg.content); + const cleanContent = extracted.content; + const bubbles = extracted.bubbles; + if (isNewAssistantMessage && isLastMessage) { - // Extract JSON next_steps and clean content - const { content: cleanContent, bubbles } = safeJsonTailExtract(msg.content); - // Will be typed out bubbleDiv.appendChild(contentDiv); messageDiv.appendChild(roleDiv); @@ -1743,13 +1784,16 @@ function renderMessages(messages, animate = false) { // Show bubbles after typing finishes if (bubbles.length > 0) { showSuggestionBubbles(bubbles); + } else { + dismissBubbleStrip(); } }); return; // Skip the normal append below } else { - // Extract JSON next_steps from non-typing messages - const { content: cleanContent, bubbles } = safeJsonTailExtract(msg.content); contentDiv.innerHTML = parseMarkdown(cleanContent); + if (isLastMessage) { + activeSuggestionBubbles = bubbles; + } } } else { contentDiv.textContent = msg.content; @@ -1774,6 +1818,12 @@ function renderMessages(messages, animate = false) { top: messagesContainer.scrollHeight, behavior: 'smooth' }); + + if (activeSuggestionBubbles.length > 0) { + showSuggestionBubbles(activeSuggestionBubbles); + } else { + dismissBubbleStrip(); + } } // ============================================================================ @@ -1869,6 +1919,73 @@ function dismissBubbleStrip() { } } +/** + * Convert a numeric user reply into the selected follow-up question text from + * the latest assistant message that listed follow-up questions. + * Returns null if there is no matching follow-up question list. + */ +function resolveFollowUpQuestionSelection(rawSelection) { + const selectedIndex = Number.parseInt(rawSelection, 10) - 1; + if (Number.isNaN(selectedIndex) || selectedIndex < 0) { + return null; + } + + for (let index = currentMessages.length - 1; index >= 0; index--) { + const message = currentMessages[index]; + if (message.role !== 'assistant' || !message.content) { + continue; + } + + const questions = extractFollowUpQuestions(message.content); + if (selectedIndex < questions.length) { + return `Follow-up question ${selectedIndex + 1}: ${questions[selectedIndex]}`; + } + } + + return null; +} + +/** + * Extract numbered follow-up questions from an assistant response. + * The parser looks for a "Follow-up questions:" heading followed by a numbered list. + */ +function extractFollowUpQuestions(responseText) { + if (!responseText) { + return []; + } + + const lines = responseText.split(/\r?\n/); + const headingIndex = lines.findIndex(line => /^\s*Follow-up questions:\s*$/i.test(line)); + if (headingIndex === -1) { + return []; + } + + const questions = []; + + for (let index = headingIndex + 1; index < lines.length; index++) { + const line = lines[index].trim(); + + if (!line) { + if (questions.length > 0) { + break; + } + continue; + } + + const match = line.match(/^\d+\.\s+(.*)$/); + if (!match) { + if (questions.length > 0) { + break; + } + continue; + } + + questions.push(match[1].trim()); + } + + return questions; +} + /** * Show error card with message and action buttons * @param {string} title - Error title @@ -1921,34 +2038,42 @@ function retryLastMessage() { */ function safeJsonTailExtract(responseText) { try { - // Look for JSON-like pattern at end of text - // Match: { "next_steps": [...] } - const jsonMatch = responseText.match(/\{\s*"next_steps"\s*:\s*\[([^\]]*)\]\s*\}\s*$/i); - - if (!jsonMatch) { - return { content: responseText, bubbles: [] }; - } - - // Try to parse the full JSON object - const jsonStart = responseText.lastIndexOf('{'); - if (jsonStart === -1) { - return { content: responseText, bubbles: [] }; + const trimmed = responseText.trimEnd(); + + const parseNextSteps = (jsonText, cleanContent) => { + const parsed = JSON.parse(jsonText); + if (!Array.isArray(parsed.next_steps)) { + return null; + } + + return { + content: cleanContent.trimEnd(), + bubbles: parsed.next_steps + .filter(step => typeof step === 'string' && step.trim().length > 0) + .map(step => step.trim()) + .slice(0, 5) + }; + }; + + // Prefer fenced JSON blocks because the model often formats the tail that way. + const fencedMatch = trimmed.match(/(?:^|\n)```(?:json)?\s*\n([\s\S]*?)\n```\s*$/i); + if (fencedMatch) { + const parsed = parseNextSteps(fencedMatch[1], trimmed.slice(0, fencedMatch.index)); + if (parsed) { + return parsed; + } } - - const jsonStr = responseText.substring(jsonStart); - const parsed = JSON.parse(jsonStr); - - if (!Array.isArray(parsed.next_steps)) { - return { content: responseText, bubbles: [] }; + + // Fallback to a bare JSON object at the end of the response. + const tailMatch = trimmed.match(/(\{\s*"next_steps"\s*:\s*\[[\s\S]*\]\s*\})\s*$/i); + if (tailMatch) { + const parsed = parseNextSteps(tailMatch[1], trimmed.slice(0, trimmed.length - tailMatch[1].length)); + if (parsed) { + return parsed; + } } - - // Remove JSON from display content - const cleanContent = responseText.substring(0, jsonStart).trim(); - - return { - content: cleanContent, - bubbles: parsed.next_steps.slice(0, 5) // Max 5 bubbles - }; + + return { content: responseText, bubbles: [] }; } catch (err) { // JSON parse failed, return original content console.warn('[PgStudio] JSON extraction failed:', err.message); diff --git a/templates/chat/styles.css b/templates/chat/styles.css index 914b154..d27cd1e 100644 --- a/templates/chat/styles.css +++ b/templates/chat/styles.css @@ -404,9 +404,10 @@ } .message.assistant .message-bubble { - background: transparent; - border: none; + background: color-mix(in srgb, var(--vscode-input-background) 92%, var(--vscode-editor-background) 8%); + border: 1px solid color-mix(in srgb, var(--vscode-widget-border) 78%, transparent); border-bottom-left-radius: 4px; + box-shadow: 0 1px 0 color-mix(in srgb, var(--vscode-widget-border) 35%, transparent); } .message-role { @@ -640,6 +641,39 @@ color: var(--vscode-foreground); } + .message-content blockquote { + position: relative; + margin: 14px 0; + padding: 12px 14px 12px 16px; + background: color-mix(in srgb, var(--vscode-input-background) 88%, var(--vscode-editor-background) 12%); + border-left: 4px solid color-mix(in srgb, var(--vscode-focusBorder) 55%, var(--vscode-descriptionForeground) 45%); + border: 1px solid color-mix(in srgb, var(--vscode-widget-border) 78%, transparent); + border-radius: 10px; + color: var(--vscode-foreground); + line-height: 1.55; + overflow: hidden; + } + + .message-content blockquote::before { + content: '“'; + position: absolute; + top: -6px; + left: 10px; + font-size: 34px; + line-height: 1; + color: var(--vscode-descriptionForeground); + opacity: 0.16; + pointer-events: none; + } + + .message-content blockquote p { + margin: 0; + } + + .message-content blockquote p + p { + margin-top: 8px; + } + .message-content h1, .message-content h2, .message-content h3 { @@ -715,40 +749,63 @@ .input-container { display: flex; - align-items: flex-end; - gap: 8px; - padding: 11px 12px; - background: var(--vscode-input-background); - border: 1px solid var(--vscode-widget-border, rgba(128, 128, 128, 0.2)); - border-radius: var(--chat-radius); - transition: border-color var(--transition-fast), box-shadow var(--transition-fast); + flex-direction: column; + gap: 10px; + padding: 12px; + background: color-mix(in srgb, var(--vscode-input-background) 92%, var(--vscode-editor-background) 8%); + border: 1px solid color-mix(in srgb, var(--vscode-widget-border) 85%, transparent); + border-radius: 16px; + transition: border-color var(--transition-fast), box-shadow var(--transition-fast), background-color var(--transition-fast); } .input-container:focus-within { border-color: var(--vscode-focusBorder); - box-shadow: 0 0 0 1px var(--vscode-focusBorder); + box-shadow: 0 0 0 1px color-mix(in srgb, var(--vscode-focusBorder) 45%, transparent); + } + + .composer-editor { + width: 100%; + } + + .composer-footer { + display: flex; + align-items: flex-end; + gap: 6px; + flex-wrap: wrap; } .chat-input { - flex: 1; - padding: 4px 0; + width: 100%; + min-height: 38px; + padding: 2px 2px 0; border: none; background: transparent; color: var(--vscode-input-foreground); font-family: var(--vscode-font-family), -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; - font-size: 13px; + font-size: 14px; outline: none; resize: none; - min-height: 20px; - max-height: 120px; - line-height: 1.5; - overflow-y: auto; - scrollbar-width: none; - -ms-overflow-style: none; + line-height: 1.45; + overflow-y: hidden; + scrollbar-width: thin; + scrollbar-color: var(--vscode-scrollbarSlider-background) transparent; } .chat-input::-webkit-scrollbar { - display: none; + width: 8px; + } + + .chat-input::-webkit-scrollbar-track { + background: transparent; + } + + .chat-input::-webkit-scrollbar-thumb { + background: var(--vscode-scrollbarSlider-background); + border-radius: 999px; + } + + .chat-input::-webkit-scrollbar-thumb:hover { + background: var(--vscode-scrollbarSlider-hoverBackground); } .chat-input::placeholder { @@ -760,66 +817,149 @@ cursor: not-allowed; } - .send-btn { + .attach-btn, + .mention-btn, + .send-btn, + .stop-btn { flex-shrink: 0; - width: 28px; - height: 28px; + border: 1px solid color-mix(in srgb, var(--vscode-widget-border) 90%, transparent); + transition: all var(--transition-fast); + } + + .attach-btn { + width: 32px; + height: 32px; + padding: 0; + background: color-mix(in srgb, var(--vscode-button-secondaryBackground) 65%, transparent); + color: var(--vscode-descriptionForeground); + border-radius: 10px; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + } + + .attach-btn:hover:not(:disabled) { + background: color-mix(in srgb, var(--vscode-button-secondaryBackground) 85%, var(--vscode-focusBorder) 15%); + color: var(--vscode-foreground); + } + + .attach-btn:disabled { + opacity: 0.3; + cursor: not-allowed; + } + + .attach-btn svg { + width: 16px; + height: 16px; + } + + .mention-btn { + width: 32px; + height: 32px; padding: 0; + background: color-mix(in srgb, var(--vscode-button-secondaryBackground) 65%, transparent); + color: var(--vscode-descriptionForeground); + border-radius: 10px; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + font-weight: 700; + font-size: 14px; + } + + .mention-btn:hover:not(:disabled) { + background: color-mix(in srgb, var(--vscode-button-secondaryBackground) 85%, var(--vscode-focusBorder) 15%); + color: var(--vscode-foreground); + } + + .mention-btn:disabled { + opacity: 0.3; + cursor: not-allowed; + } + + .attachments-container { + display: none; + flex: 1 1 240px; + min-width: 0; + flex-wrap: wrap; + gap: 6px; + padding: 0; + background: transparent; + border: none; + } + + .attachments-container.has-files, + .attachments-container.has-mentions { + display: flex; + } + + .send-btn { + margin-left: auto; + min-width: 84px; + height: 32px; + padding: 0 12px; background: var(--vscode-button-background); color: var(--vscode-button-foreground); - border: none; - border-radius: 6px; + border-radius: 10px; cursor: pointer; - display: flex; + display: inline-flex; align-items: center; justify-content: center; - transition: all var(--transition-fast); - opacity: 0.9; + gap: 6px; + font-size: 12px; + font-weight: 600; + letter-spacing: 0.1px; + opacity: 0.98; } .send-btn:hover:not(:disabled) { opacity: 1; background: var(--vscode-button-hoverBackground); - transform: scale(1.04); + transform: translateY(-1px); } .send-btn:active:not(:disabled) { - transform: scale(0.96); + transform: translateY(0); } .send-btn:disabled { - opacity: 0.4; + opacity: 0.45; cursor: not-allowed; } - .send-btn svg { - width: 14px; - height: 14px; + .send-btn-label, + .send-btn-shortcut { + pointer-events: none; + } + + .send-btn-shortcut { + font-size: 11px; + opacity: 0.9; } .stop-btn { - flex-shrink: 0; - width: 28px; - height: 28px; + margin-left: auto; + width: 32px; + height: 32px; padding: 0; background: var(--vscode-errorForeground); color: var(--vscode-editor-background); - border: none; - border-radius: 6px; + border-radius: 10px; cursor: pointer; display: flex; align-items: center; justify-content: center; - transition: all var(--transition-fast); } .stop-btn:hover { opacity: 0.85; - transform: scale(1.04); + transform: translateY(-1px); } .stop-btn:active { - transform: scale(0.96); + transform: translateY(0); } .stop-btn svg { @@ -827,51 +967,8 @@ height: 12px; } - .attach-btn { - flex-shrink: 0; - width: 28px; - height: 28px; - padding: 0; - background: rgba(128, 128, 128, 0.15); - color: var(--vscode-descriptionForeground); - border: none; - border-radius: 6px; - cursor: pointer; - display: flex; - align-items: center; - justify-content: center; - transition: all var(--transition-fast); - } - - .attach-btn:hover:not(:disabled) { - background: rgba(128, 128, 128, 0.25); - color: var(--vscode-foreground); - } - - .attach-btn:disabled { - opacity: 0.3; - cursor: not-allowed; - } - - .attach-btn svg { - width: 16px; - height: 16px; - } - - .attachments-container { - display: none; - flex-wrap: wrap; - gap: 6px; - padding: 8px 12px; - background-color: color-mix(in srgb, var(--vscode-input-background) 60%, transparent); - border: 1px solid var(--vscode-input-border); - border-bottom: none; - border-radius: var(--chat-radius) var(--chat-radius) 0 0; - margin-bottom: -1px; - } - - .attachments-container.has-files { - display: flex; + .input-wrapper.has-attachments .input-container { + border-color: color-mix(in srgb, var(--vscode-focusBorder) 45%, var(--vscode-widget-border) 55%); } .attachment-chip { @@ -1062,6 +1159,8 @@ .suggestion-btn:focus-visible, .send-btn:focus-visible, .attach-btn:focus-visible, + .mention-btn:focus-visible, + .stop-btn:focus-visible, .header-btn:focus-visible { outline: 2px solid var(--vscode-focusBorder); outline-offset: 2px; @@ -1074,37 +1173,7 @@ } .input-wrapper.has-attachments .input-container { - border-top-left-radius: 0; - border-top-right-radius: 0; - } - - /* @ Mention styles */ - .mention-btn { - flex-shrink: 0; - width: 28px; - height: 28px; - padding: 0; - background: rgba(128, 128, 128, 0.15); - color: var(--vscode-descriptionForeground); - border: none; - border-radius: 6px; - cursor: pointer; - display: flex; - align-items: center; - justify-content: center; - transition: all var(--transition-fast); - font-weight: bold; - font-size: 14px; - } - - .mention-btn:hover:not(:disabled) { - background: rgba(128, 128, 128, 0.25); - color: var(--vscode-foreground); - } - - .mention-btn:disabled { - opacity: 0.3; - cursor: not-allowed; + border-color: color-mix(in srgb, var(--vscode-focusBorder) 45%, var(--vscode-widget-border) 55%); } .mention-picker { @@ -1616,16 +1685,23 @@ /* Suggestion Bubble Strip for next steps */ .bubble-strip { display: flex; - align-items: center; - gap: 8px; - padding: 10px 12px; - background: color-mix(in srgb, var(--vscode-editor-background) 80%, #4caf50 10%); - border: 1px solid color-mix(in srgb, var(--vscode-widget-border) 70%, #4caf50 30%); + flex-direction: column; + align-items: stretch; + gap: 4px; + padding: 8px 10px; + background: color-mix(in srgb, var(--vscode-input-background) 92%, var(--vscode-editor-background) 8%); + border: 1px solid color-mix(in srgb, var(--vscode-widget-border) 84%, transparent); border-radius: var(--chat-radius-sm) var(--chat-radius-sm) 0 0; - flex-wrap: wrap; animation: slideUp 0.3s ease; } + .bubble-strip-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 8px; + } + @keyframes slideUp { from { opacity: 0; @@ -1642,37 +1718,63 @@ font-weight: 600; color: var(--vscode-descriptionForeground); text-transform: uppercase; - letter-spacing: 0.3px; + letter-spacing: 0.4px; white-space: nowrap; } + .bubble-strip-close-btn { + background: transparent; + border: none; + color: var(--vscode-descriptionForeground); + cursor: pointer; + padding: 4px; + border-radius: 4px; + display: flex; + align-items: center; + justify-content: center; + flex: none; + transition: background-color var(--transition-fast), color var(--transition-fast); + } + + .bubble-strip-close-btn:hover { + background: var(--vscode-toolbar-hoverBackground); + color: var(--vscode-foreground); + } + + .bubble-strip-close-btn:focus-visible { + outline: 1px solid var(--vscode-focusBorder); + outline-offset: 1px; + } + .bubble-strip-content { display: flex; - gap: 6px; - flex-wrap: wrap; - flex: 1; + flex-direction: column; + gap: 5px; + width: 100%; } .suggestion-bubble { - display: inline-flex; - padding: 4px 10px; - background: var(--vscode-badge-background); - border: 1px solid var(--vscode-widget-border); - border-radius: 12px; + display: flex; + width: 100%; + padding: 6px 10px; + background: color-mix(in srgb, var(--vscode-input-background) 94%, var(--vscode-editor-background) 6%); + border: 1px solid color-mix(in srgb, var(--vscode-widget-border) 78%, transparent); + border-radius: 9px; cursor: pointer; transition: all var(--transition-fast); font-size: 10px; - color: var(--vscode-badge-foreground); + color: var(--vscode-foreground); font-weight: 500; - white-space: nowrap; - text-overflow: ellipsis; - overflow: hidden; - max-width: 140px; + white-space: normal; + text-align: left; + line-height: 1.25; + min-height: 24px; + word-break: break-word; } .suggestion-bubble:hover { - background: var(--vscode-button-secondaryBackground); - border-color: var(--vscode-focusBorder); + background: color-mix(in srgb, var(--vscode-input-background) 88%, var(--vscode-editor-background) 12%); + border-color: color-mix(in srgb, var(--vscode-widget-border) 55%, var(--vscode-focusBorder) 45%); transform: translateY(-1px); } diff --git a/templates/connection-form/index.html b/templates/connection-form/index.html index 2b77514..f112cf3 100644 --- a/templates/connection-form/index.html +++ b/templates/connection-form/index.html @@ -252,9 +252,9 @@

{{HEADER_TITLE}}

- +
@@ -456,7 +521,7 @@ export class ConnectionManagementPanel { function addConnection() { vscode.postMessage({ command: 'addConnection' }); } - + function editConnection(id) { vscode.postMessage({ command: 'edit', id: id }); } @@ -467,27 +532,22 @@ export class ConnectionManagementPanel { function testConnection(id) { const btn = document.querySelector(\`[data-test-id="\${id}"]\`); - const originalText = btn.innerHTML; - btn.textContent = 'Testing...'; + btn.textContent = 'Testing…'; btn.disabled = true; - vscode.postMessage({ command: 'test', id: id }); - - // Store original text - btn.setAttribute('data-original-text', originalText); } - + function showDeleteConfirm(id) { const card = document.querySelector(\`[data-card-id="\${id}"]\`); if (card.querySelector('.delete-confirm-overlay')) return; - + const overlay = document.createElement('div'); overlay.className = 'delete-confirm-overlay'; overlay.innerHTML = \`

Delete this connection?

- - + +
\`; card.appendChild(overlay); @@ -499,50 +559,37 @@ export class ConnectionManagementPanel { window.addEventListener('message', event => { const message = event.data; - + if (message.type === 'testSuccess') { const btn = document.querySelector(\`[data-test-id="\${message.id}"]\`); const card = document.querySelector(\`[data-card-id="\${message.id}"]\`); - - btn.innerHTML = 'Scan ✓'; + btn.textContent = 'Test'; btn.disabled = false; - - showNotification(card, 'Connection successful!', 'success'); - - setTimeout(() => { - const original = btn.getAttribute('data-original-text'); - if(original) btn.innerHTML = original; - }, 3000); + showToast(card, '✓ Connected', 'success'); } else if (message.type === 'testError') { - const btn = document.querySelector(\`[data-test-id="\${message.id}"]\`); + const btn = document.querySelector(\`[data-test-id="\${message.id}"]\`); const card = document.querySelector(\`[data-card-id="\${message.id}"]\`); - - btn.innerHTML = 'Error ✕'; + btn.textContent = 'Test'; btn.disabled = false; - - showNotification(card, message.error, 'error'); - setTimeout(() => { - const original = btn.getAttribute('data-original-text'); - if(original) btn.innerHTML = original; - }, 3000); + showToast(card, '✕ ' + (message.error || 'Failed'), 'error'); } }); - - function showNotification(card, text, type) { - const existing = card.querySelector('.test-result-overlay'); - if(existing) existing.remove(); - + + function showToast(card, text, type) { + const existing = card.querySelector('.test-toast'); + if (existing) existing.remove(); + const el = document.createElement('div'); - el.className = \`test-result-overlay \${type}\`; + el.className = 'test-toast ' + type; el.textContent = text; card.appendChild(el); - el.style.display = 'block'; - + setTimeout(() => { + el.style.transition = 'opacity 0.3s'; el.style.opacity = '0'; setTimeout(() => el.remove(), 300); - }, 4000); + }, 3500); } @@ -550,52 +597,50 @@ export class ConnectionManagementPanel { } private _getConnectionCardHtml(conn: ConnectionInfo & { hasPassword: boolean }): string { - const connectionString = this._buildConnectionString(conn); - const authStatus = conn.hasPassword || conn.username - ? 'Auth ✓' - : 'No Auth'; - - // Escaping helper const escape = (s: string | undefined) => this._escapeHtml(s || ''); + // Derive env class from connection name (case-insensitive keywords) + const nameLower = (conn.name || '').toLowerCase(); + let envClass = ''; + if (/prod|production/.test(nameLower)) { envClass = 'env-prod'; } + else if (/stag|staging|uat/.test(nameLower)) { envClass = 'env-staging'; } + else if (/dev|local|test/.test(nameLower)) { envClass = 'env-dev'; } + + // Single status pill — always "Live" since the connection is configured + const pillClass = conn.hasPassword || conn.username ? 'live' : 'offline'; + const pillLabel = pillClass === 'live' ? 'Live' : 'Offline'; + return ` -
+
- 🗄️ + 🗄️ ${escape(conn.name)}
-
- Live - ${authStatus} -
+ + ${pillLabel} +
- Host: + Host ${escape(conn.host)}:${conn.port}
- Database: + Database ${escape(conn.database)}
- User: + User ${escape(conn.username)}
- - - + + +
`; } diff --git a/src/providers/ChatViewProvider.ts b/src/providers/ChatViewProvider.ts index 2172577..92a327f 100644 --- a/src/providers/ChatViewProvider.ts +++ b/src/providers/ChatViewProvider.ts @@ -415,6 +415,7 @@ export class ChatViewProvider implements vscode.WebviewViewProvider { this._aiService.setMessages(this._messages); let responseText: string; let usageInfo: string | undefined; + const aiStartTime = Date.now(); if (provider === 'vscode-lm') { console.log('[ChatView] Calling VS Code LM API...'); @@ -428,6 +429,13 @@ export class ChatViewProvider implements vscode.WebviewViewProvider { usageInfo = result.usage; } + const aiElapsed = ((Date.now() - aiStartTime) / 1000).toFixed(1); + if (usageInfo) { + usageInfo = `${usageInfo} · ${aiElapsed}s`; + } else { + usageInfo = `${aiElapsed}s`; + } + console.log('[ChatView] AI response received, length:', responseText.length); // Sanitize response - remove any HTML-like patterns that shouldn't be there diff --git a/src/providers/DatabaseTreeProvider.ts b/src/providers/DatabaseTreeProvider.ts index 148eb9d..4b5ff1b 100644 --- a/src/providers/DatabaseTreeProvider.ts +++ b/src/providers/DatabaseTreeProvider.ts @@ -18,7 +18,6 @@ export class DatabaseTreeProvider implements vscode.TreeDataProvider; // Filter, Favorites, and Recent Items - private _filterPattern: string = ''; private _favorites: Set = new Set(); private _recentItems: string[] = []; private static readonly MAX_RECENT_ITEMS = 10; @@ -104,21 +103,6 @@ export class DatabaseTreeProvider implements vscode.TreeDataProvider 0) { - filteredSchemas.push(new DatabaseTreeItem( - row.schema_name, - vscode.TreeItemCollapsibleState.Collapsed, - 'schema', - element.connectionId, - element.databaseName, - row.schema_name, - undefined, // tableName - undefined, // columnName - undefined, // comment - undefined, // isInstalled - undefined, // installedVersion - undefined, // roleAttributes - undefined, // isDisconnected - undefined, // isFavorite - undefined, // count - undefined, // rowCount - row.size // size - )); - } - } - return filteredSchemas; - } - return schemaResult.rows.map(row => new DatabaseTreeItem( row.schema_name, vscode.TreeItemCollapsibleState.Collapsed, @@ -813,7 +748,6 @@ i.relname as index_name, [element.schema] ); return tableResult.rows - .filter(row => this.matchesFilter(row.table_name)) .map(row => { const isFav = this.isFavoriteItem('table', element.connectionId, element.databaseName, element.schema, row.table_name); return new DatabaseTreeItem( @@ -843,7 +777,6 @@ i.relname as index_name, [element.schema] ); return viewResult.rows - .filter(row => this.matchesFilter(row.table_name)) .map(row => { const isFav = this.isFavoriteItem('view', element.connectionId, element.databaseName, element.schema, row.table_name); return new DatabaseTreeItem( @@ -864,7 +797,6 @@ i.relname as index_name, [element.schema] ); return functionResult.rows - .filter(row => this.matchesFilter(row.routine_name)) .map(row => { const isFav = this.isFavoriteItem('function', element.connectionId, element.databaseName, element.schema, row.routine_name); return new DatabaseTreeItem( @@ -894,7 +826,6 @@ i.relname as index_name, [element.schema] ); return materializedViewResult.rows - .filter(row => this.matchesFilter(row.name)) .map(row => { const isFav = this.isFavoriteItem('materialized-view', element.connectionId, element.databaseName, element.schema, row.name); return new DatabaseTreeItem( @@ -967,35 +898,24 @@ i.relname as index_name, return []; case 'schema': - // Query counts for each category (with filter applied if active) - const filterPattern = this._filterPattern ? `% ${this._filterPattern.toLowerCase()}% ` : null; - const tablesCountResult = await client.query( - filterPattern - ? "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = $1 AND table_type = 'BASE TABLE' AND LOWER(table_name) LIKE $2" - : "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = $1 AND table_type = 'BASE TABLE'", - filterPattern ? [element.schema, filterPattern] : [element.schema] + "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = $1 AND table_type = 'BASE TABLE'", + [element.schema] ); const viewsCountResult = await client.query( - filterPattern - ? "SELECT COUNT(*) FROM information_schema.views WHERE table_schema = $1 AND LOWER(table_name) LIKE $2" - : "SELECT COUNT(*) FROM information_schema.views WHERE table_schema = $1", - filterPattern ? [element.schema, filterPattern] : [element.schema] + "SELECT COUNT(*) FROM information_schema.views WHERE table_schema = $1", + [element.schema] ); const functionsCountResult = await client.query( - filterPattern - ? "SELECT COUNT(*) FROM information_schema.routines WHERE routine_schema = $1 AND routine_type = 'FUNCTION' AND LOWER(routine_name) LIKE $2" - : "SELECT COUNT(*) FROM information_schema.routines WHERE routine_schema = $1 AND routine_type = 'FUNCTION'", - filterPattern ? [element.schema, filterPattern] : [element.schema] + "SELECT COUNT(*) FROM information_schema.routines WHERE routine_schema = $1 AND routine_type = 'FUNCTION'", + [element.schema] ); const materializedViewsCountResult = await client.query( - filterPattern - ? "SELECT COUNT(*) FROM pg_matviews WHERE schemaname = $1 AND LOWER(matviewname) LIKE $2" - : "SELECT COUNT(*) FROM pg_matviews WHERE schemaname = $1", - filterPattern ? [element.schema, filterPattern] : [element.schema] + "SELECT COUNT(*) FROM pg_matviews WHERE schemaname = $1", + [element.schema] ); const typesCountResult = await client.query( diff --git a/src/providers/chat/AiService.ts b/src/providers/chat/AiService.ts index 63017a5..8ee543c 100644 --- a/src/providers/chat/AiService.ts +++ b/src/providers/chat/AiService.ts @@ -518,7 +518,7 @@ The UI will automatically parse this and show clickable suggestion bubbles.`; const apiKey = await this._getDirectApiKey(config); // API key is required for most providers, but optional for custom endpoints - if (!apiKey && provider !== 'custom') { + if (!apiKey && provider !== 'custom' && provider !== 'ollama' && provider !== 'lmstudio') { throw new Error(`API Key is required for ${provider} provider. Please configure postgresExplorer.aiApiKey.`); } @@ -608,6 +608,30 @@ The UI will automatically parse this and show clickable suggestion bubbles.`; model: model, messages: messages }; + } else if (provider === 'ollama') { + endpoint = config.get('aiEndpoint') || 'http://localhost:11434/v1/chat/completions'; + model = model || ''; + + const messages: any[] = []; + if (systemPrompt) { + messages.push({ role: 'system', content: systemPrompt }); + } + messages.push(...conversationHistory); + messages.push({ role: 'user', content: userMessage }); + + body = { model, messages }; + } else if (provider === 'lmstudio') { + endpoint = config.get('aiEndpoint') || 'http://localhost:1234/v1/chat/completions'; + model = model || ''; + + const messages: any[] = []; + if (systemPrompt) { + messages.push({ role: 'system', content: systemPrompt }); + } + messages.push(...conversationHistory); + messages.push({ role: 'user', content: userMessage }); + + body = { model, messages }; } else { throw new Error(`Unsupported provider: ${provider}`); } @@ -753,6 +777,8 @@ The UI will automatically parse this and show clickable suggestion bubbles.`; case 'anthropic': return 'claude-3-5-sonnet-20241022'; case 'gemini': return 'gemini-1.5-flash'; case 'custom': return 'custom-model'; + case 'ollama': return 'ollama'; + case 'lmstudio': return 'lm-studio'; default: return 'Unknown'; } } diff --git a/templates/ai-settings/index.html b/templates/ai-settings/index.html index 5232de7..2cbc859 100644 --- a/templates/ai-settings/index.html +++ b/templates/ai-settings/index.html @@ -18,33 +18,21 @@

AI Configuration

-
-
🤖
AI Provider Configuration
-
- 💡 -
- About AI Features - The AI assistant helps you write SQL queries, understand database concepts, and optimize your PostgreSQL workflows. -
-
-
- +
@@ -60,7 +48,7 @@

AI Configuration

-
-
+
+
@@ -118,12 +110,12 @@

🐘

SQL SNIPPETS
- - - - - - + + + + + +
@@ -138,20 +130,6 @@

🐘

- -
-