From ccd993a4fe6bbc627eca1df3b41e316b73598655 Mon Sep 17 00:00:00 2001 From: hut Date: Sun, 31 Mar 2024 00:18:49 +0100 Subject: [PATCH] load jupiter from a texture rather than scene --- .../jupiter.glb => textures/jupiter.jpg} | Bin 506484 -> 412783 bytes src/defs.txt | 8 +- src/world.rs | 239 ++++++++++-------- 3 files changed, 141 insertions(+), 106 deletions(-) rename assets/{models/jupiter.glb => textures/jupiter.jpg} (81%) diff --git a/assets/models/jupiter.glb b/assets/textures/jupiter.jpg similarity index 81% rename from assets/models/jupiter.glb rename to assets/textures/jupiter.jpg index d16eb84568175938cdaadea17c4b83590d35566e..102b4027f3232d99594e6be5752d7a3dfef3a5d3 100644 GIT binary patch delta 36 kcmezJMeh9!$##}JMj&PaVrC#_0b*7lX4}q^$DZ#40Q8OveEq(&b@H}ha7OsSwKNiL;@Uex*unADm62QM3dCC zECqAo?2V}4l$lm)S!kN#1mZlE@Bg>%wR!G}>-*mK{oc2)E3dQ8efC~!?X}nbum4`> z01JP#&IccCSROTQ-(gEP8jZ>KFW1<4*+yg6efHer)NUguO&UG9+n`gs9W{FV=!qjI zA3w3%pl;tfdgAfpkDt_)DP6Z8H+uY$qbGLVrRSbqPwdm9SC2k@x^?e%;^>K!#vVUj zgWG!a>UMhfZj+9Xf^LI)xiqQUpo35CHh$!Bde&_peO8XvtntSmIhs#;9eVnqo$pTV zcHHPmN88*yVZza)CywsMpyNhP9zAjF$Z?gzBac5})VR_6j6HJnk=+JOo_NA&X{l`N z?&D--!l;S6kDfeo+_i$kx|%>nslPIoS+@=k^(jy-PdeFhvpe3$Kd_3uBR%_2VX2zfK<_=%Oxx;~jb;`rkx z96x^a_{pYpP~YBd{djo7cqLI=?><`IaU&JZgM0NDIG}%9d+%Po`}OWSuvg#yWxwuv zHn4x+{{8y*ZtvT#tyk~f{dvT&Uj2Iy(8B@k?fu#EvC6B1x5=ONZ6Da))_cIffqlC3 z?B7-7ah<06NylW?JgD3LLw9Ibc53U(T3qDi|NA=rLqknL+y9yZ#kG4WA8H!3*Z=8) zJ+x5v?me)VcF%p-XNT=}+iq{$oK79}?Xip)HD&VX-A0c;YO;<}Ti<>Ip#?E`xKi;8Z8 z`VCOR{i}xd|A%Gt>D|_UfPzXGN{_>!fo<(=c4+)GRdLh-8a8&Epr+fPf&JSCS`sdP zpd96tRk8QD*Mi-*SKr>f`sloN?b>zKyO(QhzsnxN*|XYvp0Q7O_vn>Vqj5p|E#>f4 z!kCTs)|(%-_dR1+vD8Z^Nq(+fBOBcxI8E{mJdX`~t_j0eNk?n^h^bwg<93}AI}7Mz>2`Zslmg(Q!AeT96;d-n43D#W?-moD0lRBK^!|b7Id2 zz9>o(q{jna#I>(lBak3^O>@`X)V!Xf5Gi@g>#eoN+uq$~UJtyxEkBPu_wkYOu7}su zO9rGr$xxI*bNY8O><%S4RGO#9>^ddksXRBY&)WHwmO^Y^cU`c5B&2x#(pRpFia@|= zMI?s%dYIEhLVIgYvz2L`J(d&O%F8{ww{y#9c{NM8W|A1k)TmJ8duI9wepAELW>3QjO zE#Zmf&Fd?z5jlS34O=EWvAkKNQ$Vhe?EU{x-VpoT`)x~{K|1$>L`$3vgj@m?OPs65 zKM0`kJg%?jK0Y$u6{Y?`2nT~z%rr>74X znx99WvoLVwERAnfdeR@Ir_}kyKzc_803y7`usf8-$RYDoNAwUm`tyr-vrsoW`nO#t z=*8(q$K!3PXy$aIu}b?O;RHvt(OAFjC>=jS-Dou1i6~At8eQ*HLBr`%Z|-VWr8BP^ zjkWr)0z%zr+>s|p9&)EEN{z;j*?{Eb%`i?k8mqOtLz16r`$gqwYIKCQl29wsBULr2 z9XL&q+Tqt_73y_Vy=tK@W_qY!RN3^<6_m|id#GEv&A^Qb}7R-)Oh5cT7CbiXEkM0$!1$XQG3;x12W zR=%w#^;B&gIaCsAKB#4NR+K*57mUS80;9%fRi1=S>b)17#@yr45w^9P(8O~bcI&P+xtGo*? zlEa;Ds}>Z?JKf%15q#6>HhcZ7(`}Nq!|65-ec##k-NKPuVcVrh;1}~w${)lT`oJgH z3S3bFklu2-jR6ef^bRuY4kZ<>Vt+Xbo5ImX;?T}bXC)P%IrSYrmE{)ZfG%(`d>%yn~vY(tD@rJ$+~PH% z#xP!U8r-3TLsY{Y>TOidar#E(itZ87j-qmCBh`PLepI;yFTm-CmDKPBoIbHsHY(Z7 z>t4!Iu1t9SORYc{ZC>|PNd0;Im7e?f*jwXWQ94n2+(5#BAUfjoTp4zU5~sl(O*pD! z*(&k+dYwy{3SM(eV7qudQ0ExFj@RF;0K~i=q;vn6STmuf=s>4&`W{8Dy4f}whbf1| zCwLxzt>->IGG0K0p0w?KJ<8w)5(Y4g*8^nO9ZEPPq$9iuM}>e9r$-9`b&k#HcZ3%L zB6IpNA>P)yaNzWo6;vlejebSOoPJ0V;^NZxjB;49nf7>qZZsrFZ=C||xp~cVpAeZK z2t|=ODu}M~Lk2L6(-?M#(gHbjROM*G(MIE8h^}lrsyjkWF6(dpe~`=n@aVtmgz^9X z49ouoC#G^MR^FVVV$@g1k7Qq$`~SAeMzZ|{RWH@`MB+TDy;OEu;&2L1&~=<_=Ntn&9_`w1uT`Xv=9DNZ>3O^sKTG^a^A43q7>bZUeT=CtM&!VPnJbph8vbxKI~3xvF- zpwhhN0|AhE-B%M>G1=Z*irj!@HHOJ{4EL`bO7rB900l=Aj-H}k4^Ho+VzizB4W|!L z)f^%`!09hH{&RB+oiatb4D(gh?pH|h`e~I-93s@Gs%#3Q&Fk}3Hb0(6XROh+J8@owgIW7fTQ)#V=whFL-5 z>9eNS<+s#OU^R{JzcalqgC*op<5yQrugfEqD=e}x>+|W0dTh+nuS-lpO%i4g>-$D zT=s8cg;7n$c(3QjUsUVKYs(1J94&s@D7Sc#EE^lBQ>L6m@-z zx>HzE|5bWOz)fB(+v#FP5`@)I>({9qqKny@Qe|>FRJDGpA4N)NA3usT86NSYNUfjk zN0BDOBtMGu3VZlbq-St@b>a%$x?+3jXOUWeTlGPtkK5CaA`@H@R5}~5CIg1aY7DzW z35VR#grnCv>Yc6%s-tX?7B!E39Q4Y0D!FSo>QTx1JL)wxU}A-01+{yIqaL;XKu0}V zYW_Tmh$bH&89%VnlhEV(6Qv%*IIX)v6iAhLlyrNE*H)e;JU!BD{20By*;)xuOJ4Z|*f7 z0~p3@47)=~_r!RF9E1bn=!q3c2|w0CgpL;Kc7^$zvnds@xMt;0!XbAw;b^&; zGuP{t-G6cBN}>6hCV*}jV#Rn38|onipcsbRH4dmIyH``v;`AL#;&Yw2_EB>C^T=}_ zZ^`X?%7h{}0CPyv2rM>AVnM{)Hpia?+7R9cpm6?1di>;8&`J(aO7`(M_})t z@H+za;UwVzPX9sh3&9cWnBf=ebz7gBD{j7Q5)E&bcVS}{IvA{r|J5Ef;NyY#&V-EiL6_GK_UG&t# z$Xs-8ap*?rW9e*{tpld+nC6EK%CxJzkQ3?Wa-v<{?K)~w!n@@To844G#daxuq5GUB zr(ld$uz&j@_6^rP53H1)nKP|P0o%OmURe%XNcOn}bGP07Wn1yCpPwIZKD1xKg1^`8 z#kkkF6N&?;mOF-K*EQ1i=Ur(le(&@?>42+lvlV~-*6ykMy7$?NyH7YgeOk`4756^u z==8Z{R*cLTR@_5l4%A#${F&yWlNB$L&fzk~iVN9tClXFkE8Vbp=xf} zMsq*D^!$PxVgau&zj48lUg6NMreA$IsUULY6Kn30mO69KViP6chF{q_%L&;B1;+T~ zw7e#NBBhkzt);ZbMH?3+)X!#5j^~Xy$HF^%gE?`R&F)focMN;(xokRi^%pFdxyg!wiDr`+sT$YRN&BUv&+dA-mNd%IFb~E z_uLWZm|?Par_Jt)Qf%QxsS?k^%ho6%ExeovC8~w@*8(ME!i&rpqRW_#G?(ZqiA^Wb zJ*MphwNZ`^Zk9hvTwGRJogEa2_Txn7}U)7hvh7j2|F@l2s>k#OW2usB#Hb>pL;x;)a zaKVX$6DJ=0eG6~*dq%ea9HKkq-TPYFLW}M;+kVzk8Llv6%gJlU&$UWG^|6XjI zJJeSH%5BHDzVgC%Y@6EezdSz=uj;vvkBoOcp>=inQVU~bvPxx?M>rI4$PFh9yK~{6 za_)qlS6Fx(jmz8a7tRyj#)#G0K{t}OG33fNA)JM`F=DxP)c}ibW5_SsaE^l4=y;(` z)GWMIs^T?z-E09)r)H9y+@vN@c6x zsr`_aD3xXGqjRRUR5UDO&)?|cET{7%`Y!Dthh{;@31G@8xzmgcH(VWitS^a>3Nu$}NyH~=5Q3oFjh%kkMp zPC(aS!pI~q@>UMLjLFc;+=ULk=o~CtB(H3h#l;T2II&YF^fpoC$I|wUBt2Cu_p5$H zA*90h;s?rb81G{hPNciUY}c!>BnV528m<&RCfunp)lo0^F=mS~G8VdwQa}c!hdanX zum5pQ1v0OTrZ*g928o*gvw9wQ{!^7~*l>3d&*Xdp9=W?nit~wr3Q2UuCyEV9Clnv4 zSl}JtAhHm;IiVndkO?pHqfRLBUWC=Kfw_g0lDsHY>9z2}id9PtdU4{GPCikn8rmXD z!v0}Zsf_W0=VU3E&HfP;66GT=FsF#k9^jR5rqIuy2Nj;C&ox%;2EtFJA3ba(dOq-~ zh(jChGq5y}fqIFt=CYV&s$#K0RXPJ>p6F!5#os&GaPf$w-VHdyi3G#TiH6`w9;gcqtkr;`n5C(O|&JK1p2tmqmnD3JNA zo~*|yjwOzcfijwfZwv3Yd&5F9E zb40=4aY}cY3X?w%qI7w@mFUtH1r%+mtR;I%l(V!yRJI2d_Mvi+?A=2S9VLgzUYsOv z2(R`ra4bn)lK3tqD%b!ZAroC>#t>b`kOzux8Oh?KrIhe;G8hd!pDa-HU72gxsjD!#+7z4Fr*`_>=Wp>gPec| zz-(DH+>JebRNKS;LA71Bo05;QsQ6qvis)p^(An;d2q5@+oeH9Raj7H03J5QQo7z{x z%Y^-PMhWjHIzC$plnC#Z0;&aqS;7nKA`{*ok{LsIx6qjVG?(OMZXumSm;AvN(Zv={ zfdA(5tr1?7;RL@ne<*;t!>`Q;3Sj(s;JHsQvWeHQ8WdrGEyKXZ-r1Tgg4w_7DFrd( zVpDHyQPMZ_#@2_*iPx;LRW8JfP3GAF#Tg>&7#okI-B`kyi0O2&VX_Ej zHmO(%I_zm1pHoKEr{M6KwUJe}lS%Btps86@u^P`-D+ zQ_diJ4>kUG`gFp(G=pY!nNE0Za-(B9*~^(m5#cps6RyIEWKJ}enojcK+?irIAn7c@ z`NQ5H+*IK6NF@hk9}^yYUid$-YAB|=g;Yzgbx)JkbDXvo)goizbMG8#&B&ss^5F9q zZXC>2>lrcFJG?Q;0=}r8hu`VBkB^Mss?rlak{dUqW?<6J2w{%S+ zygyU+s#V$|yr7wgX(YVh{adZ#bhJlJxuv=lCEcjx4R6VD4FPPBbhNdd6`Re zKPK@-p(Ei%X&)IQyg;NoVcCmw7G62GqUbt(9#-#idRFr4hs|#3Ovhd__JL?Tbe=ul zNxYxq`mt8eeIT#?Fx?Y`D`l9W)r+yV0F#ZiHy7(-LB^^(6)vjeL}~UhVH1t<$+l%E z&0FTi5~2P^vR51H_8MXqQJ;pNl_m@K@^MQ4Uyx+X*yrtMCo3&DRH4TN{7yi?27zFwKD zW64dJNWf;rcB8^&N7SDuo^wNH^*ATON~jZcK!nx4jyXg*@v?5eBwjN7 z{~dcy|0jH=4}3yASQA{46%^q?WX~|*PK0HI6Thq+O*p!h8dQY$Co0Y7s9`~PXR1EX z&?36Kse-D+TXYAjimLWobk~Fbi4-KlJ4cGda1+_Pq4pS=@OF{R7{bdKCX>DEtMJg0 zBfQ&6Da|Lsi!r(;U;|EwibtY*qn!JNIwd6ON6LJWS4E<1H1-uj(R?CHDVry%g+f%` zQ{hpP*y=ylUZRvr_^v9O2npMiaDvti+XUI9D+>4^`j-mlYyOms`$&>$wf43g)G@UE=MVylVpo+_mnBfPU^%$-QD$O*At3-6L_Rxgd;VK|YQ z?wy5E*=%9oLc~)H$HHEU4e2hI$m;FH5yc5D>_=*4+Gh(pd#tKzVgHIwia^c6{!0O! zz{|pZhh)YaTq^7wC*5)^>`ay;7Iu^p6~c}&T_`Q9JLJSoa*nLtOwKJ(hntmYg+a`Q zXvMz?!gay0RSwZyalpt;d6@Vg`dRRW4O!hvkeRVmJP(COy$Q30NVT>&UF=@@R zO(<3Uux)xphP4g0O=pUxFI2CeZMs1GK-*^9)S>4BJEB{LZA3gT(2)Q%t`WCWQdoG0 zN~xgO!n>{VK*zovS^c_X#*oyTYK)-RqPw@|qLZX1 zw+3}B*Rb&JC}ZwK!U?=1yglTcXt=HN$9ld<;6o;p2jYIV;-9EYV}PhgM)lU$y z-Cy7Tu=<@La zBywZOZ>HDfiv?B(2{RhATGQ+DyQPkY!W9~gC#Jt!lhtCe?Pzp7G`%kWQ_d-?MZ4FZ zQI`+YH{*X5wl}_i-;95kh54<7G3#M7oMm?|HHJKy z9W_~3ZrkI=keSo#@|{&A)Rca5dR?AaMNW+qUCu`o* zd}{3OwlyD#UcWEO#r|zBO3f-cTGxnzKV6LpA8L%QYUqi7k)HRe@nJKKcbyTPYD!qn zZP{KP(gc$^S}k1=lFA}K#W+ou2wfoT2ZYGFG+1&m#wVvO#os6RF>4b;77oOo+I#(= zq4laCGZ?iBSK3Tl+*3^ZL!Fd&b;{Iljt6jpg#X2b;^tfUF*{A1-Q^ZCgANjkG3En5 zW((l{QmUhyP^!BDXFBzjF?WJrRkU!9W2R^?Btl;?|0pzoV_jZh;xZYD=z zK3^ywHkAyBnLMGaiUj><)a$kirGRB|Vj}dT=V+`%a7_|WT?P|Q~WQ$on6kJ?DkuHx(B-DF4T98bB3ANDc z_axl|_VD_x@A>lc!1MR3@pQW5US7WWF8Bj4-`pD>?xgK;p3`=f={U=2yBJqIgRJF2>x61bxRj zu%VnQ;Z^5omkP@l2v~>&H2Uk#*Pz`lCvm#Cuo@H93B=0#))V;%*iKI zn;c?mV9vTr*j93%kX-U6@rI;e&lu#BlX}6Xls$vLyRoD$X53VHLGoU&JULCd;Fr!= zXpUbx(?~f%bfM|*C=ZCPE}dy9B_zo^cg=E_^b2Jw;RWS>E}8HmbL0pw#Dd9$7mklo zBal*xF~X}$XF9!df=g! z2G}zUxZ!}|t-WOe6TVWJO?b~!RyQ@7@Pdj1rGW5)mcw-l2rnm~n?Q{40ycja9fC?&jaODV<(FL>`xB%HuGvUdkLH@>>Ar+0O1uh(&; z_ETnWwEMkX@6**TX1>WDG!bOs9ru{wEn^2ILKX?<0%Gb@C zP@g^j9o_${55hU~%ww7W5D#Xd^p1R-rS2Dg7}R5>ZZ-!~R(xk3p7VSMj}s>AuDn9E0NRvk;2&dJ`G z1bR>O#-zb;)yYgSBgPXI#&1}4J`;rI{Yq#0jdV6T4r%+feihYvZ&9mJ*5CZ9qn%@R zFWwEgvYlh5@9xBozt_$&<7ab?jx*aiX8MLi?Dyh!j+xr(lE2#ySeZQH%yv$bjp?|i zo&C1CLk?)8JrgnPa><)%Pt6>BuROYWw|D+U{;8hJ)5P<-yn}bN)zgiu>W2!nUep7Q zD|&akr&fPS)rJrHAp#uITJrq(@M!P0tL>XsTI-%Nx7*V$mD0rTw_GWW<@nk*1MNp- zpPxUkwFEhR(fQougN{AV#t-QJSgS4{SUpcX@082OTKlP6#jn)%Rrjhc?_WJnJg>`A zVB@8vwFEhRyYsop{>!)YYUi)uO#bO^?=OaHHcd zy_X;>H(tokO`e7U>12EBvfD~G>3Lay^RfS4Po6gG@<-M4^mje4%Y8i(2Pm{lkXe0x zZt`9p>3#I-av5rG(!b05`(C2FF7M}i*+vE&x);k$9TU+t3@^w5<58CrinXP5~_0m(9*;>Y5U+RO!ZzRuCk}%;t zt)MPzH9Su|ugm)?**Lnr6^VbB8Q;sFXL)$lq7AfYkxPv6MheXEJ_>DJmI5=px1QJK zcXjNT`+`Eg1Udbw^SQ~_2}2lvxguMW%fZ)HAEe9lL0twOnb2tLcGnVQVfjw^xye2^ zOjT&>@-?oX=XH6ZEucIt5a#MlB`>H}mI!lQ?$H^c))M5T$mQoIf2%XpttH5b4*9pr zYLLCzOA1&q%Ios*>UrXMU4G7U1t;tB^PVd#sxE)ulkrE2NS4d|2AuzQ`3?O}4?3l< z(2}|x_Q&tR?V0{{9bFN1MEL5CuT_(e=PS3QZ$|AqKz%cs4jS-C6W+J>?x&>QOTRw& zxe=4XiC0}7H=Ncgn^di7cT7mf{c%u}_Q}It-idwZ+|g87`y*H&qGKJI8LH=2dc7DEU*3p~lbF7@u2=)Z9}loheDDjA5&|S+?5b#2-fJ&zW3R z>RvAIXr1BRq9YC({PRJA%qv%n?@GRH&}r!=$&*&Ny~%{VKD;>gS@!aR@wZ6PQ+ICE zWc;x0myN%Xe7nXEmCP7c%oygf;=MKZ)}t@B-w^z9{84GA{Z`cPf3)Hcmwq)qG3LyI z6}RoWU)pY~K?SvcrQ_B~>A6t_D<1UzpezUE?KOrKudFeTRdWmG?u=3~9CW&|;tw)* zSI>J*&z|4vo@P{XKrWBk;wn?LVDu{Ki*C>0L~;9NQao*hDf&mZXW~aozlzsIZyEU0 zycG)~F>d~uaZZcgW`KWr_k_xx;_?D>LxJU7u^YoPHo#c@Z$MKzR^f9b^XnasLrFl*uT+RT!rVRR4YmUy#EMO z+In?R)Jje1L&|nV!=j>yv|LVyN@fgEVT__-QDN?YN+%ARt&*@DDPvlZg=L|fVD*Ik zhjLC4!0U9Tygu^jLrv*y9j9aGpJ_^8n71NHYoY!?Nk4T?Rb=iR6D`yU;jsN-T`AG+U)QD@T(==j9pA6{$*CaiFK>!){2Fatf8 zy*%!?{jvq;{)sy`YV9DIbN{$xfr~|mF?(t**?zp{>Ihnd(CN0qj-2mz&b{mVSLE#>ntBr?py-=$H}q!~Zylqh?|6G3O3D z9q9b)gi|di(D_`it6NG)OUCk#dZQ$Qd*)`ir5OFP zf_4zFxZi8U=cNoKFA{G_$-!RbE|>BHDmh&tIcf|BNKhtY;4{s|Swc->jq)m&BS)1Z znpbGmBsh^cL;ryRz&dhCh7-0Qc$Fh`>$*$B0gd4L}9U)^VWs6uDN*V7m zcJz@4=p+Z0ac-e!W$~_(gaibS|LEj`WO_hJMc5BllD*^Pf<$yVJt&zmM1?WTB`PHG zqDp5Zx!ssK@M+~l#EGqp#+7sJn9QxXTi8y==TYZz$Xhy(<0u{LJZ^U#!=E~jdq!9g zboPN>jLvZyhv7j^<0v}!IgMkR?yckiE(|K2#}V4O&f~Vxpt}Ij-6AoG%FC4; zh!$f=%m*(my98AtCKpUTp;DUgx@%>uU^PAD1Yu{D-;r}9Ce8`RBPWQx6pTldF0ZY8 zbj+C%o!zySstr+&riI$dTU7r^_NTR#-+>pDQc6Mz$0JIwm$Ao0B!~(LsKi80LnJeX zs4#}fL}d@ng;Wrg-%6<)3kzfnPC-<*CZFUSQNcNPI`x&)rLfzS9-!4fCmMy)qjiL! zS14r#&@Mv#v5t?PtmWFquY1-&SZ zgb~6@gfQk#M4Z4mB6OOZ6Wm&aC`>9ymN$o$dZXkqMeNP56h;&sE_hY=SWP6nTAeBS zzF=Ak5}`g-N(J4>d~ODa#AO=eb8#l?Oe3UI&RQf^kS#?ZmW1NhRh6?yJfLHv2w151 zud19yVn4|`Iu;4We4@!j;$F>FURbFAdD93o-VD601k@HFil(uvf`Ep`s6%p}1zNn7fR9r+}?3YcC2-n4e>{k=NQ86M{^uSIC%fkM5;kV1-HOY+8PpT4Qd~U(q znQ|1kJy}pL=;qfm#a4oHqC(iIC%)k383W2kS~)Cls{rM&yd`;MkIEUs`y3S}yV8hK zHx@AVE#Ft}ir2_6VILsKE__>o^=2g}V4X4ZN`;+4d0)9KKIQxRGvWH1o|tMD#jQLs zbw`NHd16v@JQSb;HNw1pis+trT{Snjgn`g}h^ z;QCF~@hiaf_Z$Pb_hXD?1lGqm22fk}(-spIVEz8;*q1@)zV(1(z*~|T1l%%cv}1s{ zT~-0b>e!xPxRkL)f>JUQCzuR! z9VX=`S8_nUq_fJ|Hc{nJeu$Kj?RQA|SEY-vvyi*J%6%Z+_i3d><#nxm->R^MixeF} zdaHz7sLHkO)gZ#cpc!7}nCwcaa@knG7BGil_Cy2^VHP>|} zbiQ60Gib&MB8?L`_t#0{{~{O3y$<)u>z>ZzI6e#QK9Jk zvLc^}{l3GADDpDSm;tS?I%5X3gtEq%>4tZ4#$1Y%r|6WKBk^b_WloQEQs#7*Q)XR6 zlTYSSk+yZle4muMF&MKsK~!);_XT6jYY0)FtZ06idgY2yaygT*@TRYGeg^4hogMST zzM;K0Y$u^(6GT{)B!voW>ot zax#a?<;EpEa!(VUzPQ`X&BwPoB@Fqk{&LD$YZV)RbzJzQ=RNV9jSnua7_x78c;GVW z+RZO2u50!QD}1nddSc(3iYJd*CG5D_&@^W7-Nj~C&o1_V=%Cc>JF9pz3@d)S;?e1g zg%6q2J<%Ryaz_)6jy-Wv^ENsCwN{_F)xn1p zzg>1*IQP%fV(Y6@iyvt#mtSr{{P2s%isy#(3B{)Bs;~D>(c_p^%CO<_z0-Fu`AQh6 zP~Y(Kj%lfjR|=QN>weD+Pdg9#T400U_|v}mdE~i|kBoOk2|aEgVZaS13~#ypA;o%% z^l>jv%Z?@-?Kh)br#Mbt_nWa!?A!C=;tnNd`PU|&4k39GBk@2o4?NCaQ8{jp$ zVP3OC35Vn$jwT$H=LMlw$Xi+wD+^j-)JiSXT6t6i0-;t!q9PL%>YzvwF^jY!m=wuS z5^9A!Da3f)P{{2AJ&!#136Tk|h>&LkgghH2f61`hE&q$F*D)=?6&>4_j<4ZLsq-9lt^>fLa~^fx1HdAHiNb*Zum~5xhXAk$ zF941Jun1tH0LAh~0F$3bp8NR7c-I5IWc}a^c1sKcFws2%V4{1P@KlIcfZ;;O*2j}( z7qf+i+dg|uOAs2sa6xKI&>DbnL2VS|1|VDz3={_-T+j?e2OwNf9tGXz^a*pzo$?2f z4}3yof-3^cqZxkVBEXK)cl6%=*=M+B{8X~Kp1qz$w#wL&T z4eykpkA0wO6{vCyYCSeCysuCrtD*%e9uxG|CL;Osi0tE$J6uoVxfuw3kh5WX?hct; zx~KN07V2g#)XiF`o3&6EwNO(fbEv73In+gGsCUZGiF6)c66&nT%4RLpMJ?3XAwu1( zg}PbG>SoSric~GBi&|0_wWL;+)ZhQ(SxuSDSzUNmcThI{Ia#dN)P!vh%Z5FQ-DJE)re90(6J2&dXo z3#@9Qzf_U1vgwAcY}PQms9|{1ixAbas8!3NRxOKKwWLbsY8h(PGSsSN8EWM+e?Ym+ z6DXHik(JF_wWK^#rmbqaLsZM6RxOJfF)3=qq^S5oY0RXkF%!xp%)~-fBPO9nOo9`W z1|j$75R*_NCRvYF%^EQYHDXe1RaR6fkpu22%%rGsz``jP9I&WyKp;AEKp?ts4j7!$ zS+dqRV5o7x;Ll@8cKZaw>>3Bm2H=3y2FNEIFt|f-!0ad-u&B}Pf@2C)gCm`Edu1Rx zvuz-{%yc_AeKugI(e2=Ly8|Hc=LXq6-XOb1x3dB0Hnjns58b9_;84P$PPSd{XD|y^ zgM>gOSPeuX`z0huZoDI?22y$M7ZQ_!Y9N^BemOCjIeLWL&~q*)d3?;{Pb{mOiVc#1 zlnuymqFA6o4kdS}Ax9IAQe^yQL#SJ|P`9d^jfFb;#m1_kUu=kU^ox!9|EhX^vmw+J z5pFhwn&&yxOvs^*QpC;1%B>9KP-8fU8i#VIag>VxUiw!uD{9*%sB)0aAvH}o3$N<6wqbEakl7743xZw=dI0RIeU^Sj{v#}$msF)GL^M7A1|C`2^V5|JEta1s4 z-LC8t=FU(n%OlxNG2*)HmrIC=WjobNNtpa{2{B22xrCTlwo?UF4K3TLj$GemgS%yZ zo{33m+0F!4l$i+zGBL4i$FMuZcX1Xm#?N4Rjl)JE)reJkxE)XSR(VW80-0 z;AR8e#;|p%R3;-B?sPkX;gn4kpO|kpby)=}`YoqXmucbojfYFfVp)YQso<3XZ~cwQ z^zHIZs4lByrhF@^%k=#GhQw`Yu`IO~3G~-xA4AR1_|hiW8&~=tvO9sYMqPHN%}8DL zRoeKv>`}4ti{(;Yco^-2x@-y3dGlpEU@_c$bAE91&H2HFHRlJVI_C!^Jm&{DU$aB0 z=Xptur`G#~eDlo-5^MRv%{S)v}#9@CPO}o-1YNOqz90XVo7tr&!ROM z@=>IQ=c7oI!Mvu{`}5pn$VV~j;V5PU9K~#yqezb-A4Pf$!i@41YckYOuSM6A8c(gS zp&lKtjC!=xGU`#PGwP)p>d{fd>D*DX5)TLP@l{8ytQ3KI*+6coWz>uAP{N@a>a}V$ zo?czFxl&5l}2zII25wL1dee&jnsD(PtXC4qtfx6j{x z{S*vfrXi_FI(6ev2}lev6V^HaZqroIcw*U;p8(G#LH&?v$<8Tq2bdFyQY6EShx7#hZ}`|wzf}iU)Za7_1T5R z4}O1W8n#m?mb&zcV%~8R(v^Q1R(xleeh2W%lq|Q9eN3EJYLHKkOm?LSrEV-?%$-O$ z;m#$T+h*xUnytaZ;+XfQqzk4$+9YBZKYT{o_QVm*&BT1hO!!*bV6R)6Ust{Fa`?Vk z4#>4n8b9}iCt{OEz=4Xya5Q%9w9mwBi-YDfLUGe;bo=i#uCQdiG&mGT*A4LjgIEDFQ%k>H`^!f+xA-X(&fjclkaN9 zGjIAq!RjykbaFc7nahgX)$8s0?Fq@p2gdvJ$n#Bmz1H0OtK~TTonNhZ@RaWseSbVV z&iUb}bWz)8#f=KxwjV8@X8z`+VzNTFS>N5#hO6vTd>|-&;Dc?loRED?V2saA%ypdw zI(NEztKuZ()7hiTxYmZ}7ysO8WcYEf$K$T$k#`rlNPJpZ!)Eda?f1@}2a@>0j6<%PnLd6B*-kBXeD6Lg%iP zt%NOiB9(aI-X*-d|LEI`YXve}?9(-UW1Gi{4aTjK`nCL9c1-f-Yg(KP)W9F3|7)?%aQyu+8_bDD;}v*|JZVwcXsN zUbEan_A!w$J~`?&xl&$}8{;)Qk#NGDOE~xF=PMPP{6l|xX1P@*m;caTB&s(H_U#gy zY7*VCss355qq_w%`P^5Aru(iswP@G9pilGa_EopXOb2xBk%ezTu^v z{}MkxY`Ji)lJvQcHc9`u<+b8nHLBt{D`z<&`saM2nS2e@=81$+ABoEffV-O{j?i+rV}d ziUQlio+a&F)Rx%RXp8dmz;ho@)Uuv{9!1r*4E^pzzzKI$|BjSA9d-X>&66%XBfPo6 z=B>Icv@3vQpy(O z7drPr=f9=n8-x=a=Q8U20w6)>ISO0?fFt0E0+%2l3Idxf13Y<5V2sZN3%~@F7E+oG zgB@T9&J{T4PJlHnRnOvYeap!~<+P=;T2SLvW?L$^ff}#!+fo@0)OeL;%5$K`t6WFb z_CSqS9gnK#ff}z`pXC;^kBN-&xskc9lTsf)Eh}Tx`s@U?-o2X)5oxKI1QjHTOH{!L zDnb+>id9h2DpY8qice6X3MxiX)v%x{syen*=>nBdl`pCS7F14E#Fnb0ZBwbTnLh}8 z;1ej7QI)aSTbE9i%9b0WQbuxL98J{Hs6xd}g1Y9vkKhZb!|!uO)^Q zpjo0!Em5ifwGzc@iADvel_*y0&Nupm-32(Ge)rNWCuAQJ7~^xHXD!oT3Vbl&P9&Ug zV+F?Cp@c)?b%9lh=jHq$d7HK5ZPt>vSxa7sX--~J54SI_j^fqh961K}(Hc3HF+~TT!D;MUA^LIdeT&aOQUq*-YtR&6(0cWHY4;os_Oz zsc=r$0qyn=;BiAxuSNLEBt!JRSp)MuX3Swl?%12T$rjv-KkuCZu6I- z#r9_Pxh>?{T`o^HN?p6lLAkj%a+eGFE=LmAu5yK6HjJp&sC`kpUxc#8^KI3BJAwJ; z3yH1TFCj4HdRL=?3~L{V!*z;<&Z zBGeiYq1K29wMImiX+(rtBSLda>tY!Db)_^Spw@IfXheisBciA^B8u8A81iZ)mSgMB zxk1};^c!@Rxk2agX}?kvYS(6{a=tdhSo5{nfWxoNg{ZYLBLK#))7+Z#cw@Y^TXWWL z4B2}}G`0$QN~L$Uidtt2wwpU!!JAXY0laHv+@RLk3NF*x3O>fzug^91TWf5=tm&fB z*wUZ>uG(vKwhH%-&Q?+D=Y(26#|ns8Ed89qdpq=kV7T;r=| zwF6UDYp1l{j#WVK?PQtWjt^Re-cFuOZzs4?tBAEG6x-5(^+GTucEEZeo;-*3LP&WI z>4m7mKRaN(uwOoa^}=kCzw-6D%^709$ljPlZfH!*V>DNPLs~T#)@w>NM#fS$CMQyM zLe3?egXD;;>id7O)>?xw%QOgs4+@O&hGK%ML8-)y3%DIrOYAwp=e!w7Khda}m~?`| zd1JBz3I}C_Ve?$$%iO)piUNwrjuz`HE+w3y{%gEw!AHCS2b_TlDyH|vLt5o zwrp7AufyV5-L_T(+jgWrMA8Ir&z$G{&}%ONQp= zEkkGCGHltFmF|)48FzW_0T*Js5!MU)*MXXn7CV+GpMaruIkg0mBKB_kaT(Gw%UsnI3Q+V=XtIn|VW& zPI|!Bs;lvaSjvm!!~yTD*GH>_ehy5PJ`Rzf*w9X)p93qVg+f1v!b8i2ehy5SRt)VN zDj_YJT>WU>(9WSMx=e*Et&gKYxhyi7W^z_)tk@0HOtwCbHBv`QYbIkk_!u}Z@7urSd0n>;u zNcKiV@*XffgXBG6dI`yUz(8^G9x%;^1SHdZaM>CWCEwY34>(WGjR=(HMg+!kBf=mV zR_xB%cZWKfU_-ts+cAa}3qz8(UpdOjTeRGWqmFKwV6XxgTRqIyKQLzNlOs&n4H!dq zMG@vKtT4dAn5cE~{xP@X1mHl&UCuXU#uy#n^``QN5klc@wCFux+Gxppz_ihl_kdx+ z$$P-C;N(5v;st%D3!xCP$Z`wW$K);=b8{CBo#`K?sJ0u+Z8V(7Z8V%qIHzKg_)-!E z%NLg3mZhJQC@`>DRkuVDQnjO$2E!^8PV>;>EJqbb?ibh?T5A|J(US|4ho_4=ULwQvqp8qsU}8W|grnyK@$qy6lUw z=XH5lS*_l(-y>nNhs!3^Wl`(ISN2eC@xuhCgDs0rN9Z>6S{yRM@1W-5mZk#=?qhP- z6g?6CN86MMM!{WaZks0WbkjCX-sz@On!MAU<-}dV$JiZ0be*|$x|_Pr(p;K1cS1tLN zwQ8%RKTmjx1pWNHVtV*FD)~99&vT8Y*H)kPuuZi2^VZPjPpz`r%T{gw==0}2%g@=f znZEZC%3j;DR;@;~YBhqd?sARbE4^GJVBEPz#IjZ-Vy#GInIgfLi4>9u$M?zkd%|2J zvN8Lf(49!!A!;?ERl|=KKiLosFYQ~Z8kpE`GaPXEVk!d*Urc3S;ftw^fP68PQI9XC zGD`BrR7OU=n969FWzbM#N*iQ6-6tpbyDJ3^`GPq!9KLwY3@55toxE8cYYYd9_exvQsb?GdPx7%+voVRBu z@^3dXZ|A#zgJvjojmJT=GhK@=L+N5C$+X`DWL^og&O|i5RCbcjSR1_oo_|r_ls{uwk3Wmik-J2eg9Lt7Uc=HcePtlHeg|{-HKwZW5TcIV8;1ZbGc&z zgQmHWe>ImoCj4qHzES$m=4vgIRBM@3gQ}KE@|KA~uq(~Kn#&y%`)P)EOtN$KtGU`u z*^Z-M@AdaTci!*e?)iQneS-ZQt9HLPeDM2ytljSoT>O5YW$yRM$Jp=2yf=`4D@MEYNL=4)wzuPf+ySw6daSO{h|3 z(3?tpf1AA7WWR3oCR7L2vDSpjKi(+qDy!TWO)%8D5G1&W#*&Oc(z-7@1CrFW~1 z)q2y|KJccoJ@=+@tTicPt;1;y$s3l&guF4CWg3(4z}$>XFd=V7+V}st8<~~TDmBAb z=vPtw_WG02^1AG8_3Silb#vO=>LzF)}izx?8zPpv*)a3N*Plx+ z8;zRM!Ap=)nxC6o`-xt22{KOS=O))y-~11`tX7{tAQH`5c$Xwsjl*g?Os;KTa|tqA znV*|n%a3MRf8(BaRm=8&m&tZc0nbgY>EtxEN;hV2T0w(h?4^z`rx?+)HWzx`eLl^?~6cAM4QU)S$VKb(~2pIkJ1?K(2-^ZBCq z`vdQ6e)H*t@s+hkroF!?n-}S)*oRK(md^U=wM|;L4_-4g%K_QPB*ysMqGYlwO(=C^ z1;*TogcI&u6X%9Ja>C$OKRPY!HD&$iazegp`mR!}CR#mp#{9Tw z@3V^`TJe_?4oJ6O&@9%|&vc&|w0_#|tTDwYS8b%w7FiC+J|;27=N8O$ooVWfa(*^e zVC;h44;1%EQMdJbW;r0g{rc6#C+dK2_UYHtpNc;eNB?eN@wF*Cr6-4uE+**9hCfXC zV|;Og*NeAB=QrqmK-%cOo#65S8NGt68gXXh}+}vAMj3$>K zotAjxgIWyo$$`nPG@{gv1&p~95hvWafOF~8xy`vU@ZI&^Z@HY151h79I9OkDf3#@F z)a#S&i&<@x!{L`57t6n&vtF2~3&zQ(H`6*puPMHzUo5=z;RA7%)4m>VQK*-BzDJt9 z$#08Glw2>3`68bA`sc+6b*_&u*GVo1WFM0l<8uqQK zLCT|)VHo8&f zPowrQDA9uUG%E1|$*82vazOSm?0cSDFxQomC)rqmF?WKz%FZ=$PI*_9WTP^%#T&_F zXiLW>=xA|#IBG#huF&y`I)WU48W&gG|K_m#{i=~d11j^SDH}j#tMwN z6QJl!p=J=YH-(}tA!Px23OQ%)RaS3+)I6xgpfPKX45#W(C_QuNoz0qoX3apeW?*p5 zK(l6Gu*(M7J_h}HZYaU{T8OeSLe#86WD#oCBGjx!D9c1BkFi2i+seZ8hOGpC$tQzy zZDmQKv6uQrWAR>QnY}D($(SdTj9Dqk2z2LUENaO}@yW?p)RM8;nT%z>X8+$!3P-Fq zx3$SzSLDegW3zUgz;wD$AYE`bNRXGX~6^|;H#~Ah#8440%u2ne-kwu6|)k?E%m2-ZdrIC}8A#iy&yZSHi}2unOC7lo0Fid*C{EymQi zh3PD*NMv`7Tv+l@kVvK)j|0auk1J|CuJAF2>opojZOAmv&c4$)JHAfiN;~_`09o>EL)~!$pk^=P@nD_+03G)(M>t7nYT=fH8LhKJVTcpSMEc zbQ=RRB}2Ch>V)4HFfh~a3s!vmzF?J(iidvHl9p;pq_$ARD0n5Sr@HxtAL49XE| z>9SFHgj%%-wPcL@LUtlYsFfo`N!GUJt&DIB-^wyVE+`7rdB}zDWrSRS>+k}O2_erzSS@w-cu?p;JOdW7{KI=0Vw5yk&Rj5a3{E6 z6z-fA8t7XM1CY626p&PyG!PGY&A?T{YN67=E^HSn4RXPPq0)xaV#k72!*6J_Uoe1P zWTV%DUdCkTWp0LEbQ+^}TLD|{L}`@Ty|XF>h4u@E-2pQ6$|+L>yh;I18|(^xSxvM; zrOO8w6`)*jozMe(yKGRd2v{T-v&{3QO~#w7G=b%A%&=S$ut-o)R9Gw$6dF}Fiv$J8 zWxIa)m|W#763o>W+E#+JT<45Wlog>Mp%U0Ej85P=xUPMR?4=V5Wav3q&zKftwEvcj z%yp#^lH$e;)&=9q?-y`|gl*Mmy=h**AO zsBmk^QJGnbN*+U0TD7Qf?aEQf#;h3CwiSpj z^S*Lf%=^k^G4Csb7{k7DSIqm$T`}(~cg38Tz<5qf?ut1vxgX}l%(4=*9Fqr;nR&9+ zgj!;9+s%o|^*bM-$Pw}rlx4$sAHxZPMdcF|YZw6QN^kT1uiw!#2E-Z$a7WJ=z!g1X z09-C(0QdWh0hQ9uCW93u`T;czh&2#PWevqzFTDO<>mnVegHAIXH#`T|9RYJ^B*Sp3 z!7wnMVVEM5VVKTHhT$w5toxWU_jarzQ50M$Fig>~f<$4e!7xpzTqD4DewLWH~o4As}!InwObdn9kD4MK)$d zq(&~Xb5?X}r0lAsRr5cTkH5yl1L&$j?&Ed@B@*q3^H6E9h+L3f) z;&Ij+&NR-BveUTakMwK6a8L_Gbjl2N!+LXz-6%7VT4T&v&Mo%L zn3KrM)&9s|G%AG~*Qe1ikh$!@Od6X}w}sul)Uw9SF7pUK@>B{(hdnerd0) zr24$8y)LD()%zj-is4@2%P$YN*UIn~zTz#+@KTK}JYrjz-K84k79Kht%u>jBPY8J> zgghsNymqx$3|H@m`0H?gWyM=aX2o62@RwieU&^x;cl8x_)%#Kl>RK(hv@o(_9d#k{g&jI(0ivtnL{`|AiBQyE^{SG=|vZZy_5!@O2oytWyx-p?vZ1PoWN>@fpZ z)qlKVWNkBCy&vMw2{oT%n9nEZzmCEBB5THqjUjxuJ7cNF4feWp<0X6j^2@JFH_v<7 z>(Y(kyp}VTZcOkGF7VeM`RlFzdau1M-FVbrpZ_03oeA6*)BFCUkcOcJ&~HvVtf{j%&bzc^S!YpvNbQ^9b0(X7sL}baS87@)z@ZRo4iDRlJ4>n*m1CWk<3o9A zCp(mp+eVAm8>&;o804v8)`Yd{1Vz#C!Qu#*gExD?v!tSSJdy6NQOg>a;yvFcwLt2by=#{Wf6DTc#aYDSa=bWmEM1Pp<#>^I zES@@+mE*;kV{t99Y@!yb13A_Oay&nCJl{JOPd_EawZ`+k<5brgi))Q#wZ`-LQ^t?u z*BG8Iv2?|vWUeM@dWQ!HjP+Z5s&wdrKb_gD&h&=ajGj~ z=~`l01w0`yNgWquj*GI0i?WEt6>(AKSo&HVCf;$XE8-&llwn}miVR$oMJ%p}Wfifk z9P7LS?#jRa?OSG7@0ibS?^rgCxNGLPYZkHip1l7!uT<;0)Nxm=BJS!Pr+R^&1-#?b z%CXMNae?_BM4~z_B7O@Q!tV8nLV*mX%|j z@2!vPEZ~Z1z)5ih4)XPRpE<7R9gC-_uHYRX<+?QD3Jh4r50pBtm^rTK9T#(5>R7z1 zzb=i~WR8t@{2yIYev@Jj6tV14p8aIy_+QWWMS1w|~8o(qbYn4SxY5^m6gflk!(HhnPA1-&y}&jmWK=K@(h7s%?lK-cNH zKvvHMvU)C%)pLQa({q8Wo(p94Tp+9G0{;CkYxH0ss|N#FJs8O9xj+Nyxj%_gh5mR0I?Uc0==JC;p9Gi0^biu{tZG>wygz2hS9_&;VT$G>|k z$LZ6IZjfW$pfyiUi$~GfZ>UE{D&9zjpX24QUG%FUV(8a=uUx9auRw|8s28eo~Y@iW!qdu4}nhToWmR%O=MB>+8LU zCznJsGU?2U{F94#TK_t~)}K#5!;5gbH{*t5aasLO6BqXZ7)t=+sWtF=8OJ96h5|37 zYpDwgvkPSPzpmMNS)K2lotGWxBP}i-kgrtBrjZTIPs@5h{@*^;1JTvG2N1{}Z?(4) z3F%A+VpZ1zm}xyfuqKqAS6%BmO<*AB<+ykD?AJSUd=C!uea)vGv^S3Cd7frYT#oPY z&wjcezxw>wK}A2H9H(54??Kb9)_FPZogMeg9QX8&t?B6<2i~fhdV0s9w`()Lhl%v` zj&)uE>pbhPa_Y&z^)jJ=W1Y}*fvg04&R(nNukGD#7 zI#wCR(wGXkYraiWDJHeKS5`AO=yBheOSC*-(e7I9(zUf;P2vs4#m5zFd@NyyN2H7VP2#M=iYL)XK5=9&eBO=YkfD zQHDJvt4%FiFSFWPExcbIWLhu_Ic}LbF32J-Am#dmE8tuakrv=!t+#0;(iK60AL#!t zpLlPt>pO$=;$nx^Fn@EKb$kXiWSk0YO4%-XLBhdNp5IboQD!%Js{y3{ZvcJO7S~IL z)HcklCNEvf)-ZqMAGcu}abIa~l@amu88&=T{EYAute@Yu=RK6sfo(t;S88Gpk6e`K3tpa!g3)6{)Nul~ts=?mBO^6oG%P(7w>~g+4uN`H9J9 zpZ_|cov#z>ShajcWR(e7Qk9)A_FS1suPg0!WhT8|4XqXd zM3JWH+?-kMT9u5$xzb!Nvx-h!8%?%lW;=3ig>2JR@=K;CDovPwf|7IkN6ab_STPf- zlr5p2xHJa;|9|NkO3)fs%GOZ4!1Hts#kGbSXe|>I@9KHFSIT8;s<&NQQdupjUT$eg z#kHggMoTKIB~8ltNK-*;suNmMS*@w8)>O8mw`qBmXTW(3P(JH~sx|SMPb$fjNI{!3uVrI)^k(bFLmsR9? zr=-Zm6}k8(Z_~)t9bJB+6KUPbDsovxF00686?qxI#sQDdT2t9{P0MBzF6#r4uC#~8=+q z#&M~vftB(Z(|u_J(|FqbjFNT1oHQcL6 zO%|!RB9&F7vILLVj`voPrurst6{)y(udE_Xt=g`5 z!_2nKtRg*>mj-$SKWmwY>^y9uFNvy8S=H|mzV&D=kK}1BQ(o+EP|FohcmEOpH9Ead zWvT)5{dH-X9`Rr2)AI$K-|GYATdxl^wO#c2FF~LGd-D`&=(#@s)hzV+zt=}9U6H1` zKL5q_`7f)_e_2Jk*GHOu3)T|u_Y=0*bP4zK9zgv?-;(R)C%QnJF1aL*m8$yfPHhUbUoZv+0M>~~R_x`RtzU%vcp|@H>aZTJ{HBr4E&_pdZo#=M_CHi#Q z?$zItnbe#`W zI{ja3suNmMS*@w8>Qq*1x-Q$j8{qm3kkzK!kZrOJIM(Kqt|i>S1hjP+Jrh2AOnW}X4 zY`7R+F0*P#;tgfB{)$wB)^xFt)bMU6o!AO=&3HvNLD@ZMEBr(QZ2Ew)!cSB@&5U?H z5sIr}t;jaHxEj`qEJKL|?eY~_isomL&d(y9pG7LJNatsfifc{hbHCPfeio^?B9&F7 zvWiqzfyye-`DvgDZ?n?xa0~s6`Nvnepny#&tIvdmex@nchtWbm(Uf=fJk7|$EMp7F zkaqb(pCMhBE~UoTQfgf7oe4hBL6k1vW3r5hYc0oQYdMAqsVv82 z8Pa_f{e5ZuclD75yye!C%BBrTT%R#reW2<2P4bzSC{i7$PIW?&rdAC}Tn$N9A2PC9 z)2=>Jy`ojWkX5;c*t8sbXA|%3C#v)5rW4O6AaOOa-ic31DyX&g_Nhv_%Cfg#%ap4R zXkcxg0v{=9_K}LGk%}wQf-F*TMOwfg1zL~=Dy~3z|DU#AS?yj~eaOgaO$)L}3;o3O zayonS!Ff%v5UYt7`iZ7opOS^yL<_T}6fb6Cg+61v@bH=9{ZFA!kp@UpB(BaSuFh34 z+r1UCNGtkC`EKVUl}(=o#r0cX1@1fKZQ6P(!pjketjbhYfy%bbPm28wTGNVIo!0d; zJ6c@V&$t+?atwJrpMEyfNRzVs6 zsFjYVZ`7rI#!^4ZSeZQk{h!bG#_6jUz5lPk!1{rp3wuCZyLnyXbdAL~@%ntNk6bog zV?AzZH|zC{e~y4_jisv<%PR79jrA1Fqc~je1okveG}He$&|2z*9uAA)>6-5K@9WbW z3W#726PZWKbzYg;3t#K+Qv>@4U73-te(;y)#h#~or^p9N=k$T{J3^90DnXIz7m7vR zD$+mw4-kh)TjC>4e|S)&`k_IQ7BLYuC|Q-QtTuCzkCcyDxHg-tUSiMl6Aa;+IM4s{ z{Y?MyCyEi~H`Yvbp)w<`jOd26Jm>pNr335PaK6t_dR`9}^9f|0HfJNf@1t@WX-U~1 zjkKh)3RG50dX)SlY|=*ImyAQ+YEA$1TyHO=>&29;-WAHW)Ymm^M}M8xw759mPwXgG z6Q*%7VNFn0548o^M8#E}1%9IV&qvT>bAeBZ22jfW!)h&cq1N(u&(*;Se1>#h8KS(* zUN$11e!Mwd%e}@N_M5nf?}!yxd%_}eotG8=n+%9!lT28Y3BJDh$wdzwMeNW`{`^tC z*NMw&fOOXv5w)*-lyXE=#AM3(38kG*-1h;_s~W_8KY*($#1m~A{ZHi~L7PYa>zVPM z`M(t>jg$#~9b>81GJ&E-%E%vZWoo~-hWm;dY47m)fL?}-CH~hh-KQnc^{O&9HM|}f zX1s)lhxCGie4Y50&7&LB@*0@G!GAj*kfl<;=_rK*$;|l7Dq{o5j2^oO_zcOWnHk8W zl#zi1qfCf5%&a=%0KNb3=!Nv_@lY<*=kicAJtPkG-}6(O&k{)2<{9dLR7$ye`%pII z+U$H+&-FT9x-!K-)})Q=dD;gwP8nU7`1kvK&ihDZRW5waGoU)4xcY*)`a*9UYftp{ zk?J}{Dn0Fhy*XB25LaK2)mqDHiF;=+vHJRnQU858p&9q}Gt_Ulnz^iIDx3C!zS%_k za&1Kh?#qPo{dLNic=|0`~k*0#yR9tJ?GmBKe zS{?K}UDKWns5R}$pjuOLt*LCw%qr5J*-NZm*%J2h6Sn?GYAs2$+DXt93rWxwxGofWajIIz6{&PZDyvAlW|8*r6SMprpKiV$euCoZ#C!OO>gRg>rXvEz$D%12Y9%z$wLeqph`3cIV52w<#>7;9-owA8` z$}-a_E6Yy*`}=>LvQ%}-*0NKUA`PUq)WG=+RG6)4p^sEf(uP!+t*LZv-a;R#eh*Zn zvgwi*`ashxYDxM1FWtS`c&bxbWuY*Cl#jGS{uRD~bnp`^F235YvEi>^q-)qAe~jOR z9k@?R*}+d#R+&k8!h||-T;O^7Yj_9mgZ|&arzpKZ8}DkLB5km=_38)53JlOP`}At* zBNb00ZJ9;dB8#+zk2Kw&<#4E=s(G6RDz4Vs0?U#nkTlY^en#nEGSS+$&DO3h4(E~j zw%njf5Z~juGGpN?N9jdmLOdNjxyTRFQGMg*$);?GFw0(6%rbO4!UGk zjX``-W;c1O>X4p(uFE#WSsvOz{xtD6Fb({`fw?4e(17a(a@{4~>W9ws$*575sYdA3 zzfPoOBSF#2Y9s0=(zQ%LysPI*d0^^f4$jYP9nNba=V!J`rq}Q`FjX?WMrO~-^mFpp zB|OJjbCy35m~%3FN;bghndRU6^bStX?D3gBF|%=Y-LaXCGyPa^1M_cQ`kPVU&x@zy z1^WC~iVpY-0&_UC2mA%%>G@rmzAv-8GJRh*&_=IYvn@NnG1IqYc6Fw|o!Qmd{cmdn zX#y`~Czg6^;iTy}r8%pPj2CD3=xbSV~l9wcV7Ki~~0 zrKOo}_BJ+MGkt=$;yTZ3wal(-q=8~nF&)UPWAK6b;^}q9pAXEiY)=?}UOe^F-|ID|4xrgNru&+N6*6L$X%*@f5o z6XIzE?K1tUY=Cw|uMAz4+2+~#*4g>yncmu4HKOzjN;6t@KFgrSrOyO4sCl0A{%?;z zNS|o*S0?l@*(iVhG(EYf?$yK92P$x#&R6wZPcrHGhMuQCr|Wuk&_=XmeF}=}qg?l^ zku}Oc_9uP)*7<{;uS@Q&MbB=Ozpr6GW?eu37%q@aFW?`e=Dhv}!~f2wAEWjC1a)0; z@u~iLS~3HQSM@yYsP%Ey(DQ)TusWZ9AZdJc*!t=7zYfwL5^H5Q)FKPIL0q3$wXz$; zJ7#qJAull+bP6;SA%JqP8lAn0WJ7!!HFY70so1}Nzx*RR&v#VJ3?fTgngOa0&d>5`So0w~F~3P9s10C5GN@w@01yG}IpLYn%> z-)Q);SU1Y*#+0l4^y9M1PrAxaKPHdQxXMpl<)`y1KV7fLBR}!h_zXc@V-X7{Yai7Pq`vLl9y)gNM5>Gj}VMrNF2%2(&;({Ae(Mhacx$O zug!|CzyGC!bhqk4m79LERhjJfH>O-wqMv3}CDK*b`~7_>Pwz{goOE8BRo8Fg4eNeC zapSMoHlnV>iUB>o0PEI|=y0Btt?E~rhi(BCMV?h$cyw1r%!O)9QU zDz3;EW)s)-TB?QF#2020UzkmNp`Uo78#VKEfC_%Vv_AEF-9ZMNo((WP8(?}i!1Qdb z#Z{)$edMy~TI**zt@U*NXsxF+-uR4bsdYWy|I-UprxG@KuFa-jxzb%eCc9BwYd%Id zaxAWli7WCkS>(E2k&p2cmrXbMm~7%>vLzEwG;iLLe)3p}YTI+g6EUu*%*Tm~3e&*?qO{&v++05%@ zYgQ&3po|}Y=ecYEaSc$$->;us(#XqXOIF6;ub*rbxqfO<(8xf+vx8POW=<@LHE*7=V9eoa{C zwYk$@N)F~x|9cy!jb(3R?NXgcXS}zuW_*+%BGLioF`)Xwd_TZn{s)VLIGFG6m(~3| z+4}qS!^Quvx3ozI3hiLxUpE_Y?oa|Bi5wJyxKJC+x-oKl4BR4+>hV0zdO~ zz;Z;Sx8a-lDK2TG)cxqW{vtwAqcn3xjTHF-ub1%GEAsTda{6lDNK2RUYGhcv3%{ai z+@ztuL6N5ywDcD!0^O(x^cGw1aMHKjTJxbyQfodmKYf!at~D25l$}rSOP>{oX3vU4 zNjq!Kb(*;T`=EUZGnbHl8V$`J7ByhG%%K`f-|WdnFR3*^Uq67sDsu6(zWZkP>!q{q z*Gp+_T5$y+t^mXpKwtg+-|?BC2=vxk5$FO%pts?AfY3{1^@U#kMp@mLay2HsGhUQ& zH71?k#5leD#PwfBr4#R!JuCL|6Gzwczdnb1`I)B!mh%H><|)^v>){8GRqABZ$a`e> z_sAme!L^E9uW%K)xFQ!<54?}!z6B0-VsovtDmSLC`t<<=uheJ6jT;Z3M+EH1v$ z-zTp7#P!xpHjTWKzfU}EOr5gGJNb!A_kkx2kai|HDCY-A%T2sm#x?T}*^O7HH^OzF zURb90UF{=Ix$YC!_XC}8=y^KvtC^_E`)WV&Ltwi ztHJ0E=Xe}6%htFVS~>nS!?D&_Tx+cF`O1{I)>!A$`!sR!bmDq3sU_C=M4hRrpSgr| zt(s*sZ{}w%T{DkNz2K%eGB?HfLA`*s1s0&(6c+@?p&n-%2KjJd!{B&RHF!POIj$OX zj(6l<&s7O_f;&+<$2)Ve=^V%AykJLyfXST~I8!6olIs%J2)e|(a$9nd$%p5|y5R75 z(KnClwzYBIho*qE!zC>wJ-P`cvKp*nMZa9Pkb7M>rJFgf#a zu3MZl-Qp&}$GIAe@^LQNh13m)rIAaUOM)grw^(>dP{vdXKFoEGs|DTT-MJ5Q##{!! z4AvcoB~16Ygt;Kt%@x86f@4h0U~BH?xMpy3{6%hSE@zs+o4{_yVHtCCT*h1)e8CmM zOM?@PH6JCp9x=rhHw`|@Rb!Zsa=TG_;P4pKV@&;^Y0x7U)(?&~wSqOdTjE;5E%Bb* znp{nWS(Ez$HOPU5jv!G`zY!H+(b%J%d+v7UH?eSN+b-CKXmkH)e zq}y?LlDR!T$>arJ!G(E2SreMN!5wjE?qHME4fsz{!Dc9T;II^GDRU8<@Qzq`5!&iH*c+)j>Tjz7!YZnx!n#kbpD@#ndu4vu;;qh9g0Tv_uu z$7M|~W>=Pp+{N)-@zp^dk#+z(pxhOA2+l!0$6OU$4HsS&oNJC_B6m{*cgNQ-ky7Sb z@LH6+<7nRY=ZxUgMN!5l-`^`|!a$2SERP>45zH=^{% z;i;&nnij!LaAAv}oH>EA8$fLgh&uQ*W?BW^;KEkH>EgXVxi)Cc z{;Ws_?q{C&$Gyow1#>TWFUtM#y+Iw+I;L098!qe>)HSD(fniK@SlovUlr#5%_n{1n z?+dD;RyDT-ec-}df@F+->%o+^G0AJ1YKx9xyN%#e_!1-{j6W zKcJt_@jyzlZ7`am932m#-piXo;2@OIOr$1iO>=uN1TMTiNNSl=sP{2c<(POV^?ow$ zE)NEyjA0^`P%D}4!BDucdr;Y&MZG^nQ9cykPraXMhJZs*9>QTQ)LQ0_;C{I9j-a+V zm3n`eqI@_W7Br^=3YLi6@-gClES^XzaRiP>c?^e_qF!o72NU7K(Lp0qg-lK)-ih%fGFjO? z20n%|5r_3r>zkrr5?ojmTxjZ;kLboVh-cC`>Y3@_bd(u5%ty^PV}qG+;n<+S)Sz$7q`GIuv*;Vu%?xk`%1j(K zL~UqB1he465y8cYIiJQci_JBQ4RsH#WF|NhWfl$#Pz%hs;8D16TyUAGN#mGJ70+gq z^`w=|0%xJj#^J@N7n_l6!r8HKB-`*JGB$^>=ETpDu?FUO@OhLu@$%y!a(Dc9D4w zWTbc=4x6JkH}iv+;KKPq3sXSG<`dTZcu_DmA&D=LxEGM- z+2h3Zc)XaDH8d}QFQGh+!xpIg2^NbBgO=tpGWG-|`b4~hj1`zg;3AYKaM&KTy?HiR z0v9IF28HGlQnr9d5;bjQp5}6W%P$j%~EhF%0m3LMs019Cxc}O!Y6|^=0Y08vsCf3@p2kO zee){#D$27sY>L{{%n6pmg>!;trZN5Dxwx@;E?z-@Xk?aw%TS)fVH?yo=BZ!>T=-Pb z)-<3$JWmln&*po8j|d791nLM(im?b(`)y+~Xy#_y4_R_1;1eUumD_k)3`1I?SkdvM{K!61_~C1o!W z*GusSq^ybA2yR4qDc%^|i+ZnF6?^~}t_u2?Hs;A-5pgYwKO|$V&3oW`D2s472z8Ko zEBFvDd@C4invt=^gta*Sh>SHgAAldAEXH3S{`;@Ek69gjgdkiU+-KU7vL(c|B;G{I z+L#Z)4^fuja4_m%^LDTaE_^!}VlF3RFH^)X$D7GmGxHJn5z5Orybtw0^LnruE_^-c zYpx(;uTaFV#9PQ%($;LkY(jbkheMEun0JCLaN#?_P(uv|OR3_e@yGOs%gttRGs;pN z_C@V$)&w8Jg=>O-rXBs^Rf_o4cq{$k3bO^=g7PX3hoTNO>w~Ru;rb-F-?X4XETf8- z#oK5Q&CSQ)$0*Bi*blXzSsQGF3)cqyO?&#oa;kWF{0aS`o!JU*MOlu+`%&*V?*^a1 zh3^K#OiTL13W|6|{3-pRh1mvfLs@~pq(5?hvo81)LAWj$U&d z%&nqWSH&BX;AZn$uqwV8axix<+i#V&T>M(l!~T+69rv)SuZLpr?eg}Ss@_PJTFcx*J`8xO(F8n$eXZn-LHH5n+-cKg`neT&S zZSXzPn)v%*1o8;8E7%Vg?g~blVWe^`@ve=3AeHxNvA6_yI257d&DH zkjZt#yDt8bO!hbXLH@++a5xfmq}d&CCKm1vMwuibm2VKu8}R{BIn4Y3{($lZ4j(~% z#C#JRfD69~9yJ3=<(sPF_$N|1!2AgQi1H>5N1=`~Uj#qFg?;EB-m? zZvM!<6?f-&Wl&^(MlUkSTk#*co9%D8x8s}b+wl?7dmwn53B4WvmV4A3L4TCv1Jw4L z!8=strF ze-y{zG}LM4zaYsW{1@cH|AOgeI4RpiT$^GSeohiYFbp@vn{YS*b%OaLaB$%t!DHrO zGPaqxHpeBxFUesJ%!Qld%{ZKnI^7%%O2CCjgBj*QGPZ@Vw#3JTJIJ96cO(q8CEkL= z$B-X0e+I|Eg?|PU%~(?QF;)C=d~Em?Nh|@D2tSTL#^DUq8KyWm7A`CfW||RXY%4{) zH7*(MB!|a<$AnwstvH;BI?)^nO2UOlf=OnaNxlxYQN`QhQsLLE$+6(E;kI}i4rijy zG$t$s7n*RE8A*Tmgev|dJ}%tFl9U8XhM&Zr;BXS^B=c8r99;NUFxfmpfB2Ll{xm*5 z+(*YK1(pgwjX%ZTEYw+vvElIuLL1IDqi7JHQN^FdrNiB{jN`!L!q4K*a5x!tviUnG z4Hy0$OfiqrAGTAX+v76fH*}2S!Q;d2@pc@}MxAYfunb%ngmcVj`orfG>*w(a;TLK^ zr7@+$&*RT=I0bo%`6oC5F8n8$YKqM7xgAvN4mMdg^Eb!cIQ~61p6$1TEw>~7JJ;R* zncEq6w>#s1=^16holIzF{AX^C`4@c-$7RAX^oLy(@h&#s9y-Pe;0fWbB;LhLrXo)@ z|FS!G#lnAsX=XC1+)cc@|u@PYD;8*<|ty;{75% zhfK~g=Yr>=d=Z};K8O08IV(H|E<7uI-b^8rd*Wn@*%MbHm6J_Huwu9;-h;yhs0+-g zVI{cm)bL3&hg9w*n!RylQaRh41D=Dj7l+TIK5r_7mEpn);R|Lenf#KlzKpAo$tk81 zSSkE6{t|yrqCRQLg;f#+Ojs^_%8WOE<-Q`NU&U3!uI4DmT{-?MH`i1Rzl!H_d^Fe1 z{*(JU?q|0(@Zt6TKH}JEe@YXecGHJ)_@C751%oQ(Ko)MxW9{Q(l;iU>R|QoyZF1fdcttu z#q-QbVNC?#N#T4mgT}F+>fRsMqH#<&HNYC-{&+tQpFw@boDtT73(p7_nu+v{@2T$Z zfPGwZK~85AhE;T!_5T zln?8`h2_I%%_JJfk5u=MY`!BjrrKcb@W=Q^96pZvxH&mI8!kMV?Kz9SaUh;$4zT$Q zoum#}2jxIqhtUqi&zdvYoCo4F6U>?H&u2*4PsH_8+?bR-ZSuf8l%L|f@Kw}T%|&5j zxbUKInVC<385H<{#o5xAnA>uj|Hz8&7O+J{9atMcuP#2l=!X|LxdEsL7EE)TS zxPFP7lCg#6GVn5#UvRh_b-B4XYzh}%9Ih}=kg;FmCld2(+>DexZkm8ikbcGCV${Xv z{ID5Zcz(FVJV(lYql$lvFDGNqnxJnEy3$-4wtx#S z4PP@)(jWeyivNgP(jOL>=3sM_KXCXm>dU5n*b*+RAHHHJDY!t3CPthQbP_0Me*7S!bO-ryP$`KsCg8GWNFl-GMUKlPlbIpIb zzbMwf;x=Iy6U2YTT{!+P_o8VN{uRH-aS(U4#ks%1zvGChvnA|0a**aqca zCh{Wci>5A{^WRulm+ko)nf#A%|BG)(Naad%BX}dyfANjs2ILKSOl7_B&d z&s-mNhF>2hox|(H_svpLY1~p{To+RLis=M)LNTrr!x{Icxhm`e7hV;%hTY-9 zw&Ck$8GR$?mYJNpnZEI==>~Q~$>Hy9)Z}f`A-owu*dct!ETVD5Zjp&y4;sfyraRaj zCC1_FsIQwV!X9wp72z7QoW9}Qa^u`B^o?caX7FYdhr@SJ-!a#Ox4?zhgzL>>`bG)2 z*pzU$(l-_*rU#}6QVATcL0)6pg}1_m?ZUNY1&!kvx56CbZliH5H@ASdpd5q4^{DI3 zwc%}W;kDtrW(j@cShvI+>w3~R7MokaTTzb1;ab$SrhV8GE^Hqr>&!|TM@hHRlyo=J zI98b3z}rwt;_zM6cg=Nd&XP`e9ozF|8b>MjvMJ?mqHioQJ;9zRrEs_ob)6|>bCz<# zLbm66GH@KzJkAXu1MirD;6Rk)+`w>Kg1pW22?rnu`-GpEwPfIU=6SpuLX zy>Br0gZHDHgu~BJKQsNp1TO3sZZ~gI?`0{G9!f+?M?WTYD0D`c8__=wDdOwBYJH-vB-rqDuU=hkG zINXA|#oQAPhYRlsKQ^mPEmSaNY66fO2O({-%Zptycx2gBj+}q|fH-dV9%M1sHqnyS>K1Ti6^bSYBg}uYA z=5^}*bc*tHH*z;lkU)jpiN7{S1oo3^rc}yd@(rBaqI( z;a23W=3aK^8BTa_xXrAg-pf;z<=K2!&;dq*BT>rZa3ktQa|fHVyc6ER_WYboo=Grg zy2)g6yO{z`K{?Y+3BN=A&P)m?!-bQ={fYUQRGvj#XSu1Qa*LS;PD44%O$+y;?lt4W zsc_-A@JsW7IVP?^Tov5(u#-8S<4znO6Ynt7!wPN($H&Jv*^+TZcayE?%8=d3VMQiX z(Upw%n= znWXXq+}$2dM>&Uy>_FXNMujus!cpN)vyDuiOL3p;W|7IQW(GI|6UFH+|MrEqIvYSKS*k)#d zvrsDI@N3ks&G>K*TsS`5XFj5DRH3-5xViL=56x^anT=Ehhr5t>nK9v9xNuCk+k8sn zs7iHLb@ON(pO`t|9F(d!+=sf)ObF+}g%iSW%qIFqHLAOsn@`{P$jk-jqEy4-Zq(i8 zp>RH2_)z$T`ONf9!s=9ab@w=p<5M#aoQF~!hu@%nV;&11hYKGIzcrg_95tx!8tw`D z#wIf#oR3lihhLz6VIB^jfD0cE_n7VUjhYm9O*UUYI?3bU<0v)p_buwTCYi|Ytm%Xk z*`Hfz9JQ$KT5P_%X(dm9PoUJo;U3gIW-ObtmJ^O;d+sJ3=f+xNLgLt zs_R}QWxLH1a0yCX93DVDV4eVt77Pe7;*j#=bSn zz-1`s!zEE=Rcle?OZG68E!N7_LMRE({Nv z{WOUB)M$P88V%w*vjSX!QXhwZp#EVNhp)kfi^D(7m-L4VDb@?!D*D4-vl3j1av=^6 zq8>EQhO6MhXTw8ghdC~8K(RJ(tHT>jaw6nL$Z_%aW_8%Web4cUaVJ|kzQ}d57rC-D zjn~49n9xP8bo{3&i~c9auTjH~gbk_UhVFIx!$UGOm4i`Qb{$h60 zA1fiy$>zM&37=$p?xQ~>ji};A zY`*cdjJ4p}u#szo!(UNfSQN>=9Auh zcM{Lk<%zaxucWdG@iuYWNaZi)WAI~?CO9;*&D^JC@>jDB+=kLD z!J)OyoVD+TpCSm~3j=$A#&J2-eYyLL#_^;11pEZ$avc7R`nP#A{0uI9GyKOKrf)Q- zx|_T0^o`%lr{Je3&2bpm<}R@Bhuh)8_ruWsMBivZaVIU@=QNH3<}>g!q!u{*$Fy+& zn76{u;lj7Vf6ebSj+Rt+OSgl@aoB7Jx1+SgVQ5>r(0&l^fD1neBl|ObqZP&7%I&0Y z{A4}{KSybWzkgBxHE)MI!&Zrtc{}{i{6XVrO?9_+yJ#H0n;qZ|l-4+mY-<X#XW+ z?TD+L`-zPGV}1sIMrr4M4v)3%+_83V_!C^XH!Nu*GS)sJuJ-OADGTk7;E!Q@*B*x_ zqMm5?hX>)p{ozUWKT=jmT!ros8T;4#1pb6lh{KY$(3P}bhKJz7FT+wcN5-xstSj9w zWGu1=!GkDQ;_oEXlkE3l@(aTE;V@VOiC|BdKENWT%L--q9_(OQIEv7$opjbP&!}N!v z=GSn2!cZMt2OJ(}JGkTQ*WqEf@ayn+d&Ha^UqiKC<9-jXH>Y!aJ;x`<&i)==Uxdflfc|hJReU3x?>#!k5%37gjW{fWTE>3M=Dg7fzh!&=Lx1Q*5qDzqy-COT z3;YYE6aJ2|o!l{Y51X@-OJw%2Kb<`-zKOVQawVdU<}8jonw#8d@hP@Mbdx&;{jB(U zdq&*ZU2i+Pilq0Ls59y9?9PZQ*^20uI6fvSO(we#Zx?rLw2$1D1WQI;To+d|IurFw zYolY~LK~fx*b=0&EAe)9rJ~&=w**)s>gv#u!oR~)Z5dM8jd;7cRQFqrJf2Z1{yF1nX6CRHs z{3k4DPau^yQ{6Ya($Tjh_c-vl=w^2_4lAHmuwhghE)1iJ_E=KcgX-?#%0zoe?(yL9 zQ4iMxhviVq*?+?_aN)ns-aD%s=d8@(vv zUTm_j=_IFsr$oJ6FC3OfEzf`aT@o%dY{S#Z*jveRr8uu627yUSIHsv%di zr$?3H!qcPb_8d}nH*wwVszy1ISPiU(a<{7%)kCdk&xxw)3h9#UhIl9N)<0>;6sy!pB4nHHooDtQq=aRDC#MRr?AZ6#+s$f-=-Z(rD^*noSR6|#Q z=SJt-@?`8@;=0$>Bx7gT>R|QgUUx4JYoOM!<)fN#A%AQoGS-I@?c-{Zv2$$=um(!f z2Z!e)pKmKgwR8zsDZ0R(Ny_e{TJLkUNm+SY6Re4H9}a7x*0g6vwRHt}W>m|bV$Y2G zQmlPlo#;Aq4#(G-zV6JpvaJ*Kb(PW2i96Z~aX;75_H&i!8MPv80;v#RU@LLr0*-4@ z!#3(q758^_X%J`H+F)&z{!FA6YAt(KR99DkXGOK`sq}{d6!8F8kN$89?*0zzL<8Ia zCQ=!-vOP7b2N#|iRk0Q54+AOUf$lu|Lvog_i>Zq=5QnvqYugIZdAbCw5Y@5e=nsRa z;z90w`opQV9#}6LMn}AJF5*#){ zZDboo&EdjEQDa+`j1>`9k!z8VvMRP2*bJ!%hZiDWXfKRfz=an^4QyRf_5g7`;95o% zNn&%bIm!b#Y>e92HjY}tg^i;;TaAnjr-+BUR%EQIZ2`7G8SYvz+HlvvHi%lm8$?N~ zs6lj*tw+ipq>3MOtw~v3+Y)Sv@*ocLQ1fhF)EX|#i}G!C`ojpSc!X<1f2d|#fvr$R z;P4{Ui|j>F8@TYIsG&WN{xFgv9_iZBAL`lGU~80-2@dm-^KE|A7D1RF71$ayh*4DW zD0c<@p}K7Ywm}(%!-l90ZNumaxUgY#u|1#uFq$GB?b^{F&a-X7wkV@i|xfxd${o8=n_kbMh{V<54l46!}+!y z*be0(9A1WcnY}D3gbOc=n%G+OhleTFhuLIj(lOeD?NJ`a-zBJ**h|=i4<}CMlIT)f z*`6JbrCP_b$*wh3IKI}5b!W%**?wc$a${YU_&R%TJkDKb$GK|sjKXLf6B_5vjhonN z=uJ2-B-;Gw5#oKsbt9AcwmaAzeg`J|Ly}g)JK1#fgx|>O5L)!!F zf%2&95w$>VVXuj9h6}HWTH4D<<#^&9?`|QL1-2X54P`tI+oQI(H$}I=g*Qco_7XBV zfp{mlTgl|b_Ga*AlnMB2nIN~c*G9J@2(OJ=*(Rj&F`{|Q-9{=ev$ue^pge}dLexUr zIl2ul>>OQbFC~=|DdLH)Cz-s&-U{A|G7*QZP+QsSqMmT!bx~_u-&T$%k}R`a%KG83BYs>WB^t{h*<@om)hrO_0s zdy2b*zHzDT3HC&p!bDo5wzeIkJK(~OQ5$<9ePb%cJ=NVw->8qb`bl&<(o|;B6uGIr zGP)BkyfSKL8`C(ZQQgyAFB(T9dk1(2$}}9dL2YBNk9xs{*GFw_1Nz2vs(ZS-i@tH8 zy%W3>WjYRpJ(G044hP#`_(b)C^d!fw0VO!L;_J-(gxbTMP z3VRWaVCjIZSho z8%74&*aS>a=C~vpj5^p3jE2F51EV4KaxyTNY0h;;WT2T%9>6?+G}k>4-G_Xiy*Da? z3-68k+AGMwJa>hi=Z2Gkwssge3}qe;hoBCzgQDSZ;h<=!ZB7Q}GtK$#K{9Z;Edq;B z=Hsw0YG2zYdJrz`6ZK1MJ2LP%Rr$CZK?bg{!@=PwkK=GC>QFm48UYs$j_$WD$iNd6 zdS5_ME^wo$_jYy!I09t>{_eNQ0(ZY1 z5{*I-4vB`@mel)`6y=j{H1*!Xjs!=dJc+~psQqob<=k z1&%^_3Wvi`huNXg7`Sj~l-O33`_mNV)9#_@+JuHOnyMd-^fV3!AP=zpqKDwZe$haC zCH4LcCHIVbn0ha?W56*e&)_gYP3-;A!*JpKQITy;y)UHr7P_(2dn@}8_z=oM91cVs zX!}QF;liYUG{`o!)#GO=zGvOIsDr7+aR>9Ps~-2UAM{%BHMUFioV&(8=jzY{ z9_IK;j=SKlPW+rJ;`m{3jUq?E?Sa2-L^GswA>L5FS&H20&4q$sWvsWh3 z3smI`Y`!b$0OP=MC@(OPKB#?cZ#L%(PS~66nUKmCiT6b}i&PG?v%%RYFS^;$BdCwq z8PP1ba7Of~9Y`i$BHowW95Ok;&IRY9yyWIaqfkfLWMVW2K{zoQZHq|dBBEL3=8?+8 z&H`tlEW+WVsE^v2(LA_tW;EUoB9)7YYq6Uj^(VP=z&R+3aX1=vw4D^qhYKe~V{9K= zGhRYiOWfnp)uvv&Bym@pC9Y=tfPFk#;vV2cy|{y|9lz{4*q7b;agm)Dz08DOcD3X2 z_I&j59M27-F9UpF~=Y z!-r8Hwo{|0;lioWSlf@rv4ZMe;hv#!^tDfcPob>9;e)6T+VRmdaN+o9guS1>v6A9m z=@!yAhT5mWr%_hoZ!GFqJ1trmB`clGv}l~|Pvdxv>VC~VOXKKgp8=mic@2jnP)FDa z(X(*jglME4M&DRPb+2Oc4WX4R1Q(*L!r?g7adtYJbCnZLXL}ByZ>*-cSF`#0(n+2L zpG}Zf<8UPMNc$MObF~vb#{PVel)X+|ue%kbY`9$su0(m=t&AQ+eat=|t$+)kk0#o& zWNZy_t#PlBv4`y{a23iLwWvay#^P)63w(D$XK$LxYoMWq>LnjE26b-Ee)h*PY^;3^d<|tC4rijyv`eGc;licSEIX2ny+K%SxHV*K zgk24;MtK8&lTatw7n5iW!i(UG(PaAwDSMMDe$%ZbW#jDY;Oi)F;&2w~Ec znr%msvA3w=x7<21Hqx#E*Py(G!^x+z;{qSU?LMxC)nrMoF6#hb8OFt=?@zz;*D&+DY#n?u1DF3zv-yc z?aOS=jfsGpf@dz5WBT!gyFeir=* z7k(Bku@mVVpHSSNxC2r0JZtp>?c)cePjL7+^5gcs=m1>!UbMi@q;Y&ob${x9qH)Zy zKY~A^e2T**s7vhU(NA#U=g}*65`E({s{1qdGks&CJpdj+`3#2(P#4$_qMzYl5`7Ro zWoOYiwo~2P-9Z}1O#2h~6UufuM195Xj1IzuJEK?aWcyLGP~#hRdn8AR#jINfBSIvJsYObJ3}4n z&=I8!z4zW`#;!@E8+&~gViFUR*n7i<#2_LnA|So@CJIu9-eD-iQ1d&VpTBqaV!pTT zS)RQ<{{eiYyQ0~WfC=5>_u#hzb%k7wBIacHxEigLX|g`r>!-It5{eC}&t58?T^~jh5 zuScupE7=?!@L$ORUtBjw)5Sxt2mApH7o#qg!l*cNU}3aG=1G2Z&?o1~L0>}iqq$?aw96i9C#yIBQs=cbjZ(;Lq0{fMqf#BSX>YJLl`bWT_TsF6z0H7(Ng(H z+Qf(bM{?Mw>f}T=&yy2}eVcf`r0QWmA3Zz1KPm0vBmRCl;ycFkq=X*v^LTC-uaS=E zYj`f9Gi7^p)X$WoK25hrGb9D3=uv-^7g>tBREnZB=D?z8nM{?H(J?<&j`?(58GVG^ z$|zNj`D47ueAM|;5T!E*CJUkkGD~(u$Nelh&gI(?&6G5lrpNtp440uUlgnJr<38|m zv|K)w)zJz6shr^Qt&XNjI!xCS{se{#P#4HKF6Rj!crN-`){x{$4s+6HkmPEq4y)@) zf6`Y^>aWPZN;S>O7mXqW;miwH~B*|q`JIP0FJ?GD1xD|P;RMbr7z>2y}ekRKEVY_`@ zqFf+#U>!a0&ttd_b)A&by3B#4biJ&gH!iT<7koW>W4UC)OugVQV7Lu+n^e+z%z>43 zyCfG<92eQ{i@rX^@w4z{QC+?0FJibJb-k3<`pki)b%U&=I11VBLf?SiSRwUbJuUQw z7;Z=1E|s+bb6{otMHbN;mssvgz9GG_Q0l|_ddXkHZ-ZP)`VCS>8zKaj(T%c-;wWOf zi+m%BW2H2J4YbG?VfYK`FH%JtF$Y%B9kQ6-xXgB6_F44CB54R4>Scc!!;PpLrL1N# z2bR@MvYOtw!g62n)#;7oDrv+=Bfa9UV7LQ$hg8+-%z;(8o=Yf>t8DjGE?*(Vlm)Z& zs=tciCe%$*PHQp;mg9PEAhBy4>zZ#zV(X#ryx7XiMf0w4(jybStQg_QQM0TBX zUH92Uwp}{F4k*`s2R(>-P;S<2=D?fvkZdHe8=UKg??_@Bq#bOBas$KNsJo?^c4Q80 zrh8-ui6v}D_>=(&~*(eFi*5o1NLvo9DLI}J?56dPZ6Wb(Wor!Ftbc7vI#5(eI zVtb^yc4iK2u6yNI5_9&eIO{@UJERlrgyJwfjCxqwXcy+dHhM%hlUOm^EXAyAlE^km zXV@937>0Y1_eu-x${g52_sMVcLu9{6WZme8U!@D|f)ZhP1oeot)o#pzZS|;Zp&!(? zh+230VY76FT~XA!@@;DSq@{LeZmG%c+EVjnt#pcGTPv~k(20reJWou-)+yd8Jv6qR z=-uN<(k1pbNxb!>GrFngg}il%k4jJUqda$Gg)6ApRx#^IKWvfiuse$JBKfHK(n@aDhoAiLJryo*my`)%s`eB{)g1t~u@Y{u&+$Bx8ohcUBg!{Rjf=IRP zl4>0&h;7mv_C`s?@Br!oY0c$KwZPU~&wQdx<6LPriX`{RXgC@r%|`1P)H5EM>k(g) zzUY^D&f&DJv=rwpWw}I|FQecnlv2FNS=6&KSaX>J2Wx@sBFWOWOG;ZFN$$k0v5wJX zX)Dc}978@PeKe0B3GAcC+CeF2w-e<7xfR~3<*Xcr=TOhdP`#Zw zaHyV_-4sW8+b!ko4sFVRs@vdgDCIFcfqFvv=^f00{q&?9qBknA+!gFjdgGwn4sS=P zfZuu4^D<16cOneaJ9U^|kUbPfMYg-5-9>TimOJ1bC>1e0iF#7{>s`!&{q>X_rZ+0F z-IeTadgGAX3GYOygy99$3o=~qW)2*#7iBNKQJLkgZ1>O`d*m){p5&`4TV)JSA)k@~ zdJl8p06i^7D2^&@cNM#r;y5gK!@E(cV0aPrqKwdcnFB{?q3okKsPZc(W|IelX9Ov zj1YLAUXzPNR)cfZut$mPf;~RviD9K0pcoeA?hU#jWxo|?hOw)|Z+&_|pJWbv zfZu=Q&QcJWY-^@HMM0dAC*Tt(nHb(cy&>cEDdxcOnsCRYS6r86t!q!~_(Xr6$0zDq zueeB_*1A@N-anooed2mHLF(B+I^#*L#|zc7KCyQL(Y>q3%N5WM^(|Q-fPy$HPr;{< z>hmHASKktDf+m>*C#bmN^g{!-xPd)GKODoZk3NmkfEOu3Es{UzGt7a1(93d;erU)N zH?(KzhXP5$BuYd4#5FW=6ZP33@Szjcxf2vbBeuAaJx4(tmuKKJD2*_@jCxuAsLwG6 z{!y>UdHNxXEzaWd4W%)jh0mg7Vdz|zIX8*RnPq{KxSl8JhsG>%V=iAm8sj;bd=9BG zhF6fU$e*~KjVoSky24oUgzU=q-OTInrmj}p4Zoy1E1I8 z&Jj~{&eGi8ASH3Hz*kV3V^|8cl>3Li!5sJxE$yz5QVWjK!rmmM%kmn04W$K!#a#<4 z?xyIQ%z;xhS;7?~rj~4OOM8o$oO=VlfzlGg(x|1~KlLr8u9cN=f6=#@1OK8aE}|1|VsUS>cj$y-?k)Hh%1!u{;ZHfUGVUdP2O;n! zE$gn)39Z@O*7h!)a8=%hZ=j zvZ!U;nrmxm?r-`b zGfe8=G~Ibhp&gg29T(~WYT^U<0ZKaz%cGWe|IwG31OKBHT*8gl_AF?7F4=fm;zRf$ zN_z~`QPbVuxrFU4@b6s1BIy@rv!L1Bv2lsPJdaCcTff*`@^#JT%4OT&xEwKc;4B?% z1~HX&U&F6aI@s4*8@0Ckug+i&{IAw=X{6MVvvjnXq?GEuf#0BXv~RR3YE}2C&SVb! zRI9o2q|}L{bh25bRL;$SGm=Q1Fsy@I$9<)Wfz-GO6A=wI18lF!(jt#-Ap7-pbmxX<-F=D^RjI{!mIDDFmD-RyfEn;6dX*hDuQ6jyZLYd5QiK0F>L zL*ni>PP*GjdSbSA=Y_i4khrcJiC&lI*{to0+JnXIVLv1(g_7<&_#ILYUZgs5b@zq- zz#RC6)^Nq?gr00}Pn$z07Cy;$5{_9LB8%KZR; zKs;o*kF~NZ zLnriMar@X$bV6zOBm5Di4~8{SYq~G>C+5H}wU$ev6Z*2aeQh3{P{PfHb5Z&xF|3SS z*-h1X2!T_ziYrSe^kZ}Tars`Nbbf+Aq4dMB7HTawoy*zJ0;h95Q|W~MEN*`;-wU+F zJU9=fKZaFMtGG|Noc%5E6Ru|^5*xs=k^^iJkyUhy;bNo#wpi=A0ank=*G0^M^R>RK zNn`^#*FalBVl~{Tc$$ui2iiaz6-SAI79}?65`H3ZlQwddNo)|u8f2s6kI8Tmxh+B& zgkOEs`fja`jt3t~j|6VfELWAthOx!NEGPbi5SJ3%Qj}pBHb8CQ)@x2Y%mUY|BMG{Ih1%3r zrys_!tYa)M{+!0hg}Lz<8-t-sj4_vJ=JJ>Wo4I0%if&k(!?NaZ$L>q4(Hy()-b9WK zi|cXya=3CiwnoRwh&b2AO0I3AqgH7yFO+K|;-+pJ&rNw=#r69_^Vs4%F5ee4Mjp(I n^NfGuVu?KC@090)=2>8K7bTvVB2(OyVpF0iIy;`!UlRWZ8t{aS diff --git a/src/defs.txt b/src/defs.txt index 0ec84fc..392ba72 100644 --- a/src/defs.txt +++ b/src/defs.txt @@ -11,10 +11,12 @@ actor 0 0 0 suit engine monopropellant actor 300000 0 500000 jupiter - scale 200000 + scale 400000 + sphere yes physics off - rotationy -1.40 - angularmomentum 0 0.0001 0 + rotationx -0.50 + rotationz -0.28 + angularmomentum 30 30 30 actor 3000 0 0 moonlet scale 500 diff --git a/src/world.rs b/src/world.rs index de2b716..a4c8dfe 100644 --- a/src/world.rs +++ b/src/world.rs @@ -22,7 +22,6 @@ const ASSET_ASTEROID2: &str = "models/asteroid2.glb#Scene0"; fn asset_name_to_path(name: &str) -> &'static str { match name { "suit" => "models/suit.glb#Scene0", - "jupiter" => "models/jupiter.glb#Scene0", "asteroid1" => ASSET_ASTEROID1, "asteroid2" => ASSET_ASTEROID2, "moonlet" => "models/moonlet.glb#Scene0", @@ -38,15 +37,19 @@ pub struct WorldPlugin; impl Plugin for WorldPlugin { fn build(&self, app: &mut App) { app.add_systems(Startup, (setup, load_defs)); + app.add_systems(Update, spawn_entities); //app.add_systems(Update, asset_loaded.after(load_cubemap_asset)); //app.add_systems(Update, swap_world_on_ar_toggle); app.add_plugins(PhysicsPlugins::default()); //app.add_plugins(PhysicsDebugPlugin::default()); app.insert_resource(ClearColor(Color::rgb(0.0, 0.0, 0.0))); app.insert_resource(Gravity(Vec3::splat(0.0))); + app.add_event::(); } } +#[derive(Event)] pub struct SpawnEvent(ParserState); + #[derive(Component)] pub struct Star; @@ -183,12 +186,14 @@ pub fn setup( }); } +#[derive(PartialEq, Clone)] enum DefClass { Actor, Chat, None, } +#[derive(Clone)] struct ParserState { class: DefClass, @@ -204,6 +209,7 @@ struct ParserState { rotation: Quat, angular_momentum: Vec3, pronoun: String, + is_sphere: bool, is_player: bool, is_lifeform: bool, is_alive: bool, @@ -250,6 +256,7 @@ impl Default for ParserState { rotation: Quat::IDENTITY, angular_momentum: Vec3::new(0.03, 0.3, 0.09), pronoun: "they/them".to_string(), + is_sphere: false, is_player: false, is_lifeform: false, is_alive: false, @@ -291,14 +298,6 @@ impl ParserState { self.text = default.text; self.is_choice = default.is_choice; } - fn reset_chat(&mut self) { - let default = ParserState::default(); - self.reset_message(); - self.stores_item = default.stores_item; - } - fn reset(&mut self) { - *self = Self::default(); - } fn as_chatbranch(&self) -> actor::ChatBranch { return actor::ChatBranch { id: self.chat.clone(), @@ -315,91 +314,10 @@ impl ParserState { script_parameter2: self.script_parameter2.clone(), } } - fn spawn_chat(&mut self, commands: &mut Commands) { - if self.stores_item { - debug!("{:#?}", self.as_chatbranch()); - commands.spawn(self.as_chatbranch()); - } - self.reset_message(); - } - fn spawn_actor(&mut self, commands: &mut Commands, asset_server: &Res) { - let mut actor = commands.spawn_empty(); - actor.insert(actor::Actor { - id: self.id.clone(), - camdistance: self.camdistance, - ..default() - }); - actor.insert(SceneBundle { - transform: Transform { - translation: self.pos, - scale: Vec3::splat(self.model_scale), - rotation: self.rotation, - }, - scene: asset_server.load(asset_name_to_path(self.model.as_str())), - ..default() - }); - - // Physics Parameters - if self.has_physics { - let fix_scale = 1.0 / self.model_scale.powf(3.0); - actor.insert(RigidBody::Dynamic); - actor.insert(AngularVelocity(self.angular_momentum)); - actor.insert(self.collider.clone()); - actor.insert(ColliderDensity(self.mass * fix_scale)); - } - // TODO: angular velocity for objects without collisions, static objects - - // Optional Components - if self.is_player { - actor.insert(actor::Player); - actor.insert(actor::PlayerCamera); - } - if self.is_lifeform { - actor.insert(actor::LifeForm::default()); - actor.insert(actor::Suit { - oxygen: self.oxygen, - oxygen_max: nature::OXY_D, - integrity: self.suit_integrity, - ..default() - }); - } - if !self.chat.is_empty() { - actor.insert(actor::Talker { - conv_id: self.chat.clone(), - ..default() - }); - } - if self.is_vehicle { - actor.insert(actor::Vehicle::default()); - } - if self.is_vehicle || self.is_suited { - actor.insert(actor::Engine { - thrust_forward: self.thrust_forward, - thrust_back: self.thrust_back, - thrust_sideways: self.thrust_sideways, - reaction_wheels: self.reaction_wheels, - warmup_seconds: self.warmup_seconds, - engine_type: self.engine_type, - ..default() - }); - } - - //info!("Spawning actor {} with model {} at {}/{}/{}", - // self.name, self.model, self.pos.x, self.pos.y, self.pos.z); - self.reset(); - } - fn spawn_entities(&mut self, commands: &mut Commands, asset_server: &Res) { - match self.class { - DefClass::Actor => { self.spawn_actor(commands, asset_server); } - DefClass::Chat => { self.spawn_chat(commands); } - DefClass::None => {} - } - } } pub fn load_defs( - mut commands: Commands, - asset_server: Res, + mut ew_spawn: EventWriter, ) { let re1 = Regex::new(r"^\s*([a-z_-]+)\s+(.*)$").unwrap(); let re2 = Regex::new("\"([^\"]*)\"|(-?[0-9]+(?:\\.[0-9]+)?)|([a-zA-Z_-][a-zA-Z0-9_-]*)").unwrap(); @@ -445,8 +363,8 @@ pub fn load_defs( match parts.as_slice() { // Parsing actors ["actor", x, y, z, model] => { - state.spawn_entities(&mut commands, &asset_server); - state.reset(); + ew_spawn.send(SpawnEvent(state)); + state = ParserState::default(); state.class = DefClass::Actor; state.model = model.to_string(); if let (Ok(x_float), Ok(y_float), Ok(z_float)) = @@ -455,10 +373,13 @@ pub fn load_defs( } else { error!("Can't parse coordinates as floats in def: {line}"); - state.reset(); + state = ParserState::default(); continue; } } + ["sphere", "yes"] => { + state.is_sphere = true; + } ["id", id] => { state.id = id.to_string(); } @@ -498,7 +419,7 @@ pub fn load_defs( } ["rotationx", rotation_x] => { if let Ok(rotation_x_float) = rotation_x.parse::() { - state.rotation = Quat::from_rotation_x(PI * rotation_x_float); + state.rotation *= Quat::from_rotation_x(PI * rotation_x_float); } else { error!("Can't parse float: {line}"); @@ -507,7 +428,16 @@ pub fn load_defs( } ["rotationy", rotation_y] => { if let Ok(rotation_y_float) = rotation_y.parse::() { - state.rotation = Quat::from_rotation_y(PI * rotation_y_float); + state.rotation *= Quat::from_rotation_y(PI * rotation_y_float); + } + else { + error!("Can't parse float: {line}"); + continue; + } + } + ["rotationz", rotation_z] => { + if let Ok(rotation_z_float) = rotation_z.parse::() { + state.rotation *= Quat::from_rotation_z(PI * rotation_z_float); } else { error!("Can't parse float: {line}"); @@ -598,8 +528,8 @@ pub fn load_defs( // Parsing chats ["chat", chat_name] => { debug!("Registering chat: {}", chat_name); - state.spawn_entities(&mut commands, &asset_server); - state.reset_chat(); + ew_spawn.send(SpawnEvent(state)); + state = ParserState::default(); state.class = DefClass::Chat; state.chat = chat_name.to_string(); } @@ -609,7 +539,7 @@ pub fn load_defs( } ["msg", sleep, text] => { debug!("Registering message (sleep={}): {}", sleep, text); - state.spawn_entities(&mut commands, &asset_server); + ew_spawn.send(SpawnEvent(state.clone())); if let Ok(sleep_float) = sleep.parse::() { state.delay = sleep_float; state.text = text.to_string(); @@ -622,7 +552,8 @@ pub fn load_defs( } ["msg", sleep, label, goto, text] => { debug!("Registering message (sleep={}): {}", sleep, text); - state.spawn_entities(&mut commands, &asset_server); + ew_spawn.send(SpawnEvent(state.clone())); + state.reset_message(); if let Ok(sleep_float) = sleep.parse::() { state.delay = sleep_float; state.text = text.to_string(); @@ -637,7 +568,8 @@ pub fn load_defs( } ["choice", sleep, text] => { debug!("Registering choice (sleep={}): {}", sleep, text); - state.spawn_entities(&mut commands, &asset_server); + ew_spawn.send(SpawnEvent(state.clone())); + state.reset_message(); if let Ok(sleep_float) = sleep.parse::() { state.delay = sleep_float; state.text = text.to_string(); @@ -650,7 +582,8 @@ pub fn load_defs( } ["choice", sleep, label, goto, text] => { debug!("Registering choice (sleep={}): {}", sleep, text); - state.spawn_entities(&mut commands, &asset_server); + ew_spawn.send(SpawnEvent(state.clone())); + state.reset_message(); if let Ok(sleep_float) = sleep.parse::() { state.delay = sleep_float; state.text = text.to_string(); @@ -690,7 +623,107 @@ pub fn load_defs( } } } - state.spawn_entities(&mut commands, &asset_server); + ew_spawn.send(SpawnEvent(state)); +} + +fn spawn_entities( + mut er_spawn: EventReader, + mut commands: Commands, + asset_server: Res, + mut meshes: ResMut>, + mut materials: ResMut>, +) { + for state_wrapper in er_spawn.read() { + let state = &state_wrapper.0; + if state.class == DefClass::Chat { + if state.stores_item { + commands.spawn(state.as_chatbranch()); + } + } + else if state.class == DefClass::Actor { + let mut actor = commands.spawn_empty(); + actor.insert(actor::Actor { + id: state.id.clone(), + camdistance: state.camdistance, + ..default() + }); + if state.is_sphere { + let sphere_texture_handle: Handle = asset_server.load(format!("textures/{}.jpg", state.model)); + let sphere_handle = meshes.add(Sphere::default().mesh().uv(128, 128)); + let sphere_material_handle = materials.add(StandardMaterial { + base_color_texture: Some(sphere_texture_handle.clone()), + perceptual_roughness: 1.0, + metallic: 0.0, + ..default() + }); + actor.insert(PbrBundle { + mesh: sphere_handle, + material: sphere_material_handle, + transform: Transform { + translation: state.pos, + scale: Vec3::splat(state.model_scale), + rotation: state.rotation, + }, + ..default() + }); + } else { + actor.insert(SceneBundle { + transform: Transform { + translation: state.pos, + scale: Vec3::splat(state.model_scale), + rotation: state.rotation, + }, + scene: asset_server.load(asset_name_to_path(state.model.as_str())), + ..default() + }); + } + + // Physics Parameters + if state.has_physics { + let fix_scale = 1.0 / state.model_scale.powf(3.0); + actor.insert(RigidBody::Dynamic); + actor.insert(AngularVelocity(state.angular_momentum)); + actor.insert(state.collider.clone()); + actor.insert(ColliderDensity(state.mass * fix_scale)); + } + // TODO: angular velocity for objects without collisions, static objects + + // Optional Components + if state.is_player { + actor.insert(actor::Player); + actor.insert(actor::PlayerCamera); + } + if state.is_lifeform { + actor.insert(actor::LifeForm::default()); + actor.insert(actor::Suit { + oxygen: state.oxygen, + oxygen_max: nature::OXY_D, + integrity: state.suit_integrity, + ..default() + }); + } + if !state.chat.is_empty() { + actor.insert(actor::Talker { + conv_id: state.chat.clone(), + ..default() + }); + } + if state.is_vehicle { + actor.insert(actor::Vehicle::default()); + } + if state.is_vehicle || state.is_suited { + actor.insert(actor::Engine { + thrust_forward: state.thrust_forward, + thrust_back: state.thrust_back, + thrust_sideways: state.thrust_sideways, + reaction_wheels: state.reaction_wheels, + warmup_seconds: state.warmup_seconds, + engine_type: state.engine_type, + ..default() + }); + } + } + } } //pub fn swap_world_on_ar_toggle(