From 332840afe31f7a2d39f82b85aa2e3184817955a1 Mon Sep 17 00:00:00 2001 From: Syrus Date: Tue, 11 Dec 2018 21:32:53 -0800 Subject: [PATCH 01/38] Added emscripten env test --- build/emtests.rs | 3 ++- emtests/env.c | 13 +++++++++++++ emtests/env.output | 5 +++++ emtests/env.wasm | Bin 0 -> 45738 bytes src/emtests/env.rs | 4 ++++ src/emtests/mod.rs | 1 + 6 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 emtests/env.c create mode 100644 emtests/env.output create mode 100644 emtests/env.wasm create mode 100644 src/emtests/env.rs diff --git a/build/emtests.rs b/build/emtests.rs index dd775b35f..1ccf0d2b7 100644 --- a/build/emtests.rs +++ b/build/emtests.rs @@ -12,7 +12,8 @@ use std::process::Command; static BANNER: &str = "// Rust test file autogenerated with cargo build (build/emtests.rs). // Please do NOT modify it by hand, as it will be reseted on next build.\n"; -const TESTS: [&str; 2] = [ +const TESTS: [&str; 3] = [ + "emtests/env.c", "emtests/puts.c", "emtests/printf.c" ]; diff --git a/emtests/env.c b/emtests/env.c new file mode 100644 index 000000000..62e0ee6ee --- /dev/null +++ b/emtests/env.c @@ -0,0 +1,13 @@ +#include +#include +int main() +{ + printf("INIT\n"); + const char* UNEXISTENT_ENVVAR = getenv("UNEXISTENT_ENVVAR"); + printf("get UNEXISTENT_ENVVAR: %s\n",(UNEXISTENT_ENVVAR!=NULL)? UNEXISTENT_ENVVAR : "[NULL]"); + printf("set UNEXISTENT_ENVVAR = SET\n"); + putenv("UNEXISTENT_ENVVAR=SET"); + UNEXISTENT_ENVVAR = getenv("UNEXISTENT_ENVVAR"); + printf("get UNEXISTENT_ENVVAR: %s\n",(UNEXISTENT_ENVVAR!=NULL)? UNEXISTENT_ENVVAR : "[NULL]"); + printf("END\n"); +} diff --git a/emtests/env.output b/emtests/env.output new file mode 100644 index 000000000..d546fd4d8 --- /dev/null +++ b/emtests/env.output @@ -0,0 +1,5 @@ +INIT +get UNEXISTENT_ENVVAR: [NULL] +set UNEXISTENT_ENVVAR = SET +get UNEXISTENT_ENVVAR: SET +END diff --git a/emtests/env.wasm b/emtests/env.wasm new file mode 100644 index 0000000000000000000000000000000000000000..d31a64c33115446274f95d98c078109cb4941d69 GIT binary patch literal 45738 zcma%^2bh&bviHxM&N*-fW&lApFwDGmLEV%Akm- zsF)Q|F@g$;m<1IT6f@?mm~+l)`F{U;&kXE-_j{fX+d2JqsIIQ6PSw@jg+s<485IhJ z=noACCle=5j3yo&=}*Bug@a=c;&0*LLgC4o>r+_|$ZrWX!k;-NuX?dr0fyV}3d2$fH{SR)`hW{qQku2OQOQ$k^2b z*F5CVqgvbc9k<6JS5dEVRfs*w%sNVs;mmCCF(-R(c@MX*Jt#Y zBgY@sdc>dG#*7<%$g@Q^cjfPD87NY#?&quHN>NZ-*A?WBs4;eou zndlinq3w`E$BtP&toxn^?Nj~bh&>M2cfZm59q{W~%5H6Aj{NhUM;%S#{n}bxL1HltFeW8Nn%DHcGS4>ZLLQi)^=2DVb2~))7m=jD9O$tZATn6uCN|FfnlR- z=?i<6M*s1TV~-yHr@|)L=s&iO8B^$6KYHxg2}h1Tbo^fq`Sa)_w%)3+cQ*RSLyj0% z=u_f%ET9T&;&VAD40j*GSQwFw9)D z@(S%(J8FE}{$tw47aGezJK#^PWByX;-IdgbHCMgN9(DflYakre zI;PO8i+}Ea$b>P4o?RNE!hopK^_OeyvrqqZ*4}5IeY(EAG~R7+6ipn^HADltTA^uR z*8yFt^-a}3x5zi3vQIkH3JpocqWVf!7|^x8QY=_uVAo1l|FLLbrP8x7psreIRLX&M zgmkM^o{pk51hf~>ws4>hs=9?h^{QG^=)q6lrqIAoLsO{dr`!~}Td&ZqS_p;evh}Q6 z!yao_A6u`XK4g}K$f8iRVzsb$DB&$zDV=ELtoq}6mC(hyTbJ$PLUqM@)?K-d>u2@) zy`*15Lk&h(ql#p#SVb_vGsIR0j5vppSc4@s7!AsMb3g0BuN6XSy#{u*w7&AjxM*2f z)mm1jUJa|&t3mZzRt~?lLiOutM0hxghuXuDNK&ng2zSK#Z3c6CzyYfCskwL9W; zVznW&^V3Q=F|!l1YBC{wlU3UX4UP-p?V{nn$tHxSOZIfBnzV%9+3%oo_>=uzcyxvEeRJ z5G4?Zry^96ws2Z(r^VHzHCzy@(6lLB5gYD;SgFC}w74l;AKUe@;uglXFcymU$98{Q zjatJK3b7|V_2LK~E-S+g#IZWnDfMy;?d;`vRCqVGcjKHi(CLfVzKC;5L7TSlb6kzx zGc~CeY--XR&Pw>Pvq0_Q#D0$LVu*Z=BCjFx=7b-+nV`jqEl#Qvo5I71J)BhQCWL1b zdp4;yw1n3cVz0xvj}rSRslu*r6ZC>+>}W+_$%4CJF~kp$;LyOJ(P*?&t&$D zhpfnKg@=5Y8Sd_^F?^fZx0%bv)ll@fq8(S1Y@F)CdTJ55E=o4eFN(G27sE3pWtD_n zUNqd@nIb6aL-)L`6cwR`oLpBl+=*FpxLrSzm?cG_f>b2)VYx$!rQ`KC3~i1ca>VggC%>gBuFbtwxWczd3bC1u%w!QSW*Sa21WPbH*~dq z!f&!#$TubXrX(6qD%+$oao?1}Zz}d1JJYju6``h;4VMR;>2S^~8?LJW6F`#7%7(j9 zdDIB<`cWb1phPRwS#~y($zIQSWt&$P*4LHox-wXwn1wDGqCT(O9DdJV`+Z9oZKEaT z2iw6C@d?QqHT5q5+my2<`% zO|7BX4!5QWVXTdnBp+!^P<$jp6vnjwiY<&Ikx6M3u}Y z>c>v-&TDdHlRd+f$fiUp{KUxQ5ZtMe;mRYz$&sBLF}6&NGAmcY;&T3Z0-vQyxVH=} z@VvJSqKnI+To+X;hF~Jrr$mM;jSABun{KuGG~y%zr$=_W2TYF)S85Dr zMAY_-JO}kUFS7GI!TFJ$@AbMMvJ3KPC^93m86JIMWEXn$%*bXE&EUIBU6K(P29hKU zqWb5{f1dm{FsyHb!Uj&-^+msnXde#f;>a#`K(iv7rE=C624XOo+^!i~JD5pksW@KkNz_TJd%g3H`BEwDh zv1hsuYUf6VJF6BFc7eF3dD&NpMpr}{6iU@~o5GcmUFpECiX>O5ur+GC? z0)10tH#z8ABD=*ad~0O4dUbbE{B4opZt)Dn1LF3`aH<$O9FtUXXVo_v^ zY9NTeGcw#l2SGd_?urcOAV92KZ5R>mj_huctLzeePh|Hn5oitfQd>3M`y#{Lo8wJf zQ&FSG8*6!1Aaz4m=Ur6F!4_(q~Zol}J2A5aDg%>Bw+zGtxa1 z*)vX{XCr%7we|4U@Vw8Cp7*lJM%nw?Q<`h;8~!uHr;rySd%>&uVq`BW?u97)XT|>0 zmV35XE&Qd(aCyLT&-F4mM&|P%0!Z>oWVol4$HxIxPs6||9+J10S0j6MwMmm`7`jxD zM*q#2mfk&aRCq12*Qi5vB7;IcQ(Y0+3h&)smlUh_d^55)y~1xr_LeIAdXx_#uSd<{ zZBJgF5Z;OG9Z&UcWbX=OA*`2?w7PQTN_w^TB70Av{S`{W_J8i)6yA^QecHx^@IhoB zP}P?3p`h4@5d5RaJ|fwQ{!QVN$UgC8pGNj6d~OM!MTYwj)_<;Ke6)oxBKv|2?e$IJ z%gDa;3|~d|6^v{NUq?pDugUODRPAoxfcdvdPf%OhfMEU@*^e#_ zKe?yW6n>7VjQz~8_0P!uNnA@<85!;;fVRih9*6ZR74;_Tx#UcWZIaJtkBjX%pMgw{ z>4YXTPlYr)^Z#!4b`*wIcMT7eGcxsW3@60=Qo@wDx|U6eo5P8*ouJi%nm}9$Q)A&U zHEs(h0Wqv80P6rftZOI5p&vo!9rU_t3n#~RvLkRxY^TH;ucpO@6W30S4Y$sSaC&T~ zYvz2aV>msw>H1nX>9@=%GJ?jZVn~3fDq@15KGFTAE~UOVT6w9fpT?Mtx%zO zW0(=!Zu-42HoO-i7&n#eCUxdezAen8NSg`WFN*oGi$LpQRtGWi-x4lio#QCYifxuq zQ8TD3vZy4yIb5n}yA+U@#dcY&`PAjHT~3pp5Uz~v%2;!%s}y2aF=v_`+w52qt2wdF zi6#11$A-I#GOtk_9}~j0v0V!hCxp4N&1IRy*b*Dj^GJ1_;_yuf^JAOOifKZ)A+{Sx z-VzqXM)U$w-KaQx6T(fg-Q=lmW;uqZCEOAl(YKK5R>k3)5N?Z&kK0(8-5yJr`70hS zifxhe@J>h&cDFm@Fe0gq_I%X3hdS7Lj` z6TBMRtB(C^vAvc@Lx~l!t?=mA!N#NCi0uucVPsV^zSrZh4N1cGwCq>qe?@-VCTwNf zhi#oXTZv|G(heNZTd}?6fZmSnZI!c?DE>}t?|AfkvAyTf@5lB&(VFqS7l*Bh4%<=2 zTk^jtzimw!+l6g?#Dxp4DW!u@ew;TlzG%PnDOL zs-_NAG5LnF-H^}wKB5QyEVj>R<>SNW>K^QKTHTki=6zo}GGE4&>a#!afjVEs_LZ0M zb!<4e_)RQSq3gG3CnV2bL8ou&`u@xQYqe6pi|xD4YWN(mDlz#!Hr&%*)-VXgJzab%_?HZ9RC?^K1@sY>h<3*ekqgL8UfxYHa?qtZ@KXj=kvMq;?> z9z$zuWFe6lu2JYWN&#>-AJukR=Q)X;BV5m>w6<_=B6R?NB_Zb}HSOH_#F3yaT#(rL ziCut}Xhvc)oLCnocA@fncx#xcJT}uyCO^WuznzzaVEc#v$nYuTqQoxpN?wxKC5pQ! z3I9>C{{VU6NBe9Fvl7GQ0n~|HmnMb_NH5ByT#y?*lbs2%@GirLw&DJ>{^m(IyN`4xt?rZ zV)NitOSmpE+#DEky^`_K7Um~5pA4Fg-H_M~o?$^^3m|AqxG^zO-bjX<5~gD}p?14P z=?Q8Jwwwva1Yb5g>cOl!oEd`Eh4HV+?g2e4q)Du*j-8J zpU=knI|J`_d7uZlCox?A8trHo_a=6)3*3E)-3P%GLx6r^b$@0aiQS*r5;(myv87JZ z2NHWgoc3_mC5hVoGUv1xRD({_crY>C-8JzOuO3Paw>mo?Net&9;@;gZ5RWGIsH62* zVvl*q`u_u#!4*7Ia z3D1ad&p_tq5_>KQeU*1@@8tVx?)GY8YtvoWtGVF6me^}v`iqIZ=yhL_*b0iI%eKC1 zC(nBXE$xNGUht$ZCH9gd`f_485Pc=FSA^z^pjnq@_PomFV{IQpDPa{opxGOV;nuDZ z5t6-`7;bfvy_Fa)Cz+PTYpGeho!Hxsz&nY(gSxgUyqg#<&q(a*5Z+4+_s(jJc|S4S zTB~^XL1G`|ftmY7*NNfs z)LqoSev<%DiN8w>_l**3UXqLT+4(P7mG=9Nv_B+<`+jx6KPL90!}%$(pPaToqcC@T z{;3fAr&3o`7z|jM*vi$&Q>jk#^<#T#xGtl@q|_#*)Ky>2;rNtzJ3dui&-a9rQ^P@q z6H-F#1VxcRwV#smsS2H#8g7b5c~z$>lVVOv4L8+e2mzmyQ#(0b#jZ;A`5_wJPD$;Q zRHNIp)TV(?b;Xcsy9te#J3MahUAo6l>gdq!)d9Vmav@57Y4tvFTo?b_-{x8NgNMukF`-Rjdn}V&M!bS>2qGD7CXwI}_Z`0w4U%;hfaY zO6?r_)N@nALACQzJ1>>OqOf{ZZga3RQk&sbxiGa0J<)s*pP3r&Tp(YR8g6F#%W$## zW~8ISC8_ao37ZNxm+fXvX;ueasV;IDvr?PoI~A9vcBvO~SxSF%nJAX?>+;kt_lPSM zait>KBdunui-&~F`xM_sxGFW=<&-=-wb??`T)96dwK=J%bG0Y98g#Eo4X32nrgkk5 z=@BcWhMRL!o9n6Pr8duty)L!uItx|5GA|8T-lagqcF4IbHJr%#U}_Jh8vIt4Mudk_ zdx(rV77r_?VPtqDHOKbR)E@S79!m}XV_@}oYQ#RC(&eW1gmONTRwvTeruL-19!$dy zng0HQi15qm8KMG9Lw3p1u%jY&s!ml{1fgEf>KAjeIvCuXt%B5&6JjGZ+eHgL)fc&dfqk*9bQO}44y8cAq5>&dMmZJ zRPMRL=4~p&&%3GNgPiZB_O5&0PYwV360b6GgpLRwq=vg4V%}9IAbhA?;iJ^>d;~#0 zR<}18bzW+CKS3rwP3=AYxV!P) zQMNmrW%o-`D5@qYG%r=`43~ynuD?tT_X`Hk6iK(Qyo0{U+tt@8pY}D_e3RNYV){+B z1eIDh_ibw5LWjoiow~X2lw`V(SKp`hy+{0z+Ar~r2tTHV|3`>_YuRpZ%R4+T55ljI=Q})a4Z^RG6&;?B2H{u8dmWyy2H{u8XC0oO z2H{u8cO9O|gYhe*y~8tYFn)zh?eLsE7{5ZMcX(zF#;=g`J3Lnm#;=fB9iF*^@hfCb zhv%lj_!Tn0!?S2GeudoD;aM^mzd{ywcpe#yUm?pnJWmhCuaM;(o|gyXSIF}np0@_$ zSICME&qsstE9AWn&sT%-E9A2d&rgH#E9AQl&*Y8pE2O={Gi@XM3YpsBIeR1g3Yp&F znYj^ug`D5vxnd*y3Ypd6nY$5wh0LjW>=)JFupMKeK$4n4DF@2^q3|0vnW5G6UENBt0q9^lXZD@->A!$+z?gWS(|% zM!05Ur(}jZ*`t0*M)tQeo90ocW_D^;&1vUN@U*NtbC8{;v_5rc@To(CM!nNBYY@2U znN9c6`Haj6I|F>q6k=y)jp6Lf&dz9RY+5qvvMy;*h0n?C9M5rXX6JfU&tuh1I%)FG z%|b&yQJ|xk;XR-ibH0jW;c!7_7kK6wnayDK(Go6XXVjt0%xor5gvGZEa2E-SZ|OZQ z$qaW<))E$$Z6Qq`B-P{0VjDHHSv6v*PM2neBkD4N5U!WA2G7D3nO)%=xH7XVy{xOm zoGYOC?966+)SS$&sxfB{%(+Go>>8+XExW22zUDC3xpQr;K%46z#) zEzE48XIhlmB4^Z{nceBR@5<~hF>0{)yEa&2v^cZHp8TH7aG-gwLhN3rgg2D?(DPMpGYI$bMJ?e?f9%v4g`;LH3t3hOd`J_?jOCNWp%Hn?5qLkd_nmhiWcC48LM`E=%sv8EWB53;kHu<&+2;Br zkDm}eb&phgpQ-AfDG9LP%;%U%Ijk>)zXa*a%)a!HuQJ1ZL8ZRV>}yquO-F2=zRT>p zO#0sMvzjjOhscP{B zHqC=iE81xUGnL#`bJ}UeurW!(W)-?=`A?GHHVzxvW?>U=wi`*^dwS7McRztyUm{+uU4&(ZwU05A1Nz)z=pn}9eIW}yD(2dxn~HXmmv?i~ZZ1}jWh+u4c8kOB zq3+?ql~ipe{RQsDDf48N;b zYqWP0M}oGn7^B3ZErx0L6zv|b^u1VSDZhuehWnJq?(>q#kJ$an?ka}f_N#CpV~d9@ zE!tAA$^AvUUvW!|;lPR=SnKL~OMD+F8ZPhq=u3gKtZ2C2ssRBcd9Y}>yHu1qydF~E zKUB1b9Ib~XnGb^)O}7se&`PZ|Dm+rOM-KC=37O3s~Gy^O8h>~#CKgLXw>f&4cDheKZN}KqP_2u{6Wz^ zfM|*#z?Jy95zB|-dmqe7iuPgAK7#EZW7O>Q{RF8M+daHBeCloZQ)j!ESStpZ|Ey@Z zcWbgJ#(hyV-0HmjvS>ID5nJAM>G-N>UpanX7wu~g`34*BqDHH4i-zmb7`_vmzY`)~ z6+^Gg`beAqJ=K&p|A!*l{2!q3k45{Q4nr0pKhj_PEDHV%z5iLXe-=Yelt0D*(?b8BUY?vrBfijE4=y3QLQUo#UvT>j}<9lFus{PD#%% z+4-WV^p-xkzo29nc4}0g8s=sOq7nbZoH*TC+vYDlDamg+&X?1o<$u4pB z%;GO$&Ee9LUFuPnm24IVAjJR6N|kWAAlT(#aD|Fjhks?s@L!3V^Qw|vrNa{6!lWxm zJiBDGy|}C019Pq^<*USNOZh5sZpr4B!n~5r^TMtx*>#S`^}=Hwc+4-^e2==JWY^d5 zxB<`$0ALG1`#lX#-p<;~6<0_oguDG@G8-dZx;EgtntGO`LN*=-(m zd&zDut-eaUqoh^h9iEnIkb7at7M7~(h{so#;N3=XVf)-)ZsHRb=OO=3-OI8eWK{NR zO5x6uGyYD8yr^W0sHUO_KveE78SXrYy0~PECH;$(C4-sHPe}W1+8FLB**z{NvrFM# z1%>-chUY%$u|(La@hvUc(vk+f`xRpMdofF#Fb_BrsoJuV;U1_})|PanVYqv!#HWvU z50~s=q4E%U+rlGmzs_HccaM@{kP3T@I1;pl$4mBD$sR|#mX~a~bM=XmJ)!&_-Wr}% z9(&S@B0sg>&mJvtG-tnX0BaZzd8%Yjc_p4L*|Um!suT{W*a1{k#Okg-@wt-W@_>AO z`#i0+WZjj50Ft~=GTfso3X=xahXL=!lD+77y;QQ7z>DFoo@H36Hr~CA#lAxOE0lyj z+PzY;S1^HPm?_z-KxqlD35vZ&jbAU>>m<`?_eROy@MLe6>`ge_65c8q?zK{Dcw5Q% zXbbO@>>V;_w0pN??|O#!O7Vypqx&7FiD{mIH} zCzsp8DP=pQ94gA(%^Pe*!xw;tg=(??6RHh<)2=*)BW_rIb}PCGBwUIk8ca7 zdIYGRR<_eT>GZNqcT~?{b0A0cOpap+(bGXx1Kp`An2&CGo2Qgcl0dd|%ZBS#qa#9o zJ|>H+C80fCP&QmnHRkkIr$#oTY%?5#3(Iz4S*>Gc*>E{*Vmk{V@kM3BU07aK%Ee{F z)vaRRC1tyWIujsWO}^B>v}`zbb1pC2<*Jgtn!^=k^~_fY8hy1Gc4gUcXcn$2tM|Uj z3nCev_UtmB;_jTX;bwc3D;=&@CdFJ+Hr&-7LkRd@TefTeWr%H9FU-YCo_ea#!fK=M zH|s=mVx6(WB9fTKu%4}#4y~{7@mI8mQBCdid_=%87zM~GSt#e$!N?e9yqul*9?QDP zu?&W3UvAziSTke}HY29y(>zl@B|wF+5vy3Dx3O(h6oXv9W^5V(vwKq*Y5g49fi}{f z=V;%-cCaVP4-hqTqGe=bm|znCI@xWFPSb%mp)_4~v;yy@vDKt8VD5UR+hUCjWjl~_ zizBgYRm&M^2eSPeW0eT~&W`Osk@_6Z&j@jDEd9xWVlKeXb)z5>o#P&IDFzDl(=upM z#IKYcer5!uMv4J`3Pdy`55Ac z?ijtdgy$4w&qYG$Uu%K}(@oP~kcB&dmEv}{UUyS>V*l?vY+8X6O~*~%g(PO~j-(s7 zE5NPTMd#Nd7${S95-`cZ?EG!F_I*0Xfg!WV<|4;@f$j}D-ZBMw7?ht7cpw@6nxZjr9yF*E<1 zXsJIw)1lK(qtKl)K9c`K`K>}3-9tB@H*n@vbmQ z#3tVj>3{Yz-Hu*mVnk0A#BRqTQRiTOjxy}&E0}bzvl zFInXrucN7|@d+}bS2d=@7}f6ugf$h9Z9VP;Z%V`iVrpzSRl7n~HOP}<4C@8Mjp+r$ zjp_dl2@K+eeQsWVvI9KX0iNn+_D;vuiJ?;%(;|5EJ?2C5ov+0LmhO{jy;#JbCnOQZ zyjS7$>;;YkM(Y>4-8QD_vQ%%BnfgUggrr0;N4Z$W>Wa8T#^^9C@6_F39cYc=Qdy`I zo{tKb$xvOLJyzq>7w#D)mU#;Q8K-zNH1@3$%a#HKI^;?bNov(3c5&GkuJ+QPQb=a#mmZQh9O@m4O> zo3vq&ytO2H+ggveoo#2^wuJ4~+iedLYR#Jqzz(*9Z7Hm_6!aZ!N88+^D@;@<0wLPT zc2W^L*Gk;QcG2gqwkrXRVK=bbEyoTK+|%}ylR~^@I7TbG<-iS~mzP<2SPY%=f4!wLj)F4S5Wuuh+7cB0`{!9BM02?Ip``A8; z*w^+|#D2D4-cjw#q5OSVzq2EPZxlZ30n9a6-|K*4ue_6L2z|YhRD7rn6`U%D(GX>r z4Rb{x3P3TO- zLl~DggrhhfJ5I@H2pc!)?5u6fXRU#?&=6Z1IYZm(?aQNBA8m~0j2+8Z%gpigA2wbP zx(IAr4)$o{q-_l>?TACRev^WAAtyQ~n$%zUQH$clEj9hCrpp{cb zr?!+lNmm>Y*gp_RI$uhjtfRYHN}l4U30X>>=I47)qu!_M)NQ_$oUS9MN_IxXsaq{2 z&(z6Oj$?BAUdi~-H4M6g!IzTf=$NW9oU7BR>ZZ@r8CA~Jax;Psqg@a+>sT&X&LiiA zelC}#B^lNdUA#K7IXViY9)D-&bnHk#&EL`xLF9?5Cv9eMJ*(60bMO5Z;e<;-U?y;+-ts&ye+Ee zm}?&ny0(RdI?T$h1bH*>I1{ZS?~P2GDt2!^J-SZ^R#p04I_s)hFV(5kd>xsHBa1u& zMDNu3SS7t%XJCcs;>d6ydXLV*g63VIsb%CMmCHxXRFOhf(dvF3e>LCUamju_M_@bR zA=NUSd-ZQW3gQaJ2X!1)ML(pYuj-H=jtu8eiCjhKNBpjj{CKQ`f7H**y6VPR^_Wh} zx*#AvvwTIkTxU^bcgX43S%WwWD>mYX7*9s_WJGtyXuoVoh@Ff+Q;E#upVBW#KdrN> zA{ramQHXu@3@o>Ds;}%D`OPZ->%}VNP-L~YOH%-nY8YGG&=2Yr^BY^Z7N(&tq?R_U z8#2@FAX$Co!Ymr9W#q8`?FO1*x`AdFthtf?ooyIL1q*5zECU688&-VVsDAwg!Ys!^7IPb}pHjtGm#0OWZGzK#RZXuM^Wq=ZM zSfyRxVq3pCFi{O94Z&5G?KIj#b(5yh%X%rv8hmZh#3o;Fef6<5tWOh1PaTcE);C|O ztib@cQGSeIhx{i7pbbMfOZAocQPd#e?1^w%Q|C=fRns*>J&~E761glF9mHD&l`MlP zb@_N#CzO$?yq2y&>dqxdE`)Uw!g{OETYR0UgBZC;R#9oxHFSa7U7#>xD}g~?sUb!U zV!=f9p_$4{ED4yS_5@?DKH54e3SqUw_Jc>M1&VrBKq}DX(Dw4CI59+E9U{LksxERx z4lB)#(P-u$u`xI=jG`WbrrV+Zuj=>m%b-BIOj!e)glpBiCg-JaUR-Dq(&~Hatj@VZ z-_Y5@%Aj7Kx3GGViON^cn&YIYm$>y{uT19^s@ri%R7JQ861CQptWbTp&_p%a+TV%0 z#45-PXYL!;hWxq&3f@_i33oAPKkt#MT}Ox>QZzxcdW5o8?WfnNuPl$E-b&ub3Y!!P zpdIO_4($83Rr?-|?$3Ys2K`!)kP$DtwIXS2fRehlO2{&!(}cE3ZJc68P_I%|!FmDh zVGa7}$<}ZVyJrV%dWhUB*d;3&8>jkCF zxl4tmyr*di(>~V6IRej|Nov;xaTH$Fnzx!|XZ!FzybP*7CG=h!;mN;r6OT7r1V_?c zN0&`A=}sV`rq-f;3Hk#lv4(n!1kSsZAkr?)4=2$ks^Ml3oh&Sc1!qIsP^hv@1=YA= zgAP?9>rw(d2{>@6Sr#@0X-50ZHl*hroCj56mZ{ZDU5pFSdE){IO}`DOSYS1mtt5f9*C&U12y*E`Iy|tdRw2?unEO) z;@uz(8_AG1qCTuIQR@&hhJ1KxOyJhCwFHjwr3S8Rqf|5bVB_nvHEqrR8<_g-zBRc5 zF)Bb`tqQE?6-eluJ1fwSkvAC;yl-Y?%UFd`HiJ!|qKqqPPM)ro!1VyaDF}BB>(frx zN36>Y!`IGJ(0}XNkAb$a4V2gv^~E3v{gLhZ%CDoY;w6j~_h`0`H_LmUU!(-*VkSI` zbZ(HRVX&GG^A;*W9^{Pik@bG8!Lv(!<&-QMA(*3bQPzNT*^8e(hsDDngpA_RGYFgp z{6P&Hu|O`Uqh|51P!|6ls!k8-0-{1Su~1s!$*KH0*3@+)LbrIRbwe8VU4R)0wnxXlw~=5_+Y`~*M~#M@&M3fd>sg*2abRv z18jp9={o3p!Jx!x8PfG@qFohiL)Z66=A@smiEtwmlp(97F4+1~|F9@-SYJ~URc}+N zezeKMp@BxG7X%IuRU5jhj4HfCi_({V74ELtjPgQ3s9%RwV7LsGinTrZwKTkM20EL0 zwKliSRV`FVUac(&rrKK*zqQA+hoJavZCj6*3W;iOPqnveW)iuj?J$B#i}X6M zr(oMjU9_ETskvyucGk>v7u8ym!OmJUWdgySd_IOIh=PgH$n> zZ#s&Gy{VFpmm{$p|D->yuk`2`sBYT0p;TSOAl-enkZ$#rcjIV~L|OtYk&l_DLBr+F zc$%03QR6vT*UM_*h;G9sl3XrAX&8d&dVfn3Q|f%YUQeSLvkO}<6n!*HtB({`8^OC* zCyrE~40Y0mf$H#36Hs0B0jVZNj3J_NPrjJ7Bh32hZ9T2`sM?^BHf)OguBm|z`SnSj zreB<(X;eR^kv?r0AaFZ$O0vdqqG`CqmhwSSv+NS9Xeq!d4I3jEj1QdJ0NdJZkSA4qZPMA+En$avsOoKad9fD_0aP2)??e|zfzR4e4-v&K$NS+u%pHo6a`{t7cFkruwEjU3T5)4($*9W z_m&XZnrMP;djRyJs5Nv`QZGoh1{CTWdN984h>%E5GyzV*rNrGC9uALp%*S}Kj>CzF zloyYZA?)a<0C%hw#f?meuT`tl+MH+h=HD^k)`na2t!(-sxJrI$gR`&&ihx3e$;hPR zCYQ$|#N}!-Dy#>Q*gYk_t99&@cNMEO(5^dPQd?d5^N)XN3Wl$pyl5-}BJ1Aq2<-Z1 zEm{ppkZ9_X@ot(tg$B{CtA@!9nByIzQErfmWNJg24JdF>=$7G0@Kmam)ySjXl|6KY zIcX|BN~r|;`BjywP)@=D4Nh_(N_C;$dD~qiVhH$m(lB$P-0lzpyt<30n^?Vg%3vVS zEKqBpX~CNSa8ow=yjhDo4WK{=!(B#O)K~6HqfI4>o3lJw5v{g7TM=n}wt00q(AVO3 z7QX}aO?R*%_YV!Sfx`;hCj}cwJL>Q?bo%;s`mE;jX1*ySs}|BU;Rx@BHn3p}kx_$I zPLPQK9_PIdH6INBGy|sBVd_hz)z4^ZvVr=@4QPBy!Th8O>$;Fn^KtrP5l+jdd`O9g z*E-{Jb##lm8n;7c?d&jNZT1W*F=8CE~2Rs)Naw-dfj#9IUs!P!6wXd8LQ&uFp<(_Gt}Wg@G<*M=lt#}m6B8y$lreIFxAi}Tx+^NWxd`=!d? z#~OdQg9;BlDjTfd$GXRfPq?tqJuGdP`aM;?f-R^w+CvvTk)C}VE(ydxNc$2CeXnvH zGSI;P%=5y!-eMZyW3SND{XHc$e~X7om!BW?w4TjjGS)(<)<;U!eOi1FRyb zCqu^o?R?c+&)S8K`mQjM=otpkI%l{PU#klcC1S3btqB?Qag8X2y;=z0xv9fV9QRRL zcKL-;$A2g|J2EwQ-!O{*KmHYBmQU5Lf}7SQ1^PcK_Hq=~s7vbDye(9i0kWe^BYgrT zI(G;=1)p#%*`E^{PY4b50_6NIu6E740WRACOmF@9+>vB2Utr#i>|M{zb#QEP=M8Ct z#(Zm8QqY^Sk)z&9%r-N*&;YW%OyMW`*5--6D)t@bRoQ)encP!i$~-ZqOpedRfXc@c zNW6x2o*^0A&Uj9Vo3+clhZ-fJ+~(G>Wre>IN8fACm8{cZ7(XEN^j@yUCAUoxc5V_Q zcI8GYUX|QVrNMGD6+y$cBCqjH#`ob7eOScR+Fa*_;e z4Cl&D1q63dVZNEI!q~eyzm`bXL0=F{h2k69VNHMzW@<8wrnagS>W-QgTPUaDOsC;Y zFV8o<^YUsN-UqWG;+M1a9~EZBRc^Cpd333^x~nHW!3K@*bE{UD$2Lnhuwmk^OSQb` zUz;s-=H)YEu4qy>x(>Ou-$=mMvE&qZR{@WmaNIiBLFob~RSr8P*gMBjo8zcmty|k_ zs9mFr+Nz*-t>57WYIB9!wSbzZYuj?vuG2+rLhX88@Wxfxt>I~1>jVL3$E>-o7H)Hd zn=~~9tpfz1N7&c7CS9XgPW>U=QKcK;$o!RK$Te^a9I+d9(_0O(n{?M3yuR75furbK zbn_duScmq+aYt{|x9S==vH3P#1}6^Q9_uc+PBz~W>mKu=N(CwWdN`%JGv;czT0wW| zJ~;9D?wF<4-GF29xH#6uZhoinB8PiV%mr_?9QW#qH|4l5Hg4l#W1k#LVs3KVC@JXD zs1uXf;eJOg;ar6-3J+@`K3j0JTlfa{sR~FA4SJo<2F-BV7?$b2HySD;R+QP5nvhqN zJE4}x;X!zy8O>|DI4!*D_o%UX#C2;A>b@~AkJ=oPvz zj!V>9xI<32!#$!4;WUyyDvv;O$(ycu)9~?VjB$!&?ReG-IlUi?xgbuId|Xy5R7wlY z$5kn%ux~scp~F!dtX*wiTxbn@F*2^z%u;_(#;LtBTf3s`&GgZj*;EdJtrLG6w$i#=uzVfrBs5j0195%6uROa_xXjF8H!>>zoaYfBx5he z_9yPYYmqI13<*S!W@{2cPf56*av@<*ciEcU$x_|K4fG?0^pQe(atzi-hTYWR_O+2= zH#YkU%+q!YEk0Lh5%F|KcTN**3%Dz`$)6n9aTN9gZL8W57kD>uWjBzI7G%$fNn|Z2 zMg^YpuhsT4tE!#GHrZdBbal51;OcH)?;T^uXtvH(-Bm8o#()4W9s@Q+2cB7VJ9P}4c~>}UAD4mSWO!i52ygUV z&h6u6f*^kXq#HZAK94!Q=asDPA;z-WRR2NbF=&0auF3RJ8ycoW)$KdGpY1xkAN4dx zcSNeu_vn~&Y~PuNtWdzM8bp~B-FP7<{#3S*HS;@3b_~_}mTD^G@z4xkrb@Ij?-#vPli)-}i**hbkOCgPV_wL%e)Vp`mTT?GA zGN{0}|4ZRqh1kLL=I-SJ&(5T!tXNW}E4?3a`wJTY`$W{b_3O&DiC`YhmLje*I@FbF z(F5l4B18=aW*E4ioy`Jbb;XWUPzhzg*<2LvrMVRcHX1ued2#*gvQ;Um!nqv@G48;f z8?m+Fc=fAG{{^oLbQ}9Byw+dUB)2?VH?sc+mOCkhm6D&L`EX?4A^~;W-eAK zZg%VlVhmEz1)Jn7QJwzPJNkvdb(^f$L1H^f<3h>mgN|pCj;XzW+zpRMH@iOVnC1sT4#`2qaupSzVUH$%J}4H}GO;GCxvFz{G?gIJZD1CJJ#A z6Bd+r^vkM?`bj~2gBnPdRTuL0ncr$U2@p5?8!EKPTl}_lKyU@<=cu5#5R`H!tzK@W zP}lG;?wcVg0|PIw9fO%-P;H?u+a&yHDa|hXwYy!w^*u12J?`(<2ni z2Zf#My63rBzAce0w?+oHRB6~g+%JoguwM01Cq%c-Vw7f?tVvY$2W3J+)tB_k2&v?j zB%PV+Ix|TirsxvS*)slMnfj!!tXO)g7lj84H3rc;Z(DuB%R|h3apt>3*n`Lp#0ph2 zHqW4c1H1L?hrOh<+AOMNtJHN>zUW{6i`DQq27#%G=@}RFC4B*5T^n`^AL$lwS_XSy zwE|f)ts)kXw%EHtlxVv2ZQp|bvmGQ8`ufnVd zZ6wlv*}pt!fcX`787Lz!vs@9u8%&t|fq{4Ei6u*RB?SFgm*etXz<#3=K4G%e=CH4W!x$J+&2&-zMVK8uU5DnmQC0-k+%z3E9C6k(Qb}k)owiNqpPx_ zEwR20n}vsE7bJc^B9Cs%Ur!h0^ZOXh_i;Y8-G{}`BNBY9Js$`4E%UGCj42QEi7qfy z$+sGHx9kwbYS`I}eqvS8d4Gll5SBlvFGF{qVfcBMXa4;n{q7vIVNhSn+AM0=k;4X@ zG|)8l`N+1_R@Vy(;CR8P@M6S?3~tbG4e#bp|5TrGaU*wG^P!hKWp}?Re_QU#AC(^@ zK=xh&4FW=UF2BI+zqZmAsh?Se^z%rmPccySf)sN*7g;uCC9){IA>nJaoAXzb-@L9X zB3ls!UB72vA zCwJ?lcOqH=qt=++WLf4u$I8x#=86bez$SQ9fbP20Oa^l!BcO9H%~77zsm9V{Vnuk;Rm~VCHgPFT*$dVB`&*swkVJmx zr#MLdz0OSKyQT?=wB-Ilk05Z!!)LggXdwU5pFzOhk&kw>V4YT3hWe(r2$S<^cwXqZ{9F?Mi*+`Y3;oZjH{=n=r%f)P_qH&QjA2 zs@(d<>Bfdxp~IfB+I1}2G%pHuxH6+NuB~r+q9$jxNZHbm>h372S40Hd#MU>XP|w#A zqnD>7Hc3SbwDRDYv0aD|WuZfp!;atuU6bk2#L}^`)W^(VIT*v>l$7R^D2KYqhDP0jxFmv5jmW z-+-9)>dguomCg zMvOF_I!A^)q#a4ABXh!@eY+cT=%(_ln!Y(b^})y(p} z&A_InD8T-^VC+fhd#dySKF?-elQ-14+5+LUg`-gFT;@3eu+In^4C6%kwl>#I4Q~xKnRgss{lo&M79a% zC0dv`ZmQi;&8cTZwwdxYf=i=tL1`E52oJK(^{JPRWlGpQ2R}{6ZKZ`c#Y;you{j4Q zIAfJZPuDq#+QA7*Kh58|qV!WE+k!XETC~THhH-0^eqn_2jMDd}^u6=aFZ9yWd_Ir% zr9xjmJ&L_bqG+1|~fEa_TZ&R%ts`g`@k}~F)P`+uJP?01 z<2YG5aIPi}37(P@AgOj8S4H?W`Z1oePikG8eH5nrRa_|v4>y4o9%LH9&?{r0?#wfw ze-}V@$DBtK4(vDTD;w5~lN*MHh%s;x;#V`FNeloDRdJ-g@@y3K)V_WnHe=i4)%Nw< zW9{qrp_G*QW9l8VhG&^rCL<*SvZl+)Ku9x0s_p*4zFxo@;W9YUdT|3>EPKFuV`)jpuPL}qTT z2=RWR;}KWsBK+$4^i1>R(^CrzlW?Dh&Ls3;J?!8Mex8eLVx);0cFvzcm1YKYF13he z)a#_sVJ7UCgSF@x>+oY4u;!F^eNxOjp#RYyTq(egj+v6nDitr{{%&?Q=777ROG1f*a+ zs|ml7PF4rktd{N?r8_$gqqztwfg=sO@JX}rMw%E)v#nv#iIf< zliJdGef0;I=%ImH{1(*eRIaXfXtNR?M#*=)PfeAN7gW~I7bDLn>h3R1cqgT%MBbE3 z_w-7NmpCK8zMltpFV+41Ks-I26{e@$+&@FN^PeG{Wce^nk+XDBKTfI7(*67%$+Wjp zqvYlJQ!B&672w5#Db3+Ze{*FbZ>(@H0+gAp2UX^V{Dp;Pv^aATo=dT2UYOLw&>(fN zUWvX&PY+kOQ0I3|qC3Fm@V5d49naxim1~nK+dp#?y}!ay(ER-sjbOaK(o3}BQ5D>E zi6CUW=3RSwMM-#jrB{{ShNo9>3p@#JayT!rAYSOTZq}p6;?gbN-q+My4(+LT-|gu& zyvm}n^j75dwuCoXMBn^X76HG*pHbG^D~tR&7KQN`3tRhKy~i&vvk0YIlUsQO!P@oi z!KHfZ;GA?d#-7Vv@kzK_&!zAZOLOh{<)|^-lkjE>G&;8btpe(_gHViR5w%UO9*8TNRgG*VI7)3>_WZ`nH`^-QtQqh*a>n!x<(cc z_k%-qt?*uwRgZN9AJ8)}_Ipm{CA|J($?))?o_hgMvz~dmG10@(u#B5v{fU={AfCVL z!rRf!S}`zwKa{W#c{mBb%N#T^^&StmXkp*Xx&jb~*`Zz-3kW-`Ik22iiCS6oW!dpt zJ1qQ;^U6Fyq?5;aFLF30uIfW*k27k$hg1=NB67^IQ8} zGwX#TtVu_c``XxMwhWcyNG5c-t^&bnTGbnk>nv^@@D2~7wMhoShHGI!XIXTEW1fXs zrXFNk2lM7vFAK+W)xUQ_+GYGh6H5eopcc*ij!(m+l&<$6ZXxy*|E(T^p#KgBRqP-^ zZ`CVBv!LpD4n0rgBeU@pt;$2NNohDPm)YaeYuTy{`5EV+c{b;rZwr%C-s85(h~Ei% zQpCk?%%hKj(-b``QWM7ly=8v0%h3RxBA}fj(Sy|oc#PD8#MG+?df20}R6QvC-P_9F ztLqK-BhwS@?^$)d3j3T}$x2ewn*JlSWFS-juo8{0M$gjM1b6*w~^YV9N zc%WqpPsUioyzrTxcj1|pWAX=MhP9vl;mb)o@5S&aO#X4KUWnl}nJ?K7@h4(tvsGGe zI@?8>*;?B($Qjp!(Fa%DCq&w#C zPPNHT2E3g*yV#Sp>uLXJ)_Ma`@rO>e@PG}|v)oc8X>wJizm`%+A{4HTI^yVK9XiYC&IhO+`V4=FdLk=JhyGGxg7=c(RrG@OMB}bl z{MtX*X!CN;dh7Y!Mlu=qTG)Tqak19I?kF&q)wi1z{TYlELOXAp5SF& zbXSDIDu~{#3>*<35$=gllT*&!Jhd{9Vt;y%Txo*8$!1|h(Fxe_$ zAO*7}F2V1@=cNkMg!XAU;9il46#|jtR(s1whv$1hfPI!bA)wU|?_m7A(ORfWAldT~_E4qa+8cU7 z<#VqDTSH+8w~Mm_*ug!rZp1Cc-XXoHjU(I0*Q4wc;WiqJEvN!trs!AnwzAs9tJ-JJB8Jq!MC=pNag zQO#G;qfQ&?sMTBklJi?|`t6#pF}&l&yhAa(<;K%(9S}a-y%27llP23|6DDo%X_IKxr1*V$CMLa8QwdqMe_M{(kgySs6u~FK5`9x`;=N8a%FK6=>8b>}wU6e02@$JP;?t1K*lzS=i zbKSL-$9^7#Q5o0ajM9x;>f65X=b&j!Uqys);gvcmuDz<2*s){6^;}!nsIXT?qOdu> zJv(GZ$ZQTWdset_=Nq;1+N;sudMp3V_fL@8@1y)6-w)a}k;>vn?UjJy=E%nP7|fC# z;lQ^IVz`}GZ99qXPf@-f!j=koe?kV>8R7n`Jm=4~oND#>w;=&9rh=T#nXE2%jFG!b zOxt4{%9abytoc1z6Y*y@w4xXNhM`D*H9@z(PuNch$uU4Ie23=;76WjO;Xl z<^}eI2Mo#UYO86OY`P*%w+B%d?4YrKuIQ<1_86I}Gpu(cIb9d@5qCOqIs(S3C%1y8 zN`6%zK=dHRV8e8bIyw+~%%qZR^Y|GvDakcB8HBoSbXA$K*-P}cVAqKv2knfZj|qS$_w+dv!r^sLxsVPt!BxYSLb5zWi|C2IQV%kzuEFnzXdx%N?}%$hn~ zDSIP^%qwDwse~1YZOY@0!)0I0bxXcUyMp1Erxq(5_k1e}+w05`K!$T?j6YHhv^oBO zHPEh>^)tEVAP&Fb z4lRxSH_9d&w2q^h46o$RW6#ygi8w9Mv5)3eQW;6>d2Bql##|>ObLeV3JU54?C}IaX zrw3~NeTS@~^9B4Jv5s+&Z6Vp*K3duClzlYWh#ko5CNT#pI?j#(X+QMxFEHmzm#J+Tc?QTO_D*!RRc6@34MnEMoixVynL*3*hv66*{JSS$q#ET{S2 zT2|A)shw4LK#yYE_S``4rq0*V@O1IoZ)EXYTi)Txmy@|l3RRRAlMgFet4X3CmMY2# zzn}HsVtRiJ+b47TRrH$Y!bHjYK8&kNrshWkJ5 zU2Tk9RT(}rcRy#g>})?*EO>^tP}vq1D6|Tto!#!*S++x=3seE|?#$ipbZ73Jz4y*` zS20~ajEIS7AO`>X$3L3*-xxOWp9#Sq1dK6}2>t*SN`f({2|mwz&fGf-H5&hEI@#Wy z?~nI=&-ZiQ^Kup(0BCj^fu_xy*q|C5Ud~Pz1wRYxE0)x+;NACL;%j%KYeblzIrk(e zdbkSKUsk)XN#^4~baRImUOCA=M|!@V1qN55{+jPjBl*|ikM~uOY{DbS1JB+Qi;J54 z21Ers7dMmu(Z#}en*Fc{wOl-D^t#2H+wK8hM#Wb2Nz=LeF9RJ!IoeLeUZOFs=(D{aLBXEGY?C##^8y z9{$9iQ1TCas9P!rs1krk$6*EJ6L1!x%iESNZwp=EWo}c-&B%8I|3H%dk&kC1>O1hq z%PQF-A6t?>im3s{ayM5%e22yxi~$G?Rmy*R=~7Jtd2 z6ThhM!}BfKeDO_3pT_gCWkBgc!HY8hn*s?Bbm=lMXTbd+BO{+5va`X6@HalBO{V-^ zE@k}#W+4*5nMQJf4LgkE+SA2TLh@52`MLw#;!lbn^8Hi*6(GD%5UL2{bn=MyM^;>c z@dCo-35WNRPwCTm+r`OZ*yV`U&tc*j2Q-5TBm=01>WuX{Ec|42lSX@SOuoQRn3|{2M3Y;%=gW})D;4qWtJKahjz(d`v0331n z=iqVxIP;u5(@kc4m#=k`8{gyO+<2mUx%j-JpJ(O1|P;{pD?Y!WT@kEY4V4Jp~!?|hn5X4Zf+bWYH0@m z1%1VVUag9l4{;)%F&Y2?RT^?Ef{yowvesPqQIW7z&PITiDLsh|Ss*4v=^17%#1rB7 z&Gm~<@vvyZ04CNi9ebK*ST7MLWH8CY`L}v9cM?}~6jLiqm`72CQJ!)LAgi>F9W5wH zKrOKAhV|)9m@x4mmj0N%7LEbWeONF%z&3Ic4R|5{1I~}B83JG%8G9_O>-tMr2^zf@ zCcOcqH_%DX>BZ$2*6LNOxxfLy8+Zo9FO)5wDpTrPAtI-=0qiTOi4$+6`cuqeM`$>{Oq@_@eFMeYrbqO)5ZavXlv)q1 zkZGkikP?;4Fr}R)yIsg`r^yawf?^`(N(F1o6-Y@5yBlFKb-xDZ=ev`lQSA@|i3S%W zsBvjSvuI9Iv~}!W6{*W*eM6Ot*Xiq|Fk4r6ccXL(arfzclEL++FgKtu*P9GbVk#g( zVW@eF`P`@tEOE>f<^XmF#*%_l#R|egC5?oIZY)Xn7KFul^sQJ0+>#WWD%P1G@Wc}6 zcAOvH&Vu)_;A9^a_oVF03c><2?%|9>ALkKaj3SCakWl0~Xh493zU4als33OR1vkd#0w|;2QkbC34(GQSTJ?aVnZgZh-oyE0 z7A3ZaFIMc$?a3KMBn2YA`WQsChn9YIHB-YH2XV87o6-LIum}QrF3}CPF;)QPF41zi z0li_4$^cmjc0;yNJs1YsVlKoXELh#pV?ZpUE1`55TxX%Vs0wO_Vj?pX9G#bBEckh- zVL}z1Wzbv*329o!iWU^g9!Ffc_W;3QY;c$oCT*CF7gR-x#Jd_yJt+FPxgD^fmMlMj zjhRi7LnPGu4jc|Z63-)r9$u_A_5s=lQu`3?L#Z8_qM_M4wQr|=duku0eKfW2rhRv6 z*R;z;Zj;|$+V`gZ`)S{w+7HlvAhnOvKAzeS(S9hkAEEt7YQKy2yHYz8)1XOZO8nm} z@eR3k&&hv59|?}O)!B=I2Hhpo=)jE4vAQ^eEHdX4dzPihrgn#RC$%Ga7AnalZwuA8 zsZdFB;CP4erVT+d-p}$RSZVa07}=!xQ!0KznKP+DqOil}1lkNdIf>{w4iBEyb;4n=9nKfPVYYGb z?EFXuW59Mg09Fgfeyao(3Tlx+0e!TXG6n4WLsjixcV-mS59Ht5IihlEWMo9)*UOJm zgZ$+A;cr9@=iu+;`c-DzU>@#+efZ>6ALH1V64HLUV&)hV>8q?7q%*IIq$zht67x`( zi3t z`3vzbA1-lCC*81>N+TOdr(< z+95*Cx1%*x_G8qp-9njkv=+r)Q&-(aBMk+YRuH;jy|Jd-zPsYq8&c`Azv4FPh~#-o zYBCI>=wQubcDhmbmk{5r9SnR#k{X(%)rn3mg&Ig1G@A^3A5|xbNYfZB0G+(Bi*#|l ziQ)zAcyr)|b_7bE45C=qBV7wF_=%Mf2zHZe)vGUFL zTIP26Ve0_8x+a>MXav$Hua$WmR3Y)drlV z+rAMb#;-S94Ue=m+-gDuTr?Rp1k{{7G>xW=h8ouw>PR+316e`n6NcAJ#MMy@Noukp z($G>$*-(^CN~UdOCOE*Wwv|O{7KG4?Zlvcua3k_iC**ND4C0^~G%Wu~QCmXO;8X5U zZs*}0kup}$BGA-}QP3!^`=)!b{6NN5LQmNWr@Tq>ybwZ6r25i>*whklsdyq0o1CL| z3%vnJdPa(15@CeYr?SbGL|<^5>_aw(?X=Cyc}hoM$)q{~Hs*mc-`HJJ8$X*M$fkw79b9$FHIS4YmBa@YPzhH3M^IXIO+OQOV39$SwR1)4TW{I z*p8)}N=F5^0r9G>k;$zvILD5vtK;i-Ma#fIAWe7C^=oJq_d{OMSkg}HzIK4Iz+0_) zUJZpqRnTwN+f8t}?bp;p!glM_88KvRL-wXSLN9EF#5qho>_kc&GRa7}*^q_R!M{~b zIC@gQkA=^1*D3Y=_a^55zx;b~$A4G)a-}?%Qx8<8&X&*2O;zR|o2oqcVCjB!4g=#S zTtBb(MLG3w<$>ARM-_+8PlV7%^_i*5C3qChYN~P~rw)#3t;f%fud4liyV3ZpIyioI eZ2T;o4vw#mjjw9>Ks;2rGOc{qSCvvl-SkhnH7^PP literal 0 HcmV?d00001 diff --git a/src/emtests/env.rs b/src/emtests/env.rs new file mode 100644 index 000000000..3c53a539d --- /dev/null +++ b/src/emtests/env.rs @@ -0,0 +1,4 @@ +#[test] +fn test_env() { + assert_emscripten_output!("../../emtests/env.wasm", "env", vec![], "../../emtests/env.output"); +} diff --git a/src/emtests/mod.rs b/src/emtests/mod.rs index e325651c3..415cd1d39 100644 --- a/src/emtests/mod.rs +++ b/src/emtests/mod.rs @@ -4,5 +4,6 @@ // The _common module is not autogenerated, as it provides common macros for the emtests #[macro_use] mod _common; +mod env; mod puts; mod printf; From 7f91a64cf6cc3d962826c7d32b6f4c6a4f86277c Mon Sep 17 00:00:00 2001 From: Steve Akinyemi Date: Thu, 13 Dec 2018 19:28:30 +0100 Subject: [PATCH 02/38] Add a bunch of required functions and syscalls --- src/apis/emscripten/exception.rs | 14 +++ src/apis/emscripten/lock.rs | 5 + src/apis/emscripten/math.rs | 19 +++ src/apis/emscripten/memory.rs | 10 +- src/apis/emscripten/mod.rs | 197 +++++++++++++++++++----------- src/apis/emscripten/nullfunc.rs | 10 ++ src/apis/emscripten/process.rs | 21 +++- src/apis/emscripten/syscalls.rs | 201 +++++++++++++++++++++---------- src/apis/emscripten/time.rs | 18 +++ src/apis/emscripten/utils.rs | 2 +- src/emtests/syscalls.rs | 0 11 files changed, 364 insertions(+), 133 deletions(-) create mode 100644 src/apis/emscripten/exception.rs create mode 100644 src/apis/emscripten/math.rs create mode 100644 src/emtests/syscalls.rs diff --git a/src/apis/emscripten/exception.rs b/src/apis/emscripten/exception.rs new file mode 100644 index 000000000..dc45454d5 --- /dev/null +++ b/src/apis/emscripten/exception.rs @@ -0,0 +1,14 @@ +use crate::webassembly::Instance; + +/// emscripten: ___cxa_allocate_exception +pub extern "C" fn ___cxa_allocate_exception(size: u32, instance: &mut Instance) -> u32 { + debug!("emscripten::___cxa_allocate_exception"); + (instance.emscripten_data.as_ref().unwrap().malloc)(size as _, instance) +} + +/// emscripten: ___cxa_throw +/// TODO: We don't have support for exceptions yet +pub extern "C" fn ___cxa_throw(ptr: u32, ty: u32, destructor: u32, instance: &mut Instance) { + debug!("emscripten::___cxa_throw"); + debug!("unimplmeneted yet!"); +} diff --git a/src/apis/emscripten/lock.rs b/src/apis/emscripten/lock.rs index 9067be99e..b3934a183 100644 --- a/src/apis/emscripten/lock.rs +++ b/src/apis/emscripten/lock.rs @@ -10,3 +10,8 @@ pub extern "C" fn ___lock(_which: c_int, _varargs: c_int, _instance: &mut Instan pub extern "C" fn ___unlock(_which: c_int, _varargs: c_int, _instance: &mut Instance) { debug!("emscripten::___unlock"); } + +// NOTE: Not implemented by Emscripten +pub extern "C" fn ___wait(_which: c_int, _varargs: c_int, _instance: &mut Instance) { + debug!("emscripten::___wait"); +} diff --git a/src/apis/emscripten/math.rs b/src/apis/emscripten/math.rs new file mode 100644 index 000000000..9f33e5366 --- /dev/null +++ b/src/apis/emscripten/math.rs @@ -0,0 +1,19 @@ +use crate::webassembly::Instance; + +/// emscripten: _llvm_log10_f64 +pub extern "C" fn _llvm_log10_f64(value: f64) -> f64 { + debug!("emscripten::_llvm_log10_f64"); + value.log10() +} + +/// emscripten: _llvm_log2_f64 +pub extern "C" fn _llvm_log2_f64(value: f64) -> f64 { + debug!("emscripten::_llvm_log2_f64"); + value.log2() +} + +// emscripten: f64-rem +pub extern "C" fn f64_rem(x: f64, y: f64) -> f64 { + debug!("emscripten::f64-rem"); + x % y +} diff --git a/src/apis/emscripten/memory.rs b/src/apis/emscripten/memory.rs index 4caf652bc..ab0304456 100644 --- a/src/apis/emscripten/memory.rs +++ b/src/apis/emscripten/memory.rs @@ -1,6 +1,6 @@ use super::process::abort_with_message; use crate::webassembly::Instance; -use libc::{c_void, memcpy, size_t}; +use libc::{c_void, memcpy, size_t, c_int}; /// emscripten: _emscripten_memcpy_big pub extern "C" fn _emscripten_memcpy_big( @@ -36,3 +36,11 @@ pub extern "C" fn abort_on_cannot_grow_memory() { debug!("emscripten::abort_on_cannot_grow_memory"); abort_with_message("Cannot enlarge memory arrays!"); } + +/// emscripten: ___map_file +pub extern "C" fn ___map_file() -> c_int { + debug!("emscripten::___map_file"); + // NOTE: TODO: Em returns -1 here as well. May need to implement properly + -1 +} + diff --git a/src/apis/emscripten/mod.rs b/src/apis/emscripten/mod.rs index 3ca72a8e8..0c23ae302 100644 --- a/src/apis/emscripten/mod.rs +++ b/src/apis/emscripten/mod.rs @@ -9,6 +9,8 @@ mod errno; mod io; mod lock; mod memory; +mod math; +mod exception; mod nullfunc; mod process; mod signal; @@ -99,6 +101,7 @@ pub fn generate_emscripten_env<'a, 'b>() -> ImportObject<&'a str, &'b str> { // Lock import_object.set("env", "___lock", ImportValue::Func(lock::___lock as _)); import_object.set("env", "___unlock", ImportValue::Func(lock::___unlock as _)); + import_object.set("env", "___wait", ImportValue::Func(lock::___wait as _)); // Env import_object.set("env", "_getenv", ImportValue::Func(env::_getenv as _)); import_object.set("env", "_getpwnam", ImportValue::Func(env::_getpwnam as _)); @@ -136,16 +139,71 @@ pub fn generate_emscripten_env<'a, 'b>() -> ImportObject<&'a str, &'b str> { "___syscall6", ImportValue::Func(syscalls::___syscall6 as _), ); + import_object.set( + "env", + "___syscall12", + ImportValue::Func(syscalls::___syscall12 as _), + ); + import_object.set( + "env", + "___syscall20", + ImportValue::Func(syscalls::___syscall20 as _), + ); + import_object.set( + "env", + "___syscall39", + ImportValue::Func(syscalls::___syscall39 as _), + ); + import_object.set( + "env", + "___syscall40", + ImportValue::Func(syscalls::___syscall40 as _), + ); import_object.set( "env", "___syscall54", ImportValue::Func(syscalls::___syscall54 as _), ); + import_object.set( + "env", + "___syscall57", + ImportValue::Func(syscalls::___syscall57 as _), + ); + import_object.set( + "env", + "___syscall63", + ImportValue::Func(syscalls::___syscall63 as _), + ); + import_object.set( + "env", + "___syscall64", + ImportValue::Func(syscalls::___syscall64 as _), + ); + import_object.set( + "env", + "___syscall102", + ImportValue::Func(syscalls::___syscall102 as _), + ); + import_object.set( + "env", + "___syscall114", + ImportValue::Func(syscalls::___syscall114 as _), + ); + import_object.set( + "env", + "___syscall122", + ImportValue::Func(syscalls::___syscall122 as _), + ); import_object.set( "env", "___syscall140", ImportValue::Func(syscalls::___syscall140 as _), ); + import_object.set( + "env", + "___syscall142", + ImportValue::Func(syscalls::___syscall142 as _), + ); import_object.set( "env", "___syscall145", @@ -158,23 +216,28 @@ pub fn generate_emscripten_env<'a, 'b>() -> ImportObject<&'a str, &'b str> { ); import_object.set( "env", - "___syscall221", - ImportValue::Func(syscalls::___syscall221 as _), + "___syscall180", + ImportValue::Func(syscalls::___syscall180 as _), ); import_object.set( "env", - "___syscall20", - ImportValue::Func(syscalls::___syscall20 as _), + "___syscall181", + ImportValue::Func(syscalls::___syscall181 as _), ); import_object.set( "env", - "___syscall64", - ImportValue::Func(syscalls::___syscall64 as _), + "___syscall192", + ImportValue::Func(syscalls::___syscall192 as _), ); import_object.set( "env", - "___syscall122", - ImportValue::Func(syscalls::___syscall122 as _), + "___syscall195", + ImportValue::Func(syscalls::___syscall195 as _), + ); + import_object.set( + "env", + "___syscall197", + ImportValue::Func(syscalls::___syscall197 as _), ); import_object.set( "env", @@ -186,36 +249,6 @@ pub fn generate_emscripten_env<'a, 'b>() -> ImportObject<&'a str, &'b str> { "___syscall202", ImportValue::Func(syscalls::___syscall202 as _), ); - import_object.set( - "env", - "___syscall340", - ImportValue::Func(syscalls::___syscall340 as _), - ); - import_object.set( - "env", - "___syscall197", - ImportValue::Func(syscalls::___syscall197 as _), - ); - import_object.set( - "env", - "___syscall180", - ImportValue::Func(syscalls::___syscall180 as _), - ); - import_object.set( - "env", - "___syscall181", - ImportValue::Func(syscalls::___syscall181 as _), - ); - import_object.set( - "env", - "___syscall39", - ImportValue::Func(syscalls::___syscall39 as _), - ); - import_object.set( - "env", - "___syscall195", - ImportValue::Func(syscalls::___syscall195 as _), - ); import_object.set( "env", "___syscall212", @@ -228,40 +261,14 @@ pub fn generate_emscripten_env<'a, 'b>() -> ImportObject<&'a str, &'b str> { ); import_object.set( "env", - "___syscall102", - ImportValue::Func(syscalls::___syscall102 as _), + "___syscall330", + ImportValue::Func(syscalls::___syscall330 as _), ); import_object.set( "env", - "___syscall54", - ImportValue::Func(syscalls::___syscall54 as _), + "___syscall340", + ImportValue::Func(syscalls::___syscall340 as _), ); - import_object.set( - "env", - "___syscall12", - ImportValue::Func(syscalls::___syscall12 as _), - ); - import_object.set( - "env", - "___syscall192", - ImportValue::Func(syscalls::___syscall192 as _), - ); - import_object.set( - "env", - "___syscall63", - ImportValue::Func(syscalls::___syscall63 as _), - ); - import_object.set( - "env", - "___syscall142", - ImportValue::Func(syscalls::___syscall142 as _), - ); - import_object.set( - "env", - "___syscall57", - ImportValue::Func(syscalls::___syscall57 as _), - ); - // Process import_object.set("env", "abort", ImportValue::Func(process::em_abort as _)); import_object.set("env", "_abort", ImportValue::Func(process::_abort as _)); @@ -270,9 +277,15 @@ pub fn generate_emscripten_env<'a, 'b>() -> ImportObject<&'a str, &'b str> { "abortStackOverflow", ImportValue::Func(process::abort_stack_overflow as _), ); + import_object.set( + "env", + "_llvm_trap", + ImportValue::Func(process::_llvm_trap as _), + ); import_object.set("env", "_fork", ImportValue::Func(process::_fork as _)); import_object.set("env", "_exit", ImportValue::Func(process::_exit as _)); - + import_object.set("env", "_system", ImportValue::Func(process::_system as _)); + import_object.set("env", "_popen", ImportValue::Func(process::_popen as _)); // Signal import_object.set( "env", @@ -320,6 +333,22 @@ pub fn generate_emscripten_env<'a, 'b>() -> ImportObject<&'a str, &'b str> { "getTotalMemory", ImportValue::Func(memory::get_total_memory as _), ); + import_object.set( + "env", + "___map_file", + ImportValue::Func(memory::___map_file as _), + ); + // Exception + import_object.set( + "env", + "___cxa_allocate_exception", + ImportValue::Func(exception::___cxa_allocate_exception as _), + ); + import_object.set( + "env", + "___cxa_allocate_exception", + ImportValue::Func(exception::___cxa_throw as _), + ); // NullFuncs import_object.set( "env", @@ -366,6 +395,16 @@ pub fn generate_emscripten_env<'a, 'b>() -> ImportObject<&'a str, &'b str> { "nullFunc_viiii", ImportValue::Func(nullfunc::nullfunc_viiii as _), ); + import_object.set( + "env", + "nullFunc_viiiii", + ImportValue::Func(nullfunc::nullfunc_viiiii as _), + ); + import_object.set( + "env", + "nullFunc_viiiiii", + ImportValue::Func(nullfunc::nullfunc_viiiiii as _), + ); // Time import_object.set( "env", @@ -377,6 +416,21 @@ pub fn generate_emscripten_env<'a, 'b>() -> ImportObject<&'a str, &'b str> { "_clock_gettime", ImportValue::Func(time::_clock_gettime as _), ); + import_object.set( + "env", + "___clock_gettime", + ImportValue::Func(time::___clock_gettime as _), + ); + import_object.set( + "env", + "_clock", + ImportValue::Func(time::_clock as _), + ); + import_object.set( + "env", + "_difftime", + ImportValue::Func(time::_difftime as _), + ); import_object.set( "env", "_asctime", @@ -409,6 +463,11 @@ pub fn generate_emscripten_env<'a, 'b>() -> ImportObject<&'a str, &'b str> { "_sysconf", ImportValue::Func(env::_sysconf as _), ); + // Math + import_object.set("env", "_llvm_log10_f64", ImportValue::Func(math::_llvm_log10_f64 as _)); + import_object.set("env", "_llvm_log2_f64", ImportValue::Func(math::_llvm_log2_f64 as _)); + import_object.set("asm2wasm", "f64-rem", ImportValue::Func(math::f64_rem as _)); + mock_external!(import_object, _waitpid); mock_external!(import_object, _utimes); diff --git a/src/apis/emscripten/nullfunc.rs b/src/apis/emscripten/nullfunc.rs index 40351560b..6974b6dc1 100644 --- a/src/apis/emscripten/nullfunc.rs +++ b/src/apis/emscripten/nullfunc.rs @@ -45,3 +45,13 @@ pub extern "C" fn nullfunc_viiii(_x: u32, _instance: &Instance) { debug!("emscripten::nullfunc_viiii"); abort_with_message("Invalid function pointer called with signature 'viiii'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)"); } + +pub extern "C" fn nullfunc_viiiii(_x: u32, _instance: &Instance) { + debug!("emscripten::nullfunc_viiiii"); + abort_with_message("Invalid function pointer called with signature 'viiiii'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)"); +} + +pub extern "C" fn nullfunc_viiiiii(_x: u32, _instance: &Instance) { + debug!("emscripten::nullfunc_viiiiii"); + abort_with_message("Invalid function pointer called with signature 'viiiiii'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)"); +} diff --git a/src/apis/emscripten/process.rs b/src/apis/emscripten/process.rs index 09eeb4053..1bd1774c4 100644 --- a/src/apis/emscripten/process.rs +++ b/src/apis/emscripten/process.rs @@ -1,4 +1,4 @@ -use libc::{abort, c_char, pid_t, c_int, exit}; +use libc::{abort, c_char, pid_t, c_int, exit, EAGAIN}; use crate::webassembly::Instance; use std::ffi::CStr; @@ -48,3 +48,22 @@ pub extern "C" fn abort_stack_overflow() { // TODO: Message incomplete. Need to finish em runtime data first abort_with_message("Stack overflow! Attempted to allocate some bytes on the stack"); } + +pub extern "C" fn _llvm_trap() { + debug!("emscripten::_llvm_trap"); + abort_with_message("abort!"); +} + +pub extern "C" fn _system() -> c_int { + debug!("emscripten::_system"); + // TODO: May need to change this Em impl to a working version + eprintln!("Can't call external programs"); + return EAGAIN; +} + +pub extern "C" fn _popen() -> c_int { + debug!("emscripten::_popen"); + // TODO: May need to change this Em impl to a working version + eprintln!("Missing function: popen"); + unsafe { abort(); } +} diff --git a/src/apis/emscripten/syscalls.rs b/src/apis/emscripten/syscalls.rs index eb379eb77..0661a48c8 100644 --- a/src/apis/emscripten/syscalls.rs +++ b/src/apis/emscripten/syscalls.rs @@ -63,9 +63,21 @@ use libc::{ SOL_SOCKET, TIOCGWINSZ, // ENOTTY, - c_char + c_char, + rusage, + rmdir, + EINVAL, + fcntl, + F_SETFD, + F_GETFD, }; -// use std::sys::fd::FileDesc; + +// Linking to functions that are provided by rust libc +#[cfg(target_os = "macos")] +#[link(name = "c")] +extern { + pub fn wait4(pid: pid_t, status: *mut c_int, options: c_int, rusage: *mut rusage) -> pid_t; +} // Another conditional constant for name resolution: Macos et iOS use // SO_NOSIGPIPE as a setsockopt flag to disable SIGPIPE emission on socket. @@ -181,15 +193,19 @@ pub extern "C" fn ___syscall39( let pathname: u32 = varargs.get(instance); let mode: u32 = varargs.get(instance); let pathname_addr = instance.memory_offset_addr(0, pathname as usize) as *const i8; - - unsafe { mkdir(pathname_addr, mode as _) }; - 0 + unsafe { mkdir(pathname_addr, mode as _) } } -// getppid -pub extern "C" fn ___syscall64() -> pid_t { - debug!("emscripten::___syscall64 (getppid)"); - unsafe { getpid() } +// rmdir +pub extern "C" fn ___syscall40( + _which: c_int, + mut varargs: VarArgs, + instance: &mut Instance, +) -> c_int { + debug!("emscripten::___syscall40 (rmdir)"); + let pathname: u32 = varargs.get(instance); + let pathname_addr = instance.memory_offset_addr(0, pathname as usize) as *const i8; + unsafe { rmdir(pathname_addr) } } /// ioctl @@ -234,6 +250,40 @@ pub extern "C" fn ___syscall54( } } +// setpgid +pub extern "C" fn ___syscall57( + _which: c_int, + mut varargs: VarArgs, + instance: &mut Instance, +) -> c_int { + debug!("emscripten::___syscall57 (setpgid)"); + let pid: i32 = varargs.get(instance); + let pgid: i32 = varargs.get(instance); + unsafe { + setpgid(pid, pgid) + } +} + +// dup2 +pub extern "C" fn ___syscall63( + _which: c_int, + mut varargs: VarArgs, + instance: &mut Instance, +) -> c_int { + debug!("emscripten::___syscall63 (dup2)"); + + let src: i32 = varargs.get(instance); + let dst: i32 = varargs.get(instance); + + unsafe { dup2(src, dst) } +} + +// getppid +pub extern "C" fn ___syscall64() -> pid_t { + debug!("emscripten::___syscall64 (getppid)"); + unsafe { getpid() } +} + // socketcall pub extern "C" fn ___syscall102( _which: c_int, @@ -365,7 +415,7 @@ pub extern "C" fn ___syscall102( let fd = unsafe { accept(socket, address, address_len_addr) }; - unsafe { + unsafe { let address_linux = instance.memory_offset_addr(0, address_addr as usize) as *mut LinuxSockAddr; (*address_linux).sa_family = (*address).sa_family as u16; (*address_linux).sa_data = (*address).sa_data; @@ -503,6 +553,27 @@ pub extern "C" fn ___syscall102( } } +/// wait4 +pub extern "C" fn ___syscall114( + _which: c_int, + mut varargs: VarArgs, + instance: &mut Instance, +) -> pid_t { + debug!("emscripten::___syscall114 (wait4)"); + let pid: pid_t = varargs.get(instance); + let status: u32 = varargs.get(instance); + let options: c_int = varargs.get(instance); + let rusage: u32 = varargs.get(instance); + let status_addr = instance.memory_offset_addr(0, status as usize) as *mut c_int; + let rusage_addr = instance.memory_offset_addr(0, rusage as usize) as *mut rusage; + let res = unsafe { wait4(pid, status_addr, options, rusage_addr) }; + debug!( + "=> pid: {}, status: {:?}, options: {}, rusage: {:?} = pid: {}", + pid, status_addr, options, rusage_addr, res + ); + res +} + /// uname // NOTE: Wondering if we should return custom utsname, like Emscripten. pub extern "C" fn ___syscall122( @@ -517,6 +588,29 @@ pub extern "C" fn ___syscall122( unsafe { uname(buf_addr) } } +// select +pub extern "C" fn ___syscall142( + _which: c_int, + mut varargs: VarArgs, + instance: &mut Instance, +) -> c_int { + debug!("emscripten::___syscall142 (newselect)"); + + let nfds: i32 = varargs.get(instance); + let readfds: u32 = varargs.get(instance); + let writefds: u32 = varargs.get(instance); + let exceptfds: u32 = varargs.get(instance); + let _timeout: i32 = varargs.get(instance); + + assert!(nfds <= 64, "`nfds` must be less than or equal to 64"); + assert!(exceptfds == 0, "`exceptfds` is not supporrted"); + + let readfds_ptr = instance.memory_offset_addr(0, readfds as _) as _; + let writefds_ptr = instance.memory_offset_addr(0, writefds as _) as _; + + unsafe { select(nfds, readfds_ptr, writefds_ptr, 0 as _, 0 as _) } +} + // mmap2 pub extern "C" fn ___syscall192( _which: c_int, @@ -798,6 +892,42 @@ pub extern "C" fn ___syscall221( } } +/// dup3 +pub extern "C" fn ___syscall330( + _which: c_int, + mut varargs: VarArgs, + instance: &mut Instance, +) -> pid_t { + // Implementation based on description at https://linux.die.net/man/2/dup3 + debug!("emscripten::___syscall330 (dup3)"); + let oldfd: c_int = varargs.get(instance); + let newfd: c_int = varargs.get(instance); + let flags: c_int = varargs.get(instance); + + if oldfd == newfd { + return EINVAL; + } + + let res = unsafe { dup2(oldfd, newfd) }; + + // Set flags on newfd (https://www.gnu.org/software/libc/manual/html_node/Descriptor-Flags.html) + let mut old_flags = unsafe { fcntl (newfd, F_GETFD, 0) }; + + if old_flags > 0 { + old_flags |= flags; + } else if old_flags == 0 { + old_flags &= !flags; + } + + unsafe { fcntl (newfd, F_SETFD, old_flags); } + + debug!( + "=> oldfd: {}, newfd: {}, flags: {} = pid: {}", + oldfd, newfd, flags, res + ); + res +} + // prlimit64 pub extern "C" fn ___syscall340( _which: c_int, @@ -824,54 +954,3 @@ pub extern "C" fn ___syscall340( 0 } - -// dup2 -pub extern "C" fn ___syscall63( - _which: c_int, - mut varargs: VarArgs, - instance: &mut Instance, -) -> c_int { - debug!("emscripten::___syscall63 (dup2)"); - - let src: i32 = varargs.get(instance); - let dst: i32 = varargs.get(instance); - - unsafe { dup2(src, dst) } -} - -// select -pub extern "C" fn ___syscall142( - _which: c_int, - mut varargs: VarArgs, - instance: &mut Instance, -) -> c_int { - debug!("emscripten::___syscall142 (newselect)"); - - let nfds: i32 = varargs.get(instance); - let readfds: u32 = varargs.get(instance); - let writefds: u32 = varargs.get(instance); - let exceptfds: u32 = varargs.get(instance); - let _timeout: i32 = varargs.get(instance); - - assert!(nfds <= 64, "`nfds` must be less than or equal to 64"); - assert!(exceptfds == 0, "`exceptfds` is not supporrted"); - - let readfds_ptr = instance.memory_offset_addr(0, readfds as _) as _; - let writefds_ptr = instance.memory_offset_addr(0, writefds as _) as _; - - unsafe { select(nfds, readfds_ptr, writefds_ptr, 0 as _, 0 as _) } -} - -// setpgid -pub extern "C" fn ___syscall57( - _which: c_int, - mut varargs: VarArgs, - instance: &mut Instance, -) -> c_int { - debug!("emscripten::___syscall57 (setpgid)"); - let pid: i32 = varargs.get(instance); - let pgid: i32 = varargs.get(instance); - unsafe { - setpgid(pid, pgid) - } -} diff --git a/src/apis/emscripten/time.rs b/src/apis/emscripten/time.rs index 0395646a5..2b4ca5a46 100644 --- a/src/apis/emscripten/time.rs +++ b/src/apis/emscripten/time.rs @@ -66,6 +66,24 @@ pub extern "C" fn _clock_gettime(clk_id: c_int, tp: c_int, instance: &mut Instan 0 } +/// emscripten: ___clock_gettime +pub extern "C" fn ___clock_gettime(clk_id: c_int, tp: c_int, instance: &mut Instance) -> c_int { + debug!("emscripten::___clock_gettime {} {}", clk_id, tp); + _clock_gettime(clk_id, tp, instance) +} + +/// emscripten: _clock +pub extern "C" fn _clock() -> c_int { + debug!("emscripten::_clock"); + 0 // TODO: unimplemented +} + +/// emscripten: _difftime +pub extern "C" fn _difftime(t0: u32, t1: u32) -> c_int { + debug!("emscripten::_difftime"); + (t0 - t1) as _ +} + #[repr(C)] struct guest_tm { pub tm_sec: c_int, // 0 diff --git a/src/apis/emscripten/utils.rs b/src/apis/emscripten/utils.rs index 1a748cc6b..fd03b05f2 100644 --- a/src/apis/emscripten/utils.rs +++ b/src/apis/emscripten/utils.rs @@ -17,7 +17,7 @@ pub fn is_emscripten_module(module: &Module) -> bool { false } -pub unsafe fn write_to_buf(string: *const c_char, buf: u32, max: u32, instance: &Instance) -> u32 { +pub fn write_to_buf(string: *const c_char, buf: u32, max: u32, instance: &Instance) -> u32 { let buf_addr = instance.memory_offset_addr(0, buf as _) as *mut c_char; unsafe { diff --git a/src/emtests/syscalls.rs b/src/emtests/syscalls.rs new file mode 100644 index 000000000..e69de29bb From 38bd62be4d11782475ce6947859654eb1d4d3e6d Mon Sep 17 00:00:00 2001 From: Syrus Date: Tue, 11 Dec 2018 22:10:35 -0800 Subject: [PATCH 03/38] Trying to make it work --- src/apis/emscripten/env.rs | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/apis/emscripten/env.rs b/src/apis/emscripten/env.rs index 02a9a5853..7e0be6f11 100644 --- a/src/apis/emscripten/env.rs +++ b/src/apis/emscripten/env.rs @@ -5,7 +5,7 @@ use std::ffi::CStr; use std::mem; use std::os::raw::c_char; -use super::utils::{copy_cstr_into_wasm, copy_terminated_array_of_cstrs}; +use super::utils::{copy_cstr_into_wasm, copy_terminated_array_of_cstrs, allocate_on_stack}; use crate::webassembly::Instance; /// emscripten: _getenv @@ -102,8 +102,27 @@ pub extern "C" fn _getpagesize() -> u32 { 16384 } -pub extern "C" fn ___build_environment(environ: c_int) { +pub extern "C" fn ___build_environment(environ: c_int, instance: &mut Instance) { debug!("emscripten::___build_environment {}", environ); + const MAX_ENV_VALUES: u32 = 64; + const TOTAL_ENV_SIZE: u32 = 1024; + let mut environment = + instance.memory_offset_addr(0, environ as _) as *mut c_int; + unsafe { + let (pool_offset, pool_slice): (u32, &mut [u8]) = allocate_on_stack(TOTAL_ENV_SIZE as u32, instance); + let (env_offset, env_slice): (u32, &mut [u8]) = allocate_on_stack((MAX_ENV_VALUES*4) as u32, instance); + let mut env_ptr = + instance.memory_offset_addr(0, env_offset as _) as *mut c_int; + let mut pool_ptr = + instance.memory_offset_addr(0, pool_offset as _) as *mut c_int; + *env_ptr = pool_offset as i32; + *environment = env_offset as i32; + + // *env_ptr = 0; + }; + // unsafe { + // *env_ptr = 0; + // }; } pub extern "C" fn _sysconf(name: c_int, _instance: &mut Instance) -> c_long { From 05aa3bc62afb41ca47b0a86b73b1cc2a9448e930 Mon Sep 17 00:00:00 2001 From: Steve Akinyemi Date: Fri, 14 Dec 2018 00:09:07 +0100 Subject: [PATCH 04/38] Fixing get_env --- src/apis/emscripten/env.rs | 16 ++++++++++++---- src/apis/emscripten/linking.rs | 27 +++++++++++++++++++++++++++ src/apis/emscripten/mod.rs | 11 ++++++++++- src/apis/emscripten/syscalls.rs | 2 +- src/apis/emscripten/time.rs | 4 ++-- src/apis/emscripten/utils.rs | 5 +++++ 6 files changed, 57 insertions(+), 8 deletions(-) create mode 100644 src/apis/emscripten/linking.rs diff --git a/src/apis/emscripten/env.rs b/src/apis/emscripten/env.rs index 02a9a5853..00931b49d 100644 --- a/src/apis/emscripten/env.rs +++ b/src/apis/emscripten/env.rs @@ -8,16 +8,24 @@ use std::os::raw::c_char; use super::utils::{copy_cstr_into_wasm, copy_terminated_array_of_cstrs}; use crate::webassembly::Instance; -/// emscripten: _getenv -pub extern "C" fn _getenv(name_ptr: c_int, instance: &mut Instance) -> c_int { +/// emscripten: _getenv // (name: *const char) -> *const c_char; +pub extern "C" fn _getenv(name_ptr: c_int, instance: &mut Instance) -> u32 { debug!("emscripten::_getenv {}", name_ptr); let name = unsafe { let memory_name_ptr = instance.memory_offset_addr(0, name_ptr as usize) as *const c_char; CStr::from_ptr(memory_name_ptr).to_str().unwrap() }; match host::get_env(name, instance) { - Ok(_) => { - unimplemented!(); + Ok(env_value) => { + // Append null byte + let env_value = env_value + "\0"; + let env_value_ptr = env_value.as_ptr() as *mut c_char; + let res = unsafe { copy_cstr_into_wasm(instance, env_value_ptr) }; + // Test + let c_str = instance.memory_offset_addr(0, res as _) as *mut i8; + use std::ffi::CStr; + debug!("#### cstr = {:?}", unsafe { CStr::from_ptr(c_str) }); + res } Err(_) => 0, } diff --git a/src/apis/emscripten/linking.rs b/src/apis/emscripten/linking.rs new file mode 100644 index 000000000..32f85ee7a --- /dev/null +++ b/src/apis/emscripten/linking.rs @@ -0,0 +1,27 @@ +use crate::webassembly::Instance; + +// TODO: Need to implement. + +/// emscripten: dlopen(filename: *const c_char, flag: c_int) -> *mut c_void +pub extern "C" fn _dlopen(filename: u32, flag: c_int) -> u32 { + debug!("emscripten::_dlopen"); + -1 +} + +/// emscripten: dlclose(handle: *mut c_void) -> c_int +pub extern "C" fn _dlclose(filename: u32) -> u32 { + debug!("emscripten::_dlclose"); + -1 +} + +/// emscripten: dlsym(handle: *mut c_void, symbol: *const c_char) -> *mut c_void +pub extern "C" fn _dlsym(filepath: u32, symbol: u32) -> u32 { + debug!("emscripten::_dlerror"); + -1 +} + +/// emscripten: dlerror() -> *mut c_char +pub extern "C" fn _dlerror() -> u32 { + debug!("emscripten::_dlerror"); + -1 +} diff --git a/src/apis/emscripten/mod.rs b/src/apis/emscripten/mod.rs index 0c23ae302..1375438ad 100644 --- a/src/apis/emscripten/mod.rs +++ b/src/apis/emscripten/mod.rs @@ -349,6 +349,11 @@ pub fn generate_emscripten_env<'a, 'b>() -> ImportObject<&'a str, &'b str> { "___cxa_allocate_exception", ImportValue::Func(exception::___cxa_throw as _), ); + import_object.set( + "env", + "___cxa_throw", + ImportValue::Func(exception::___cxa_throw as _), + ); // NullFuncs import_object.set( "env", @@ -511,7 +516,7 @@ pub fn generate_emscripten_env<'a, 'b>() -> ImportObject<&'a str, &'b str> { mock_external!(import_object, ___syscall66); // mock_external!(import_object, ___syscall64); // mock_external!(import_object, ___syscall63); - mock_external!(import_object, ___syscall60); + // mock_external!(import_object, ___syscall60); // mock_external!(import_object, ___syscall54); // mock_external!(import_object, ___syscall39); mock_external!(import_object, ___syscall38); @@ -543,6 +548,10 @@ pub fn generate_emscripten_env<'a, 'b>() -> ImportObject<&'a str, &'b str> { // mock_external!(import_object, ___syscall20); mock_external!(import_object, ___syscall15); mock_external!(import_object, ___syscall10); + mock_external!(import_object, _dlopen); + mock_external!(import_object, _dlclose); + mock_external!(import_object, _dlsym); + mock_external!(import_object, _dlerror); import_object } diff --git a/src/apis/emscripten/syscalls.rs b/src/apis/emscripten/syscalls.rs index 0661a48c8..220815e0d 100644 --- a/src/apis/emscripten/syscalls.rs +++ b/src/apis/emscripten/syscalls.rs @@ -72,7 +72,7 @@ use libc::{ F_GETFD, }; -// Linking to functions that are provided by rust libc +// Linking to functions that are not provided by rust libc #[cfg(target_os = "macos")] #[link(name = "c")] extern { diff --git a/src/apis/emscripten/time.rs b/src/apis/emscripten/time.rs index 2b4ca5a46..7a51a923d 100644 --- a/src/apis/emscripten/time.rs +++ b/src/apis/emscripten/time.rs @@ -135,7 +135,7 @@ pub extern "C" fn _asctime(time: u32, instance: &mut Instance) -> u32 { let time_str_ptr = fmt_time(time, instance); copy_cstr_into_wasm(instance, time_str_ptr) - // let c_str = instance.memory_offset_addr(0, time_str_offset as _) as *mut i8; + // let c_str = instance.memory_offset_addr(0, res as _) as *mut i8; // use std::ffi::CStr; // debug!("#### cstr = {:?}", CStr::from_ptr(c_str)); } @@ -153,7 +153,7 @@ pub extern "C" fn _asctime_r(time: u32, buf: u32, instance: &mut Instance) -> u3 let time_str_ptr = fmt_time(time, instance); write_to_buf(time_str_ptr, buf, 26, instance) - // let c_str = instance.memory_offset_addr(0, time_str_offset as _) as *mut i8; + // let c_str = instance.memory_offset_addr(0, res as _) as *mut i8; // use std::ffi::CStr; // debug!("#### cstr = {:?}", CStr::from_ptr(c_str)); } diff --git a/src/apis/emscripten/utils.rs b/src/apis/emscripten/utils.rs index fd03b05f2..93e1a717e 100644 --- a/src/apis/emscripten/utils.rs +++ b/src/apis/emscripten/utils.rs @@ -29,20 +29,25 @@ pub fn write_to_buf(string: *const c_char, buf: u32, max: u32, instance: &Instan buf } +/// This function expects nullbyte to be appended. pub unsafe fn copy_cstr_into_wasm(instance: &mut Instance, cstr: *const c_char) -> u32 { let s = CStr::from_ptr(cstr).to_str().unwrap(); let cstr_len = s.len(); + debug!("### 1!"); let space_offset = (instance.emscripten_data.as_ref().unwrap().malloc)((cstr_len as i32) + 1, instance); + debug!("### 2!"); let raw_memory = instance.memory_offset_addr(0, space_offset as _) as *mut u8; let slice = slice::from_raw_parts_mut(raw_memory, cstr_len); for (byte, loc) in s.bytes().zip(slice.iter_mut()) { *loc = byte; } + debug!("### KABOOM 10!"); // TODO: Appending null byte won't work, because there is CStr::from_ptr(cstr) // at the top that crashes when there is no null byte *raw_memory.add(cstr_len) = 0; + debug!("### KABOOM 15!"); space_offset } From a2bd8d170fb5a4e140f35c268e0bb0893af8a40f Mon Sep 17 00:00:00 2001 From: Steve Akinyemi Date: Mon, 17 Dec 2018 09:15:08 +0100 Subject: [PATCH 05/38] Remove debug prints --- src/apis/emscripten/env.rs | 10 ++++++---- src/apis/emscripten/utils.rs | 4 ---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/apis/emscripten/env.rs b/src/apis/emscripten/env.rs index 00931b49d..7826b3020 100644 --- a/src/apis/emscripten/env.rs +++ b/src/apis/emscripten/env.rs @@ -8,12 +8,13 @@ use std::os::raw::c_char; use super::utils::{copy_cstr_into_wasm, copy_terminated_array_of_cstrs}; use crate::webassembly::Instance; +#[no_mangle] /// emscripten: _getenv // (name: *const char) -> *const c_char; -pub extern "C" fn _getenv(name_ptr: c_int, instance: &mut Instance) -> u32 { - debug!("emscripten::_getenv {}", name_ptr); +pub extern "C" fn _getenv(name: c_int, instance: &mut Instance) -> u32 { + debug!("emscripten::_getenv {}", name); let name = unsafe { - let memory_name_ptr = instance.memory_offset_addr(0, name_ptr as usize) as *const c_char; - CStr::from_ptr(memory_name_ptr).to_str().unwrap() + let name_addr = instance.memory_offset_addr(0, name as usize) as *const c_char; + CStr::from_ptr(name_addr).to_str().unwrap() }; match host::get_env(name, instance) { Ok(env_value) => { @@ -25,6 +26,7 @@ pub extern "C" fn _getenv(name_ptr: c_int, instance: &mut Instance) -> u32 { let c_str = instance.memory_offset_addr(0, res as _) as *mut i8; use std::ffi::CStr; debug!("#### cstr = {:?}", unsafe { CStr::from_ptr(c_str) }); + debug!("res = {}", res); res } Err(_) => 0, diff --git a/src/apis/emscripten/utils.rs b/src/apis/emscripten/utils.rs index 93e1a717e..eae2cc7c6 100644 --- a/src/apis/emscripten/utils.rs +++ b/src/apis/emscripten/utils.rs @@ -33,21 +33,17 @@ pub fn write_to_buf(string: *const c_char, buf: u32, max: u32, instance: &Instan pub unsafe fn copy_cstr_into_wasm(instance: &mut Instance, cstr: *const c_char) -> u32 { let s = CStr::from_ptr(cstr).to_str().unwrap(); let cstr_len = s.len(); - debug!("### 1!"); let space_offset = (instance.emscripten_data.as_ref().unwrap().malloc)((cstr_len as i32) + 1, instance); - debug!("### 2!"); let raw_memory = instance.memory_offset_addr(0, space_offset as _) as *mut u8; let slice = slice::from_raw_parts_mut(raw_memory, cstr_len); for (byte, loc) in s.bytes().zip(slice.iter_mut()) { *loc = byte; } - debug!("### KABOOM 10!"); // TODO: Appending null byte won't work, because there is CStr::from_ptr(cstr) // at the top that crashes when there is no null byte *raw_memory.add(cstr_len) = 0; - debug!("### KABOOM 15!"); space_offset } From ac87344013df81caf66d74562b8dcc779e9bdfa0 Mon Sep 17 00:00:00 2001 From: Brandon Fish Date: Mon, 17 Dec 2018 21:21:15 -0600 Subject: [PATCH 06/38] Add emscripten nullfunc_v (#65) --- src/apis/emscripten/mod.rs | 5 +++++ src/apis/emscripten/nullfunc.rs | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/src/apis/emscripten/mod.rs b/src/apis/emscripten/mod.rs index f1520c9d9..f25b3d718 100644 --- a/src/apis/emscripten/mod.rs +++ b/src/apis/emscripten/mod.rs @@ -355,6 +355,11 @@ pub fn generate_emscripten_env<'a, 'b>() -> ImportObject<&'a str, &'b str> { "nullFunc_iiiiii", ImportValue::Func(nullfunc::nullfunc_iiiiii as _), ); + import_object.set( + "env", + "nullFunc_v", + ImportValue::Func(nullfunc::nullfunc_v as _), + ); import_object.set( "env", "nullFunc_vi", diff --git a/src/apis/emscripten/nullfunc.rs b/src/apis/emscripten/nullfunc.rs index 40351560b..2f6bced33 100644 --- a/src/apis/emscripten/nullfunc.rs +++ b/src/apis/emscripten/nullfunc.rs @@ -26,6 +26,11 @@ pub extern "C" fn nullfunc_iiiiii(_x: u32, _instance: &Instance) { abort_with_message("Invalid function pointer called with signature 'iiiiii'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)"); } +pub extern "C" fn nullfunc_v(_x: u32, _instance: &Instance) { + debug!("emscripten::nullfunc_v"); + abort_with_message("Invalid function pointer called with signature 'v'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)"); +} + pub extern "C" fn nullfunc_vi(_x: u32, _instance: &Instance) { debug!("emscripten::nullfunc_vi"); abort_with_message("Invalid function pointer called with signature 'vi'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)"); From 5d6255ccd27bbde989d5e20a8fb10cc19d1ad5db Mon Sep 17 00:00:00 2001 From: Brandon Fish Date: Mon, 17 Dec 2018 23:12:55 -0600 Subject: [PATCH 07/38] Remove cranestation submodule --- .gitmodules | 4 ---- cranelift | 1 - 2 files changed, 5 deletions(-) delete mode 100644 .gitmodules delete mode 160000 cranelift diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 692ee78b7..000000000 --- a/.gitmodules +++ /dev/null @@ -1,4 +0,0 @@ -[submodule "cranelift"] - path = cranelift - url = https://github.com/wasmerio/cranelift.git - fetchrecursesubmodules = true diff --git a/cranelift b/cranelift deleted file mode 160000 index cb62a1ead..000000000 --- a/cranelift +++ /dev/null @@ -1 +0,0 @@ -Subproject commit cb62a1ead2c5346ccb0f1224ecae5939ac064f87 From 1e3063f58ec73c7ff99e2d3fcb2aa89c59add520 Mon Sep 17 00:00:00 2001 From: Brandon Fish Date: Mon, 17 Dec 2018 23:13:23 -0600 Subject: [PATCH 08/38] Update CI and README for submodule removal --- .circleci/config.yml | 18 ------------------ README.md | 4 ++-- 2 files changed, 2 insertions(+), 20 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 83fce63ea..0789ddcc3 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -7,12 +7,6 @@ jobs: steps: - checkout - - run: - name: Pull submodules - command: | - # git pull --recurse-submodules - git submodule sync --recursive - git submodule update --recursive --init - restore_cache: keys: - v4-test-cargo-cache-linux-{{ arch }}-{{ checksum "Cargo.lock" }} @@ -34,12 +28,6 @@ jobs: steps: - checkout - - run: - name: Pull submodules - command: | - # git pull --recurse-submodules - git submodule sync --recursive - git submodule update --recursive --init - restore_cache: keys: - v4-cargo-cache-linux-{{ arch }}-{{ checksum "Cargo.lock" }} @@ -82,12 +70,6 @@ jobs: steps: - checkout - - run: - name: Pull submodules - command: | - # git pull --recurse-submodules - git submodule sync --recursive - git submodule update --recursive --init - restore_cache: keys: - v4-cargo-cache-darwin-{{ arch }}-{{ checksum "Cargo.lock" }} diff --git a/README.md b/README.md index 45fea319a..215d05c89 100644 --- a/README.md +++ b/README.md @@ -31,8 +31,8 @@ wasmer run examples/nginx/nginx.wasm -- -p examples/nginx -c nginx.conf To build this project you will need Rust and Cargo. ```sh -# checkout code and associated submodules -git clone --recursive https://github.com/wasmerio/wasmer.git +# checkout code +git clone https://github.com/wasmerio/wasmer.git cd wasmer # install tools From fd94c2df866493150f0f76949dbe6549c685ed57 Mon Sep 17 00:00:00 2001 From: Brandon Fish Date: Mon, 17 Dec 2018 23:54:00 -0600 Subject: [PATCH 09/38] Add more argument info to debug messages --- src/apis/emscripten/errno.rs | 2 +- src/apis/emscripten/io.rs | 2 +- src/apis/emscripten/lock.rs | 8 +-- src/apis/emscripten/memory.rs | 5 +- src/apis/emscripten/nullfunc.rs | 40 +++++++------- src/apis/emscripten/process.rs | 4 +- src/apis/emscripten/signal.rs | 11 ++-- src/apis/emscripten/syscalls.rs | 96 ++++++++++++++++----------------- src/apis/emscripten/time.rs | 2 +- 9 files changed, 84 insertions(+), 86 deletions(-) diff --git a/src/apis/emscripten/errno.rs b/src/apis/emscripten/errno.rs index 02d76b050..9787ea85b 100644 --- a/src/apis/emscripten/errno.rs +++ b/src/apis/emscripten/errno.rs @@ -1,7 +1,7 @@ // use std::collections::HashMap; pub extern "C" fn ___seterrno(value: i32) -> i32 { - debug!("emscripten::___seterrno"); + debug!("emscripten::___seterrno {}", value); // TODO: Incomplete impl eprintln!("failed to set errno!"); value diff --git a/src/apis/emscripten/io.rs b/src/apis/emscripten/io.rs index c827902f3..5beaeb91e 100644 --- a/src/apis/emscripten/io.rs +++ b/src/apis/emscripten/io.rs @@ -7,7 +7,7 @@ pub use libc::putchar; /// printf pub extern "C" fn printf(memory_offset: i32, extra: i32, instance: &Instance) -> i32 { - debug!("emscripten::printf"); + debug!("emscripten::printf {}, {}", memory_offset, extra); unsafe { let addr = instance.memory_offset_addr(0, memory_offset as _) as _; _printf(addr, extra) diff --git a/src/apis/emscripten/lock.rs b/src/apis/emscripten/lock.rs index 9067be99e..ea875fcca 100644 --- a/src/apis/emscripten/lock.rs +++ b/src/apis/emscripten/lock.rs @@ -2,11 +2,11 @@ use crate::webassembly::Instance; use libc::c_int; // NOTE: Not implemented by Emscripten -pub extern "C" fn ___lock(_which: c_int, _varargs: c_int, _instance: &mut Instance) { - debug!("emscripten::___lock"); +pub extern "C" fn ___lock(which: c_int, varargs: c_int, _instance: &mut Instance) { + debug!("emscripten::___lock {}, {}", which, varargs); } // NOTE: Not implemented by Emscripten -pub extern "C" fn ___unlock(_which: c_int, _varargs: c_int, _instance: &mut Instance) { - debug!("emscripten::___unlock"); +pub extern "C" fn ___unlock(which: c_int, varargs: c_int, _instance: &mut Instance) { + debug!("emscripten::___unlock {}, {}", which, varargs); } diff --git a/src/apis/emscripten/memory.rs b/src/apis/emscripten/memory.rs index 4caf652bc..73c4fd510 100644 --- a/src/apis/emscripten/memory.rs +++ b/src/apis/emscripten/memory.rs @@ -9,7 +9,10 @@ pub extern "C" fn _emscripten_memcpy_big( len: u32, instance: &mut Instance, ) -> u32 { - debug!("emscripten::_emscripten_memcpy_big"); + debug!( + "emscripten::_emscripten_memcpy_big {}, {}, {}", + dest, src, len + ); let dest_addr = instance.memory_offset_addr(0, dest as usize) as *mut c_void; let src_addr = instance.memory_offset_addr(0, src as usize) as *mut c_void; unsafe { diff --git a/src/apis/emscripten/nullfunc.rs b/src/apis/emscripten/nullfunc.rs index 2f6bced33..6d89d0ab6 100644 --- a/src/apis/emscripten/nullfunc.rs +++ b/src/apis/emscripten/nullfunc.rs @@ -1,52 +1,52 @@ use super::process::abort_with_message; use crate::webassembly::Instance; -pub extern "C" fn nullfunc_ii(_x: u32, _instance: &Instance) { - debug!("emscripten::nullfunc_ii"); +pub extern "C" fn nullfunc_ii(x: u32, _instance: &Instance) { + debug!("emscripten::nullfunc_ii {}", x); abort_with_message("Invalid function pointer called with signature 'ii'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)"); } -pub extern "C" fn nullfunc_iii(_x: u32, _instance: &Instance) { - debug!("emscripten::nullfunc_iii"); +pub extern "C" fn nullfunc_iii(x: u32, _instance: &Instance) { + debug!("emscripten::nullfunc_iii {}", x); abort_with_message("Invalid function pointer called with signature 'iii'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)"); } -pub extern "C" fn nullfunc_iiii(_x: u32, _instance: &Instance) { - debug!("emscripten::nullfunc_iiii"); +pub extern "C" fn nullfunc_iiii(x: u32, _instance: &Instance) { + debug!("emscripten::nullfunc_iiii {}", x); abort_with_message("Invalid function pointer called with signature 'iiii'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)"); } -pub extern "C" fn nullfunc_iiiii(_x: u32, _instance: &Instance) { - debug!("emscripten::nullfunc_iiiii"); +pub extern "C" fn nullfunc_iiiii(x: u32, _instance: &Instance) { + debug!("emscripten::nullfunc_iiiii {}", x); abort_with_message("Invalid function pointer called with signature 'iiiii'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)"); } -pub extern "C" fn nullfunc_iiiiii(_x: u32, _instance: &Instance) { - debug!("emscripten::nullfunc_iiiiii"); +pub extern "C" fn nullfunc_iiiiii(x: u32, _instance: &Instance) { + debug!("emscripten::nullfunc_iiiiii {}", x); abort_with_message("Invalid function pointer called with signature 'iiiiii'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)"); } -pub extern "C" fn nullfunc_v(_x: u32, _instance: &Instance) { - debug!("emscripten::nullfunc_v"); +pub extern "C" fn nullfunc_v(x: u32, _instance: &Instance) { + debug!("emscripten::nullfunc_v {}", x); abort_with_message("Invalid function pointer called with signature 'v'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)"); } -pub extern "C" fn nullfunc_vi(_x: u32, _instance: &Instance) { - debug!("emscripten::nullfunc_vi"); +pub extern "C" fn nullfunc_vi(x: u32, _instance: &Instance) { + debug!("emscripten::nullfunc_vi {}", x); abort_with_message("Invalid function pointer called with signature 'vi'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)"); } -pub extern "C" fn nullfunc_vii(_x: u32, _instance: &Instance) { - debug!("emscripten::nullfunc_vii"); +pub extern "C" fn nullfunc_vii(x: u32, _instance: &Instance) { + debug!("emscripten::nullfunc_vii {}", x); abort_with_message("Invalid function pointer called with signature 'vii'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)"); } -pub extern "C" fn nullfunc_viii(_x: u32, _instance: &Instance) { - debug!("emscripten::nullfunc_viii"); +pub extern "C" fn nullfunc_viii(x: u32, _instance: &Instance) { + debug!("emscripten::nullfunc_viii {}", x); abort_with_message("Invalid function pointer called with signature 'viii'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)"); } -pub extern "C" fn nullfunc_viiii(_x: u32, _instance: &Instance) { - debug!("emscripten::nullfunc_viiii"); +pub extern "C" fn nullfunc_viiii(x: u32, _instance: &Instance) { + debug!("emscripten::nullfunc_viiii {}", x); abort_with_message("Invalid function pointer called with signature 'viiii'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this)"); } diff --git a/src/apis/emscripten/process.rs b/src/apis/emscripten/process.rs index cfb4f70ec..55b8e7b53 100644 --- a/src/apis/emscripten/process.rs +++ b/src/apis/emscripten/process.rs @@ -25,12 +25,12 @@ pub extern "C" fn _fork(_instance: &mut Instance) -> pid_t { } pub extern "C" fn _exit(status: c_int, _instance: &mut Instance) -> ! { - debug!("emscripten::_exit"); + debug!("emscripten::_exit {}", status); unsafe { exit(status) } } pub extern "C" fn em_abort(message: u32, instance: &mut Instance) { - debug!("emscripten::em_abort"); + debug!("emscripten::em_abort {}", message); let message_addr = instance.memory_offset_addr(0, message as usize) as *mut c_char; unsafe { let message = CStr::from_ptr(message_addr) diff --git a/src/apis/emscripten/signal.rs b/src/apis/emscripten/signal.rs index 56ab66180..844e75397 100644 --- a/src/apis/emscripten/signal.rs +++ b/src/apis/emscripten/signal.rs @@ -10,18 +10,13 @@ pub extern "C" fn _sigemptyset(set: u32, instance: &mut Instance) -> i32 { 0 } -pub extern "C" fn _sigaction( - _signum: u32, - _act: u32, - _oldact: u32, - _instance: &mut Instance, -) -> i32 { - debug!("emscripten::_sigaction"); +pub extern "C" fn _sigaction(signum: u32, act: u32, oldact: u32, _instance: &mut Instance) -> i32 { + debug!("emscripten::_sigaction {}, {}, {}", signum, act, oldact); 0 } pub extern "C" fn _sigaddset(set: u32, signum: u32, instance: &mut Instance) -> i32 { - debug!("emscripten::_sigaddset"); + debug!("emscripten::_sigaddset {}, {}", set, signum); let set_addr = instance.memory_offset_addr(0, set as _) as *mut u32; unsafe { *set_addr |= 1 << (signum - 1); diff --git a/src/apis/emscripten/syscalls.rs b/src/apis/emscripten/syscalls.rs index f9d3effc0..15f2fee19 100644 --- a/src/apis/emscripten/syscalls.rs +++ b/src/apis/emscripten/syscalls.rs @@ -76,8 +76,8 @@ use libc::SO_NOSIGPIPE; const SO_NOSIGPIPE: c_int = 0; /// exit -pub extern "C" fn ___syscall1(_which: c_int, mut varargs: VarArgs, instance: &mut Instance) { - debug!("emscripten::___syscall1 (exit)"); +pub extern "C" fn ___syscall1(which: c_int, mut varargs: VarArgs, instance: &mut Instance) { + debug!("emscripten::___syscall1 (exit) {}", which); let status: i32 = varargs.get(instance); unsafe { exit(status); @@ -86,11 +86,11 @@ pub extern "C" fn ___syscall1(_which: c_int, mut varargs: VarArgs, instance: &mu /// read pub extern "C" fn ___syscall3( - _which: c_int, + which: c_int, mut varargs: VarArgs, instance: &mut Instance, ) -> ssize_t { - debug!("emscripten::___syscall3 (read)"); + debug!("emscripten::___syscall3 (read) {}", which); let fd: i32 = varargs.get(instance); let buf: u32 = varargs.get(instance); let count: usize = varargs.get(instance); @@ -103,11 +103,11 @@ pub extern "C" fn ___syscall3( /// write pub extern "C" fn ___syscall4( - _which: c_int, + which: c_int, mut varargs: VarArgs, instance: &mut Instance, ) -> c_int { - debug!("emscripten::___syscall4 (write)"); + debug!("emscripten::___syscall4 (write) {}", which); let fd: i32 = varargs.get(instance); let buf: u32 = varargs.get(instance); let count: u32 = varargs.get(instance); @@ -118,11 +118,11 @@ pub extern "C" fn ___syscall4( /// open pub extern "C" fn ___syscall5( - _which: c_int, + which: c_int, mut varargs: VarArgs, instance: &mut Instance, ) -> c_int { - debug!("emscripten::___syscall5 (open)"); + debug!("emscripten::___syscall5 (open) {}", which); let pathname: u32 = varargs.get(instance); let flags: i32 = varargs.get(instance); let mode: u32 = varargs.get(instance); @@ -138,11 +138,11 @@ pub extern "C" fn ___syscall5( /// close pub extern "C" fn ___syscall6( - _which: c_int, + which: c_int, mut varargs: VarArgs, instance: &mut Instance, ) -> c_int { - debug!("emscripten::___syscall6 (close)"); + debug!("emscripten::___syscall6 (close) {}", which); let fd: i32 = varargs.get(instance); debug!("fd: {}", fd); unsafe { close(fd) } @@ -150,11 +150,11 @@ pub extern "C" fn ___syscall6( // chdir pub extern "C" fn ___syscall12( - _which: c_int, + which: c_int, mut varargs: VarArgs, instance: &mut Instance, ) -> c_int { - debug!("emscripten::___syscall12 (chdir)"); + debug!("emscripten::___syscall12 (chdir) {}", which); let path_addr: i32 = varargs.get(instance); unsafe { let path_ptr = instance.memory_offset_addr(0, path_addr as usize) as *const i8; @@ -173,11 +173,11 @@ pub extern "C" fn ___syscall20() -> pid_t { // mkdir pub extern "C" fn ___syscall39( - _which: c_int, + which: c_int, mut varargs: VarArgs, instance: &mut Instance, ) -> c_int { - debug!("emscripten::___syscall39 (mkdir)"); + debug!("emscripten::___syscall39 (mkdir) {}", which); let pathname: u32 = varargs.get(instance); let mode: u32 = varargs.get(instance); let pathname_addr = instance.memory_offset_addr(0, pathname as usize) as *const i8; @@ -194,11 +194,11 @@ pub extern "C" fn ___syscall64() -> pid_t { /// ioctl pub extern "C" fn ___syscall54( - _which: c_int, + which: c_int, mut varargs: VarArgs, instance: &mut Instance, ) -> c_int { - debug!("emscripten::___syscall54 (ioctl)"); + debug!("emscripten::___syscall54 (ioctl) {}", which); let fd: i32 = varargs.get(instance); let request: u32 = varargs.get(instance); debug!("fd: {}, op: {}", fd, request); @@ -240,11 +240,11 @@ pub extern "C" fn ___syscall54( // socketcall pub extern "C" fn ___syscall102( - _which: c_int, + which: c_int, mut varargs: VarArgs, instance: &mut Instance, ) -> c_int { - debug!("emscripten::___syscall102 (socketcall)"); + debug!("emscripten::___syscall102 (socketcall) {}", which); let call: u32 = varargs.get(instance); let mut socket_varargs: VarArgs = varargs.get(instance); @@ -518,11 +518,11 @@ pub extern "C" fn ___syscall102( /// uname // NOTE: Wondering if we should return custom utsname, like Emscripten. pub extern "C" fn ___syscall122( - _which: c_int, + which: c_int, mut varargs: VarArgs, instance: &mut Instance, ) -> c_int { - debug!("emscripten::___syscall122 (uname)"); + debug!("emscripten::___syscall122 (uname) {}", which); let buf: u32 = varargs.get(instance); debug!("=> buf: {}", buf); let buf_addr = instance.memory_offset_addr(0, buf as usize) as *mut utsname; @@ -531,11 +531,11 @@ pub extern "C" fn ___syscall122( // mmap2 pub extern "C" fn ___syscall192( - _which: c_int, + which: c_int, mut varargs: VarArgs, instance: &mut Instance, ) -> c_int { - debug!("emscripten::___syscall192 (mmap2)"); + debug!("emscripten::___syscall192 (mmap2) {}", which); let addr: i32 = varargs.get(instance); let len: u32 = varargs.get(instance); let prot: i32 = varargs.get(instance); @@ -566,11 +566,11 @@ pub extern "C" fn ___syscall192( /// lseek pub extern "C" fn ___syscall140( - _which: c_int, + which: c_int, mut varargs: VarArgs, instance: &mut Instance, ) -> off_t { - debug!("emscripten::___syscall140 (lseek)"); + debug!("emscripten::___syscall140 (lseek) {}", which); let fd: i32 = varargs.get(instance); let offset: i64 = varargs.get(instance); let whence: i32 = varargs.get(instance); @@ -580,11 +580,11 @@ pub extern "C" fn ___syscall140( /// readv pub extern "C" fn ___syscall145( - _which: c_int, + which: c_int, mut varargs: VarArgs, instance: &mut Instance, ) -> ssize_t { - debug!("emscripten::___syscall145 (readv)"); + debug!("emscripten::___syscall145 (readv) {}", which); // let fd: i32 = varargs.get(instance); // let iov: u32 = varargs.get(instance); // let iovcnt: i32 = varargs.get(instance); @@ -625,11 +625,11 @@ pub extern "C" fn ___syscall145( // writev pub extern "C" fn ___syscall146( - _which: c_int, + which: c_int, mut varargs: VarArgs, instance: &mut Instance, ) -> ssize_t { - debug!("emscripten::___syscall146 (writev)"); + debug!("emscripten::___syscall146 (writev) {}", which); let fd: i32 = varargs.get(instance); let iov: i32 = varargs.get(instance); let iovcnt: i32 = varargs.get(instance); @@ -663,11 +663,11 @@ pub extern "C" fn ___syscall146( // pread pub extern "C" fn ___syscall180( - _which: c_int, + which: c_int, mut varargs: VarArgs, instance: &mut Instance, ) -> c_int { - debug!("emscripten::___syscall180 (pread)"); + debug!("emscripten::___syscall180 (pread) {}", which); let fd: i32 = varargs.get(instance); let buf: u32 = varargs.get(instance); let count: u32 = varargs.get(instance); @@ -684,11 +684,11 @@ pub extern "C" fn ___syscall180( // pwrite pub extern "C" fn ___syscall181( - _which: c_int, + which: c_int, mut varargs: VarArgs, instance: &mut Instance, ) -> c_int { - debug!("emscripten::___syscall181 (pwrite)"); + debug!("emscripten::___syscall181 (pwrite) {}", which); let fd: i32 = varargs.get(instance); let buf: u32 = varargs.get(instance); let count: u32 = varargs.get(instance); @@ -709,11 +709,11 @@ pub extern "C" fn ___syscall181( // stat64 pub extern "C" fn ___syscall195( - _which: c_int, + which: c_int, mut varargs: VarArgs, instance: &mut Instance, ) -> c_int { - debug!("emscripten::___syscall195 (stat64)"); + debug!("emscripten::___syscall195 (stat64) {}", which); let pathname: u32 = varargs.get(instance); let buf: u32 = varargs.get(instance); @@ -733,11 +733,11 @@ pub extern "C" fn ___syscall195( // fstat64 pub extern "C" fn ___syscall197( - _which: c_int, + which: c_int, mut varargs: VarArgs, instance: &mut Instance, ) -> c_int { - debug!("emscripten::___syscall197 (fstat64)"); + debug!("emscripten::___syscall197 (fstat64) {}", which); let fd: c_int = varargs.get(instance); let buf: u32 = varargs.get(instance); @@ -783,11 +783,11 @@ pub extern "C" fn ___syscall202() -> gid_t { // chown pub extern "C" fn ___syscall212( - _which: c_int, + which: c_int, mut varargs: VarArgs, instance: &mut Instance, ) -> c_int { - debug!("emscripten::___syscall212 (chown)"); + debug!("emscripten::___syscall212 (chown) {}", which); let pathname: u32 = varargs.get(instance); let owner: u32 = varargs.get(instance); @@ -800,11 +800,11 @@ pub extern "C" fn ___syscall212( // fcntl64 pub extern "C" fn ___syscall221( - _which: c_int, + which: c_int, mut varargs: VarArgs, instance: &mut Instance, ) -> c_int { - debug!("emscripten::___syscall221 (fcntl64)"); + debug!("emscripten::___syscall221 (fcntl64) {}", which); // fcntl64 let _fd: i32 = varargs.get(instance); let cmd: u32 = varargs.get(instance); @@ -816,11 +816,11 @@ pub extern "C" fn ___syscall221( // prlimit64 pub extern "C" fn ___syscall340( - _which: c_int, + which: c_int, mut varargs: VarArgs, instance: &mut Instance, ) -> c_int { - debug!("emscripten::___syscall340 (prlimit64)"); + debug!("emscripten::___syscall340 (prlimit64), {}", which); // NOTE: Doesn't really matter. Wasm modules cannot exceed WASM_PAGE_SIZE anyway. let _pid: i32 = varargs.get(instance); let _resource: i32 = varargs.get(instance); @@ -843,11 +843,11 @@ pub extern "C" fn ___syscall340( // dup2 pub extern "C" fn ___syscall63( - _which: c_int, + which: c_int, mut varargs: VarArgs, instance: &mut Instance, ) -> c_int { - debug!("emscripten::___syscall63 (dup2)"); + debug!("emscripten::___syscall63 (dup2) {}", which); let src: i32 = varargs.get(instance); let dst: i32 = varargs.get(instance); @@ -857,11 +857,11 @@ pub extern "C" fn ___syscall63( // select pub extern "C" fn ___syscall142( - _which: c_int, + which: c_int, mut varargs: VarArgs, instance: &mut Instance, ) -> c_int { - debug!("emscripten::___syscall142 (newselect)"); + debug!("emscripten::___syscall142 (newselect) {}", which); let nfds: i32 = varargs.get(instance); let readfds: u32 = varargs.get(instance); @@ -880,11 +880,11 @@ pub extern "C" fn ___syscall142( // setpgid pub extern "C" fn ___syscall57( - _which: c_int, + which: c_int, mut varargs: VarArgs, instance: &mut Instance, ) -> c_int { - debug!("emscripten::___syscall57 (setpgid)"); + debug!("emscripten::___syscall57 (setpgid) {}", which); let pid: i32 = varargs.get(instance); let pgid: i32 = varargs.get(instance); unsafe { setpgid(pid, pgid) } diff --git a/src/apis/emscripten/time.rs b/src/apis/emscripten/time.rs index 0ff20fc16..ce4539411 100644 --- a/src/apis/emscripten/time.rs +++ b/src/apis/emscripten/time.rs @@ -119,7 +119,7 @@ pub extern "C" fn _asctime(time: u32, instance: &mut Instance) -> u32 { /// emscripten: _asctime_r pub extern "C" fn _asctime_r(time: u32, buf: u32, instance: &mut Instance) -> u32 { - debug!("emscripten::_asctime_r {}", time); + debug!("emscripten::_asctime_r {}, {}", time, buf); unsafe { // NOTE: asctime_r is specced to behave in an undefined manner if the algorithm would attempt From 3f2761045920033a192bd46d03667179102dd472 Mon Sep 17 00:00:00 2001 From: Syrus Date: Mon, 17 Dec 2018 22:23:49 -0800 Subject: [PATCH 10/38] Refactored emscripten logic out of Instance --- src/webassembly/instance.rs | 146 +++++++++++++++++++++--------------- src/webassembly/mod.rs | 26 +++---- 2 files changed, 94 insertions(+), 78 deletions(-) diff --git a/src/webassembly/instance.rs b/src/webassembly/instance.rs index b7f17e1bc..2603d9994 100644 --- a/src/webassembly/instance.rs +++ b/src/webassembly/instance.rs @@ -74,6 +74,81 @@ pub struct EmscriptenData { pub stack_alloc: extern "C" fn(u32, &Instance) -> u32, } +impl EmscriptenData { + pub fn new(module: &Module, instance: &Instance) -> Self { + unsafe { + debug!("emscripten::new"); + let malloc_export = module.info.exports.get("_malloc"); + let free_export = module.info.exports.get("_free"); + let memalign_export = module.info.exports.get("_memalign"); + let memset_export = module.info.exports.get("_memset"); + let stack_alloc_export = module.info.exports.get("stackAlloc"); + + let mut malloc_addr = 0 as *const u8; + let mut free_addr = 0 as *const u8; + let mut memalign_addr = 0 as *const u8; + let mut memset_addr = 0 as *const u8; + let mut stack_alloc_addr = 0 as _; + + if let Some(Export::Function(malloc_index)) = malloc_export { + malloc_addr = instance.get_function_pointer(*malloc_index); + } + + if let Some(Export::Function(free_index)) = free_export { + free_addr = instance.get_function_pointer(*free_index); + } + + if let Some(Export::Function(memalign_index)) = memalign_export { + memalign_addr = instance.get_function_pointer(*memalign_index); + } + + if let Some(Export::Function(memset_index)) = memset_export { + memset_addr = instance.get_function_pointer(*memset_index); + } + + if let Some(Export::Function(stack_alloc_index)) = stack_alloc_export { + stack_alloc_addr = instance.get_function_pointer(*stack_alloc_index); + } + + EmscriptenData { + malloc: mem::transmute(malloc_addr), + free: mem::transmute(free_addr), + memalign: mem::transmute(memalign_addr), + memset: mem::transmute(memset_addr), + stack_alloc: mem::transmute(stack_alloc_addr), + } + } + } + + // Emscripten __ATINIT__ + pub fn atinit(&self, module: &Module, instance: &Instance) -> Result<(), String> { + debug!("emscripten::atinit"); + if let Some(&Export::Function(environ_constructor_index)) = + module.info.exports.get("___emscripten_environ_constructor") + { + debug!("emscripten::___emscripten_environ_constructor"); + let ___emscripten_environ_constructor: extern "C" fn(&Instance) = + get_instance_function!(instance, environ_constructor_index); + call_protected!(___emscripten_environ_constructor(&instance)) + .map_err(|err| format!("{}", err))?; + }; + Ok(()) + // TODO: We also need to handle TTY.init() and SOCKFS.root = FS.mount(SOCKFS, {}, null) + } + + // Emscripten __ATEXIT__ + pub fn atexit(&self, module: &Module, instance: &Instance) -> Result<(), String> { + debug!("emscripten::atexit"); + use libc::fflush; + use std::ptr; + // Flush all open streams + unsafe { + fflush(ptr::null_mut()); + }; + Ok(()) + } +} + impl fmt::Debug for EmscriptenData { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { f.debug_struct("EmscriptenData") @@ -554,66 +629,7 @@ impl Instance { tables: tables_pointer[..].into(), }; - let emscripten_data = if options.abi == InstanceABI::Emscripten { - unsafe { - debug!("emscripten::initiating data"); - let malloc_export = module.info.exports.get("_malloc"); - let free_export = module.info.exports.get("_free"); - let memalign_export = module.info.exports.get("_memalign"); - let memset_export = module.info.exports.get("_memset"); - let stack_alloc_export = module.info.exports.get("stackAlloc"); - - let mut malloc_addr = 0 as *const u8; - let mut free_addr = 0 as *const u8; - let mut memalign_addr = 0 as *const u8; - let mut memset_addr = 0 as *const u8; - let mut stack_alloc_addr = 0 as _; - - if malloc_export.is_none() - && free_export.is_none() - && memalign_export.is_none() - && memset_export.is_none() - { - None - } else { - if let Some(Export::Function(malloc_index)) = malloc_export { - malloc_addr = - get_function_addr(&malloc_index, &import_functions, &functions); - } - - if let Some(Export::Function(free_index)) = free_export { - free_addr = get_function_addr(&free_index, &import_functions, &functions); - } - - if let Some(Export::Function(memalign_index)) = memalign_export { - memalign_addr = - get_function_addr(&memalign_index, &import_functions, &functions); - } - - if let Some(Export::Function(memset_index)) = memset_export { - memset_addr = - get_function_addr(&memset_index, &import_functions, &functions); - } - - if let Some(Export::Function(stack_alloc_index)) = stack_alloc_export { - stack_alloc_addr = - get_function_addr(&stack_alloc_index, &import_functions, &functions); - } - - Some(EmscriptenData { - malloc: mem::transmute(malloc_addr), - free: mem::transmute(free_addr), - memalign: mem::transmute(memalign_addr), - memset: mem::transmute(memset_addr), - stack_alloc: mem::transmute(stack_alloc_addr), - }) - } - } - } else { - None - }; - - Ok(Instance { + let mut instance = Instance { data_pointers, tables: Arc::new(tables.into_iter().collect()), // tables.into_iter().map(|table| RwLock::new(table)).collect()), memories: Arc::new(memories.into_iter().collect()), @@ -621,8 +637,14 @@ impl Instance { functions, import_functions, start_func, - emscripten_data, - }) + emscripten_data: None, + }; + + if options.abi == InstanceABI::Emscripten { + instance.emscripten_data = Some(EmscriptenData::new(module, &instance)); + } + + Ok(instance) } pub fn memory_mut(&mut self, memory_index: usize) -> &mut LinearMemory { diff --git a/src/webassembly/mod.rs b/src/webassembly/mod.rs index d46d74030..2183c8f62 100644 --- a/src/webassembly/mod.rs +++ b/src/webassembly/mod.rs @@ -14,6 +14,7 @@ use cranelift_codegen::{ settings::{self, Configurable}, }; use cranelift_wasm::ModuleEnvironment; +use std::io::{self, Write}; use std::panic; use std::str::FromStr; use target_lexicon; @@ -153,7 +154,7 @@ pub fn get_isa() -> Box { isa::lookup(triple!("x86_64")).unwrap().finish(flags) } -fn store_module_arguments(path: &str, args: Vec<&str>, instance: &mut Instance) -> (u32, u32) { +fn store_module_arguments(path: &str, args: Vec<&str>, instance: &Instance) -> (u32, u32) { let argc = args.len() + 1; let (argv_offset, argv_slice): (_, &mut [u32]) = @@ -211,19 +212,9 @@ pub fn start_instance( path: &str, args: Vec<&str>, ) -> Result<(), String> { - if is_emscripten_module(&module) { - // Emscripten __ATINIT__ - if let Some(&Export::Function(environ_constructor_index)) = - module.info.exports.get("___emscripten_environ_constructor") - { - debug!("emscripten::___emscripten_environ_constructor"); - let ___emscripten_environ_constructor: extern "C" fn(&Instance) = - get_instance_function!(instance, environ_constructor_index); - call_protected!(___emscripten_environ_constructor(&instance)) - .map_err(|err| format!("{}", err))?; - }; + if let Some(ref emscripten_data) = &instance.emscripten_data { + emscripten_data.atinit(module, instance)?; - // TODO: We also need to handle TTY.init() and SOCKFS.root = FS.mount(SOCKFS, {}, null) let func_index = match module.info.exports.get("_main") { Some(&Export::Function(index)) => index, _ => panic!("_main emscripten function not found"), @@ -232,7 +223,7 @@ pub fn start_instance( let sig_index = module.get_func_type(func_index); let signature = module.get_signature(sig_index); let num_params = signature.params.len(); - match num_params { + let result = match num_params { 2 => { let main: extern "C" fn(u32, u32, &Instance) = get_instance_function!(instance, func_index); @@ -248,8 +239,11 @@ pub fn start_instance( num_params ), } - .map_err(|err| format!("{}", err)) - // TODO: We should implement emscripten __ATEXIT__ + .map_err(|err| format!("{}", err)); + + emscripten_data.atexit(module, instance)?; + + result } else { let func_index = instance From be265ddba721df9faf546950333e687de0127f1f Mon Sep 17 00:00:00 2001 From: Syrus Date: Mon, 17 Dec 2018 22:26:05 -0800 Subject: [PATCH 11/38] Improved lint --- src/webassembly/instance.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/webassembly/instance.rs b/src/webassembly/instance.rs index 2603d9994..a958f27c2 100644 --- a/src/webassembly/instance.rs +++ b/src/webassembly/instance.rs @@ -132,12 +132,12 @@ impl EmscriptenData { call_protected!(___emscripten_environ_constructor(&instance)) .map_err(|err| format!("{}", err))?; }; - Ok(()) // TODO: We also need to handle TTY.init() and SOCKFS.root = FS.mount(SOCKFS, {}, null) + Ok(()) } // Emscripten __ATEXIT__ - pub fn atexit(&self, module: &Module, instance: &Instance) -> Result<(), String> { + pub fn atexit(&self, _module: &Module, _instance: &Instance) -> Result<(), String> { debug!("emscripten::atexit"); use libc::fflush; use std::ptr; From ef205fb60f61071e30599de7e8b5119dc8f325b9 Mon Sep 17 00:00:00 2001 From: Steve Akinyemi Date: Tue, 18 Dec 2018 13:44:15 +0100 Subject: [PATCH 12/38] Fix segfault --- src/apis/emscripten/env.rs | 34 +++++++++++--------------------- src/apis/emscripten/exception.rs | 3 ++- src/apis/host/posix/env.rs | 8 ++++---- 3 files changed, 18 insertions(+), 27 deletions(-) diff --git a/src/apis/emscripten/env.rs b/src/apis/emscripten/env.rs index 7826b3020..5acd64612 100644 --- a/src/apis/emscripten/env.rs +++ b/src/apis/emscripten/env.rs @@ -1,6 +1,6 @@ use super::super::host; /// NOTE: These syscalls only support wasm_32 for now because they take u32 offset -use libc::{c_int, getgrnam as libc_getgrnam, getpwnam as libc_getpwnam, c_long, sysconf}; +use libc::{c_int, getgrnam as libc_getgrnam, getpwnam as libc_getpwnam, c_long, sysconf, getenv}; use std::ffi::CStr; use std::mem; use std::os::raw::c_char; @@ -8,29 +8,19 @@ use std::os::raw::c_char; use super::utils::{copy_cstr_into_wasm, copy_terminated_array_of_cstrs}; use crate::webassembly::Instance; -#[no_mangle] +// #[no_mangle] /// emscripten: _getenv // (name: *const char) -> *const c_char; pub extern "C" fn _getenv(name: c_int, instance: &mut Instance) -> u32 { - debug!("emscripten::_getenv {}", name); - let name = unsafe { - let name_addr = instance.memory_offset_addr(0, name as usize) as *const c_char; - CStr::from_ptr(name_addr).to_str().unwrap() - }; - match host::get_env(name, instance) { - Ok(env_value) => { - // Append null byte - let env_value = env_value + "\0"; - let env_value_ptr = env_value.as_ptr() as *mut c_char; - let res = unsafe { copy_cstr_into_wasm(instance, env_value_ptr) }; - // Test - let c_str = instance.memory_offset_addr(0, res as _) as *mut i8; - use std::ffi::CStr; - debug!("#### cstr = {:?}", unsafe { CStr::from_ptr(c_str) }); - debug!("res = {}", res); - res - } - Err(_) => 0, - } + debug!("emscripten::_getenv"); + + let name_addr = instance.memory_offset_addr(0, name as usize) as *const c_char; + + debug!("=> name({:?})", unsafe { CStr::from_ptr(name_addr) }); + + let c_str = unsafe { getenv(name_addr) }; + if c_str.is_null() { return 0; } + + unsafe { copy_cstr_into_wasm(instance, c_str) } } pub extern "C" fn _getpwnam(name_ptr: c_int, instance: &mut Instance) -> c_int { diff --git a/src/apis/emscripten/exception.rs b/src/apis/emscripten/exception.rs index dc45454d5..65d6e2e6b 100644 --- a/src/apis/emscripten/exception.rs +++ b/src/apis/emscripten/exception.rs @@ -1,4 +1,5 @@ use crate::webassembly::Instance; +use super::process::_abort; /// emscripten: ___cxa_allocate_exception pub extern "C" fn ___cxa_allocate_exception(size: u32, instance: &mut Instance) -> u32 { @@ -10,5 +11,5 @@ pub extern "C" fn ___cxa_allocate_exception(size: u32, instance: &mut Instance) /// TODO: We don't have support for exceptions yet pub extern "C" fn ___cxa_throw(ptr: u32, ty: u32, destructor: u32, instance: &mut Instance) { debug!("emscripten::___cxa_throw"); - debug!("unimplmeneted yet!"); + _abort(); } diff --git a/src/apis/host/posix/env.rs b/src/apis/host/posix/env.rs index b0fff8174..5943e589b 100644 --- a/src/apis/host/posix/env.rs +++ b/src/apis/host/posix/env.rs @@ -1,7 +1,7 @@ use crate::webassembly::Instance; use std::env; -pub extern "C" fn get_env(name: &str, _instance: &mut Instance) -> Result { - debug!("host::get_env({:?})", name); - env::var(name) -} +// pub extern "C" fn get_env(name: &str, _instance: &mut Instance) -> Result { +// debug!("host::get_env({:?})", name); +// env::var(name) +// } From 903e3223ddf0e40c1d31e5a42802c39d42444f55 Mon Sep 17 00:00:00 2001 From: Syrus Date: Tue, 18 Dec 2018 09:43:59 -0800 Subject: [PATCH 13/38] Fix formatting --- src/apis/emscripten/env.rs | 6 ++++-- src/apis/emscripten/exception.rs | 2 +- src/apis/emscripten/memory.rs | 3 +-- src/apis/emscripten/mod.rs | 29 ++++++++++++++--------------- src/apis/emscripten/process.rs | 4 +++- src/apis/emscripten/syscalls.rs | 26 +++++++++++++------------- 6 files changed, 36 insertions(+), 34 deletions(-) diff --git a/src/apis/emscripten/env.rs b/src/apis/emscripten/env.rs index 23a718abf..fd8ea10b5 100644 --- a/src/apis/emscripten/env.rs +++ b/src/apis/emscripten/env.rs @@ -1,6 +1,6 @@ use super::super::host; /// NOTE: These syscalls only support wasm_32 for now because they take u32 offset -use libc::{c_int, c_long, getgrnam as libc_getgrnam, getpwnam as libc_getpwnam, sysconf, getenv}; +use libc::{c_int, c_long, getenv, getgrnam as libc_getgrnam, getpwnam as libc_getpwnam, sysconf}; use std::ffi::CStr; use std::mem; use std::os::raw::c_char; @@ -18,7 +18,9 @@ pub extern "C" fn _getenv(name: c_int, instance: &mut Instance) -> u32 { debug!("=> name({:?})", unsafe { CStr::from_ptr(name_addr) }); let c_str = unsafe { getenv(name_addr) }; - if c_str.is_null() { return 0; } + if c_str.is_null() { + return 0; + } unsafe { copy_cstr_into_wasm(instance, c_str) } } diff --git a/src/apis/emscripten/exception.rs b/src/apis/emscripten/exception.rs index 65d6e2e6b..8f8c2b969 100644 --- a/src/apis/emscripten/exception.rs +++ b/src/apis/emscripten/exception.rs @@ -1,5 +1,5 @@ -use crate::webassembly::Instance; use super::process::_abort; +use crate::webassembly::Instance; /// emscripten: ___cxa_allocate_exception pub extern "C" fn ___cxa_allocate_exception(size: u32, instance: &mut Instance) -> u32 { diff --git a/src/apis/emscripten/memory.rs b/src/apis/emscripten/memory.rs index faf5c0bf8..56b2e06f5 100644 --- a/src/apis/emscripten/memory.rs +++ b/src/apis/emscripten/memory.rs @@ -1,6 +1,6 @@ use super::process::abort_with_message; use crate::webassembly::Instance; -use libc::{c_void, memcpy, size_t, c_int}; +use libc::{c_int, c_void, memcpy, size_t}; /// emscripten: _emscripten_memcpy_big pub extern "C" fn _emscripten_memcpy_big( @@ -46,4 +46,3 @@ pub extern "C" fn ___map_file() -> c_int { // NOTE: TODO: Em returns -1 here as well. May need to implement properly -1 } - diff --git a/src/apis/emscripten/mod.rs b/src/apis/emscripten/mod.rs index 452e4405c..1d2077eb3 100644 --- a/src/apis/emscripten/mod.rs +++ b/src/apis/emscripten/mod.rs @@ -6,11 +6,11 @@ use std::mem; // EMSCRIPTEN APIS mod env; mod errno; +mod exception; mod io; mod lock; -mod memory; mod math; -mod exception; +mod memory; mod nullfunc; mod process; mod signal; @@ -440,16 +440,8 @@ pub fn generate_emscripten_env<'a, 'b>() -> ImportObject<&'a str, &'b str> { "___clock_gettime", ImportValue::Func(time::___clock_gettime as _), ); - import_object.set( - "env", - "_clock", - ImportValue::Func(time::_clock as _), - ); - import_object.set( - "env", - "_difftime", - ImportValue::Func(time::_difftime as _), - ); + import_object.set("env", "_clock", ImportValue::Func(time::_clock as _)); + import_object.set("env", "_difftime", ImportValue::Func(time::_difftime as _)); import_object.set("env", "_asctime", ImportValue::Func(time::_asctime as _)); import_object.set( "env", @@ -475,11 +467,18 @@ pub fn generate_emscripten_env<'a, 'b>() -> ImportObject<&'a str, &'b str> { ); import_object.set("env", "_sysconf", ImportValue::Func(env::_sysconf as _)); // Math - import_object.set("env", "_llvm_log10_f64", ImportValue::Func(math::_llvm_log10_f64 as _)); - import_object.set("env", "_llvm_log2_f64", ImportValue::Func(math::_llvm_log2_f64 as _)); + import_object.set( + "env", + "_llvm_log10_f64", + ImportValue::Func(math::_llvm_log10_f64 as _), + ); + import_object.set( + "env", + "_llvm_log2_f64", + ImportValue::Func(math::_llvm_log2_f64 as _), + ); import_object.set("asm2wasm", "f64-rem", ImportValue::Func(math::f64_rem as _)); - mock_external!(import_object, _waitpid); mock_external!(import_object, _utimes); mock_external!(import_object, _usleep); diff --git a/src/apis/emscripten/process.rs b/src/apis/emscripten/process.rs index 39ea548a3..f3acb32fe 100644 --- a/src/apis/emscripten/process.rs +++ b/src/apis/emscripten/process.rs @@ -63,5 +63,7 @@ pub extern "C" fn _popen() -> c_int { debug!("emscripten::_popen"); // TODO: May need to change this Em impl to a working version eprintln!("Missing function: popen"); - unsafe { abort(); } + unsafe { + abort(); + } } diff --git a/src/apis/emscripten/syscalls.rs b/src/apis/emscripten/syscalls.rs index b928541b6..71b3f23a9 100644 --- a/src/apis/emscripten/syscalls.rs +++ b/src/apis/emscripten/syscalls.rs @@ -18,6 +18,7 @@ use libc::{ connect, dup2, exit, + fcntl, fstat, getgid, getpeername, @@ -42,6 +43,9 @@ use libc::{ // readv, recvfrom, recvmsg, + rmdir, + // ENOTTY, + rusage, sa_family_t, // writev, select, @@ -57,18 +61,14 @@ use libc::{ uname, utsname, write, + EINVAL, // sockaddr_in, FIOCLEX, FIONBIO, + F_GETFD, + F_SETFD, SOL_SOCKET, TIOCGWINSZ, - // ENOTTY, - rusage, - rmdir, - EINVAL, - fcntl, - F_SETFD, - F_GETFD, }; use std::mem; @@ -78,7 +78,7 @@ use std::slice; // Linking to functions that are not provided by rust libc #[cfg(target_os = "macos")] #[link(name = "c")] -extern { +extern "C" { pub fn wait4(pid: pid_t, status: *mut c_int, options: c_int, rusage: *mut rusage) -> pid_t; } @@ -266,9 +266,7 @@ pub extern "C" fn ___syscall57( debug!("emscripten::___syscall57 (setpgid) {}", which); let pid: i32 = varargs.get(instance); let pgid: i32 = varargs.get(instance); - unsafe { - setpgid(pid, pgid) - } + unsafe { setpgid(pid, pgid) } } // dup2 @@ -930,7 +928,7 @@ pub extern "C" fn ___syscall330( let res = unsafe { dup2(oldfd, newfd) }; // Set flags on newfd (https://www.gnu.org/software/libc/manual/html_node/Descriptor-Flags.html) - let mut old_flags = unsafe { fcntl (newfd, F_GETFD, 0) }; + let mut old_flags = unsafe { fcntl(newfd, F_GETFD, 0) }; if old_flags > 0 { old_flags |= flags; @@ -938,7 +936,9 @@ pub extern "C" fn ___syscall330( old_flags &= !flags; } - unsafe { fcntl (newfd, F_SETFD, old_flags); } + unsafe { + fcntl(newfd, F_SETFD, old_flags); + } debug!( "=> oldfd: {}, newfd: {}, flags: {} = pid: {}", From 87c3c037e40555ca1cad69d6abe540e6d9f14c6f Mon Sep 17 00:00:00 2001 From: Syrus Date: Tue, 18 Dec 2018 17:21:12 -0800 Subject: [PATCH 14/38] Added emscripten jmp instructions --- src/apis/emscripten/jmp.rs | 34 ++++++++++++++++++++++++++++++++++ src/apis/emscripten/mod.rs | 4 ++++ 2 files changed, 38 insertions(+) create mode 100644 src/apis/emscripten/jmp.rs diff --git a/src/apis/emscripten/jmp.rs b/src/apis/emscripten/jmp.rs new file mode 100644 index 000000000..45f140404 --- /dev/null +++ b/src/apis/emscripten/jmp.rs @@ -0,0 +1,34 @@ +use libc::{c_void, c_int}; +use crate::webassembly::Instance; + + +/// setjmp +pub extern "C" fn __setjmp( + env_addr: u32, + instance: &mut Instance, +) -> c_int { + debug!("emscripten::__setjmp (setjmp)"); + unsafe { + let env = instance.memory_offset_addr(0, env_addr as usize) as *mut c_void; + setjmp(env) + } +} + + +/// longjmp +pub extern "C" fn __longjmp( + env_addr: u32, + val: c_int, + instance: &mut Instance, +) -> ! { + debug!("emscripten::__longjmp (longjmp) {}", val); + unsafe { + let env = instance.memory_offset_addr(0, env_addr as usize) as *mut c_void; + longjmp(env, val) + }; +} + +extern "C" { + fn setjmp(env: *mut c_void) -> c_int; + fn longjmp(env: *mut c_void, val: c_int) -> !; +} diff --git a/src/apis/emscripten/mod.rs b/src/apis/emscripten/mod.rs index 1d2077eb3..413171e63 100644 --- a/src/apis/emscripten/mod.rs +++ b/src/apis/emscripten/mod.rs @@ -8,6 +8,7 @@ mod env; mod errno; mod exception; mod io; +mod jmp; mod lock; mod math; mod memory; @@ -479,6 +480,9 @@ pub fn generate_emscripten_env<'a, 'b>() -> ImportObject<&'a str, &'b str> { ); import_object.set("asm2wasm", "f64-rem", ImportValue::Func(math::f64_rem as _)); + import_object.set("env", "__setjmp", ImportValue::Func(jmp::__setjmp as _)); + import_object.set("env", "__longjmp", ImportValue::Func(jmp::__longjmp as _)); + mock_external!(import_object, _waitpid); mock_external!(import_object, _utimes); mock_external!(import_object, _usleep); From c315cc43a34b1f497f1f7eb25614b450d76f2c21 Mon Sep 17 00:00:00 2001 From: Syrus Date: Tue, 18 Dec 2018 17:21:22 -0800 Subject: [PATCH 15/38] Added lua.wasm example --- examples/lua.wasm | Bin 0 -> 514327 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 examples/lua.wasm diff --git a/examples/lua.wasm b/examples/lua.wasm new file mode 100644 index 0000000000000000000000000000000000000000..1a424ae532ef6ebac4e8784e91f5be5e0840ed14 GIT binary patch literal 514327 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�OB}n9d!yHZ_S65Du@th` z;v5MT-my%5i(x|{eTq_ff}z6Oe~zG_sLvV$2SG(Y+~afONJ<_n&&oP=V@r6dRxB$o z7S^%k0@jTTSr13qNZC>ex3Q7^Ox`FP(*vO#DMF3n!4Lw++gL=HQrX5=nUm3IsYi0? zMAcpAaQ2e$Oq7~X0GCl!hF7aR?Koz_D$1^!s515i3JC-qLuKt%7DJiJV49Pv;OAuF z9F{{KO~xcq1uaOe+6%UJ@QBe5sRD<{Cgkq63?x5+VX6}cVvucu@Yq##H3p2O8O|pn zFaqQziz?*aLg8S-`~MZ`;&A%^he_9u#w1TfMKIzMzUykH?~gixe}WyX%y#_BV0eNq z?&ShefGb%Jk%PGUB3GB|itO>amnHEFesvR9*e`gdT^QPVkPT53WSc61VyYPD31MS% zg0>Ozr*&!L1nn&pn;Le_O5cb>7`rLgHg^-`RX0QRSsx2wiuNf_Xon&)=&lU=@Zfyt(2I?nL}kGG&Ey4*R}aXb>99*@jHSCRkh_+`j{$BB%cNTG1N1a9iR zH|cx_0D|| zz4py@1paK95<#5;u*9FnsuLSHK~Jq0nvM+|zg-YK^>2ef1%uLxIxQ-;D1(1FI|TK4 zdnt;OmU5-7wY?g51KHEuc!E^QStv_V1a|7mSQT8h52`hAr9te6h- z>EZm$RXS|~MU+@S+E{8qmx0-Uzbm~Gw_>@)RVuOX$u<)n@bcieQPt*+k zNvmFSSv6nnrdZW{O++`X+K+`*O?--uep*K)V42k%x)ac~GP0_T$0BG5;K&ecVq_zznn+8%*uG$^`8-{4sV{ z%B{A~=8vUqtC}O>jk5Cz!#^jy`<$;blv*R~DZgDG_+)(1&rD#-?@$X&`JHZK^(mL3 z^h*(XNbIZ2(l1AxMSy`*kn}0PE5e*gQ+McpH=!D2S}?}M-PW#Yxx3l2N*(B_{!J%D zU}aSm9BjTUy-zvlH5qPn3lq+H1?@bQI^HLonk&@Y;Wd+}YZVsO!oYgJY`}6~{Hk~J zt5o?lSxPaYs*Mh{@pYX~p*9|u6)&{$6*)9~ol3)m=QHv^gmP0e@}Oqq!ND`)mN~|j zL+~4s`P^Wedon6kIB;pfG*%*edgS^Di1Cxrb}&5b= z`H)Trl0PyY9LG!G{VrQB~hjRS$D~QvgOeZ^p5~Xvj=9MOqzcDdObu=@@Txj2i6< zvdA?2+D(X56ATh@a@33=DeCPU`l&ecxoyb2bv1 zmSZ|i@2IBz;D#O4G@KG-cVg53+0UTnKLN!Y`77Y|rMeM}}A!N34|s-&-6Y`r=T zfy|YfUnc`gZ7F?N!hgHr^oKUxq1UQ~N=i$wac{mG8q9rr>pMSGL3%b;<)bp)2W;Fc zZMApcT^!c^ZYV9$@q2A8stqNa*Y+;_A#jU+Hh#kvhrc zrLyh47gIrwaXzd2p%`MB?+>QAnJ&QN006Nw>Mqnp;Q?AUgR~zMrs5#TvYUV6Zqw4o z$3d8g(N4CU_i-zPM8{_DUz{EyLmelle4y-Qv%;nm3dyGP0U_kU_5n5LojNR_+6U1j zf3OD)+=r;(u=K-k5?vGr|KS|f4oBz4n2%r>M@Wq0ewiEO9MwWo%g|g=28*06lkUy2 z>LU!LFhhFVM}@YJwxjIm9t>;J#T}I%`=+*KxH&d&dpQS}QSS=cUZJ+Rmziy)OH0{9 zrSvD*`GmMKv*q`N>af6U2*6LU8$5!J_BGaWr1r|M6_M-V)qBUaEX_OA>B}@q=_aoMDYagWrHk{}f)D&wIY z{!kw(0fKV}r+SLwsf)twtb?MMc_$8DN8L*tW_+<@GJ7%VAI@$E$yff3(F)&Kl=FZd z@5i@tQO!mO46R{1t}R-twrImW<$A70Xzyop#@WPuzBvOkk?x-=K5v)4m4hu*3l5wD zrZ!;p&blJUI^>lq_oX6uuesyjZ%+KM=KGF5Hm-ewC3{_)rZu!Lm+-0@d)4>aH1&3vy;plx)J;-@ zdx)IUTD(^{hek=#BYEfpVH#OwC3mt5eQ(+JuVQ1`PjrhJvtfO?H?OL{yYO`#8s>GV z=2dg&Gs*Ga9;g%U`UEOD_0~bfl4VWcz{^bLTK{)5#qVZ{-E-kRb|Ctn_xMc9(YNBW zJrs-FIGbdLS+ikWALvL*uW+uDru9^+E!`zWyo4Z88ssu;xSWY7N=x1RnXZcjAe$+ zq)(gFeyAi9C7aFAx{$r6gISZ)eS&LJ+#M>J6DpBC4mo8m>H+GSXLITHJTV-lmg#1l zO)h*!H6@#coza5eU%0t3<;yVJCAPWf_hzcXqg#ZH3#ecVD%gyWDJR|KQ1N6{w3U(T zRGZT|EQhV7oyf(*4!tGVMHO#r?V82yU<^Fm!G_p&YGxZXo!%tUbSRv)%gA z;KMTrk#@1kvJRHuo|#(9^c4;_O*36^Id2pn9Pzgvm@Wl-Lt}g53AASqHr=HzU4W<$ z6^L4r1yL3EY7&qDnksgl69rtneVVIP) zE>5S!>;k}XSE}XCchU{jJBA&e*OOC>cB*NjYEpo4qR31?`?Vfe+@|n;GoyUF%D1OO zJsh_r65(Mh*~R}E+(9NN_-ZoZ5jy!SR-*e!s?in1D+0-YHg%!a>k@ID4mp~H9!A+y zMD&WHK?^q`=I-g*D?4&ZgJM@N7UW06) zinOu)u8JJ7Tm<)R-3#MhJe&{EXuj5Hbo3!BA_7p7UbUE zc4khuXHEgu;+#q75l3T(3cJ8UxaKs&7{7wu*mP%*bX74s4m{tCWi7d4hC__|;Q*1% z@@zvI+H9NcLz`nWjI(PY@InCQCot^a|G8v41WTuDY_$IZ2|f9hmf+l6Pvc!B8xT!} z{Q$|#l`?Cd+E6MYfp0U~*i3F53)IGr&21>f71mVWC@3EhZQy?qB)`q`EkfQ#P!@l) z7M`5H=k>%b#>iG;Buz zb%aE^Oa6ca6k%J3Rdx7`?Ysu)<5jP5o5;v!+%DO9>u%J-zP&`$CdMvZTt?; zug8rmbq*QVJ}&O4jB6QJ)ze}6Uv1pjaY)|cxO5R@P8b-tl5}>A&-au0EA9S^SL5oh z;x~UacJQm_ug270wY>SO(Su(#e>H0GtL7e#9Q>;Js}cYBmAjSuki8qSdlciU)xXl| zI$858Pr|bCuZHDc?WlP_$PUWqonxfsi6BWD(;Xg$2>i(M*j3;^JEl{TZmKJ1LylyD zqb5)wPi~-|qKa7Ac||O4Rg_vP6$`oc^%|35{+jix*CICfJCJohd*ssFe}iI@MQk&c zOLSw|bkXSKbV?b*CE7(PXo;ftJNuC86x`#yWVW3c_`-=2dry`#T;}wDcJ|Bvi0C>8eL5MT786I_4Ea_m>Pe`ud;i?$m(JpvYfXC(zkBZOKHUl1; zF%P!628`cUKHx2(3seMww=E^zZKl^suNT%EL`JVs-U}YvVVTI`p`hjMmcvALV6^Etvd)R=9zSsTa#lFy?)qu zHKSukGf431%DdW)b%d^p{Q#0o2?ziQ@zL7N?U<*GZxu)uqI3ZyivWqcF7Ku>Bevxg z?LoXg6*bPU)azbks{j%VFM6$=3Lx3jdJ2#rnc1GpC4K=CS@{+l`Gfxb?%4WFH5~ItK|dn7pyD&pSxuX~@_bYmGg>`_B5RK}O5FDrYCU zs*qYhg4Tv+$s5Agf=U&r?B|G56;$?>hm5p2k-b-lvY&>%KPSJ2VIN@osxIkg@UK4D z-mBNh-uY|Artw+=3s5-(uj(984z)w=kmbQ48VSCNVraiQqQrKvnmSniRU9o3OUjbQ zuo$c3jl81Ic&TJ3i9t0NsH^PbKyekxUXY($cbv)9qs=$Q0W zC)bO|)YUa!R?b!;>-9Jdhjp_n_A&uLt{1=>-4A1FL&gEnZ2x&M%~JYgPC(C9T1j{v<2l~4|7xecvaj-NBi8vKFV zaOys)4(MZreo~=;e#hJK1^S(U-R@ZRVYLRn-mP+ud?z^atrmsCCMZ$uSaxfTN@!RT5Z_LyWjOZjvLe zjwMJOmt7HS#K&cq@H@kfLwqS^ShJn#yf0++=N8lxiQSlZti2~y`co1yM-GzM5vsHMoX;yHM-^KpATui`Q( zWl>US9Sl!b>D2j&+6YdONZ~<83JYiJV&ij#h2%fWl}M~-Wj;|15|ceGKmdj&5gqoW z8fHPXXkrukC@w|V5yG;~>XQhHphxKAczrv^X4#y638E?uuLp>9)4U~or-E3E zh9G$UZqx5Bzm#(}(}767Jxy(??Pf_7kIfqVWk-@_>|{Ilr!Wq6NPG2NQKUG?yVMf&Np)BLO}U4_RYB;nm` z70~k(g*e_=g+iRoqO{#<)L!cQk=AZU_Q-EkxXAaKL|5?~l{ZK&M}?+Dx~QelV8gnP zqN$^mFUG~A(Dc4E&4jJWx&XFZfV?$27@zh8c~wx2jm$qr=thDqb2=kMde z`*`p!aUAg(?PCtHKK0YNOW`+ML`TyZ9BkF`Qtom@m|9jsb%XP;YYyQxcF5u&M`{Tj zhWI5(u4;#5EJ_%TNS-$+9uaVWY7gf|t$)}KXPd`|AFiS?_nyEBpv<`k^G5{`&gb$j zI1fl1whK_awULj8en6;#iQuD)Me6~^N7D}Vr9aJ&PS8=^1-8<&!8E6O#ZJ+EiHPR? z2~_i`W)<;Mt|Goa$sR3n#(iR3J;c>resw=rU-ql*mZe|viv?Jq{etbF@Q#ey{C}o&bvfjO{;ThFH=9 zcq6tq{DadIJ3Yz%?=t}TOlYwQMhd_Bm{EQbK4TQB-lmy$4YwSERr1t zL->1afA`4mHHocBa>BYcX>Rt-*S0pv7W5C>c1U|$Yo*+h#8JoF{HH`YVsGikBz0q0 zhi@(-bc2KcrNF;?M+fzNVsqD7Bv&SOWg>`OmDp8z*Rv;?>`x~4$pp-QvZU~iy|qkb ze7)<{lHKR?oPP&9P`t<3EOCWYKKN!W@C=42!~TE$pU7PS0vhcCU)*J}qCY?*?@l*c zg`d)$J9D%fD`d$mE1aewrY_xy8#L(uBDzYs-E9#8Ji_!5d zUM%Hq(U_RT8#MN%ys?Rz_a2)l(A9Sp89wg8qbpRywjwBdCyE|%NFhz`#Rj07em=3! zC+Q4r24+-khH4?CGwvzFz-?doW!b#PB zW&4n7gl**00gFiY!>`-P-g|>CZ~p)t#aK3=!(N>}?nwL@8pN9u$ympx*Cuu?gl>6y zdtx^`#dDh8Q;)X{^}e5%2rLJuhdLw=RTt3h=d}Zx57;!p0kW-EA7p+$0C+#>ojM%z z^Wn88TTSsV zLJ*Qjv`lR(CQ=2CrohpCImPw@c{6P;kK}!ZNjYS47L#|RY=@?E#AN1ZLUjHjts~jf z)EtI?Y}SS z=Ps7kZf(T-6BT#_pgSGVCp7@g#&(?wOckh4mhwZx^*shpk5{#!f4%is!jq$Pwjh3T zq#kVWaEyAfC3P3TP%LjXz&#%Z73OfqSKu_Y9(q=`6NrTZl(Pl-)7@{6&YY3E{LKa~ z__&==&K`EUSHR!z!UQ~=Tg>Y-aHc#2ahO6Q1vETT(w9)vB!s1Wj19447Hb7GJuNuWX2NL6N zebSenlGrJJq?gmy4T)_?veO}W|CU$pxOl3{YF1BUtC({OJ1xIhoSu=`8LA^gQ=MZm zc;Kwz%*4+0FVDgiUek9r7D_RdPb9|WClcb45$)JZ3lh!iMTuR+Q-$_kkff7kLs$8$V46XQ=ky)3cI)XI4Y`msrL@KSXSJIDwr3W}lU=Cl!7j+YA=U^`bN zc6ovs{E8$U?Gy9w4UAkvVq2O&+k^SX@!6=595(RpCiU4-aGa&_^~2@Ug|CYm*6&y{P$&{iqZvn^68FwAL4xf?h61$GcYnmvk9IHvXL4}!|8=`!29%~HV*WzbguNSzbWTdMT zyIOegS*LV2xoc>Hm*R2i)!yQsr>pTdEmN|ZekQTcBq#{}8sl{8RD3e7r;Fu_`gu*A z!x{fJGX6;7xI15flZAt~qYu~A<9zzXJVaYU#~pckpFpc{?4;bCz!4wR$r>5%r(aSU zo-fmd+v&nBiQST<({+F-gsEI{j|InD2T6-;oPy-T+vDL!fE4zb7AXb>RDg zs(b{Mmq)Y(&uvEVn2+FbIrWM<{!q^Dlp&|j%(C5@)JN40q2$AW(Fk2XQsy2Cnq+|= zD|?T35%;s7=rLUpn-3YBdPBY)9{-qXB@X=9yY!?ScALsAky9_(uZnVmI#6|KtQewd z&gFui<>^eCJ6py#H=PNh1trBydL%w?ha zEYPi~*ua&Zk=6@Zfzlr4D&cz?Jfc}sV zhcsplY-YlK7iDw$hm9deP~7t7e-huYzT`;PNQhES=XT_|IpXf@92Xyn+Rc&D+3hp* zMws<%WF_O~SC?dn~4G zd*Kg>1BM2BpWM9Kh88%ijZouoIEWsXjd?eth{B)up`n|4u*W{_Dc69S+~yC$}4Vqw@#vE39SZgKlI z)ha%gFU9sH34dY8>DSc8*VINP2ZMjDoynz-e~<0oLoa_^TnQvk#`dJPs}T^z2Xz| z^4pyl%+JjK+r~*K@OTZ*rHa?+n!N^Pcs;h)V_0q(!MvLOEw;bCz2<#7UlK((r+0r+ z-nVqFKRzeYW2dH{1!%PNSs&|-vEArn{akFH^ReFe_8OB;o=Lx1@N9D=@IlCXhgjKL zV!K7P2@*LuMkMpYA3q=4=K}`aN-k&N+ZST{LXL0gZ6I6YU%M^-pNUB*BtYIE+1wu6 z?V;f>#zxy;j3pD@5!)SPM$QnTrN7A8Px#`_*zPPAf@GmD$M$7SOfC!ElyECv{OQC# z4O3p8-j>)+T%hodjlY}Yp7ie6?iOm_lwcmaD^Bl?9a#6e>h+%3?kO5T7W%i?x+DwT z7u$XQ{wrE~|EABs5_*2W_xyhE`B!86s!!e5WBatlRqp>|&|00)#uF(>{Xvp{)``6Cn2pCeMU$tpT%CCC{^ME@lO zFPu8&k}uiO_!SpMURKIafB$M^{E>N#mGzg1{FegcUnBdgdNYh_IdRfG315qFC43D~ zz8=x#*Q36WHIq`WDaGpR5iLLs)svtSD?~ZkA4>acSVrWu6Z!aiWPcB>uWce88tMH0 zVe|h>N_=$p*aum2Vg0X*ZC$Z^wEj3Ol8r^n||t=9iJ-lg+nJHNRc+MC!eXp|e&fw2CIA*$wl{a+m0#rmeX zvt`>rOTyz>0^udG@u&V>8r!8RJPQb3A_z9t{}+JvvFT;8UB;24`KXKaU*8Kgn!P-> z%YFS{5!)5@FVrMU^Yq60cUOfgW4lt#4h08wyp4OOUKNA4S20JQjKSMa#(nA4v0bfV zSINNt$r#Km>zb^p!Bs%(NUq&DgM2EsPpK#gk6q{XHsn_KBIeW%=iHy>yuIAvaIV}j zt`jHcf1h?%{+ZZ5dfs#O}{DQzg7C=+?EdU8`_RW(U8&4l)4UFUG_0u#d4{SOQA;=q)zXP* z*Oi59c<4C3K6*Q{`3pRI^lY>{=DW8Nr+2x-4n0?*k18)1~-lqu@noz1j=BgYbRjn#DC#YSiwpQEPt2h!t zZc4RJlhbrP`TgdG7J3hYOhd3?(G2M~OMebA{ zLcqfFlWZtp^37_|mU0q5EEqIzc|0LOT-sMp($^L11o11{v1o|&lObx|l=aqA4Hbvk z!PN3R6(d8-WSX&2dAOWf&e~Ix2M9A5OhT5mYr~LWWh#fGmN{rpTU$3C3p|0V6hPWT zK(dbIIE-;%GQb)}(2V=346Cx9$EZud43k{$r!rL?_Ry4K zPqDJ8DMrdNxR{eCdN?W^#8b9J9};0JGPG-W2!&kqro(_Lei+dGil<_yRmz@yt&|PZ ziXu;H_8Qq=NsQK6eZCUysd?RVV`OYk%;$S*f@*veac(I)_laD33Mo0fK~*=mng)#% zvgpx50?i#93#+(z;Vek<<=@3Pn0TSx@%G{q4kWSNIQ!3bw-G(8r`_}=Yshw&2jxf) z@37HTO!&k?+HP)?myN&FD>P%e+$W5+W4reX$9OU}h0djY!XOOKaU@POzw%oA zJg1?MDFjaynEXsl%Xn53$I*d&)Eoj_@bGqlZ=&L2ny7ZSW_(JH3~QjDIqh!8D(ik* z>=8}Ntd|v%Qm4tm+ISo0Pb#lYItIeK|Dd?RG@F)DuN>k7lBwPqHpBb-;NMEtE0YcW z@T{0UJ;=fPy`=73=>2xTLiDFGErhW0A@vX+IyDD8rBfl|MRx0nHfK=C3O!KHfJP6{ z`qP6sI4r^mmoGyc8yjyJ zJ{Thf%1m`>>wpv6z}L3XLGxSNw#(Dt)lm_*E5e}iP#YIZwxjzvRpGWI0Ltfu?i2Rd z)cu`pXL`0BVP!@4U2DVYR-?Pvc4}=`d=__IuBaEvmT7G}d84tz=OT=vn6?Vf2rSAN z8B7Fxk_DOF5$Mxx-CPc1j&)LDa2~7Al&sc3Ewhq)MasCA&*ANrXm72!y*IYv_7)u^ zi#T43dyBdb^@TT73vZkjUgqJ%eA}%D=b340n4#Hxg+T5e zmeU@}bFe+jXC zrKwRFC*bu}S+hM^saTtx>G-nu^vry{c~_A!((yXJdwj2$9&po=%!}xGPkw@CCJAM4 zu$^P8^tc~_GqE`Ohz03i>gc0AwKx!{nu@#M&lDg&r8xSCP&PUBdT4+la2OI6EhLua zq0ANGk^Ff@%ct`j)&YPB3sC`YgbJ5gqxYAVyOS?7?=dRWgX9JqoK9|LE@J+pT&^YZ zHM0rsx|=BX$80sD98_vXPQUl_s|b@d*cS2kg`J6vu<2gOYAk1!l{jE;nt`HHG%Z-c z>TAnvxmKSrFRZ>z(ujrEqF`dNicMIIThN2e$Z4q+D4pXQ^m%I}#qyDO{%&pCtYn>S zYb`5?Gl5?Av4XY(wqGylY&^2?uTV&aZ1Lp#Qwp=4vNZ^*S&T84WhIo;`q`y8BX1{w zvz_RK*se?NLiZ}tTp|=)Xqip*WF1V}LV%v76_OFBL$VR+Ud7_vD;uE&Rm?c&aK26& zea&sRbvNer>vBvwj|%AEWDdL<`OGs0{jiD56dCf>%UNgX} zA4WAa2iI^g|>T*zP)sbcQAhqH7Bjjj- zfn$01`damzd$my6aNMG(jB{_T)(-<8ZXp%oa0T@&D&JTv>KrEnA_pP^kb|5Iu#{Fp6caLI-vzNC1+?GGDftR=&=kP4r}uEfn~Jlkp+|zfdvXi?pQ)qJqxVcJ{t2i;TE} zOvzgJf(LXEY71c%cV!_QnkmtIcwU`TmwPj)FgP!ize|^gbHS;N{J+E}$jz6Rqi!vm z?u{**ZU)gU5%(>ewp82CMKqQ>p}mYVFfux%Q$a_R4d$yT3V*!4O|$KLC6Q2YJ4$Tt zC35;OPQ(;3MHnVQxm)`NWC|jVKAK7DV=Ev?vAp=amNJcU)1Z!=Op3nR2py-b6W!@T zn{@-9HhAPXNvbet)r}18*gKlvI`)oDg#TouZFPA#QTHYw29WKNm8!;AX5N^T8e(UXkA=rUG8Q{S;#!$nU}q_%z++gg zr3&J16&}N5>+8rSK(nXQzNHo6vGTG`rw3M~%CL&#@hs#}@OTrOWt*%NYZW`2!$a_R zQ*l_whf)0OI~R>@RhT`B3~gV z@q4^isFiYW<8j>d_}?0jlcvY_H6FKw$JvW{|6c!FDO>yZQg-^^OSNZOsQH>V7&-ra z;f?&k%Um25Hlb_RL_R2u=2Wi#=8O2G?3||O7dJh>y6JgbJK8Jph5o4WmicJ&Giwiz z+O*=^=s;A%mrJKklzPFa;KRtWi3`>Z%Zx%@tAkRbHa%3_!co}KxJA7`tak3ON~;aIa1ZHrqLrqxBO^!p-^Qy$VS&%%pLbi*|qB; z(n}*K}XqH*Yo25GkFeDcE;(SQM^i~=V zCT%SVEWuDZD0pQ*Sx}A1ch=nRG4XrtwPc_fn9<3pp2`|h;ttV_K`V~ z;uzkHj4W?)U2ukPn~+qvF@oGKst?@Hk+kSv$wmaQR|;J+oCXDQQi3#B<8JC3QQ&L% zrmlA-{kU*pv``d@Hk^ITN(U)Nvu=@B3NX|avIVBMGU_n?HX9XGj-ynK^r(J>@+bjY zIxgjQps+A~lrWuTRK%};UpR-5R3x^ z8`&X_^Bp3IZG49~%Em!_>qxAw`eD6Jq{WJyNMnY|2?4{Aavb~tc!I>ZoK_cI6#|O~ z9tjEV%*uY6fXbD!TLG}f;UT-dF%D8d2qI;vYc;7Yy&hI7&ANgO;ehywuVT90UOX!&_| z|1fyZ@2?zsE`8^KwA6)A8EikV2dgj{jTMl7uM)T@=q6rO344j`WLRrO z4?%T_cEa-@)9olW<Zv*j|;+M#Y2#p_ovCIUEKtsp#;>P1CtPsdKX()saEe zYpx>9N7!8D;g|KOTt>!6K9=EVE_8L2jaC}`5+%k+LGRpotRUm8kmEyyacL^+^tfzb zT~xcF>_#a%f!Z377c<)vT(qS!tB;0^_nJ-e^05i$JcM$!P)Id2+Ej$t9>&r^vXt5B z+^{tpU%RzDfwmzJI!A0?addq_x;s;#l?pWMaT{%RS*kXtSr=`haZIa-=%s7}UDxVG zOh12JlwHVeSofdGUt~#b1DF+>dn^j#&ghL1wb3GvtPJ4FvT|zwa-b?Q+RW1&=uk2S z#+(5@lBtEWY^$u$Vb-Z!1&Ha`G(Nxr9AU!)m3-trP|Z#b17?) zd>n4oefom*UY5WtaMB;v4U+)Oy!z&r8MQxaC^8nk$$%Gja!-YwoOTAYn@)e{knLYe z$9aaT5wQ29{fJ+TX`R*6qNplnC=wji4sP0LfJQvZo;f-4wE5Jq#9`+<9gUz|doAz1 zt2w=V$?3EMEbq41g{ZgVOdCHOI3kRPaKa$k!q9vI$JRSt`(NrREboYn!`@Db^DeTw zpKp$>f8Jy3tNF10S>G9dL$~{UAR*P9F~_xagrwIcI!J2cJhf8x8pDSWg~D}lF3!}u z^Whtsyxz1mCXt>4U|_w9D+`SU__+oBF1 zrsW?_DwTglvwOH^cM5?jOfCpWcO0b7jPHyz&z;qA^%`q;2=M~Q`R*f)T`}?sXu&&b z0E{MsGV?BJq2vf5(jlw3XvI>O7f8+rT%4rT)<+U&=+BS&xL8S;g*T{1UTWo@Q4qR~ zl5fbe+Fay{Fs88+SWEd;$}aM`$yVzy*hsTDh?hom7)eQM%jpOo++P167~;I*-T1%I zd1&o6Cs=@Jpji@5A8oYC z+*2p+D!b)6LeWOY0!&zeLHzER=pk20Jk+)^a6HsTBArt9Qq+?^903VJkpzmW`_=O6 zu9%-qvX2n~*&;{V)fwvaOIoVw2HeR=DY+_rxtv{bk%!y;x?=pjTwawv)@qNDpmVwM zdiN;z8rg&ik5JaCa8@F0cnCl%x;UVEd0TBSAfcs4z` zKeGG%$s-ZbPZX<1A!P~;UYY*FLvn!Ha~u?3A!cQH`f8+J;yekvE%TLZoF~iOkk7?| zY2^`JC{a8f?Wz0xWyuOT$K4TWgXCUZILfIsT{#=gUU0SMo%sLv3MOnq3=!_0t&m5eU&2!T|zw02L1OFS;WcFnqbZ68CguSzVmU3L(C>KP8;? zR7JF|PA06K_IUW6H=CB9jnqGCicT5t1VBT))RZ0 z$$K`jXOoN>dnK_~lB{icx~|3edz#wMBI<`YC&$k$_ zKaU3VZoT7bRr+9yJ=l^(tI|hX>`{s@PoD&3TI@+m{YLM&T9v-gVlQ~9*IVp$E|#aK z5*N^7r5(H>re7>OdhjFk_zIraWg)}2IbgvZavm?+ zf!UaO*Ln8GVt z?Mhd8-_Ys+;zt0wooBpQncmlGkGI-=t;^GIwc5AbkLjsadrJJppRY)tY4yQBCrO=N3CrYqSf&#=1IX(9Vcb~d~|S@{@bL@V=v{0k^eR_n(GoQ$nk zCOFl0ipMR}IJ{GTG=HknwOU(Gdb-jmu!A}^LgP|R?{5pY1KhS&)33Er7ybNN8y&sB zP3AuYa_|%EKEqG3Z0$?WR1yVx*(w#@SvqJ*jh-Fx05tf7V$=2D96!0Lb#bbMJfz|A zFBsRwibPid;724m8I~a+%IZ*6Yg^D6ZEYxyKU6(4~0F%ZXuDX!$ILe~GRy z)-{HmE}NCkNV;jPOYkGmJe-w%mEz1*(bbV%t#-Nu`D-G(#@qRnV#@XU(~2n%;Qds@ zM)MlQmqMy^eWk8#8g0x>XE;zWGYP4?(w*c7#4;+t&(4*ZQe7tvV3ky2!5kKcu}0oL0rL|2^lNXM+csVG%_XsulMQ zT;d*i5Jv|!i9wUx+}y+b;J)F$EAIOe#eL!Z z{;JP2Gn%~1=kuBq<~)76tE;Q4tE;QKsvX$ni8C61#A$QnyQn(mLTwz^o5K|dKDCK2 zerNLjYRNSfyN0n;lN0=y7$icP#ymXJD>e_7o}bhhf83A+YG^n`VF699)-6c_e~o<8 zjlNsp{{K)D2lWNw8+o-~%aVr}lbtGD7@a6xS=wK0ah?05pXv=Q3-tB!U>E2`a#a_S zi{+#)-C=)yU*eZ0E%E|<2gHrKHOcGHwjU_mBoB3gxLIE40j$Vj^GMiiA1Fp=jm06twJdnt;>+g8oaCh4y0Qm-h3Mw*0?`7pKg_( zx2nHQPT>;sw<`s|aNtLkX>_G7lss!bD!M0 zqfItW2>0vWA(|!GsS4NPGVK$BdwOfe#7$cY6@SDP4}lHt++*TRUFb!l;uTIJ(WAMy z_rubcM&riq6T;(OJ>{tWySSmEuzxpjD@06rLLT0#_(@%d$G0bv@IzvN;#;ovq#EW= z$+0_6SnF_}mScCc36nsUXXLdFNRi(s1P>{!`M~e1SFck2v+}78?OK!wsTi{PUoC-F zj5{nmm)LW38wxgOAYFT1m)N>Q683rLWug0`+_cr`my+m%{XARVEYs}yq&2+k`MDkE zl|&xOSWTwFHlBQU@rNjBQ^XNN_aw^=%p(-bf5TZYG*H1;yTk z=x@opy4JRCz{v29+^TD2dsqI0nseSujOR@l;GfFIk1^3#=b+Z`u{#)jNXbv#FQ{>>{DMgR4EFpy!PQ4B@rA#XN6H)M`NY0t z{`$(@dl>E;&}dvNtc^2nT$rori(nD3&v<#ph<+2?X$Q(oN|8pBaBP4!9Pi;g z!^=q+Qad2rj&s%)HBJ=co3n+cNE}r9;{DQ!Yl)n7n8oNg3`h9mfW*{v3?4ZE*hB#O z;S$6aKfX5DAA-50-dsb%9iWB4NvWJ}=u@0^c+_p~s$>0HLfr!=I_|g&4#Rl!Fbr6S z^7pXXss`{=yvfZu+j2@82Ejy|@Y;_z4i+FG++9Z%;h@vMHehVPC1-P_kNk2(3HQg* zcOv1P3EqT~(F@Kd1W-xw%*OR*bXZieMHNJ$75P?Wum2p+ipx!Zb;Ozqt~Q`HnBy6{ zLb^dY<#YmJS12(ELYyN)tf_FoVQ{c`rlxAQS8507d;k=0mSfJh^%uVzUN3|*uCLhj z66#QXOqfoU_~En$Ty3Vy+lD0r>jm7Q>24fsE^(A*q~;Db8VC4~QREVeT&mA@DIjOc zt40fnS@MLDZiP$C>{QwnE-@rtj`kFNVo z$xB_VkAEwl=acJdedBFxSRf}%@y)gFxC#mjga%zDW4aT3n$a-J(qi!N(IB6 zl+TOEg*Q8&7m;g;{MvCNmCLAeGk?^HOSzTG*?Ac>;8^amG_V!%ZQk|^Emh-OX>(XE zH&IA^U>IscLUWOqVZ3l5N1czDFX)d|?h-tV^G1hqr0uXU+?jT`n07^qgQ$3AWoj#( zX;;as)S32{6c2klq$R9&|I%^%D%v5{u&N?=({VPOvr5&ly28OVroJ`uEfu6&mvYMYJ}evV@Ck{Ak~}hcecI5&!h`bIRI=vRhvc;>)E-Vr zK;%D?5`RGnk19li4Q2T*QSw+UL1Ug#3;<<#*5gis&vPlh{|*pRtV{9x*XQTK##{G- zT>V`T)ujAApK?}aT^jacY(J~_XY@{xq20KlW>4>(-9)q(6&OH(UUFA|>UlZE#h-e1 z6Ukpmaah;q*HZlRMV8kU`!XtjoN(No&*59t@si$O)H`txce8Kdc`uE4(E7HXV6 z)hve5>Tw771hb`2kWX^OtB9Z(^HGKkQ>H>C@HM7{8gL%=y5A6u-Vky`8M%#C4wVY{ zrab$F<6Duv`6KpzTOk3I{0{UbC_r;~SFZgO=1WbmYiiH66}vX7fNvp$-%D}smkRh# zNeCSJN8!ouD&Pl>&Ic*=x*`Zh&}Y3uf2xuXQ+)i@j~^)lh$#E9T>RnT_3+`xh(85@ z?Wpz>ML(-I#MQx?80AxiLIZ%%8>$LEQ;0NG@Og^kz7XcD%@=MRspBGD9u|z_%voN4~EL8lN1U~$egUeXHxhGd`99a z%Iw+&a0q@yEgurIG;qH9Cl4XpdnGxvh0<1?K%}nGXNZEyIt*4JBR++1Y z)4g&az_B9;krslD2tVLjTTk)$p=#$PiWkbai?Z+oZUqHfp%^3tW++TnovFdS$Vpq%Nd29i)5#f@6mds5a5Q}W16`7NqS5ts!OvDFrwG3xu++!&~R090u z87+juBSoBIPG(Odufd;;e>RMuap{m%tc=?Y+@EhDg4=pq3Gcx7lu{ z2MNu)lux4q!FqXa0w(c$mlNhO*UAX!NFU-$5Al!#t1{#9>!(RzY}}IBEwqBgN@lBJ ze36v|{iU-9pn+s|TV`wM>svFs)rZFIncc3w_H>phnGgOuysy0`0RcSY%PqH^OXBDyWcI$YspOei434I_JA}5yb zmCRnjk~=cIni)?l$k)ygUdxQ%4azMY1B=KFIhWW?i2d&j+p|PwTlqBfMp1pLPcQd1jwGq%Si2!YTYE7InwyE2Y?1%3W1;^v#CMHgqCVwKg{{ zyxR)K!_5%m3pTz$gY~O5Ok|IiRqVuq8hm}sI;mhhP-AjINj6y@$s!s|DezOxI=)~$ zQ~Z-Rc&bY2%LxVJnd)Ci0jCoSc4DEUX`kt>UT4yPAXm7VUb zYqM~6p{P2Ik^?&G z+j#|>=eg$>Y`)ifb-}J~uT}D9KJm<=sDYAg(DaUi@rb5(7VOS~ro|2AmT*_W?xJAC z;%-}uKK2Wd+RP>&Ly!Rh0*n|3YXCdre z)W3)GAskUVLv-*k!Tj7uANH+HRhq|F*c$-?#aJqFPG23M+7}dTfy2DEVArZuTrNqV zzd~485RVG6>k4)qS+ENhjAtRux}jhIfEhBBYzrlwq^in6@%7XEGC19^(=RypWGvum* zt#Vv$DcCLE%K%sg^Q|rzZ>#9kH3j3x8klcM#g;_o+Zz`JqWx4vgxd2K{9fV>s@6 zSa`HxJj>98mR4-3`?OQ6IXqvm=kuP>GHPEi*{2g7FGfUnA6@zr0>B-d`7^Rrp3~OL(JTJU2qqcTgS`cntEQ#Cz|@i^<|;9lI&kPhD({seS%uc3#M!pxToXwabEeU z)Q3A>*YV0vr9R#9`WmnNRO(9|ukZ27Po=)q@%jm`{8Z}tj@P#H68%)_7o_H|Q%U8g zQYUr1p3W;jm3nf=>-oI$Q>kZnyw2d2pGuwH@j91Rek%2{j@Jde@>8kvI$oFX%1@cbtc>v-j-QlIX4eT`RsD)ps~ z*Y|kkr&8bQc>RP|ekyf+$7>tgeEd}E7o_H|Q%U8gQYUr1p3W;jm3nf=>-oI$Q>kZn zyw2d2pGuwH@j91Rek%2{j@Jde@>8kvI$oFX%1@xu zvB_+*PAM9|CX@AqqU(`UbSlBs%@h250?BBUCl+mr>m4T%rmAQs`lll(%1(XJPWDfy z6z!B^Z95f53)G~0YO%J25qPR{N6n_mH5(74aT+IxrHP(iw9{R8IHPE!odHs33cE9l z&EaeUsuvmd?7pHCu$*dAtIsLgIbP!2qMhsQJr8pM`DBPBB29kvJfdrwOJ%R-d{xJK z=YpbL;Dx6ZZ5qnasBj@$ybfi0(WV1MSbWUXdy%mC7-4ov(ReN@jtVzd>}JFeNJ<3G zU_ZEMGwK9Wi!Uu258q}AhLD|w^`ICoE81n=53`Fl+bg?VU33|ApHs9s{%LN}F3-DY zE?sn`AlQ|V@aZS;#@ox*z zi@x4T*Tzn|R@ph7%@jB<%HxG<|H5KRxQ>Gx>IKrH@Fkrl-VnQVJMYr%)cQq5agt`E!$4)w6bU`J^QMn@qp(oO0ip<96oARW3DcSHAP$FbiWn* zwu8G(U9tu;-(Ixa{nH(2OnH~wL6_Vqirfh~?^Y|-qI)<1Rt)zR?OxA+U(xP!Q1=Ve zy?|OiE zY8CpVzNn>76^-Y~dN)4=*`F>lr#>yh=L^bbipKK<)jV7DLH(?<`#^u(3z7`$Jcqr( zVLs17y=c$rQ?b4Zf1zkR0{>#sUKDT^$m;HwFjq(5FZ-g|UUuNxaE-u82KXy=;I9^q z=M}G)X1xqnuN95Q%gL_ukR$PW(O&m1e4}V@a0qHtc&lh{0joK@P1tDlILYkVy%WE) z{pl~VQobh&yr(R{qJ#d)IWULyzM3F@`k-hZc*^>s@w`vFJ}laYY8RWRoay?6n=`oi z>CfTQ_Tz}36^-XpB*5pMW}mAOQYPPbm|ql)XT7&w0S+vAqJlaK42 zq8(s+UHBAxXHv-~ImF2&n_N=wOeq=9ct5{2zN8*Jo|AC;3c*R|E~u()@G*8y$;g}oRx%z@_(D3nl=|yY=IPESP@=0 zkI)6vOE%rl_gz$y0aN{Samjct;>^P(o@SQ_HIW&#pwf(z&G70jEg6rhn_1E~2z*(| zW^$6B49o|mYS2BY9o5e+*=#jPLKuW#m&;4Wv%&caiUEC2$>uopxh0$HeQ-s|t|);t zCHQ`2$#~{EwfGKuwZYf5%aPRav>=Yo>)%y%f{0Lrx` z<8de=x4pyQU0C9e3zzFkwy+d1PM1Ot^)0VY5Sh;JLubidvg^IR8%lOVsdgOOt4gs& z4!?(F#NtvefR>buXR&`lMi7PLrjqfvZ%YpyQoNZTz9F%+WJ}eBH**AXOjuU(4GI3J z&zJilOm)`^zLI53Sjo}LlC7lQR+Vg(H~SV2o(Y1dj}EKj$<5VXIS^pJBW-yJ@1`Te z(M&a-a%;(M^~T&*vfK3S)>1gSYDecHZ(}j>?Iq)hG7z~6oI6U!v#~gh1hU*&GM?qC zN`kM4HYDyU*Q?h%MI3V;<8S?sBk$X#aFK7G4hWko( zA2<>+SAc9SjeekH50Fh~MIJ2KgP!dnm=ZqVwuX}NtmTx>Bg)2)G2zjYJxT$c6?v>= zk9mQ|X$xc>6`tTMYRR6Uz*8kQC7vp^hNqREq%q-{l08$>ro^))BlTI1o<3Ky=e%>) z`3sv8&(nGKd}(ZWp=2-ciK`Au#3f7gwbCw z+3U{DZGU|6a*>Ud=gDefNIJcsh6Q2PNb26!pxj&LHbcw%#%Puw);4%10b&FKOcXxMVy% zn!_jR=}&~o`cmjsv_9IN_>_ifd*ZVa+Y_Hb#FNa<-7j96!{OBE3HY#bS2Q)jOY&^YlB0{ng%f{25 zg%NR5*?1z!v_0Xz|0kF2WJlnXvYq0mJ5MbePb|pS&Ja#38_y}_j#^GH8;^UIGRnZ? zjIy0UlgU91Xid~Rqhd4U+fzS8@0Nu80#LVHo>ev;>HTMy?QETs#w`n}c~05Raoo=J z4Clhl=ar2|Srl(`l z|C62QB`il*IMgf4VOiNn&@zX=v}{Xhu;7yb*Q_WT&v}q{W!YA0AS_jpBHije3z0uA zG>27XTjd-xryOokQdnI!URFbyHNsgl(ye8?wX9k2Hl^5YUdh{x$Ao+0nSK6f0=(A`;;Xv*_)3;B;r_DSSGN1%w6$eh z>plEH*&YxCPaho~jHmY>^xA+x!@p4-g5wx>Xh`LB^> z8bRQE0(=@r1*Hy9Dj9wHd!}s9aN?JFr)I;S5h+9zfE1X3wscKlmcP(M|NH;xIPmF?5AeMWzO zUbfGjtY4Jv3-!0Bj}Bj!RmQ&b{`RVJ_y~!w%Et4de~LY}p=>;zJGHH1Jf5OH{LtBA zLd7OjG)N~_Y+^+mIH_WjDw<6ubK1WG1)9T@3iIBS3aCt|C~Re;=Dp)9{AJ#oT4COs ziaW*$9Gd3fqvpL6@Etf&W$nbum~c|XPO5~e3UB1YwyKHmtO~B}I$T+C+MQjov%UV) zDt4N?e4JCUbEs1j9}51MaEgBb)l(~Ws%JgDVy8Q*XRyH$Q9Tnk6d`&Vh-&6LMHTa7 zqd4-ZrJW>@?c9p-c$}9=wevZh*(nP{>Vk^#M5>|c;~!1pw2Do03@)tLg%u5u=@sLN zu=(0v37Idd7|(?sRU_7Nam9E%!U754aY@B4q0RKCEIPS0;L?imuqidGVzbmH{b~)D zRa{bE=EtS4kE@*7730DFaCyZA`sH33IT7P?Dn=?~n_DrSIsVCQ6IZB|zFb)`o-6zd zDd2on#jg6=yxTOn80O&}Kx4s@k=`*UPuo11o60?u6QF#_;|aSb=U*{6VnU5bKA!OT zSPnnv9JV+uo`;6hK9$P|cN%zje~w5q(EL2FfKAisw`nQOKiLcQ*BNSz48-BmXAex- zsI#m6TRFoCm;*-=Kd`?;JKBbG(O643#*QfrArrO^)!T|U&v3tE6{wT^WYwvP^sjHH zD|o-)`(a>0jl^jE2a|JnsMyi?91kagz6Q{6JDN@HlvA3J@a)u%7PZgu@=O=!rheGr zXpK>zpX&#p$aRjtP)uJSQh%+I#wYxhLB#!KRF^uzJz#{?tb_!Z?CQD$#*Oa$FbfmQ z8u=d}WD^_D5OLQ48ABfNgZwJ{s80CXBarklPqW8lqy9!?uzLEL{3mp@AHNFaxY3X8 z`x$?}{%aZb-@ppy^|St}iu3)Brl0Irf*;-&sh>;eM4iwl1L_Zl?O%3phgWn=UOD}+ zz4|jhU(a_X$Ak4G`@wpjVK&j){q=-+1uyHWR*Y17f5oqD?S^++V=iO5YGuqZ{5Ks? zJcSRSw{^!EcqoK^JcqA({2acj=WzW$`79I3dt8yBYks;@$6I=TQ}0%#j_zS2*CU9} zBD!$rD?uaGWA1ezfX^p}%K%;Wf;>`jVNkwjouV(v`+%=8C2WFBd73j9IDqOP|2Ozd zaG6is5kPS90=NgZkTU>k1Kt21dhOD4)oSB;)5=K)b@if;ALP~1d#;8Vae*~b&# z0Wmc-9yOf%hJ9S0pbI|)!<`5O!<`7efdq~K!alkcoag{gbbzPmCXm>I&ZA%cCnqO} zgHIJSk+<`;lHi2@B!)1a0Otuw#&(n~I1*prIB;11LJqEv;&?u%@`X%(69!rNfX;HU z4(aQ|B|3ypm*w)^PwE4%Ib5ov`FzOdh?zQ~FTv0Ge3CenPvd+WFT0MDR*o(@}D@xg0rKjfHd4meIGJ$R?L8j0G!??tdldQZQ%$xNj{J_Scmn%w5VoUCjSMkGH1_JO1?u{S9 z<`@-z$G)Qv-z9K2AGk3-3a;-GkL5co_1RA0?J(Y~2QYhM3ee&7UQuW@g-yMYG<=8+ z5u6%Fq9Mvq8|s!rER=jZ$PS8!p$`a~QrMkOxQ$+e5DFohIP|5$BU~dUX~*Y-);yoM>pee{h+ zj6|_N3kKm&_NH{PzTTC5uiI z<(15*2?>W|ZL{de=*FT+a!8K9UFV$4u}J(Qg|VyDQ{<;?f9E%XqK_7w$NTN^pfVNb zu>=NcP)x2q`Fit&cs)GpO%jh!;(F5^nzi0M$vrGtZ=UL2&!^J#)8vaB*PExy5m(vH zNbp70dei-NaeO5>fwJMet3VZ8rybXucTl$m)TM<%z5_;Fn zwWV%ZtR7V z&sW)k=Et`htH-DHYm^#PDn>>la&E!H(s}S8;K+rSNYcdUVwFia_xc*M{+*~aeaJ>o z8pV&M3%JOMt|uVPrd1?QL+!64p*%<3n>b(75tmDX*$GLkosh#))r80rGKAc55fZ=n z(v(PIqPJr6QA?FStOWC@ZiGRj&I)_p3h2gd8w%(~1hf`~KVt#{8~CuNm92q*ZkLrd zBQVjI-0c%)hd5cnHEj`?d6&O zb%>vdzf*qDLu3sDJ!AzMjvW4~#ZRzvUPYA(8s$b+t7Txd8#e_F#)5vikX1cbTwIF~F0Mm}Q#vA={6^C;iUG$O zp*Rco^Sv1tD58mIg(@&jt&9;*qLM%|O2Txtg~0z>BwWb+LKec(a~e+X#5ExZQ31(P z&b<%Z_wu58NRzL{p>$mr;UyFmDi-+2t+-TZL~M3PtMJ&0iekboq8VUIL3<@~M{wgoBAfeZw3egp=2%$WQZm3Y?agB(tF-6fD6hDM&k&_ZBzmd*DL^Xlw&02N?i$M?OpD8Mas&$K(rrIwQ_(Eph zFJ;wIpKKe-#_eLV@NTOzUvcM=+KFw8P#Or`@zJuoo7xP(@ow%QSDU}kLVaP1#z==q z8==3FX-pY{t`Wl8QAmv87bA#um3~D5G=`uOT2Z(pV|9F~RsiC3)bL!AEmmY4kJE!T zOPbx{L#-X}A`%_2Yh)QVkEO!Ds@8SfxI%2tEGzD|;yYJRg$HV>qxE&|Q~C%V~MPg76TkMM`FidZ4>$8N!{}8{!zeDq>b)!j3fR$SuPJBc zyq@5ORZ2w*2C2vljLl`WCt8+I@+`US6}vLWVbbOpa1!c7TdVV;v`l~Lu)q3#nB(C) zRN#?oqP|b1I8j8TA&HnX^n@#HZb=~(JlJk>JlKEYIm-oAnXC%Zy+tg7z?$fBN_15) z;0EX?^2_vB@+%;g1Dyy3`OKs!`fa733=n2R{bV+@t(r9vf?#4cM$?{Hb^E&TlBsul zZlrU;CCipHu&o4w+o;?sjO7^kng+M>&(gf81U_ju0LMBz8GzM4yMy2E5kI($xlM#; zZWCU*w~@Z(LL@TmtrT5~M2g=hg*@_IrTx)R_IAVRzP#-d4X2G5PJ6m6Y81yY>8Us- zQx#|31i(hIHOnS_VA-S(*n*?{IS6HIXy^qG4&m)U-iXAmOH*{wlHU-afzzlRq)1pM zZo%P_9}z{i>kbRGuF~__e6VjD?W&qsjA>|57%_vPcW z7`a*I~D#mgw76XxE>=^qm75gt0V>uR!Nvk57z-U%xJ|Zvz+b@)@Y#ckm7VM!E z>MF#qNd8rGV3igJoPWd?JHSo$3=GtP-)P(FHv-|??Z1t1u?xo)U0H)kJI>KsBMbk= z8dtyPkA@XyVp>YD$uZ#%Zi@YbciSK91BOtO_WLmeoBWfFYPSrqcB2p}EZlq~Y3asV zkE%AcKZX+V^ZOR#?~XMZ$zydTX5T2G`~Wv=w)m^8vMk-A8L=$h)1vK5#j=!2}3SxI6|;`v`RnYGf|dd<(i~L zoNTVXh9et3@yf=6ZcI4dZN7fS$88`g;A=TaZPsVxJedNg$mV(q+F&&Ao=iz!nCXlU z3o}wrM>mYtUB0o7!OV-z^(-#5z=T5N6kpIVgT@8TnZP_x3pcEJ(dHV%&$5Q|2#mgj zi}pN@9eG?zk3yKQ;nW>8;o{pMp#W4yz$@=ahYVrk*NXpv%5>5J^KAN?+4>wPEq(1VxB9_zp9wYb=vE$gtx%H@jps6jTz?ZPa}=eqfK zV}*%CczU47+1N0NS}l|7m9m*anX6=Sy$aIKmyH-37y@}d3c}SQ-PI8D8kv1rHBz?V zk}{RabrDxdK^cW}lpI>32#%_Kp@KoG)i>&-0U{yst9yyC;vYcNjl{}&-PdiyAbLX* zEyD{zQzq91s+S-6y?#{Uv!2Huy-5Kf<0T1BtD6=5vHl%eEme5PoK`yfPSUcvv3I$f ze;EWTWc7`O_?QDHCl+9yu1{>7Pcjk+PJWfsc5^Rm8xj_+tvn*sSWsF_L>X2kGkR?x52@ zZv2%Vl1TySVmk}-E^0@+>anY3t*pOyu|fLgt>%hMwx9Qp^Ys48jgsJtKy(c7Kv!_# zU!&Fg(`r`eYW1Er(DrQB3?JJpcCOIsfwZ~{t==>Ai)Ypv)Q`IR(3dHkdQ#1M$3MPA z)_sUJ8jYy=^N@NX&&b*1kxdhT2YkQ;f3o z=GP#3g3;C=ez<}Iuuu;59ku}{kepTBqR^$rMEZJTZ*zw;{U`OG+t?dX6`^Gl) zja}q~Z&$6isx=%U&06M>t?9R|TjB5!Pf~b%AQ6y$>mXnxUSAOiGrud)k;d&C8-1b1 zwlOaEwyINSF{)xHU-`;9<#c4C+_p&_)lGC%M165^|FnuSH8KU*H+AX-rIe^i|TdVSX^W}g}FO>Q$8?gwEFY|1HR1A z^+L=T3<3~H1-(#XI^TlQTd2aqP7Mu+IS*Djz=(1+Qv7fI_iboUc2w4l{O*_?>1*zo zSe7I`)H(nDT0^Pl>Yxgk3>+z5s-5EU&)X`V(#6~`l~960K78Qgb|F}SwYc&}h}G{B zterL2K{TpuBA4O|)xO0|f_>F+L4qr#yf)PCZtyOxjRSi|D0VZZgb76kh;BJ#bXigq z_Uirb`Mgo<+9HM(pTN|Ohz&QoCA9_nHdYU4zhS27gkoTp5m%*@MP%sqjZ4@86bdE3 zuEMYc!cPL_H!$treuGETDS7GU`rweh*U)sTCaX*>5ERN$9HmLK6hozsC_5jj`q_rB zW7-M)X?Y3u^5jI(I0N_igyxWQS!Tq4uK`|B#}n~ zY@^X}qm#LY8yZ@6(>igtM|+ezn9TT*)(R%j#Q?_@=Z;(vm5(BPo zAO`lPDQ9;yd_q<$DhOZ$Sak`TI9**lAZt75A=LS?YNSSEVEl*K1>xfld--;tLs6!LQIo3QT1yqtGG z4BJOrJSFuz4Bc4$ZPHcr?8<1H)p`6yNpw$x_SLz0hQCp>_gHD_5wK^RE1O?HRZE)s zBdP?X^X_`yo@!%tP-GuET36Fa{J;yAG)?m{ZfP9jQAGnj6KJkNaFennzXwC)R=m&E z7a(aB@?Te4%Hc6lF~pQ4h3%RqCIa z)uhCft*f_=tf&&i@3-U+wQ(9a6?U_%OJj9d`(UW80fVGnb(hyWGK-Q8P1EVATuY;_ zBEy=IRe-5=ECZ6z!k!{N)22hAoZ2D225UGecEWlpV6xFCF%qA+*_38B=n^Zc-bmS; z`MAH<)1(ba=|(Q8RLA_n0gH=c2fYU8s5uzli01|z3GEck-lr{)>yqm-jn$@jxl`J7 zVlgxr)_}U2Q$to>pCQ`5KeRXS!|WS>RvGU7YK5q}qDnHJ^QKyy$3zpaTB1cWDy`Kx5p`WS zLtyV`NGk%m4Csc^;a(Yqh%IL~{4|d10r~Xa2)lHz;j$y>wYI{@9yA4ttLGW8fa)Fv zc2BRK;R%r)dB*kTOyG>VbxD46D7f7PZVW}05eG-y1aAXf)UH_7fu+{V$*9Ik@?l!h zc^QZXHL2TmC+~1+AFg8gXpO%*>x#Z4geXyE^hF@F$yc}%2wDTQ^Ica%r4-Mh7fJP& za#L%ND%?Bj5e@Cyu`9+8WXVqAi(TM)ig5B+7-JU}s@t;m8iGzkk9TZ`lHz$lB5YJE za>FI?i}d(5(otiQdVS|8b$!E|ol}A3HfXE1YINvyL3id=5L69P-yo&(^nkS+7<+hU zcXS&v6&WeEcNWP-spuN-7G&+Pag;lKFm?199d-hNowP1syySZdh>R^IlIt@#V;mLM zFxJ4v>Qz`X2ZvN)mWdV*KL_iq|4m?82X2~A*|7=j``2nh#^ltg39{B_Edgbh2KT2m z%x7fMdXL$&mBH^MLjHkrKsXl|30=dMFyodCfQlbf@+>R~WvU!#JH}1yl76wUmH|ux z`Q$WbTFDS;LwmHVyhvD=#IUPq4Oy+J5{R z(d!P#8TnA8c9F($Wv$CJ{~{F?PGYXn7t9EkNgGy8uyieI>n;mjnu`0=nq(eQHF69Q zsK_jq@zsy(@=P5P1ywI7E{_#57V6wCe4z${Zz~L8@He#zp2z_@x#agH9Wr!8oLtG@ z{*lf`~E}vZ#s}QY;$|>_5O=+y2RZLn`@nNxInFVG(`R-#S zttWl(a}ZweeDk|$PLU0X1}z8KkWjLYZf&b%Ep8Z?z*I71iOIs1;Q8G+_1&!{Y?Q`p zKo7!#Cs}UYTNzsT{k1TxI02`lZ%x)?l=dA&I3qkAoiDYFu_XNIcRt|ZHH9RnF516$zat!(R2I&jjx0?TqTk6(cg@*NXInl zxf^Utoz~#gcGH=~fSpJ!WTPsMXqwU-5D&6A)NDvcu^K(dij|{^Ot!X3D_ccMV#jA_ zm4253RLWh>`^wa^3;68f4db|n8pcLfY}jDZY5DGC*xfU9Y!<}~+AgByd(rZ5wPMs8 zY;vwRXm&gqskr`1&=wvdu7VYce8$q6Syfl|{HzlX7FNt&IhTZrg2=4CpCs zTjz^BK1oll#ifKSa=BCF)FyHl#Sn`}XUP-63YPieR=tkkk*LV;;O&*0GTe3o;{(^3 zSvYYXpjT6Gj=rP$HC?5F=gzGRJj(ZWU9eW-zV6Kw@e=gW$+T3{z3*rWL*x30(MsuS zT<)r`SQ@!@!NMz&2mQs#!7cpRRScz3|mFE5jwcxYgbICwKld#Sd)59*0Tyx8)`3mruKo)_EsBfL)u2Jjok{% zVYBwSM8gbA%4jH}00@i_oQC_f=lB>ZccF9Ih$qS6EOK;3`x7hGVLVR`E#BIYI_)=S zvxsL_ZLHo|O!g78?F+N5?0nhlO26!N-`aK~!>;TKGfxlZ4_r5hu&2B5y0;V^U(mO& z7{fqkzJVe_XN^V7hYr%ge6>kkbilZ?Xo$UvRH%K?&@`J|NzbZl$dm3{`guGL25>jttQc++TurV^vPEt_m zYp_t`cXAcZj|ECY?kCk)su$=+vtf5;kX<9dU4^Q4*mJAgt|FCWr;LeM<#xp?r>n{- z>z9->F?9tf!*VByDdrm@$i_+sx@A2#5bh+dV)m)U1%s19~5={l^XRwsF z7{>9xO+*@G1=p)?A6z>vY3f#cT*m9h&S_gTR!=D;yK4aLk&7C28fb5k4zVo&@5}h@ z5KFWec9-O8&|IjwpUo0wW%g1=w^+Eeg2O_|Z6zg19!bK;gk;7T6@PHF(G$hoU9784 zISvL4t5c#UGeY15xK})@s zaV?9+;;eQWZ(skxGAySthjDC&(FhH&%* zSB#h&T^M#0Y>?3fLU8r~smDnJw}H5V3{5nzI86?bDhEx(&)S-VPjiaE&uS{O8k3ZB zIK~oD&-t4TQ8B%nIvG#!v@mF&PjxkE7iF#pB0S=|^ElWmmlXYWKI!lKA5{i}P`uW) z1r62qrD8+AOl%n00~*5l)+lL3+*?}SX(rT-L5)rQOwg3^}-QNh>O`ovwTsW6DtbuEi}q9 zD7QsE!ie__uDQ)Zb3CRoq&G+v)JrrKS3P=3ii!5(+LvwxZ56k-v8Qc(nA+&&78cbo z*_r8Y-&mBj%tb6yr5apNg8@i4vFXP-|;`@oh^V99udV+4Xpn5`|csoF z%9?B=YdTCMP@l~xbr z6#&H~(|NUrR_)7It;kCffYBP?ph+a}W0)2NI6>BRLI4U#Us0#}#LJYdxhRc)=v4h; zAZgBNfDj_XtonHYvWd*}hp_UAXSj3*TAqqAI4Kvpi!lgw;Lc(D@h3f0iv(qHa}{gL zugPz4?*fAHq(GO^Lf++lH#@+(X)*>;_x(~|rp_YnM;!SPB$WrHR@G{+&ObJ#csZ*- zLb=w169Lo>H8JCej6J!m4UWlq-7NyWVwd&C-nKDvd}AD;=(n!cr|DK_TcN<-H68;T zTWOV;vcBTdP0=hl_}j1Q3rw~hU_Fwypr@+vUkM$5fE!7?7MM_*ivgQM5SdH*wWT4C zeNR1Z*lubAM`<~w=586$m+W_z+S-C`-ICA#L9^L*z}il*f`}^hlD^i;Gwe>In^s2^ zlSL)dEGtbW+8x90F!%1BZ!q%(K=!aLZLr7~Q-|1)8rG&gZ7bQF(QMRu&JNmMqjfj| zy!NQ$RkUwG%02So2pDqunwHMM66I1}6FQgvF`)|%%Tbq5e9c?OSkp;@9?=|27WBt@ z7F_LO_sR|18G%D4AW+aQu9!h@d}7;jY|>prRc1!pYOl#Y-nK$Q_Uh(~kfm%*X$ zS|S$4I@9^eMY^mXVv_XLnsp4nCOMNBBZ-S7S=aS zb-t9@!4FLeRh><6kuGhgz7-Y*GV=-p1PbybB87&dr2bNST)nZ)T7!fK_NIU#%Z0~g zS}TNsRTMl>WB!)_(DFb6U>n=nwrNH>Y)4%?Yi8To)3-+}++HJ!Gz~k}YaKZI2$kHI zol!m;%1v?Lu;{~uDlp|yL~kfa$__1c@q1uO`mNcUWjbSpIA7DDQM ze<5|xdTRD>Q&Geks>2%c|2W-9L3y|3SV689Xd;3hl~H>uc7E=@4{Jqsow_yiZuW2!xyC}aq5UaR};PG;EqGMd7?=qQ;Hzer%gN{z|N? zu)tIUu^J*8U{aN5qZ{-`;oaDY^4x%swRSHhDgQO#6`qQnHW6>tX+pv5FdTJL$u3TR z+Yj=iw_whKFpvLfA!f%P_`vb(kvP+~ z_<3miy7gr=;{UX`ZS7uwiqH@o9lx;=zrWa6`%8X z4HGp-#SC2t%NODu5uOp+J2;MU^Ew$r^c0=XrWTHOgW&Nhf4t9elM>;0f+BV}mM125 zV!|Qr9MO~HxW>;aN4j;!>0}-9)+wh`<$X)M0HU8ODu)i{oSvWV_COtHxeFgzbaLkm zKjcjo4qlS<9IPYbua0(~D<3=BPgm)h3Xqd1ZgQ3;>-PEnRK1SxRrFnK1FQKT;lYo4XV!_j_3BV1vr}8jxAA>MA4+#I|J8` zxo)oxk)kKT#yk>s%liU#FYH#us>lGt7K1GqUmN$dX)tYQl+oh24dP;X=jN?*E|7hV ztSFxh)j^?WF;YwxNt(Df_3ll3^hMi!{A(EK+acamjHluSvD_{+9B{`%xxE`SX##W` zfGW;ZRXw1!&Hr5wltd;;Iwq=3G<`Z?1qc9R98TH+<8C6rKLPMhocgK6)qhD4A-#S| zAflg+imn3yVE}h=VboFn7&}Jge@^+Id-*Qi#-={+b`n84dynaC3;9{4pzjhU)jM>$MzFO3Y;Y#WFk}`AIAtE zUO%@4M$p(tDLv3tJ?G7CiJ(2|1T$lt7X|uoK{o9pg-mN zF78WZKP8@};v8u>^dVpw#+RS*>U#iiHm}nX20qC4LUZU%ARoDTT%X9bLwiDeota<{ z><`;0-Wm20RR|x`dz;dGpp27EpV~gd86sQNuJEz(bC%z~DB6FbY5-wqWkmRI<~|LT zYOOE^AFYc0Qd4|a)+W@r$ZK4j*smpHDA0WbK3TsZdu6d4k=u#1;J}&0#l-6v-{hI{ zMZP{EH0BJs7Yh{L$bfn*34kJwi>7qnsr#*Qi2RU%&$j(`w5F1Ffa?JGxPy5dFi$8( zRN+{la?3(el@l_*wQW`7mrpqD2tVCXiv*FdPL7p-&3w@lt)LeYu{W+WqUU0#XHV#f z6qqS$bJWgxvo-SO@2%B-U-u+y6>t6l-t-V-t>R5Z0nvy;Ws#quk0_}vn^YyTrzPmt zU2)ElyUmS>;xKItBlTiMHPabs6Bwy~*vvchn{u{afrs3q=rAQ(F%gxtv+iHi4`l6iwAg9&{lHb|l z@TA&v)iM|d4-HONPe5-VJ8BJxvB<-W@kHhBD~%`&I?(ia=REoD0gB%jU_!4XBqVBV?6`P_+|VhkBbra1D#X zv#DXG0v+7m`S%?P!IeYZTqY+sg8`DMS3(WvvCV@ypWIw8x9-4SAB?tST1pPWy(|a+ z-ijIF&IEHAcQ{5Zl;Jnn2HD`zA+RlWELpil6^2~yPHD@LANZnO}hr5yP1GCUTa zKI54SsaQe7q*o<#d_%NhcvRT%KI&FmCF$(8;M&9ZhSgTaRVCO1v_V7 zq~o?YZa-;w<1>yhaL%;DZ?LT(FTe3wSea@An6PjuW9x1P*CQ$VAKKt^`YS!~KjRi&!7+dztwYcZp82mH)52=>9?S?spu6Ena zSfkpp8p3Y8!712h9bW^s>y|zmqIOxTCCWRCYR;#Pte|uSmnr{M@rXko752|Lr7_AFfzQ4~w!pOOd-WwJTGpa#y7! zpsUSGjpr(kI?YehAvRz2P~yFekl_>zSaAK^-9X?TpD~&5WG80f zhRf2(C`X4)E1qqq$I{f6rt;QbmXc!21smh1s02Fr_y1uZ8r;z-m~ZMnm>>DWm~Uoh-aQwd>Th%hIrcT-SS@H>7q0)ct)} zl!83uUYr`wBF5R0)Rrh~m8`bGk?A3hyfL*KQ*6iKrqpf%U#^~{3cHyiA1bBbE((3;N^O-eUQR9CmFVnv zizBk!kC3lUZFTDGxF)qVX}G=4j<=?Et9}xuCRL+uOYJu2p*vEgz(jYZ#&ZWubXRJ3 zsghmLS9eAE`xa})6Ebnm9&pYn&N&CeIk%^<&YjLWw~2L%l-P(8Jt<)-F;OLUREd)^ z<=%@3$GQ(h@+LaE)TCNpL)Wkn>Vt+mkaYDkvb!?mfcRduwPd)QNZKtCG3p&8B; zl*k_sruHD?oT!|sJw#r}GXXpz6Fr>T!|r0e14|B^F_$h=?kr*f!F`xN^%nSL35Rkxqne|y+&#W*J?EB3HY6`IV!EEZH3VOS^> zY~1aF3LwbvM{+i>Z7&?C$tFSE^{C^{s%ip*uKDGDN7SLIg z*$O8js|P$Xec~xakw!va@nlbiU8~qO!gC8 zEPeM8TwmW7kjw!yJ611FsT6B%XTSM$#?si?oXrA`a`FF7`G_4n9OUf5e14FF^i{B$ zbCUKCDCKT@zUJk}@3rV9Igb)UGCM`Abtx53bF!{Jm0TDd4zf+T_{Db^K#au#?`JWs zznjWOf!kg@Sj+~zhp~@sQN!I6`_8-4HqK2j$5+FrY5aK(KRNjSnJ}c>d5S1w`!vgJ zdwwFn0j^(VIc1-vwCU3n%RffsgW}vsG)*eMK(RvUPI7Ew`#=_Q5wwyv6SWaCP80P2 zeW5HH07JURyhII+nb~#h;^e<>e-H9tNOqvodGDVmGY%`?4+i?Qoz| z^+1geY$N<_4l@$fxS!W}X(GEKHsZma?-DoA%}F$PP~g=!gr&Ns9D!{Bxyc%X(Lw!HluN6dMchDFjF6gvly z-1n_N{uT4$lK2&qEoooTDcBEgifNb}=!Ki(cwH(>B=wPUV@z45Rj`H|MvSHY!a|v6 zIjvr)Bv$ugM~sSx)97%x)-mAVTy%>JL$#$=-&$}3=b{JNv~JE1lyn^!)g!bBQmb>xSAu{L&kF`R2m&? zOd7W)*6XGwQReofcG>>etu<2bkbOysScb4Y-I=t+!0wESb`YL^STuNu4Rn-_7Gs0B z7sxF!5G4hOmdSnYdBsjGl$NJuKmqNxjJuI2&20fjn>bF0y`sfH*{v1y;r$8i91&XT zJX0f%V#@uq3gjs^d@#uc?H zNBvEOv5)g`z6bL-8J}>5;PXQW+9wk>Rle6Oi|rFG>z-BsPeON&3ja(wsX)V@Q8Z2O z*Jl&+pWoxMRUt*Wb&0Ku<(^NBhqk{MBWr4CJ(2xD!&$gIQKZ z)$Ij#xWInLdj%qma3Z~)5Yv{5#qZ?XLHQ0-zVA{?7@^GV`ee8?qjR=~>dj8+W-;JD zbu*Py;(ZUGxplMRW^S#2!bX5D9g6S&M&?~9E zg2o}rF3W`cHeqW%h2}_96p`f_Uu-#=#fr?ftL-^52H>@6{r^xSUl6q@J95*Br0Nq9XOw)TXAj zw!3b42ib5!%A(~2+Nd<-eIE80@R)T7EP9e8I3e&-;{p7sy237kpQWW?6?*4XS$p8j za9d_PGicQ9ti`i13l!>=HOK4r#PaQBUZcz%nenL1otfRKG8zJofJY&91Y!VE5I8d> zl4xfT+8?_sGaiAsJF~kZ2rlQYW2Rc}$&5!??q!Xf*TU{j?6k8Lvb2^AuLr@kS@p8- z9jI=*FSGmVDGd$32zfY5vN@GI<;HBA+5Jjpni;-Ol;C#%p+|`v@P%E(i~1_F%pCAqTM+z#U%?)DzVHhcaE+!#2PhslCCA zU;ecn*MBKC+Jz}Q0T0j-4`G#<%}KJ_Zrlr#8qXtCb+K*(Q>S!cEF2Q=1f$I8@VbVC zz0Q(y5ZJfNjbDUIQ{y2%(+8=2;6-O=VUCWd4HHLb@itR8hQ;Mu`?n%UDBE^n7$o6k zn2gd7XZElb0orF9pW%x%lQX(cl+z!K>w4T)T{*MmrsmvLU;w{laAqS$oV*8S^*vhh zQ{x!mN21X6wnHTS2JFOW;mDa=sn}0vCX2>e4!MR-XP>IyIJ{TY;XS$iK*NnmGhUn>GsE92W|hwYt>0k!rqBKuYT8Dn` zSiiUHKaa(Z;0W&-5$0|-`<7gmwPm!Y5Z)Vvbu`HK6v7~IgQPzO^Q;_;LXG!WvdjYm$3PYTxj?F<4 zn_(>dhP4FTt6XkRqbUG70I+7ZXq(+6MAjgQIgueX;v290S!u*lna(0Xz z!@&|UOm{Ji!^=-oo7ul-(x6R6ZFKdvEdl;DJ_gi}8>_R^tmnA&xGvgs>cv>tP#%t& zq~q8P!!*S;G^`sp6HPs-jsL462PCzx8i%t;>DTG&=A=&e)5zd1Amu|fUYWYlRX3EY z*iO6hgL`tiR596gMfS0fjgA+L!S3$7U7PUNLmA#1b*fcnrA<^@S>7~BZPK3(W!P+z z*Q&1?xnFPzv|I%y{5ARtjI*MCC`?d+T6+}bhu+Bhv4;EHCRL3vYHf_3i+wC{mrLeU zYJryXv19fgy2liZy&JDUCiJnsGg)VC)>!S6rsERPD6*cU_ce)Cc|Q`O)_I}<`X7Vm)UkF9H~HomxMvC0_hA8kRXumFhqn-0Kou? zsGxvJ08u6foIpSbgG^2l0YQ+w-`}dePj@sv_xa;}|9L-Ro3n@7RjXF5TD59T#g>bj zaqd>lW93Hbj-Xygy&tCDv2wFN0&ee^`(v5EANG4^#+v>^egdrQSh>C9912i108|fP zd&5c;fU~zi!cmjU{$HW&4PWi;X9DEz{Oe{`@NlG-G``T0-821c>)&j3;Yij@x-iil z*{`g5j<|`GJ<`usnxHx^W@V#6C3RFXOS#l?3)1y)R`&VX=diw`J3@h~IsQ?!s~=q< zhjY}@3}Ia-tLEg}ST<(4qc4od+8-;iXqPm~#YO9-9(SL(UOC8l z=Z`kPObQt|iOGja=0V zvEohI{Sea_MfHl*sUNq4e8Tl=uKa_d8q_3&-DnULw+?%hxKah*is@yQRx)`O4CJAf zk0|7uX?12w)J987oy4+;Y3gzP2yrF#$bxt&d^L_n3yjg!zQZh5Ok`?Eqihx{pvEd} zacEKZ&gJ-Quw_XSP{X-HGnqz>=G}0YUs!>Ce1F)JTteJkKiCOjwSY)l0ku+-D^x#3 z;_Am@zZ88{P|CwBx0>N(nq>e|^8=`2x}~<#T^WJ0EGg0=lNA4J!lcQ&u&{7flZ-e+ zi-eL2BLONxr$*L9ps}1n0axJZqGB{#c-os)N(i0ka^^^#H=#-*=N?+=4`LSX>GoLU zXUDAypG!;6pmY^Hq}HZGm4pz*^I3=p@=_Yd9at@SH(f2FWtHDcYFHdB6i{o^Kg30n zd47?JyRcZ0zFV2Gl{4@`>Gmc=N*fPtkN_F~VO0(*sg zTne2A_e! zF^%OPNg+r>JW+WF6c}BT9r>-XgAclqr-$X!V*Lr&Oe~^)5zNnr%hTa}W1U+h7NsWP zJ6hT}5e8x}3wOj6O0;fB&I#!mXflLiO`yS@e1r5Sc`iyxsULbY>)>8`W~eEt>!{b~ ziJ!2hrkzp@Ti%x`Qik&CeWQ)7?N!)6{WEIJnGNx1y5O?y%{132erR!Z^CYsTRYQW) zsBmYm6tM6ojZPU5Sem92Db`q;jUoj~tlAOds1nC;W{E|vAq~!tB&$?0*O6`>DMUN# z%U$_$OVrO7X-gzuq+OGrL2ASJ?d5m8?sMYTyZW6RPA9YSIX9jlzwD}9xoW9gx%A2u zAv?1NQ&a*o9aDvy=*E{HQeKQniX#lDT%!2V5Gb1NIVJsJgz6V43Pz;=L#RUk?zUjYgmQw!(V}2ni%m~i zpOO7JVMvF0%R#FftFYVS5D2p6)zbOmce&p zC~EV+Cg^!LRuX}=G3GAC!{4Y2`4w@?P~cv}#l9SA6+6n9Ry8MX)`p*v%FDz5XkG6l zlkz-k86^}5|MaCv_OGJUy6cJ{VLh+ z$TmYy;ql`nbK&pN;nzhNzI3nXuO>f^>9^LX`4%}_iqO7owwOR_pz!;$pU~Q~Isc9l zP0D%mM=Fc&xM0fuhqWN3PolvlT1;L1fBDbi#gaPJTd2>1f}V-|;CfVe(nCZg^z2$6 z(D{SG?Ce)Tshu`pa2VG!k=O`0c?Vaaz(=qrP))P``HKN5tu)oVA|1KDe&5u%p^xaO zP5UW2z%fMp%X0mp3FRwPU}!#Re5Em+l_qrr6=>!2i{hXHy&$H|l`(A=9oK`?1ql=n zmSPl?p%LZc;o?RCPE5hVk7Ok3fcT3G;ZQpOi%Y0IXf=p6M=CksaWbj^TJtcne4F zP>9y9jNO&ibrg)~8$)a88?QD$E%b?B#_~(0laf3Y_iqKrIpv|lUt?Ij#;|yeRb@KF zv?|jgCdYHUbnLE+lQ9c@Z=B%Sj=g7{)P>1Kk0TicwIIE^UT%!I|1Fj?>95o;31?r4 zQN&ym<3%TSI)blpWzvJUVo@sfeU#^4YaReS6;349LKtXj$~-wE;uzS9)14r^gY!cSFdPHFl>zqc7!N-Uc5nuy?K|ZG z2r@=6rHC@Id3~2012xXym0zI7`FrLF7+PYS?>6VZR+XY9b7oYj@5_@h9i5GG?UUvR zAHM=Fer6EZ9Ah0w>cmR#wR-Q9+h6*{{js~>zIZ_1zYoMo9_!8z(Z|56AA;py83UfO#~@!RZAn@Vp$LbO_iM`4yTc)T1$4_28GM zl@p)4$Bae)9FHhm+0=2I<(31ij%dp!=ugZ~4@}~ww_Kel7HDMAB&2kPL*>Fa1ZXeN;2#_UuoZz;A;eVo2j~`} z78?EEDRIr=9H$mH$L}wb%K}ju+5oko6Qcu@K#49IRiHMbhbmosHjpO%LNXJvzttxM zrKPPxlonRaYieX;tJew)3pL7L3|c%EQasiuku7bYLo3MMHZ6F(J6;7(fC5i20%T_| z^23kez4#`SKz9D}r!_2})@Xi;zI>X#$Sk#opd~_kN0j!soE`m1fzW;4Gq3pkf((}EtL#nQ@)tY6mKXx zJ%R>?8VxK{{I@$t7$HxqjrMXyIcdBxzayHxA0y%0w<6Xy4J?~hu@GLKLwxX~8Ov;S ztptT9vnniTW`zZb+nkxb)Wo+yc(JKjl`?z^n#^-ds99-eg9RL3s5n9-z>6$r1WM8` z%CigojK5e>=I&xp_&e;YktF+7k$l>h5LAv4G$OG9@;LlrQ3#6?`Yy#c1u^goi{uV= zsqD`?$yKX_Ls2G{{ZD_{OWudzHoKv@)Ld>H(A@W5y)NVIeqeJ=)!;!*%|#y6<_b}B zb6s6JW3x{b zN{*>7X7yPYuE+}F2*=+Q5t<;Ya&(qoH|tx= z9a6{J7GB~9mc1O5R(zwayj^)5huxv&9~TvfrfL`Yo9v`D$mwReuF2=@X#C1L6^PY> z>(~NC1>->mZ@^iMGPg#H|T1tR$C1zO1G{W0GrEMC`l%Ou&f1m`Qs$NGA^) zq)in_12{|bZfX92+=oNpAvU2L_vhm74SI3-)<62}5Y zX)=7%`ojb=pEEtdz3f{6sn3f^?+V~7;>HEk#bR=uZnws&Whu3MM{Z}DnRiA6?Z|rj z7y0b43EvvC^+He`FBKu49dpsis52^e*Pw-uLmOcN%w%L%6-yv zSeBn+eVj^fXEA}XE*|aosUHwNmqGjo^5@bT@t~p#%ReoKqmccm}6BN*_E;wa)ZHt|gV&Gc* zc4E#8y*4U8X4xCI#j*nQav-+m!g_ND1#{P1^k^@n{<6L#CD#p+#>m~kJix&cU!p)* zcw3efh+z+M#Uw7tGyXbe1Mcx?`2H9(8zwLrup`iPWiAv2=0mA79AGZjwERg?ZjX2A z<66Eg@o7sokCyk%Bm4Hpec$3`>{^sU?oq`cYTzH!g*@^`$s3Q~pD>|uup?=Qor(Qe zI(dHz@VgPK$fWogB=RV?s2P32cl~j^TSk_NOhf?wcwggzqyAE!a~{=bn(D?9gZ=8C z&eTRfsMD+o@*$AD{CH7O?N0#je0ku_P~!IA=mCy)3*~pm!>1U4S7JO|S*?F%gvaM- z$vfnaN67)^eK!ODyM^I!cBt@a;NSt-YxJ)gwEZ(s|Edq_C!tr9C(t7U6%wBjud5Hl ziw6f-#EtJcmFq{zp|@KiJoh}gcl}rsvMhb)^AS#Z`s{@ez=zH>odESU*5~J~&o9cw z&yDTyFUfmdbZ7a$7?A`;r8iUEm2N zx>7hR{Px!3PL!DcQ1|M+5kV0?!U8QoUT^8#ac(T89rww%1Bq5)6!g=K z91B>FEAEt95Z;lWq`rMuev-jwH%}q$%Kt78NnQsDc$(Jv_i(eeOh*5}w^U8NN6o6f z3U^(bOvD4GE$wM7b;Wo(s->kdzKv>WS?u;yT{ucEtL)b~&0w2V{6Qpt$yV!-le2=o+W;fyic5&+v8V#jlw#Lw&>uV(!4B|T}cD13Tb*WN0r%4^G zf)uK>N}AbA_PtOTHNKkK&YD*wIV|K<^qIy-anyDB%c3RK=f!ffK*;5s`-Of;j5N&_ z<==_#l&b9U9CGBdr5d96Soutyim><8a>9k z25PiaUz-X!)>G{YF-#~8q&x&pK&L?6$76*(9-C}PwUlUaANhITPFInH}DR7s?!`EONZC94)64 zcjg@D*?H$Z_EWV!&W%+ab7_69T4y)NvW1)zX6mg9bjo2a5eU_louGk0f(Ab!w1hH) ztS;xOrE}Z_hshODSM@HF>cKCKP)O)ySA@nwXkaCB1f<~tBBP)Hnc^ntg98D?Qb|oQ zK;UV&DS|4;R#G5v++TmX!(qx#r6owlbP6)}tgx1rN3221VL|u`=`{+3i=q&rCP0GX z0YEN@+%$IqU6v0ehFFQ(YdLB`-^>G+d4USoMtjjZA@coO$1BV48meEVv@B9oTx_kQ zy4V%v1!q!(*Qg-axuBA`)LwrnBx*Tb+KTCfvnjR6Zs;NRQ0rfgP_WVZL9}lEwgk*u z>xCfYqoFCm%`c1M0XX}?7t1auF&&;NhA*pX1ogn1jcE_O$=EFVl)B{hajvdI9AB)P zd2T3H5?VC!@O!((nMEoZ<&`b&ogK(*S&X`hMw(cZwdPqG-ZSI6 z01)z`N<+a05PKZ824n_Mec0y7*jpWrW0}5~n)7OvKDcVNT7N+PLajuqhgE`lI95fi z%EHg_tZA#{wZAZqhms%&JhafP{IeS6>6W{RIc^4CIW45VYQqkw>ykNEeyybVcO%Z# zBnwu->n8hdGZ!E~b^Ht? zQowQ5#a=GJ)rNq4QfFa}TK!m1F{#R5N$W7}_l-)m;9yi-gW%w!cGh0ye;Y=2*wRUQXQm`+S z!JZ!2x5`jeWe8EqD4IrItV+7hGnXDK9K1;D!5@7z(JG`R2Puqzh5<^Wi6Wl@_IQp# zof;$}==|u`6|fHMgLR#C1w#r3V|NaAJRb zyA(Iyk*21KH5pkP8TSs|z6_;pueaH(9f&G<1@BuLb+6=^950ja9{6aqJJ} ziV?E%q!dtkEIC0&=l^#3ZO+ zoi8a1Kyw1KC0|WGDWS~FCpZ#yh71z=jtmZ8R?3FO{@Q%pN>T@aSyk}cDnU!G)xWQF z6Y1u9tiU6@>HU1#tLgOWk^+G+s;xIqR8ENNx}>1*uH(Bflb+0L4Oo{afGkx$6P&R= zPl$-MxYmEE;P|_wu+CqqA9rb?*I!m}mlf9f%M0#u!6e5CFn9@XRu>$9D&1Xh-Qgv& za4E&)^?BlTq|3O0f4S^bu*?lY%#D!z^TM@$j2PNj0 z#SbZx4D+w%i-cVXz#l18&3%H{S&Kx=&kuoURMe@+vTx-TRhAbNk694eBOuR$$Otv- z^e4CzSk)iNvppg5?AW4J4N<+CPljpB-^p%+Dn98>w8q$0xKDO^HW_MB`;8VhBgZ)T z`l2;mOWh}>4B{km`WYu-My}0Rh*T9PQ(!vG<|KEr3VgyU{*22hcJeb~HOIJPJK0Hm z#&vYCy=ZZ#bYgJSH=jk+OO+W=Pe(ttbZVv1Q&s0l{y16LY(B7SfO}S1Yy*iw9zvJb z$B}MN*8Am!bPCB#`Kb=}4{)MI5=xgB{L%uv_~>F<;^X2JJo>mlnzS;SZHoymOL{@> z>7;vH!cEbgu6T-p-n*p*zbugMvcfIcI=wqXwR#ERXSy@K>sJ)qvVvOy6`o&k=Lfn9 zVWt-p+y#AfcA_>PfPE&FUZ6@VlrfO432-Rgg>qaEL~DDd-yQY+=WWV-J{dJ%8xtV= zd@&*C!WYmpvvrWnGp1ep2|gO57>F<2=Km;Rhn-}auG)@$Vb^h+|5M)a_s9GN{?B<= zzRhpVJ1(~7&+&iByT7oCDgQ*5e*bf7KiJSF9;-=G~j<^_L(;EK&F0;HFDw z0|SQyW8he-%}ZdS$_vyL;rD66NSCe0%e2GE03D<6*n05SWk!PKk>3S^-QDf7kiAK) zMB0?y-S1-<*hj_Lfm~qbi!g}YoR3n&T>)CY3i=e0h!4Gs@4AjTdas)%<%Dv}$% z-1ftw^+j1t-4{Bw8G%$RlcaVf41;Y_s9_fdVs8fG;>dqqDW67jx0~)hR;h6y56|S` z(aL}OG0_rR73G^GcTK{vD`5vyYe_xQZB2&^t*^w%%k%(?7*s>ZyfN&!A*?YO9JtWwGiO8^cMlkkiiMu9B&XTQ98;ZTs zT#il>?zPHZjrDJl@3kwHTNmNaryL>cBj?`? zjCQ_l;F5fT;lES1Kl=4do^kzco`J>Jv6~8bFk25=E3`A32fO*!lAEnG(RZa;CuU2( z{yFsOo&I}DQ!DuHHhp>RDN?A<76fS0?=>B0>RE}J-A^d$-@!?pA7PVbgf>kZ$$6`l z6Gc1UY>e9deG%$(0NlhE+8*&cm=_#I2w)-f2q)r{KJO1Y_#{_!6H5L8tSYRhK=uQp z;8z%l2lY%6?hlo86uaUg|0896NWuyCM`3bwM_EdU)?i6=pJPRf+#}YpN6pqm#~xF% zOJzO4%=D0qP4oRvWN-q|fg+2anl-ZPp`2Nse#XqODfPJJap=N_Zzg7xlV<-G1 zi42PRcXBp*d^)*=#Zsg3lx$3HvTatMw#*KbPr;>B51*mw-&$%1aP_QAoa)VUvI)7? zdH(sx@%Jo9dpu8QGOhiBq#&634nT2tXc04%wj(dd79_HN(K0(^**ja?igTl!{%dV3 z`6~;KJojhGB1D5PG19+FugF_q&Ad!i7RFu4|G9NeajsR6duL9`UsaF^DXV?UoT9s` zQ1Vw75XEWx75Tja;ME2H4-(51{0B_gA=40!UzIVbPdI)JcL#*u3kwuo>n|!`ULj`g zLU#REQr+70{vz(L=KjkC_hqYbt!gX@XTJq!zZa_9?`>jzfJB(@^H&d zE}&3oa)-<^6#b(W{Ud=V-K=8^Wuy6%%7D-5;POBl=IL5T{){du>_NFYuwBNQttxq- zUjD_BPnf~_FOgqZbO-u{B~oB$nBR~wM}+dGl47_wt;IJhEoLT_KdZ%s{=g!I{H|Qh z&1goz>0uFzW?ch3;4*=ZH+Z zV%LgEW??YMz)ZW?$h4OHvw3#_TJ~r2DE<%ihrt`TYvpFPKMcn)H(wbj+=tv@3-M`W zEnhBa?L%ocl_P}a^OX`pIK3do%UR^LQr^*8%a8DfC(0ATdQK^-Sb za8@a}|_+CQjq{2^m>ddQZb$#WsTb$Jp%FzZNuns@UT$d7t{@`VKzPwGV> z%^lyGP7Al{=S<6{tYh>AZ)&`#IiUl06lvqw`QSkvid?E(6ui5XcRCM{%}?;9rc35X zO{E{^|A(vBtCcrGy~d%s+j?#8(yZdOenwG`>P}PoG4q-hQm&N8G_P}h5(B-j4fMVm z=&ML}BTB@3n!2uv?K6Dt)>^IRN=>6z$0&`jBC`@xE$)|h6}yZWJ&j74#x5Pd>T7~P z@|D;f9?~(0Pxr>I7f0PQ{W|lXhBVh(QU&<*^-A7A8~o1b4F1qbZh^m1z7kLhIWlFZ z-9pAnw}ssdPRd`^a}cQLMB)b_hj+wZJ4#U!Y1GG#&?MXtyqI17@VrBw>I>Ozt~EA_gDJdVWE znwZ#?WU(rMk8jBN+61)QmCu!K&KEerpL&U#Z+*K15Ya{7p~P8wKi`{UHDE1c zn#?aL>FT%RTm9R4$DeK0akB1|gY|b}et0T>``gLX=<_q_~L;! z=tzI`f)oo<9N|%o12qoQ++qy)DZbeGESr#~+Rxg@v9S3 zpHN0s`_}w>ss9Py7xiynT77GzL{P<3^8Ci9*Svg*dBW3I8{~On$ImF4r%+)Y>0zh! zOq?Yjx-}Nt`)J@n&%vJ{&w27h=kKG7l%C}mdGXg=@|zWKNNOc8hS}b(yq(MqOVr8b z3(&}m%G62OSp?M6!ok*?gN07~I9>vs@8lhS0iC~7+GOh>UQT#0wQ`H|sGP5)*}y4; zp_z_9h9QS{wN{-4Yrd{rG4}26)0CmF^S;PKUsIuCKEd~8e{F{TVCgHDI6Rfv3*j-9 z!w~XEL(#!P(Vt?d7FPX z@APL>yi{(FT;nB?$E}fewxx87gBX4>OF167B5z4Q@_JtFGW25UtgM;{SWbtqO%&Z>?yH|!HOGpCcq)yBKp zPql7L)m$*|MXSO51gYTsyr0UVuI2*Mf>BRXvheqba)Np;Cj9`ZjM$^u# zt<$UHl=|yxC0(Q!ED*<)@ELeb*@oJ87(xF}X*Pak7MaGoFV(JxckF85- zGjI;TJ|}~?%w@`_QJ49BID+S8q)+h8?kea0F9CJ`dHo*@{09U7!N7ko@E;8P2Lu1V z!$4%`tL9R*pYlis_oM8|*0%L>T){B|iKE$>;!8@8R=GMg<8@HwYl<%Cbvgx7dE{!O zs>i>n;_{`asW^52D&OSg%qnpN4;!+SSzE})gl{UaZyuJGU1IV)t_+9cPJT;Q(fwTm2{zeQD?h0u{#XuHA00oR9KT$m@g`tM*aF_ni?TJ<^tPG zxjl8miju0cZx%%QA{LI`qJsEj$SthVrlk_=9* zwf~<$ z&S|X%_->TNV7)uLf!!*A<05E$Dhp(Ea(0xXyyz@0 zf3fIuF1LdR7st_16(MTLn_)QFJkGK2VEm*FM-aCru^u}}i{XM!3w|hD3^ss_K2)7N z!5ecAHF}EQ&}J#YRQQ7IL{`m%C=bf)O*h| z5GmEC`H-uQ8fco9YvuVET;htMp(^dlM5PphNEy4@;65m)xjLNaftuEEC$A)s!U@tf zl%Fb!ZW~L31G)-~YE-@vpL98lofy>#L8A7@a+>jGHDi)#FUI_$nOyn0FokHiP9GCF z@Jtav<@QFRP*_a)E99B-wdh_dubGlOP-d|E<7kxH7z0Rj*5=QiP3S!1ZiXBglG5br2vh(=LAIi+-gkkm|> zeiuNtkyF}?d=jK-3{;h7214y6no296)8Yf+PW6Zz{BL6hmU;)ORX7WzzAPVk;c%>r zM7RLmM=>dbb%ZqFOB$YoMN*EHzg83;)lKkd%4v$2T?BTaio`7{r00~T6U7!~Mv4X@ z29*&pRLU4h0GHJR6JnTEMjWP$P}uiIQUg@p|w&x%-0l3unb;RX1j?N=ulN|(Ye4%nusb! z_s1a3uR*DOE1Xhs4d_=@a0KNu0)x!lk*VV`N@3{{z^5BwiHOBCgk3&taCtTQ zFTAe74U|uCxes07E&JGir7?RR^9; zLhlZQq9Vo(EF$A9CbO}0Lq3|JIX`oUxSkkrjeEa(s+Cp{X{7}lxZb;oi&<#@TU_rR za2;tDfos*%=c-*NbPfmEN1_SJ4LIU#7!w4f9Az zE{owwCJyvtMXJXHm&FJw{WudybOYu|ZggW8D_{w1js}}!HAB|gO*RnYwsuZ$lJTo2}Ycrpyu5jOXq6P>9SYu2_Z2KtspkBMp zkCf4NvJKp2=0r1Q5f*A}(q|y0;!{&R%kS&jlrakD8bVUEIuRS<_F0VWc|SKtE1;$Q zYbCfk^}$J8;#&10a;*wLIza8ub#wdLw-nZ*e?qG;j86_shHfn+Fogw|KGpDlbod^F zjIZZ8zh@j;3io3D!7xg)}j6u7!O*riEs2!FHg&hv+WvqKnA7^kJQ<`S7j zDQjx*x{Fw}4}*Kuhf}p{HN6kl8+SNwboRErk%_WhXrf;JU7#fKRJ2eh$`bsRReK{FNsiQtZeTb!3ojx}*3{Gp?<>Rj2Ey5!n14s%$pBX{?i(N zyjDM%R&-2OTn@QZ^l7ROO?;X+L)ApU$Qb9$uT_3k;e_-5k0F^I zB1RKjs+DD6G(5+rgrA~ny8<-TH#3mv(n+Ilw|`}h2zcI^oy?L0w4AE$KC{r1 zrw0STU`#0`Ru)|k$6#Gz1&Q1sg+$o7Tc>cxS?A>!ig?Z9F`FIM*5C$pD&Y=HWDq>* z3_l6+%(Zk{b{>}1MJzpw7AlC2ib<@osAOUT&7V%W(>wi640_(3&bLIA=|JH*i*aLZ z(2{(X%gaRmIfslxDP($WED*WRb}{~^XS@H?sT@77q1~Solahy#u1a$5OeGCaP#Zvo zWIa`ity^XhZKE{m=PE~!zV3<~e|*0*GG9?z8Cj20@423&CmK3MON~M*;CS8CKU7q= z!h+Sr$1ji%sQAcA9bLAPl?YB^ZlK~N7uj2w&KD!N&KL2Eyx7h`yNEAWDez1nUJ?Pj zJTz%sVN&A=Ay=iU$-FgH)1^R33|glgG%vT$R?8n#Ca;2U)Gg;7os&io8b!vpEB=IQ zow$6B+$+I8BXfCF@?))?v6e2;o#F}$<-&P|3Y@}*4!^C4p}vvMqWWS7-iI z0K8TJueG+XRMM8KIV{&^YwRX;Ao@(vH&fXhhlx2go0!NQzzZ$20jGMTE4NFB7Il@^ znr`KV5>|E!BBt#^_0w@=F-9>#WTk`e}CirVX2%Ue|t5-<})Y$CTbYh5&U3T zMr8*ZMPyg{?%D_o+Q`PzEm1U3E9M|JgmkF{&e+ZZJ*IY1e9UKAc$@7&>O-bph3^LN z(p`>4bf<{32){;`7yioZ(fApN*h2lL98&E=W04( z$F;tW-VlBDU>uDVu;W?Xr}tajr)zB=uRyBN{IE?N1%kBw-rUuNL3z8~C7ptAgfzA# z(JZ2qS8Op`6Sg6?FM)uYaT0G1vBkVlIIT24ywGlfxXu>Ws6#*yy6M_L)kEx>>KIJr zgSGHBA-97<(1(&IUd*74as|B@rDAOMTru1skU0L6axbA!xy5!J>{hGoQ(W*Rk%K%i z;i?yF=OQu~9U|XHt2U1&$&!|hmNUm#H#U)zU4ld7=<;CFUssh^C=c>@#vC;6%`5_o z)nKvQ4~u1Cu^NC2LD86lI^}TkauL|8`Lx(r`bboxPiuDcX$^4a$`=$pnZqsPYQkuj z*}Fkn=Y(K6lc}-(vvUQfA-)m%N{%?c|WJo83Wo|l3Vwk z9Oq_%Nb)sxaL2!u2W5Lu?t9Q;4_f*jID6pw9!#Dme`kZN#B>yx)h{!LEA*AO?4+U zSW)XNaj3GZrT)WVe9c#lK>Mm`6jj&siX{P)NcM!G|xWv7uL8pSaMQS59G?qk} z6_~h9C6z8SMId+P6#$f_a}3aw|xXIva2NX^jzM;QwRb_6w&x#EVZ;i0%XhyYxGJK1zb8!;$~ zMZI~)Ae3J#4wwG(i-l-+J=_D7qEth080N;Gu3fECtY?|IVYlSwX3Th|eIwmwiQx%6 zmyb|_Fd$si*ve(Bp>9Q3B^}`&)rI=rf8xnNk)EJ0Mj6*yI8P#C5 z{OBWD_F+#jJ~vteZV3rYEB-&uyw1*%u8pGhk<>m0(zU(&C=}9}yPnji)#A4DD9y7| zsq?!FabmxAL%(*n{KR2nJ&{a9rc0mLhe39xG*d4PDj9to=g(L#Y+E&n1qobEc9XO) zYo9trbe85}7gB>xVKVp!p_BQ3k{=KdYFgLJ;%J0uVU&wiI#cm5x;fRTU3*2SXoe)v zTmycdby5mlx~>yK*p8tD2_AB$e@4x#ulp&|l(V1RXC-I>RTuL4~)h=X;N?%LYT;xE`TofNCT z8`vpIlyg;eW9es6Fa``Aw}UlksJad-C~?Mv$Okw?l~VF8?J6im47u^qnUNR_TY(l{ zrGyzo8-q?~w~=E3LTwaey#y1QbbR-*fFK_w2)EMdv8Yx%R<*?dUt+>Zwa!LfSDr6wAMdEn&Jc6JidIJ-qy4QOsJl1=IR!K*c^x&8VTL zUK@1gnGARE7>$AuKQLp?4G2@|G^{`cqhxbjD5@XgC?k?Q3yEqFs+GlFuTdBW20bKL zLg1Y;4wU~O@qx@d^?{{E$<6yUmNwN#pA&A+2Dg{>PbhGiB@{TDiFJ0;6?b44vz>s< zSd|I2KWN<_v_8EeDo;UE(XNiAxp3P>q?M$#dcihR6QkX-la`X(cL%QeQ*4#uYt2*& zK?o{jdd+^*&+IAoBK`UWYf|IJN6b9EGnKT4q5>fN(_W+>y|Mz9Z+zdf$p(#Ql`Lhc z%6fFgL2YzaN#}s+|D&w$eP;PwT(Yc{GVEd6(}p2RnSl6nW4m`|ff%EaLXz?uAr`^;OCGGTwWT~al-9*_-pwQ)Bz4>pyz=4pe@1ZjKsjb*(CuxFl>> zYt#^$KFv~2%F;U&eqo2&mM-wt&M5f4%s{22Cv*)}pi0l9JuscTWn^o~t>;O@$D_%@ z>_I|3I=(*Ca}ZhjGWmcLK{`?W<;6D-aR;TzNUD>)%ik#4aSI<}kv>e}EuAR$4pm(` zMPra!9Y(7Az>yuCg|ua9Q0 zMLH@ar!tXnl$%s;ur$_mlN{C{RW1Ss1U$~4q$90PD!G&Tz#+U_VK677i?LWg!HmX^zAA$FDgSt)s*#oEe$ zHi4To_w5VhV=hf6h>Wb^Kmn5u2YhIEw>y2jY!;-Ap%y8CI^5YTG6?7&imJ7K{F`m7 zWGoaUK_^gDw^>%h4)*CBJ5?Eo^4slKYtz-KV#wEmZ5)P@jiuqKb-(PCJ45PJCYkFA~58Vs)c?8xL^yXUKNv9#VhoDUZx9B<8NarwO6B@?4^*m zZT+y1iG|?&vIiN^X5|qq7)tK=H$0$HoB&?eKp#_rGPLi!az#0z`N0z`~hM;$f% z&^5WDq+MfwYTBF&(#^#PYM0wcnv%&RxcTZmZRb78a`PSOlVB>3MevNQKtc#sE7Yqy z_Aai}o=S(d{0?C6IY9HdR?|;dm!eKeuqM_2K=21>V&f$*lqS!XGA5^$Nq|&MLx@YN zS|&*v0?)b|h7EF9d%#mLQE)15z`#&7B#~DQF)e*0&A2rs{BdWhP9(;Q3(>AZ`gA6e z>!;RoQfo~YPYOmpB>>E>GIJkECevpoKT0uDVe>oD1NMeC^%ze`6@f!gNtmdV3L*u2 zH50cBdM|0h-eQLdy~sE&n1IL8@OVEw+i4aNA9INO6Wt^`j?ozY^e_QW4->GoBU&gi^GebN zvC)v`z?t@}I-Led_stfdjK7ERHd_^vnXbC5GdH`2laT+hKG+8W$%S_7 z)vid&bjowkg^duuNKP}2v_z@YL<+R7AwbulZ^R!=E8QSiwQ(9m)rJs4H%G~3 zdobNJEgn_61QFy6XS>_|KsEjYh_*?KWT83~^p})};F%~n`4r}CoSbY1 zAlZSAb2Hq2W+atA88${Ou9V%c6FVT)cVOy6VF0&iNT)5ux+2#V6B6&g|v2|gP=lnA}1K|tvLN0|c zm)Ay67}lq>H|rc64FVX6UV02uPB#^QbrO_jCF2! zr?Q{`6J8X0eVtOq>GcMM8@mnhdIcE2pyQc(6)!W@$v2Px)1}sL8mxCvSV%Bzpir} zIKn~esU5xjjY!@8M!@dvd}jdNq4TGRtL{~t^jKlwj)?Nnf{;%I41CK#{6^%xyCYIg zavp2}#{sYE!4@#O1uT>~UfRN|Qy4eTSszZYx<=vEcgE>s*ScPT)|9*p(7&t0t2QWS z%eU#`_jKpJ$Md^m7{?770t?u^)4Ik14x;J1l$Av@?z>8LPU@R8Lsk~5AT(R~S$KAa z^0M&u9&}vy>H~7E2pL>|l@GqJ)9>Jhcau&&Y4*Q`W^Ssqw$WPK7+Tw;bm(gBzR2Cj zpr09%pz|$BWWu+S8t%^ew`InApd8le;GKM;# z_Kiqm{vczXu^x)r4Ed`PmXIuR9T`ik=$n46fP_lYwxKbwyBI=!E^|rcJ;VyBBzB&M*fst-=2T*UDFIDOUPNirjHILOY zS*7q4WnCj-vKFcXtv1}kR2zz+yOaojvR1oxEeP$#LeUJ79AA9;X6Q9Ve=bKp9r`}O zYRLy5QL?s8?8`7rh&EJ$--~BCGuk0?rQ-YUXrFWSi$jF+m1?5Q{ zQb9*Z=kg-Bw!AKs{E(mU&+EyHVLjn|L^u(Ez79*Hj!AxU1sQX3PLLGL z%#qf_9fw$6=UWW^T1f&mYz`T|p+YkW4yhA8mJri-&KjR#j6+Jsm8b@hd#HC6c1*py z*^JcEbQIKsUJJJTcjcZ*k#<@Fe+n*Xe~&hxO*)Q!)3Inc>d4sNuNdpkdpa&)gEU}w zDUHqheO0XY|FCp6|A3BB&V4|sqXlxEfsAU*9W7>SK5`#-NI4zSjM32lqM?ubJxeMa zP8dLs<#t!$A@pTWkK0uWC^M#6z>_Y=$&hfoJD#p@i6gb zKh*}xxvAu9hwg^;(cvqRUM08BU{@kaAgjAbZ8;9cj=Ub95gebfHy8o*h73BqTmg{h za|{aZnykSj-Wet$?Bt^vhmxUjm^riWuc6azRY?CnH7pTyv(wuTe@(Hml{z@4`Wb(es+#%Lt z9*VkGBhpfFJ{?)9UZsZ@#U*6~!eLC^38~v{FR>kLzZYyfXRz&Tu#r$+uw6{*3jEA~ zZB@)x8Q9L|2iTOeku;UDvRR$2+(BHvz601^&tUsJNq^TW-_YlQ?R8+g1lYbL*uG?_ z{*DP!m&T+U;`KVE8gfeD5b`Ep7LysP2oG&?T>jChL<5G^97N)wCtxp+NtNX;2UxNZ zHHiYwV@KrXg#>AUyIQqqG?EPoG@2prP)W&$$*I<1?tMLmJ==;g zu1@`58o8z7Y{1|Q2GpH`VXJUCh^$*AI5Lb{!r5gyKFci&QsZ*vhE!QHB=K~ReZGQJ zh{}l6>#vA)bp`9;ReC^@qh94gqQKRLC_cZ!E(S@yJU@6SQ#Y+%5z}f$o>Q#0n3S4X8@%fkSVsH|Zj|wUhzAnVqREObS(+B5DJ$HUg-(>l7Wqik2qn9Y} zq#z*=^q+O=ZLjZ*v48>bmrz@%{!8tEKayX_E4Mc$6IxL}f7$^_{s|$hudRQ%3sdPb zjhLET7vruCfNXKBHyncoRa`FLNWEU4lF4fMP`dS2B$5K5JHm;QJZ+kHs8!d+Yn4eV zB72k=OQ;3M${wrbMx~Zot4vZ>`x-lb@2ghwPmtzKdQP2JF!bb{)N>gRGLxVJd#V@7 z+wxg?3|@(%ZAFximqh2*YkMBMoXf43h20g_voaRu-ZXEYRV#n|L)bQo;kjqL^2iJC z=B8}wMX6O#NoC+viHF7Joj_AK6>O)M?FXp+%8jj-M$ zP`kSINZ3`bvDc&XyHjeI3KXS(g#y2vxt}@gPg@S?eitavRLtFJbmOZlH-CgCYI(Qx z6ZQYtw(U8ZuS8eFkgz@$(-7v~2q zi32X0&{X`3Kb@5Aly9P<+`a0W@+*=@bvIhWl%(91&Hyg^DkJv!_?|1QOcpkN!a4#A{(?k7(ie!{oQhtvNS zbgM1vSdEC}6LsXJb4G8wZQFbJh%szx*yXyJ;)CwNO@Vzr#S#n+G9ff3L(kF>B(D<{ z1M-uh3W91({W3SoAbt;ezbZFEbytBN^yip6-jgfP0I5hAQql5Ai;^6<7E?VZp;-$$ zl>h=zLq#5rR1HD#iRsEUL2X!Wei_9LON!@0Y6FBofdWJffGHm9vo#WJNKjTTVJ8w{ z+y z(r&B-X$KHcSS8C~7Mg#i>_Sz&ZQF7jrXW-8&fdu{7MeFoS?3$6wz08vc^nT~QmbAO zF`jIL=QCMSAahH4Gz`g7Dy`%9gJ=Or9InprhKS5$8Dk-z)@`5{H9smVta#hdSq(Hp z3#nV{N}4`}a~+-}oM?5(m^vGmg@pNFe7X+Fa##4DI0bALSI%1z%paXHit`sN<`<{#d_?bws&^wN0a z+@I{R>axF%x|(;;?%WSPcEPBJkGzFmF{| z^N^!{Mae463{~p|mxJTfaMvupg-0RGfoT4^UQmw_M4YN7umh-jo{!UsxOJ0jxE^fA zEba{)W+z0H?-aTkOD`3oJ!OxWxg#C)OtIYQZl>QA>(2(oJjQ0c!8|4z84H8N>EKot zE9Mvb0(%tblI*E*`J1vU3Xq+l^PL&WVL^3F1e%^omAtQ96pPYM7F1)E+co$L?<&o# z45vn{yNW$wIjv}BcQt?EVacWsj+2X&eOu$Ehjazg^{t$1%<*x$zQrrTRWnNxlp@p1 zgGI+dm5UNhlV8r{jbv#|>dBhO+@iZT7ma#>Q^XryL(KqOvE~{0sWHQR$I^gsSc=kU zb24}6uYA6U<}d$U_B~v4<}>JWo~tk4j-{P;S<1kd5FkGtR0l)D=~KoP7c=tX&KXqPGTYG{uQe5L}WfTbgWp3TO!|`N-gbdYbIkZB>!J#!TDu(XJw+t0eke}Hj6oq|G z%fW3?O&9|Yj186pZMgcrV}lw|r8EL2pFwpM(lGx(Y!hnE5<7GTLRgRz!XU%`!5e1WHxLk23ae=l_<|;;N zWK0w()FMTr%}Tl~65e~~ zwXGQI&<>|*IrKrT^RjN$INt$VFd8wopmrtvO`%B~Ps28If*ON|Xxir?pAvn*pop85 zi!9AD1c=L#j#zIH$yxbey4+pioBGCaMF}|A$*BFI9jX(O};%JzNReW*@j*JY5&Kq13)1co;xNOoe5)^cSU?5S@t0)k!Lk+i{A(TUI|Z9 z$inq)xt9k34bp@f_+}gp(iliE-kj@alHZ(@O}!#j8*GM{tEra7rQI z24WKRs5{U?Eki|Dt0a;UEHO~iunJ$=c8wm0sPd=_az4j%{x~!=gi5eg05J){+T}*9 zo5_mvqw+0=4-Jzog&1!|@(K2W^6=rR16j>y;x0V)jW`-7l#K@j5h+|y;~;+&7B`k8 zAj&KD&M1{dNmavLvd4jj5S49M8mUFA0_;*u76~e4vPe&^DRV@xv-*<3=8vq_kl7@j zRLCCvWxIqlx^9_jhr?2B)g(wtwAqLXJ)ss*F)p~-M@;zMqVdj=DNzz|Z_Xg&61fAX z0J`+or+~uz1gK_ISPcr!yMme8HMcCE3dATNAw&Vmkm-(TdEz+Aw9GWUer=r@*tC2{P zqRQ3L7XA&dM!g(ESInZgSURmqm~u05?GOeXp9QPsVWu|F)mrice+ci@I6SRf^?2-S>iX z6CL3Wl))P=ah6BcDif3yUmh@MbBO_j;~B#YOdM3oTcMzS?S{&pO62DC`}Zd@nadKyz?d}C>hX~rV$ zVOdBSs$BVUT%26-P7y$3>927-aEZMh#OUuJ(s7WO2i|Ecuv)0HEAvycXXdA7SFZAQ zQsruT$OQHR;3f)34H%9d5pLV5?Q5o@zU zj_M`ou;ga%G=rd!>}9TeC#xQsHk|*+pbTy-?UOqHYCy`DRzZz98M|ORA_>N& zk0cnWu$e)nL8F}hS~@j`e$<1?66=Wz1QCrb7iyzbEkv{odd6I8esyNP)N{ z<;P<@0B?m>saWRdggMlH?4ry6C`$I{usK4jlAqu7$K_}SL8*QB;+0Q#6&3{o#OrV42Bs6d%2I9U;ZGA9M6v|xjz)D#_j5Ck&`uM!UPNY&Y%nbE4`W9l4`&qZ-w z>O@nfv!xZ#QgIFHcUZ8!W1qWLJ6wSR3!*^ZdA?QvJ&Qhu7p?MeA_}C=3t8=`R`juV zo_A&vf)Pm(I*5!{ff5IbxBS0Mi4KNrWSF-9Z^`f_kzxCGWQbxzlkwltA?gn|u~+1{ z7K)gx-et68bU5*!=l95w9Y|psxFM@r#tj>wcGw>eQf?TS9A3*tgHQ~s z=2EuMZkTU^8P;daka=pKRj82tZORNs{}VHOmjjvtTYPtuDWu)#Ud=m}9BP)B*QE1P z{vFlADfEG)1p@{CsSh-$^%?sMqH}$cQkWeAp$z{!$(W`^&hQiMY=9nx4m? zk-EX4sronk627MoV4DFN(Z4|>+@vJNnwYUU%`dAjWpnIiWq=v)5bVfq&%#hAB#7^Z zK56?o5GK>qSlU{M>zB-sT>_!`UIx?LwPdc+u3T;9Gn-MY;d?)Cdo!A5We!`GbK9P3 zY;P^Hy5({ut#n$%8W~!#;Qj5f+kcHuTw*VTQ>*G7*2TcAW1@V!dbqXS9MwHMClpm3 zJ!02woxf<9c*>>8_+%RST)eJGgz&$K{jcs55-JWxLe6uaL zuDKibG1v`RBQ~VkTG~$b>-TUi-OyXk4eR#9twA@u+m;i-jzFQ#X`9j-%t&)qYcWw@ zsF`_qIsAT93e=bY)R=C_hpewXP=il_8q0&RJq+Zi6sYk5sPWyb=HuLiHCnIT=pL=e z0_$6=VR@t7q}6_M0BUl#R!z0r+9Qq>P#Y=%yR4HbOmMTyrG>p0g5=EW)z6Q1a&S?+!3_aMh8+YlQ-HaZO&s^GrSv;84gG1ZS zX%F@ajqlY>a+=w0?=|?Y?c;Xok?)$@W3?w)nVOj6=A=NkI%OLJr@=VaSb994uUj(e z+&V35b)vbH&_r|Ewxl#iH$Xlah6Byf8;!+1>QOe)G48>;(8w zDI>s%f+Oc9u92K=FGPS=uLzJa)@qi!7`l*n7U*J_K4PSqi1%m_x{jr6c#5nM0a+s? zUJQ35jT};BjphM^Ifk-<23@Grb$b%(Ilo3cKXcSNtCJ$e&lkiZCw|pOTQ|_O-ptX6KTo@ z6ww&$L~0B(K3D}&gkoKngs&AreB|LdMg0p4pUskSt_1wqC6BWtJ+*KC zM*kXP61OpE_CV4#UC}1G75ZUT-$_O z&)KgBx)|Tq@YX>1pz)O+@s+l(ZP>trohZ9g4^%v^?VzToC_B0Bsz(mq=!~_Db5q1u zD!jbaO%?ZXoSVANCCyX_i^Pp91U9=}`Co4toD^xim4 zw+x7GaJSzRW@J3ZhP>X*SOuf0XOub8ZDvW1wAM_8Q(RIVk6kiAWHru3_j)bP5Rv$V zHYH*V5YRw~fvhp$X)FVNuapp3Dd`;2Ql@bTWt=@@8H1QbHRY?S#5nwT?Ub4l2sfso z(PxQXlGt)dxLC=YESXBimb8sv2(^tE)3=QPmP+1CocE$!jPstk$gv#P*VGqsjA7i` z_B0D752`bZoE~iEK~-jxEA{o&Vit<1NFBi>u*u9AEJ|fw&AN`V_IP5}vkYws^q`3d6n>9m2gZi#c z-$i$X)nM^%d^`p+F;Q}K+m|+OLKgGzJ>PAbq86@(Ig)R>NCr0q`oQ^{kC?GfkDt(X zDUz_8(9M(|?iv$t7>!f}Rk{kjoj{D97P;b=*-YQ&U{yuNVFDT@;g$ zy1Bv`?5nkusM6NeOpWGjuQ8OpMi?WecH6{j&)(kz%CaNW)XN*WzDy2jn-_xz()uL*00Wp2hv~zYRrD*M4Gx z7JZg|4Sln1CV1VoNYn+#ag$dY&oE5?z9s(rk{cq8;}PLcfCi#$ zpZ$!YRYMalT1D7_UK?c>iCid!!Q=C!Il|@L5sUkU*qGK)XILEN&RwO@m!qiV zeQG(kBv5At16pMKWh)e~D+ zg|BXf*Vx~h5MC3opB03G7`49&?S7QjK1!$BlXs*+X;-vPhKZwHSJd{%8|{mFJV7+u zvg@u`&yPP~eM65TWR}M1^|IIn(qj9pip$>DZEaLw0)LlL&Vmt$f#{C? za>X6^6$)k(fh-_ZPX#SR;jD;L6rJA>Ekxp6kfCK|>^=@!&Ic_kK?|`igtLg5C}Fq= zz1^RXB4l9?aSX&h-0M$tC%_0!q=;O?3JM$jq#h-&oma&BwnV(qr`#u%V8_-GSiW)s zQQQ0Z#iYmnujGvj|B6otVMJ^=WMTg_a>Yr?Zt`Er6R*4-w-ZuylFCEA9qu!jO10tt4n?$P2jJTCix3WlIpg55prIDuDi+Dzy29NdZ zV#0$IodJyzOb(6l>=H$B@YfUaMiW*6g%PR~wH@%64?~%RM_d-Q9ku%@tc%1#d`aOD zJ>G&K+KSg-%u|9Nc-qZVi*hhRUhRo&;OQEkvKCwswcYjErzv}-J-w2rS1D0++uEy# zv8Z0HkPd?6d;D61=6sf*FIy_=OL%sTQc;sTdbR(Gx?w%JR&no4j#ifS>lFD;Z2W59 z8@XQANOlKC;Rr(;{kq7lvyz)vD_EVsYw7>>`oLY!)eTnXI@-BWu_qMnQHVM?xq+*j z6#Pt}^J;~uQ{ZN8dbsJN$i{mv=^vzi)AMm%_O3MQj~okRq&ZOhdrGMT_6F!0+#Hb$8_WyN#=R z6ao$xAaWfpa8CpmfOm4af|vIa0A>}T;MnNDA324Dcl(Wz<8Mii-xMiW9IS1Q9DkdD z;67eZs3(MgyZd@EWibz0OmGlH((?2CL^$|F zzPK-H+jqlkwo^Y;mF|9E`H|wa-H)PANXqJ8=|hU!PAh#lau27=a{vMD$S(f#D5b_{ z0u|OVUOjmg>jh$2s3`FNM-;4`^8ZJb$s%1F1>KWZopTWKTMEl#5fBosecXY_@l)Nj z#c7%^)l3}1Ldn$BJUO&31=jtMKM&qjO8G+W{fi(Rx& z*-dg6n=Ole*j+6Y-0o+Yc4xf#h3h@p^307xr-mt@VV26B<7S=d$&u&wTqI@QMg@j* z-k3?%=#Q>KtXix>LNcTwug=W@yI>ST(Mo&&vot2>sF9CHT;6Q zeyRBKwibK+D=WIn_Fun_9Dl!}jVCM!{Ryrt650KnuYRN0dG{Nxo>Fu&e?1{6wC&(~ zcH5)J|2875xNX4ezx~c?GMf-AN>o)3`7qpbFuZSlarSDz#hz~A>GP3$K59FmH1nR- z{snvb0#9Fzh+c-_$;k1NJ$;F%zq8hUN4qcE)yq74H6p~eEtku|hF*&Z*(4Hljep(V zKgIjsM-Cu=5Bz_Kh>9dQv74YpMLGUI)t!Bi9M^H!`+x(8yCaDMMN$v}iUSg-y(4)a zAVHD%#^G=vjsosLd=U@?u4Z>&ad6UoYJ>I@wWUuG|damps zsfZRQdlv8`&G(^v;b;F7+LvU(eJ&{8h7(zHyu_z3`uU)K#6}Cf>Bp`5i5uxndHP08 z-799cSkuFK`hHE{pQk4@J&~t( zYkGH{eniucDT=N@O3@U4`YvJvR!x`UM*8`V{{nE((HB9A-f2BNU zTZ5yBc6HA(XCv3l3dVs?VFmb@1vmGtN#y>7;VO1A-`yKta!+uPdxC%56P)9o;2HM> zx40+x#67_w?g`#-PjH2Mf*;%yoZz0|0r$k}yC>G&J((3Z^IL1pTqRuqQzxbT`W2MF zj!@pZh0O!+fa3R<&w-(o2SXvwI1_k|J;$F?AMbd?e?+|Qj>#Jb`BH83z&)GHF9-(t zOqDvlk5Nc{B%1>LzeUn|8~|?~*aAb)oaz#}vPJk-`&P|a=kl#5(>?6pl-wrrGvH>_y3|H_sg8R%nNgT0f~=c#9qP=$F~H^`U5 z=4t&PpTlh)*vO&}Zc?;iuy0`Cr=IN*{@~TX3(pdrU$>sC*IgS{T^oPQb;JMTwdt?> z>hJICV+^9>5U!tWJR-e=*|oJ+^F;c%dW1Of@lETsA$#?65i}gQ`6j(@+}PW@VS|#a zZ9O_u4v75MQIY>p5cv}D`@qFwe+L#=@Na^@4ZH&U02qKNZU(jhw*gy$ zZNQs>9l%bY0Ne{q0DFKb;4z^4`ui}J%EUhct6cmuu*$}-f>k~~2g9k1yhK{%IbV#t!Iw6fVYrV z*}4O)^7SPcTxIMY(kf>k;C;P*+F_f@?*|y~5nwwI(dJ{|Ip6|N1}1==K=-Bd*SYJw zyY)f0E=cRYhj&%h-w#%K|2SA>{u5x8`=0}=?0*KV@~`w$9q_Ngss~;Mt1kFGum}Dl z@DA{I!FPlI3aq+8>7n{z5Ue_48(8(k>Z?k=^2bGZO6R)-bYEXaQK)YDDp>W)r>Unp z=If+Y&s>MGUGif;s~-dcS*AOg+C8gefW!D)rp@4t6uySudJo$R(<(f;FI8&!Lwkc+Z=c=Sg%Qkw>x~7!#f=wci7gp@11h* zJ)UNE;lHB(X-zY(GoTINv*4S-=fJmv&x5ytp8$WEMYsUIoAgES2>9*b2f>%XkAU9+ zPOn|me+W1LOaUhVt(#t|6I5>WQhm__s4S(|Z&Uv=i7$bl1b>*tE`mP+ekWMRAr4YoX?VRGx*(Lo#%VNI{s_m9pLwZf1pgg#`PL`TK_ea@@pifVeaQh zp9DV-_6~F7`iF-sewFt0`mV!+hfOlO4U>LfmSRn4=l!JX;1|Gc@ZSJ)m?3`?%rE5S z1K{_8KM4LH_(S0I`pPZ6Kcmljx|&{Tnc{vx*Y}TMqQL@t_{e6t_IF-{DPGyI zg&JG7Y|*M4^k#P(v&ERy7TMfS`TG7Fq~{HI29$5)HXs}I9rvcG>24I-iv6|)tmI$Z0_CVX+4VvyONvr+1&bU zHh2ErLhdcM=zZ;LMS0)abynndQ$Ux;tdXUVAy0StiWgTmke(0?a zKeA`?$kfs4V`q2V{U$$kjZ`;CLW19#r?=0dF%wx23_8#Zo!!>za7vFY|3hIhVk zYhVA(+wK~==lSQJeapS~?LTnv(A1-koxE`I?U&wh`N`rt{c|Je)<`e zG<(f78o|8Z@Jh=`;KjjHouE|?n$&cqA-%vLELF1UMozzC}>AP9JCU@)Cgpj z9N$ZlWjPf@&3YWy!#4!lNCO*}J( zt952E*CAE)nn6?BXBuHAqE@LBFUw3TVRoH1WAftVI0>3w*>5!RTI96D$dBrcWv|on zuln_dneG;HybnW1f3j;6CT)SzW(HWjv7 zOkGK&G)-6n=oCaex^_)JaowlXWK}y&_(~?-1Jq=CX2rwSyqsBXmcmB8Y>4bN!mw@l zqvbapTWF=T@JG{cEqh^`i7NfgQvS5_A*UzKb1M#W26 zQY)q8G3=RfWZt)OL9DMT`MP_^_^$$s7}_p|9U2eI$EH*>HGC&yAdcY?P@h)0Uwb;5SY2Hp%t1L1U0Ew>ogl7 zAXlk<)ULHQ;(KudCpC20ajj*=X5tw~tjLZ#ZM1=s^o$vTZA4$lOJ-N3ve&DAQ+3G7x~XigRcI7}Ba@^R zSB`BqNEX9rArt>J-7WrW>6ey$uUnn?B|9$`y40ywVF#;A^96S^M%9$9%F3yrqslX< z{Fa$z&_YbA=vU8D*o$kO#Hgu!SMVFKS7lijxgCY`s;IgYUw1B&!A4+2x8}DhNX2RR z6=BJh*yEj$y&zaB2SJ6wF%|S?z0+isJFSX5VV2!xr8|b%+vwh^BebyH4^K=Lr_NqH zr7n)}JbUis^y!%?^L%#Zq{-I&sksv;CeM=O`Q+T}^x4VN7tQnZnKP4*POGP3uc@(f zXOE5MM(ujCdmX56@cdu?oE)8P$*Uu`$rqm}$RF%}MM}T-lI;K4pOMLrPD%OkAIj&y z@)`M@|8Hb(Yp49DlSgD`<5#8c8)LHl<6o3--uXir`RsQ2qWl*O^)t`!kxzbak9?^3J{kVYUzhLSwNJkC+TWGUFK&=6<9{aoZ~u@q z?`q1+?|!TF5tuwS_c{3o)k8A+jiUT&p(B6v&EJ#*&wNMz=bjtnZ%g;<{XZ|{_a55EK@vg@$^r-qsuJ({Q$e(l9$-&fc5osa+a zlDe|jp5OLuyanMK=ckph*Y1AqYsTZc^Uv!KjVH~vg7Qo8g1M-YUyqdk^dP@eJM`p> z&m7XcR%>cn{Rzke-L*6UDiK+8?Vd)CxFL*Q-EHcx!c%`do;GYuBBe7 z4WIgWJvKY@`#yz%dMkOW`9iDx(zeWqH*bB|+^@fVgsh(eK74XzS=y(|HA7ih<430^ zwyTYwUu*UMw_LII|KbsD%FM5G=>T4*XwB?jqJQVanDVvy*Mg4%+W#*ci@s#-@f|)=Y97oe)vgeQEY!eUh5k-uG5cu=VL#vf-V0)=DmyXlJfJ9gZHesOlPVq zzJMA4zogId`!9cys1Mgmw;jSpGMf~;jXF4LOYF5qcq{D8*HY(TDBkNyqvK0qC@y#{ z_7O}sXNvZVZmZ>RzEyu(&GELe*|j1iYFq8~hGOrM&5!x>e%8M9F3~`I`EvhcYErmY zwdG)MzvqqG0eS3PLAhgw7u7LP3OdY!R;YXSQfn?^v*PY!>0J%HW>^W_CTrieFB;3% zyvqMeuEud{7hyP;@Mf01f@T-AtQI9(`b9*CQTP#=>a+e(%(|snOH*5Z|0tkOL>q zO%`WnXU-NMD(=oxGHk7Yuyh4aOsy$jml6lB6O4!)Y$B5cN#Aw<)0Wg#K7!I(?{`la|>dZ$lN88_`jFDoi7y)_#Fr3tD}+)oGS!GgxY~HbLcnZysY)XGr^H z#2EWO5L=1r>S!=?T{9g?9;i@Z?H&os*hc<53~24ftaZFr1qv7INlnL?+KSd`$(UK3 za?#~M)LLO{H15Rso*1E+#S!iiywctFvXaa5%NjO-AXB5dgkDLlRAlq|n$;+5s{bF? zRod5Xvk|ISs&gsVI=EcJMm4~cj;J_FG@amyceh_|gs~m6J}Kj7(raE6h?zQO+4PIW z`7*gFCs>B-(T@u@Y|NOIfebh5gnLvlhAJblj>ca+W*V|?8t*U-?)6H>3)UA)^?4av zy3m@H(L4Yq``XIqnp`mg?8LNQOF19;yt%?VVFcjpHeemvH>mkC3t+pW{KO$)S1`MLYq8|EFmBGkwSh};?>grSz)v!SeeCTi7okMjZX z0TtA&2`0Wyf1+5p!THP_?9clafZdsFXTz z1Qwwt+aiAo!;v*!CP27kSDBX5853vIAdXbiXhp6d(<)h6EOF4N%6{Ff4w_+(jg57U z)6z8CZ?gBgh-Z|Vmv)vb)7AXRim{TZEE6g73Z}1I?5wuTo9eWk)|gU*f*_g3YpRWK z5r!hLwZgDS8FwLAHtY&Dl7g6>B7e;$>$=QlH>o#VjVx={pOsP=HUhte%@ITzlX1#V zlA5~G;zlL7(@7}BV(=8V5<8Y6G&uJqgW_6)L|ijjjF?2j+yb7ga@7Zoh7z}h0h`EY zvRH>QaI}l+qEypDHvOcARvF;zSkIn?no{hg#NWVTRJd2RH+RXZBVq+Tmn{E4bM-PQJ?f;Lla20YHY?`PwFTu!{1_=JHg}(O0fA}>F+}_@?rS*0c{ta3dxBSTePC6Dd-)a2~U)Lu?W zRP`8R%^6B?hB0uUGScr&o|-X)HZqMpV~lC*mDGHEntIC^XNi#v2pB}D6ph!#*Qt!X zp5JbdIY(`%dcSEOO%Z4`QCXf@SA|2N1^hErAS5eeI6+$r_| zyHl!oqenVwB|4GK85}hL18BTbEg9=6YAs{(N5MSD7Whrtlre(cleWj3S#!nd+4G{h z*%&BN2_&b6 zi$Dq(O59+{@o_fbYO&u)tU!{0{`t+HZ zxmodJw(^7~IfN}I^L|uPZmonGycA<3OTF#aVJ9{6O|CwO8WAwJ7PRd?ZM?$BU*r%3 z)x`s{t%!|55yy*aP|=Abp_@o5;j(1gDEYd<+auG+Z!r+>#{Qc)_%9aK|aC7K7TKXBK0&Iw8)HSQd~ z5~2s(bG@R2$=fGk+6UWqdC1$+s@8l(Rk)2^b&1;8c9k;uYH(ynem6&0iy+;O`G5%C zKyzX|V=US|0;-~ZuwUKAo(Z1o*0Z*e%0gxnWL;Jptus;5k%Op^mAk6gV?_cK99I?N zsLaNU+hLs#{E|57PA}Hbha9U$EUMB7EiBW+3w)QrDqqEFkVQ;$ zW7Vt6$6}?@M%)IUci1$+z-(#=XR^z5grhX%pl`Y!hsGYBXU}0%Vzmuf_2inq)UM8j zF}2Nzn@mglRJM@TkhYy+bEFQW?SWc4dq;$}F;m zZ}#gBzeG@}jFsWXh$`B%CFOukS+gp^Jj~OEVrgGEAiCKzDk0E^wx8EQ3F#^WK)`7u zeu}L^+c77Y#${nT)?hQ5CD*FP)`v9Z1;J5dN2ynNspILY|9ExdaLi;7naGxc?sp@Cd=&`Q$SEFG9 zPO_+tE$gkT=hQmj4W*J*f1;X9H)N$-*^rt+u>YZyS$Q={WvDFo5=@&c9Vt&$jt0l( zAFUmqxzap|{d@XMa<+5s{NfW!7nUzR{q~`Ey=%HWJvF^FePMce`r=$=E|@z$H#66q zJ2`h|t}}OT?)=>1+!J%l8DpY4QumlhV%dJ6Q5YIh1CBC$X{s8l!G5&?iLSC6p%e*p zN4^FbY&b1bpBl@}Rjsj{6L_a1SuY`MC6T#Ynk|aFot2x7RFdtAD2El(j8}>@pip)Cme5pM{W$J03yb)$G=LC>h`KtqK3yXVLHDq(X!b z4r1O;m(82_h0JR|#DCa2Yz7R8T*rTWHs^xPIE9gNhgy=U->Q^MUDyi+H$~5n z`HD%4aB=7DF^{$i9bqe0`~mn8B^06jOmJqHkZ;Nj#;oUPY}frmmCKpEZmMaEZuDuN z_$leIR+Xp=lg9c+o!4rsq@#2yK?!KS5VV8R5vHNJPD}lI6hxNeh^}Tk6%$NaZ=Rzy zzE#rYNlR^{Wfe8osHl5BL7vzIT68bgBO7%By4KbX?a7_@-gjth_|nj5zRdU}>Tl*& zkIP`?G$@Gtvoqw*kt>CxIAY;EN$0J;Gp<=i!?Y}|n|m^8$#ALxvyIG1;LuQs!ZWXP9Y!5%Idb$EDUd_qk>nOGWHLP}v|{g%}Qh8pI8 ztzkqV>oXMyR^1(P*ijZ>fpqs(RphuZB_6*|7=6!gjDGL(rE8;KxO^`@xF4lU6;`Wi zr)ij@tyYIA#FNJ=F_DjSy4H`@JVs+2wkd)-jj-}N+%Fh{FnHzlK=^?V9@)Q`$FjlnSan&`>zsmZg)WxNwd z`J3fABjHi9CUp%heudc&!`s+8aqA-7b%yk9MGNqi2a%%N3S2Qyg zhuvfBE>mY1vqfuY7jY=#{rmb4_3!8()leI1gT4O5+~m>eqb87mDa+~ewB`tglL;xf z&nKmzn-Woov5bt)GsnzIPq;BlJJ^86wlh17ngV-a@u8TTIbv6;&(3L(Yu`TE*RzlB zpR$%U-fDu1rb)+6<2K&m>0nfAcK2aUL5<#L81;{aP4S&jOfedKYTUz6o&e*>j-W3&_r*(S01Q zH1IocC89+i(bg~<-=L!lJ#XT|#1fwk;MDP1!^DOACN7XQI Date: Tue, 18 Dec 2018 17:23:45 -0800 Subject: [PATCH 16/38] Improved formatting --- src/apis/emscripten/jmp.rs | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/src/apis/emscripten/jmp.rs b/src/apis/emscripten/jmp.rs index 45f140404..f22624cc8 100644 --- a/src/apis/emscripten/jmp.rs +++ b/src/apis/emscripten/jmp.rs @@ -1,12 +1,8 @@ -use libc::{c_void, c_int}; use crate::webassembly::Instance; - +use libc::{c_int, c_void}; /// setjmp -pub extern "C" fn __setjmp( - env_addr: u32, - instance: &mut Instance, -) -> c_int { +pub extern "C" fn __setjmp(env_addr: u32, instance: &mut Instance) -> c_int { debug!("emscripten::__setjmp (setjmp)"); unsafe { let env = instance.memory_offset_addr(0, env_addr as usize) as *mut c_void; @@ -14,13 +10,8 @@ pub extern "C" fn __setjmp( } } - /// longjmp -pub extern "C" fn __longjmp( - env_addr: u32, - val: c_int, - instance: &mut Instance, -) -> ! { +pub extern "C" fn __longjmp(env_addr: u32, val: c_int, instance: &mut Instance) -> ! { debug!("emscripten::__longjmp (longjmp) {}", val); unsafe { let env = instance.memory_offset_addr(0, env_addr as usize) as *mut c_void; From 88ee0d736e0e726f82d02b0aae6bb07091c1031b Mon Sep 17 00:00:00 2001 From: Syrus Date: Tue, 18 Dec 2018 17:31:30 -0800 Subject: [PATCH 17/38] Trying to fix linux compilation error --- src/apis/emscripten/syscalls.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/apis/emscripten/syscalls.rs b/src/apis/emscripten/syscalls.rs index 71b3f23a9..150ff625b 100644 --- a/src/apis/emscripten/syscalls.rs +++ b/src/apis/emscripten/syscalls.rs @@ -82,6 +82,9 @@ extern "C" { pub fn wait4(pid: pid_t, status: *mut c_int, options: c_int, rusage: *mut rusage) -> pid_t; } +#[cfg(not(target_os = "macos"))] +use libc::wait4; + // Another conditional constant for name resolution: Macos et iOS use // SO_NOSIGPIPE as a setsockopt flag to disable SIGPIPE emission on socket. // Other platforms do otherwise. From db93d2693d4d866a7183addd01bf4f975a2e62c5 Mon Sep 17 00:00:00 2001 From: Syrus Date: Tue, 18 Dec 2018 23:21:18 -0800 Subject: [PATCH 18/38] Make setjmp/longjmp more secure --- src/apis/emscripten/jmp.rs | 19 +++++++++++++++---- src/webassembly/instance.rs | 4 ++++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/apis/emscripten/jmp.rs b/src/apis/emscripten/jmp.rs index f22624cc8..49ec783ba 100644 --- a/src/apis/emscripten/jmp.rs +++ b/src/apis/emscripten/jmp.rs @@ -1,12 +1,21 @@ use crate::webassembly::Instance; use libc::{c_int, c_void}; +use std::cell::UnsafeCell; /// setjmp pub extern "C" fn __setjmp(env_addr: u32, instance: &mut Instance) -> c_int { debug!("emscripten::__setjmp (setjmp)"); unsafe { - let env = instance.memory_offset_addr(0, env_addr as usize) as *mut c_void; - setjmp(env) + // Rather than using the env as the holder of the jump address, + // we obscure that id so we are in complete control of it + let obscure_env = instance.memory_offset_addr(0, env_addr as usize) as *mut i8; + let jmp_buf: UnsafeCell<[c_int; 27]> = UnsafeCell::new([0; 27]); + let mut jumps = &mut instance.emscripten_data.as_mut().unwrap().jumps; + let result = setjmp(jmp_buf.get() as _); + *obscure_env = jumps.len() as _; + jumps.push(jmp_buf); + // We use the index of the jump as the jump buffer (env) + result } } @@ -14,8 +23,10 @@ pub extern "C" fn __setjmp(env_addr: u32, instance: &mut Instance) -> c_int { pub extern "C" fn __longjmp(env_addr: u32, val: c_int, instance: &mut Instance) -> ! { debug!("emscripten::__longjmp (longjmp) {}", val); unsafe { - let env = instance.memory_offset_addr(0, env_addr as usize) as *mut c_void; - longjmp(env, val) + let obscure_env = instance.memory_offset_addr(0, env_addr as usize) as *mut i8; + let mut jumps = &mut instance.emscripten_data.as_mut().unwrap().jumps; + let mut real_env = &jumps[*obscure_env as usize]; + longjmp(real_env.get() as _, val) }; } diff --git a/src/webassembly/instance.rs b/src/webassembly/instance.rs index a958f27c2..1692e9cd0 100644 --- a/src/webassembly/instance.rs +++ b/src/webassembly/instance.rs @@ -15,7 +15,9 @@ use cranelift_wasm::{FuncIndex, GlobalInit}; use indicatif::{ProgressBar, ProgressStyle}; use rayon::prelude::*; +use libc::c_int; use region; +use std::cell::UnsafeCell; use std::iter::FromIterator; use std::iter::Iterator; use std::mem::size_of; @@ -72,6 +74,7 @@ pub struct EmscriptenData { pub memalign: extern "C" fn(u32, u32, &mut Instance) -> u32, pub memset: extern "C" fn(u32, i32, u32, &mut Instance) -> u32, pub stack_alloc: extern "C" fn(u32, &Instance) -> u32, + pub jumps: Vec>, } impl EmscriptenData { @@ -116,6 +119,7 @@ impl EmscriptenData { memalign: mem::transmute(memalign_addr), memset: mem::transmute(memset_addr), stack_alloc: mem::transmute(stack_alloc_addr), + jumps: Vec::new(), } } } From a912c140224c236458d23c6af318ca75083a2726 Mon Sep 17 00:00:00 2001 From: Syrus Date: Tue, 18 Dec 2018 23:33:25 -0800 Subject: [PATCH 19/38] Improved documentation of setjmp/longjmp --- src/apis/emscripten/jmp.rs | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/apis/emscripten/jmp.rs b/src/apis/emscripten/jmp.rs index 49ec783ba..ead60cf56 100644 --- a/src/apis/emscripten/jmp.rs +++ b/src/apis/emscripten/jmp.rs @@ -6,15 +6,18 @@ use std::cell::UnsafeCell; pub extern "C" fn __setjmp(env_addr: u32, instance: &mut Instance) -> c_int { debug!("emscripten::__setjmp (setjmp)"); unsafe { - // Rather than using the env as the holder of the jump address, - // we obscure that id so we are in complete control of it - let obscure_env = instance.memory_offset_addr(0, env_addr as usize) as *mut i8; - let jmp_buf: UnsafeCell<[c_int; 27]> = UnsafeCell::new([0; 27]); + // Rather than using the env as the holder of the jump buffer pointer, + // we use the environment address to store the index relative to jumps + // so the address of the jump it's outside the wasm memory itself. + let jump_index = instance.memory_offset_addr(0, env_addr as usize) as *mut i8; + // We create the jump buffer outside of the wasm memory + let jump_buf: UnsafeCell<[c_int; 27]> = UnsafeCell::new([0; 27]); let mut jumps = &mut instance.emscripten_data.as_mut().unwrap().jumps; - let result = setjmp(jmp_buf.get() as _); - *obscure_env = jumps.len() as _; - jumps.push(jmp_buf); - // We use the index of the jump as the jump buffer (env) + let result = setjmp(jump_buf.get() as _); + // We set the jump index to be the last value of jumps + *jump_index = jumps.len() as _; + // We hold the reference of the jump buffer + jumps.push(jump_buf); result } } @@ -23,10 +26,12 @@ pub extern "C" fn __setjmp(env_addr: u32, instance: &mut Instance) -> c_int { pub extern "C" fn __longjmp(env_addr: u32, val: c_int, instance: &mut Instance) -> ! { debug!("emscripten::__longjmp (longjmp) {}", val); unsafe { - let obscure_env = instance.memory_offset_addr(0, env_addr as usize) as *mut i8; + // We retrieve the jump index from the env address + let jump_index = instance.memory_offset_addr(0, env_addr as usize) as *mut i8; let mut jumps = &mut instance.emscripten_data.as_mut().unwrap().jumps; - let mut real_env = &jumps[*obscure_env as usize]; - longjmp(real_env.get() as _, val) + // We get the real jump buffer from the jumps vector, using the retrieved index + let mut jump_buf = &jumps[*jump_index as usize]; + longjmp(jump_buf.get() as _, val) }; } From 75046e0e2ca1b5b3dbec9f0b6d1f50736793d166 Mon Sep 17 00:00:00 2001 From: Syrus Date: Wed, 19 Dec 2018 10:14:53 -0800 Subject: [PATCH 20/38] Updated version to 0.1.4 --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 547737a60..11e6cf176 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -877,7 +877,7 @@ dependencies = [ [[package]] name = "wasmer" -version = "0.1.3" +version = "0.1.4" dependencies = [ "byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)", "console 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/Cargo.toml b/Cargo.toml index 2a61b1524..9ec64eb20 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer" -version = "0.1.3" +version = "0.1.4" authors = ["Syrus Akbary "] edition = "2018" repository = "https://github.com/wasmerio/wasmer" From 3d91a96962155086ce7747d3ab05191c59caa2e6 Mon Sep 17 00:00:00 2001 From: Syrus Date: Wed, 19 Dec 2018 12:52:12 -0800 Subject: [PATCH 21/38] Create attributions file --- ATTRIBUTIONS.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 ATTRIBUTIONS.md diff --git a/ATTRIBUTIONS.md b/ATTRIBUTIONS.md new file mode 100644 index 000000000..b3008614b --- /dev/null +++ b/ATTRIBUTIONS.md @@ -0,0 +1,18 @@ +# Wasmer Attributions + +Wasmer is a community effort. +In order to build the best WebAssembly runtime it's our duty to see how other runtimes are approaching the same space +and get inspired from them on the things that they got right, so wasmer and it's community can benefit from a solid +foundation. + +This are the different project that we used as inspiration: + +- [Nebulet](https://github.com/nebulet/nebulet): as the base for creating a great Rust WebAssembly runtime +- [WAVM](https://github.com/wavm/wavm): for their great integration and testing framework +- [wasmjit](https://github.com/rianhunter/wasmjit): we didn't took any code inspiration, but their effort pushed us forward at a faster pace. +- [greenwasm](https://github.com/Kimundi/greenwasm): for their [spectests framework](https://github.com/Kimundi/greenwasm/tree/master/greenwasm-spectest) +- [wasmtime](/wasmtime): on their [mmap implementation](https://github.com/CraneStation/wasmtime/blob/3f24098edc81cd9bf0f877fb7fba018cad0f039e/lib/runtime/src/mmap.rs). +- [stackoverflow](https://stackoverflow.com/a/45795699/1072990): to create an efficient HashMap with pair keys. + +We would love to hear from you if you think we should be inspired by other codes/repos we haven't covered here. +😊 From a81500e047fdd321b3dd3f9fabb87fecbd2d7792 Mon Sep 17 00:00:00 2001 From: Syrus Date: Wed, 19 Dec 2018 13:00:07 -0800 Subject: [PATCH 22/38] Improved attributions --- ATTRIBUTIONS.md | 1 - README.md | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/ATTRIBUTIONS.md b/ATTRIBUTIONS.md index b3008614b..ef86bb293 100644 --- a/ATTRIBUTIONS.md +++ b/ATTRIBUTIONS.md @@ -9,7 +9,6 @@ This are the different project that we used as inspiration: - [Nebulet](https://github.com/nebulet/nebulet): as the base for creating a great Rust WebAssembly runtime - [WAVM](https://github.com/wavm/wavm): for their great integration and testing framework -- [wasmjit](https://github.com/rianhunter/wasmjit): we didn't took any code inspiration, but their effort pushed us forward at a faster pace. - [greenwasm](https://github.com/Kimundi/greenwasm): for their [spectests framework](https://github.com/Kimundi/greenwasm/tree/master/greenwasm-spectest) - [wasmtime](/wasmtime): on their [mmap implementation](https://github.com/CraneStation/wasmtime/blob/3f24098edc81cd9bf0f877fb7fba018cad0f039e/lib/runtime/src/mmap.rs). - [stackoverflow](https://stackoverflow.com/a/45795699/1072990): to create an efficient HashMap with pair keys. diff --git a/README.md b/README.md index 215d05c89..6e4b2646e 100644 --- a/README.md +++ b/README.md @@ -76,3 +76,5 @@ If you would like to know how Wasmer works under the hood, please visit our [ARC ## License MIT/Apache-2.0 + +[Attributions](./ATTRIBUTIONS.md). From abdb63148ac25663fec9ac9aaeb58ea40016b43d Mon Sep 17 00:00:00 2001 From: Brandon Fish Date: Wed, 19 Dec 2018 19:47:51 -0600 Subject: [PATCH 23/38] Disable the Cranelift verifier by default except for tests --- src/webassembly/mod.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/webassembly/mod.rs b/src/webassembly/mod.rs index 2183c8f62..85e2f1930 100644 --- a/src/webassembly/mod.rs +++ b/src/webassembly/mod.rs @@ -147,6 +147,10 @@ pub fn get_isa() -> Box { let mut builder = settings::builder(); builder.set("opt_level", "best").unwrap(); + if cfg!(not(test)) { + builder.set("enable_verifier", "false").unwrap(); + } + let flags = settings::Flags::new(builder); debug_assert_eq!(flags.opt_level(), settings::OptLevel::Best); flags From d0e6707903f99dd61e27c87d5ad8e946e26158ee Mon Sep 17 00:00:00 2001 From: Ziv Shahaf Date: Thu, 20 Dec 2018 06:42:14 +0200 Subject: [PATCH 24/38] Update ATTRIBUTIONS.md Fixed some typos --- ATTRIBUTIONS.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ATTRIBUTIONS.md b/ATTRIBUTIONS.md index ef86bb293..dc549b46d 100644 --- a/ATTRIBUTIONS.md +++ b/ATTRIBUTIONS.md @@ -2,10 +2,10 @@ Wasmer is a community effort. In order to build the best WebAssembly runtime it's our duty to see how other runtimes are approaching the same space -and get inspired from them on the things that they got right, so wasmer and it's community can benefit from a solid +and get inspired from them on the things that they got right, so wasmer and its community can benefit from a solid foundation. -This are the different project that we used as inspiration: +These are the different project that we used as inspiration: - [Nebulet](https://github.com/nebulet/nebulet): as the base for creating a great Rust WebAssembly runtime - [WAVM](https://github.com/wavm/wavm): for their great integration and testing framework From 4c883c53a43ba235fad69fcc367afc611c1fe554 Mon Sep 17 00:00:00 2001 From: Brandon Fish Date: Thu, 20 Dec 2018 00:23:29 -0600 Subject: [PATCH 25/38] Make the StdioCapturer module only for test --- src/common/mod.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/common/mod.rs b/src/common/mod.rs index d8354c704..8694cd5f7 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -1,3 +1,5 @@ pub mod mmap; pub mod slice; + +#[cfg(test)] pub mod stdio; From 241f3d40918cf3c1bd28388bd363bfee061c9422 Mon Sep 17 00:00:00 2001 From: Brandon Fish Date: Thu, 20 Dec 2018 00:35:11 -0600 Subject: [PATCH 26/38] Update to latest wasmparser version --- Cargo.lock | 8 ++++---- Cargo.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 11e6cf176..b874d507b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -900,18 +900,18 @@ dependencies = [ "target-lexicon 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "wabt 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmparser 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmparser 0.23.0 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasmparser" -version = "0.20.0" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasmparser" -version = "0.22.1" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1040,8 +1040,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" "checksum wabt 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff1f0f87e467255240c1faf5cf13a04410723407840d7733e75967224e191a5" "checksum wabt-sys 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0cc8982bfe0a923f152e96d991e50a6f97fe73ca4af6d9d84d76634f03051fa2" -"checksum wasmparser 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2a75e0c3fe9a4d4fd91901348a5be05ba4791e29dda89e8596bfe87900ba7edc" "checksum wasmparser 0.22.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f46e666ecb4a406483a59a49f9d0c17f327e70da53a128eccddae2eadb95865c" +"checksum wasmparser 0.23.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b5e01c420bc7d36e778bd242e1167b079562ba8b34087122cc9057187026d060" "checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/Cargo.toml b/Cargo.toml index 9ec64eb20..5c09b9f2a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -36,7 +36,7 @@ error-chain = "0.12.0" errno = "0.2.4" structopt = "0.2.11" wabt = "0.7.2" -wasmparser = "0.20.0" +wasmparser = "0.23.0" winapi = "0.3.6" region = "0.3.0" # spin = "0.4.10" From a4d1fdf3fefcd447c9baea2a1b25fa835d49f69d Mon Sep 17 00:00:00 2001 From: Syrus Date: Thu, 20 Dec 2018 19:04:23 -0800 Subject: [PATCH 27/38] Added licenses for each of the attributed projects --- ATTRIBUTIONS.md | 482 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 481 insertions(+), 1 deletion(-) diff --git a/ATTRIBUTIONS.md b/ATTRIBUTIONS.md index ef86bb293..289b9d233 100644 --- a/ATTRIBUTIONS.md +++ b/ATTRIBUTIONS.md @@ -13,5 +13,485 @@ This are the different project that we used as inspiration: - [wasmtime](/wasmtime): on their [mmap implementation](https://github.com/CraneStation/wasmtime/blob/3f24098edc81cd9bf0f877fb7fba018cad0f039e/lib/runtime/src/mmap.rs). - [stackoverflow](https://stackoverflow.com/a/45795699/1072990): to create an efficient HashMap with pair keys. -We would love to hear from you if you think we should be inspired by other codes/repos we haven't covered here. +We would love to hear from you if you think we can take inspiration from other projects that we haven't covered here. 😊 + +## Licenses + +### Nebulet + +``` +MIT License + +Copyright (c) 2018 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +### WAVM + +``` +Copyright (c) 2018, Andrew Scheidecker +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: +* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. +* Neither the name of WAVM nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The contents of [Test/spec](Test/spec) is covered by the license in [Test/spec/LICENSE](Test/spec/LICENSE). + +[Source/ThirdParty/dtoa/dtoa.c](Source/ThirdParty/dtoa/dtoa.c) is covered by the license in that file. + +[Source/ThirdParty/libunwind](Source/ThirdParty/libunwind) is covered by the license in [Source/ThirdParty/libunwind/LICENSE.TXT](Source/ThirdParty/libunwind/LICENSE.TXT). + +[Source/ThirdParty/xxhash](Source/ThirdParty/xxhash) is covered by the license in [Source/ThirdParty/xxhash/LICENSE](Source/ThirdParty/xxhash/LICENSE). +``` + +### Greenwasm + +``` + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +``` + +### Wasmtime + +``` + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +--- LLVM Exceptions to the Apache 2.0 License ---- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into an Object form of such source code, you +may redistribute such embedded portions in such Object form without complying +with the conditions of Sections 4(a), 4(b) and 4(d) of the License. + +In addition, if you combine or link compiled forms of this Software with +software that is licensed under the GPLv2 ("Combined Software") and if a +court of competent jurisdiction determines that the patent provision (Section +3), the indemnity provision (Section 9) or other Section of the License +conflicts with the conditions of the GPLv2, you may retroactively and +prospectively choose to deem waived or otherwise exclude such Section(s) of +the License, but only in their entirety and only with respect to the Combined +Software. +``` + From 3783b923d19011a74d877a0b37e73ef49387177c Mon Sep 17 00:00:00 2001 From: Mackenzie Clark Date: Thu, 20 Dec 2018 21:50:24 -0800 Subject: [PATCH 28/38] implement a cross-platform stdout pipe --- src/common/file_descriptor.rs | 28 ++++++++++++++++++++++++++ src/common/mod.rs | 1 + src/common/stdio.rs | 38 +++++++++++++++++------------------ 3 files changed, 47 insertions(+), 20 deletions(-) create mode 100644 src/common/file_descriptor.rs diff --git a/src/common/file_descriptor.rs b/src/common/file_descriptor.rs new file mode 100644 index 000000000..33611499d --- /dev/null +++ b/src/common/file_descriptor.rs @@ -0,0 +1,28 @@ +use std::io::Read; +use std::io; +use std::io::Error; +use std::io::ErrorKind; +use std::ffi::CString; + +pub struct FileDescriptor(libc::c_int); + +impl FileDescriptor { + pub fn new(file_descriptor_number: libc::c_int) -> FileDescriptor { + FileDescriptor(file_descriptor_number) + } +} + +impl Read for FileDescriptor { + fn read(&mut self, buf: &mut [u8]) -> io::Result { + let file_descriptor: libc::c_int = self.0; + let count = unsafe { + libc::read(file_descriptor, buf.as_mut_ptr() as *mut libc::c_void, 1) + }; + if count < 0 { + Err(Error::new(ErrorKind::Other, "read error")) + } + else { + Ok(count as usize) + } + } +} \ No newline at end of file diff --git a/src/common/mod.rs b/src/common/mod.rs index 8694cd5f7..7109e6287 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -3,3 +3,4 @@ pub mod slice; #[cfg(test)] pub mod stdio; +mod file_descriptor; \ No newline at end of file diff --git a/src/common/stdio.rs b/src/common/stdio.rs index 26d72c431..01f9e80b8 100644 --- a/src/common/stdio.rs +++ b/src/common/stdio.rs @@ -1,7 +1,8 @@ use libc; -use std::fs::File; +use crate::file_descriptor::FileDescriptor; +use std::io::BufReader; use std::io::Read; -use std::os::unix::io::FromRawFd; +use crate::common::file_descriptor::FileDescriptor; // A struct to hold the references to the base stdout and the captured one pub struct StdioCapturer { @@ -17,7 +18,12 @@ pub struct StdioCapturer { impl StdioCapturer { fn pipe() -> (libc::c_int, libc::c_int) { let mut fds = [0; 2]; + + #[cfg(not(target_os = "windows"))] assert_eq!(unsafe { libc::pipe(fds.as_mut_ptr()) }, 0); + #[cfg(target_os = "windows")] + assert_eq!(unsafe { libc::pipe(fds.as_mut_ptr(), 1000, libc::O_TEXT) }, 0); + (fds[0], fds[1]) } @@ -28,9 +34,6 @@ impl StdioCapturer { let (stdout_reader, stdout_writer) = Self::pipe(); let (stderr_reader, stderr_writer) = Self::pipe(); - // std::io::stdout().flush().unwrap(); - // std::io::stderr().flush().unwrap(); - assert!(unsafe { libc::dup2(stdout_writer, libc::STDOUT_FILENO) } > -1); assert!(unsafe { libc::dup2(stderr_writer, libc::STDERR_FILENO) } > -1); @@ -48,28 +51,23 @@ impl StdioCapturer { } } - pub fn end(self) -> (String, String) { + pub fn end(self) -> Result<(String, String), std::io::Error> { // The Stdio passed into the Command took over (and closed) std{out, err} // so we should restore them as they were. assert!(unsafe { libc::dup2(self.stdout_backup, libc::STDOUT_FILENO) } > -1); assert!(unsafe { libc::dup2(self.stderr_backup, libc::STDERR_FILENO) } > -1); - // assert_eq!(unsafe { libc::close(self.stdout_backup) }, 0); - // assert_eq!(unsafe { libc::close(self.stderr_backup) }, 0); + let fd = FileDescriptor::new(self.stdout_reader); + let mut reader = BufReader::new(fd); + let mut stdout_read = "".to_string(); + let _ = reader.read_to_string(&mut stdout_read)?; - let mut stdout_read = String::new(); - let mut stdout_file: File = unsafe { FromRawFd::from_raw_fd(self.stdout_reader) }; - stdout_file - .read_to_string(&mut stdout_read) - .expect("failed to read from stdout file"); + let fd = FileDescriptor::new(self.stderr_reader); + let mut reader = BufReader::new(fd); + let mut stderr_read = "".to_string(); + let _ = reader.read_to_string(&mut stderr_read)?; - let mut stderr_read = String::new(); - let mut stderr_file: File = unsafe { FromRawFd::from_raw_fd(self.stderr_reader) }; - stderr_file - .read_to_string(&mut stderr_read) - .expect("failed to read from stdout file"); - - (stdout_read, stderr_read) + Ok((stdout_read, stderr_read)) } } From 207c4d8d5513e90c1fc9a84324d7723e17d8f167 Mon Sep 17 00:00:00 2001 From: Mackenzie Clark Date: Thu, 20 Dec 2018 21:55:03 -0800 Subject: [PATCH 29/38] unwrap it --- src/emtests/_common.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/emtests/_common.rs b/src/emtests/_common.rs index 75604d2d2..78b169f54 100644 --- a/src/emtests/_common.rs +++ b/src/emtests/_common.rs @@ -26,7 +26,7 @@ macro_rules! assert_emscripten_output { $args, ) .unwrap(); - let output = capturer.end().0; + let output = capturer.end().unwrap().0; let expected_output = include_str!($expected); assert_eq!(output, expected_output); }}; From bc63bb736a5f201a65c0477849d446c6554a024a Mon Sep 17 00:00:00 2001 From: Mackenzie Clark Date: Thu, 20 Dec 2018 21:58:00 -0800 Subject: [PATCH 30/38] this shouldn't be here --- src/common/stdio.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/common/stdio.rs b/src/common/stdio.rs index 01f9e80b8..2625136bc 100644 --- a/src/common/stdio.rs +++ b/src/common/stdio.rs @@ -1,5 +1,4 @@ use libc; -use crate::file_descriptor::FileDescriptor; use std::io::BufReader; use std::io::Read; use crate::common::file_descriptor::FileDescriptor; From cfb8442d6b39fe9528db8e7cda0e48c8d0bbae86 Mon Sep 17 00:00:00 2001 From: Mackenzie Clark Date: Thu, 20 Dec 2018 23:08:00 -0800 Subject: [PATCH 31/38] lint --- src/common/file_descriptor.rs | 14 ++++++-------- src/common/mod.rs | 2 +- src/common/stdio.rs | 7 +++++-- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/common/file_descriptor.rs b/src/common/file_descriptor.rs index 33611499d..33019a6bf 100644 --- a/src/common/file_descriptor.rs +++ b/src/common/file_descriptor.rs @@ -1,8 +1,8 @@ -use std::io::Read; +use std::ffi::CString; use std::io; use std::io::Error; use std::io::ErrorKind; -use std::ffi::CString; +use std::io::Read; pub struct FileDescriptor(libc::c_int); @@ -15,14 +15,12 @@ impl FileDescriptor { impl Read for FileDescriptor { fn read(&mut self, buf: &mut [u8]) -> io::Result { let file_descriptor: libc::c_int = self.0; - let count = unsafe { - libc::read(file_descriptor, buf.as_mut_ptr() as *mut libc::c_void, 1) - }; + let count = + unsafe { libc::read(file_descriptor, buf.as_mut_ptr() as *mut libc::c_void, 1) }; if count < 0 { Err(Error::new(ErrorKind::Other, "read error")) - } - else { + } else { Ok(count as usize) } } -} \ No newline at end of file +} diff --git a/src/common/mod.rs b/src/common/mod.rs index 7109e6287..63a6bd39f 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -1,6 +1,6 @@ pub mod mmap; pub mod slice; +mod file_descriptor; #[cfg(test)] pub mod stdio; -mod file_descriptor; \ No newline at end of file diff --git a/src/common/stdio.rs b/src/common/stdio.rs index 2625136bc..8e26c67ce 100644 --- a/src/common/stdio.rs +++ b/src/common/stdio.rs @@ -1,7 +1,7 @@ +use crate::common::file_descriptor::FileDescriptor; use libc; use std::io::BufReader; use std::io::Read; -use crate::common::file_descriptor::FileDescriptor; // A struct to hold the references to the base stdout and the captured one pub struct StdioCapturer { @@ -21,7 +21,10 @@ impl StdioCapturer { #[cfg(not(target_os = "windows"))] assert_eq!(unsafe { libc::pipe(fds.as_mut_ptr()) }, 0); #[cfg(target_os = "windows")] - assert_eq!(unsafe { libc::pipe(fds.as_mut_ptr(), 1000, libc::O_TEXT) }, 0); + assert_eq!( + unsafe { libc::pipe(fds.as_mut_ptr(), 1000, libc::O_TEXT) }, + 0 + ); (fds[0], fds[1]) } From 1ad580a6183f2fb6f5f1d6e03a5cf831dd71c653 Mon Sep 17 00:00:00 2001 From: Syrus Date: Fri, 21 Dec 2018 17:16:40 -0800 Subject: [PATCH 32/38] Improved emscripten env(get,set,unset,put) integration --- build/emtests.rs | 6 +--- emtests/env.c | 20 ++++++++++--- emtests/env.output | 12 ++++++-- emtests/env.wasm | Bin 45738 -> 46214 bytes emtests/printf.wasm | Bin 46179 -> 47042 bytes src/apis/emscripten/env.rs | 57 ++++++++++++++++++++++++++++++------- src/apis/emscripten/mod.rs | 3 ++ src/emtests/env.rs | 7 ++++- 8 files changed, 82 insertions(+), 23 deletions(-) diff --git a/build/emtests.rs b/build/emtests.rs index 24032ace7..2d5306994 100644 --- a/build/emtests.rs +++ b/build/emtests.rs @@ -11,11 +11,7 @@ use std::process::Command; static BANNER: &str = "// Rust test file autogenerated with cargo build (build/emtests.rs). // Please do NOT modify it by hand, as it will be reseted on next build.\n"; -const TESTS: [&str; 3] = [ - "emtests/env.c", - "emtests/puts.c", - "emtests/printf.c" -]; +const TESTS: [&str; 3] = ["emtests/env.c", "emtests/puts.c", "emtests/printf.c"]; pub fn compile(file: &str) -> String { let mut output_path = PathBuf::from(file); diff --git a/emtests/env.c b/emtests/env.c index 62e0ee6ee..72350ed40 100644 --- a/emtests/env.c +++ b/emtests/env.c @@ -4,10 +4,22 @@ int main() { printf("INIT\n"); const char* UNEXISTENT_ENVVAR = getenv("UNEXISTENT_ENVVAR"); - printf("get UNEXISTENT_ENVVAR: %s\n",(UNEXISTENT_ENVVAR!=NULL)? UNEXISTENT_ENVVAR : "[NULL]"); - printf("set UNEXISTENT_ENVVAR = SET\n"); - putenv("UNEXISTENT_ENVVAR=SET"); + printf("UNEXISTENT_ENVVAR = %s\n",(UNEXISTENT_ENVVAR!=NULL)? UNEXISTENT_ENVVAR : "[NULL]"); + printf("Setting UNEXISTENT_ENVVAR=SET (via putenv)\n"); + putenv("UNEXISTENT_ENVVAR=PUTENV"); UNEXISTENT_ENVVAR = getenv("UNEXISTENT_ENVVAR"); - printf("get UNEXISTENT_ENVVAR: %s\n",(UNEXISTENT_ENVVAR!=NULL)? UNEXISTENT_ENVVAR : "[NULL]"); + printf("UNEXISTENT_ENVVAR = %s\n",(UNEXISTENT_ENVVAR!=NULL)? UNEXISTENT_ENVVAR : "[NULL]"); + printf("Setting UNEXISTENT_ENVVAR=SETENV (via setenv, overwrite)\n"); + setenv("UNEXISTENT_ENVVAR", "SETENV", 1); + UNEXISTENT_ENVVAR = getenv("UNEXISTENT_ENVVAR"); + printf("UNEXISTENT_ENVVAR = %s\n",(UNEXISTENT_ENVVAR!=NULL)? UNEXISTENT_ENVVAR : "[NULL]"); + printf("Setting UNEXISTENT_ENVVAR=SETENV_NEW (via setenv, NO overwrite)\n"); + setenv("UNEXISTENT_ENVVAR", "SETENV_NEW", 0); + UNEXISTENT_ENVVAR = getenv("UNEXISTENT_ENVVAR"); + printf("UNEXISTENT_ENVVAR = %s\n",(UNEXISTENT_ENVVAR!=NULL)? UNEXISTENT_ENVVAR : "[NULL]"); + printf("Unsetting UNEXISTENT_ENVVAR\n"); + unsetenv("UNEXISTENT_ENVVAR"); + UNEXISTENT_ENVVAR = getenv("UNEXISTENT_ENVVAR"); + printf("UNEXISTENT_ENVVAR = %s\n",(UNEXISTENT_ENVVAR!=NULL)? UNEXISTENT_ENVVAR : "[NULL]"); printf("END\n"); } diff --git a/emtests/env.output b/emtests/env.output index d546fd4d8..70b84738c 100644 --- a/emtests/env.output +++ b/emtests/env.output @@ -1,5 +1,11 @@ INIT -get UNEXISTENT_ENVVAR: [NULL] -set UNEXISTENT_ENVVAR = SET -get UNEXISTENT_ENVVAR: SET +UNEXISTENT_ENVVAR = [NULL] +Setting UNEXISTENT_ENVVAR=SET (via putenv) +UNEXISTENT_ENVVAR = PUTENV +Setting UNEXISTENT_ENVVAR=SETENV (via setenv, overwrite) +UNEXISTENT_ENVVAR = SETENV +Setting UNEXISTENT_ENVVAR=SETENV_NEW (via setenv, NO overwrite) +UNEXISTENT_ENVVAR = SETENV +Unsetting UNEXISTENT_ENVVAR +UNEXISTENT_ENVVAR = [NULL] END diff --git a/emtests/env.wasm b/emtests/env.wasm index d31a64c33115446274f95d98c078109cb4941d69..338ca49b145d1a93a12224a347ee3cbe76cbb4e3 100644 GIT binary patch delta 4593 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 delta 4212 zcmZu!4Nw$E7M`A+*f|-9lW21^HW|$pr%m z#CXP}I2)BRG5(RnGj~@L(!}KMUeE4ct}0j6 zHU0J1uV26S`pui3O<#(Ku8N)YmKUWlhntoW<2q?2t@*J&pU>aaR9Ek-t*@+TuCA{W zl1BJ^YyHhWf8F}(CL9;od~4R!J|3(R9*})&n*4qt(dnzLUBAw^D!8Gd!B;(LqA*wX zt*fZ66B2CL*P<%nK1BX?l?_h{51T0HZx)JVUvO1ZjWEx#`pLREDA($%t`_D;hetTT z;et4Su(@JYZFR7!w7H_PrnI4=(l3lsnjWt!sSh@n`kRA7p&iwgRWU#Y3o@+Mzy*f zG|uhNGXtp(x5KRzOSAM$)uKS04gngAU1ET$*r@^P#Lga|F%U;b=mHh=Q%NvFoikd0 zKS^~`8DvU;P%Btkw$r*+Y}2;c3dMsOd)T%N z2du}|A#T@aiE)72A04{QWPuX!(;#BkwjV)5%7JJhTXY?8od$u8_RP4}<;h23y?9y1h zdOzQLi)yNTM-4hqr9GsP&5V77%WjL!B3#AEkwaXCu`PZI;fBAP(8GCFpJ=K)kvK%0 z2Q}DX(Z%Kf-D%O$$X7>CL|csyMz@-xrDNA}jRRwCB5GhKUCG>tFI+AK9r&jiL!_O_ zC1{2&gw3cr!>61*%Gp#EMjE1NtiBHHpMb%}#sHbi^LJl2xZ zg3oVLlEm{~mgue&QGBC2TRi4vN8R~2^_}~$h&%i`wd}rm^nwHzB)zqeelEf1-2D$F zbskGh(?$)LyI+#vlB7#b^s=PmhNWrK?epkWv=Ayk3FrXpk%&`bKp&{nXU<3?nh&gkL1M`H=YB=E3=?FNl zA?D1v2)Lpl=FG(ixS=8D%(V!(ts&;j%?S8jL(G}G5zyg5%$YV5v?AK-!2zc>M?jYc zF=sj>;1v&I&U8mWj|VYl_C~<3Jcv1SFar8Kh&j_60RtYyoH-T(t%82Sg9AKK zF=tLiz*!Gs&YX^b^B%;UITry}Jcv1SF#>LQ5Od~Q1l;x@=FH77V9DCkY+?EerCWnd zGN0M1v7_nJqQOgiLdFbXR_~`G3S9E8;S1i3EGW&$!`F;OMbwbNkj?B1r5)0k!AH4r<4nd*;tCar&t$;%i5#F8WL^_4m^)m)0z>GSdL#5R<(-ElK2i&;#DhP+ih*6d#qS|jX!2?F>B&mR7r?-rR~$6H7&K} zPUe>8<(if@y1dU0*sv}iu)_g67A8Kbp*?nf20eD}L8vajW(RComtVK@y4;yp zMv~aoylEm<6_~M!e+&-JsO6uAgqcr;qy8}gY#)(E`WM2Z{`$<{o7Pn8Md7I5BY^EY zl=zELn&_+UG zC;&}O$NQPU?{!fS#aX<2ahAm{*-z7{3r6cCK$Ag$WYcv3;8J)>rqtObt4Ru*wzQF? zvp1I}<8x@~mdv?mzKGW~K?aM$ZFefMMC6xDqW5K}Hhmz&sl@!qu;(7lb3DMerb&wG zWy6ooCaKI>o=wKH!txa2X4U1HB!lfLcYDWEG=Y+6Q2{|s<%aM`rr}^brbZgR3n`Sy zICL9-D<30~OlDc}AZnYmVgT{Y6>a!zTv>oRf3tFkBpL0#UP7|ic;Y|mex%tlNqbajO}+p51!0x1irvf>o|9|u9##qcYQ9I zz>kSoqDqa-{R)YnjlY;N zP9-ixOSl~im6jD0m-z~cmoC*8KLlw(hp@bO$$|wd a1pM9psRZOfX+fDo_{q{dq}lww-2VV)A9bGq diff --git a/emtests/printf.wasm b/emtests/printf.wasm index 69cc16f2b7743d206fabe9cad0fb1a9891f35518..c3f19ab96f8195cbf12286b3e19df425e3d495f7 100644 GIT binary patch literal 47042 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 P&Uu}%<1N+~z5D+IvixPX literal 46179 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 i3&f!*7&rZ12U6~ZE%AgFyG`oP7 u32 { unsafe { copy_cstr_into_wasm(instance, c_str) } } +/// emscripten: _setenv // (name: *const char, name: *const value, overwrite: int); +pub extern "C" fn _setenv(name: c_int, value: c_int, overwrite: c_int, instance: &mut Instance) { + debug!("emscripten::_setenv"); + + let name_addr = instance.memory_offset_addr(0, name as usize) as *const c_char; + let value_addr = instance.memory_offset_addr(0, value as usize) as *const c_char; + + debug!("=> name({:?})", unsafe { CStr::from_ptr(name_addr) }); + debug!("=> value({:?})", unsafe { CStr::from_ptr(value_addr) }); + + unsafe { setenv(name_addr, value_addr, overwrite) }; +} + +/// emscripten: _putenv // (name: *const char); +pub extern "C" fn _putenv(name: c_int, instance: &mut Instance) { + debug!("emscripten::_putenv"); + + let name_addr = instance.memory_offset_addr(0, name as usize) as *const c_char; + + debug!("=> name({:?})", unsafe { CStr::from_ptr(name_addr) }); + + unsafe { putenv(name_addr as _) }; +} + +/// emscripten: _unsetenv // (name: *const char); +pub extern "C" fn _unsetenv(name: c_int, instance: &mut Instance) { + debug!("emscripten::_unsetenv"); + + let name_addr = instance.memory_offset_addr(0, name as usize) as *const c_char; + + debug!("=> name({:?})", unsafe { CStr::from_ptr(name_addr) }); + + unsafe { unsetenv(name_addr) }; +} + pub extern "C" fn _getpwnam(name_ptr: c_int, instance: &mut Instance) -> c_int { debug!("emscripten::_getpwnam {}", name_ptr); @@ -108,15 +146,14 @@ pub extern "C" fn ___build_environment(environ: c_int, instance: &mut Instance) debug!("emscripten::___build_environment {}", environ); const MAX_ENV_VALUES: u32 = 64; const TOTAL_ENV_SIZE: u32 = 1024; - let mut environment = - instance.memory_offset_addr(0, environ as _) as *mut c_int; + let mut environment = instance.memory_offset_addr(0, environ as _) as *mut c_int; unsafe { - let (pool_offset, pool_slice): (u32, &mut [u8]) = allocate_on_stack(TOTAL_ENV_SIZE as u32, instance); - let (env_offset, env_slice): (u32, &mut [u8]) = allocate_on_stack((MAX_ENV_VALUES*4) as u32, instance); - let mut env_ptr = - instance.memory_offset_addr(0, env_offset as _) as *mut c_int; - let mut pool_ptr = - instance.memory_offset_addr(0, pool_offset as _) as *mut c_int; + let (pool_offset, pool_slice): (u32, &mut [u8]) = + allocate_on_stack(TOTAL_ENV_SIZE as u32, instance); + let (env_offset, env_slice): (u32, &mut [u8]) = + allocate_on_stack((MAX_ENV_VALUES * 4) as u32, instance); + let mut env_ptr = instance.memory_offset_addr(0, env_offset as _) as *mut c_int; + let mut pool_ptr = instance.memory_offset_addr(0, pool_offset as _) as *mut c_int; *env_ptr = pool_offset as i32; *environment = env_offset as i32; diff --git a/src/apis/emscripten/mod.rs b/src/apis/emscripten/mod.rs index 413171e63..44743d812 100644 --- a/src/apis/emscripten/mod.rs +++ b/src/apis/emscripten/mod.rs @@ -114,6 +114,9 @@ pub fn generate_emscripten_env<'a, 'b>() -> ImportObject<&'a str, &'b str> { import_object.set("env", "___wait", ImportValue::Func(lock::___wait as _)); // Env import_object.set("env", "_getenv", ImportValue::Func(env::_getenv as _)); + import_object.set("env", "_setenv", ImportValue::Func(env::_setenv as _)); + import_object.set("env", "_putenv", ImportValue::Func(env::_putenv as _)); + import_object.set("env", "_unsetenv", ImportValue::Func(env::_unsetenv as _)); import_object.set("env", "_getpwnam", ImportValue::Func(env::_getpwnam as _)); import_object.set("env", "_getgrnam", ImportValue::Func(env::_getgrnam as _)); import_object.set( diff --git a/src/emtests/env.rs b/src/emtests/env.rs index 3c53a539d..58b674a3f 100644 --- a/src/emtests/env.rs +++ b/src/emtests/env.rs @@ -1,4 +1,9 @@ #[test] fn test_env() { - assert_emscripten_output!("../../emtests/env.wasm", "env", vec![], "../../emtests/env.output"); + assert_emscripten_output!( + "../../emtests/env.wasm", + "env", + vec![], + "../../emtests/env.output" + ); } From cef68376228bca8bd2df7c5a007b1b19b4728db2 Mon Sep 17 00:00:00 2001 From: Syrus Date: Fri, 21 Dec 2018 17:19:08 -0800 Subject: [PATCH 33/38] Improved emtests env test --- emtests/env.c | 2 +- emtests/env.output | 2 +- emtests/env.wasm | Bin 46214 -> 46217 bytes 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/emtests/env.c b/emtests/env.c index 72350ed40..62a9024a3 100644 --- a/emtests/env.c +++ b/emtests/env.c @@ -5,7 +5,7 @@ int main() printf("INIT\n"); const char* UNEXISTENT_ENVVAR = getenv("UNEXISTENT_ENVVAR"); printf("UNEXISTENT_ENVVAR = %s\n",(UNEXISTENT_ENVVAR!=NULL)? UNEXISTENT_ENVVAR : "[NULL]"); - printf("Setting UNEXISTENT_ENVVAR=SET (via putenv)\n"); + printf("Setting UNEXISTENT_ENVVAR=PUTENV (via putenv)\n"); putenv("UNEXISTENT_ENVVAR=PUTENV"); UNEXISTENT_ENVVAR = getenv("UNEXISTENT_ENVVAR"); printf("UNEXISTENT_ENVVAR = %s\n",(UNEXISTENT_ENVVAR!=NULL)? UNEXISTENT_ENVVAR : "[NULL]"); diff --git a/emtests/env.output b/emtests/env.output index 70b84738c..a6cb32095 100644 --- a/emtests/env.output +++ b/emtests/env.output @@ -1,6 +1,6 @@ INIT UNEXISTENT_ENVVAR = [NULL] -Setting UNEXISTENT_ENVVAR=SET (via putenv) +Setting UNEXISTENT_ENVVAR=PUTENV (via putenv) UNEXISTENT_ENVVAR = PUTENV Setting UNEXISTENT_ENVVAR=SETENV (via setenv, overwrite) UNEXISTENT_ENVVAR = SETENV diff --git a/emtests/env.wasm b/emtests/env.wasm index 338ca49b145d1a93a12224a347ee3cbe76cbb4e3..0df9e53a585ff3ee61c031b22f089f7fb50ab902 100644 GIT binary patch delta 244 zcmZpB$<+ChX+sGs3bVP5z!82qZmoY=ytcvpW8e=T>A@*vQCIufWRc_pfI^P_acxJnwKZ=OQI3 h3Uh9jU}SJ?;NV`pId+8 z&TP(%?>4uy<)<=!p8P#K5J-CF*b0A^XLbB4&#lO+u#u6aUV)X>@yq0yIUw2BIW|C2 zBR7)iul(fZ+>1a?XkMPcXL*Gsj9H3H85N!}vD7<$o_sm)KI7-joAdSg7+WSkt~C~J zRbX}OQs7o(QNHvB16hkVU#YVcVO+kMZ?Xy#kTRaC fD9pJ*f|0?ofrER+=GYZd+|0qQA)9MA^DqJc@$Xd2 From 3764e02607c7ac391c3a789cd4a5e0662f1ecaa0 Mon Sep 17 00:00:00 2001 From: Syrus Date: Fri, 21 Dec 2018 22:37:39 -0800 Subject: [PATCH 34/38] Added emscriptent environment docs --- src/apis/emscripten/README.md | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/apis/emscripten/README.md b/src/apis/emscripten/README.md index e5858b17f..b88f1fc03 100644 --- a/src/apis/emscripten/README.md +++ b/src/apis/emscripten/README.md @@ -26,9 +26,21 @@ ###### ENVIRONMENT -- **\_getenv**     [:top:](#host-apis) +- **\_getenv** ✅     [:top:](#host-apis) ```rust - + fn _getenv(name: c_int, instance: &mut Instance) + ``` +- **\_putenv** ✅     [:top:](#host-apis) + ```rust + fn _putenv(name: c_int, instance: &mut Instance) + ``` +- **\_setenv** ✅     [:top:](#host-apis) + ```rust + fn _setenv(name: c_int, value: c_int, overwrite: c_int, instance: &mut Instance + ``` +- **\_unsetenv** ✅     [:top:](#host-apis) + ```rust + fn _unsetenv(name: c_int, instance: &mut Instance) ``` ###### THREAD @@ -44,10 +56,6 @@ - **\_pthread_setspecific**     [:top:](#host-apis) ```rust - ``` -- **\_unsetenv**     [:top:](#host-apis) - ```rust - ``` - **\_\_\_lock**     [:top:](#host-apis) ```rust From 8c2d4c5777fa449c60f58d1e74a5b63eb584dc25 Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Sat, 22 Dec 2018 11:33:22 -0800 Subject: [PATCH 35/38] Fixed overwritten releases --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 0789ddcc3..7e3a23b5f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -138,7 +138,7 @@ jobs: # VERSION_TAG=$(git describe --exact-match --tags) #if [ "$VERSION" == "$VERSION_TAG" ]; then # echo "Versions match, publishing to Github" - ghr -t ${GITHUB_TOKEN} -u ${CIRCLE_PROJECT_USERNAME} -r ${CIRCLE_PROJECT_REPONAME} -c ${CIRCLE_SHA1} -delete ${VERSION} ./artifacts/ + ghr -t ${GITHUB_TOKEN} -u ${CIRCLE_PROJECT_USERNAME} -r ${CIRCLE_PROJECT_REPONAME} -c ${CIRCLE_SHA1} -soft ${VERSION} ./artifacts/ #else # echo "Versions don't match. Wasmer output version (wasmer --version) is ${VERSION} while Git tag is ${VERSION_TAG}" # exit 1 From bfa68e8d79575bc0a2dfc410adfa6bfdd9f38f58 Mon Sep 17 00:00:00 2001 From: Brandon Fish Date: Mon, 24 Dec 2018 13:10:29 -0600 Subject: [PATCH 36/38] Add workaround to prevent use after free issue resulting in bad pointer --- src/webassembly/instance.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/webassembly/instance.rs b/src/webassembly/instance.rs index 1692e9cd0..8d3b4280e 100644 --- a/src/webassembly/instance.rs +++ b/src/webassembly/instance.rs @@ -199,6 +199,10 @@ pub struct Instance { // Region start memory location // code_base: *const (), pub emscripten_data: Option, + + // Workarounds to prevent use after free issue + memories_pointer: Vec>, + tables_pointer: Vec>, } /// Contains pointers to data (heaps, globals, tables) needed @@ -642,6 +646,8 @@ impl Instance { import_functions, start_func, emscripten_data: None, + memories_pointer, + tables_pointer, }; if options.abi == InstanceABI::Emscripten { From 1aebf0478114047e582bfb94f625cb4bbb2e1eee Mon Sep 17 00:00:00 2001 From: Brandon Fish Date: Mon, 24 Dec 2018 13:38:54 -0600 Subject: [PATCH 37/38] Add CI job to test rust nightly --- .circleci/config.yml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 7e3a23b5f..ffec3c519 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -118,6 +118,28 @@ jobs: - target/release/deps key: v4-cargo-cache-darwin-{{ arch }}-{{ checksum "Cargo.lock" }} + test-rust-nightly: + docker: + - image: circleci/rust:latest + + steps: + - checkout + - restore_cache: + keys: + - v4-test-cargo-cache-linux-{{ arch }}-{{ checksum "Cargo.lock" }} + - run: sudo apt-get install -y cmake + - run: rustup default nightly + - run: make test + - run: rustup component add rustfmt + - run: make lint + - save_cache: + paths: + - /usr/local/cargo/registry + - target/debug/.fingerprint + - target/debug/build + - target/debug/deps + key: v4-test-cargo-cache-linux-{{ arch }}-{{ checksum "Cargo.lock" }} + publish-github-release: docker: - image: cibuilds/github @@ -160,6 +182,10 @@ workflows: filters: branches: only: master + - test-rust-nightly: + filters: + branches: + only: master # : # filters: # tags: From f9855d59fb3b2b683f8ffe226118286811baf68c Mon Sep 17 00:00:00 2001 From: Brandon Fish Date: Mon, 24 Dec 2018 14:15:31 -0600 Subject: [PATCH 38/38] Update CI cache key and remove make lint for PR feedback --- .circleci/config.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index ffec3c519..4203a0881 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -126,19 +126,17 @@ jobs: - checkout - restore_cache: keys: - - v4-test-cargo-cache-linux-{{ arch }}-{{ checksum "Cargo.lock" }} + - v4-test-cargo-cache-linux-{{ arch }}-{{ checksum "Cargo.lock" }}-nightly - run: sudo apt-get install -y cmake - run: rustup default nightly - run: make test - - run: rustup component add rustfmt - - run: make lint - save_cache: paths: - /usr/local/cargo/registry - target/debug/.fingerprint - target/debug/build - target/debug/deps - key: v4-test-cargo-cache-linux-{{ arch }}-{{ checksum "Cargo.lock" }} + key: v4-test-cargo-cache-linux-{{ arch }}-{{ checksum "Cargo.lock" }}-nightly publish-github-release: docker: