a%2X~YfU(x{>BS5^;(|Lq^gCrD-NXQ8pAXhnTBe#(Js?=PC*$XMqe*>;Hq6N6G zY+D_OMOx^gatMi!B$R?KFM$p~NnOQ> z9|>tjr@EOD7>)&cjtLc1!`HK<2`SWG0JplHk-S->lzN1cfSH$47i}Q11_bQ9l)9Fp zfT*;3dovLQG^N#NoLFNaN{!w2t|m%t$cd#Xqb8dVGCa}lDcgxON3dLDS#^q8=2K4- zUj~0*d9Y|T+|Q(z2dkjY<;3z=71h(6SWcy)T5|`BWjU3KYBnW@9F|k5q`ssi6Y4I* zZs{OEtXj;ylSB)+kSc2QPV@Dro|?YO^a&fEO;B7_t&b!Md(EmtHMI#PfdNuY?Z`Fg zr|FWky4sHuQXS&7tE S-b!w^e%X4Jaxt6+w6RU=`RM=(yl<6tkOxi^% zkqYT(CLiOnqOMwx61L4Dez2a}!$!tnb?T|9l;nifmPGI&sjnU~71I+f95Q>Go?60Z zris6NUoe?qjk$*EHX9*hPEjlDW{poYWH{++9ZtvqBLy(jMm9n;hT7dm%H9F^KuzYv z8ieucexD7IG1o|y_OQ%|h>WntY9~&t;nYn1gc8=%C$VnL)J>EGI{HKP7$pG*{Gr;K z&ImbqF6cuQH#$2Oc{=&d+q73Oy#)0kB>`<~^-oT$_H3;N@1+J4>U_hdzSgRnkvtP> ztwvE2Frn6JRj#poY#UYaab$VIHfnPlA)c_U+Sx`(ue4JK*$8Rzj_PPmtX}D)PPGxD z>7*{S5z;H2)i3roVTNyYOILLh7ZE~wrJK6fMo6!8S5I ZESGEKVRwsN*Eh=v_JxopK#M(>`Q$Od#+Ds2qw^9=5xnb%tN&?&KMD-FU z*?fDQsGd#sk<4)7%|rL8C $pCQ3rV-8sR*hy-}cT7ZVn`~Nrs+bcXWYaoD zjin?N78GLJ*i?1k_e?_!kZfb8s&FJg$ToJSI+YV^8#`M~K8hN$YmBWT;%T7(bJVE> zA#ow8fyZ5Q)sn{ tJf{^+{qt2H>;`Vk|as0o}D$E=@Y`~_+!N|@;phnJ@Q`v@^j zWoLoD!0FRMHHk*cgzJBb&;YZ~P_sEHnuY|E{!|S=K?;-!atjeYKuxAv)<&8lG1aOz z(hA9Es%9gdkt|VLG2(+EO;|$9)!tl02uWy#nrI^=+Dg^OiP)5BR;%-DglN{ND=0~a zngc}Wi)6i8@FZ)+?YKcEyXcK-MM^TkH~Tdr+&^qm<2agDL4X5A2x({|w{a!7S#7}+ zn!;mkRR>eTnwt2mt!fG-%#|l&_Ft dtC^gH;L^1aCCfQknNI*;QA8)yH5_e5BvZ1PleEqPL?bz=?%*UGi%1G|Qr%BU zU>ZNE%BR`r$T}f{L1R_tq}>Y --De}MkepSI zablV0IrT0l*5Ev^CjH2=-?2r2ju`8LI>knMBe|q5;H2W80GDc@|NBMV%+dXq1mWqJ zdYY5YT}Aj2i+EkV&PgJY(&%DusPa!Nvp%?%B!#}ER^((M)}9Qr+iDjZ8I77d>LN 4SyyYX4J$FK2_r>2@F@?Q#FC2z zpHfXu=zLrhk=G<|)uogK79elcY)aCBSk-e(=dJpX5_U=iXxO0nCZ4CI4(*FC%E*8b zv;~x;hC*R>-XmzYIJt*29yzuawEP!n!@|@hY(*_-1|`$M$v5MI)|Haf&=+LuO=C@< zBrxL$+LfUc V{6+G6C1#EEU z(@rpw_qrvYcGYaX%JYdY>=Mi1H~gxW?16$ci~NIx95@9?p<_%FlBbD6LNp
-jZ{KXK T4tG+B?f*Or)D)_9^n-p?P9wIf+6cGl#Z zOlqz9x@Za|Y%7?Gsdm+RQIZNncu#cG)>4uVC$QZYqNcaDnQMyh=IW!pGL5yKS|Z#s z$E@{~?WW%%83iVyfm#bn(&0Ni<=%pc4AhoWk_xTLv9=nbZKj0z!l14K4ADHdX*%$H zr~nN<21wTQ+vW?*LC7?VufxhOqk^0~&p1k3W{y~gM=C4X1F-CKw3cnITj#0u;c@=J zvb~AgO-?M^o2322iDhZ2T9G@n<-jtKsao|rX3Tm|&4{M_iDhx~wN`h`r1hT0?vDJ4 z)vJrNB=hKcJVIDzKEhj_&*}3(BdyfdQo=lc_%MK#+CCd0d%soMS+hx&CpzK j2him(25+ ztS^^GE`i YP+Ve??X+ zS(?s?wQI}LX8Jg?wryG3X-=$d8)kNwWpBC5Y^^*emb=W>YH(t?%MF^&iRCUgX!vCy z@#}e~4I8!WyFP*fo7Rn5=shN~cAuNH1Ww3sBQHNUX-jN`48X10ZBDGs-q%{}eU^@8 zV_$14II(POhxY0|-+fv;!kt?D0~XEN5boCIa$;==_h@Hrgbed KpM3FPJBU&~mKcj{1MMF8N z9p$7NeiL&N$w}=jC#UdGg2Xzd)qTuTK8Obw=TUQ7>%_@()R1(3(#H5W+J*_;L3B=A zM9Gc3mk}4Vflo+6fdkkJ+89o(!_|vgyQlAJE^7Tau{4*ofxo}2xulKyof<(pT)htT zo!n(@1{I~lx-EDPhy&xY_8BMV@GBKYvN d#a6DC%SFVPXB;8X^1r0n3&W7qdQFJT z$wg6w|HKgz$4R+5*j|GOY0k;5+IZqhV-4h_6#tANS35}vp8X3;WprzqBwElbmRW}? zxR(_P8N 0f~*H~ zwN 9C{>>7KLQQ#0=$@9ri8TY?*EZV-aS{)- zhHqJ{hPW4~jt4o9wLO#^7Dh&}1>A31!aqba%?BMeu*{xlCPjfo^b_r8N&+VHM9Z}i zVlhv(XEs7C<_~QcIElsN*~bfQG$jH1c)>Nff{&OCF_4$q=PX*Dp}o}B@q{dg_)^=> z3Gql|7yMGYY$N0giC5Y^8*x7a_)~jjBjm;VYt19DBDVBlLgcLLFD=GGNXR>`x7rdL zAt$^4Xcuf`0a^^`k8GsFC%8L!hj=i1QTK>EGfbJRo*nwYJc36M`wHXtc>0b!#6By@ zr#Ey2qHRIT4%YYE$Q;Z*M89Ao7tmrt^}6{;tf?>vyOm@XrVpVcF!krxM^i$()kohF z pN}a3VOx}{VpYe znYXC^loDPsA2v}@T?nJu=e=$yrk7zP?~P|MUAK{2STm1)+(t;_m(ai1O9x)wt4moY z$Ma<3C+jkDJYP~L$MY8Xq@5Z0ji;#ZK2OQ|%CC(6k`h+^2Uw9ZdT4%9Mz&sS-W~TJ zdUr~grX!Nd`e+;JiKL32W+Q` sW&ae(y^9!J@vhuSWCQ~`prU4oP= 7vPqUouD74qQLh?6ZB`CSkwCi{h@~?l((_boy8fkwkDJG zNKULR$rQaJB`J`!MWpR9T^~pZPJ*9vG)uq2Mdw{?OEFhp6-km#flEOS+8uNCZJbQT z>5O#HT>T0s{k^zI!cLs4mn*?yeT*N{+)c+91Nv=F(tZV)h2wsq{ud)oAgDeL(R96- zY;ND-S>cP8Npv>2nqz`ldQVEyKrW3Rk>NgOgFcdy+^{nEal H&-GGEQ(( z0as@vJ-4y8A}eZr9y`ML`8`IguMdkD4=Kq6lfMBeYILe>cG-)c_N}PQO7oe?K4&au zytEPW(#K;|ie;KBxCZ;PrvSx`7L=sH0<1%PH9#_kk-U#RA`Q6;iIoPG@y#76X{0fi zllfSRqeXGLFnamom?#4m@ *5n1kLK6e3YCtU(Yc!IpsHtvrsZEO*D&7(x7fCJSBTlT(D{C1^wVmYu(U2Be zC|#sqT-Gucn_=JL!N6LoO$A2*fa92EEu&l=l3pr|#74S?q>k~1l7L~?GwRkQ8a86d z(zKotPf1|G(!faK#9FX4FqYT|S+F!P5`6VYLMaf|8~XsalB%(TlE9a9nsJ*GYgMBe z;q~9mUNfR73Ak3nXvzuk>|_mL7|Aw5R-N(2iu!Ci%=@&ek#WK%A`6Yi#w$t!b!}oq zG$7dr>e|fEIkD>6%t*EoQrBk2Gfu3}U0N714cT-ER?S)%-5LgJMppPOj0u#m8H&`S zmC;LK*^`=)dbBZ)P%<6 CUh*D|F@D&cN;y8fY8!eEKJz-w$ zI~v`nh!K)dCu0>S);D9Fjh&Qa0{H^FTf6{WjKhQoDey}_=4HDY?`b5n6u5_^BWBjs zs7VQH#X(5A8x3{T_)ygU7dG|xG?EBHG7d>=6!kP>3`RbR6XE%4{6@m)L`g0^GaxR# zuQB&OOyl~S%}{-fC!ENCv8kc2(J-EAYU37&Y-UhHh)^&EGDope_cO*cGHV|63@(4V z5fSHxC2tp@ERMP%#sx}lgtbRPW}hL(9rMsZ^!-td&ASKDxm9gUq68-Lp++xC(&+~m z$FVL$4Id@bL&=+*9Bka-#tceQLcc*W8j~GvEZ~}D_}-Ujyv8D~*^Go}yv7$?bC7FB z80%QlDWO-mXoRtqi^%`sg(Q@0e9MXT0w&ow!AW aeG??>3XtqsjL%@+9LQN)E&RHzKUUlK2c)Q`X?WBbk9@vQe3nH`wWfq!{s( zq=SYZ6_}XL6r)=+5-SZF|0=*bB-4yNl;D>TEkyVU$xK7;@*xqWLsxwNO3)l*0w>k* zV*o 5HseK5kz^Q4I0;9Rh{QBrnz <&~u`U=b7sPOk+!({L@?s3f$u}_^FF(d` zf?R)`3nt3DCb(dd{CKJheDbhqE|@Hj!7xQGJI4i6 1WXQ1?ekvzpm? 5 m agrm7Q+*TCU-A`(T^A&FzM7 ALoWE z@&*jA${S|8;g>=38N6MSuVHvyeu?1?xy~Fn+?1<*;>NXwg5hnsJBD}U?hD+ID}RjP zuX6V^H{6wbVR%pOwa^Xs<+T_-kk@9q;h{Xibi*TgGlq}lflJ)*o7`#X4EeZ>S4q4| z;Z+*1D8GEX%r#&4kZzzsH(cm^X-+_4}3@c$a!agE->DfkQC QjsD9a)b>|v;d~+dF9JFMm;e9( delta 19156 zcmb`Pd3+7m`}ogHwi}rn+#7MlAjFbdLTt6orgmCUu?4l(Qkq1hc5WgXs)`61wX~|G z2#Thzt!isZtyM+U68m1XXp8FidCobLJKE3hzh7UkIg|UI=Q- JRg*^rhC}5psJ(?g6OJdyy}dU^r}RHpTmI5 z<|oaZwR3w3v7uK%FB (N~%bLYrDnBv>#0)LFzA_>uP?QAT< ry!xxfuI?JraCu zHZ&&|dLlTb5adu| ;?eG=+D#fI1eqJUNn_!5 z=3S|cncQ7EDl{ )&6vbDm}UNVFGN%cX#X+NnN z-1_yC*24|5eFMsVyT9}+yY(~+21p7#nX+0M;_Eq3sxFrA+Dl9=pE3#u$|-u%dcn_> z_uyB}v>$yR4we=K3Pa7h!=-7$`)0v#=?|fUx%Mq7R`|sH=`AT5ZjaxRnhX8S`Xi(- z;Mt`S(g^WxlG%BrRH^hINl?|WK&WbXU}U{gX&rptk<#Y^)Ma9_B%7}!OE0s(lb}lH z$4a^xnId%pG$=*N7aI6Vrb=colc?r9G)5{dFuAwjS^II4TmlLlGF2Lc1s &u-cwLxtdlVk8RKU*3I*bJW`Jz=+av)Ox4D3xe!Rvae Q^mq_0W!ppt| zA4yqaT sedjFx8*V=vOy2aq#WYJQBZh%SQ^M>t&;i*>E^{%(h?{FOs2K){}A>4 zyhf@c)ZO1tObv*|iB~HqEd=IG!022s)S3aYjsOx|$C>urE|6e0S}RrZ W=cf^z6(MxSo719Qq z$JR Mx|HBI8l!t_@Pn5FE-hka(~`N({b^xdoaXH%cc_I%bpf zQhVV|V3i;l9f2hWK%re 5j zSnc?Cq2@1}rP<>8A?665^qRQ8pSj&9y<72LEe&|FMZPz-NbN+=F36NR|JaNMumWU( zO~MLre2BSon^aqb`<-o4xe$~RCuW%swt=NYZ 2gHS?(VtW XICEpnilb5g1h7D7j-cJ;KugD5Z) zPD$m(i^;yXPf2Y818Sv+c_E>ZzC*uA2Ly3*iqAYJ#lgDeE4&~@2_Yv^z&@^}nAeM7 z>78y4y(oPu293hC!Q-oXNh&7@Zl8KtatDDo0*xf!+8a_Pdg-`Z;P~}4&<-*W-jZel z>V8`~7u*I>qOa*4$s;uITRXR*u(ToYoQ<*=9z6LU7>n@0O85Ge3JedT>yJ6@t`z+e zb+vRlrBzENcGnwJwtirc-zA%e?@Hx@nP)aX33R%Jsd>LjM!5~e#RPf!)p;qfTwJxl zsJO~$(Pq-GQcGc;Z|Sd6V<8r6%cgB0 KWvTxUt`mi;Vi|DrPwz L(n9gdXfyS9 zsgjUn&i!3#<~oyZ^;uwWP%o%sP4n#U(&jhp)!|tWeg{McVhzz3*3Bi{bp}P&EtN(G zdp%0f^(_$D?KaT8eijrkdw3ugvHu &^F%msf)DHWq2)3k*p1U`r<`zny&cjg5X zu^Kq+D6`6+QoR?txp>fq{3$i5c^ zRH3k`kfod|&=0wG;4 !W-|h-dGeEqR=}W5Yj1n9P5TM-;hK=6oD$bl>mHoCwqfQ2{Eu*9jSWS z^Gq}ICFjq Jku;kXEs-keapxr2Hrn(ef9N z3(+cHi(1Zm0mA(0wd*?J3WuvCT&3VD4VTMTyRO^OC2GS|k;HWCN|rqdC#9gWF>SlG zZw2=aPo}??;f5;$t}<{%!d2GyT83w3Q14bFaZ8;;PV^E y6mA&8Jz 2C4bK&B=apo z;+2h@oPj=I e7qv0pjM${{`Z7vA|dsa zSW2=TiPtSskCWlOp+Bfh6Q)JtdsswFmAsIVzxDN%xKx@o89fFLK%hSwD#?`OlJbWL zaaSg!u`-Pke-)c3OKb$I*hJZ2Be$R#O_hU`_$%F9IST~J&m@bM5rS=PuEdYR;{EMt zt~BMuYDaUW6(xnm?P#uqr=ga=8O@buloS>>Ls2GB;;*!(%tK<%dCyZxT$yHWc+XSC zyZv86ZIpdB(hAI~jZ$kgts=D;0Zgy0(!@rl9fJcUCD%sayo7X6mf1)S%%fM84K}g} zNEfB2HyyJsbi4|iJ+$iXN>5I%j1f5L&&l%|78yoKCMlWAda=7Qj+3iDT4V+#{@Kx8 zImTrwKNm@3Xjl)WbRF~9Oiw9qt9NKEh<6f9)un{=RAw T&R%IBQ)2a*q! z@1 cQtopSS%Gjecnp@6MFOD3SD_Y3$}%rSg`pu(F;wfV zY~dsV2#!H-rOQ~>QBi{hvI&g4k1~{#n4=cS;G`aqwJ)R0F-FKXC@gg+A$^tk<5*LX z?1E (Unh9u5t1xn^2EES#eCojB?4;^UQ}&QQC2` zX)7W5wF&Vm1)N-ejgbsRg6Ijg@~1PBsSHEn1ypIMKt_TWovMtT21v*yfel!NvXmJ} zKxS}20L^-uvX7J7^}!fx6Y{QdgOekiWGjL1GOdk3aG9B|#M{Va(3+uir=)u>`E)nS z=sjf^7uxlvK$o_e%4ts8?G!2bK*`8vS?A9Z$h@+I%vH8B;&@XP$j{J=xyr6=v)*iQ zFzu$JY>uZ0*0yG_w#`=(De?QI`N~KeL1#MuKg-PmC4 ff!SRub-SftdWB#+#EQzR3?auzG!P?Aa7&Jd~AN6L?s z Emqi0KpU0BnOJ-#xw={;nDtl6 zBTBL;!CG%qg5F1&Lh@62)@R$5Qk3}nY`e0M$%J-;jvureoUXErljOw$`2lj?p{xP| zb1Tb{vXOc29ZCTcA{W3TpsU-VIA*cJ&>=B0*hbpQD6`*2PC?e+DEBGJBzM;e1j#OC z$p @@x(x6@O+6&>rRVTqJt~29;*s zc#opbV=_qog2MJF4d){%B%_|P!uBa67chb@v&QQJ*{8(jA@S}NJH0EAwt&7 hYxu#&I@Yj;s7ct*&QkD+j-KPQ&V5hd~C7iEqp11a&(i=+RU z7e|#bR3^vq!2m+KfTKIAO!iXbpDIU{97_CC<*2g4MsQvnQ?}U1@~#3ou2fxy6=GUA z3r;FcYy@Y)DW#K*tOu>1l@rUnsK#s_GdiaX{RD~M!Y?Z0DDhkPMWxhoCUdAivz1Fq zG$ok?$!GfrxuhInGNCy@Fa*D%+~C9-nybqF<#ZDIXTeqFDHC$E05inNb5#lalof`a z>%j*|dI51j6_Ff*S#V7mW+Rt@Tvtw`mXJx_TnF(;j6iNFJy-a(u!rs_LxFfPqxoQ~ zi0&$r0AcHKr91}x@vHKXk{t2|nCfL9_muRNewkW{0{KIENC}fsf&8hYf9{u=1B9rZ zRv}?BD}V&3Cy;odFpRB^Kx`$c+G-Tabewo9&}k{D?KtrP!ESV_iHwj@P@zYVQMg(_ zNe(3?y9vatzP5%IR=l!QR7X aj0hl!;c0II(0ZtDem-%2ZZ`%>j_}G;{j`Pnf$peOxG5ZncV9-TZlhr>(aMe}FC! z9bSxDU?b?>s;l*Un0KLIxwjf>IwzJ7s-d3d#PUHk)PyalwKu?WK{eIIl;n{nAHi^S z7f5Y&yPG1v$El-!x5eC)=V|CYN}sTK+ZKfDspo-2!)RJ QgRb`S|*( zV=L3Le0+VijE!KE>#Nl`v6|CJt#2W#&5cx@3t25}q<*&5oN0QhwBG QM8M>4||?o#hsK8VQQod7&r9 z+nR|9)?93%_Oub4i;DWajo>uX)n7QliH8+1)SEVfGKMN_XTypzRjv}!QuT0RP0m*8 zV6P3~Tx_jwuo0YjZPaI+SktV%+F%D}%|`k#w5`3`l@k9zcTkfl@jK=Ys ZL((}zXWwIC56Rqtc$vo6RSVFsB3_L!8n}H*h<+&^)XUxLS58-l=w}k zi+X~~Sibjl^`e&}%R|1d-m?+(kX_ZkZ3IUpQFVUJEDyD?$9t&dIk85iry6S`DAQAI zY$G@-z0}rUw`Cbw!_r&r%7u{NsPs_>*a(hFUv(5G)~NJXr RC>#E$}3D;XWD_7ZPg^JVkBtEmK1)#SO1lU1=k@lbNa>qa=&W zEy?yaS*r9M(?SEpE$}q;GaJDz@C-F}Ka;Vxz%y0P0U)^JtX)ThlSYBOuf`$*;sVkD zj>=}KyT50o?QS?XfZ>>}p5kQF5Ju*x4>>6ZMLz=lx#}}YnCaml=BWQZe#}wXIilBp zay3tlIEaPik)ppu(j1DPuO@I3nF9o#El>+MkvoZ`CCKEdg*MU-h^d~ik ~| zFCa_Q-x=|e5p7vUAFDx!Sn)_Oqh+ewMo?|J8pDa$j>)W0<81_GK37{&l1my670DnV zYt&7gY=+G>?!ecp2f3Da<`X~=?|-2l=jh$)0@+;#Ns*0Qfe3MfdY@-Bm1}KM!w+Mn z{gLn{wHhVNm8V1TU#d+gVPP*4pXy^;MD{{AP6D)DJzyaq^C-E@3HHZQAYZGGY~)Ky zN* -AG7t#Le6QBzv`(wlZDatDGipOlYWzjWnFeqwa9&O1=++;I;ABlr=cHF}k^BHv zEK;X&k^-a>xYE=~qQu#A O*p~YdJtr`0lBL#qa=sy<>a1P zL %-=quLKV0iEZpo=u^l2>1zv2j5hL@s3 z!FuNtpq*zV^zI$jvLNjSCE1RtK9*6C## o%=^ c3zC*~MG`vf8VZ6be>QS60j5WHe0YzYh`O z(dJW D)pD&SwOhH3Y?%C~Tgz7et=roD2R72UZi>%9?LA|=dW2KE-n z2yF)?Iponufi!=ckaX?JWph20AT%?7SPk9L@(OKrvHKjOwKQw3@x-{>um{wJ@lDlO zEx{bH#?z=n3V&c(<76$H6U!Q>XrFRo* ^Su7KOi+EuK(zmt}0ohV_;L#bp!mTLoT1UHDEY2(a) zKsjO&eQ+(b O(GEg7WE75AtyKi@$KptntqeXSW|M7HiHvu zNBE_7j1$YozSLUXVp^7sZPAw8;#*W}+qhM`!G)|{<94myZKh`J8h2>pYy>C%H`*>v ztckx%bKGHCmig}1CUIgpszU7;5Oe){PkrxM`Yel_goOr;?mO)cCkYT~;X&JeE#WTa zm_>d93;P-j<$(4!C-Lyn&0!#iwQ-yrg_8@^I;x%JWDlHfoC29++A~fbfehwzT$8=O zvaAarqpN^UYAq Njcxx#V0Cp)dV@(P~klT(Wv292UaF_(fAVISHS^Fp|JYl>u Q6}jJUkc!x%A4A;XG|>`WU4_%H?<~z zGh#V_TUw%xpp&?*6>-u6HVpOQwC7i?|8vyZC%hBELb`j}LrUKDlJ4tRVfVG>|DcdR z(!Q^ar^IhE_qCZef)?{YTWBL_F~4gr;)HzsuOS|5 Hm(c(HMm|jMK!yD4Q yo~Z6KhUOdXbIbYZs6Srj;i7 zYuUc1q<)_hd=cZt$xu??5yFHpu)&wxCH1-vB+T^CK3uwCBlvQ~rFXWGw(z>tt@pK& zv)~yc^jVbn-zP=t3n<|Y^FkLz>MNK~@q31{`nOyS#~!VrtbWBt@aW&8r-ZUfqYQR_ zdA;@5baEEI_mp)!!^brp<1#$Mub|@@zD4FFn#aHLM0#iQoUG3XE9;9XVa>k{4XLcJ zrG&+69s9zLL>Ef q_u9^$d^Fc>OM+X6~6(}Q9ofLXMnt}Cpxjx?9A{nkY0NGa4+r0;x_~R^nT%t zSTSBd{T)uM7_Xl`nUUhXazA|rm$72Je)=6wtProCKA DeWnun55xyXh}5 z58r?f*7PM*D3g2v1Z}UsUcl6d6=e0-JC&jt5i9QLum8yjP6qVD1N050Q6`hDhm9tZ z!Mf~XT2^Q_R6hg+7eN{@ Z%RoXIektbJ)x}i`bhJGZJtJAQAKm# zHrRkV% #0mD zUHl1yXf&Y&P9@>gX}Aa0C*vU}W1kU90*zHwP%D>=9w^WQ&tRi!RU~=jYd9#xBhU~d zrkbBzt_@3%(SnopkTc4J8na&J=oa)Zq7ud#PPTKQFyjU%EqP&*@u-?P|7+OUlj^J* zoo_R3myyazbvUlW{M<&T8ce1c*N!m8zr=|3d1D!4E+u)y LR`K`r)0Cq~%K4c$gCU} pIV+kex!rB^JxQz8pOnc)BCsuIQ-taW{w;tQt-dM AIWAT|}0+22s)XzxeWJsJy9<6|d z-dIM-HF{=%E`5-3q9xOE{moXWK}M5T7?Gc{rD2dUjg!W(1;Wh?$g~0(Av}}hjbXJO zZ0u@f-r3`MtD2`Zs$UCD-z<_UFzZGb(Ue>a?FIx_pAkkKbK+j`{li+D%l3kE8%G8F z3;9T66(za!tBixtmXXGHlw>>bbx$F5?kM9ZC7F(|fQ*G~M;WKN%t!EY7-iCoA}+H5 z2+E`xH@VCnE;HJA;N?PRxzK3i2^YeDQG*$!8zF75RoM>fEls)+!AW1x!mdm=sxU&@ zKM=@GsC2r~f|F4Ah5LteV<98-;IP>sl=;0)Tb6ZrMffra&{*Rs&-x`GT`39VGOf7G zI76c3nvmOAB&DI7#~D@4kZ(P`ytSDqEuk(bPchn3vXAU~CX&yfCSD_nliz?$2a;io z=HwX+I+9Fd7A3hvgD($E$Y-kYSv#y~4ry~;Agh7AYXr7O0-sBC63KBOGmODW9QB5m zw20m}_HhyqUko6bZB*^R)V5C$iF2?(a*S!5ygpGRDvQIbR4(9uzE3S^xjbU`iuvc1u$M@cS8 zhJ}6=EbSYOf2LR3?}4ivTv2e9H!JOzfAIDn>mu*S%OD*icNpg)W99CUj+19YI$pj6 z=>)mvco&%{H->bQJQdQ(vN*{_rpS$_xrkTZ3~7eE3(`#at(h(|RX+Z{i)6{qAe|-$ z&vKD>Wf!E`aurCY%gK<=kk>49k@w`^yl|T-H~Y{<-j_Q-I!m4h=?C&hkj|DrgLIB8 zFLIH&awkZ0 (*I$?1Q)$ZGj*;wEe4tB~f)D}vo*t$Y{Kb@JU1H(4(~ zg7gbnak$9_xizF4 Y*4bqFU7t%}e_}OlVE#8In zio62StMZCDZgNfj3exNHin(rbLtX{xO?g$0o7|G`LwZ}jzraoI$oul# 5?s-~TL&v2@H#^KkUm5seSFSN zRep?f!M{@Ze)hb!hX%FUT4rL4`8TRBn|^;n72o{{F$>?0n07setmXgDD9ro_{B0)8 iDCG&*6;w5+vfJEqBc_ut{8r4<0HKkubVT@L;r{?hCj4gr diff --git a/JNFrame2/Assets/HotMain/ConsoleToScreen.cs b/JNFrame2/Assets/HotMain/ConsoleToScreen.cs deleted file mode 100644 index 28832f1d..00000000 --- a/JNFrame2/Assets/HotMain/ConsoleToScreen.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System.Collections.Generic; -using UnityEngine; - -public class ConsoleToScreen : MonoBehaviour -{ - const int maxLines = 50; - const int maxLineLength = 120; - private string _logStr = ""; - - private readonly List _lines = new(); - - public int fontSize = 15; - - void OnEnable() { Application.logMessageReceived += Log; } - void OnDisable() { Application.logMessageReceived -= Log; } - - public void Log(string logString, string stackTrace, LogType type) - { - foreach (var line in logString.Split('\n')) - { - if (line.Length <= maxLineLength) - { - _lines.Add(line); - continue; - } - var lineCount = line.Length / maxLineLength + 1; - for (int i = 0; i < lineCount; i++) - { - if ((i + 1) * maxLineLength <= line.Length) - { - _lines.Add(line.Substring(i * maxLineLength, maxLineLength)); - } - else - { - _lines.Add(line.Substring(i * maxLineLength, line.Length - i * maxLineLength)); - } - } - } - if (_lines.Count > maxLines) - { - _lines.RemoveRange(0, _lines.Count - maxLines); - } - // _lines.Add(stackTrace); - _logStr = string.Join("\n", _lines); - } - - void OnGUI() - { - GUI.matrix = Matrix4x4.TRS(Vector3.zero, Quaternion.identity, - new Vector3(Screen.width / 1200.0f, Screen.height / 800.0f, 1.0f)); - GUI.Label(new Rect(10, 10, 800, 370), _logStr, new GUIStyle { fontSize = 10 }); - } -} \ No newline at end of file diff --git a/JNFrame2/Assets/HotMain/ConsoleToScreen.cs.meta b/JNFrame2/Assets/HotMain/ConsoleToScreen.cs.meta deleted file mode 100644 index 9a08bde0..00000000 --- a/JNFrame2/Assets/HotMain/ConsoleToScreen.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: f75d46640fcd41f49a2bc14a946c16cf -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/JNFrame2/Assets/HotMain/HotMain.unity b/JNFrame2/Assets/HotMain/HotMain.unity index 91af244d..308a8c06 100644 --- a/JNFrame2/Assets/HotMain/HotMain.unity +++ b/JNFrame2/Assets/HotMain/HotMain.unity @@ -147,6 +147,7 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 67180524} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} @@ -154,7 +155,6 @@ Transform: m_Children: - {fileID: 1371077986} m_Father: {fileID: 0} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &67180526 MonoBehaviour: @@ -254,13 +254,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 790008994} + serializedVersion: 2 m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} m_LocalPosition: {x: 0, y: 3, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} --- !u!1 &1371077985 GameObject: @@ -286,13 +286,13 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1371077985} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 67180525} - m_RootOrder: -1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &1371077987 MonoBehaviour: @@ -307,6 +307,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_AvailableProcedureTypeNames: + - HotMain.SHGame.Procedure.ProcedureLoadLauncher - Plugins.SHFrame.SHGame.Procedure.ProcedureInitializePackage - Plugins.SHFrame.SHGame.Procedure.ProcedureUpdatePackageManifest - Plugins.SHFrame.SHGame.Procedure.ProcedureUpdatePackageVersion @@ -395,11 +396,18 @@ Transform: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1371947665} + serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 1, z: -10} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 1371947668} + - {fileID: 790008996} + - {fileID: 67180525} diff --git a/JNFrame2/Assets/HotMain/LoadDll.cs b/JNFrame2/Assets/HotMain/LoadDll.cs deleted file mode 100644 index 0809b8ed..00000000 --- a/JNFrame2/Assets/HotMain/LoadDll.cs +++ /dev/null @@ -1,297 +0,0 @@ -using HybridCLR; -using System; -using System.Collections; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using Plugins.SHFrame.SHGame.YooAsset; -using UnityEngine; -using UnityEngine.Networking; -using YooAsset; - -/// -/// 脚本工作流程: -/// 1.下载资源,用YooAsset资源框架进行下载 -/// 1)资源文件,ab包等 -/// 2)热更新dll -/// 3) AOT泛型补充元数据dll -/// 2.给AOT dll补充元数据,通过RuntimeApi.LoadMetadataForAOTAssembly() -/// 3.通过实例化一个prefab,运行热更新代码 -/// -public class LoadDll : MonoBehaviour -{ - - ///- /// 资源系统运行模式 - /// - public EPlayMode PlayMode = EPlayMode.OfflinePlayMode; - - //补充元数据dll的列表, - //通过RuntimeApi.LoadMetadataForAOTAssembly()函数来补充AOT泛型的原始元数据 - public static ListAOTMetaAssemblyNames { get; } = new List () - { - "mscorlib.dll", - "System.dll", - "System.Core.dll", - }; - - void Start() - { - //StartCoroutine(DownLoadAssets(this.StartGame)); - - StartCoroutine(DownLoadAssetsByYooAssets(this.StartGame)); - } - - private static Dictionary s_assetDatas = new Dictionary (); - - public static byte[] GetAssetData(string dllName) - { - return s_assetDatas[dllName]; - } - - private string GetWebRequestPath(string asset) - { - var path = $"{Application.streamingAssetsPath}/{asset}"; - if (!path.Contains("://")) - { - path = "file://" + path; - } - if (path.EndsWith(".dll")) - { - path += ".bytes"; - } - return path; - } - - IEnumerator DownLoadAssetsByYooAssets(Action onDownloadComplete) - { - // 1.初始化资源系统 - YooAssets.Initialize(); - - string packageName = "DefaultPackage"; - // 创建默认的资源包 - var package = YooAssets.TryGetPackage(packageName) ?? YooAssets.CreatePackage(packageName); - - // 设置该资源包为默认的资源包,可以使用YooAssets相关加载接口加载该资源包内容。 - YooAssets.SetDefaultPackage(package); - - if (PlayMode == EPlayMode.EditorSimulateMode) - { - Debug.Log("编辑器模式"); - //编辑器模拟模式 - var initParameters = new EditorSimulateModeParameters(); - initParameters.EditorFileSystemParameters = - FileSystemParameters.CreateDefaultEditorFileSystemParameters( - EditorSimulateModeHelper.SimulateBuild(EDefaultBuildPipeline.ScriptableBuildPipeline, "DefaultPackage") - ); - yield return package.InitializeAsync(initParameters); - } - else if (PlayMode == EPlayMode.HostPlayMode) - { - Debug.Log("在线模式"); - // 注意:GameQueryServices.cs 太空战机的脚本类,详细见StreamingAssetsHelper.cs - string defaultHostServer = "http://127.0.0.1/CDN/Android/v1.0"; - string fallbackHostServer = "http://127.0.0.1/CDN/Android/v1.0"; - IRemoteServices remoteServices = new RemoteServices(defaultHostServer, fallbackHostServer); - var cacheFileSystem = FileSystemParameters.CreateDefaultCacheFileSystemParameters(remoteServices); - var buildinFileSystem = FileSystemParameters.CreateDefaultBuildinFileSystemParameters(); - - var initParameters = new HostPlayModeParameters(); - initParameters.BuildinFileSystemParameters = buildinFileSystem; - initParameters.CacheFileSystemParameters = cacheFileSystem; - - yield return package.InitializeAsync(initParameters); - } - else if (PlayMode == EPlayMode.OfflinePlayMode) - { - Debug.Log("离线模式"); - // var buildinFileSystem = FileSystemParameters.CreateDefaultBuildinRawFileSystemParameters(); - // var initParameters = new OfflinePlayModeParameters(); - // initParameters.BuildinFileSystemParameters = buildinFileSystem; - // yield return package.InitializeAsync(initParameters); - // var initParametersOfflinePlayMode = new OfflinePlayModeParameters(); - // yield return package.InitializeAsync(initParametersOfflinePlayMode); - - var createParameters = new OfflinePlayModeParameters(); - createParameters.BuildinFileSystemParameters = FileSystemParameters.CreateDefaultBuildinFileSystemParameters(new FileStreamDecryption()); - yield return package.InitializeAsync(createParameters); - } - - - //2.获取资源版本 - var operation = package.RequestPackageVersionAsync(); - yield return operation; - - if (operation.Status != EOperationStatus.Succeed) - { - //更新失败 - Debug.LogError(operation.Error); - //TODO - yield break; - } - string PackageVersion = operation.PackageVersion; - - //3.更新补丁清单 - var operation2 = package.UpdatePackageManifestAsync(PackageVersion); - yield return operation2; - - if (operation2.Status != EOperationStatus.Succeed) - { - //更新失败 - Debug.LogError(operation2.Error); - //TODO: - yield break; - } - - //4.下载补丁包 - yield return Download(); - //TODO:判断是否下载成功... - - var assets = new List - { - "HotSamples.dll", - }.Concat(AOTMetaAssemblyNames); - - foreach (var asset in assets) - { - var handle = package.LoadRawFileAsync(asset); - yield return handle; - byte[] fileData = handle.GetRawFileData(); - s_assetDatas[asset] = fileData; - Debug.Log($"dll:{asset} size:{fileData.Length}"); - } - - onDownloadComplete(); - } - - IEnumerator Download() - { - int downloadingMaxNum = 10; - int failedTryAgain = 3; - int timeout = 60; - var package = YooAssets.GetPackage("DefaultPackage"); - var downloader = package.CreateResourceDownloader(downloadingMaxNum, failedTryAgain, timeout); - - //没有需要下载的资源 - if (downloader.TotalDownloadCount == 0) - { - yield break; - } - - //需要下载的文件总数和总大小 - int totalDownloadCount = downloader.TotalDownloadCount; - long totalDownloadBytes = downloader.TotalDownloadBytes; - - //注册回调方法 - downloader.OnDownloadErrorCallback = OnDownloadErrorFunction; - downloader.OnDownloadProgressCallback = OnDownloadProgressUpdateFunction; - downloader.OnDownloadOverCallback = OnDownloadOverFunction; - downloader.OnStartDownloadFileCallback = OnStartDownloadFileFunction; - - //开启下载 - downloader.BeginDownload(); - yield return downloader; - - //检测下载结果 - if (downloader.Status == EOperationStatus.Succeed) - { - //下载成功 - Debug.Log("更新完成!"); - //TODO: - } - else - { - //下载失败 - Debug.LogError("更新失败!"); - //TODO: - } - } - - /// - /// 开始下载 - /// - /// - /// - ///- private void OnStartDownloadFileFunction(string fileName, long sizeBytes) - { - Debug.Log(string.Format("开始下载:文件名:{0}, 文件大小:{1}", fileName, sizeBytes)); - } - - /// - /// 下载完成 - /// - /// - ///- private void OnDownloadOverFunction(bool isSucceed) - { - Debug.Log("下载" + (isSucceed ? "成功" : "失败")); - } - - /// - /// 更新中 - /// - /// - /// - /// - /// - ///- private void OnDownloadProgressUpdateFunction(int totalDownloadCount, int currentDownloadCount, long totalDownloadBytes, long currentDownloadBytes) - { - Debug.Log(string.Format("文件总数:{0}, 已下载文件数:{1}, 下载总大小:{2}, 已下载大小:{3}", totalDownloadCount, currentDownloadCount, totalDownloadBytes, currentDownloadBytes)); - } - - /// - /// 下载出错 - /// - /// - /// - ///- private void OnDownloadErrorFunction(string fileName, string error) - { - Debug.LogError(string.Format("下载出错:文件名:{0}, 错误信息:{1}", fileName, error)); - } - - void StartGame() - { - LoadMetadataForAOTAssemblies(); - -#if !UNITY_EDITOR - System.Reflection.Assembly.Load(GetAssetData("HotSamples.dll")); -#endif - - //委托加载方式,加载prefab - var package = YooAssets.GetPackage("DefaultPackage"); - AssetHandle handle = package.LoadAssetAsync ("HotPrefab"); - handle.Completed += Handle_Completed; - - //AssetBundle prefabAb = AssetBundle.LoadFromMemory(GetAssetData("prefabs")); - //GameObject testPrefab = Instantiate(prefabAb.LoadAsset ("HotUpdatePrefab.prefab")); - } - - private void Handle_Completed(AssetHandle obj) - { - GameObject go = obj.InstantiateSync(); - Debug.Log($"Prefab name is {go.name}"); - } - - - /// - /// 为aot assembly加载原始metadata, 这个代码放aot或者热更新都行。 - /// 一旦加载后,如果AOT泛型函数对应native实现不存在,则自动替换为解释模式执行 - /// - private static void LoadMetadataForAOTAssemblies() - { - /// 注意,补充元数据是给AOT dll补充元数据,而不是给热更新dll补充元数据。 - /// 热更新dll不缺元数据,不需要补充,如果调用LoadMetadataForAOTAssembly会返回错误 - /// - HomologousImageMode mode = HomologousImageMode.SuperSet; - foreach (var aotDllName in AOTMetaAssemblyNames) - { - byte[] dllBytes = GetAssetData(aotDllName); - // 加载assembly对应的dll,会自动为它hook。一旦aot泛型函数的native函数不存在,用解释器版本代码 - LoadImageErrorCode err = RuntimeApi.LoadMetadataForAOTAssembly(dllBytes, mode); - Debug.Log($"LoadMetadataForAOTAssembly:{aotDllName}. mode:{mode} ret:{err}"); - } - } -} \ No newline at end of file diff --git a/JNFrame2/Assets/HotMain/LoadDll.cs.meta b/JNFrame2/Assets/HotMain/LoadDll.cs.meta deleted file mode 100644 index 191ab7cf..00000000 --- a/JNFrame2/Assets/HotMain/LoadDll.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 21612b697232f004dbebce22c0000dd8 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/JNFrame2/Assets/Plugins/SHFrame/Runtime/SHGame.meta b/JNFrame2/Assets/HotMain/SHGame.meta similarity index 100% rename from JNFrame2/Assets/Plugins/SHFrame/Runtime/SHGame.meta rename to JNFrame2/Assets/HotMain/SHGame.meta diff --git a/JNFrame2/Assets/Plugins/SHFrame/Runtime/SHGame/Procedure.meta b/JNFrame2/Assets/HotMain/SHGame/Procedure.meta similarity index 100% rename from JNFrame2/Assets/Plugins/SHFrame/Runtime/SHGame/Procedure.meta rename to JNFrame2/Assets/HotMain/SHGame/Procedure.meta diff --git a/JNFrame2/Assets/Plugins/SHFrame/Runtime/SHGame/Procedure/ProcedureInitPackage.cs b/JNFrame2/Assets/HotMain/SHGame/Procedure/ProcedureInitPackage.cs similarity index 60% rename from JNFrame2/Assets/Plugins/SHFrame/Runtime/SHGame/Procedure/ProcedureInitPackage.cs rename to JNFrame2/Assets/HotMain/SHGame/Procedure/ProcedureInitPackage.cs index c5358fc5..569cc38e 100644 --- a/JNFrame2/Assets/Plugins/SHFrame/Runtime/SHGame/Procedure/ProcedureInitPackage.cs +++ b/JNFrame2/Assets/HotMain/SHGame/Procedure/ProcedureInitPackage.cs @@ -19,7 +19,21 @@ namespace Plugins.SHFrame.SHGame.Procedure public static string RawFilePackageName = "RawFilePackage"; public static string DefaultPackageName = "DefaultPackage"; - protected internal override void OnEnter(IFsmprocedureOwner) + + //热更新的dll名称 + public static readonly string[] HotDllName = + { + }; + + public static readonly string[] AotMetaAssemblyFiles = + { + "mscorlib.dll", + "System.dll", + "System.Core.dll", + }; + + + protected override void OnEnter(IFsm procedureOwner) { base.OnEnter(procedureOwner); InitPackage(procedureOwner).Forget(); @@ -54,43 +68,34 @@ namespace Plugins.SHFrame.SHGame.Procedure switch (PlayMode) { case EPlayMode.EditorSimulateMode: - Log.Debug($"编辑器模拟模式"); // 编辑器模拟模式 EDefaultBuildPipeline buildPipeline = isRaw ? EDefaultBuildPipeline.RawFileBuildPipeline : EDefaultBuildPipeline.ScriptableBuildPipeline; - var initParametersEditorSimulateMode = new EditorSimulateModeParameters(); - initParametersEditorSimulateMode.EditorFileSystemParameters = - FileSystemParameters.CreateDefaultEditorFileSystemParameters( - EditorSimulateModeHelper.SimulateBuild(buildPipeline, packageName) - ); + var initParametersEditorSimulateMode = new EditorSimulateModeParameters + { + SimulateManifestFilePath = EditorSimulateModeHelper.SimulateBuild(buildPipeline, packageName) + }; initOperation = package.InitializeAsync(initParametersEditorSimulateMode); break; case EPlayMode.OfflinePlayMode: - Log.Debug($"单机模式"); // 单机模式 - var createParameters = new OfflinePlayModeParameters + var initParametersOfflinePlayMode = new OfflinePlayModeParameters { - BuildinFileSystemParameters = FileSystemParameters.CreateDefaultBuildinFileSystemParameters() + DecryptionServices = new FileStreamDecryption() }; - initOperation = package.InitializeAsync(createParameters); + initOperation = package.InitializeAsync(initParametersOfflinePlayMode); break; case EPlayMode.HostPlayMode: - Log.Debug($"在线模式"); - //联机运行模式 - string defaultHostServer = "http://127.0.0.1/CDN/Android/v1.0"; - string fallbackHostServer = "http://127.0.0.1/CDN/Android/v1.0"; - IRemoteServices remoteServices = new RemoteServices(defaultHostServer, fallbackHostServer); - var cacheFileSystem = FileSystemParameters.CreateDefaultCacheFileSystemParameters(remoteServices); - var buildinFileSystem = FileSystemParameters.CreateDefaultBuildinFileSystemParameters(); - - var initParameters = new HostPlayModeParameters(); - initParameters.BuildinFileSystemParameters = buildinFileSystem; - initParameters.CacheFileSystemParameters = cacheFileSystem; - initOperation = package.InitializeAsync(initParameters); + // //联机运行模式 + // var initParametersHostPlayMode = new HostPlayModeParameters + // { + // BuildinQueryServices = new GameQueryServices(), + // RemoteServices = new RemoteServices(GetHostServerURL(packageName), GetHostServerURL(packageName)) + // }; + // initOperation = package.InitializeAsync(initParametersHostPlayMode); break; } - Log.Debug($"执行初始化"); - await initOperation; + await initOperation.ToUniTask(); return package; } diff --git a/JNFrame2/Assets/Plugins/SHFrame/Runtime/SHGame/Procedure/ProcedureInitPackage.cs.meta b/JNFrame2/Assets/HotMain/SHGame/Procedure/ProcedureInitPackage.cs.meta similarity index 100% rename from JNFrame2/Assets/Plugins/SHFrame/Runtime/SHGame/Procedure/ProcedureInitPackage.cs.meta rename to JNFrame2/Assets/HotMain/SHGame/Procedure/ProcedureInitPackage.cs.meta diff --git a/JNFrame2/Assets/HotMain/SHGame/Procedure/ProcedureLoadLauncher.cs b/JNFrame2/Assets/HotMain/SHGame/Procedure/ProcedureLoadLauncher.cs new file mode 100644 index 00000000..2aec69c4 --- /dev/null +++ b/JNFrame2/Assets/HotMain/SHGame/Procedure/ProcedureLoadLauncher.cs @@ -0,0 +1,53 @@ +using System; +using System.Linq; +using System.Reflection; +using Cysharp.Threading.Tasks; +using HybridCLR; +using Plugins.SHFrame.SHGame.Procedure; +using SHFrame; +using SHFrame.FSM; +using YooAsset; + +namespace HotMain.SHGame.Procedure +{ + public class ProcedureLoadLauncher : ProcedureBase + { + private static Assembly _launcherAss; + + protected override void OnEnter(IFsm procedureOwner) + { + base.OnEnter(procedureOwner); + CreatePackageDownloader(procedureOwner).Forget(); + } + + private async UniTask CreatePackageDownloader(IFsm procedureOwner) + { + // 打包时内置在包体内的资源 直接先使用包体资源,实例化 登录加载界面后,再去检查是否需要下载更新 + //加载AOT + await LoadMetadataForAOTAssemblies(); + } + + + /// + /// 为aot assembly加载原始metadata, 这个代码放aot或者热更新都行。 + /// 一旦加载后,如果AOT泛型函数对应native实现不存在,则自动替换为解释模式执行 + /// + private async UniTask LoadMetadataForAOTAssemblies() + { + var package = YooAssets.GetPackage(ProcedureInitializePackage.RawFilePackageName); + + Log.Debug("加载AOT泛型dll数据"); + // 注意,补充元数据是给AOT dll补充元数据,而不是给热更新dll补充元数据。 + // 热更新dll不缺元数据,不需要补充,如果调用LoadMetadataForAOTAssembly会返回错误 + var mode = HomologousImageMode.SuperSet; + foreach (var aotDllName in ProcedureInitializePackage.AotMetaAssemblyFiles) + { + var handle = package.LoadRawFileSync(aotDllName); + await handle.ToUniTask(); + // 加载assembly对应的dll,会自动为它hook。一旦aot泛型函数的native函数不存在,用解释器版本代码 + var err = RuntimeApi.LoadMetadataForAOTAssembly(handle.GetRawFileData(), mode); + Log.Debug($"LoadMetadataForAOTAssembly:{aotDllName}. mode:{mode} ret:{err}"); + } + } + } +} \ No newline at end of file diff --git a/JNFrame2/Assets/HotMain/SHGame/Procedure/ProcedureLoadLauncher.cs.meta b/JNFrame2/Assets/HotMain/SHGame/Procedure/ProcedureLoadLauncher.cs.meta new file mode 100644 index 00000000..9e361bbe --- /dev/null +++ b/JNFrame2/Assets/HotMain/SHGame/Procedure/ProcedureLoadLauncher.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 7b77504dd9e24ad49ebed9a8def0fe26 +timeCreated: 1728926184 \ No newline at end of file diff --git a/JNFrame2/Assets/Plugins/SHFrame/Runtime/SHGame/Procedure/ProcedureUpdatePackageManifest.cs b/JNFrame2/Assets/HotMain/SHGame/Procedure/ProcedureUpdatePackageManifest.cs similarity index 92% rename from JNFrame2/Assets/Plugins/SHFrame/Runtime/SHGame/Procedure/ProcedureUpdatePackageManifest.cs rename to JNFrame2/Assets/HotMain/SHGame/Procedure/ProcedureUpdatePackageManifest.cs index 463abdcf..74be904a 100644 --- a/JNFrame2/Assets/Plugins/SHFrame/Runtime/SHGame/Procedure/ProcedureUpdatePackageManifest.cs +++ b/JNFrame2/Assets/HotMain/SHGame/Procedure/ProcedureUpdatePackageManifest.cs @@ -10,7 +10,7 @@ namespace Plugins.SHFrame.SHGame.Procedure /// public class ProcedureUpdatePackageManifest : ProcedureBase { - protected internal override void OnEnter(IFsmprocedureOwner) + protected override void OnEnter(IFsm procedureOwner) { base.OnEnter(procedureOwner); UpdateManifest(procedureOwner).Forget(); @@ -38,7 +38,7 @@ namespace Plugins.SHFrame.SHGame.Procedure ResourcePackage package = YooAssets.GetPackage(packageName); //2.获取资源版本 - RequestPackageVersionOperation updateVerOperation = package.RequestPackageVersionAsync(false); + UpdatePackageVersionOperation updateVerOperation = package.UpdatePackageVersionAsync(false); await updateVerOperation.ToUniTask(); // TODO 如果初始化失败弹出提示界面 diff --git a/JNFrame2/Assets/Plugins/SHFrame/Runtime/SHGame/Procedure/ProcedureUpdatePackageManifest.cs.meta b/JNFrame2/Assets/HotMain/SHGame/Procedure/ProcedureUpdatePackageManifest.cs.meta similarity index 100% rename from JNFrame2/Assets/Plugins/SHFrame/Runtime/SHGame/Procedure/ProcedureUpdatePackageManifest.cs.meta rename to JNFrame2/Assets/HotMain/SHGame/Procedure/ProcedureUpdatePackageManifest.cs.meta diff --git a/JNFrame2/Assets/Plugins/SHFrame/Runtime/SHGame/Procedure/ProcedureUpdatePackageVersion.cs b/JNFrame2/Assets/HotMain/SHGame/Procedure/ProcedureUpdatePackageVersion.cs similarity index 80% rename from JNFrame2/Assets/Plugins/SHFrame/Runtime/SHGame/Procedure/ProcedureUpdatePackageVersion.cs rename to JNFrame2/Assets/HotMain/SHGame/Procedure/ProcedureUpdatePackageVersion.cs index b7ff1cbe..bba8de9e 100644 --- a/JNFrame2/Assets/Plugins/SHFrame/Runtime/SHGame/Procedure/ProcedureUpdatePackageVersion.cs +++ b/JNFrame2/Assets/HotMain/SHGame/Procedure/ProcedureUpdatePackageVersion.cs @@ -1,4 +1,5 @@ using Cysharp.Threading.Tasks; +using HotMain.SHGame.Procedure; using SHFrame; using SHFrame.FSM; using YooAsset; @@ -10,7 +11,7 @@ namespace Plugins.SHFrame.SHGame.Procedure /// public class ProcedureUpdatePackageVersion : ProcedureBase { - protected internal override void OnEnter(IFsm procedureOwner) + protected override void OnEnter(IFsm procedureOwner) { base.OnEnter(procedureOwner); UpdatePackages(procedureOwner).Forget(); @@ -22,6 +23,9 @@ namespace Plugins.SHFrame.SHGame.Procedure if (!result) return; result = await UpdatePackageVersion(ProcedureInitializePackage.DefaultPackageName); if (!result) return; + + //切换到更新资源版本 + ChangeState (procedureOwner); } @@ -29,7 +33,7 @@ namespace Plugins.SHFrame.SHGame.Procedure { ResourcePackage package = YooAssets.GetPackage(packageName); //2.获取资源版本 - RequestPackageVersionOperation updateVerOperation = package.RequestPackageVersionAsync(false); + UpdatePackageVersionOperation updateVerOperation = package.UpdatePackageVersionAsync(false); await updateVerOperation.ToUniTask(); // TODO 如果初始化失败弹出提示界面 diff --git a/JNFrame2/Assets/Plugins/SHFrame/Runtime/SHGame/Procedure/ProcedureUpdatePackageVersion.cs.meta b/JNFrame2/Assets/HotMain/SHGame/Procedure/ProcedureUpdatePackageVersion.cs.meta similarity index 100% rename from JNFrame2/Assets/Plugins/SHFrame/Runtime/SHGame/Procedure/ProcedureUpdatePackageVersion.cs.meta rename to JNFrame2/Assets/HotMain/SHGame/Procedure/ProcedureUpdatePackageVersion.cs.meta diff --git a/JNFrame2/Assets/Plugins/SHFrame/Runtime/SHGame/YooAsset.meta b/JNFrame2/Assets/HotMain/SHGame/YooAsset.meta similarity index 100% rename from JNFrame2/Assets/Plugins/SHFrame/Runtime/SHGame/YooAsset.meta rename to JNFrame2/Assets/HotMain/SHGame/YooAsset.meta diff --git a/JNFrame2/Assets/Plugins/SHFrame/Runtime/SHGame/YooAsset/YooAssetDefault.cs b/JNFrame2/Assets/HotMain/SHGame/YooAsset/YooAssetDefault.cs similarity index 82% rename from JNFrame2/Assets/Plugins/SHFrame/Runtime/SHGame/YooAsset/YooAssetDefault.cs rename to JNFrame2/Assets/HotMain/SHGame/YooAsset/YooAssetDefault.cs index d2a891ef..171b89ed 100644 --- a/JNFrame2/Assets/Plugins/SHFrame/Runtime/SHGame/YooAsset/YooAssetDefault.cs +++ b/JNFrame2/Assets/HotMain/SHGame/YooAsset/YooAssetDefault.cs @@ -67,7 +67,7 @@ namespace Plugins.SHFrame.SHGame.YooAsset { BundleStream bundleStream = new BundleStream(fileInfo.FileLoadPath, FileMode.Open, FileAccess.Read, FileShare.Read); managedStream = bundleStream; - return AssetBundle.LoadFromStream(bundleStream, fileInfo.FileLoadCRC, GetManagedReadBufferSize()); + return AssetBundle.LoadFromStream(bundleStream, fileInfo.ConentCRC, GetManagedReadBufferSize()); } /// @@ -78,23 +78,7 @@ namespace Plugins.SHFrame.SHGame.YooAsset { BundleStream bundleStream = new BundleStream(fileInfo.FileLoadPath, FileMode.Open, FileAccess.Read, FileShare.Read); managedStream = bundleStream; - return AssetBundle.LoadFromStreamAsync(bundleStream, fileInfo.FileLoadCRC, GetManagedReadBufferSize()); - } - - /// - /// 获取解密的字节数据 - /// - byte[] IDecryptionServices.ReadFileData(DecryptFileInfo fileInfo) - { - throw new System.NotImplementedException(); - } - - ///- /// 获取解密的文本数据 - /// - string IDecryptionServices.ReadFileText(DecryptFileInfo fileInfo) - { - throw new System.NotImplementedException(); + return AssetBundle.LoadFromStreamAsync(bundleStream, fileInfo.ConentCRC, GetManagedReadBufferSize()); } private static uint GetManagedReadBufferSize() diff --git a/JNFrame2/Assets/Plugins/SHFrame/Runtime/SHGame/YooAsset/YooAssetDefault.cs.meta b/JNFrame2/Assets/HotMain/SHGame/YooAsset/YooAssetDefault.cs.meta similarity index 100% rename from JNFrame2/Assets/Plugins/SHFrame/Runtime/SHGame/YooAsset/YooAssetDefault.cs.meta rename to JNFrame2/Assets/HotMain/SHGame/YooAsset/YooAssetDefault.cs.meta diff --git a/JNFrame2/Assets/Plugins/SHFrame/Editor/Inspector/ProcedureModuleInspector.cs b/JNFrame2/Assets/Plugins/SHFrame/Editor/Inspector/ProcedureModuleInspector.cs index bb6eea19..855c19b9 100644 --- a/JNFrame2/Assets/Plugins/SHFrame/Editor/Inspector/ProcedureModuleInspector.cs +++ b/JNFrame2/Assets/Plugins/SHFrame/Editor/Inspector/ProcedureModuleInspector.cs @@ -30,7 +30,14 @@ namespace SHFrame.Editor } else if (EditorApplication.isPlaying) { - EditorGUILayout.LabelField("Current Procedure", t.CurrentProcedure == null ? "None" : t.CurrentProcedure.GetType().ToString()); + try + { + EditorGUILayout.LabelField("Current Procedure", t.CurrentProcedure == null ? "None" : t.CurrentProcedure.GetType().ToString()); + } + catch + { + // ignored + } } EditorGUI.BeginDisabledGroup(EditorApplication.isPlayingOrWillChangePlaymode); diff --git a/JNFrame2/Assets/Plugins/SHFrame/Editor/Misc/Type.cs b/JNFrame2/Assets/Plugins/SHFrame/Editor/Misc/Type.cs index bf8ba1bf..3a7fd7db 100644 --- a/JNFrame2/Assets/Plugins/SHFrame/Editor/Misc/Type.cs +++ b/JNFrame2/Assets/Plugins/SHFrame/Editor/Misc/Type.cs @@ -17,13 +17,13 @@ namespace SHFrame.Editor { private static readonly string[] RuntimeAssemblyNames = { - "SHFrame", + "Assembly-CSharp", "SHFrame.Runtime", }; private static readonly string[] RuntimeOrEditorAssemblyNames = { - "SHFrame", + "Assembly-CSharp", "SHFrame.Runtime", }; diff --git a/JNFrame2/Assets/Resources/yoo/DefaultPackage/BuildinCatalog.asset b/JNFrame2/Assets/Resources/yoo/DefaultPackage/BuildinCatalog.asset index 5c53ab21..ee1556c7 100644 --- a/JNFrame2/Assets/Resources/yoo/DefaultPackage/BuildinCatalog.asset +++ b/JNFrame2/Assets/Resources/yoo/DefaultPackage/BuildinCatalog.asset @@ -13,9 +13,7 @@ MonoBehaviour: m_Name: BuildinCatalog m_EditorClassIdentifier: PackageName: DefaultPackage - PackageVersion: 2024-10-14-1193 + PackageVersion: 2024-10-15-121 Wrappers: - - BundleGUID: 6e7621677213f3254dc11b107c126e0a - FileName: 6e7621677213f3254dc11b107c126e0a.bundle - - BundleGUID: e9c321218523545e7d9d80824c77a138 - FileName: e9c321218523545e7d9d80824c77a138.bundle + - BundleGUID: 749c4a9a7fd617e9eacedb8d88c3e174 + FileName: 749c4a9a7fd617e9eacedb8d88c3e174.bundle diff --git a/JNFrame2/Assets/Resources/yoo/RawFilePackage/BuildinCatalog.asset b/JNFrame2/Assets/Resources/yoo/RawFilePackage/BuildinCatalog.asset index 319374c8..e6bfe359 100644 --- a/JNFrame2/Assets/Resources/yoo/RawFilePackage/BuildinCatalog.asset +++ b/JNFrame2/Assets/Resources/yoo/RawFilePackage/BuildinCatalog.asset @@ -13,13 +13,13 @@ MonoBehaviour: m_Name: BuildinCatalog m_EditorClassIdentifier: PackageName: RawFilePackage - PackageVersion: 2024-10-14-1193 + PackageVersion: 2024-10-15-121 Wrappers: - - BundleGUID: 3323855830799371855418d404b9d19f - FileName: 3323855830799371855418d404b9d19f.rawfile - - BundleGUID: 570a7c285a3c681be978ebe1bef253e6 - FileName: 570a7c285a3c681be978ebe1bef253e6.rawfile - - BundleGUID: 75298c75d0f841401337a076fd57bf8f - FileName: 75298c75d0f841401337a076fd57bf8f.rawfile - - BundleGUID: 8f404b79586ad99c09110638a80237f4 - FileName: 8f404b79586ad99c09110638a80237f4.rawfile + - BundleGUID: 20cb526248ed8fbc2a222e07849f4c64 + FileName: 20cb526248ed8fbc2a222e07849f4c64.rawfile + - BundleGUID: 35a3cb8929f188fd948a376f07dc7189 + FileName: 35a3cb8929f188fd948a376f07dc7189.rawfile + - BundleGUID: 4e1f435ea2f1bfd9b23da97f5b2e2e63 + FileName: 4e1f435ea2f1bfd9b23da97f5b2e2e63.rawfile + - BundleGUID: 79fed19d1f8259b979898e24fa6f6bfb + FileName: 79fed19d1f8259b979898e24fa6f6bfb.rawfile diff --git a/JNFrame2/Assets/StreamingAssets/yoo/DefaultPackage/6e7621677213f3254dc11b107c126e0a.bundle b/JNFrame2/Assets/StreamingAssets/yoo/DefaultPackage/6e7621677213f3254dc11b107c126e0a.bundle deleted file mode 100644 index b3ed8ba8ad558e88d2ae6fbb3e9c01e65ac8c5ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3875 zcmYjU32+qGnf~7E?wRhHp0jn#NK8*#<`6PSql?4g7#(1gzmK=u~V~n6kb{#tokY!oH`q&LAuj376Z-uBPj#CLvvK!;zV3s1XA+_r*S4u>2oOn&x zzp-~KUG@L}_g=sLyWfAl-j+=l$Jh3OF1fvNtZ@u2v6hy`*2d<6W_yw@-`&JIh;{+I z%bxj*O9#Wt3|ROH;C&i`7cz}%FcX5<)zP^)X~nEWqB#+3ZBJSQOIwyNiJ42=QZ0#r zrO9Q@vHyF=|7)xweN|O%)Xm!`H>?v-I?D|BSp^o9WCI1x=u=9~ zark)!LU98(A>bNK)zVUtGzk@O87OV0sl7zI5fKdpSR5MWV6Q|g{Fp@F5fP<82oZ;Y zhd3tb;W`z320jB!yT?G3UM6a71QZ*rBtU9KZ7l(}4K@)_ZLouY#|9<=uMPGRAU&d1 zAmF#bqXYsrI7A?5gC_}SHuxri3L892pwb2}8qli@&dNOSszZp~zFloVndYuC_lItv zDULFCXkn50%3O-n7~mynua^+5EkTXWv021sdWm%Xg65<4$gtU6#A@pd%+?O?Su %}9z7^6 NV4OBts|-?^&D9SUuf;=FMhtNI~;@bKECf+-eSz6?zIC$zpon79Py+#B6Z; zp_5x87q7puIpN;)bNAJ2qx!BF8=CWnUpu?w?STp99(6=wmmR*>oob?uwziLP&Jx_+ zEy*dT&M92qW12F>B7z;}2c-oMu-Bb69kkyeTK(T8M5F|Bl@M@LAX+NHVejA7$)obK zvKm!v<|0;0LG8W9f@qNNrZB_)t}6DOUtK>x_w0@Aj{Y;J$G?y2rpGzXvD#38`OdL$ z)P0Vr(Ta1F;Ts%Uy(Z}5Gfe4+F5MC8Iri8Ft1v`%DBj?z!Fqdpi}@9Gh_50O$Y8Aq z{&fqRbsW30XYJt|JMaI=cNcH!?8zUym+btz*C4hq-&xlaxFBij1t}_B5LLgU621$f z9C1FyQUb >wF **~um(Q*k+eSVy=X^4iP zFE9l1LZp70_Cs=EndCI|hH0?(W$k$?dG}0;{HRa+;Uv=+O)_RcyKF#TY=HHP+Ko7i zHpa=bP5q)8joGZ(W-T^rwOJc6y}eCDgfuengkprDdtjmJzF6ZUFzPK2+=+&89Ne zA 0)oY^4X%9&RY59Nc3a}au{jH)}Cz28uOsPFa3xGlN!U%oL#i2 zL&eCJ(QGk2Y*9v<#dIQ_p*9%z2on==njnHDb||*(4P$xBE(8F>g_!N%bYItn~_J zg*9U%nRGH;>^6%gWngZ!_+7-;X3W7=U~Rw`yscINn_bB98MgKG^^Y4b)?V7t@$`0F zp11XusO`FoH5G*w?gzVnL$S6jz$cWj5l7u=l!M}g;-!c><)Oe~7#1DdWEzL-PkCyL zNpw-cX!uZyDwAXtm(AQZQ|*#`?;Hd?&xk&9ThvPiixN_Ge+leENxScy7z~{9`Ob-s zVDM8J(ZH7q__s?+g!)8S?B{mODI}`;IqQeEB~BsNE>eHcL-q~Sh7I_xczG$8G&5Ur zMe`4VgBZg&9>K#QboAy5=@0}zn){OGJ3^^zD4j{=t?U+bQn9i`U$A icz6*_asqR;|>qny>Nrri6u2&y=9*Ra1h}>Qp}V>ZtK)(Ga{Jd#N626iJni z-XK-u>Qz%!wtcF4r>gLK)k8BD&Cph>M?bw&J@J`5^_l$VsVcdHiL*-h^(n#ICx_o5 zaXz4ZaGvS@K9?P>pBQKiP(e@pmaMF?72uj0nbgI)1`5eLO?Cbv>Ie3V=Qpw`!3J8) zfSsRw5?ae7qSdxLLN*KAtcI9gI|-&s-MtK$s)`!AB>N*|NRnawQHgd|y+)TJQQHS) zAz+LJyt7_Hk-P5nlil=Kh7zsr&mxQSy8XnWciZj!C?(fih-|-9cbv@;^m+Rwr3`(( z6|lvE@*N+3s~>v(TOM*=bYVYzOG7_cT+&|chgVZwG`q;2U2M-nd#l768_58D1{vT+ zKa-bhGTCL;z?@jC8waq310G&Rw7Eo?+)}1TTWNFs&=!!YHc}OBC)T(GYc&6sIc`0F zpT?haPnv~d-;kNgJzU7U2dt!(-e(0c-94T)httVT$z*0UWeqz0ecx~flXbvKupKZq z de}WZ-2pg!;7zqkLuGSE zDz!p6U}m<{VaXb+_xKCd9wVE12=!Jr4E_fX?^I@(Gd6o_=A+}OH@{Z6cJ|#$_van8 zFK?@?Sp6{fbt* oOY{3&Lb-MH~cPeyD4ISxJn&PDcE{E=YG|b{2?c{Fw;F0uy zfQRmD&l#T`Lth{eEPF)lpGuT5C5nd%n^h94r7ZdT&fHj6E|W>84u_nn-l6eAIvEzL zSIragRevD+If R)5XGspIplnh&Kf1TVk=Nur;3^9Q>ocd0#qZ6}}J%B<}-T z5n$gF@iVEF4oV-X!eRH*Cte8s^2+t)-`w$YXk8LNcxxlS^~bMvoc#^v?m!HwTWK8G z_8+Ge&G?#d@WczpC&%s|nK{NQL)Su_QOA;@ou6=?Iq||bvLEd|#*gz5wBB)n^nUQl zzklh6uK%L($%pK5%joY0)6v5l#mep&3X5Oq`NzGnUxdI{I}yU6{U^@1Kk`?y7(=!5 zNr=-3ahD*^QD?pD(}}#9A8#79|GbQpHDHcribmcl zVlgY#(%!l(nOL?o)ohw=OPX5}7O_~YWgdcR0=UI5_GAl1liC^uZ0ERJV+`u| zBfdpYaGO29E?4X`hetA2p;8iuST%l0bew266W{c$>l#g1&&cA}nVMk@K#@}+2wZu* zihsUBu-IdCync}KZqH4vudrt*S9C%AGT93UM)I_SL}TKd=5W=>m)U{!K6m{abw7Gi zMWTAa(zibFs~CFV=sSC_?Dz`gtK9nu__w)NX7VD&e-GJUG956y)q#$mqN|BM(nX!; z5=eEh_Y(M3@MRD$L#B%LlZY?Qnl!dcU7a)&U*|!c9ft2&h>fMyesB>wD{^-)gnB-~ zX!AsT4E$(7Tn}|O93iI8FdxHmc?I{)(8+Zf9KBqpA3o(UhewubxI>*wZAA9Y;W`eY H7xwkP>`Hov diff --git a/JNFrame2/Assets/StreamingAssets/yoo/DefaultPackage/e9c321218523545e7d9d80824c77a138.bundle b/JNFrame2/Assets/StreamingAssets/yoo/DefaultPackage/749c4a9a7fd617e9eacedb8d88c3e174.bundle similarity index 54% rename from JNFrame2/Assets/StreamingAssets/yoo/DefaultPackage/e9c321218523545e7d9d80824c77a138.bundle rename to JNFrame2/Assets/StreamingAssets/yoo/DefaultPackage/749c4a9a7fd617e9eacedb8d88c3e174.bundle index 95620e41802957257bf1fa6c625d2ee15b999f14..43156942e51897ed0ad7bc0eeaccb5d61c0bca4d 100644 GIT binary patch delta 10052 zcmX|n3wRS%+W&jboJl6hBs0mRP1>}XkfbH_-cq34djnc6w6?WWsJ3Yv+G=kmDHdf- zRH~>b=pdq^RzyXYRo0@*`mx$oM0UmfSXWoqk5$%1ML%}`;i9rD+W(unetDkro_EgN z&b;^YJ9+L)diJk$TY7Bny5g>4`0@ArS?n*v76PDE{~4U_+(4j+0@cIho$G-E$jJln z|F02pfMf%tL&6EHs-iMK)Y&zssHm)@Z1(KACEc^v70+K+7MeGAUT5e0b@NM0%Kr1v zRD51asu7CYNXPF4D4{udGNc4ukbsh+l9Gbi1;sy3Ov!`>Bi Gl${UZ=Ni?jV0M_nAm8D7QN!RUeb z6*zP)wl>IQ9 263wsGIbufp29fZ>=l6~K=J@lay_659$-o- zGKM6x7#VylQ 1Iawv$5CCOZi3_ge{5oF{fvk@6 Kcjm4Gq?ZyF+0Z zXm1D)4Tr+fzEGql80m%14bf0!ZPC>Ruoq)1!8RLPDYiM-=3<*?(B!g=Sc1;E8t<>_ z4@M%Zf&(Gs^-vxe4t9xfOGP9S8tClb-~#SJ25lrkuKa&j2}gQ6T4UOS_kF#i;d3J` zUyFLN@r6;YlQ(Il6yobq+2RrEs`!)&lrNy*fu;h~lHpaB$$6lgz-M^X!0+LM+Ww z4&Eog%d<{?T7iBPC2E!_*~sXVOuz#fs8UpY6+R{B2c{avQ69!5F(rwZ6xM qm`tw4(dit z8n8?4priwo#&V)K4%4K@+|J|~aHXM@4zw@t>krjdFJQ&NXs-db)eUt8`x}R%!B(~j zMqvZo2sb#PqG2e~=LAlMh9*28`Xe{o+t=S64h=R!Q!pCq4TWPsMp3l4|9#cLf3C0G zf9H2QfA?YLU-lm%O8q}+!9IAE6JI3?yh?23Rf0BYFa#>fJz((|aw<@^&_dX&BS ceqhKB}2gHbR-s3F)FhAt;aw^BMI zxZxe$yUoEKG@{x_MOU ^FQ$@Y_KO zo9 Rx2ZO(&?^g@I+8UeQ!~P_-5|7$xBJnMFyty_+;I$Y7bp7^qC=EMDy* zy~ADb-$b+sajN_!PSwgd71b&v?&>&YB{niK&gC 3} $b5Sy)aNSjL7mhALLLtjMij6M-7>r~6zN67|2HSr5Yj`y ziy0|KKmaluY$+uqL65-Bed~7L-S8YA{~zmXWXpBMnW-e2Z=W}IPX_Q}8p%qPi5>LM zWr|OU9tv5aDm*3X6fP|dy (I;at8d6K%}GaDL-yZ9tA#A#s(EOVL)XHV18BrTW& z 2o PR~Fu zsvRD^SP%q{KD(KG=2kn$1?C${KK*YMxv^t5@`@z#5`V43Vv(v_g8h9nta8L_%N<;A z1G(--d+9)Mc$@55HaK50pOi_5^Ua}=&i+tSUw5c`MQx8v=g37@jD%iFZHk8b275lY z+q%gs o;-X>vgq*@kh@MKUy@z) x^;PpZKB*L+q|QN7 zFc;>f((`&LBCztRU?h58Uo><>WYD!P)D`MmAF{%!>J5XzfmmNxeOFiiNO!1M_4ajn z0Tu&k1<%T%uRQc(I{%Ci!~(A~bmdwntby`%{h_XGFgk#LJB{3#$y*^c^qVxi2VMu* zC&+cTrIWeo{(<%nprIk$Hx&LZQ|C4?o68^r_crJq;A!r= GzqJhY zj|_zB*N4JkbjK5!{&3Vxa%-!tpp(E;AMQ08GMwcV-Q9hgh&R~3!`+Ea8VU~78p-?a zKxi-xtAHwMySLJipbvi3zI^kkHLH&v$gi)g4L`VGbf*5lK9g2B?^NFJ^^;@EB)wTI z)InahsXz~UvtvW2&XhY-_l1Sq1%(D2=M?`UC^RNH_&2kxa9U7LVo$25nv=wmB+?4Z z8*-9Zkrc#i@RnJb|AnI1D-BX!Hp#AnN(06=`l*ps8j>~CBvIOKHo8++*bS4!?a)tm z&PhThLFwFuwL_;qX>I9PAYz9V19muTB1}SN<~XErIO?7R(rNMy!m(wRN)z!=-xwSl zlg4RGL?frhacZeF7*BGlPw!;D2k|l~j+T`5g)FMsdZ(z)Op-v7%tAtOie8KFX*l+o z^h`Q)yn%D4X5#xW`Ovr0nR;r4Q>W4ucscifge5sXNpwFE<69(MyJv|SV?sx$e<;}9 ze7DuI-#};jJEOtA!BBWUkRHJ{JO}7E0%r!&?U#c-AP0omeS;MuoTH5+gVDZ$P_i%# zM*BMZ`WG7XcYyReFM;R%)Gpi@>Tc=^4TgRN@nxgK{e4}1Q8lNlF1TT6BzgeYUK=R| zm> v5s+j5S|{XRM;z@Ql@Phm6#8huqYQW$;&VkoI|a74~^V)v(Va2+IsAHatiYBN7(| zOUqr9-)v1_q>kx}&Oes;c4zk=?~8o=^S`B-9QR*kN;lG ~NcOtPSTHjYctq> B6 z5aJ+LO5|m;97&`?S3cD77)OW!*bnBI{vVe6Ya`9!zMh^?c%kKr_2|tJw=SzI8pzTVSrv6B>M0QXq$D+>vii|NJ+vZEO8K-kP%Mt?=rzpPm?-_!O82v=ei)YA>t!=B2$d zC{_1z+i%+QD>Fa#!l6U}Y?HThyI+3d_C?l~UmrRCTPOIcVejet|9byBf!M$Q{NK*k zonUu9Ol~{Vv>sl5=5&!0ya9GExBK$1)_l77UpM@-^@tOc*`uI+>UA$=j=FEQIU!}& zV;sd&wCF7XyxYkR?xiC~UC+IGaln1_C>$oT;OyMdxb3s}xYKj`=w5IbYJkbaFm*ww zO7%8|M)Qjzg(KfNV;{74j`a0M`v%)XqtS4YOW2VbuIuXz2g4hR!RzUMy4ddt*Mb38 zlD12iQ%9cMccjp^;Y~duAm-|&JTS<{Pu$+2s56i20@g;1c2*EyDg$M}?1Y^lLN>S= zmceI;1NLK!5>^H^RU@4tn<1vSju9%S 2B-acxC^XQ+E< zFNg$Weov3wD;LuaYSqW#ijnBhx^+by*-@-`tYCcMn~bGpge}!~w6EwNibP(|wMOD3 z*fcOS6z!Ejg=(;-SgN69WpKE{H4Ee#P&|QD5bD4kuLCY>No}7GT!o7*ETU11z7=dy z5BNP@Gl0div_Dp*XZVU|RTGH-&z7g#+iQS3K=cyi0{65-)O6LJS)yW%AoAn@hX=dE z@KEzmPfvfSe%-nYAXanSo)-Q%N!=i(XjfL}WqnxRITRiU_Is`-`Xd5UM|qSte$IMv64w3ZGkkhpEXv8 zFnEp5)n+fto>f|36%K8nI}BU{(5+M_@zP1^cFT1jou=7jkFN2`mZnfwv!dOytT=T> z8aE2w_5m|+i$Ep)yxHFLc$s!|nSa4xnU!I3x$%ZkusWz^#s%{2+MMWReJ{PT_9pv^ zr_TNIvfCuZyO%WhQS6;s8n>4to4xkBr{-z1md|j?%a4?D9+o0ILANtavFxG538v4} zwd -uBsheuU<^W1M)a{n}?nU`h%L18bCx)fLDzj z+M*SHeKEe{po`ObSL8}wzpU4C8|xcaS2X6^L~Zwq1@wYl`*=l$|EmiAkezpeZJ9~u zl r73{gZ+`vA&LIUPo7&$;)c%p;o$Wn zp=#sbn`$bm>sL2j+0anm*bE2P6op4Z56=>+o)w$Tx>ua^C^-K9mOVwUZLKM;W9PDI zKNy?Aate%PqJtBOn{IWP1H{L{=4 j?-^OgN3aFK-QEWZliWUGD` zki?g!JHhaHjb^EJ7+qu>cxxd!;nWIivtpK3s=Gf;Y^91d!#Lednx?yQv(!q7Y8}N` zYZ0hResGb{S>T{n*~RwDPN~CgV>KYeiEQ1zR(~bPHvd|jhOD$XEh06nb7jyiej7Ut zxhLrr#KGO{;xec!wG2`mOI%b2mva)FY3|V(HpWEZI4G`DX$*%m&QMq88Omxhgw;#5 zv$eT1oLT5$PpFtk*tc}Uvv+j8a>MeLma<)sG`6IEMM^RSZSiHbv^huHd|6J}g{upn zCyOMSYGnHQit1`uBwd?gezA;}nuJXjHKSQ#zDy{6--Hp=?F1J#_R&I@s{QX}nY6S} zGhW_PxqNW}fqjyT9+g=ei0Ml*odL5k+x$nAGNd33n~8x*&7-RK6x9`!z$uzyeZI_c zQYt7#-eGMk)DB#}q|mZg*0&NRkSJDi4i+nc@nR+axdlq$K}jiEv%p<^ijrY)8BWSB z&t_VX(EN3Um&v4#U4ZM2Bae >EA z*bY3$i6HDVG2hiL31#QHT6=NjEIRKR?XN3c=7ueL0i Z@MjOU#aQcoB#3MD;u|)ITBx`Rj=Af_x@V@cvU8yIih{P$|s+0Heb{9w%=0u z^B3N_^hwWiT2XzF{%O6Y)h{+K9CfW>ptLEY+DG-XXhBrt8`>R@Z;*S=Jk4FcL0LC@ zgM3~5Y3S;Pny0m!8UpgaZ|hum)e~2|uXfE@oc8qEu8E0;78*01nE`)@!GWHc-BuB( zc<1aDSJsMpnh{%4*BA9m{34t9UTyZDt`MPkd=PO<&+Z$({$rd6IEGkV=gk)z_7M@9 z^ly}3azfMACy$?SLg#5Cz)p(8Q@3;+6``|6&ik?f`+(!6Bgb(#Lj~x-ab)v8(b3oqJ6C#hPmR zT|zs*CQk4B)x^l!7&V?0{2*jNwhkt~zq*;y U%*ezF|9E{=~#vH{8ZZLc4t9e0~v}x0X(9-Z-D8H6B;3$8AiN zFWT&??V>G1RW90aw_~mL(aoF9FTNVzL&RpV8N@~BwV~Kj`u$mLf2^ip{G#3aXTAu$ zpBob|)qr%-t`AJUc7kGpX06oQVr~V*))XTiW&miuxSu6Oqg@_vV8SRkw8!JKbf}lJ zD^F|h#IGSMw7gpuGSNlzwCiq}N6)#nJ-6g>Qv|ekZ`n=H@6*=b`ZI=dW7@a3E-E;i z`#Z<_^;T72fAti;s%)~QCCH~sAN$uoZu<0l-`me8i0xzdeNea)&rFqhwf5WMBwssu z+nii1@>I4ry8?#CRBmtf)R+wC=>chr#)}7Sh0E!MGR(tTH=O*;p)K09!kd^Hy~C1a zm!kjhVV;UMgu>O~;0 J;R+mz}a0Jcd{ z$YzDRB+L|SH8vMHv`3Mf^;ilM?t-CEsKlCB)pb}wK%3cXGpNwOaX#VPJ`Og@4mfUc zko`9~Fw-h{%(hHO0pJz7QO4e^aIIIF0Bm 2G&C)zS>m`Qxu` zG_gw?9e}3V46X%!&=%cZ&p=A>+I25_wf(o(GK?yc_WkWE3(xvSFX)Ml!`MuYdkZ;E z6eQ*79=${Gek1ND>Y*(t3@3r%?*w9mCM=(|K%yrqYd&~boR4E+rL?5x(ru=_NUFI zv2*^YtsEwS9n=X&UBaegXcj`$>M~-t$;tu`z#*{j*aO@}>a= c;l^Rd!1o|3;5W z?G|R EX&k?BMxYa6}H%f)ji zlK4;(h`D+oG@OT(Mh#$rG}I6b2L~d}Ko$6Bsksz3Huc>Y!phJhDA1Cn+Dm~f#rhF9 zGvE(y)s6k1r)$vWq595iLtW8h#KBqwwuPxYE@D(NF?HvE6MF7n+VQ*RSOVaHVaRE* z6rrIl(!?$Ge0)i1FKF#sa#z(sAuO#!wQnS*oxnaMLeWBp_4E>mOX=KRiSJ*+_m5+J z>!`#=Ge9^{Y3c`llCakQQD>IPfQXwK5a8?@2Wm!peM?9zX6LhK3bDQWA^2leALDP>EG&^jzU_sy%U! zTYGkOMy?SObWIV4gNDv*p$LX5qS4Tx2hKJs9j8@_(kO&BTu2Xv^FaIXo-5K4I?Ku5 zNJ5^ZFd 2AZ&~ zAeLNBihe*CwB|SSZlA*d$~j>e*HwAa1v9Ve#+NXMWf*$J#EfKZ8d$;nR6LN(k5VAO zOF)SDUVcsse*t$}Miu7P*X2u_%+zVf)At$@Q?;t`gb9ei>C5obI4MtAt@70?iWtVk z6c0S1Ak2-ZV{*%R{W5rdxg%Z!+Oyl-eD7c=64Bn?mK954dV@Vty;<0Zk@nVgl0RTj z$R7;W_M bcWWAAiBUM~a(>a9R>tP3F@Q9x&`oag#$I z0JkM>vf$umVY%4*rZnpO!2WebP)Zym>9$cPw?kM8@KxNIo*<{6Rvd3XbVl3uVAcZs z$kmqZM=f=NO6vsR;jDf +BnEIh9=h3wtZ;d}?pWG;m|ssn z7$BQ8>&_GwxvnXsgIitGN)FQBG1rHU{#2l^t zp<=Zu5BDBA&Zts{nyqpjDpU15qzF9NB|Ds5tnGVfMP1I*=>e=+#&rhqbe~F3_c<}o zQs!bOz=cOHc1jaYfck+x;d5~(08s!Qy%+QD@%!1nKI!legzf2JM^#fbPPX*n06qJe zcFn_!bq=o`gRA!V!?6j^BN0N+HfRs*YEOAC^<=jp6}k-!*HO!hK+3_OrI{WLvb~N( zj&}W{xYwgS|7bq *Hr)ELlVo zaA0Bo&`;PM9#2D8f%sA n!xP?^+*hrTQAn}bA$7xDiY +9)_4g`mX zaUXFDusG2lpiS*7hq^;Dq}hfEcbDSmEe8&Fq`o8##t)uclxBx3rm?k?3Vp?PN2sbd zI5-&U? Fg zDY8duhN2B&R8QyYjE%BQ1b>(X$OWcrVB#Talrg8|!Q=M-Agw63vc~zS(r)0-a|l6Q z7wieO *J&Tv5 y oVt*3(RB`vY2#Ww0A|`AjZu?Q(;Fp|wy=4zV6B+sjyc^*E0}62U!T w! z=gc{CE^{u=<@=nePwDet(UH{Xt%dNP=lJs&-+& 4<2XZ4;}~_5a3W19NCp`=krW7K;L`7BqXaz6Tj+=FW*EgP`sc!Z zY3gtM;H!-BBu3SbVpLliqmovI#8(}oBnE7Jry-9C>RT}=Amcwa-^TG^&n=3L=ga$f zbFme6!wQ9h-#Y#)yNQ_6so*Dylz2aze3e*zw9Rr`K6Zx7|HE7KFPuN&O)-1EI)2zS zGbg$iAkQ49-}|_A*{<_9t~-4^uYT!@{_icCwHTJZV_y&&_Q1QQ6mr?F5IY!#Jko&K zPvNpj69>$K%KgcS^CVt2B^HE^OBoV`ay7VYHWvsmE}8QUm{zx5Hv6Q;JYhVEI|v0v zEa22YITV;+JSuS+c@V0TCqOEY5>*N;*QoUxm9J6d8nq>8eiG8Og)siLKV}a}8oqIA zRU6Uleqb355PHYz2QopFmVJq4Ex3rn1o1jYNh0>SCJ31Twc{Y ^@DK& zeD425o^u4>yxvhr;V{=X0Yp_YdhoX_Z9va)8TUe{TOOs7H_cB|xlp$SsOcQ%&A|W1 z((mDiat!|^69$sZzN`vj98dMl@pGoou;m=2@}XfLs16Y~QO-Fap{Sg31PASd@nmQN z^{r9j%N-@e4;dd~KZ$>7V;ScmbX2Y&l2*{hBrTXAg$YuWAjJt%g2Y$a#*DgGn~&XV z3lgLZiF=_RUalM%2uGF<_H=fK- R;2<>yd5w6#YRnVJm|cFAXBird*)3~$8y(~`vN3HP b#)YK w+a|KZ^zbYx7u_o&piR?;I zXDbBn0^G|6jLZB&BK9qOSb~;`jF_>`U|ZyX6n_Q4g}-Om2o5xH7*sM=V)5%KRUSIl zq%Ww-RLACU876M*xV23rev*+%Fu%8|I8l7KDz6boIl++%lCc15;%Ud-m$8uG%q1q` zI-H1`6U| trSBeFUBm+3zrd4i~CzoP7AqMlPg-C>7Ab+U8Lf_E<}o8E9i zprW`Iw%@$_qs<>Tk4-B8pT1_UIBy}Kx}UJpKLGuOl{15xKu&B41FrIqP!7 z28SxUJHnm4@EPFuQH6hWjk1Z?=qT7w9IYOV^xk@_#YlE*s^12t!{;4KhCv7r#asam z%e#9A27Z)c8~CfWJ+!5_H?m0v4XVMGY^{c(mF;~hoeN4WsD1~Cb>NHD0k_BEXk7@L zN?FiH|B!5GhNOre0{#tYz*bA8pV#yZZpmI5j 8j84IAO}!g8c8BYesgE87<1{2EO_IK? zjp19n!y9Y?efz51tY2T>(c8bJz1x2?QQ_&G)&@eiUROQ1rH`H^Fy*c4?rtAiDe3R7 zn&(`ePUAp^$VmN$4c&tSUA;X;c6h;~tM&8k<<~J8 -Ej=gJ3K)<;@%Q*M? zwEpnLe>sx%J@sDtW~zR)zR>YhfE$AJ)-4v`%0VODyu}{cpQT@}4_v%f?VR-Fe3l z*zEKR2RuA94c^~BkUP=$%U@0Yd!Q{T{1f6-)5nM&z{&4u?;e0Lj@)Rp*FBc0uWm?7 zOJCOSHL6?%WnUQej_}&v?!hf#>tRY W{F7Z2!D4T0*aOwvh`?Ex^{O{!LQ_4r?QSUkYxXR1C-`2qH) zR;}o{UAxtXFXSmmZ|Z#!=zGb@j%-x$#L=q3j JT*`6Yjpd5P+QeM7|#8!SrcMbmMs1?jh+Vek1kMU zk)!&vjfGLw@($2$Fg1boJebNPCnpgfwPaYbNd^bstuuH*;Wsmb0*bIp5}%gf2TSn~ zxk+4dRjdbiZ<*mBkS{(k-w($9^9_#zYXc{D&X%u`Y{=>(Z6H1aA_Io{s&ilJl)wQ4 z9t6}JMKFRM3MEJ7W=hDGA6YTFNPQ|sF7Vl}MOtz*WtwdW`JYv!Zlx=OZA<1Q#Yazq z%9rCVUkz?0MikrqD-3HuNlICf7^*tAR+cDpN-=QTe+;hVyXIfI5kg=MkUCNMgr{ zQ>>ZB{h_n<$CF-e?6KJl`LVYcTYb$c&Tb|poeo2m0n^U`+a$^@Ra*4nrxIt|am zO$F&+w9d=@^41?Xp1l)nZkxWkX$5_=P(Rp|v+%2L6}(8wW$G|7Lw#j+HI&PnRZELV zQr e^kO;WBAa$Fs$O@G1@#)2D3kpyNn}!$Iw@LNw zMX&wNaB%#_PoA1!@+p~@kIG&?7vPzk`rbPR$dD|uos0E-Yg3K13xZYc15Z}#N7v@l z`ybTLuD!0-=O4E4<-}JNBcv^%P!oAbqAI<4k+yV~Nzp8$z>-rAp%&wQYnseIb?|rV zU)o`NG0!k>=ij_nFA$&HkSmwv7U?&yt4(_D04ITX)Xe@-<(84Z{k2N}(Ym=g#u{ x2`0ATcfXNK9Kgr_pNnhg6jq!J5MxLR~D4Z%Xqi?9BB6PGKKx~CY`R& zQ2sop+WzXlzkYVj>0KXvno*jpm#%N8&)%#bSbx3A((1mEf!gxLE&6Bc=Td&NZo0A6 zd0U&Z@$>zhw@tm3Z&SWKxF6Q +f-A==uDBqy X#Nj$PscL4@q_Ws4u!~PUwB%Wg!E-roaJmf zG=9&9TteslM1Q%nn#O;xf72PGJD(lj8jez9gBSqObM&7L<8)IKrK@)9&6{uaI`&Li zf|Mo^R>}1dk_)rkvi8n!Rk$Y-?$ ixVr?>xQ{Dtr2QJVYI_{ZN}$I*X0tQX(CpB^6@|Ha++FfygD+_{kb z>6^>S`0kwxX$n87*(Q^irpzSSwWOIOkEYHfedizXMf#_^c3E~j8#_#-CP*?$g`eyF z_b;KBKGVnVubmfHX6)(j^Fc`e(o_rbjNOnu@%mYc0-rV0^tG1eRe0D;)e9h=tj~QQ zz&^{4SL&-DXkZ_pk*`1dz+9eu^z*4Y{mcWmkX*fZ_jT+IF)r%;yBE;QUj2pLxpXV1 zf4ut;jrZtx4S$z? 6RXK{mGzsJFyXP@g`dtxL@ z|MQ;GIlmM9V_B5|PkJiGvS#m9;2-q3JgoE5iKK#Mbh->BwEj 0e97h<0*eVWHHL@qY4Z{mBRCM1w`m z>2G)@xd{>20m>wRa@%i-cp*5U3ZhY**{eZ|DDiMk^g%YrEh1%pA?H$UATD%@#*3mn zEr>ocEy$-t6Q;>0-nhj-EpTEsI9)+g)}q+-UE-ucE%Jj?n9NWWW5>m$4D*{O9}WJ2 ztKD5hnui^GB_Id)agPM2q=s&%Ft*Pr1X7Ksh+* CZ>>MdOF(2IGo;^&yR60`xS!BpQcEQUy!^J0Xat z-QtdSZq7@K*lq~iy~D<`ABL0Q2`0_hg11zgoH-Xf!J!5&r{6EWo*FzoY?!M#h7CZP zJ+J?LVUo3le`}*g?N(+vD98b8FaK~z4tfdf6dr%6bi)Y)3ag>TDfjb+3}BOn&mNy= zi)DQ)I-#)$xa5j?JbQmER;sLh?z(&XyFt7H^ZK@xs (wB=G zL@l5~(%Vvcya}iZe=D(+z_#qY|1^s#tj*NyB|w&-Y8FJ!_rE^Phw=Nj)lR%aoNTSg zhMC60-SgsGfGX_Irtu%{{{^96XX$r8QfgS03HRqsRp_T4sb{AHS3SDxd-KX(3tZ-d z*Eww$7DG%<<;G;bdokZVYWP{;5~Cgvk1sWM13y7n^C#MzGUca%K!QxI(;xg^*kt|u zhiM}D`<%-@ogOG~|3i37$hAu4OXQ$+SQ93EE~j;D#Z#6=aY0{wz-```K0%iX?Bv2( zS&ts@rR-fO`L!GW?X7L-$Pz~uu2 7F;`ZZn5$JDE{bWF zX6D@)h=bu+(d_I^)(;gU%a!WZ22E2eeiJHPoanhpBQ7(QmEu{+w;=A*?|d|m1xn&n zf8o*1^s=fuA4|7gElIk1wL~qOP7PjhF4|jsPH%c_KgrO)daQ`uS{m1M?eYA=;rvc1 z0MJ6}OJ`^WC-$MCkt jF1OD1oLbG1aPI1tHJ zDOx2j%%LezyS?}dJw^DoIZ0%CH8+uk5+hD_6kp~#v*gGes*w{}X6CA*EwFD#@f8kE z)^gg&d1_Y;x$C)OFiVDyOc_tC;N%hz3%YtrfP)I6c@Y;Od%)(2J01hsrT_6@cIDT6 zlGfJ3?3%fSF{Us`w{RQj#o|lGHY)F6M&=Xc7G`nsEzBoR1HXfQQZf=_q9%OEiDI^4 zN^g21gC+eU-m7nW;%*}8SD$dR4|4JRd7o@FR=C7t*BvX0m*`uctaARkFb+FN{bP@Q zv}E+(Hmm=>&Iv>HjHjPQ-WWJD+-(?felgvNpPb)adt&HZkW?luVzDZk-Q?064`q zU7jfnYh U-W)vP~Y=38b ~g?i(miZ!WO%7xUdOZ46Yhu6MQ-S+>bZ+(2N`{^aW#!MTA zv 9&G?aUTekmgHwz3SDsnPS_1JDogJP>w&=mb+svtf%CIXUxB_@c zetfuqUP{;he7KOa1t#^hXI-RBU-azq%6F?#tr``K(uFRKUg&c1;AieF^ZPLEX6N-U zGgS6v#!}AD__K@RF!>NW+9jX5O4#9z?6g*!hb!{yXS3<0eEpkeuV-nC;(hv}BT+h) zG5+Ht1BAvm==o! l1{v~i57&a# zPE5nFeN$HtqM`!>&4368L4LD`T&4}ZcZB;x-3UzeXP4#&=W^Asqqw+uiRpuk@`I>= zfg&~oA`ro*@K7flTG~Dk_GdRPUphAcKDHnDHnQ%HO$aSTT~y^nxJ=hSXIxd>_FC-= z=l2}>;xUJcKc}jF5c@x1p%xlYLxwe y7%{k@ApsghjzEgJ1jbjkBMvu&V8dEv21Hcr z*CuAKjv8ICq5;6x3BRrH*c{#vY3jX(Z#0o)rw2OLhWjJop`Ea`y+7K%WdOu-ASDT$ zq6+4L !aoW2giygQQsL(^QY=`9hzRJ!7w1Xa^Q}QO@3t|-`VAm=R!*y7^ zSgUM+rwXD~c2ElvvvI#1KxF;5ub{)r1A5(x<+V*K>#J+ZM4DxwqIjq=9PPmsY}(ov z#`5~U_S*)-xczDYeHJA~PDP_sJZe(0cXrl@|EKZ__{>4DG=q51jP|M+1XWPb`u75C z0%tIRPAudSmcOCFWXLmtU$nQ$ki>$--M0nQ*a&Jlpwe@o_U$mH1B-qL&bR{X*T4`F zp xkDG{{*Mw+b|!8w6NL3{^XNprzkN##>uMReh3 zU?<2wdxlbJtjavMs_IRF8(n`>~OEmh!$I&*>7u*-y)4>9;GwPtHJ zm^&qQk?>`ZN+V|GH~YvbVmTnW8<<6dcfc+;nBSNtBgcQQ2+vpi;a6`M?mMvKHM2-H z;}s{<;EL0Oa714S85QCYZJ^jo%;Y6g(=|}9%c%s1AT?Ps)A>-fw5xq!NR|~diE5%^ zmgEvA?=(yT0vEjqT%fsGW={O-?CfuD;SZs9U1p}t@Oo`!b^W@k%1~2HW4YOwY{`Yr z(3*yZ`o^P4^$`TvP=cwn*35=YVvE_S>`#*;W@BQrY1SdLB%Luy?>L+Yhq?GVCzlO5 zqvXm>CTYa18KxZyy8!a2*(eX0OIxpDVnamq*@g(h|GuOlV%={xFoHw2Sr335G>==a zWXRi6WmTFsK{FSpHTA74R)v}>S5>W8wY;@{mCLWE-ZU>7r&Vi~)~u{-Xl<-nRbA7F zCBtxNS^e_Xx)rNxDjRnZP+)CMa|4JHC`G3@ _l<3u>SDI_6=M8AvMch@auFf(oA?a+iyV=DeEgqg7h;t;DL!AN+Grj zD^lY{1VTdua0^4IgaTYdOu^6L!LmrOp$#$mGu8k!BG|A)#xG9f16m!>aR%dTgeTIk z1nd3)Gv5jYivfbzLtE((bi_;1&w@Zu=);8oCCL7yMF7n~2z4T!zaP>0g zTnexayWCU@P?o?!Mps}J33`4qXhQ3azy}Yxw#M+F`~@agThImQ;QYAF{jjgjvhEo2 z$B(NmZ}gENkVl{t) gJ_Y`eS*I|M2;rW)&6v zVAtUIU%%>t^be&qRLOmjB3OD4&f<#D@>ShiDEtzf4Yk1TrZ*W30PB%MBJ$;Ka{+k; zE+=z-8jWX#Ry3`sUj?h`8&_7=K~qh0RegP9HN5b`3-#E_j->=5plyl(g268EkOm_4RzB_|@D;rPHEh{l z|HmYKy@)^81X)gq;w(}>AQ}bTFq+(LjiVIh`js*&NH|!8s)`h)3_6hQbC>)9LNn6) zMTmQg`~j%g2*3isW}spdpl_FUlmQs~(OHwe_TF8%un0D7-vK)|bH|EMz~YxK*l2X| z6R{v9VW)B~kZA8#Wy*Bqfn3B&FVXz3_vHc`11A|nb#@FG564u}fN9JY$BLoRB94JL z2O21TK<9vhp%t~nM4B{kn8{%#h8_+xx!gGrR9WsHZE;@ZaWOf8XLyhTpkgO1a9Ox5 zsxfR@6-uGqrW(dTnh)DG9t)k;1|!&1BlvP}2EQiEfpqlWUdxf@AjnaJ|7wVETnm@E zHo1)P#~JfuI|1HsoHGWFkiMKFsc5N0ABA|T6ZQXfIKzgd7!XDSNy;nY978(FCO(S0 zaw#SR59DlzvESy7APfz>2h>GhUkD=g0-zB+U@F zZ-aDG%r(o!9ciS(3~Q?9V+*G^u8mY `M^_;J2T)|U_9NjppJmnMx|kk4AScTC)j|7W^{YhbM4 zldVDKD4a4@W2&0x@e A99VOTo9eI*VD;FoQt+;W^83po(Y~4oJRzBa(brvZeC1 zT!yrL0@8D0QFP5X%R!PP)%u}DW5Z@z99yyo_us;V9E@0ev4ar8t5c>VKc_81%Y-|H zYMvcz{4rkkSj_c5Td=cqhsEgTcUUyO%z{kzqEx#8838UJ-(UsSP24O_op`8xtOfXs zR_3y53?s44Dn~C`jc#_Z6lU#K?gB5iSgaSV+;Na5QR}6wg`l@bLRtp0hh%0_E}onl zTY~4|3X#rXGv} ;%$C(B#QHes8atW0Cm)^h2nSFH7F+EK3^<_VGq zDoio|&a*^fq^`_g!^N4Fnu|hV$b)>+D)09Yd563lE-hH1kw%%Jz)@`u!XCmug?(31 zDo`}W4#?^hdFbOSS?906wBgpzqA!l_JoHlD@p%p`Nk0MU1=@;$Y|{(@8JS;vJ{OQP z;FzrDA}<*R&3{a0FC%wvYVY5OR?G{{vj03Z%cQ{oA1g&1v>hNF&FF7|J_&AJvj(6; zDUq{yPztcIbk4TvHiDeI23Kc hF%iW$ zRv1rxhtU>1o75s5^vfl5cGk(RsB)0bUX^o;Ed>qGTvD83-Bf(TbN+bUW4K^NPBZ#I zH;V;FxZ@670qykLKS{an$({$EJfQEoyX?jL@$MRTf+`1Gl#3pBXr0F$cFPG$&nL^r z9cIH19O&`TVgXLd=cE8f?nE#cg(lrG x_;XbDaU8u!)0^p-Bj*tqb2u6L z0|~1B^ngPgbD;EafL1i-U``~?H&K`s#Z3&8SV25(Vr864Fp8d3W;iAH0~WWY3-(;d z5_Z_l`A7Ep%?PZR@eE@EgJ=Z>*F&*m@bKtxLBz%U-;8*n 8#+U9_G)d^JoFV6t4Y1MyTq!*AD*1VaYq$;ECS5C|hu(K%6^%`yy?{G0vuO z$2ioMk(l7}w={WD$V_(;o8Vq{o^$i(1k~R&a!~;MUnjXDIE$_b>>?+{1&zi9l%jDV zmBa D` zLw_*89LWBKNo-QcnTxM(GAX!)NkKCVd6{-;$O~*#a3T=Hoy<_glgZ*XqgbAj&_A?v zKQOLEEfAMtLKEUnzgTS&?RF28303psw~2}%offQRg7tz8O-&<|ki4%oWcG($+!;G^ z$5b~Qc4=sqfq2d%+lkRl?L?z(MC1aZ(^Ln1cXG}mXkyy8BEWf2yp-m|{BO$abaGUK z)5&5I8IcOa?G-4YI+J0>DaQ$KIOroY*h+(n`e$4ceRM*!HY99akp)F3IU}mpa*lPU zvMNK2IE#nfs!7~uJg1d-Kq!vA4#RFzLQ)M=MG4;rxEBRbGZyTx)Cmr0*yu7_ z)h6@-t4mA3nR*J`rWO#&?aU#HqcWT3HTNnWoYFM^t`rxG;(Y29>3Y0jW9a8u&;0z` zjZ^<59}YLBm}fTY<0I)&pKUQO_n8IvziJUd;?0+7+KR08je~pl<~-dSZ0{Yrh4k?( z#-nso_s4iy;=QuRnyHrM+1=KY7C4=TJ4-&DMy!1fxs34AaX~I2@ek%0|DDNdi;}8i z#Si5npb_rxYVV#d-t?b~KCB1 >-Qb?dTzOPE9HKWParBaQCOe2xN-s{6^^D7{bxsgDK^7s)_*SZARd(5 zOoRg9>Kq4JtMzY=rbpTDOG;r$k{uea-H-XMHE94n2$R4*$+Gv=dbnX=F=9AQt6Nw0 zb}pHplGI1;OI*6^*%;YW0Vq^pm#y-HXUbEQl7?&dfDXc+5QmBk_J^xBwfFRdyE_Rf zDY<*FyS={_!KBO*$3PRz5A|>GleE~98kW6w&Dv0S!`Y;ztv9agzoisv%%<#Yse8W5 p+D0r*^YO;&_0c6t0CLx?$faIq01mF}ifqD}S+gPn4NCx@{|EL+Ks*2d diff --git a/JNFrame2/Assets/StreamingAssets/yoo/DefaultPackage/6e7621677213f3254dc11b107c126e0a.bundle.meta b/JNFrame2/Assets/StreamingAssets/yoo/DefaultPackage/749c4a9a7fd617e9eacedb8d88c3e174.bundle.meta similarity index 74% rename from JNFrame2/Assets/StreamingAssets/yoo/DefaultPackage/6e7621677213f3254dc11b107c126e0a.bundle.meta rename to JNFrame2/Assets/StreamingAssets/yoo/DefaultPackage/749c4a9a7fd617e9eacedb8d88c3e174.bundle.meta index f2b71875..4b9ddf7d 100644 --- a/JNFrame2/Assets/StreamingAssets/yoo/DefaultPackage/6e7621677213f3254dc11b107c126e0a.bundle.meta +++ b/JNFrame2/Assets/StreamingAssets/yoo/DefaultPackage/749c4a9a7fd617e9eacedb8d88c3e174.bundle.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: d47a2126befc0a541bc52ebd594f4f8d +guid: dd16eaf198793c848b9a014724c43280 DefaultImporter: externalObjects: {} userData: diff --git a/JNFrame2/Assets/StreamingAssets/yoo/DefaultPackage/PackageManifest_DefaultPackage.version b/JNFrame2/Assets/StreamingAssets/yoo/DefaultPackage/PackageManifest_DefaultPackage.version index 5f59d0d7..3088399a 100644 --- a/JNFrame2/Assets/StreamingAssets/yoo/DefaultPackage/PackageManifest_DefaultPackage.version +++ b/JNFrame2/Assets/StreamingAssets/yoo/DefaultPackage/PackageManifest_DefaultPackage.version @@ -1 +1 @@ -2024-10-14-1193 \ No newline at end of file +2024-10-15-131 \ No newline at end of file diff --git a/JNFrame2/Assets/StreamingAssets/yoo/DefaultPackage/PackageManifest_DefaultPackage_2024-10-14-1193.bytes b/JNFrame2/Assets/StreamingAssets/yoo/DefaultPackage/PackageManifest_DefaultPackage_2024-10-14-1193.bytes deleted file mode 100644 index 59ff4803fd0330ec012b4c4d5f28f8597d051e95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 368 zcmZ9FKTpFj5XG-ZNM)fTYehGt2A>_r$p~U#YXlQh<=9sm5hYQa415&60t*rXiI2uc zoj)+(ldPwA@7`~-d4OZ!0Snj+hIa<{rpfD8X9Zn%d12GMrXnxt6mDpzyP{3CdD4%x z0M2;0Mz%)(V Z9%KA_s=Cnq#}-yQXIuja2Z;Im?2XJc|=UlL0G?#Dqbyq z!7%d!aQ>g&m3jN@_S#b8CdkX%&-W52F@ht
eBIzULYzYBToHDMypa1ZHKbN*l9RL6T literal 0 HcmV?d00001 diff --git a/JNFrame2/Assets/StreamingAssets/yoo/DefaultPackage/PackageManifest_DefaultPackage_2024-10-14-1193.hash.meta b/JNFrame2/Assets/StreamingAssets/yoo/DefaultPackage/PackageManifest_DefaultPackage_2024-10-15-131.bytes.meta similarity index 74% rename from JNFrame2/Assets/StreamingAssets/yoo/DefaultPackage/PackageManifest_DefaultPackage_2024-10-14-1193.hash.meta rename to JNFrame2/Assets/StreamingAssets/yoo/DefaultPackage/PackageManifest_DefaultPackage_2024-10-15-131.bytes.meta index 2ad1c5ba..4fb25260 100644 --- a/JNFrame2/Assets/StreamingAssets/yoo/DefaultPackage/PackageManifest_DefaultPackage_2024-10-14-1193.hash.meta +++ b/JNFrame2/Assets/StreamingAssets/yoo/DefaultPackage/PackageManifest_DefaultPackage_2024-10-15-131.bytes.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 8857aada23ad8934bb83dfafaa382841 +guid: 1bc927fe3c11b0e4db2d275b2c6eda4d DefaultImporter: externalObjects: {} userData: diff --git a/JNFrame2/Assets/StreamingAssets/yoo/DefaultPackage/PackageManifest_DefaultPackage_2024-10-15-131.hash b/JNFrame2/Assets/StreamingAssets/yoo/DefaultPackage/PackageManifest_DefaultPackage_2024-10-15-131.hash new file mode 100644 index 00000000..c03c89fc --- /dev/null +++ b/JNFrame2/Assets/StreamingAssets/yoo/DefaultPackage/PackageManifest_DefaultPackage_2024-10-15-131.hash @@ -0,0 +1 @@ +c918b2f39c28747c068427f6499fcc11 \ No newline at end of file diff --git a/JNFrame2/Assets/StreamingAssets/yoo/DefaultPackage/PackageManifest_DefaultPackage_2024-10-14-1193.bytes.meta b/JNFrame2/Assets/StreamingAssets/yoo/DefaultPackage/PackageManifest_DefaultPackage_2024-10-15-131.hash.meta similarity index 74% rename from JNFrame2/Assets/StreamingAssets/yoo/DefaultPackage/PackageManifest_DefaultPackage_2024-10-14-1193.bytes.meta rename to JNFrame2/Assets/StreamingAssets/yoo/DefaultPackage/PackageManifest_DefaultPackage_2024-10-15-131.hash.meta index 0de97e8b..37d8e360 100644 --- a/JNFrame2/Assets/StreamingAssets/yoo/DefaultPackage/PackageManifest_DefaultPackage_2024-10-14-1193.bytes.meta +++ b/JNFrame2/Assets/StreamingAssets/yoo/DefaultPackage/PackageManifest_DefaultPackage_2024-10-15-131.hash.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 7c8700e5a670dea45b3244c0008cb22a +guid: 253946b296feb0943a18d893c2ed3e16 DefaultImporter: externalObjects: {} userData: diff --git a/JNFrame2/Assets/StreamingAssets/yoo/RawFilePackage/3323855830799371855418d404b9d19f.rawfile b/JNFrame2/Assets/StreamingAssets/yoo/RawFilePackage/20cb526248ed8fbc2a222e07849f4c64.rawfile similarity index 99% rename from JNFrame2/Assets/StreamingAssets/yoo/RawFilePackage/3323855830799371855418d404b9d19f.rawfile rename to JNFrame2/Assets/StreamingAssets/yoo/RawFilePackage/20cb526248ed8fbc2a222e07849f4c64.rawfile index 3ebdc7630f0c654d1d0663457c37537d79b09824..0fcda82db6350c94de4d46265cc4fa3fa1ef8948 100644 GIT binary patch delta 35 rcmZoTBiV39azY2oeTl>C8hcuM7+ZUoT6>sVdstd~Shx1Dm81dy98(V9 delta 35 rcmZoTBiV39azY2ogX)KO8hcuM7+ZUoT6>sVdstd~Shx1Dm81dyEea2i diff --git a/JNFrame2/Assets/StreamingAssets/yoo/DefaultPackage/e9c321218523545e7d9d80824c77a138.bundle.meta b/JNFrame2/Assets/StreamingAssets/yoo/RawFilePackage/20cb526248ed8fbc2a222e07849f4c64.rawfile.meta similarity index 74% rename from JNFrame2/Assets/StreamingAssets/yoo/DefaultPackage/e9c321218523545e7d9d80824c77a138.bundle.meta rename to JNFrame2/Assets/StreamingAssets/yoo/RawFilePackage/20cb526248ed8fbc2a222e07849f4c64.rawfile.meta index 242b8b47..428dca3e 100644 --- a/JNFrame2/Assets/StreamingAssets/yoo/DefaultPackage/e9c321218523545e7d9d80824c77a138.bundle.meta +++ b/JNFrame2/Assets/StreamingAssets/yoo/RawFilePackage/20cb526248ed8fbc2a222e07849f4c64.rawfile.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 04b54a6ad64db0c4aa1e435d4db6c77b +guid: 465ede1251ba0bd47aac80dd35883eec DefaultImporter: externalObjects: {} userData: diff --git a/JNFrame2/Assets/StreamingAssets/yoo/RawFilePackage/3323855830799371855418d404b9d19f.rawfile.meta b/JNFrame2/Assets/StreamingAssets/yoo/RawFilePackage/3323855830799371855418d404b9d19f.rawfile.meta deleted file mode 100644 index 0ca2b718..00000000 --- a/JNFrame2/Assets/StreamingAssets/yoo/RawFilePackage/3323855830799371855418d404b9d19f.rawfile.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 48d69fdf01fcebc44a35db256a0d6f2a -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/JNFrame2/Assets/StreamingAssets/yoo/RawFilePackage/75298c75d0f841401337a076fd57bf8f.rawfile b/JNFrame2/Assets/StreamingAssets/yoo/RawFilePackage/35a3cb8929f188fd948a376f07dc7189.rawfile similarity index 98% rename from JNFrame2/Assets/StreamingAssets/yoo/RawFilePackage/75298c75d0f841401337a076fd57bf8f.rawfile rename to JNFrame2/Assets/StreamingAssets/yoo/RawFilePackage/35a3cb8929f188fd948a376f07dc7189.rawfile index 2db91b92be77cce6221d861f27593bc30b464615..7a410cca0bd643034780f7d4988be191c5fb4001 100644 GIT binary patch delta 19286 zcmb81cYG98+xM@T4Jj}SVK=}M1_*=_Aw+tg<{g^wK