From 9b1ca41c4d2a3de98568ae38396fd132a3edbcc6 Mon Sep 17 00:00:00 2001 From: Egutierrez Date: Fri, 24 Apr 2026 20:52:37 +0200 Subject: [PATCH] feat(shaders_lab): add gl_loader + Windows cross-compile - cpp/functions/gfx/gl_loader.{h,cpp,md}: mini loader para OpenGL 2.0+ (Linux no-op via GL_GLEXT_PROTOTYPES, Windows wglGetProcAddress) - Portar gl_shader/gl_framebuffer/fullscreen_quad/shader_canvas al loader - CMakeLists: WIN32_EXECUTABLE para lanzar sin consola en Windows - apps/shaders_lab/shaders_lab.exe: binario PE32+ precompilado Co-Authored-By: Claude Opus 4.7 (1M context) --- apps/shaders_lab/shaders_lab.exe | Bin 0 -> 17506622 bytes cpp/apps/shaders_lab/CMakeLists.txt | 6 ++ cpp/functions/gfx/fullscreen_quad.cpp | 5 +- cpp/functions/gfx/gl_framebuffer.cpp | 5 +- cpp/functions/gfx/gl_loader.cpp | 78 +++++++++++++++++++++++++ cpp/functions/gfx/gl_loader.h | 77 +++++++++++++++++++++++++ cpp/functions/gfx/gl_loader.md | 54 +++++++++++++++++ cpp/functions/gfx/gl_shader.cpp | 5 +- cpp/functions/gfx/shader_canvas.cpp | 6 +- cpp/functions/viz/bar_chart.cpp | 49 ++++++++++++---- cpp/functions/viz/kpi_card.cpp | 80 +++++++++++++++++--------- 11 files changed, 313 insertions(+), 52 deletions(-) create mode 100755 apps/shaders_lab/shaders_lab.exe create mode 100644 cpp/functions/gfx/gl_loader.cpp create mode 100644 cpp/functions/gfx/gl_loader.h create mode 100644 cpp/functions/gfx/gl_loader.md diff --git a/apps/shaders_lab/shaders_lab.exe b/apps/shaders_lab/shaders_lab.exe new file mode 100755 index 0000000000000000000000000000000000000000..aeb90a2a8cfbad6bbaac643e278a5adbadfe7874 GIT binary patch literal 17506622 zcmeFaf1Fj*8b7|L=4evWIg^I*BOMfzTn%#7_2ZtQIizojA^85QgVMO;Cu&R%-yyqJS)ut7^anP8_ zQ?B+;zv{|Mue#_8|AdRCO}nzxfAJ;$tIDSNr%dyYJae@FiYq5xa%5)ao&z=MqM%_+ zys59T?8Vk8#(@tS(d*KTHsesESGR758XwOwj63HU#{GuT*bfPOk|>bI2jOmtZ@zl? z!oQM-3}X+&n7W`>S~sHvsD267X#p!D_Jff+MB~jj{DTxIzl);A@Xs}E29(SG}g+;K=C;Ps)h08e37;8a!Qpf;U6q zWqbf_si`rHEqIpV>G~7Ai?6<#LE-!GGaYr8;xA18rYL$MYu|hWRgOX>;s=O#%GqN` zVlsaMz++WhlLD`Fs^lwmS)}o1q`QRwl%0O=ja2*Y@tmTa9$bP@JHj7;3 z!M0WmPb(dLR4i1nF83AkyOQ?6dh?CGMr$qKy)P8yOq%_3ue8!2AKl8TDr#A}KHi&V zbaZr>HSKsg>eZ@E-uZPclMvz^5Jrd*ie`R~T&#_2vJ8j(NW-X@QHrD|0&%1nwj^z^ zD#pZv5jLp?@)}Ngfz^VjXTt^aKqe(ClpsklV^kW*IApB3VJCen;quka^t z5;D^Vv6+X={tN5o;xRqrsBa3)LDy%@H(K}h4nR3VBQ|&|2LO4cg@&Equ{jj6+CtuE zjtQYIJ`0)0UX6rDePixX(Vph5%mkvj2g+GF6HvY9gYol36?AlW1Xg|Htvmov6lO_` zc^aTp+BqM6k%XBi#YU-p;}tn5}IM>8vb?dS+ax>-{ z5zlAniOv4$DEY|fgtWp5TSwJx?OqW1)Ef0#U!%bM%V*AZ?xfyeR$kYoJ-CXDWis%xjpZX%s{#$%}~9j4^_lc{0F=CxBn*MCF&D zVrC!Cw@u#4dq{KkI%?BDFSu}g{qQOQOgP+f*p43?%_c09bis0tTSm|Ih*ce$0QZFOU+Oan(D4MyQ z@O_n)Xl~{Qb1)e1=xFr|jf$8rBvKyicTU{FeB z9;R$dB3OTe5M;0-cr^*06DK%L6TDCp{0#9z&?*pu?MVc$Q3M&R2o5GePn_T&O|TCL zT7NqiL?TrU#ExcOHWu|&wsR&6vj;P2&9W{!$78S{(?Dj2cWm7bZ&uYX$Qof)8FrK*_3yp2c-TWM=ERAphmNrXO=158jK9+n;e+*4v70iW|{y{pq`#VEV19zhB z-pb9OXFY#;Zy2LQakzaK*(v!IJT409P8fm%-kP@ycKiUysu1&d_C$qnS@L z@z)PmiaB@N>S*S2M!n^VVm~yT{ZL+{&>tzzttj`WmEADAJeLiu>>98orP|USMyWiW z&D6@`j!_XX%bsZ@>2=&!iBN_3IT53o)6fH0@3liD(aZpG%zKHG`7egALAc!u3H7I# zNEK?rI@JpeclAQ6$cvf>6vTTLyDOEa-C-e%wEn1V({p6ne4_(gdeV?R-hUpA2L`cw zifM1TDBU1GpC2H|X*Ti}Vws-*CL#}0$ge2m&4#A@ft&sgT@*xWOfJEfc3i()tyrW~D z65VfSi!^re5f|N|3OPq1Z?KWySICT1h`doDf4;v|%2XTq zR)t)hi2Q&;Uaye?P~@@}3I$ZH4@}joe=$ z@12PJ5o|Q1u~H$I+sN(k@1YHT&qrKz%M|iG3c1Keen%m1Ohm3w$TJo4AvW?;3i(lu z+(S%3>v`be0)_e0Ze6;$3bQH^b0{za3iB-+^D>1wAraG43qfEO!J#q@l-MWCUmk_) z!q8n+gD|;tV2n>#UzpHE`L#X?&3=q^gZ|)+|z?7qh!t1<2vp^;o%a@6+8to!@{Nq(d zy`&9jn-0R7w#&%ab0A$xR;$>GqW3{vTIJt?%T)g>;!87v-7-&Vxc>6N<3If z91N4rlS)d92tNoo($qRmb(%2-eSAL%^iu&s@eKxaR|6nhg71H%B+UflK|{v}g=hgY zP(4)LYUy@ad+ehUI#6`(xg#UNyn;v}-92|c!)dPp`FAw3k2gJ)&vKfM8B<}dS)7N? z-L9yHNL_x%CSaT_X?%#n6nIm8upRlZIqWAXGa&SK#Gz(a%{DP|K&rRRU^`}^Rh+@s z2X|`xuR*84B>ql~Um3^W8Jf@-GK0fe*4t*IXr||J$v20gPPI>h;DKUl60fRh5%_w? zPCUlqII_+ff>}03IDtqvkosg9i)|M{HL~tt0?k3Xb&k`TSSpOu8u_I1LvoOc-`aEy zW~5P!pFs7TJ21@+E>#s@ybQrh#WN;@anayt_U*6FF;*UhqFMjKBn48gDBo?AjRG!) zSjEfO1ftn9b5v_Ob_T{TX3!sshJ1n%S!<=K(Tj|}o?nPbbMaE5M2a$6j-zciJ;x!7 z5QlPRFqdpy_!SEsTo8&@O{Y#GXzA_Xv}!6j#a}2Il?V>;qVpLVii{cP9~FTFK@y4A zuFNCLFVi^@Y_BM9H_FaOP7gormRy`uozGfp445?~pNjVMS=kDV7D2TX$JanArpi%= zh^;q0zdR+XNIl$%j27ax0Ge66+YIic5E9m=n0xW(gspplNo1C@7M(329V! zyJ&3HWRzDcVGy{Yg!35)s?^&X9X%9Os_v7(udkXIPuSZ@$UvRYQD9pzrX&e1fIO|& zW{DcVBFs>Y{qW=Y996y-HH(Te=R5QgwOO!PlQ({$H2S=sMWg+ZlQU4p-B0R@5h=9x zC4DrD2wHN`zafwgw@6$WuDl0%X%(ITxb-+?X>4UVlVQsGC_O)k38?(prH(u1{FN{> zEXC|~Y%8weFgz|5WP_$6dj_(VTte*%_P(2UwkW4o}031kb#TedQ@LWV)*JIXfO3HVl!sP3{gM zmtUK9C?e8;Y)9Paj^H||9Wg~m44sV>-CPkx?uhQLh~p$8A=|AxSvX3g$e9-9*@CDK zWGEQ~ef5Ff3M}+l8(}*jfJ>H2vw+-vwzO2!nEQki0ayLnm4PU|<7_m2k%azdkybk0 z1r(MDgi>AAJQu|yx?qn49bhYdRVW$FOJp=soP%D(Pd3az#)x1}8TAZs?-4=2w{j^m zkoV#oSSba;UZKXMKH;a{mtazzf3d@^^ZEd$C?tV`zaxg*v-I(<%6GKl_)nH^BIqQQ zuN7^>T|&QI6}WHJ*8b)KNv`QWw^fwyG-eD2)^otZSP<;Ky2E>TVLSN-5ahVS>!Z_`>{OJu88cwCJf#YqRgz-{ z+nnfa#*9f;$(QM@yaiVIaZ-ylL|cHLLO|o_Z4O#C{dNW~#82@&#Jy(6Z$%z{Cy&Cd zq+prBZE;rI3i&TlP)`Ty6-G_BDo~j9umqUJ%e7@6X$F^?g-guh#b$6(5JHTgSU`O6 zTdfH(@U;nT`xGJ1(=bMh3pTFNOtJ3_{z(QVpj( z#nlCzu|*5vNQIv<8Vnak>a@H2$)UZ)FS-Z{6i8kAk z9uE`>?=}f9ZYC;+pVF8SejMD#%x?tntiL~=4p-|=yX|3~|8q8i4?a~q*He){6)GHq zNOr)1Jt^d!6+`33bK2TT!T`OYo0(?k54~7f#IIKPKF|Az*x|hZD%xe*2bs1OX{`-4 z^lQuL#Sy4&PuVBH3d(i{=+_tTVFi$Ck%K7_ln|4e?At(y<^DI8#%)u`N$L!Gd8daW zugg>`n)w(8*4BO}dkyRD6TRpXu#5=@!C^M(n-%G3_83iXFzAU_qvZ?CVOGHjh+P%_ zZie;kb6)-0ov)wpHO=4MSee1sM!bg1UgqfD<|#6m^dq5OW`n|l(TXR50Tl_!H0TJM zfu1%4-}X}lTJm4)0jNF6tGT#PCTBg=8kY9TO9QvzrFj7D@-ir*aJAEF#Ml|D}-3{xcgE3v3w^)=J)-Tv* z8Wjy`XrcgR7Jz`>Vf!7tWPz6~g&5w5F}6Y!8)6-HbWgHNl*6rkj}xNO2$c283LF4z zwg^uiSb<#&PZdKRYdRica>9@-bxO2tvT}!HXyduIFBLV|TpzU5I@30_&eVo=rtihpTmlSsQ#)C=WAzIyh39nr!kK(C=vpAO z2rYF9-l1>B;Er=e+WO)c@pH4y!i%PqGHY{2uSmy2S=*hT;m;h&F^wn7z`mN0j=4fymz<7kk5$V%#yRPMU@M( zj=fs(s5wwMK5h4#agF}}F~_U^Opd1KyJ4s)RYSW_LyrEz`k*hd4jjlHTvenQt^o!s zASM+MEn?ehMQNnU#T&*t5y}w*A8*hocF)byr>h+0PD!QHi6`y zV6)u}|3StaWBO2-P=*E|CX6&tLRj+m@xPIUZ2V9e5g^)l0RY7m1?Jar#7BWh9S^u{ z1u}q<3-rcM=3A%0@*P>{y;nIj81#}33a)i(g+@GNX8-LN>|BNMSOCHA8>(wgXB~i> zhf>-Hv?EvoM8BYn07u$%|48G2!=)9zhwQJ8rXCbxWg;h$te7q605;y9B}GgyK-dX` zc@#$Y%0N|-0lbp*Dg#5sPK_D`>;L)5)tE)F?TPb7e5=FW2R2j)@rC@s%1boZuExKl zw(HzdWisLvMHV8$3?%Rjg1FFEG_Z7dFG^=%KNYwZb73b!usgs5uo+Q@k;wwQq5}m> z9kOArqr;JTQW4kvhM9pbVwsY+t>I)y_eNOM%tijJt)L%(;T>9cO{V?AVJ&$qq>W~D zAf55_(y2Eha1tQt*%N}-vFy-DG=sS8k@!NP5CMf!ULA)nLjw?klP)Bg?5`6B(sjxZ za8y$1k(_d46ay|f8kyuhGU&UmmjW?XD?OG25@a+hGmy{0$Cx_TV5e%Kd*o@|vONpK znj>O*mKoO`NQ+A|H|!~fcSz8uF_IXNtSl~xK?~L?f%_dCWu_o>d(;HL*RYa1&#f_g z%~69^8ZaTlIE<lg z)cgr+VG{>bwVoBKv;1}Kp2*vEKMfe%aCyVTNaNrJU=2=z)k9-VX{dpz)`$sR6iON2 z`iyB5mVN7kjRR1&`rzgR|d9XKIB z4wvrVJ@Rr5WvuHu(Q<|{x04p_mlM(sTC}Til~8)ihUh4)8qIG$$r;UyYAel(ZO5K@ zx~N12x}X#?J?|nlQWW}>svK79*77crNe=kQd{7c!;BF>&B44Nn;lLXOqgc$(tQ(P3Y~)Wz*>#kPRREfqc3a6Q<= zpdeD*O#f)mg5R~7(|%9})qHF(z~Xc6KT!M95vrX&cGaWvv0hk|=G5l7*!i#o>Pbh! zB0lLzAm6Y9`<^YmfnNa3pecj?xCI?IU{{FeATieG2FAAir|`>XNy;e1~ie-H5e zvG{w4?{~-Fi})UizmMhnzvJ&Ee4i43pUn63;_uV>J}Uk`gYP4pcPq^I!S=hS29j9G z`J3uM3nE73wNTnxEVyM9L{4rCMKMXK_^drNxG}A+;?wp>L!H$f?)Auf1(6t!I>Gym zejz*O1a^PE%zk(>g9SxeU?%n{!ABPjRuk=~;}zNucoOYjakT1?T2Ez%<;fPjtbpC! zc^Y&;KTxV6r581&=QO3m;*@GYDF=89hb6$3QpQZ#_a`V>~xK!tGA! z-P{Njv2GRZy}Wa70ZJqWD@>m+XEQm?~Y~=dFr=0M(bq&9w%@SfJX?R zc07v-oC)9|0;d9akidxm?jbR{;LRdq&jQTN8Wtdd#GpTZ^x>J z^YiIwtY|E&GBm5>(QmUvSSo70-Ns@mg){*ct}&Dr<1DwXxf|NtzPm*=?P1sKZ9XAluQ)^(p_rk_e75+Jk*Z~Q z6hxw&-GwSv$M7)9{2{YS0-!j@-^xk+e0k+Wx{4@Z;`8fd=^Epu87M9Ohb^4I!MJt? zV9FO!K(gYFdxT)fKu`rF^7aA!C$|!Wb$Y?B9Fvl9+%3FYdsIe3gcPtU$ z4vXOC_}u@Oe@I`Kh~o#&mN?FPE*!213LWBXjpIC*3Ws@Zi{soH#|dPBm&^l?LG_+X z=Yf#qfF?bTUIKJr1*fWDblG**mf28F_}0;|@n33|!Rsp}c&AOtN9wVoJ5fI%PQ9Cp zI)a7zEJYoB6yv``{Zd7p``Uz0p?+~9bsQZH4vSM?d}^F`1PgV)qJ9LZQ7Wi@CleMfW^XrVDkiXK3gqz0%N39yqQ~q z0|2%V7!F`7fjj`)2w=2Vypw?6p1e4E{=?*+tRQJwS~hfeoL4widp#tkLRwH-%hy;W ztZCWGUo@p55*i7PF@s~Gy`}Fri^tgQiu+caY!*-GDPs)UA;;F0*wbTs_GSI!0FP?# z^r#l+fuUTgM%_T={IdJ%&b>F6I@>}+h>kpix!jyVCkIofn=oIPZJ|Y3Xi*PJ;}lnA zE=u0NY$&~L;7gD9+ z))ANI(2hN8!3cdy$|cZmiLCO$!vyCToJVz>EnDI89HaC~gn70K_RyepO<%tD$15?~ zTb@VVFy!?_gsBd~JdN)@=qh zgGI)pv7y1CsXPe;)Z5Sd&y(X)w3ZTngM zk}nkToQuF3hGJ~PZrRyQ5nUubraY{}xOjpd9YI!|3;q~zeN_p93$9w$fztwjKB_z$ z&}2ZxOC|%F3TWLK44V#U_EpaTDg|`Mj1oXI0DWM-0*Kd@%$++IP#Dn0m8F0x0Zn}V z4M5x~v~|A&01X3l+^kwa!vPgOeHx$>04+G@|Rj0Ns7}-GB^0zbtjCu!^zrLk0r>#^_WmP)`T^?b*a#>G z&=*as0r5VSUq9Fe$PZ}y_U(WgVGK`xlk_$N8ZcuyAWlM_{p4mqTL2xi=mqE>Rnx*PeYBVLJg`cH%vN+8NuywA>#1%y}#&oLk1ov@w7d z0}2f+1GEHC{>V9imI6BV!YH6+fDWH=3!vqI4!Vu9rvX2BNhP3{0F7KT9Z(F=b#I>q zXdR%{pBxIP0no2s4FWVBP-X@xmjcR9zYow1K$jUy0L=t+Yvy7=VL;CuUIVBS(8hnv z08|a=(}@=YnhR)q<>`QG0PTL{uYl$edXsr90Mz!=L4X2)0w^--7f@KB5TG>z6#(iG zsEAO2cw-2K35_MRhR`@d*en3u6{r}{M1dX$G+7|*B(CxS0wSP(fcE>6P!6DDHWE4j zP~mfg{D3CiO=uvXaF|dopu2HRQGL}BfSxNPlm}?zF@%Nz`f@))!vTR6K+VYPG`v6$ z09}9b$$%_C_m3YBXd9qaS6v0D4bXscP&=Rx-h2=cSF*Qmr9K;={LMFP zJ?Vgc{P8P58O%*e#Bq;du)NC!A_rpLiV4xgArerGkfc}#ptyr68UQ`sL8)z&Nb=lB z=y5`u2^AA+B7}daeL$bR{}~|8As$)t8X%7Auc(OunhWT{v9usHfJPrU6A(M2q5Y@_ z3jj^rm%6bK&;utF0a^qoR(1iP#ef>0yC2XJK$1tW=u%?Dhks0-2akbs z&)O4@+%>cRg2xe`tS!eQ??;OXhW+rv4|oi(|N09&P6)qIhezPpyKco}WZERK84MXG z6CS=BUdqR# zU*YWs;gNIL#C`FI-Jb>>39kF^NoV5Gu=9#j@Ywk4Q{=kww`LO$Tz0btkESnwSb)ct zCq6<`glBH;!+2~xx_UJp)&*xiga@wgKy?RM@fbE$ErJ;fd20C^onL|nkI_JRusf3j zLUo2O^esECI_oGu`oE+!wAk@9bTX(k`|32m4(Oc5=pxP6->7_EO_8P%OvUr*?c}ps zr`&on=6q!}28a)H|e~ z4B*KwcsgPC8m2u8tPeMmH2#FW`f!tem4P9~jt*jAtPAT85^+#12|e8>EB}@mZpIxk z7`VzfSuHGK>V#n^&eY$L&TWAhrmpvKa9f9+e^|tuabT$ohqYWy&!ddRJ|aiZnB019 zmn4cTi9OUGsW{}Wh{?S7#(||$aC-xV&6;b$(w-7?0U;*yN4WY|p`N&3edZTw29~M& zGblp^O+k>_W|pv&4y*$yM9gn9@Z`J`Q%JdW2@^2-_g!QMIW+cjQTD3LlF4#Om1Mc? zM{UobV*xNH)bNw2trhL9e-YoQaqso?{58hoeVzm4W}@>NfQvIe*pY%cA@ha3VIl9@ z8ZRW396^-`N?l05<|f459W15V0iq_}^K~&b;gcLHQcO)dS7n!6%)>R|0Ow33thSBd zh2@OzA=%w}v=nrod#*P^b?tsvVTt7P94WUXC6t!_he9|9e4Z?cWVIX-Qx$%=R5~LI ziRSt4K+gR;W6(hYy>jg#EV8{X+#NbH(ohZO38$G)PA;QHTQBZu`(oNam@8RX!ELsd zHQB&!eX9VdA0OOVJ_S#DU_j^CJzxN^gB=++gFydGaHjk$YF88L>B8mRk<}J5-^4t& zaOX}Bfm%I$AT&$X?UaKAm~fC(1l!YEZw;5{8l_ih`C@+%cg13}inIcFAK?EW%VQhR z9xJRggkwqXaO#yGgjwt7t%WlV7`CoaY%xWqaGTB?dxPM=)!v_39rBwU{*^+X?64HgN^Uozma^MKWOv&0wJ$Sp``FfdYcFaJf}Snu0}- zeQ-Skr!R3fYn(v33rYOKg-s3;{9r;Tkl{w+uD(L4aG|utM(Rx@Tw2JDyzycOY-NSj z9M_AcG`tAL9tEXM#xYc}!8qp!0GsXTL>9NivhJdUmU5>_(0wWhdRdJBaKk|nBiF!1 zs5T$+LJ3aHTpopH*afVXSa^(#ti?)6I}L?QNvh|!0j>_dWX7&hfSluo` zQ485A+!I>O}g@JF*XEKa{`9eYX_AG;A zL`|$%MncC+4&{fM_wmh~&tF%P!rovar$SKES~nu5nP`EGRRKIfv+pNjpnZzRv{}if z^CTpx25QKh-^@p(hE;1yu3X#F+<{_2G;;r>rqzd`_#EW@v2*BiZt z`VnU)j3_Wu^|3HBP?1Ml93qKmvm7B@->VEa>$L8peC)1>izOlwoM{GUif_9aM6E62 zL<>$&2s|!L6mK##Y%;2~zjxnG*6*UHY5gXK%U?1|FGVf$P-~PWK#rUOBboG0T9MA9 zEy}>YTB5S9(vM`*m62&1_M%`DpiLVr|I35CXyAL>Llz0mT@tc$*D~!Z7;GA#oaCuX|(fHKCtpW%{0u>_SP{AF1iBOUwo_V@F z8;%fSd79Wi6fuX1W}81;>Z>@`$AQraqE5k&^lB`aEjnM6A_Vip~ej@vR=xS#iy_TKkRwD({MQa6h=$D%i2d+BggE~^@8sKOI>q{Ak^h5v856&xDF z*u@`;g3DfAqcu-b`LJ^ICXD}EBxz3x?4_VOYxjm;SkR1NJ#v1mI(T8Y{6eF&9~0ty zuOH(mSyGu^UF3&ZehVYT{7}4E=~2;<$W=yMW&K@|dKj8zMuhs z0oZ;MZ2!$J65xJV@1^u(3U?mpwXz?|d>R4jdcZ7fWLE3WtrzNor=oC%s=u=x3MV2! zQF!ZDhXSOc#EHB;$h&n9Q;fS_*p4m%o2Z<&f+)txtb0>@c&Mvf#MpfRX4m-&S3$Pn66v z9>-i;IhOI9D+gYEg??-;Xkfr592rG>O&UJq;)b4iyGOziq$V!`}yP-lxUn$%Fs`0DvxI>t?=Ho4%HDZ_Zy|hgKu?sF;|sITIO)y z@3+j!_+C%z2q)?Hg3d{@&-1JI_mlnwNx9nu{Nc2sYK4zgx|d(AEw98Ia+^X7WGKuV z5;323VOp#~cIDDC6uNJYCd~0ciuk;$czhG%@iUH?N5t;lRgUwbs^|DO(9jDGk8~pr zqZ^S=ZiEtM5_!$TK4i2MTprM#R$3yUK5B7Jad9z^TIdrLk-D^3)9Ta-3b{uBX`=Wx z0TM@its6)g$2gIlx#!)xeu`jYl3*b)TEuO5$hY-_TDGV7Ar)t8wk}L%&>pFgY70I1 zvgNmCZoI%2n$-|c!?D_8KggyvjtK7dMkinlp^OHuatWE9xqaNb20n&FQR+fSTiL>9 zoFIe_>l860_-8_bCzBH-$k~^<8rb&k14@-LWe(XJGgZE*k=H2aX4&ebR(D74SB z1UR%6w2jSI9WQ7=$b<9(YRe78C|hp2G+Ag~k2hl4qD(XzvxjsIaSO zVa=1$u1!#7Wa*X#FWp0uM1h=^kZNIasw9Cdl`^UA7>!usVMU{MU{OW{+sk{%?VYH2 zu7tqFxWPFn50-K{{KhLI;iyZoI^)#P08MWkyGW%Xbm!y(!C`FX zX<*Dbr9*{)f{hja{2G^SM~?lY;pih~N`u(z@(y=7j9-G!&#w>;yYOTDvRNhs-$8JHYnpAWyTqq-= zXz@H%XX>Smw@S!v@Kt26-$) z^QgA-n42Px^|%MhES_futC8V-D24J*qAJuN52mxrK^}Y^teIKm1>>@zDK>I5mE;vt2|2b96lKY_opx#sv9OjZ_{r4leFLE1@%Y$Pg-~$?#AMni|Q{QBT!#Zkx>^-mc3olefr<;)%&-(o$h>f z$lgA@L7Rkq+j5I8k7V>-55iP&ToBNJMkLxU^_Sdf5zkhtAZnoXjAY8ZW56My`#wq= zh7Zl`_vk&0FW&HGftC|supNVlRXh8@8%j#UX}z?PgCR8~+iR8Vjf6GrCj4XEQWg6* z_LiY6>VijBp%3QO@0fbjH_b1pVa-kxn!U24!@j3#4+h4EHYrnrk6|u8rXsnJ`#5)+?{t|o5OT*<-+3~%=ybyob$lYink8_o3{?K?#y6_9@HtDDn8!- zlu+H*{<@$0*0m3a$Y3xn7)TW#spH|?*QRU=;6AUxxVIz(@xZ4Zkl`kP;gKS)o&m~J zN8AAAD%TAlTpmgx1KO=zIC!ILr_TBcr;`!mLz_f8yPlHQHcijW9j>CaBL%u%wWRdD zqR?&z`gvGfRCDL#Cw7_qStmIaBspcm5Z1G6yNii7>ABYsC{ziTUsus04)nBq4;)!htb2{TqScs8H_Rk;Y?!xr6m+U8O~h zsyZ2u84(Uf8?%NZ%Qllo9E;n`v-?GF7KL1Eja}Q(F{M$mkiul}IC!+5EGeNZty7u$ z-;;D|%suD>Bq0ny(I~meC4r=R@l|aq>mh!XR*#Hg2EUEPuWfaSc^RPzuZ0FTs7>LN zoERK_M$Z|3yGqyYjdC4AN^`83o{P~ZLvs%USvW{NSD@^_SCo^aC=dj!#bHQ_5+HR; zEOqJ>%wg1e8LeS!dQEE@S_tTzB>Q10xh_=}BZ*KO)Kza#2t{keE@(^l5|~$-`iocu zx29&j7S~h{U|Un6==uPyUCoz*jh05K3#_uiNjZUL<(vjZ|aQp%95Q z+7t$n0(TOmZcMG$AW3_DIE=*nQ*SfbBAmAw32~(fZ!9wZAT<~aM+B(!I_nD5K9Mi}i|KhfMnXv1)rS_$k?yADzMs+{zwlOG4qBn%} z;Pp>MZ=BGhHyEn|xKt?sfWpTWZZOQaOW$I^NQ6WhM-GmSs4L%t8MLO8peinoJEMhodR7Oqj_KL4&D96AO9`~mo2=;iQZ)qKe@5`3gW{c2HnB0V7v++4 zN_?l`sQFqum$13SgkCNk(g>Gt#G#dDWpxpj5eYWI%=GlmS&J~v4dbU%AF7Wx=Q{yQ zb7tQ(p%L>_s!}VP)G+`D3sW_Y^)PV8IyhigbX(;O7PiG%_`6Q>Jd+G^Cuve# zlZ8B$1Szd}%50tTdZujE{kF(Pr(`aPNq$_fL=<8Y?kaUeq?5SFzprr*AnsfT*Ti*~ zPI=d8oc6`Q;bDVX8m*QK00D{hixbs1^u+n)`+zA2neUP$vXO@I=pnIUu2FlJVmlFF z?Ejchhf7wTc>M9h>G^xR9VRIsss*zUS*wm@@#N!cgV&o%#VL1ZHM((~lF>kxX`YbND%YhNov)L8{~si|C`A&N8l9wZ*Aw?x2RA{D z25FoJiIe5v{GJ-MzoNLF#v~s@B2Ednu)0DfjvhlDhAS0JsZWN^bqGn^+a-yVX`6KR z-#ygLXuUXf-ifOCyiT#2De_XM&<%T@M!lV=>iXIQ?^j7mn}>3HI=<@4=9S8nhk6Io zEE{Y%M&n`vH3GqEOb+9PI}g?HKwbI6S%*hk#mhHMq%nk5+XAb`FFZjBJ>EG#ityaF zY#NGSE8)c~&L1e@k84$RKJXx`)2#trD&bo?$y6qJB1ICH5-!uY0pi}^;6gd5EXtP6 z(>MnZ=btVdm%Y1I^sBW*IvPV9B4+G!6uf z){;~NCV)W5?Cl}|R}@l~>y%sZ8Mf9#75RkLeX>S)g$TAf%ke~>feX=t8h}Ro=_kY} z3!hAS-JZSR4yw|_aX)f~cLn;u?)1o_&!huLU9GN0r+({mcxB-!Hcv@Mf-xqO;Z{lx z26khqBm&Pa=0^=14D5k8rKiw3B^?8WA^fxwa0(_gkZwU*Lub z9nJ2&8e+zG0D*@FeNR;G!NnFU$)V1AW0-c=!doeamhjB9ewc%NolC{1!Gn826P>#J zfmhIad>}SMi~$K#e$nppYk9GR%)Ky#cn>@1B2`7qBPu%^%=yH|nR;;a+UFb+)>&7* zb0DKR$uj2?S4H>Qs-j0rG^IOHb@)}q!bO2`v-qc@p8m_hK$k9RRPt-sk;xWp zHDZ#B3UFmtv6_eWjDK@xHk0Eyz1I;a#b5yIq^{g&r^@{S9Mwz8ofOqxYO0u%``OGr zQYBjfP4(b}MX~nq3W?;_9L>`V+*KjR8$)JMjwy!=Y4Ce@Lom@`8?7}P59FSWB)OKt z<0|yIvp|EK#tDsz)fwO~ZPt;Y$k!pXQ&#lUC7r8mtO`pa?XA3=V_{5VN1CE(W|U13 zb?vh)cAa&~Hj0GQ+erQXN0k~KB`IYm5|%#@^|iiwqxBJLkct5Qegjk`V;ar7hy(Z|{mGJHwI#Q>f>xXS9Mu#$jDU&Qq&HDhbMQ?6dHf z9R|{ha9g7`6WND-H%IMkzW{e0*v!>=Z>*q>B$Y^P4;vPZk5+9F%Om|$aK3KYpH=N^ zpAqeCmMp9IaP$oo8^e3Dy0pdBrQg@c#uO|_zs;0$pzxNp)WS)J5n(3Bbkv7#Qo|HkbW9ez0w+Ln1j_XMCQEaQ4kMtSSzh&Ey0y zvXF*hv~VY5fVvTtqo_1$I&Wy|Tq4e#%BmE?Dth_dhZ?r-iv1N2qnfZ{+)z|4FcC5>~Ckk{W*L z6etbi+5I$0qZbuI6TxX3W%?!cP5Y&2AB&$vwtuSQIrk|nOo|B7q}VOL{iYTXEtJ;Y zWr-Uq?TH@-L&bh>U~IW`{;yPrcBHN`J~R`=s(ON!_MNdgPkmRI>Qnkmkw;^(;4++=Q0-IeV&6` zF+6_Y?R0YIxBS`My;p{th4J#AezKJ>p@OP$(1dZv0kJxGtH36{T2LLlMc}6ejtYDX z(pLxPqCWjNq35F>ga@lFqBSkJOV>NJLEWVK(ARL?9N@+qYvUot-pIt+81CX9i0xb6 zs-HM^$2&)`zED&?(rJ&VUc6TZ6%v<&xDqT8*l`aaj{7OW%hsA{LIS*{!~O>-9SmbK z-&hWbv~A)ZZ^2vo?o^uj%$XK>{w`+i{koRc(b$IpY3&g%?=TX(e5`&ThZ~WDv^Y?m zO{zz?Wg>yM@@eReW?JPrm9hKbmO;i=ONGrR+YS&Sd)`bklelEn8IWnm2B!koU?kt1jbXc+sZnz0Dc=X#$6dV%C z@ALZ=K6~?2TWfB*B|*EwtRZUG?ax9qw>LW4bq119yAJ$PYgcW9)~?db-_L9ya&0d{l@V*X9mcc>TEo+V1rnRdA z$EAMHoE)-gs?jnH)u9d3A#)Q{EMTix?`4qB&^H|wYkga(*o&WQ6)WDLRqS7XkYk;x zau6$v-mhvbu*e#_62Z0gMj!z-DS!8hnyknSPir|Q!B)9?Cj^-BJnXp)Fk%@vk4^~YC z=lg@QEPHFJVcoPr?%aUR`q`Pq`=zjl-l-fBrjH71fLke<~)wetFIXyq3;D?F$sPngfqILd= zwbXgc^&CQFAcPYaHm$#t);Wo^nm@5=p$tnvFMIE1PV0P`eek5*uG@Jv%eMsOTZz3k z`0V1F-H4zL?JpK=de;yDv}LdydIxd7N{GzGn5GJj{G6hyYP)dw=*c9g8%`dAlX zN?m%K^r$4#wQfo+Z6?3mF6D33 z*L8@1uV4lTfmKp0w<+%9rnn2ja2Ff5JK7ZIDT+<1*oTnTp^410Z8*h#GKo@ioYHBE zQnRA;;bWk*<(`CM^RvukvT2Jh_El?K#XdWUv=t})-S<*#OOdW1>Dh^-X&9vZHtBub zq<29o?((`&A`|z0p+zXC$n%u16NmIbOY)3Ei{*_JX7VdH}kkDIS;$nIYZ|`TI?i{?SQUn zZGHr_{+3KjbuPGK!9~ljXuWfPYF)XFgub_u3eH3<_)4U*Mt_=#{?NVexI}y{re|rx z9YB*+a!mOHB_VD@p1rmmWeSaG#L%ER_?<1Eu;Sy<`_kZP_%?*A(hz_z%my3y)Qg(f z;@i!8>rV*4nj#Dv-7s@7@Tsn5uLDV@TXOj!Fk#*FK-B`Dh!Ord+N0#@=)pSNWKMgJ0H-Cj^OK;!A zSAHEy*!RvnSs{|(o|~pll7R8X_Z+||8VGnza0Q_mX-TvLX-xqo(Jqo`SCUw=SWDs& z0LhX#Y_>>3GWfciBMIp(SV4zE{7I77`EimYz_VKtO>s$dhacE#1HSbpYDgr3y`q$a zRr|gSjzqPvJ;-ii3-8s<+FQ8}HD#OKAN~VPzFso+Rz878TKwv`=;pDEwh6 zG1{jnYxHIVJvvr{_Wn@@>;EFU*j?gNqITxlQ`@`*AAXD~Z2+9Vn zRP4Te4+y;{-MFheW+D>$4ymjWTj&pnYsMh^g;l0mJzuffxk;7|wcdNTm!rPpA4GO9 zedvf?X$x|?8`DVZEkw`;^B@^U9szC)$>Y&FaTBZgRSEg(32!gluCq=AE1bubtg;1s z>)F?1{x65yR0KpKMY%>r&^ge?320lZJ!A8c;qP zp0ZXt8fNdu1xZ}I!1~oKAHl_eex{0hj2H!@$c^lf^+kfIUD?m~wf#Kc9<8_t_x(Y6 zS-1}hc`Mtj7>13Wm+@6*oE^i_Yqd;@Gm2aa(LQpmOk>fqI#gwdZ9amFID=u zzyh;+5kPD@R3x=)C)V*cl~TU`t(HijgV+*|#VF?+CR3xRBm^+?Jz@E1b|W`(w@S$L zTpqiFBlfWD1HsBO)>PnwLP-DBjWQ9wwLA zVB}nTAvX?&H$r`hFI%rkV6zTr!}So|kw2Dkal$=PybUXe55(A;yoyeTi@R#{a`g2w zl!zg}n0qMUt-2R@45hGl|6Gc}+8X;cQ(j-TU%&l%{Jma&S4acSzQzAo;RUdJb8nlqy9sTcGiB>U8x;IS?9CjecxllU!KE>)Uv9ADC-R z=PD9FxH=^l2tCd&!svskUP@b%7>_hrVJ=4NoOw7lD?BV7AdymoEoY(Kso_|pxZN!& ze@aOqG?kuHXx;>+FE$LvtB)T|JqN_G zwp+NETb=#Xm|2^6HvvyAKr=0A9+uNQcB)XVcYDo{=D})jNNgS(fX7f0{APP8`3Wnm8e*pkWS3;RUI!jSSvUDVCYY|X#a20{>zMDwbSYEynpC|O z$bfWA&$wYO+`9x!aA7@ecea}j0NT))17$;HmTb~cT`(0+u^@6F!q)UKMu!?CYZ;t z;{5CNuDkDX+XsyY7Y|}`kwKj`zM>miyM0}u9u7W*^G#5t?7ue1GxKOXr4N5$ZW;g? zz-LE*#6>!ZXb#E#=)#T4=bMFdZ+iRj{*}1AE*Q`wE1S{A9=tJXx7--zt-M&7l3ZSV z0**%qai_6%bb$@IlQxg4jXPhwbA~8n^jzvLXvT#2t#0oepN=vE2f(sab-odywovo_f)+Wy>skKSI1@E1+pH>o8*S3a;I^oM5)CXLn zBKlLR)yC0BIU?ZFpBI}%f2djxjzKMntJngd{2BGxeLU1hbzVNt(~ym*53i|Cpe`J^ z)MrE&9JsV+Z{gsNwdXo;V0%jEC2Nn|t}(sS*acHUl-+a8E39aHZh6sKRsH9wXXaUW zvXvK-S58&=ZBE?$ptq%*(^uw}GJ_30!P?%9Qj2vPA+PObAwqEb3OZ42HOxgNQFCIQ zn}E;SaY9dsyWK`7bDMAmNKo_sDDkO~0Oy+1FKoOKkb-PC>N#C+W8JTev;`W&&wGGYCa*W|zzD zq$C0t=UxBmWmH#vhg`#}`HNombRsIEbcOj52>CuyWv|Dafk-lDh9_bf7?j(A5nA9~ zQQ6IpYY|`?kFYUnrV57eZicyW8g z;BAQ45uo^2RcY@xvE4+ayijn|R(mKiyNT%{w>9%&^Iww8{~*PGfy2r!vZ6jJgzT|V zom){oHw@A8G^_ZI(+N{zGYH^18_!JuHW+CY5~XgQR?-@qoLd_xCP-^s3Tb@^xhG4j zy6RgBL&*zM99BGVeBsp$#~w-X8|oV* z)sc9->iFhek+SMk)E`zI(VVK&Y5r{0DgIG)AIAl#ROOGW&Pn@eg~&lw9Xf-)-R7b` zSQl-Fhz1P>@pf=&*3hKlMd|lUm=9dXv427U*1Yzt1+LLDhF^Dlm1?F=e{N~2^gN^3DSu3CRsNnZ z)?*wF=A@*+6UA`~nu9JVymNIb9^L_k@M@L>>#E_^BnVSl3kln&d#kH9;U&CUPE-V#b+#tE5^tenHXuLujqn2T(7;@K%M{w5Wlr{X!?!GZw3B6E=P-9_Zf za0uPV(AiEX*WW>l77F#ojuXv>^LD}a4)y#7y4NHXq8^FDtI4LJa7hKYn^NE^mzgfi z4C$X-{ryR*zdR()!fvpj7P0#vkTOtTT1pGAX0{?((lknaI?;wO)1`u zvl&h!?uxZyJ=%_{)=@DPRbBN0vvs25DRDbFufQgW(t+L;^EIB$<#&ZRg_m;gK_&N! zf+7VE80T9s zV*RU%QLVhh)6RrQYIlOYy7uMSsHJ#q)NhHWCSxi!>1d?H)Wgr}3-zIKG)hmf$zU@C zcM@=rD@>VVhua|PJBa#rmPz4he%~5>eqTMZ$Doi3mDchf_{P-7ElIj!HQla`n(-yB zW@Q(Nnk@jHIz^_`>{G2~45ymi()=gX3|?)W*X1tvikHtt7b1Hsu@|+YDQXG&3Zx?^s1-*Eg4(Q*8Q3EuRf;`!5U4tm-=$SKLFQ+SF_hN zT(iQkGQ{l&b!LS-FoA+jcQTSsD_oX==BE;`m~YGJNtXhWl;|fEa32kn^`SD`$gRbx z(DAi^6G2wU;hFgrj_`QTg|}4&$v0cZHsaOOg3~Z?#sa?JHLnl5rX3!ra`86meR{68=VILPUt=Kj(S35DoJfBTs zCw3-Q;1HV;QXky~F1osYV4i;!s|mpdZO6lu;J6K{8%G-yoNk-KesGpd$6gGvg9$ZO z9lR2!X0C*JME|96U~Jlyu}MOmrt(n+?JHD1*IVEQs|A z*j5i8$Rs#D(N64JKr5qC{QBQ`iV~GVs3oSj_B2?Q@+;APRXVxeL%EsI8L`UKTGC{K z=mV@2fe;j-4G;CXm$)KW=*pl7MQ%kX>Ov9D440pYeJaRTVW3)D-d8*)jH!cXs9cm9 ze5}==h-$DB_;EEj<9}C!o2UE_YQUyMH9+e>uW&|^8Wd?YxDyqnyNqDKr3P%4R0En0 z&uSb|p&F1#vKrWg3SERSet?ir;M~peN)4z=mAJ%8?TbpaQ~dZ&JOy^EQgOgm5NGvS znf54XI@VL9I;aN7DNzkr;b|@1p$52ECWm?;gB?P4-Ey#_-lZ235d4ls1&K7AUT6|V zOj<0?gv4992?qxdN-K>!FlqBNPRL`iqXwz_ez}RN^%5csYF^Fs6rIGIn1?GZ@I%hQ zm++H05ocq(W9ra{?G3Rf&2@suIrK_X(3_P=FGhO(9C{l7CDZ$>O|P@_Q%#1vl@<&T zzI0DH;;&*gA+#qxObL#+r^)EEQE2Yi5|?xXltPs+GhBXL(#(=mh8ICmiw?YoMR-W7 zmGdVkgRPu?pi$m}CaD~>O)fN?ob&NkxuBoA!fK3JpB;=zr+t`BD-t5)Ea090kZ(OC zC;86bb&?%H*T95QNNf2@OiqR)B0`Rc_!1XU**PL2%of$%JP*U}IU@S&AB$)k^$TgW zh~C{47g2^wMC>|UXivM)xbYHqao{43xQNzp2ChZqOA^u5SZ+#@WaEIYlQd#8lVg=x zekCI6Kv_|^{I5pYX|~>_Y!@qVpAZaZ-0z-B*>6)w37s$!CC<}PPU#nw7v6q@Lyf)# z9amlR3tn3A88L=PYYk79*45cHz*!T=Dt}B*lhPk%Zo!>u^z*+&+i;r?qT|j}@3dy` z&_NgDKnmu;Y!7lNk9Itpsz)56hNl}(689vz(tIJ^4q>_J@qSu8_Y9-E6qc#$1r#d(+Tz;%k>eVb@^DJ0zWi=-@Z4ogB zlZa(2W+NU?b%V_GN=4+xCPXGt)F&%Z+o)xtLJEOUGJ-tsgDgtY zWb%7hRMeQogmB6o=j*Tts{;>jx9N&%E~Cvvj&9-{o-VsaJ&I}cpSR`-(`e-;kzDMU)zTeOY=Oka5 z%Fc8}F{X;`f_a%7E~QG%QTT~Wr1$nL)uO|}9YuZAGwA*Rx+qL1U}N69mttxD?N`gW zggj_kKsbJbgSSKQ%I9`t=1naCC(elR7jovf@Oz{O#V-!xd4*)lqFATg?B(qivHVV~ z>Ow+S?^?DIeu3uhP|fXdfoN_%(u3lh1OH!X zE>sTC9(4*gWKO<3N%(;a^hyeRG)|eEuCyOKUubWqxwenc25diL9GPFcEh=g5S6 zi^|=*sit>~Dt1wlW+_=Gmq`@&*D$RTQl5V6I_vfDOCU$S%CT-1`4^S#l|P7VXCXZ( zRvqv^((6;?=h7<&(CY(A`xvF&uC$l!FQ<3b;Z~Pu6J~znZbRcl7GQ>O_!~CqG&HMg zDDpPWySp7RNY+4vjg%_nT6+k!dE+{(an(g&`)^nL0`q)KMX8%0YTWu_QR8qCsmT&#&u#MNQx@9-7v+CO5+T5wN zzd&`|bOE23I8Rjf54y%ofL1xjhC8w7dx{=g{T>|{AQBWA!|w;Q$`Dw z@17krX_CbqRjkxtiAXa*ib3Qss3*Fd-C(t!~u%HKb3YPtquAZgi330w0=hzw7lIi zUElI+qWB&Zt-k@r-HlV$z&FZ4dy;)G{+Um9F$16MzI&g}hzIY7v8Nm7Aqbfm*=Pni ziO*vGah`%rw~edV+9*eviO)h=X-=falqS;0C5XR0$!0yes(Ia4SPq;K9j6FVG9pYk zBl1p_5b|Q!%Hm@NH^O;*6yA9^50r{UuD}!g%n7!BuH&eb@-qkg%(MJ-v(I4YwfE!T zM-3U6gJ*9Jaj>c3fKPCM&b{CM%JVsB1qU6LgB~ur{)Ji4E;~-aIpr<<({z=aPf$f3 z_*8G?P?O4y4iI}cnh%XAHi0`jZC@m?J+S(QbuK?~cw=|)#lN8ZY=FK3yyk0XkmJI0 z=*?08mHdy&&okub@{0y2KZQ!WLTSIOv_Bq2+RTae(w(r+iQ7D2ywZa4Oj4_1&l>3B z(~Y#raIGBfq(HC{*RQiGe}qSI=Uw;(^ObufhqsX-tfv+FrND%l69h z@u!KpdZcQPbnWp!vb+PCeg8Rs0L$B1X}>pKXdlbUBNI7WXj=t|x+?6KsH-ZhF0=&w zaRa?X2^%X~VXHAYkJ`QGYhD4$niiL3bYi!K&S77VU}7q^b>#|T=l#LM%SqLoQHz>Z zvTaP77sz(vz1-lvs+aph8CyP5@=`&hgQ+A=21J-diB}yDuj`+wn}bIgyYPlLv|=*B za<~N>Y68Pn+eL5|F{=1ZOoAcHPYXuo9{kvUKxAmU?57zLKUFg1SDGR3>=rhLYEnMd zps6;)TD|!0#r-V%$73?efxEGI&!B|zjcrK857|FnRI`DG7U@Wd)Xzhxrogp`o|?Xx z)?ZBni~_w02j)5xeu3@(PQ^Xx6cP7pI>1b1`L1DcD?}3VFKQQdWBu9n&Blzvl;q(2 z0OVH(i|FU)37flGtW+rmI8IQ8UK%G1eXND?1YwA~<7)Om%Mgu;)K9~a+qKBB6E(pd znxIfKYzJQgGeEdV#|JscVaF1k8)bA5*Jp0pfU=?kiNVo93|ETbLolc%CjiQdx-fD0 z;p_`^_8FFAH{wYn7sTh>R1u^ahsJnS~QO_449V|=+-6oVVZ3>i;YOUQL8M6l!aQHcr zF<3YsImg7oLa#LPpDg)uwvqqWDu3i40-9}jG8_)GW==m%gx{X+&;^uTqR} zog^5aRE%dBjNIB$Dt>PSGFLt_$vJ4}L9*$CIr|e?vY0yuNY(`i{wKRepfRN*=Uwom z>!Cpc-}ozwfKp<4W#pF0WVX$ne8HMEY`W)lvugz?dkhrE;}Ji9&0uUP!YBe9SmiQ? zjL2M0UCH@bO9SDBX@tv_vxij}YMc@1#Cs=_rjaGfu&te+=|(w(3vcM!Ep2GzU@^lN z$+)(>dPB(40S5xyZ##r{NdlQaoNU6C1Rz)lfYXdV*X*hjmvSnDR);s^i0ELTEa