zTbT>^+3DtrOM^7H8HXY#mrTvo>KZU>(dh z3u^;QFxw(*Ggv3Hn6NEiUCa`~Vqn{tbqh;?bu;S|)(zIfEG4WDte4r4uoT#KX2ZgU z!1|c&5jG5#WVTn>9 z-U7=pdso;6ut{d`340eT&+L6+?|~JVeJJdGuqkFA3;Pi4F=iKqeGFD)c1hSpuoAOR zgk1tFGy7E7Ctww3ytL7=VAK4msR@7h6TxCW&Yu H)I2wM#H1hb{W zmViCUY?-j7U 7o`Ic1_pVWER{myk4d$)Ti4jy2>54Sj5Y{V6J=bzjNX!O>sBv#E6akm2 zC3|V|T^qz-O^!R{rw)13A-{6SB2|2IY0bk9dCVc-b%^TW_R@M(-?Nt{*XlnE^~c*B zvc(}g9O64 As;y8*ABVfj3f16I`U43bUDOx$RUSV3mj;E+e!29 z4zc4f$YpzUK!!q{RhRi$hn#lE+Yb2;hpbdDLgvz%?{kRn5Owy&UOLw)hy0U6K6S`# z>Xpk}T2HS-CLQv;Lrys4pB-`&&ehmU-|KFN^gCqIA>Vh%pE~5{4*9i1RxGlmvHdXS zkWq&`?~s=ra^4|L>h;uI`q^)G$R>xR9rC0@jydG79rA%gR;pLyNO|se$S#L`$00v< z$lp2SBZpjdjlH+6`M5(Ka>%qp{=^~gIHYND^}Sjgl61(JLw?|ppE=|mhg_|;5zM9A zz11Nphg2N$yhHxXA#Xe6Hx9Y|I$IiB^D&2H9CFMdKXXWv+6Xb18Ql))b;$P}@|O;| z;E+oWxp|4bw|%Zn4jFgIiw-&KkdGX4yV}YzmwwU_hrH;Je{je}hcv4VA<_Idci`=G z{#2K$gYfYz?3&J>>cW=*^QXG_Y@_;CVC(#;F7=I)stSGjOOCIow=jDSClnuiWgYs) zo4*aSG2FYfGX0g5J;Y_c#0kFCG+(0W6KeCPy7)NR{HZQ=ifR5-*Ziq2d)igmrukD{ z$(i|6U3|=Q{#4iesjf!ndFM}c@fo%GQ(e*HTXHfeiq+&Yf2yk(<3)Rob8}|RUL!`; z-2AC7_XyYjt5aQ7$GS#FvXfII|JS=FMr-5{U9GceCSBNvBK#7Hw?%fcu!V&4mmEx2 z-PdsKYcu<6lu17OIa75+(;htJv#F6AU54L|$yZ}6H5_Foo7$=1!;Zl&R>Y6YB%AAb zNRu3u4KIVw;#y-Apfrt+?VD7n bokC-F zYaI_$qoI-Ohb^({V6z_H50wa8Q|y}?eelaVq#V)~oT0V8rJ=}hI|p{^v$%j*rRZPU z^hK)?J*BSeSU77Pe_E5Ij!%z?t>-IcqA$yLqdHG&cIOb2MUAlF^nFz=1WxL*=nFZH z1TE0WE7KNDo#~(bFuqOgm({`S2Htt>4-urU bl23{0435N4*UNk0YbX&w!R1}6PO5C1J!idv^(WtGF z-Dijzh`Jt%CNG9y19uqZoM{r)cMdZNW_M{b34ePB7^A4Mx3Ec6*Rk5f*Ykxo^<6JI zsF>NmwlsHAz1UiDWdW=+zKyQyl5Z1W0U7!ZBQzZ~@SQPv*%`2*Yotkt{vd0|U>O;> zKEY#4`>UDsRZcjj)~aYwS&_xe f6>=)Z*G78wdsy;*A%i zWL9gdkQt6@_ze5IMsXu2T9c%nSE7jyJ9b*19{UpuHRFQn--<32EcE2}E{tNdeW+^f zcWG6xF?xwxH7wX|M`u7isc+wmN^P2=zqnze&^!&x67iBmrwg>s`6m%Vw^F6kWv{uu zje5{>H&z`Wih~ji`pQ{#P9CVH40HQY0x7V%xv92jN;R^3SoD+-S$Sc+&@|)zYq} zPkoR?50yrq^(Jj!15b04 @FxkJ@hZ8xbZ|q)1ghYtq(1F~yBdZ*VknVm3FxtXjwARVNs!y>+5yZT7d5 zF3%zMGB=tV|8hy__OtrsnzWI+sP;rul~K*AYUA>q_05f~-4A=X2V+{@Ipl4x%~=qQ z3XWJL;{$C}E6W;E8=9PF`Bj#n{u->q!prc>+{3ix;};O;H>ON1`fy}vAF;M``(+1v zp9besf}73q))88EZmsuYLq?f4#B=%80FwdDs9Lt6H@Zn`{D);t!@k9l4l%3qyV0a4 z9(&* Z-`UsaM$ ^qv;=tAh@6jQWQp!{vs%h zrti(p?9S}&+}%)D;P& 5EyaI3y%YN$10H1js;ByB6zAyvuMZE4ynD>=`0QlNLfUjfPH_8Ct#I$dH58#&% z1N>?p;McI+Z~Pv>Z~g?}x5fcp{uID(zXtF-SpIi+0Dk}50Iy=%KUf3!Hm3g}miePS zfIq?XKRp8Q`Z~a$;rSas1^9EU|1Yr(-@*I+)n$M;vHW-O{BMf@fB$8Gf5h|eVcWlt z=|8}B{?i$NAN@MOkJ|wMG6V3|Hvs tQ&s<*1<`z4t))*!#@P;J?mh-_Z6_--v;ZJB3MVU%(3r*b=&=5-LV7Koml=Z zJiogF*1cHfzC2hDybRX(0kDoQf;IUPSkwOu)+1-Y`WT)+j^(qMKKBi<@;?OY)U9AG zVLhkc0BZ%$i+H~JDp=?6v0cFPr@jN$#fxA)`x;o6-v(>rTVOeFfwhHge7*@* $|L$X8?O_`~c@(TqW7!um@AG)ym$2NI76H~z0zCa!BRq`o;Njt!ug=bn zpK&&8bN0s7&3dg>Ezj2~wR$%DWNsl_oXd}Ap9Ws!l)degns(FiGS~f#3$=QsEGHKB za?RTI5>LZgE=-=O)vmU73bis`?NwRWn{%7n_Ktete66n3U)Y kg7|vSM#G)T)BaqFuMQy-d8im^-(4VI_a*QZ}2* zoiFU2cgs$V7r~#wWxP&tvr@C}RyVzBa&za$eX`{Wh|5@O$IQasDw2NUcs5(4`xots z)1-%RI@Fxd{lmBMo|oMIFcT&S2n*Gw+q{;|p2L>0OIT{$vu7Fn*$1Ty>q}>sR!*Lk zm^-23!K*cR{L;01-s4wNw2vRF4IaOINxtMgemSjJcN$K$=^(P@Wbu&Xv{=SXDm1W1 z7CcnU6cynEW$6eU1_aCs)fc*UMtY)n@q&+r;El|+%5JS-SM5z|{!=*y16?+8cfL|< zI9Xzk&xmC?9UJT5%j~`7%e<-HixH|eOOPOlv&Xs4Dq%0sQnk^vs~e6~pp=vH1xl62 ztl~GQ%xllt=blHL`vm4oB7t2dXgNu2%{z@|y>`uSg!dX|v%Cp;r)h6&Ap=A!NSd+6 z<=uw;T*X-} 0=<0{G#tS3NEf!DN9rHU{w#4)*|^#y9I zUs9?C@g`@UY*i|yjk@Dh3$ V``*X>kCqKJy5VvEpy?h5J0yk0vC4ieehe$QKcqQ zv6B^dXRUTBzf@|~uh_^kgq2&z2bHheFECUvc1Z$)RYkaw(x|3WPIInx<%&};xt|E3 z^EA(&&tvr-+)6pbrATho>qWb{wN$-QQvkPEq?dv2McH$tzU(>*uUu}CIFEPCJ6G&h zrP*MYt=PNswJIW~QX%joT8cTWqA p@_<##u3v6fZ`~(w~cssv ZI9@1N~#G$%W-D!oON)JFyrdBUi zckPN>Mg>nQ6Dy0pL`-Q4g-TC*se#O{mQTn}e1R&XTX1O 9n3iee;eaZ+%!3vZD&U~xhKtqgf9i?KC;k(dkxEtYHsfl!}m0Huif+iH1 zPvO$BdHzM$kcGZVUS_Q0mJf06?2c1aLE*80rz={9$#5@4eg*N-pQ5U;)`qjN*R0zr z0)(_J+AU9`g+vcyLlMQaFk5`#BNCRES^ZdK_3V=LIN2{R^U0Rea+u^}+*V;ln&ZNx z%qFsH7nYZqsK6Jfj4c+HEXr1)PI->>#w??FVGyCW4n?3)PGOX?N)$_vC|Gqi-3Hk& zQRGt-8GpS;<(1w>2<0l3EQtpHq4ScI#^?` tT!x!UfE$d9R`-Mvz*cDhrnrkT0sbTS@n~Kg@=dz^KRq`(u z#K9gUyMRmrCUYZ38@-#vEGp(Uc94#_Io2q~Mq(DHw3)9JT1{sU84>BYaO(u?P}Gam zX3yf`O$ZDi_Sifji5HW8WK!2@G|(g@Os^NG@iUjlM(|d4Q55S1UXGq9>CQL~2Q)_| zq-VWgYdXk(|0Y7}BU8j_pa4ARigd4ci1qpj@z?O4DHgn7yQp@{B;Qb6q9Uu?)dqGM zC0WN|FP>^(%rPdA^!MKoUw%X-Huin%%sj;x8DET`@4;%JOpUqam5&jAnraGYu()e> z<0|zZv1<`n3PcDKA%Se=hFg$8!aL4zC9x9ZsRWbyCsWr?^$IeJfZu@I2P`AXVNocW zLl>N@nn^G5>^Vqy<)KunSXGRyTvT6D!Hrt=io4mWJCvQPqIDz#BsP)EL-tZD*Uq)v zN*SMv;1pdNPK&>id>@s-xS tar$}g1WSC@)wXIC%Ly(Tbc<=mMw(QM3cw|6e};A~O~ zsv@6^Y$cmJAMmYEvI3<=IVct*?kB&NKy^ne@w917y2c|RRT{{K=;gv9;BBMVS-LXf zPKs6#6hR u`D(ki|K_q^1avq0kRi9K7(t5hh(GKoGqw z{QM>QI=IF})mjIcR3LN*1~B1b6UB7SGM=w<#c&0p%MNJKIL>(WA~(>r_;PZ4Ulgg6 zcR6$;CWk$*23|nU7p1iCGawP_74s}brBu*ckif(Y5s@Q3XwR4DwNrS}I1>V^l3OvJ zi;!$@e!tGnHNTL?#U}E5b+n1{o!xD`lzhsl8p4gBN&v_I`x7gWYu+X?Ma1uaPS4C$>9*|<_n5= zvZ9l-FDTog%SR5#prEkWWBYyhVDK+^SGDdxUZ3ig@lmWM2e;pcD^T1>;}GQ8B&8)k zk|(f(`=06G9OO0h=pq!QJ2(nOk)GUzqHs@6Lta?+d-+0^Ym(T!fDtUaqXUuOL*qtN za}}M-G?$kW<4oii;``LerRbN^I~GNeuI@#tAnR`V;AFp;laUwMzpIf~z}RISM! ze?e{+t*5#y<;%J{E~UbH_oY;*n-eoAswmqCMO_`5K}94;JGwQ4qFq!a^E(EmySq50 zvXP-6*;eeq-5FHXQTfF uyRf|^tX zPj-Uk%!%xJ1p|sr-gY4Pgf=-8!5W_#&AjQMo?kN2SX{Nu91HX%h4g>0&j7T}uwu zxTeRsS>wuuJgan zcbj5_{U0qu|w{rSYKDU;GeMAONipbzE0>H_2jH!JZ z;H%GIZ16>l$$b{%WiJDaZ2&YKjN9D=c+&;A8DnJ^s{k+VU`%cuV}@G*ue^X|uK|1+ zV|!o!48VcU0nB^>ufvL8`4YfCd
Q6VJa3Q2bkL-{0f;KVsW4*7vpVV>^EUaOR%? ze*H%P?H}X){sm*0-vaoXe+9Vr-|!y)f#?5)_xLH&`9Ij^w*ij+4BKH@@GCc1@RJ)Y zm^^5~*A7|m!^0M=zsG`C-fKbo{T38&!7@iJ_}(!K?!V1~ojb7nop^qi1(mz8%)J)m z@3Y|L2P`-+Zo%Sl3tpPE;Gd^0IP(aee+ f4R;4KH+xMe}}c?;gGSa7&z!QRL5{tXKr z+r>8SS#b1|SoYJH_aff+^H}aByziGRxCyI105`%r;3hZ-?}S6}E;tN72k(aWz!7*a zybs tEDBK74!vpXj zJOtw~0mtD4Ou`gQ!^1EGkHDkwF?b9fhbLebvXFy0n1?(pz)3g-i?9UCa2n1)0aoBF z6yZr&g%Yg6IXDj&U>%- y2HarI#PzDFCz$R>g3(vz cmej{8hipi37>*b!)M^L@FIK;J`Z1jm*9(FL1x4U t-1tXZR>a*c-=~oed9}cqy8}5|$Z^#qm)Mp6Z9jlHZ)A1xA1v z8ez$3JF<~6`SS4dVO4Y(2$`ML4uP<&P<_ha$Ly?b*kd+$BS$g9EF>cs%oxQ8_Y&ni ziV+^g2#;cf<-RYC(6T_+QH-#dYNB)Wdx6CrUHqdMVT#-x#R!Y&_)&~73nA|2UZ+BF zj&(}!>QZNgx;fLSP%mzDD%ahC&Pv6*&MB+Ifbl3s7$@Ce&teoKJc<#Hc&$4)vek%Y z)nVPig{@u|=e$-+gnZN;-PWTRVG-jTGxsAJ#vAx0;_|$XEahO3%qT`U2=fibVaS0N z@|#E@kZSHIMmQSME5(S&d_xag)Dgyqw8;Gya)(Jd9Uevp*O;h4>mZW~gzliY$wV=o zvyA8O-(|)t5K+Jq`)FQGC^r~z#&=i^(dluby{HgJvYU<{jz|)C6eElQg%U>jBvH<= zQH*ea#!-y0I<=oe1bu!=?`jky++itzfM=de8^s9YJT~2;0i0PRrAINsI3lBS9dbU6 zVubkw%~6bSPm2|B*sMAfR6L3iu0 ^=iC{v4D7X6ZlVzT_*TQ zx6goRT^0kLDP>Efuy# 4K{GclVBXWZygAuoYel6p*J~XlF zK2<&9aN_vG5)Lhf!y>kbKL(3);)G~1J*UUS5B^QhDU{^@RQY-vrfXL(Ib_`SsS{G$ zy?3aBcL=q8N;HPrQWih>cNWG4#wJA;mD>_Oq;hhSO4kQ4OY=aCshT<=791zZaDY9L zcOXgc@@{WEhznmerKY?C&%ceIKjvvf{n(MQ%lyeH)W3mwe<7929*L*^ud&SE#g}7m z0A<~cpEjLHNA}3r>p%N2B@ohY#1FO3I}YL(NjL8hzj|1#24sqfx*II2l|N;6=G}#4 z105EO1@ADUpS`ij%ebq=lcX~Ko6oR7GUx{7stk+Rmt_)NeS<~35QkTWemx+P@H>NX z_JsYO7wFLm1amx1MDc`^Ed~xxw_=;x_>m7&JXs=&URrj65BwznMZ^Jd1StBDNW$+7 z&fo~4C`zebnV4f|T$Zq&EW!yp1BacX*rqmq 1UI0Gnz8 0 z@H>OE#3T%Lr@Eh*8u#W?j*SI2(SKuW2F)hA1>4ldk9?S7>Hx{1U^O$Yz6Re0BHG0f zAV}@~%wPfE28z(A2aIXYVDgdahz$Bqy!W8t aE`%^} za_1Pfsf{1`FqJz81!f` l!22ytN3=cr8kXEO=ZuaFov#sRf)lu zS;RMS1TyPsk%ZqFT%AR+k^ Ne;C*2`dD@lNyQ+sZ-t`Qv_ zeAmGo2boembc|(On)-EzJ?w;LZukq@Bmh5S3@_flKw@?5*XgM3BZj79Z1npFP*0vg z# JhZku>BwEa7DDe`av440;Q%u?|9$u7vR|g+0rZH*ZWzzeHl{AfA`~t^{ zCQ2&-Qf7=qDn9~WvVQD>aHFAC521b7zv=PO9Q801L~HR*)8NaT_&(E^fD?XaaPO92 z90IWup;8Z;kqzuIQp`4#fBmAsjIu|?;3LMo&xD9kXzV9m eUUED$ z@ncYTdancfpTYg16e$y>QxBVc=%)1eW x1IAo0r6*SURu3=1 zC|*`fMIC(I6fbA=vC?SG#L(GC+@vU0`ZmN(hZTT_upiZdT0Ml!b=5?4KJ)*gt{k-a zVKmdSjUV|i_4D2CVMxevjLc*qs5plKR|HQ0g4EfjA_|o)NW$5Iv;6T)%+=_y9CrW4 zp_CPNJRAAI0LBpBg?wpqE{QKw{M_N;CnVFA6~q&OBI1NN0)NhZA_>1UxO1w4qD~a| zRTdqO%rkr&TQX>}h$0Bu_>m7&ER7+Sbj!>Sz9keNL!lz;31p9uL^?|K;4!wLACAs* zzI_1Y5OJj~0|(Ddv2!O}$F7|TkWj=UaRd^IWRf^CxKFc>uIt&3p?`WXMe)iXgjvlF z7K1Oj4Et~zI{PTMQq+h0P=Fh>!5w?s!Hvt%3g>&9BtSBa2?2!Pfn>TzNzLIeuJ;6b z;;7X_$h;3X8TB_F8bICmQRGZp;uW2m>b|=WLu@;nkkrqT!Qky`gNRyBMEnNvLmUB` z{6%9iD+4r>N1&-Uy7j;^wyBOs$5=B1h%55Iwece#rnvgBz?F8Jq`}v1swYzT2UL{h zkx2@kwDk57M^n*x&PN6iN8`wwwhSUXH^tH20!Kx=;xwBMF3T^)Toq~Ed67dwW(m-F z#1(M_Qc7Lr`AICGpi0o#nR-3M%yr c|6Gx%RYn<*dqiM!*`xf{c(BkzUTywhmbYu9|G zQP}frF5LGZ8PY6XM}9=X*L;Al&h+*ZM-%DseSU;+)U-FYXb(oNCaE8o46EJH_o<~+ z4<2JXeKKmNA09y6cR#*YZRt&;Q&ZjdQN)hhu%D|qtA)I?>uxx#=f_4U3U<}r AD( zh@%wAsQY2I=N*IxA5n%fs%Ogkh^-X)&>xVnCCMj@yIfyLMh|aH(Qd*^b&rxt{XO2p z^YIiztsX+={)6eL5B=r=w4um0XiL1JQ&Su2L4l!@txBb|QFokbp| ~4d$6V)X zVlwcgj`j&HIH734(~^YhiS7}u82?P|tm80yvf}Qn)lTJ?O0D`88=X}+KI7J%jb^@X zzrccD$WfI5&1Z {K95RH zj0)r2s$|HbV~T|&?4~=FRA~-5;wOeqJ#5VTaVeV5Fzw-{Rj(KA=GId6N==I9Eaeu9 zWRBB|N7-|=R<&%`uVr!l|HWi@JPqeF5VrQmi@xG7YEKPoJk`Ste|hJM-KsPj40|i~ z?tHC^p)QpQ4Jc!HOObF`nBYed_b*9=-EJ69h1lB%ANq;A6zR(uhP%a-=*t*7`-z(r z%|m{K;l_`_BhBdBTe qswb3r6&sntWs+^>+L zalOYGhH%5rW@Bxu?liV)m2!5~u`5k?+d1z#H~>@16_VkfQazahP1 K`B0zFm%C>RiLA7wo+=XY)z5 zq2l{?4+xOqcLq)=i0VSK9!};mDn;{S<`|yN+jW=b@u6%Ir)%stO$EhqV{ci`!S@)% z#{{d<=qn1U1i76l*MrMgR;6fe@jT2fRoy1CR+=xeG^BHjwUqV|JCjjg_^{4Z$P;#U zTA?^#dfU|GWZ2^Ia!ET^K_$@-uv3$fay_)nb>4Jz-uf*AXqQi;^lsxvK1}WM1;W;@ zU2)5H(^ l{g4qI7UA}F^C*-M#D2@i-J774z(j(n^V42%Q z>5)y#h%5W5qs9|pU@vzyB>+u^vZ)ibdI*`@Mk$IZIE@&p?K&8s->B8&mmXVROvt>1 zc-f?lDd>&v5w4h}U}`s=L0q*O?nYSUsfo$3z)f-06W#s9)pT@D-q8WH$7c{pZHA`c zpDC^iFuPJ~x>wu{o0iE4!z(r~87L#}h$FDmY5y~EWZ)@0<#u{3rQEKJ%|kBq6LTpV zFJ9r8yM{i_`C1*rHgP?cW#-$&pfr1%xi%AEZ5fUiGZb~Cxu1AS(SAc`VfO5fLreTf zK`hLjF!=qy_<6QSCBzV}W4=&rx=maw!;j|> z3CqjL&~=73cz2rniKi6Fq%{vut7n%aFtJ}rL6WIV!na39Z9g%TqIG`G!R(VQr{%D9 zHJR^RjV_}Is0)*_GiIrr%`Pl2CuFS^HR?&s(bMi*ynkNw6Mrd+4L%REINhj>mbtVg zAK!d-@I49fF;VI&8iYXJ>(f%I2amZ;J{6f)^}pDHL5rum9oy8#k9?T=(J%Pek$q6O z3{*m*T8IbY2rTjsizNKc0Qt^U^u*ArhmW~Eo}zJ>b%vh`uC6I|JPXJFl8>CZrbGb> z08W6H+;AL*CVZN5p`VzWimu6WWB|wh`mq=7Q-rxqx6wq$C&~7xwZ-t}4bdRj244rN zvp p^C$7bm0R%kLgQjM1t#ZT!fGsa|}VFt&{mF}X@5OKWQQBg|yY zBfcn&^`nv@&D52C1j42y7G>Zp{_^!?ue9soWv(|TXCijju;S|(fv*d-I z&Zf)E;dGf?v$jqBL~>{iz66WMmpY jab2Sv7u$+*wns~p0cCM9<(tcuRDmqVZSZ(xY2|KtD0_zi1>}yWF z;V*!$%A@s@$*`c}ZS;o~3+l;0! ds$uNik+2C7I z@fg$g1AUD3LcJbj#&%SSV)QN(#?(DA)|0Y=i(!nOhR#0XW-2--YgqT9wHa=@>^ZPl z5Jy5r0@c-jgcpJKj}b=(&fzKdA|RrSIG~4`xt*S(xm(Y1tnIpdIbrUC=RxV7!z!N) zE6Z?>4MSL0y8DT%6zxO1;o-_{?4SWZH^=JF&&C8QUqMx+agrCmdx@T8}=pEx=Z z9b+EWwL8lmj%tNg)7e9B!hGFr;=HX&2^R#SEskj$qGZg?ieJ0)A));6I|ECq{_93{ zKQWaeyWC-zQuf{%V!J$!PCamp`*SIhMOPSZ&OY}%${x1$0!_a1ezI+gIfxQ4;$kj~ zx>Bu&)IRL*^ys%u4^!J!m#wSoG#d6M+tXvcIE@?Z&E?TnN{02l4@`BVx}TUz(ON-U z3{%*H>$JzmdLa>G!|{DO?OqIMgZDzW9$4o3FFot%y9`$}SW27D#(Bzd-JnFEDqdEp z9`t3!7Vl1VA2Br%)qlepL;SplsmP+7>k08{8paT#e2OkW%4pTYXCL-cbR2J3_hGoo z@Y7*Wf`sU~_&I%QWYnS}k-E{W2b8gnOVOIt6^5sdyAe a>|qkeZ*Ue z*4N+e1#fft@nrM?4cFK2jxvvOJ+#bq<0Dbq>h1xILqCbKzKtLGFpWd6GHhM2UEC$Q zOpBf2>WsL7THUTT(1|WBe8$7l#n2ya3+Ys8f=uAS}b@Qc )g7B{s4TXV@Dq|@g_*`^`Q*jX ztA~+!KXW2FE;Ot@{3gt<;mS~K+fr$VNm7{zqQRF*@jiUjBbyC$VFz0E05X jA(0IGg&`WbSPG>g<$7rCLpDX{626W29<()zXclH0Kk{K})9(_t zWCh26B?C)_^H6n^_7giPnuqfOVkhb>6>n%XCmEPBoQGq|fxcobYD2wm0DTV>jntNf z6rP*PsXdrIR~@pIiPR`9;n8|j;#3CK@E7+n7}Bo?+Q`=OSbPw_Zt}V9{kjITVqka8 zehy7`ZyDrZJe#K`LzWrZTD?-PhnBgml_ER-6NoKk`);Nx>1|Y#hZ9>pQr=H&&5TFZ zyt;h=_2UyLgWA3v@=i?k<0oNuqgK7*Zno+UAu3mOx0T(yViRe07)>@Dd>;hyNF0Gb zULD!Kj0L!^ybfOI0cfl@ACB5*w+ ?Y8kFAEwy*bO?KeTG^=tj#grL zC@DF}Q+orVk1!{(D+3qtR~+&}M0emrKXDiJoeeAQJ`=(n&8$&jr=~E}C1h@YJnnJ| z?w--$PNkY)r>6LP(8JEWA8|aozUhGhly|iDep})qotnzK&xUYE>qZcl+4>QQvFOxY z2!v!)d#q&N#Ywg}iuGV3-b_4Lu2dfKx&sr_GZW)86O%JSRPkPd=q*e=oF3izVhBrY z*;rMGg_6>tJ3~YhghEMz5B @|8-#cB|Qm h eAaRj}9V // OFFSET: LEGO1 0x10091ee0 -BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +__declspec(dllexport) BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { return TRUE; } diff --git a/LEGO1/legoanimationmanager.cpp b/LEGO1/legoanimationmanager.cpp index 48f13ce8..c25aa436 100644 --- a/LEGO1/legoanimationmanager.cpp +++ b/LEGO1/legoanimationmanager.cpp @@ -1,5 +1,8 @@ #include "legoanimationmanager.h" +// 0x100f74f8 +int g_legoAnimationManagerConfig = 1; + // OFFSET: LEGO1 0x1005eb60 STUB LegoAnimationManager::LegoAnimationManager() { @@ -32,3 +35,9 @@ void LegoAnimationManager::Init() { // TODO } + +// OFFSET: LEGO1 0x1005eb50 +void LegoAnimationManager::configureLegoAnimationManager(int param_1) +{ + g_legoAnimationManagerConfig = param_1; +} diff --git a/LEGO1/legobackgroundcolor.cpp b/LEGO1/legobackgroundcolor.cpp new file mode 100644 index 00000000..17d24108 --- /dev/null +++ b/LEGO1/legobackgroundcolor.cpp @@ -0,0 +1,7 @@ +#include "legobackgroundcolor.h" + +// OFFSET: LEGO1 0x1003bfb0 +LegoBackgroundColor::LegoBackgroundColor(const char *, const char *) +{ + // TODO +} diff --git a/LEGO1/legobuildingmanager.cpp b/LEGO1/legobuildingmanager.cpp index b2c4e7ea..f6706c78 100644 --- a/LEGO1/legobuildingmanager.cpp +++ b/LEGO1/legobuildingmanager.cpp @@ -1,13 +1,18 @@ #include "legobuildingmanager.h" +// 0x100f37cc +int g_buildingManagerConfig = 1; + // OFFSET: LEGO1 0x1002f8c0 STUB LegoBuildingManager::LegoBuildingManager() { + // TODO } // OFFSET: LEGO1 0x1002f960 STUB LegoBuildingManager::~LegoBuildingManager() { + // TODO } // OFFSET: LEGO1 0x1002f9d0 STUB @@ -15,3 +20,9 @@ void LegoBuildingManager::Init() { // TODO } + +// OFFSET: LEGO1 0x1002f8b0 +void LegoBuildingManager::configureLegoBuildingManager(int param_1) +{ + g_buildingManagerConfig = param_1; +} diff --git a/LEGO1/legogamestate.cpp b/LEGO1/legogamestate.cpp new file mode 100644 index 00000000..473003a7 --- /dev/null +++ b/LEGO1/legogamestate.cpp @@ -0,0 +1,45 @@ +#include "legogamestate.h" + +// OFFSET: LEGO1 0x10039550 +LegoGameState::LegoGameState() +{ + // TODO +} + +// OFFSET: LEGO1 0x10039720 +LegoGameState::~LegoGameState() +{ + // TODO +} + +// OFFSET: LEGO1 0x10039c60 +long LegoGameState::Load(unsigned long) +{ + // TODO + return 0; +} + +// OFFSET: LEGO1 0x10039980 +long LegoGameState::Save(unsigned long p) +{ + // TODO + return 0; +} + +// OFFSET: LEGO1 0x1003a2e0 +void LegoGameState::SerializePlayersInfo(short p) +{ + // TODO +} + +// OFFSET: LEGO1 0x1003cdd0 +void LegoGameState::SerializeScoreHistory(short p) +{ + // TODO +} + +// OFFSET: LEGO1 0x10039f00 +void LegoGameState::SetSavePath(char *p) +{ + // TODO +} diff --git a/LEGO1/legoinputmanager.cpp b/LEGO1/legoinputmanager.cpp index d60f5fc7..792da404 100644 --- a/LEGO1/legoinputmanager.cpp +++ b/LEGO1/legoinputmanager.cpp @@ -12,6 +12,24 @@ LegoInputManager::~LegoInputManager() // TODO } +// OFFSET: LEGO1 0x1005c740 STUB +void LegoInputManager::QueueEvent(NotificationId id, unsigned char p2, long p3, long p4, unsigned char p5) +{ + // TODO +} + +// OFFSET: LEGO1 0x1005c470 STUB +void LegoInputManager::Register(MxCore *) +{ + // TODO +} + +// OFFSET: LEGO1 0x1005c5c0 STUB +void LegoInputManager::UnRegister(MxCore *) +{ + // TODO +} + // OFFSET: LEGO1 0x1005b8b0 STUB long LegoInputManager::Tickle() { diff --git a/LEGO1/legomodelpresenter.cpp b/LEGO1/legomodelpresenter.cpp new file mode 100644 index 00000000..b038287c --- /dev/null +++ b/LEGO1/legomodelpresenter.cpp @@ -0,0 +1,10 @@ +#include "legomodelpresenter.h" + +// 0x100f7ae0 +int g_modelPresenterConfig = 1; + +// OFFSET: LEGO1 0x1007f660 +void LegoModelPresenter::configureLegoModelPresenter(int param_1) +{ + g_modelPresenterConfig = param_1; +} diff --git a/LEGO1/legoomni.cpp b/LEGO1/legoomni.cpp index 13b67a2c..365748e7 100644 --- a/LEGO1/legoomni.cpp +++ b/LEGO1/legoomni.cpp @@ -1,5 +1,11 @@ #include "legoomni.h" +// 0x100f4588 +char *g_nocdSourceName = NULL; + +// 0x101020e8 +void (*g_omniUserMessage)(const char *,int); + // OFFSET: LEGO1 0x10058a00 LegoOmni::LegoOmni() { @@ -12,6 +18,44 @@ LegoOmni::~LegoOmni() Destroy(); } +// OFFSET: LEGO1 0x1005b560 STUB +void LegoOmni::CreateBackgroundAudio() +{ + // TODO +} + +// OFFSET: LEGO1 0x1005af10 STUB +void LegoOmni::RemoveWorld(const MxAtomId &p1, long p2) +{ + // TODO +} + +// OFFSET: LEGO1 0x1005b400 STUB +int LegoOmni::GetCurrPathInfo(LegoPathBoundary **,int &) +{ + // TODO + return 0; +} + +// OFFSET: LEGO1 0x100b6ff0 STUB +void MakeSourceName(char *, const char *) +{ + // TODO +} + +// OFFSET: LEGO1 0x100b7210 +void SetOmniUserMessage(void (*p_userMsg)(const char *,int)) +{ + g_omniUserMessage = p_userMsg; +} + +// OFFSET: LEGO1 0x100acf50 STUB +long Start(MxDSAction *) +{ + // TODO + return 0; +} + // OFFSET: LEGO1 0x1005ad10 LegoOmni *LegoOmni::GetInstance() { @@ -67,6 +111,13 @@ MxBackgroundAudioManager *BackgroundAudioManager() return LegoOmni::GetInstance()->GetBackgroundAudioManager(); } +// OFFSET: LEGO1 0x100c0280 STUB +MxDSObject *CreateStreamObject(MxDSFile *,short) +{ + // TODO + return NULL; +} + // OFFSET: LEGO1 0x10015740 LegoInputManager *InputManager() { @@ -91,6 +142,11 @@ MxTransitionManager *TransitionManager() return LegoOmni::GetInstance()->GetTransitionManager(); } +// OFFSET: LEGO1 0x10053430 +const char *GetNoCD_SourceName() +{ + return g_nocdSourceName; +} // OFFSET: LEGO1 0x1005b5f0 long LegoOmni::Notify(MxParam &p) @@ -99,6 +155,20 @@ long LegoOmni::Notify(MxParam &p) return 0; } +// OFFSET: LEGO1 0x1003dd70 STUB +LegoROI *PickROI(long,long) +{ + // TODO + return NULL; +} + +// OFFSET: LEGO1 0x1003ddc0 STUB +LegoEntity *PickEntity(long,long) +{ + // TODO + return NULL; +} + // OFFSET: LEGO1 0x10058bd0 void LegoOmni::Init() { diff --git a/LEGO1/legoomni.h b/LEGO1/legoomni.h index 05c1bfd0..9d825ebc 100644 --- a/LEGO1/legoomni.h +++ b/LEGO1/legoomni.h @@ -5,6 +5,7 @@ #include "legoinputmanager.h" #include "legogamestate.h" #include "legonavcontroller.h" +#include "legopathboundary.h" #include "legoroi.h" #include "legovideomanager.h" #include "mxatomid.h" @@ -27,7 +28,7 @@ class LegoOmni : public MxOmni public: __declspec(dllexport) void CreateBackgroundAudio(); __declspec(dllexport) void RemoveWorld(const MxAtomId &p1, long p2); - __declspec(dllexport) static int GetCurrPathInfo(class LegoPathBoundary * *,int &); + __declspec(dllexport) static int GetCurrPathInfo(LegoPathBoundary **,int &); __declspec(dllexport) static void CreateInstance(); __declspec(dllexport) static LegoOmni *GetInstance(); @@ -99,7 +100,6 @@ __declspec(dllexport) const char * GetNoCD_SourceName(); __declspec(dllexport) LegoInputManager * InputManager(); __declspec(dllexport) LegoOmni * Lego(); __declspec(dllexport) void MakeSourceName(char *, const char *); -__declspec(dllexport) MxNotificationManager * NotificationManager(); __declspec(dllexport) LegoEntity * PickEntity(long,long); __declspec(dllexport) LegoROI * PickROI(long,long); __declspec(dllexport) void SetOmniUserMessage(void (*)(const char *,int)); diff --git a/LEGO1/legopartpresenter.cpp b/LEGO1/legopartpresenter.cpp new file mode 100644 index 00000000..376073f0 --- /dev/null +++ b/LEGO1/legopartpresenter.cpp @@ -0,0 +1,14 @@ +#include "legopartpresenter.h" + +// 0x100f7aa0 +int g_partPresenterConfig1 = 1; + +// 0x100f7aa4 +int g_partPresenterConfig2 = 100; + +// OFFSET: LEGO1 0x1007c990 +void LegoPartPresenter::configureLegoPartPresenter(int param_1, int param_2) +{ + g_partPresenterConfig1 = param_1; + g_partPresenterConfig2 = param_2; +} diff --git a/LEGO1/legopartpresenter.h b/LEGO1/legopartpresenter.h index 6a9a91a5..73be1709 100644 --- a/LEGO1/legopartpresenter.h +++ b/LEGO1/legopartpresenter.h @@ -1,6 +1,8 @@ #ifndef LEGOPARTPRESENTER_H #define LEGOPARTPRESENTER_H +#include "mxmediapresenter.h" + // VTABLE 0x100d4df0 // SIZE 0x54 (from inlined construction at 0x10009fac) class LegoPartPresenter : public MxMediaPresenter diff --git a/LEGO1/legopathboundary.h b/LEGO1/legopathboundary.h new file mode 100644 index 00000000..c1f9d6ff --- /dev/null +++ b/LEGO1/legopathboundary.h @@ -0,0 +1,9 @@ +#ifndef LEGOPATHBOUNDARH_H +#define LEGOPATHBOUNDARH_H + +class LegoPathBoundary +{ + +}; + +#endif // LEGOPATHBOUNDARH_H diff --git a/LEGO1/legoroi.cpp b/LEGO1/legoroi.cpp new file mode 100644 index 00000000..97ac06f8 --- /dev/null +++ b/LEGO1/legoroi.cpp @@ -0,0 +1,17 @@ +#include "legoroi.h" + +// 0x10101368 +int g_roiConfig = 100; + +// OFFSET: LEGO1 0x100a9e10 +void LegoROI::SetDisplayBB(int p_displayBB) +{ + // Intentionally empty function +} + +// OFFSET: LEGO1 0x100a81c0 +void LegoROI::configureLegoROI(int p_roi) +{ + g_roiConfig = p_roi; +} + diff --git a/LEGO1/legoroi.h b/LEGO1/legoroi.h index 8bfc0faa..3baa31fa 100644 --- a/LEGO1/legoroi.h +++ b/LEGO1/legoroi.h @@ -4,8 +4,8 @@ class LegoROI { public: - __declspec(dllexport) void SetDisplayBB(int); - __declspec(dllexport) static void configureLegoROI(int param_1); + __declspec(dllexport) void SetDisplayBB(int p_displayBB); + __declspec(dllexport) static void configureLegoROI(int p_roi); }; #endif // LEGOROI_H diff --git a/LEGO1/mxbitmap.cpp b/LEGO1/mxbitmap.cpp new file mode 100644 index 00000000..81126d9b --- /dev/null +++ b/LEGO1/mxbitmap.cpp @@ -0,0 +1,27 @@ +#include "mxbitmap.h" + +// OFFSET: LEGO1 0x100bc980 +MxBitmap::MxBitmap() +{ + // TODO +} + +// OFFSET: LEGO1 0x100bca10 +MxBitmap::~MxBitmap() +{ + // TODO +} + +// OFFSET: LEGO1 0x100bd1c0 +MxPalette *MxBitmap::CreatePalette() +{ + // TODO + return NULL; +} + +// OFFSET: LEGO1 0x100bcd10 +long MxBitmap::Read(const char *) +{ + // TODO + return 0; +} diff --git a/LEGO1/mxbitmap.h b/LEGO1/mxbitmap.h index 1613c47e..1fc54260 100644 --- a/LEGO1/mxbitmap.h +++ b/LEGO1/mxbitmap.h @@ -1,6 +1,8 @@ #ifndef MXBITMAP_H #define MXBITMAP_H +#include "mxpalette.h" + class MxBitmap { public: diff --git a/LEGO1/mxdirectdraw.cpp b/LEGO1/mxdirectdraw.cpp new file mode 100644 index 00000000..dde59ba0 --- /dev/null +++ b/LEGO1/mxdirectdraw.cpp @@ -0,0 +1,22 @@ +#include "mxdirectdraw.h" + +// OFFSET: LEGO1 0x1009e7f0 +int MxDirectDraw::FlipToGDISurface() +{ + // TODO + return 0; +} + +// OFFSET: LEGO1 0x1009d570 +int MxDirectDraw::GetPrimaryBitDepth() +{ + // TODO + return 0; +} + +// OFFSET: LEGO1 0x1009e6a0 +int MxDirectDraw::Pause(int) +{ + // TODO + return 0; +} diff --git a/LEGO1/mxomni.cpp b/LEGO1/mxomni.cpp index 9598141d..76287b82 100644 --- a/LEGO1/mxomni.cpp +++ b/LEGO1/mxomni.cpp @@ -1,5 +1,14 @@ #include "mxomni.h" +// 0x101015b8 +char g_hdPath[1024]; + +// 0x101019b8 +char g_cdPath[1024]; + +// 0x10101db8 +MxBool g_use3dSound; + // 0x101015b0 MxOmni *MxOmni::g_instance = NULL; @@ -43,6 +52,43 @@ void MxOmni::DestroyInstance() } } +// OFFSET: LEGO1 0x100b0900 +const char *MxOmni::GetHD() +{ + return g_hdPath; +} + +// OFFSET: LEGO1 0x100b0940 +const char *MxOmni::GetCD() +{ + return g_cdPath; +} + +// OFFSET: LEGO1 0x100b0980 +MxBool MxOmni::IsSound3D() +{ + return g_use3dSound; +} + +// OFFSET: LEGO1 0x100b0910 +void MxOmni::SetHD(const char *p_hd) +{ + strcpy(g_hdPath, p_hd); +} + +// OFFSET: LEGO1 0x100b0950 +void MxOmni::SetCD(const char *p_cd) +{ + strcpy(g_cdPath, p_cd); +} + +// OFFSET: LEGO1 0x100b0990 +void MxOmni::SetSound3D(MxBool p_3dsound) +{ + g_use3dSound = p_3dsound; +} + + // OFFSET: LEGO1 0x100b0680 MxOmni *MxOmni::GetInstance() { @@ -141,4 +187,4 @@ MxMusicManager* MusicManager() MxEventManager* EventManager() { return MxOmni::GetInstance()->GetEventManager(); -} \ No newline at end of file +} diff --git a/LEGO1/mxomni.h b/LEGO1/mxomni.h index 6a0d3ef8..0e837ad1 100644 --- a/LEGO1/mxomni.h +++ b/LEGO1/mxomni.h @@ -24,10 +24,10 @@ class MxOmni : public MxCore __declspec(dllexport) static const char *GetCD(); __declspec(dllexport) static const char *GetHD(); __declspec(dllexport) static MxOmni *GetInstance(); - __declspec(dllexport) static unsigned char IsSound3D(); - __declspec(dllexport) static void SetCD(const char *s); - __declspec(dllexport) static void SetHD(const char *s); - __declspec(dllexport) static void SetSound3D(unsigned char); + __declspec(dllexport) static MxBool IsSound3D(); + __declspec(dllexport) static void SetCD(const char *p_cd); + __declspec(dllexport) static void SetHD(const char *p_hd); + __declspec(dllexport) static void SetSound3D(MxBool p_3dsound); virtual ~MxOmni(); @@ -75,5 +75,6 @@ __declspec(dllexport) MxSoundManager * MSoundManager(); __declspec(dllexport) MxVariableTable * VariableTable(); __declspec(dllexport) MxMusicManager * MusicManager(); __declspec(dllexport) MxEventManager * EventManager(); +__declspec(dllexport) MxNotificationManager * NotificationManager(); #endif // MXOMNI_H diff --git a/LEGO1/mxpalette.cpp b/LEGO1/mxpalette.cpp index dd245538..546dddf9 100644 --- a/LEGO1/mxpalette.cpp +++ b/LEGO1/mxpalette.cpp @@ -5,4 +5,17 @@ MxResult MxPalette::GetEntries(LPPALETTEENTRY p_entries) { memcpy(p_entries, this->m_entries, sizeof(this->m_entries)); return SUCCESS; -} \ No newline at end of file +} + +// OFFSET: LEGO1 0x100bf340 +MxBool MxPalette::operator==(MxPalette &) +{ + // TODO + return FALSE; +} + +// OFFSET: LEGO1 0x100bf330 +void MxPalette::Detach() +{ + // TODO +} diff --git a/LEGO1/mxpalette.h b/LEGO1/mxpalette.h index b78efd7d..7f4a4299 100644 --- a/LEGO1/mxpalette.h +++ b/LEGO1/mxpalette.h @@ -11,7 +11,7 @@ class MxPalette : public MxCore { public: - __declspec(dllexport) unsigned char operator==(MxPalette &); + __declspec(dllexport) MxBool operator==(MxPalette &); __declspec(dllexport) void Detach(); MxResult GetEntries(LPPALETTEENTRY p_entries); diff --git a/LEGO1/mxscheduler.cpp b/LEGO1/mxscheduler.cpp new file mode 100644 index 00000000..94228303 --- /dev/null +++ b/LEGO1/mxscheduler.cpp @@ -0,0 +1,15 @@ +#include "mxscheduler.h" + +// OFFSET: LEGO1 0x100bf4f0 +MxScheduler *MxScheduler::GetInstance() +{ + // Intentionally empty + return 0; +} + +// OFFSET: LEGO1 0x100bf500 +void MxScheduler::StartMultiTasking(unsigned long) +{ + // Intentionally empty +} + diff --git a/LEGO1/mxstreamer.cpp b/LEGO1/mxstreamer.cpp index b6da4b1d..57c9a5b8 100644 --- a/LEGO1/mxstreamer.cpp +++ b/LEGO1/mxstreamer.cpp @@ -6,6 +6,20 @@ MxStreamer::~MxStreamer() // TODO } +// OFFSET: LEGO1 0x100b92c0 STUB +MxStreamController *MxStreamer::Open(const char *name, unsigned short p) +{ + // TODO + return NULL; +} + +// OFFSET: LEGO1 0x100b9570 STUB +long MxStreamer::Close(const char *p) +{ + // TODO + return 0; +} + // OFFSET: LEGO1 0x100b9b60 STUB long MxStreamer::Notify(MxParam &p) { diff --git a/LEGO1/mxtransitionmanager.cpp b/LEGO1/mxtransitionmanager.cpp index 275335e5..b9631629 100644 --- a/LEGO1/mxtransitionmanager.cpp +++ b/LEGO1/mxtransitionmanager.cpp @@ -19,3 +19,9 @@ long MxTransitionManager::Tickle() return 0; } + +// OFFSET: LEGO1 0x1004c470 STUB +void MxTransitionManager::SetWaitIndicator(MxVideoPresenter *videoPresenter) +{ + // TODO +} diff --git a/LEGO1/mxvariabletable.cpp b/LEGO1/mxvariabletable.cpp new file mode 100644 index 00000000..8927bc32 --- /dev/null +++ b/LEGO1/mxvariabletable.cpp @@ -0,0 +1,20 @@ +#include "mxvariabletable.h" + +// OFFSET: LEGO1 0x100b73a0 +void MxVariableTable::SetVariable(const char *key, const char *value) +{ + // TODO +} + +// OFFSET: LEGO1 0x100b7740 +void MxVariableTable::SetVariable(MxVariable *var) +{ + // TODO +} + +// OFFSET: LEGO1 0x100b78f0 +const char *MxVariableTable::GetVariable(const char *key) +{ + // TODO + return 0; +} diff --git a/LEGO1/mxvideomanager.cpp b/LEGO1/mxvideomanager.cpp index 455f4f61..178bc883 100644 --- a/LEGO1/mxvideomanager.cpp +++ b/LEGO1/mxvideomanager.cpp @@ -32,6 +32,12 @@ int MxVideoManager::Init() return 0; } +// OFFSET: LEGO1 0x100bea60 STUB +void MxVideoManager::InvalidateRect(MxRect32 &p_rect) +{ + // TODO +} + // OFFSET: LEGO1 0x100bebe0 long MxVideoManager::RealizePalette(MxPalette *p_palette) { diff --git a/LEGO1/realtimeview.cpp b/LEGO1/realtimeview.cpp new file mode 100644 index 00000000..35be5b0e --- /dev/null +++ b/LEGO1/realtimeview.cpp @@ -0,0 +1,32 @@ +#include "realtimeview.h" + +// 0x10101048 +float g_userMaxLod = 3.6f; + +// 0x1010104c +float g_partsThreshold = 1000.0f; + +// OFFSET: LEGO1 0x100a5e00 +float RealtimeView::GetUserMaxLOD() +{ + // TODO + return 0; +} + +// OFFSET: LEGO1 0x100a5e10 +float RealtimeView::GetPartsThreshold() +{ + return g_partsThreshold; +} + +// OFFSET: LEGO1 0x100a5de0 +void RealtimeView::SetUserMaxLOD(float p_lod) +{ + g_userMaxLod = p_lod; +} + +// OFFSET: LEGO1 0x100a5df0 +void RealtimeView::SetPartsThreshold(float p_threshold) +{ + g_partsThreshold = p_threshold; +} diff --git a/LEGO1/viewmanager.cpp b/LEGO1/viewmanager.cpp new file mode 100644 index 00000000..0baebd2c --- /dev/null +++ b/LEGO1/viewmanager.cpp @@ -0,0 +1,7 @@ +#include "viewmanager.h" + +// OFFSET: LEGO1 0x100a64d0 STUB +void ViewManager::RemoveAll(ViewROI *) +{ + // TODO +} diff --git a/tools/verexp/DUMPBIN.EXE b/tools/verexp/DUMPBIN.EXE new file mode 100755 index 0000000000000000000000000000000000000000..c57ed02cf5ada945542683c25c83e4b935f79a57 GIT binary patch literal 5632 zcmeHLeQX h&%6nwUf@Tyt46v zD}H6;9z9!@N=9+qNadw;s!%AJ(jiSUDg`N9kfOVXrF=1?1=p-u6==Fn#E9aq6*T#y z*Fvpm^VI2D?ecbuq&gk$=slRbfD+RYXYF?KW)9~spoFnWa9u)??buk%ixV@2t8F|d zh|W0%OfA7E(bt!#kG*;(LiFSvw1cL0)P(#)j>&m(&WlB04UmXNgGMH0rifTq)Q+0T z$HWpuP({#DqX(HS16gks6H5>wnh9nd#RpgphKSjLxeX$$XOxXJc%mohjnLyf+aSVm z4J}uM;vbnm3S__Cz&3~wZEqu&m!F^xSkZt_Cn-W!Jm5 +yhhWZ&KinxMp>?SCl(J0BM3u&AF3grQU46A09!0l7NYt&hU5z8}NjP{Q^< z4<&G`(}B%yL|J=cJ=CoefdHs_$4NfaaCH`1wP;{Nb @eVY^^+dl(& zb MxH?aKP5 zIHAi@1lwWz=N84&q8qMn^jfE#=A9Re>a1_T+Hx9dmZv)FP1wIexdW9O@2qHYomM-1 zj?vzHAEMl@`TG{P;Xv}>6O(g%S}t}_>-b#GOkqoCueC5?>pFbsH$EMqM5flm?CQei z;gNkct#K)KlWE@6H<2Imx^&lO84&?fyf`B><-ZD{wMN3a=Cl282x^0%rY&;A zzJ;^9AgsG}FGMx7?g z3@&Qi-}JZGdtS6Z%S_K+wtL x)zTGHlj1uE z9uLO$$N1+Ymn|F)LV)G1HpPl5700B!mM %3EH2bxZ^_6O%rQjvj2Rl {9;Rs%d zyIX6z&zn!>#4Y!C?qoi7SSzJWorYPS%bJ3q_3mV{gun58$uwx!@JRpAp0FIu y2vbjjS2&6%1(s~wAEwvaWo!V&tRTPz{UlN+*e&CI8=g_JQ~rq6>eYi6Yk zA!6e_P4tL6naWI5%4TvblRZLox8pBe%=0%Ek>8=m9ID6hkW7_IN%L3 OMHs1BRbACw)0(} z<=gOA;;#A_WTOdu$9vf7R)~ATV2sc(B{9Zm2& Nm=rBAPka2|-IwVRD FUT*;)AEYYrciH4 z4ZRS$7 Z{oL8omi^|WHH IL;Z^#c{#jvdC`KrZoPxD5a04*UZTumq<7 literal 0 HcmV?d00001 diff --git a/tools/verexp/LINK.EXE b/tools/verexp/LINK.EXE new file mode 100755 index 0000000000000000000000000000000000000000..9d35a8993d959611a7e1c15cb41bd8c3c676a784 GIT binary patch literal 514048 zcmeFadw5&LwKu#aZP|(=M@k|G5fo5Cv<5riU_-6g206Y4oFLh;93VGZx+_EqIbkaa z;3PKN4%rz5fzsPK^c>u9TH4YUT3Q@#wsWx)2oNr9LsK9?58bK4X@J&o%0=&Q&1}hX z2razN^L@|v$LGh=o;{Z}Yu2n;vu4ej(Sj?tN;XN7WPH+TN$SUw{zClwpMP~BdCD1& zO_3g%^z0Y T9l6uLjN+SVY?^@ccH>VEiuxf}AI^ zNe8we{b-&f;a_^1zQ+GTpw4;Mij2)p#G~!f6g>BzB;V>ASAP{roF<@+M99AOiF~2+ zR)1~f4aoS#9;Aa-(k47x^YJzQ7m}oT<8S|e=>JO;VD$l6J5pvZ1+TUxTLN;lqkObI z95K#{ND|)N5o10=y@RfvJa8844ER`+|Lj8uYh!*_@9Ss`%YV%MP=mC^F}ENwvtX|} zZA-Id?xmK*6m8I|?XVW?P5h~RFl9e&P&<$Ypx&QSnI(bd^3h~{psXWoe2MBpFl;Q~ zb*U;_6sRsA+%nIbY)&70;jCw>UQw;KJtfbmvh5YyyU6Qr4I76 %dO@m#Lne|(%yv*D%7mtCdpD%;_Z_D%fLYUI&INs1<> z$HT@icG)D&E+InRM$vr^d3lNk+13yY^qwMPa2{Ba)P4|? pPBcp72KruA1NkCd3BfM@)D&HvUcDI*ZUJfyFaMU38T6%jFqW~V&Pl${rt0D@;p zcE|u=H35WA05B4Q5XGPoKseQH!>rj^((GU%x9;04cp%+!fkT9}`U_-tmR=by(~fv~ z7wBrh*&gInb!~bafX5-S<3n%ACF>kaVv8Lmuh *{?Lx PPevO zHu_KD!`Bmchgl&dM2y5~l5}|@$&u2AJ*=hd!-&x}WRn2I4SKtSoc~<6HKfyNo(ueq zWHGM1J2TDQryZ#tsSi{V>Dr O*Is>V2!5B^LGtFD*_K zpin(^Z^}U-D$esX`&eypiG2wmXk(Vs29F&W-Nac1a6;-7hyf~DnJvjHrjpuIT@=Y2 zAV#%XTt29<#tYcO*Z}ZPW27YI-(H4vk{Tsru3sFtZCI>#2AWZHF+i7+{CpC#BU>3* z#1UB_Jzh-k)_F@tW^YF5d&fSYk=IcQ5xXSm>q4&T66bW=knK2IAOl7*Vpb$Q3y@bz z`d+l{R9M)F9@c6~(QZl67X_vvo8Q%QHZaA&2uZHqnFyj>Ea}`sy{H8xQ;s9!mXN#J zsyeH$RUOs!uHL^AIw#U`CSr=WdyrH@_@HKOC;!oroY3G&oSB4>DRi?po`D!0ujr zMo3BrdMoijQGYmU{9zWvR!blp=I=2bMI(m&5sRelaz~9PPPa*^MwWkeI(-IpNvfQO z(>4l!iNcrAOk+u%rmdfX4ht#TC6?3n)=nNuIVqU3(feQsc$A^dWs*7#^@M3ihocc= zmd7fkyom9zX1Onh@mo?jm;{@+lS`(`3Q9~%C#Imwz0|upBuZ*3z2QY-jVo+B0hfeK zrKFyUhgV8WqgJ;;*p;@%A(T6RY0aU8Ha2Z-KAImJZ~j5wNt&PcE3^4ef;flohPniR z0m~`83RiD8A`q-c2d)vp3Iwl1kVMZkA(=*?x1&_C5KsSH+#Eiis>rvYF?#-w(YCIU zCYd-lk&gg1)~q>yyt)se?ET+XH;A%YO&5*R#5pD(ym*>T3dgn(VKFGehV_?3183CO z4hkK 7RBy~qmD7z_B zwub7S_Al$6aYFgVO!<$H!0UDmxKO?AmF^Fuu5`N7(fvVsqa ?*^GY;PYm3|c6V^d41z1mwJV(9!AFLh_O)bkISP2Pl3+BJc|hb*54ARjykc+j G6cS`#8 mBqQOs`+1)qI!os;8S| zKaJyXPZo#EM7I&YBF8lFqqmhtLpahJHC{Ug<>)}~!9=F?tEW=C$4f62?Iy&ul#KD_ z8R`sptbpVz2mZVv2>A5;!=2zuL6HmxZRNnm$ual~lN@V-qe%|n6Bs%SU9o&m_ZuWT z%J=B5!)1U4?ka`!tHD6W5T2&g6iVtOh4j&LNnY+QNJDi*CJgljf)g8oR#=GXW-kcm zV+%+O`f}y<5{N%f7pp5RaZ)R)71r*s4Y37sBpjDojio=gN{Y7LA#JBorrMB@^g&Q6 zEWiB4p+jzkO}Fi!VafIn{Y6Z+rzpBjwJGU*j)bdM#WEH_k^t8t$cjh{f$meRj96tf z1!AAoP@KM876C=?u!>Mg;|jegqqvwr0sz8GWyFY8vbAKy2!teoQuMG;dnRfvhYhR} zV%1O{4(~$<0Ewc{qh)C0G^eX~7x7gtC0ltT5| k07SUBqsDYQhz~8 zlGUM4A?K8zStZv%gN)HO^oH9u#Gxmh-b4*=T%ue7VY2d3KAC)6Z0d8(8M4?GuIL_; zx+H1nxLX0Q$kfIPYNNqf1&pp_CG($&RYYg}k*DT}W2lv%RUF@kvawRCqlZEP3f)Zb z0DGFWp^*0vYCXIbk-U+vo|Tjir9%lRmi)uZG6@N9auY4yh!4W8MkzEFtb}YOi)G6h zC`n2HnGTfhOVS(HI)zwr-FgP1Kxvwv=gycYn&J _31|*tqs*oB-n}0oUH9(R5lUr`0>K;z)0r5t8o4ho1k5&rk4q0-qiDT!oL6 zk3WmmmM_~Wls6L^!RAv!QVO3dy&>s$_)y%Hc)$Hrz?d15{(?`nFC_VAg`}JD>A~j? ze4fB3aC%5OAD<{bS>+f3;O&6SlSd@ CC&T6mGYhx#_cu~I` zeTu+Ab_1rV09Ae=Bq`-DmJgPX9v(nq{}Z4w-bW8Vj5p;mS?Yg;n0_07b4dLU(%ZK( zY4_6`O;Y{$B9!XvzlR tl^&sf8fR2> zDoEvNtRXzRe @ls no>eWtqQV2w z=uJ7e1!qaXpOl}Z9OdtX%SVkbJ_3WoDnP|baklYY#OtdZ!PzQe)Jd$6o_ceD6;hVQ zZS-1oOs{|V!__Yhl;Wj)aJvg-mg=)Sczge+v_5x>W@$C rJvYo7uf(!M{KDQ)^=$8@A$rLX(Zu%9Lk@j`Sf+($KKdpXL zyKy&Gp#nqVN#^XPp%JWgChX;d;M&nz*%6MY4r3;2#=G$q@ysPY!rBoT^AwT@XEMJK z<$@c$>-{hTIl>)LV`dRI7kN8aUfdZrE_;AWi KmNPmub6X8Y@_| zE(y3h0L9%NT<+|=kgfHxokJfxhsK;$M>kxQEbXPbN{+H750i`0-;=T0QS-vaG+1V} z-SWc3|D@c(<-U!RJB;&@6TuCCZ(~jFu)f@@FL$Pk?z ZjmzE7cD<%yuh2& zn@(JAM0qfZf_@ fI&id6c0|>D J+vn&^wygS3bCW8Tu@Ps9A9?s=q0ux|eH;`~l_6);>PJRP9+U+Xho( zC(3{Hzc~am!-gandfw*Ac5uSgPh26UPsa|g;0P${S&oQ+BQ7Ar>H#o8F^nXo>=?6j zzfEF7uk%Ay)Gu?YlSb;iv`Lbh5~D}NSPrOq9WC$6Oy+4b7@DGurP)}bh0|CNo0GcD zcn-TBaf#W&Z1#6CYSO<28^Pu?h1uBbdl3<)7#Zot%Rk5Jnj0&L)4UR^^MaJNk~$}0 zs6%0>^DJEs+?MGUR_A~*m~xT)Aag;55FTZ&o))wK_*J4*MVJj~hsdx2OZXwTHVAHK zQzGf2+xY-?>y2(8o>*3OA@N0`fHelTQ7Cl=E2L-dUiCCq8>l*}I@q4xy@~fzPGr$* z1L;B%hUucM1gCOUqA)(6L4Z7rtstO SQBHC!chN4ml%wqtEyS%Cdzr6$WL{dQj%rfwP8y)hWH{4bx%HU+B>W z<;zFvEg#a1k@ze1Y1EhjK|oxs?FwWj8k1+E*(o5ym#m^2?5Iu!TVVXa-itA5O_anf zX*(ab*%51wi>UEH0S377OVn3BxC{(`A|FMKO~@gJ_9Wv{j9bcOpaveu89n><0iTuV z9Lyw+4s>9EZKp|%H9CTp#8lSkuiBH4wH2PfMvOBZh<_g9>yNC_jp=?fr@qX_G?-~P z{U@Ur|JcW;8zT0c2SL3?PuM7?0Av)6T=1D3#m0xWN7ifQ2OQw-T0d1VQtJnPQXjQB zX!qbdG524Ju>YJi-p;RJU{MvuIT&?WDS^?>YB+bM)r%fS6C}1aa3aAvjCKI(T`qS( z6wU-3h{CsMxPOc>^*pN~c?r$qlHBqq6{;PEa~#kMU}OOL_Y9z6Na>y6J7-(8cd!F? zK+L%`mre)qJ+`&Zl!pQon<~H_7LQ%!46fx<>&s*5G=dxc&Yr_e4Aa5;>GaU?0_L+I zE1#8#hE1G?+6R`kQ==V*AI37h$*(ng+=xm{?=TjEFVptT)Zsi{M*JGgI)3dkkDKaz zPG9B3v!q$J?a_w3`erY Kw?>TLgJkBo0l)C*9K8nu0NMbR z#va@4=xkDD#O_bFesntq)ft2Wbfmb22Ia%Z$_~V>6#j37s}8U+brLoUqQZK_!93=>7O6L|Y=L%}-VjZ?z$ zLK5Xa{!cMvkN_RUjn2FlSw}-2hnm-B(3+23=BMVeYaJ!mI;)IMD>J|*KK3y64to|V z(EI<*p4Hy4y?;NlTCR1{_m6oZ>I^%BVMhX>4gu6TD+6xJ%772D#w{hjL)eIU&m`e^ z|Gf$J&1tXPJsLv)<*|?tgN%jz*pxwlE1^!zS&e=cb;F1qX-yY(a?#)<>*Ve<3EfWn06jXiL2sBXbVH_hiK10wm`k{r=`qC&Q7dAs&w_z)UEw)K zB4xr~MxTuOA)47dnKa2I-7>4f_?@MtEvi@his!GuHf%&l*|F)3e1N1bZ8cU9sT=*< z2_@ZzkfmAX-wu4EX?imR31o9VUNNW~0GF5^HI9Q@%|XTEsmyYo9rK@m*;UD~SKmsV zLCCfVlA5}E9;@z#h baj+F0*Csk^?Z@lL9?~kPyZ)bAg%>W8J-+mTk#KQ0;P} z+B%bJJJs@u(` 85YG>;0hyC|E!mA+Gx zMWJn-fLuNpv{SZ3AZVxegm0N%ND+D=z3SZrOy`xLGdVKLM))iBq)6tm`et4OFH4MV z{%JM$Vf#v=tx(V*YB)iMkw)m+F!tnOoTRHRBz+?>y^pIMd zgRCpV&;lkRq}Zzll$*80p5_+icPZ{KwMi@ts?d zfz~fn4ikN$aRb1F*-_)m$jDh@$Xt~26)CjB R (ERe2jKDI pG?)*8^=h@)BVqM##j!3ZHGrOsvZ0*ERC!%t@WSqLv!KVY&6=<{eF zhw|qkzZInyK}oVA{S?G|^@5Sw0D(Y;;$=E5axm Oj|g9DU|SzZ}SNP zc0yu#Zg_!$MG(`fT%Jyy2?XkBe)$t>5{pq6l`TNo(?nVQ7AG1%UAqNa%5F^7l0({v z$r=y+7H>P0CSw{}i(YW%)=@sVRJ%-ekiZueQk#*R=SM4$F49cy;Olp1l-U0YQiZQZ z E`4Vuto%QAo4nl{`YA zg>l9;OE-bUiZ1m4hYfzR;N?H~%R(o%m)!b7Uy1<;FOkJ=g1s%P$6e+lS|;lYrC^ xCsr rZUXGkt7+>tKY1Awr8pi|Eo#}Er@>J#0P{yo>(e?JjT6r*Gs0pn$s z!wdy8w^K~j;F-*Nt&i5`H03}9d=b)rl92s>Pn~+Ah>I8x9mlc|N{J6ekbN?;&oHyc z?GRln?&6{VS#nH?6Rn;R<2nH(!xN@=63qbWImXYw17nfY_W-t-!K7q@gJ>a^&P0(B z4&(Ak68P*w;$l`qY|myrLEjC)%hmG(uteB6lavV9;hH^>^zQ*<8of9oak7&920mTz zEkO(xRTv!T)R3DR98UiZS*P-Hq}ZDyBe(3$*|MyevY5oq&C)TR#SuxrlvBA2l?O#C zZ1>$Ck?P~RwH~M%Fa9sS3eU&nRr3&SiD3P_F#&U=C0#U#wvlv#@`PCx{ Kd#d%@aB%Si}-ABLOP_F8bc_r?n#mz*$@8#jHJP6MSgY3dbX z9IKT3@8o^g#`0;?;@kYqi4BPxZ7_yonX%k9oB^BZI{wUALCD>#*{3(ts&qU{w2u&_ zL7(L(=6onFjnra!3v&~ta^ovvBgR7V4-sp8&%>>T>w_Fil7MNppZFy{7d)bZA+T!q z3O@OoQa(yE)^?hAU5~z2GWg!lkHL-im9#cEDQsNwJqRUQx{C}Vwd6P(qB-GMvh!6( zR_+SfaRI7xCl|fyC_xp;3ioiH)R?MJu%Af@@zRiq0k2){RT@(%g2JmW8Ki=|esyZP z3(*o73vj~m8Q_BQJ2(qc9;N)C-Y!+1u6{LM8Wl|fK$5v?-f+Iul$y#uHbHW5opaLh zn(>SniZ0iq&kRE+R-bjiCpk6Q_2|x#`rTx0lMqzubal6r9qYP8N_=0@m&$B+X0FTa zD$$=1v*0iAiVZd%I0MBFV0RIVN~j<}-oqB{al*o|ijPBgGnZN5wqplOiNZas<*GfZ zBgE#*utJYbU0P6^|yPBa=v>I1!k)Z;SiyqfpyN|dLjj8pKfDeI=_U_>TX3^vm zfoeRq2hk$*(Y=9UBqlopi+N1)SCj|wj|2iDzM^}WcDlF2AcS~ibSHn66TzMctU?Lo z$L<_?5mi{&gMs@IPUPdwZBhN~b`A@>+S-_Vt-YUSqpG@V)co?n!(?~Uo(P1H9|gcF zOC v{q)6btqQdQg~0TPPYRU erHwSKx(d6b17HY>L0r5i&aP5-}d@rC7)4kV8F_Bw_D6>J4}n;F&kt;E)qB>^{nn z*SBFEGJSMN=5DrEipT| H<$;%N(OyU-`yVVUDf^-v; z;(P(^LLOy|-Xg{r1Z>qXFL^dWGdXEHrD9CivI|#Y_^?y7xsvLNJ6dDK@VH3-4ii#p zdM0x>jSd!)ZS&-|urbU V zD~d6E;T1fqBR00GSu(2O+ykIX6wn$#hpSM0^;_9qq0ymh^v&+tO5tzPH u4kMGU(YIOv7fm+-OgXwSz&Bz#>nhxg zMp)3EinD2X%&VGeQJaA7=~)VPZ$=>{sL_L0xD5d`_+C7SoPPC`Y~ET`(d$%&Mb;>K z+ZsxR*){z^#60s{O)}0%BJz}qqTawy6Xj9nOdWdM-4@@L1 zCLrN-jbt)k#?XY+y^Cc3L<0t2WH~$9xtzzc&zpRl&j-I25X+};`3Th+%@R8E^Y3DOvtFthgoN%B-wICvjow+WCmXwn$I?6N z^=4x)=CSmyJz0%!n#OdELfVsy(MM9Ejs054Om#js^&W7j(~?>R(uJHn?^d$Cz@9rH zc5ydiJ*?50WRx`wBNq<++>N|k6h6v+Ek={NlwGV{BB|5kjt(J1ib$}K9C5PVW~v1O zqzS7F#^^09T;U;~zuk>B<5=8byb4LER|>(U!@{l+WVS|zEZ9clqlN~BRzt%F!%k`J zNNPm2uyM~%EKn_mF-XMV!m#TlQg>lA_Yw;WMrO%H6lU~IT|BXKp>b$6mE>-gm^Q*) zLWpL }aJb`0JRNgC+#tpF|0kTEuF=n?= Z+XW z>LqvVu634c;Be1F)~_UP=~`!#)CM@!Yy -R}&8PB2(+VqC~Y`A13DfdFkr^AS*1tlJU*CP6Jp`LJD z-UK{vUyLlVdNiCh><=4HDOe!n#U1e}akuftE9rDxO7;%I5+xRv4NgYus4xfOF;mh- zi}<^|Z7Y0mw2!T>+wT&MN40vx%S_rLRiCfQ)w2_w%18sI8P@PNcizL{Dy`qk*Ct S+%=C4b&02!G(l2Sd+&ndP3Gd{p zkJnEZy-WK-4m1?R?0lcdn)*IL_!Jlulh70b%x Q83j=&On*L4zNh1x^ zk?GV@t!6PXH#sfrWM4D1ngj1OLM+>jAFh?9u9|(wEA`WN!rn)n!3y`_B@&ML(81}V zYXsQ{x0vWM6LLT8c(DaXmtUh}Qxx`(tJwc66_#}{fB8X7n88_uq&kmXNKjZ2fp is$DW|NXV(9j{<;cXelAscRbAs&aC9{~C}OC_xB zUSP*~1p9!NdzZ7P#cu7>-0FvA1wr~8B?j(A(>_Q346c~Y!>nD75V}}D{lA4SYiJn_ z`Q3@Kf$x4kyxC4MBUA6>3T28%c~P_XPpTMU+svSPNm|!Erv~)n?a11u_XpW0IbNs-5A9is=g4p zJ?!_8fS>KCa$*R`c?5{J2p~3=ARuyyVCpZZ$^+BO^*{hpa7DZn!)E9<8bNKwaXj@r zeM7M}5*lvwTG%PQFRB;8k#8o@m^^-B`ZCjzZ|8|8raLDkZw^qY#M5k8|FRwpWQQyH zmlFN74IxPl6BgRWkd%PKCu}||fQ{Z1V#`A8@=)(VwM@GOYC)S%oyF$)^-F#1CZB$@ zUyu0M{`6&X8cst iT7DUfR-!~J #$UV zkwS$FAssS$YB3nxl9&v GJ<#$)v4_blf}CZoZAJ)^FeT$9061q+ z%f_(BfIWyc&>OmvJv&J>;vnKvJ&-9 $kf&7J!xe`s!L8 zeSHnvoP#nVj< zU?U~F&5B{%F^>i{l(Lmp$O&5tfH^60al3+Asjr;r_`iee{8w d&hXcwUzQlf}Y7ul)~oY zba0V*R2Z>(XCc?RiG57ZZ^1uU)Dr)A+i4@M9nQ5EVjBep4A@g>bZQ^t2<@>~bVu)~ ztM`i-AmI6m?zcz{OUnN-bjW5WPA8`R=vI Y)=vCilB~5A&BL?>A!UR5@bj0a)IY5&L3_!(J}1F}?#3 z+a7_RLmy?(2J?pu_;Gbp?1P9^(mXdb?mjA2#lg64?M8WCpgRi}McHhE0RY q9AfU8Y1qTy8TiLxEIb#;M ^Fn9Y;boa7E;l1TouwZoXglh*;`N_|yv=GqH+M{#xsAS0}n zz+5h2qHZ&`K*aL>#EZG|_;?pMXbiK7L- k3JFG@|Nz%I_#wM^g1tZ3T#OSj;Sf+tHo523Q4)zhL z^;pJX@&6HF(}3$d{>B4vo=x$9H*CDg1HQ2F3Idq(k!d-AVYb-b!2#f$L!Q1yUW&e5 zj(#Mm?Vh-J1(F;&oDG5Mf%bVZupr5y5k)c07#lHf0NyQt?(M*AbbceY(pu2V-`+?> zYQrIheF$;Vcrh~&1idMsFAwR JE~x|^eVlh8z*5mmKsH@ z_6Rad>f}CpD#2A{>Re#s1Ch!8n@9A9CJ;7CIf>v>1A !B<41js-`@xXN|z*8_{d|BX0_Gur~Nyiq; zTr2dLLFh5HmbvpxLn&^)8Jut+1Cu`$zz$5XIiOB|oU{mF4t(FnJ_Z=$7vjx9;18;E zV7Y{o{kgz`Y* $jcxCx)6tIDOMrp>Je5>qa{K}R{`ha{G`hKa7qxOi zXM+UV5z=S5zN7|