From 38997b3908c96bf3adfde191069dcd14a4cb58ea Mon Sep 17 00:00:00 2001 From: light7734 Date: Wed, 9 Jul 2025 15:30:54 +0330 Subject: [PATCH] feat: asset baking Only supported .png textures at the moment --- data/assets/textures/awesomeface.asset | Bin 0 -> 4194376 bytes data/engine/icons/asset/dir.asset | Bin 0 -> 1048648 bytes data/engine/icons/asset/img.asset | Bin 0 -> 262216 bytes data/engine/icons/asset/scene.asset | Bin 0 -> 1048648 bytes data/engine/icons/asset/txt.asset | Bin 0 -> 262216 bytes docs/architecture/assets.rst | 4 +- docs/architecture/resource.rst | 4 + modules/asset_baker/CMakeLists.txt | 1 + .../include/asset_baker/bakers.hpp | 120 ++++++++ modules/asset_baker/src/baker.cpp | 137 ++++----- modules/asset_parser/CMakeLists.txt | 1 + .../include/asset_parser/assets/texture.hpp | 34 --- .../include/asset_parser/parser.hpp | 270 +++++++++++++++++- .../include/compressors/compressors.hpp | 14 + modules/asset_parser/src/assets/texture.cpp | 76 +---- modules/asset_parser/src/parser.cpp | 104 +++---- modules/engine/CMakeLists.txt | 2 +- .../include/engine/utils/file_manager.hpp | 63 +--- .../include/engine/utils/resource_manager.hpp | 15 +- modules/engine/src/utils/file_manager.cpp | 95 +++--- modules/engine/src/utils/resource_manager.cpp | 37 ++- modules/mirror/src/editor_layer.cpp | 2 +- modules/mirror/src/panel/asset_browser.cpp | 8 +- 23 files changed, 594 insertions(+), 393 deletions(-) create mode 100644 data/assets/textures/awesomeface.asset create mode 100644 data/engine/icons/asset/dir.asset create mode 100644 data/engine/icons/asset/img.asset create mode 100644 data/engine/icons/asset/scene.asset create mode 100644 data/engine/icons/asset/txt.asset create mode 100644 docs/architecture/resource.rst create mode 100644 modules/asset_baker/include/asset_baker/bakers.hpp create mode 100644 modules/asset_parser/include/compressors/compressors.hpp diff --git a/data/assets/textures/awesomeface.asset b/data/assets/textures/awesomeface.asset new file mode 100644 index 0000000000000000000000000000000000000000..70280ee67dc93a456faa1532321f077068296e07 GIT binary patch literal 4194376 zcmeF42b@*a)wh}67?{q0^eSC??;vgH44{Y+P0%k!Nc2@KQDWy66Yz~)#2`ix5EFt0 z0YN}CbQGl%x*)az=?v?eb(7JN48xRr?>T#)XMR7OVamPdto@w5)_<+N*A6N5?~jn2 zPvQEd{?GSCsZ#pAQg_!)xiFzrsjB+*e?Fee)Gs>!=U@N+{7uE0!hhHR24DaNU;qY! z%fR{b=jH3Kzm}alcgoteYh}@*MKWj39GO0Sy1ekh3o>caBzgSt$7THZ@pAj^x67C@ zV`S8*QIeUNDZP62l5X9)Nwa3nq*0?rQoVZhpZ!;@S~W>bO#H9^A|fIrCkXi2fBL=r zepg@P;@8#p()ZN&)@#sf(QDFc(`(dg)oXt8$tQjHp!cHpr1z%xsQ0S(toJ^n_iOxz z4PXEUU;qYSAjk|5?*%vB!`|2%24DaN>|@~j@4uI=Ter&c<;!L6+`01SKmS=Cc;ErK z?Y7%|`nX@ee$t^s2Wi-_p;W3=N#f(vBGEDtgI|z#309rrI!2k@vfPD-QhuRm1GNz0v48Q;kl$?Qc=g!H#efwnP z%9S#6=1iF~Ws2N;@4Yg5^k~V*$dHyTTl(~Cbab@mwS2Jh6>4kE8K~`b40J5+yYD{V z*vy(W%Qsg0_wN@SJ7QM*VphhKF@*sbfPs=TK#W-O7!ey{Ll}So7%-24Z@>LkHgDeS zTbr)y?RD+C)}Om~@9tao9v&W!uD@unK(KVaKi)_8H0WLh%@gSUgozU;%Iw**Mb{JT z+Oe!48Q;kT%Lh5XU_Q6jW1ZRz*iss&2N6= z+p}J)RxOE&ibC5PtnK}gA5aEr*RCzSd-wM3Ie6-+r{wLo-}W)1>`-GWd5sAhVnY~! z0T^%}1H_P*k0G%UHi7{dfB|kjzH<(APr(mA{6JoSb;K|L z126ysu4jPw@~8L`TVM+qfB_hAmH~AB&(G#7ZvC3SbHuCuW&_Q(D(00UlSK+nw6x~cZn*S>qy^PSPGfFaQHE00WLN;MKU3`$luY01UuD@EACF@SsokXb<*WtsfE+;>g-<^lsqw zE;hcrjdODXdhW#Z>C=7tTP|F<;7BZJLp_Uope_poFaQIEV}STKc=0c`#?~+Z172W2 zwZ8V_Q(dF|(~^^u(fRDthk-&cpwEgvGk4#8x3Ayep+kqr2T&h`0T_S*81O3tUWi4x zM>H1d) z<1fVeZS-x)^({6mx(!oOQe@!3fiijWWLdXvo#?Y`OPz}Qpymn#FaQJoWq=sDg7eRmwU}-v9Ynf{W{u{Q+o)U zI&}&ifDV8G7=QtfGC<5+^q3i&VKW$j0TUU>&d!!KYu3nPk3A+`x^$7~=xFpldLITn z$bdfk-MV!X&Hd?q0i7FIU+drXwb&DT!T=1ol>rlDSgslE1p_bu1BGMY%P+t5_3Ilm zW{hYbaj(@qxnFAIFmQPWw10r^`O$uYd-m)h7vRyFpj)*H*M*LT0sk^U3|+Vw8arVp z7=Qs282I6bAAIY3b)9dsX3fz19<1%6cQ3DZu~ES`s$RXiXwFd2`uOg<@5l#`4}bv} zfB}mbFd?4h8qr-a00S_PKLZyoT#)ta*ULi>J>=Wpt7n6uZ3@;l*a!Q-K;aqCIi-F3 z_VUOhkI04%8_)n2X#i@f{;jEEPwZ(51H{z%$JE#byTAYpxRrsECr|on{A0(Cl}eQ= zq4%lr!vG8fje)eZG#NE&ly7ao@#DwI2aped0T_S*!x(UDe9LvAyzby94Ft-QuSOiYaLoWUtmrpUg1`_KS}X#i7dm0Txvbr|q3 z1H{)q#n;#ZTfhJexP<}j$Gvv#T3>(ecJ10pNJt2ppBgU=z<{e6s8_F^Xz!5~D^_r( z0J#A2K`;OVE@i+iu`btv?t%dr@HzwM&!6|j&AP6?LWK&hj`O`%=j48=?ZZIP7|=5X zbf3Wd`Sa!M*|X>Xm+AoOs{XC3Vo&U80s~%;x4C~bCk()VlMLk5{N>7(L-SMLg#j3_ zj)A14q#ttuXU?1<7eFom24DaN9Av=BxR>`vcfkM*c#(lqr%w55Vp&MG$#zeK(HA&cI=qUoHK21D&Z>ldX)$nR29h5>IeP_be~ zUp`gys>JU<#qZbxTfhJe6qfrc9BmuDS}%kLHH~7=VEQ zGf=NyJzt)6`}XbR0_YV0126ys#bh8*aWSup=7Iqju#thRtSp&2b*i*$*N#{}z_C7c zUT@WT8E?kBundHRgh>1L?Pc1uX`;PVi(3QZ@2H=`01SAM0UP6U?g`xq12Euk2G*`! zD`Uot5&HO{Q3|V3_&r#Gfxt7MeFHNyGkv{QFI>1lE})q8Krd<_?iuaxRR;VWBlCLb zE*O9TTNpTS;DAh=I8kcWtVyk(T0acH01UXCfl8Gs$@uZ(W%usg*w{1%LPJBPd-v`#efo4c zapD9T;1U|ZtF=$=o4UW(8SqEE%xj>#U;qY8XJEsI4f6l~-~W?@gakA{njZ#W00t~! zK+h7q_10Tu)22=20muWu01UuD4g;pg>|8&(69!%{aio){Buuh0I#os=Kk3S;8g}pjo-O$v?mO}Kv5XT&d&Drht_@ldUlkT zV_)ta?FR!e00X6bzChQ1&7M75&YnF>E`XXa48VXV7${2o%)`jiav&R$hzgO#?+&49U7h*+mM>pU9)Maf48VYu3=}4g=6BFr zFaQH4FmUF~8Q(h2)~#Ek`Oy6^kcWYo=rBnv8(H9g`aAjQA-;!B_9_ESnl$nC3p{!9 zq?H~nBA27jtCEx)TAh> zRW)8(G)j^l?b9W*PbC?1O%1v0=DPCG?G5GeyBf=Lk2IH;CbpC}o^B_9d$EJOKckC$ zG`G8~nSZrxUz#Dim-mxzHVpppzjHf=%Z1$|{PLf^R^Hdv_tN*&_ttCBYtd`cYtw7g zYt?Ih@OKS;_n`Np_oVlx_o(-(_pJAB$~bYIVE_hTV`5^^66k)%8AwTtl6tkuNT*h5GNNB)8GA!*pN3am{P&kS z$cj1L<+FvoW&f%Ha(wepzvy#+>3k<%M{S_CP@AZ2)JAG6&3mZr)P`zHwW-<`9gYrn znt{m3NEtP1lx*6x$@uu6y016uzKlELt_-+2w&&W=o-hCd7c)Q~e>6a_H9+auaGwV4 z*)d&i8dhB7xa_^9}kc-+lP5x&j&h(pf*-ptIgH+FXxPbj)jhi zj*aFCbgY8S2k+<2IjLQ{cE0^)=g*%f7eGB224KJ_1}=`R`8RqC24KLA4CwyLXP$XR zYSgGfd{3?4uMCt=i;)g3Qsw%=Rpq{0>&deZHD^wwG1RftF&#CisNW&18$7-xhC`{48TAx16f&FGG)pXsZgN;aXY%d*bHdzyJiiNd>UW(r|W)o-NXL< zr$f;9hUxoUonPF~r?w80oy#(Oy$hy1(A3v&p?kY>QoV9%2@4A;He-1;AzynhFOZg& zCKD!1kZ-^JmOKEpU>JY_S2K_sWAhok1p_ePCI${4KJ1I75)u-K$I<{ z|JDl~_&E9vFi%}#p88L(z%5(0kO!a^ z3TJZ*KgHA4D#gj*o)vvP;pb27=sW8!dspx@ zANm?w7sPFUXOBdp0kFW99eb>7Gx?i^|d_CP&PaRo1h;{oO+nZmI z);8&9+E+r)G}QhA+E-Hd5a_xUn{_VtcKLipw{G2J>C&a-0jLGT01Pi*81I}_Vl9@|EQhf2%F$#UB-YRintZDjk>46AFpXyd?X zW3SqF+XsE+)jzeC-&|iynm0@meWnV^ukkbU^Qmpxv>^|G1`N6eWF3Ha*8w=819(sL zCk%LpfklfJNvl?^h+i$${oy(L_H}Rb_*?4wYWv@98iL+u9X|~CkpbN|puGfijexGB ziHW91s;xPX)~#Fn@&FeuTtEww4}bv}2p9wCFz@Iv#+tDXCIhPbTefV8?zc?$>pAFp z?wRWS_h)nwJuls>bz1J5+P@PFoZT^8*37@!mk-cA1G>M)Rz2+1`?~6?t7P`<*+L$` zyY*RW^Nf8U83?8x;JwhFFkn9eD_5?R4jnoWk6NPpOUH&wpUxFz;`qkC-esyioX|YH zCt4c@@@L@8_F?kT+<&hR=-s)z#N|A*Ue(RE-M6ltTe4(Hz-oYj)EB%q`V|J;%K&=J zem%w*GseMSVD;+NzB7((i@&^fKiZo=cRjz>_fKsdhTiw%T5dFK{u&m$_|GnR*9Yi+ z0s04+-yfiR_wKT0%^LCmtOthy81M@N!O#V~2l^8R>}6ofmMxN*nVEBrRR}dFLu>xk zE0>lr*VK?Vo^B^!uOE!wNAJUcMGPFX-PR z+N^tPvy2U66KDp|W%lYa#+I=SBm?{Q?UONM#z=TLYfVjCBM=`KE`xhklxK6!A>Xl# z{`}OQ{a1U&mhQKuo-gq9L(OF1)fGke_n0<+dHs4rLqmNz_uad9lLw#{3LxBWwCCs_mk;-LJRZJVv@#K+hJ? zex6s>D8rm?(3~C_8R^TxA3l7zSn+?L>x;ZTHEbAgF9YZ^`}7%O%9sX%fvl`7x&QwA zrF7}i#E1sOh++RZmv6$j2EJb5Zq^`N8yXe{+`+)kob^Cc9%$-2XOO-DX7mk+kB^r> z{NWFB?AS5#0MvqE00s)hKp=DiuZjMI0ecw8&d!$U)2B;%dOEt_<+@+{e(QN)&p+Bi zzFa+!J>1m!VE_h-&4Bg-(VigJ53VYSWh0sYT|WP(q@>7{DO2R!xpRez|EbNow>Hbz zFgAf^0G(!!PGc+?OMf%4Xwf2R)Tj}0pNr$Z^wem%Wn@j!Uj3ZS=Z+dGwQR=0HU{*J z!G*7OmYc7wDdkew`{m{y1Xo^prOci^n;ZajU>JabOETbZy};|CL1Dmr20s7%bLrEk z54zu_y1!ES*dO=uqxsRAwrNf7$K6by-}zI|fEqbxhqze_d->Y*%)pHsH(oOS4|IKz z*QbUJ1MX!2t!BPfV+_=zFbu%Jj|})rH}E=WP#7?mffFZA z$i#^gMf(VOxnAP7d#_bBUhcoGzN}x+v)Frh(P7@vVT?6n?KA`H{?SwJyS1LMF2G&A z1LNZ2eCPJiBhbC|SZd{rO)wcivze>e7(2$Uqzq_pzn5QrSt?YhfbMrm-6lCP%D1*( z&*Y-ckDhZ{&++~+SX>5lU4Wh|SUxQV|Kbw=Qn6x1Uq9aq7cTr*2Mng>;JwheFyIab zN~$0Ddo(Bvn90D}wQHqKn>NH{E{My@#z**iY|o$Cksf~ZYiF$o3|PfLZodHCzohw1 zx2?1C;`KCZ)=XBdT15_k_24kzQ3lX%W@3?i3KYX5PRlHx^dLe&Dtr-UFX5iG;VWN3XJyS3?hCVY+`lFDL5MOVABS(&) z0X?b#sl~ga7VpG36jwv=cj!+TFpB{_6ZnM}UXbMEWOTnnHUE&1QqrkanoN75m3;r{ z5Hvq^UKoG@&oc1crXe!*e_Kk27OA3hqmx?L%kQ0#kRVg0Oc9L{oX{b>r*}0dWAEJ9 zqv6cbaEuq@RU8JEEn6lH8#W}qa!B`IksjmQ2fKY~hG%1a>biEl;qo zyRPrg>{H3N*7fX;;pl$qyf6R*FmM?Lv{%6UGrF)pz@Z#~`pS%q4B5MPFB;GT8j$+C zbM<$pZI6yKL&q^rj8jn}Ejs2R#313u)gxmHc&(^8vB3u`*%81UY^BG05D)714Ypk{4N?42HelU;>C-l zR;^mZOF@j6k`f~2cQ@9N&ldJZ^P~A;00v;d&kSsOx0mSo0f}WJ@oho$ZFTC@k)=zQ zqW>(^e@@q*d4Ffu9-!ykujd#e#;8yXeDjTr88e2p{y~h5nl(uB)u-s+Z+9J%Iy2)7 z1MXlz&kuOx>2}h+T{-dqLG*Q*nVIs{S6`6_AP)comM~B#T~QJJg`Hr)tqfeaa6zU| zpDrmWDa1oTh=-!1!hCyE*Zrd>H9kMr_|RDH&{&KE<6r^gO=v3-E)$IGcxr^o}42Y>+s8E~7f;d;>8FiGevS;lzEW zCPm5kTk6WbRsGTZ=zbW00T?ihfiG7N^sU#bP%Z{v8NeKQjT$v%;lhRJKLhn2b$c`G z_Wl|-v{u1d3;SRnw=i(z$Pu~r+G~kr0vOBa8viK|G?f!yWD@Ti7VlGUb*A2m-Lboy z8PI-#)Bo6-y#WFAn;{_~a{cw!%h97p$perFfB{1oaErF#I?&lLaA^i+&z>!*shoiv zh_wKrp&`Cr((|WwlY+E7Iu^;P16{2?+_l zvjW|!eYh@fYF@_ur*TJn<*&W43wCjefkTH5$-sdF(fxkb{WYtU_U-LIxrM#`=oYhe z3**Q5!GQl5IKA!PJp$_0Dudtkv)}FAySMD$zn`@LtObApmoea!#^HU@*D&zk3~0?i zDJh8<#E&sZ(*}vY{!iz245!}jk@dZ3BmZe5Y>6$s!oc~R!$teRv}u}x5B8%EE?c&& zZ!N%u3m4FUF4KV2!+)xWd(9STu>aOz*aVvdn}I!h_DGK&J%~B{7<065p6ZL`yb`-| zpXf9gfB_ir4+GjOuwS<;BqXF1e%Vicxo6LwvUl%ZascE2V88_o1Y76uerRhL_=y3{ zhd=-P^AaB)PmJM*7(;vcYs|L#?^jdnr`8VxFaQHEP$C94zSB#tA6!+!IWxd7F-n;- zW#q*dUqt`8K>vBI-p&2~e60go>?bXTEwDu}8PMMT{rdIui%<1;?;g`$FES$3*UNv` zhy6+v>rp%NPwfmlVn-N&0h<`unR8~qFNfEVi11K+wjXl!x)$Kz!Gq)h$OFKDLkt8{ z@9a_FaQJYV_?t9{xWWKZHbNw zBM(r*JV0t{s?3`=5B=wm{-YlL^Ln_~?13Iblfyvp7|6=Xk}+e(5I2-CZqRx^y5D`V zF?xkDfdLrs0t4g${MQ#DGc!}Z{q|e(0OSE+Aczd0{eq|cu(h{sy>jJBsb0N0+P?(a zKX;w~zE%CH_p`4T24DaNV8BrZ_I|{AfRe7`)4#7=xw3rl!3XHSAnHG_)w{XhpRad7 zlX_c|GX8-d|5K+<$@uZ(B{Y8-M!gr_#7_V`~1ztof_%zjahCIq>lSM{7L9 z(`fc>(-(F0<8b2hyT1D?lpU$O}(p4 z8T-JEeRg)XJoeaQ5)l!B_Af>ppy&8y_NgS>m(tfSn6WGGg;s(A7=VG2Gw`n!{d{NA zgmG?Qv0|Xe$VhqOi6=y3DX-}=?$_J8JXqt81`M1A#J1kFt)A5iu6w(3 zvVK8N>iz8Ng#j3V0T?ivfz1p1_;T4HA^z)^=cO2-YuB!v6UaIMazFuK0FCNRjmo$O zX58O@|9weMPe=O~qvqeXX^JeH)y?QwkGfgO>t@&x8^Qn#*v7!BH+x8zHfh8L#fS~` zoWKPO7N7wGpaFwbYvz62x26Fd7#JOhUA<-3vuDrBgb5Sq@mCDr-mp%Byzz89bU$@I z7=Qs7fB~x+cz;G0Y1SZ#JU|g+h1}kNXU?1<4?rFO2K>MPI@Mb`mGSofcyHUbO`0@m zfbjPO^7V>$0uZ#r?oE48Q;kt;4LY^AP*y zANyh#>;eNY00SfB%=TgO{G%--H7SZ1q6jfWe0;pT`s%CX0LTHrKnWN?t9nPPGS>bZ z>tn}`$#vIVhtDp8&yENWm2snM%eNZ`qx)Io3j;6!126ysIShQWVX%z9rLIIph7wa0 zA*L8LYLpy5ejE*00u30?od8>!CZ=On=QOGzWDk@5* zOqqiIE293R9`CMte6Ys@UFaWOh#l>=n$$E>88z^cN~s$hbrIWd88O599&J1HeEb7(ln$ty>x2l8^7!ty`r* zg9d2-Lipgg*l>A_-hRZoMT~VXu7B}wYN9Xz128Z`PHxGRhwo@4u`yx9AccrQuDtR} z*}Qo(`mYfBFWB{F-p^g@4bX=r*N529UK`GvH&4ozEsNhRgx}RY{{LFh5ABQgg#j3V z0T_S*KQgd?)c|?}6e14MwE}uRz^qxb$N`W8fPn%SK)c$jT^ZZrkL|g0=Vbi&@#y|S z_}eRMl#%zQcP7^JW2{Hri`pj)zyJ)uz{L!F@OoEiSSNwlq!6*mm@#AI%$YN2zydTN zHFaQnK-3+^XBrefBlOb0672{xQGEXteqN`aV_4sE?&G?($doK zsRj5{J)20+DEe~sKw`Zh#CjLkfA}{wK^TAm7=VGJ>jufV(X}NsG=!L?fS4sEB}LwS z_g(bgMfxw8wPxPSed`R+iN({2*v&4xUAS;TCQO)+bM7vFw4h$QEgL6`o=rsTN$d#& zFaQHE00Yi5up!bgr;cpdvc>cIkD7b%Ywm8cIa<~pEz4LIZ7g*^SYl!#+W!*T zzgnd@d3#zXVm%kfdbzb9K2ryT0T_S*7|3N{!L*K2wPGCc%_ZWSq@*NSxNspk0M-F` zmH{+l(KI9WGT&ah|7+sJi4qnThHuQrH-?9W_<9N*+dLHQkM@TF7=Qs7fB^#;IPpcM zOc>WdA|pbHb@GXIGzQdIke&eEu7kU&CLhdeLC>16XBor7kKw6Pr)1QqQTW1qe4(xh zY}O!2*37?}SkJ&%FSqW)XKH{j00S@p1Gx-re5aSRX_`XZbBVZT#E21c;=~Eh)`5em zIe9Pli48Q;kz<}ipXn(*#Ju4CmYqO-+@hOP6{^|51x~Pc7bwu|Pi- zPCsHNbM5rfOD{=81Uc`E^Bjp~Bjx!=TM+MA9`D&uyW$?G!NLFxz<~c4c;o4Il9Cuj z9^j%pKzMk#JoC&muC_;U3?8QQxNF;YG;(%7+MB|AIYdJX7A-I@1v$GQVFWWgE|`tOc-=0rahz`j&CK^tc^3a6p^l?sM(Y{pfxefB_hQ0T_UROEU0}mpe+u^jKo3JTX-H^5tdq>eb``SO;Jg z187|HG%jP7|Cr60Ge=@$@mqQO{9W6>ifCS+`bpsHC)gMp!vGAx01TMUfW{0X`c)DlGw zcioTkbKcswSHJGjK3(>$>R)7EZ+gvw>!A6^OC&tOdB? zh8yI}nKM>sKx*;ssKq-m4(Q3B>q+ckjy=Bn?mOw!sS|$bKYl4DI!qqFtFfHlIUMaz ztp^5R00v+H24JAX3}o*bAiMRd}Z*}R?MZW+3dvXA*1u&KY^sYI2m$CY3 ztPUPLD2*F8#uxp^7qx7hEL#@$EwP`cZsNbX3AV(RFaQHE00Xu#uya|4v}=|^-1VQh zt3iVXvTxr$WA&dCHD}(_J?jn7ls{=oY+;5iHgDc6l`2)j2j%#n@URdWe@k6Cvwaxa zpE?f=zyJ)u01UuDz!*5YW4LdfVMI9nmUNG4g$fm9L5U^~-zT*AK2L$2Jc|`%~wE0T_S* z7=Qs72s#5U+ejR6DLkIM*lfcbLKtWv*rL@ z?QLD{_VK@P;eyx?2BHi+4{g-ifh5Uwc?GK zbpWnpz|9(vYx8Js;+t=zb?eri_Z{8ZmXm{@3_$y{#uEl$00v+H24KJ#1`e+oD7`wB z_k0}Jym@mudi1C(^`8?pXWr92YYx!Z9@W?t-Fe@K4jqz)4I6seXM~4^$YXakmh4^r z&B;^az@9Jw126ysFaQI=VBq}D;qveujU+55rtxAwz}$PTTeq(4-@l(60P6r;#Q^%> zojTZydVgIz7YyIbdk_P{01UtY48Q;k1d@TJGrM|zKR}f#Rb>12 z?XJ>))Z*P!i+5ryyr?s|XZPhiKKtx5sZgPUr*p&|Tc)z!pY@&OeqaCwU;qYSz$ylG zKY;FO%&m!g@pHLylbqS`=8lPfB!(% zAb4$RTrdCwFaQHE;0yzt4^T=H5)x$P%9XCre@@h#c~AGOIq;g+`B$8z*}< z{)>!^lsDdZ!%_W5E#5t~cqhifOL~)gbx*G2g%@6s(9lrN&i&U9t|}+K$n=b_cY8g8 z>!W4{126ysFaQI=W8mbLOc^)2wrAtOu&^+B`Q?|%0k96h5eCr2?$N|v8H?wif8Mj& zKRPN*rajRL-A|nd24DaNU;qYS!1D~eG_j>bMS8Oy6cQ35|M!3Y=ZOAuqUOwdx@XOS zS2QR0>5e?dv(G*&I^TJ*_iKf6G4k=e9-jC0)K`L6U%}Sc8U|nh24KML46L2sQz}>R zW-lm>i6>8`3sQQmuynAZ#PK<>YbSL-de2!z{#EG7r)5ly>Lr!nwY(KZx zAGkhhWH0~&FaQHE;2Z-QEB$hK4bR4l4?g%HIRMrH1cd>#vGdy4_A&6P_74vWktq)} zCC{Hvo}c*2x%dj(V|y5Y0T_S*H#6}3qb(#d!kaw-#*ZH#6#eH!&6)Rf&zb|Ik(QWQTu@b7=Qs7fB_hAGXwiq4Um?NlRX(r z-f_nr0o8xh;@wk=cVaAT)}P#)Gr5fm7cR(cx83H+`FiAlDxzoFy4jy{ZNz&p00S@p z126ysCNQ8e)iwR9crvCOH*TD0Ozng|iUW-%?ky zcM(sR5KnN8a0&x300S@p17uHI~p&@0}k#cI;U6KYIcE&VbE2lzR()ZbSQ) z=y`Wu`Y$RnRAx+WL(RX4d;5sH%!s=fC&mc|U;qYSzzqz%@pLpIk-C6Mte`1G|6*waIa3~<-1Ko z$n&HBVE_hT00v+H24En_3>@1$RQh$h!gKNGqmMpH4uEw4C1$`zJ<2@=FQ@URKmEyb zbMKgIYRK6g!}0Y&_Vv_W+*5mDEEo$IfB_hQ0jC)_mlKO=?`5y81DH5*Vu|%1^?keR z`Ul*i6E5Vl*%1 z0d(!{4vjH>)f99EI$N{hypjZr`mxH61ZL;$VFTCI>?Vp^}LIB~QJz@`5E>dP)22-;mi{ZKHq6iLUpHWrF6CYV zpUZgj%{Oz_Sa~PETCGx?Y+ce9U++?1PwmA$wHL;Mv48;>fB_hAnt>h5GNe}3c+cbj zG$x-lYZf^G)&UfW0W@>qHM1=?e*gXVB`V50dDRw;lH~B3foOlUKMcSC48Q;kzyJ&w z!oZiS2THRBNuJ38L_|c$JMX+xB>hK?-~JkZL1S!-HswA7o5xtSYL&#r#d&5f?a@A6 zvOXJ%uQ$ZkJ6&(!{i%7u01UtY48VYU7&xADK49N26+9ES#>U3ViWMu!0k96BPz<1( z1FM^Du)6+dOcj`H^X|GjVKMTAFO#x|JLN>i`O50PP$&?QFVj4;(lkRjXF@#GDxtQc5P@ z-xTd{XpX{!0~ub|p6KeK;rfXOd70T_S*7=Qu$8CW~Nr=%uD zc_QW=Hf)$^j89$P{{%C&~fB_hQ0T_S* z81N_qUo7e)mCDC@BKE!Gjyur*tO59u0d%zgb+m~#ed38HJTd=WS)+{X{ir{_-lM*r znvVT79mbe3h5;CW0T?JO1AA8XmpawsJrM&>o;>+S{a4sJF~4W$ngJ8FD%b4aoW-nJ zvvSTvvA-W`vj$0WWbGidKiVG#U;qYS00v+H24KL)z~MCmrAhrn>vI4hAt5qj#td=* ztOF3Vw12g&u6^L$~~h4Fi=A%p=K zfB_hQ0T_S*`x*Fd(-3LXG{yQHK-scoWz(ij*M1quDC+>?b}BVz@s?;lQb*W z>YrRiR#uiYYShU3xvgW%R5_M2kCU^vKWEPvGsZ9g126ysFaQJoVBm+(Go^dGa@NPm z4H`6%@4owv9DoON0BCCeXlhgJc>45d>D;-q^>bR!j_GpZi%hgXd43px0T_S*7=Qs7 zfPo@0pfTjt9n!6jm%DZACTGr^AqU{G9DpghmFp~dp5nrV3o>fdDC_64-kr1v#~KSdntPUi4|)GqD^DzyJ)u01UtY3>3_O<^TrutZ04wJaOVgasVF60k~18 za!vlvKg^jkNA%p!Ql&~+``?gWmE_EJv_HPQU|)`Xun!Et01UtY48TBP8PM2ru;n=b z)d;g@%_0ZjksJV8+y7eIZ8lxIcCEz5##*cUHK(C#{;B)p%M0tv`8`;H0T_S*7=Qs7 zC@ce-0~pZ5?!5ppF){MbfBuskfCq8_Zquqnf3T*2ztx=E8Jq8eg`2XwGk?~!`Df9vgTv1fL6w)F4c z-|G3PLyJ^7zIkZC=lY`NhxvVK3NQczFaQHE00S^!Cj)vmVAnR~td6n!^ywq#&z~m; zU}+A-Eqayf@NXXCx4-?Z)$>xjW+`$E?N9E5S_cfk01UtY48Q;k1et*!KF^fSt<$WI zweP(1PV_(epS=Kv>;;%Qb*k0#QJbbIlJyyNf9eW$))g36#uWx&00v+H2Hekpu0hqc zs5bZ5dhWUB$N^ZG1EB8i-@3cg_FS@LiG+uTTRRsuZICG6Y#2@jQSn$)By`C?HYv_E-%7=Qs7 zfB_hQ0T_S*S2M8fgT7KOCED7!{K+SuBnMzY4uBfGe`@ef*>T~*g%TDPX5~CnrgVg? zo!`^d^E~-|@8$OybH*G7U;qYS00v;-QVeW(yO$)CiL^2{SIzOxJMWMKFgyp~ly2pH zOP+VwzJ0qSBqUflzr;j`$+B79(EjB4VE_hT00v+H24DaNjACHr-0l(=Yv*}fNl8hv zbLUQS00!p((BUQ5;ZE4_*s)_$zkYoywSPo-s4SS)(WrU;QaND0PkjIeU;qYS00v+H z2E50>{HYy9W7<-sN?G?`-MV!pD=Ui}fT1}6C$uZ?S+bmi_WK(;bf|T6iO!Fqp&|16 zQ*F`yvb@o+rQWz5G67&X~gh48Q;kzyJ(fih(~rXz%&l+JoH7I@;8GcS67N zp2g2Oy#4muIeA1o*Ao5Vw++$$D`WZAty{~PGiS&F7?J}(j~7pm2itDH{`Ie|oG+R;Op;@p zhgvz$liT-JZlCdHykP(aU;qYS00s(TAnUWC(zHRMl`;M8x8IKbNB>K(HL|VmH*3}` zE9Z&ol}pQ)s|TX}$@9Yi48Q;kzyJ)u01SA7fg@`NNzE#yt&8nLLPBKDoH^tG49Ef4 zs+n!MuWj45NtrTbteYcJ5~F16lD?jp=L^aM^E2uMFaQHE00S@p12Et%2DUHFkhJ7z z>*D*;rAy0}EnCO|xI717i%z!jK7RP&2dP)Do^^9WOmvuhG`Bn2pFBSdzyJ)u01UtY z48VXV8TjO_9ugNDZe5(;uwg?vapD9y02k)~Y}C!R+|#I0qpX_~!oosi-t+A}InR^Z z_f~G7@n*bX00v+H24DaN3SwaX)Q+ODaj8*D_C=xEunVFNh;7v=zL(# zWPLVN8rDg$P6v!0JsSOw{-+nfC3*q8^2#gLJ@e_Q(XwY{f9Cmo=6Q1Z-pJ`Q&Wtk* zzyJ)u01UuDVHnuGyq}ayvF}{K*Is*#9Ds{*05;XmO}>{MJ9bEXe7sfqKRPN*R=wE+ z?T_|{0T_S*7=Qs7fB_hQfkH5_GUtqJjiGaUXWQ_(bm`KvZQC|-04~V^n5>y?x%Shi zPfOFLcJ=-Y2`MG7O=-hCUx<0WF!^A9hq?g_zyJ)u01UtY40wZqS$}RT8cW-t{d4c3 zdGqFS=FAy#04~S@*rK6LzK?O^##!}z>vR6#?;4{0(f%+1126ysFaQHE00S^k3L4%x126ysFaQHE;4B0G z_lIUyX@{t&DA~AiBRK#EasVdkXOpj4&-!c7pn+A-?=2&1qW#hSFaQHE00S@p126ys zFc3fnemT5`RT`pRy?S!$)G2ZRLCyh~tffu7cH7SSYtuAEPHi2=Tpz%>o_xEr`F8A& z{b2wGU;qYS00!K^z?tpCqSlLJs~v~=mxple|I|J4*zHMJ?%{r&gf zOXbRyt$9|Xqr&8qw|X$o2VtIfL%x}7pzZ+!FaQHE00S@p1MXnpqq*HBD$<^sV%4fu zB`Yh796*rv0hpqnO~1~OBS%`J{Y#Z9CDWd0h4x4L!vGAx01UtY48Q;kz<>h`Xzy)} z$!+;>^yty(fAqgKYZB(on`h0lsdEhd{@juKB?r$qzyJ)u01UtY48VYQ85ljZnpGNO z&YU^q0D_PMFukts_Uk`%=#V5QCtLGuHm;i>C%(ue&+9;*7ys^E|IXMm_AmegFaQHE z00S2@aB@qgG;NS*jm}6(Ns%wV{E{3%fO7zD*Uu(j--Qboq;KE8);yC5Wg=zgvJA98 z+8+jB00v+H24DaNU;qYOz`*vU8B#Vr!WzBNt5+{k4dvzje1X1qll8URul@PwpSR{& z3<)VEZ$8(adEN!{{KdIn{!Kjq24DaNU;qYS00z9vz~5f%AR4RN(hFef)T!wI0ImUW zyM{LP`u6PEBk}R^);x!I-%=OtkM@TF7=Qs7fB_hQ0T_S*7cy}BO?9l%9c9Xtk-dBO zk^=}(4!~4>?dI#&H7h-P_O#|1?9?hv&h8k_T<^lUo?O3obN!4xV-Eu`00S@p12B-w zfX3<_TBKT|Ke~7C&OQM2zcJ?ly!hga);xRVQljO+#{ZG=}fquADWxWaiA7D z4!}=20FyMfo3C~7;K5crUwU@vKVI(08ZU#^c;(LXe8%U)01UtY48Q;kzyJ*7GVu1a zPNK2B4LN{e!-k>%(f_X52k`pquUqk4>D+MF&2`cKXnz=h0T_S*7=Qs7fB_h=fPvrM zSjQTjGI#D=asYnF0l2xQZo;)4J$h8q($cJWu9`PYlGEFUG1vQfu0OtcsC=_w@X!9! zGg@o+-BB?Ow8AT1R>LiB_V$#eQ>rEg3nWie&bwYmg*$s>e&UN^z1{Hc~34$4d3erGNI{RrL~mzo+Mv59o1)+%UA7{4PhI=xhG@ z!DjN>ls2;XuU%xvvJ7GpKgT0(WsK_z?EH6X>o95BAkhk~lA4+-Uw!ozIe-%808G%> zZobBAuf5ia=c#mTxNKe07fpHzUwe4XKw0;Xp7QsXI>^%xHIsXPT~BVztS&=)|2yu{ z+)3?f@xFalG0|a#WD{@!TtB#~+TO*s{N#O2WXv@+q;u;usZcIP!W}$E zOxG>zHMDJ-BG>e*B6r_XSDt^gg{++0UB3Tx2rHqn+t9`YN|M}IG(yLQ>sga}0 zqoWG1=Yug{Mn#7Dat(S$gT`o&-q}e0`cxZPGyiJQwFZUp1N;uL0Sv$Z40w})6JKP? ziaFiokH2psBl=aA2DQtI`jue#FMq#Bl`G<;ZQwlpqJ-=GwZOukG~d(^9979s6lU=d8W++MJp7*-&|ZMi-ed zu7PB9t>9a$XhVM#y$4-)sqv8Za(HD@D_Q;bt3}s-d2Nij--6=+?1Oz^z9!!QTeGX^96x%fSF zf5(tsm3;YtuhtF14-yN(01Uu@r3~o0_&LwElbeQB_pP13*dKW9-;H5;`~x}leeFkN!#wA&dk75;@!3Reqc*}%UfNG$8*BpuFkk`$J9GB#PrkpYuMb~j zgqdsk{pI5>_d2;gaC}ZL0bK`3-(#L}6P|H@UZbuHjR-e?o=`2eWy=KFT&Dekith`;O9sgtNSn^6o6?B&04qsDggHNEuGOIAEDS`$CB-TXb_nzz@U{CfTn zHIL%QKRPFCO{9Cfa`KlaTgwlhXA%Qhx;8ivaRjePdVc=gY`pM&WHI^%Dl(8Zf z34|Uf$!qG~z;?}2d}}H6%tN>i4%gT@_;%KFs9QEpwqhQ6_0?C=|3%DyxLIqv?b?nW zJt`?FDaJo5u`yxBpY^BxjCAc@YLfZ;FiH}u1nO@S%0&9k7SQ?bXX8`$dD`TNA7WI*$oLTMfXUt!(mz)e`FgIq?mFYOzdmc~%W~rilRj(Dem$>xl4i+zYK|4vVhma#X~ zmh}r*ALlRbc^&8GP}KyzI+ZtmzEO>~WXTe80ENr}xJhHX^;%A!J}tFs)iVCs&^6sA z^?2L(PA}gY^ysKC<85zC+@tqVE+yKRkKs&Z=lnIX61Il{yBOH?ZZElIWKGetT5a+d zw%<#utCD?v1Idfq^*nlQe%-%nfFvcD-#5E%-MVu2>{)UEg~$Q8Rdc)Px*mDt5i9)h z%>Qd^MBV?Nf4f?)?vQSU&25f-G@o?;ZS_UZlJ%Oe|4b-I{tVrc#YuCudhvMW5ql)Y0@P0Kl)!vnn&2bf4{`V#Toxh zj2uwK^%_n48jl)OHD{lNv+La55KEYJ4atd7zJAo4p&WdFO^k%iVZclV^xXM2P0jBo zY?7}E#I@%{d$Cqc*%xBZf=qUWE+8*ZEr^^AG#>&JdayVg5&Xpt(Pyw$^%%(?M7;F^jbt6)29 zX95GN`&9?h)6XtnS6Ka1t7^QwG_j?yMvnQ)g!$_4FLf|p|7$P64?p~n96$j%0Nd;L z#l63C=gvu^MvaVr2Hd*tU-vv}Kl#G?Pkzs=xJmbLD0_$33?vW0xydj91D<7I@n5@8 z@Ap8hzc4Y1_Rf9$uEwIZ4-<4C*XZ4R#jw8S?*nMkq=}qAf1Vt`C2|18)yKB~-Q>xW zjn}3rIs3BRroXgj{FrNMu*csc@sOU`sApNRC&0UL1TiFI??nbSFYM#n2VNLm$nThy z-!AERX|KRX?`$N;HxDHbKyK8P4Cubxv}E)50X+BIbLfBcf1&pQ9654C5)u-O*Z;Gh zY3HhWMb{Kvksf2bT}$fwz4-T?TBXUh5Bj=_M=xp;?ino(1A%2g<7Pb@K0GW0U+0lL zcX55X)@XD+0A~jV_L*ePE1rFI&r)&OcFW%-B_+wxqesaB71?8f-?mRoK?|D*pey9Qv*nl%y{ zYIYxbJ&*0n)$Z7Lz2vW5t>`7{#yQQ@YiijzSw4TikL&y#n&!VX4K~3hFmQPWmd@-d zb*jf3A19mYQ*62JD{GYD3>|U+u8NJcewUOGY4qHtnr`*#)#Ly!$^jIoK5pyZWM^kf z%a$#T=3M>YU!Q8@`23;!y>(q%7;7Mn=P3}eRZMi4OuoOV{24g1 zc94u3RFyfNdcR*8Xx${4GjzxUxF$Y&Wl}4@@*Rkn@^Y`)wryLvaNzTeW;~ z?rYk#X~r|2(Y1o(bB6AJ?A58f@wU9&e8SI5-m_^)uS%jlA<-B4>kI6HU0}eS47~Al zJJCLF_<@r90c`l+Hqd1BeDZc?EfJ^qMi{yUzzlufEujFVMw_HdM2G?qIx7UROWxQ&4w z%QB=#`*fpYg-gxFe82F1D_FLQjR}(n#x)S_FX6Ulf$QBnHm!94=4XbCpC#g%xX#3zlBwecY$v{V^t*C!h1IyUuhn>G|baOYU!;n$Xnv zx$m*Z9z*}5|9@NqaPZ(kiHnOfnrrQ;rtygrbDV0n`){jnwEg_ypLvav$6W)jt|-Si z6WNjH*onD=_bho#h7AL6L+ydpyEA**@Np&gaV52(?wLE9v&WL>KJd>yHvYMdRbyyx zijp$yCkJ3-Ex)MuWcqo3dd~3r1w9?{2WNK-mtT#jVf1`Z)VZia zg$mNHT|2q<+H2+RyYH4~pM6#qELb3VcEtAW+vV`#!}9I7-}?SLb?TI_=ZOA$-@bja zb?a7HyLPQCUc6Z5&z~#A|M|~y&pr3Zs8OS&bLY-dt5z+EiSh0piiUL(86{cSFc`DzkYp5NJzl`dDa%Dr$)6ZEYCdij4!6q*dI)^+IAPmI;p9tGGM>}nKWsVeDu*ra^}pLA7c+UeWBN- zbJwg{v*g};@0CuSI!SD7tW{&7W1~F*rvI@uIRI)LFaQHVW#E&ydPuFR@z%|$7yG=t z|1Mj$tn}&AM}GhN-^-hCzA3wR?{<^hyX3VTKYm<3`Q#IsGG&Sk9XeFf)4kQ3v0kk* zvhE+wtp7xJ2UmBy#on58s#eMDJ<~eZc~SG{z2~CpWt)Cq*KFtYeNJRZwt5hTdu>KaTenq{Bi%|@0)m{k8SDFrKNZ8-oADFt5>g<^XJdI-OUyH`gZKt zA%FSHU*wm+{H1R{-Nk;zwts7`{K@;82>o+|KVNutj(&SuC*xzxg$oyYItO5ro-fM1 zsIOD)XR;p{o>4idH4&ZXbYHf~c|TqEqk9%#e)(lNa^y&%;|bG#@xp}*vT4&MdGygo zrB$m|5*ljueyw4BE6eF^!-CGcSA9G8O&sYp22O6tlpBUtGdd=?Ts+gTVMDq9{`=+Q zk3SYC*6=&!N4IU;CQm;3q_4k@_Aa=bolO0?#)M9+2ld)q!TtW*KMv|y(dcKXQKLq_ zyl38;xR<^zie|RyceQ7msdKzux1Phff7O7X>Y+U=`%860>;5fTw2;Y@C(EHjhnxyQ z9DU#Y`}fPli4%>^d39-%#@PU@0}tw)N1W%4Jc#Uk z9rZzOd2{XI^ZM(r%ZL#ptn4e;=*k4yxh#Wu5?>i`1`d8QK+49O-H%FpmU>C^=e<{( zG<{+3B`YgS($dn5_Vv#^+&tjVcHY?6#Ja!kiT~BFe&y?-=a$&R4cGC(2OmgAMuw4n zliD{=mG3qU2`c+}p98-3h8|>`y)(}5ywXXM5+aR`2QJqB&6_uur=Nb>cNUEse2!bM zLDxX2Km6VAekV0+*0hEJ<@vqoo$-_800Pdy^p6)RTARaaeQ+_TWE zL6UsM`NskG>u6x_XkagnweFRE{I141=l|HzKVEAZ+NWQ8!}3u)3+VX*x7~J|Bqf=@ z7DTyLzUc|TJRZpT{anr&;HLKifB4~t(f<`|icLB{zkB)WtFI(J-rT;vp`ju2@w^^E zi~W!0=&ZUm%NU^%Rrl)|MPAz1SiC6br@zv(1V)Y=X~g*E&Cy+1qm1lZ)jw#@K_LAn zuT6Xg1HolL_xfv3k-T$?iC^pbeqGD;x4->O&YnH{)5OkKC9=Tj)2C(T%$d@rO&jAG z(VhS&zTk{N=Gef^u`B0x&sk4e%GhT`&p!G3>#seR1ISM!+x)$;W5*iHsKzHZ4XYkB z&7)_0v~8N=dV6UfNA=Yv_wO%Juu{T5HnkUK)rxVleJT4KiE9EE*I--wZ2QfI!P2p% z+2^A~M@P%`*IzH6fBtz1XMg_uau(2Yb=1}-_YG`yRWfVl*b5L)?J#OkRo82Uf^xif z-gzhb-{Lg@d-m*+sHiAo8P%SDhyFP*pwDn_ynAN*FzMB)ysK@c=ls6((o0sITXeZt zBv3yeIB=k=$NEz9c6w^GY+l$WD9=Rhv%zQkG$CW^jWON5yr1aWp-astZvTG8iWPl* zT(yTCAHlPLo~Ki_s@eLcUac~sXE!s~d1I~%_BemJdZ5w005zwoeX_l>_h0YR=34*7 z_x6il{K8njuW`v!6PgBP?$-TczZl})bCC2oz2}~LnoQ+4j|aRp7$e$G>w6c@AQ%@(qoLA=W5rkEi-1!V2!^+e)x?y-Y}Azi+yH=axtRM zfoab!*K3BqdEy@P`bp(|MsB|OX7s;>YXG)x-D>put@^dfiq_w2#Bbv=9b zl-;{`I}`=j_qN&(qf(_xt{v~Zb8|soYYyPk_j(8A`3S}{$a|O(?=VhgjMKtbJNwSe zEocsLPl@)S9Xsadt7BurWd78SL5V4u)BHcDx!ILxxw;a)(krjLVx5o7-~A}t6R5j#7(pUzoRf>~STLa(o@5apPuCmc>x7|jc z;{ZfGs{Mx#AMUEL4rDx~eQ1uZ8$=Gk!!=-&;w7%tKe?61b8_Z^oLBty+Nv*S&z>EC znVy#{i3N0ToYo)wHO?lyj^+Sff2u9M5?|>z22O6tlqy%m8T%Y{=+FWEZ}1v``Sa%+ z%bxlS?Zp@9m{8|@xA>>1s3@5>ZCXiOH-CEx3uqrH?W5q9u@2UCv}~L#$2JcQ_;VEK z=akp?k2b`PcH7Ye?XUYw$BY>xSy@?^n63G?Qx?!1`Ou+5J?AIYA4i0T%Dm^><15Jl z_>F;A|J2&(XX*X--?uskU|Y>U@BOrB(ZX2vS~p3S>|KG4)jof}k8AemRH#rv^c;FV z{BMD8zWGKvckXQLvry7p!POnogLZZ%`ZBO{7WT!ymtx?)TittZZSEXawQ5yav}lq4 zCwX46#1_!?qMDb<9V;(>j*JMEzrWPMZ~E_2&nn;d#yqYXrbQ!n?JX|KbKRy*8}z?{ zYXBB3SYYft9uiVYR?O)h&^cJw<}|LG;0hZxXwX0o95_&7|IG{hw*~Yp)0#DFx?-G* zGVl8PcW)Y2J)qAM@r*a(8OGV2<2-S^yVv~Z*8GnjKmOm7G~aQB1@64_PS5*E^}A7# zq4NHWF8E8<0r-W1m2=K8smao75+7AK__y{1E9jZvXYSN?j0@vZ5CeaCvbC$@ zORf3qT+D}iE%4Ao58)?sw12K&j*knM^$U99FUbM;g@J)ro7+pXZQHi!e}mQlyz|aG zKh9&h^O-51b^X|m zg>o_SuND0Q8jCXLnm6YbXUtU7sJ00vzy5r$B}&NYP$9eE8o2|Mfgwc3lLSEurh+ego!J9qA!y8{D5 zuTJ}wYV28IR`A>^sOKcfT1~$IaOA^XBpU2K`4y{+Oo_zZ0r-phE z?_BmOI)0}=dBjySt;r7>iHU{ zwhjyE^F|C~Ukt;TIzOgcm-LmiWOwE`Z@TFwId$q(fM$4J)?XG_xNsqBJ)>-A&ir-u9H;3nCyr8eUbm@Zrci~w8>VFFwH#h&RS%W0e zz4?KfSDtyexudpe-n_YR?r~tktFvd%O6Sg<9UWgcKUjAs|9rJVej6(UB^(cnJvltslQw^AAgCD zD87$St#ehqL}Q;ro7Mp2*3M1;Y_bMg_-f~X>5qe-3~;nhQq7t*<*Tp0@~a=`#eTBD zt+(E4>^xeMIK-cSTeV`Ge7iAleK&~}iXSUrJ8Y*6O#R=MuAAou3>ZLO`zKfA`mgS} z=N{KFA-yUE^f?UVGtO( zPse`P&z}tJUfxeqliYP?)cEn^12d`fssXXUci(*{RjO3MSC(Mke}4Y{?px~OFF6mO z*bFS6-Obo%QqM3)|JM|!^9NhEZWYy<`OQym|K5NeR}}l%xm=8OeDhGzby`l@VDjY2 z0rBO$=)WzXYfqgTTU*~ZF6VrVEsOgG?3ujWGt1A>&M@#31M0)-*K$vvcC8;j_uO;1 zAj2#$a^y&SrJuFG#sDE9r6iDjtC&qak)ubCN@{AVBV+3XPfon&9lyLXV9#cto_Ssu{cRHiFXx;y=ESp~-+RW! z#>$cVi>Gg7y1UDt4wA6qtjuW5rs(R1Bxnt!;L;Q7;GeJdOJjA~B!(4j*{ z=KxAte|Pfl@3`X*Be{tP4;9tuftq6m^{nWKT{KSm?6c1dixSMb+?#H?$&sdp-m8-1EA@i&?OB;B2k+M6D|p_IVBD@1gz8@{f71cH+c|u3#vTe7fbe zb-gKbV&LXPn{B)8gT4|TX670IJyXQwJ^)VY_maH#x8Hs%@$vCS&hNjuzE;5I$|Zm8 z>X=Ple);9R?w7CqY=Ldtwn=!nJK|!u#2taUj_Q?5i|#+R+3#|1#A|M2K=uIrAz zrZF)wvUu@gKhNU4Tre!4J^$#BTPkR=pytdM|FsMLl74{2V&Ip{gu=2 zbwzrNe7$}!K9d|kkr~+gQGeH+@mkpD>3{$Cf6@Oz>;rJ>)G0|%Pd9RYzwH;bi~MX9 zHWqyL;pUFmq(X%X^7YqW2h5lA!s6RkVd^;-g`G#;_Ip~>SQ)_cIScz-^Lyk2yuiTg zPqlT#e_cH9p#9DExY{Gf)U}}(vuN7C2j}cP^}<}mJ^J4#-+XONSIqxKedfxQD<`T+ zP230IWDUQ#@BQ@CPaDZeRAi{^Th%`x^P{d+PEU;vx?Qxl?z`{4Yj(h3z}0i!U+~s4 z=AHj*SBsYuUvM4(@s9uF9c=oOO?Twi^ADr&q{OG0KE9(i|GF#tN}QG{=C$vVdh?uK<@j0d5#K)07f=8x_uf6X#&3;xKT2=WyxR()lw@G?zVX+O)t< z=Dd19EpYnuX-P{pkw9gJ7fwchj4Ci7Qjc4@P{rvqt zMfPRI(L($U8ro|NOuoOVD}1`{uCV^gp&HXU-acA~Rs> zSpYqH^g#ayQ2&4W>8D2Opos9m)&38DGC<-S*f%+3$dJpqVt(!i3uunT4ZfUfC?&5= zX;WlhhTi+R-oqZ)BbNcUtozqS+hv|=f+2c`F!iBT0ysoo_Trb z&>^#f1w*brBO@c|<7>h^>%=u`f6ebU4GGw@T$tyb-$6gy!oZ(?-^B5`tz*ZIa^}n# zL%ac(S&#*uc;X4id2+%px%oXu4yb~^ME@6=fg3Zc8~H5%@|V9v{|8_Vz>yKR8;xxc>dOH`ZakEarUa)m+535BiGMTZ+q^Q-7!D zqUoNp8NFX~{eMo>@{9VOue|b#aSSMX*A1*1usLtM13mxy_U&s?#Nhs0(KAJzn!|YC zg5#-$uXYaDv+Y%X&wV>za|!eqeE;c?|IglefLBqh|DQBcAV45=2)*~-dly0p5Q@N6 zRGNqgB4R-We}E{86)S=uA|irvRpcrnc0ig62-w?IP*kMj{xjTv5FsSzoZWqQX3rgs;N8d4 zjvYbeWL_M)0$+alrD*?V=4pOr@B1_LsZ*_hrPePGbjRZ`B9 zxx^4Z_uFs3U9^t_Wr5fIJugwRSiJS;r~O?S=YhrpUguxG?5Dm}YyP!qQpB^Eru^X> zZ@eKM$N50_71+3Oqi0-^5C6`GfoM^&OkV5Au5@xHa{vJ|uy%1fBgc2Ye*N(OHtqrV z=9_P<=xEvd+yjYWIlZPy-9iDg9c+#F&~*7{Atp|o=zbFC6aJyVph1I-jCnbY4Zr>U zt{dyQHr9iU4ZNPY09_eaIH#$n@od_(Y5$0?{Kr2EJpJ_3p0ee)oaXlV%(;o2scW3p zwOvi?6*6v&EARU4x8G_#2cXln{&U+hb?Q{(`dr1%m5;i!->JHWQmtY>QBBmff3>#` zU$P4DJY#Uz72K{_E_D3ljC*l@+ri#Oy4DS}%lkPIH9krd^={3-)~#DxCr_S~4d8s5 zm;$%ndaGznbfH|p?*q%(1@h&#)c#e(X76LODSfc)!4^i2@!M{@4gVj)Jpd<8oUlrk zENNVySFMoGwROQ(&u=ZR$CX!JDVE3ip#LeLYSq|S*=IbcT>`6JveIehb#E@8|E2bnVj)6xcoV0NG0Os1>&VCo?Nn>YOQ7I zYoAVx=~AUiS<1`mx);E?*W7ja|MKO_jg0APZ)3N{MaLFJMKy_uiLul=^nA%G@bk|< zi}ten1N?ODMXuG#CdW+Lo^>tp$c#otj`Ni(SK|MJya%9T$BxGJb*W+r*3sSWtZky! zPL|#W+jgMO#Tdd9)sOBiSzcJp;f`Ey$bxA&!d(fukPLRC2r;vzaKj?GQ!&Wa#!LdIWu4eW=*am z>VupZgAoxC)@Pr6rsW)fF8BMN-Hr(pCK%VpiFu-}U$?na|Eqh8)$yHRG0EW zMuD|!*NXOapiJ<(?B^x!xV~<{d5n4f3(xbTjX$&*+_Q{laZEiw$X9qMP_}GY&p0C| zW}g#t(x-3N(&SA1f4~g*4ccIq`gGOj2~Vl zV1|ROZy%V}Ks3Lp`Ks;Pw}(gZpy64Xy7t9|VqduYzF6Tn>+sJ0uEl|1;|8zyhmSU~ zAGf{IHRB$>2+_Qi8E4Yd(>09hG|4RmDpvIF8Iw%r_!-(ffO@9&qt#u=nalwM%)pgH zD|wPv?2K`>4(*X6N3@#*IQzQ04*y=TV1aRctLmIRZ}te7-(c&xdNq^Upso+TV8K8t?sQ-SgP2#;(PIVB-d_$Nzi9z(s9KcoM_ZwSymj{4szi%S-&C zK-H>MJzO`A3~E|&N1 zTqRi-403WRE>{<=&MGWLK-Oat-+j%p;Y-fzL zYSjw=pN;?Dx^=6Oar})X?Olsq|LR*#RFm4ZYlohQd8Z=^y#4muqJ3^Brt#kMuYo*2 zucd48fV#rnx&nRe>)WHfH?>*ImKo#jufH6L!5qXK1)4NzLcTO?|G#tVhHh<(lQX#o zAYca8Jk{37F|VGhUes-|Hs3nj^Pky<(W6Hj*QYfr=eJJnvtKi1Rd*iPl4ixnMTu%M zZ{9p}62DJdx@F52(LO&n7xVw~J$*2mG_6-C;5?SqxaW87#8Y&2Ustd0%~bo1q8E&K`y&CYnwo;{-dej&E`edzN5@4wK=wYWfy z5O|G%Rg{|35G_g`CMf00A@b$c#qDjr)QH3tC5y z9@S`tHAvE^F85?JeYGH3|6BFm$|o(HgVd2`R~Rns~b1=yLIb^|3AzBfAh^Z zmU@0K*jVA^>vP9MTHn3j%eDGm%`HftU)#2AolVLd&6WbHKP3B~&vL$&x&7MOuEhsx z8UNKXCim&_Jp-(i5((lltA73Z)~QpcY{gpMY_F;BFm?jtfe z7SeXP-2Cl(y)5O$Od5}ok&)KdUw^H|96;v%_g?OaNW;GSh%i&1Jl!SX42 zMKyW$*=Nlz0({nbo@sQazL3llrHdz6$`?@&$khXA?TyyYKF~rmUuBMCwO1-%;jO@- zLx(c<12@Y9Wb(_;^Yi@dDRs%2JOdCg0|R=bc#?bUjNKVCX5jxb?g3Ey^;D=(!MOfY zdmOt}Yp#D*cK_sJ#fn+Sj~@^3B0{sXpEGBUabv8{n+#PFnrSD(FZ-8$p?u3E)>uI>4!#^A`o6-70fG-(n=gk}o7{`%{p3Vd; zEwa+2Ya8}8Hnpyx-GSAKd*AGlas5?(z0!Byc}KITO>?|bpkKd!!|LwQm_WT|Iul@h9VZ)5;xBG8v5HOd)){yFcVd*t3w{6?zRodor zFQ9

LYK-ng-mnZNn@zxe^>i@tiNr)%*d*!aTh1M{@#6u3@PM$50kl$x4)fyl|P z!%>0z?z@j%=_CK&q;4T{CjLKQ2JX4JzH#IKvdbw5xN2QY9i8Em}d_1FIRN<9KN5H3Q4%wG@w0g9i@|I+pSVe=DHYkt$N8h&YQxFvl0r~v!orh5CTiD5`!M<1Jterb|>KU+Um8S{}95_&v#bDXx^;zE^cOhL0 zcs@IRM`$dxmR}G|G2m~>)^qI@=2Oc3`&8G8#fvk&+LpdKfia$z0Ij*@c+JH zpmx;)qOnQcE6EoMWT!yy-n~Vc^mD$_<=j49dy#KqCUXGp&H zW5*6p<^a67|Nq)+uQjfJw!YjoVE#g>6K@zJdq2dA6)SX1-?S+U1@64_PUFUlZZ(7s z?TO7D>FVC0p~M~D^S7r(i@>#*GFmoY)vQ_5Qfs{Pg#y_raP;U=*39wQ8URI;<1Do{ zHt{*|_#Dn!DX*qOy%$UyZn)uwu<-wPbe$fHGyuoSxra)NQfoJb?7||2N)v z!>E2y@$RAN4PA{rU%uT_R1@`#9A9QBFnaW8QAWJV^M3!_Zf%RZ8cV#$wR~oHU6*-l zSqITrr1n5j*LC?qfj|^c`$L+xx0K)Wp560PYh#mV!Yj|%>F>Ey>x+Y z?*Fg2;tHesB`!9~IDz^2^0I$u3Uuw_LXR;fdKi1CW!)$Ny}N6)+yO272$R@$f-P`Gem>-h2G zqH_R}_y4b4xzecqP_cT=Q*B+1Ifr-lx8mcX#B^!bu3h$tlfP=Kz?WZsX~o3Eh_OPg z5_+wYop$U4;GY^Jl)A*^_q_i?C(-!RsZ%Fy<1r1>TY=QnR8dy5i~0P`el8u}zr3rp zxXE#uwx3^9te)T6xbgq;%P;%Z|EH&?8`U4`I)~fqj;i?u$=qu+NYMBeSXeH6TLN&-lt~y^5xmaL;i>Y7gFGpPd;J3JmVTxRyoMT z-xbK0+d8^CoxB;~J@Db4OOHmNK{dX%N!K}Wx`KlVO#~QV_ zsT14;dW_FM|NKJflHVJk!2bRF+26eHT=%P{*N>9*S9ZsCVq&88=bwLy%>hW= z|G#9(5~Jd9L_{uY&zn75k2Upb$n8^6uUWf{mM&kuyePMR%vZXc)4%$bbG;__Yy1w!^V;=#_l&(j zLZ5H)g8S#6f8KZgzi;2ZM#bQ^O^di5XVe;%k&zK%y4-ThEp}2V@6|+szyA8mYSpTh z7&l(TK)-)xkwS6S$-M(yk1^qx^EqdCt`FUDeO=L*qxNy*3kB>dux{PDj5^D#wZL`H zf8DxuvsSEFVM#xasP+LMZ@LrT{hBvhG)NZBTXx6p;K74^<^RfY_iLiS#~**pvyFy72k`Fmo$&uW%V-P(tr`^;%UAX5*ViP{(hNT+ zz;gi3Tmy}cj<#manq{eL5Sd@fuh{iG!MtCsLF!kp%6U0IxAExAMxuNM!*W)yRnGt% zIdVi~4nX4me|0}YR_Cef@8V*ktY5eFbv?$Ydw``hC|Izdb@JrN%#h7bA1E+&>Qpg) zq&SuS9QBOxLk~S>uA$DJ zJ=+Hnnp4n40kyAIlO|2XV!L!6llVNfe%EWSy>?!g9z1x^DqFU!n6|f$uSMQu-aKFi z4s1!YVsp#oE+@v~>eZ`#>?)vQeW_BV#5nd-URC$+s`>E?eJxzLP)ygR^$L+U@&7?F(5q8PF+QCb_m^IJ zsW1Hh(W6JL{Q2`6rM;?k+^%Q8|Dd<1CTh(%zWk@a4?p~1scYCy#GG(C#@MlAtrI6s zWC?`SeHGDB5hC{)xgEfg~9R}_meZQ8WSa$NFD6tJtn=FOXp+lR{QysYZ? zci(+CTj|xch$>a8h{TAfjJ&DV&LZ#lKkqoz$I{PQ+a0q73KX!89Xsaw9Dv*R|Ev2L z>}nzT{(O03tiwCq-<$i{2U>{g^3_*gWgEZwqqz#a`R1EeR8*8GPm*KO>Cc)xd2+U$ z{oQxpiRroGVfW`6oywscCw%Lzie+T(iBV&H-n@C)j!*uG0(KNo&!dtr16vQEP@zKB zrcIjylKZKro)W7;p1!vk{-1jQ0%kyYI_2%0t|i?(o_f}1QMbjee!K1e)qM zFH0{UFjIEw;c=J9J!f3Kdi8+fH!m_*f!lAt-KcTq^tcW5csY6hOajz3$Uu*2=XGO- zR1%3dc48Ip4PW1{`u_8`Qbops8b>iPG1kvN|C~7t`H2FqC@_Ei{EU6UKJtZm!21+2fi*Ecy?X07#MX=TZq`2V077}`f}jS45m?8uQLUG@HIZoy6eukNpv ziU&^Ut&XvFal4?H3bi(_S0hQRrW!wfe84fB7n-TSsZ*!K_u_GC%t;(aJyU$|z4r#( zxeq`5u*mpS*HuG}A-pfVeYsTs&%3>$$XHNupnd!H0gq8$hyr#LQ0u<3FJRX90jPBn zKK=C5pyiz~VS-4kC|rT;;@_E`N`WjkTVA z_Sv91R9%CVstxz8Ph}2(YZ=-y(6?)8v6yoA-FF8yPI)m3*iqo=r=Paeo_4zADjnKU zu3R~5@7}#3$+~mrPONy;BU$0xw0JwGi|GoF#GfHR4=Ws_1svxG# zt+(DPl0W$n{S^58^UtlOO`D3bW+%=${oX!(`d9}J9I(|XOP4Mc(XMj2MCur>V`$01 z<99R`83StkvrdhzaK)Q#D)8U`{@3c%sgoG*PUpN(kEhn$yyK2LPWud-5}tnhmtTG< z@(e&qi3BZUCf+e4&7s3aI;5XUv!pHqXzMFJInz|NZwJm%KrP1|o6et9N>mH<>#R zih=7#RTE(|r$bk!H7JIHsiDq&ZTS?Ly_D6uXNM0T zc09IoK=Tw(Ye1@diLx65rvFXV9G`shiKCrUsglg|V#^+EAr^nmjYs_7A70&!eymbH zQ6y$0CMH^H|1iE#KnDdjZ{BRxty@=weJ}E^+WTEkP(QO#qee#g|F6IPTIBwpQ1v|beaer!Q9EUIOtl7OOmw6Of2~@zawWEN zP%{-!&-TrlHOqJF0u(A#==3%JlP6C)-Z2+ne6h$_9d}7(u^5z9T;g}k0i4UgPn-K> z1+Wmjeo;@8OyBrV&>?m;j_;G9I%$dH+m({CRw>E6pU`Lu9-}~{$AB*J8 ztNumaJU4Fh|D1EVNzVYNxw`MZ`_7d)05_ihSNp2ktp_CEKRM%m5UDY<_st$++T3{K zjXB0?UJ!l?eDlpW*05p2jGCj%Djulk7O%egYU|*^gRXU=+K()&&vyEE^=l@H#UQCz z$LHi+hv=-)%12v?u&>6_U3cB(+8E}*C}2l{@4x@v8Zlx-#-7blV&lQ-{GyJh=E>Fk z|FL7o?8p)DdnN8StXG4)sdEm|wQUnFt76nxe*E#rjq(58yUVQ^>_nXWV5Q8u|7t9( zd8(}#ccJck7I1*)g+?pz?z`_=YMngO)&@vONH~4(VyJr*2h(Y4|5YbqOiss$%^hi} zdxLb%m$b`lFCR+(-88m_2>WVmeE8vq!3;}Yivr>bsB7AT1`RSUUnVCfThpgcckN#P z3w6ZMp+jAdA5l>e*6$zpBX9ByKu`>rwhw@+)7@AD!0GG%>UncjpXXHX>hkwe#S$#F zCS)k}Q7G?uWJV(qZK9*2t>1tD{X(Ic-=n}81@`URcltWI?&G#_;lkGB$&)R0Jx1#5 zk3aqptM@)$bCFma3MF>&9=SZBgVx>J%Ix2(p8Z$rl=6iFCMd9L*DhhJHRSYG+u;HC%kT+JbA1mM~*l?2jH~- zU$ttLF`BA=89%&AP~6z9%hWytPVkV^F`6`K;z`WsL(Ns-r=Na0{TzLZ7A>@SHbAXm znVOnvEn2kbbo}!|-6~aN?iG9X0oDMt8((?9b8{5M3df1$sxDo+crmQ`Ocb!CfLc56 z{`>FOYL8vD|4mw2n)T|duUcv^124bSbA~z9sZRX;q3I1pYj|>ub2-LKEw3CZv$nGn zjH_d)G41p{08aaV^_-Mb=PPlXx0ZDfjUAWtD<`7Qq)C&!4E=nz;R>iVJk_-WHIF3y z++%!vyw$B+H%nbV`1RLcJy&w@;K3qecIr5}JxIOGyL`6(_0ta@_7-7Y<@o>mzyI@m zjMD%Vu%p19J$p{?8>r^arSoOpym>9Pex}NoZmxwBiaru^=VOLc60PCMU;5{-K>FzQ zr`wC=I48X9Raaf5wg3O?ufL4iW2|U$oOMF@ncI#nii$9|c=6&;!Zq(ff%6nl_Yc1P z_S>h|4pP_R^XJd+D8u>k<+D0=>}aWdPS>to>)Cbw^G^K#|3b}!I1#^dI!2!^rKn@L zk5LN-R?lxO!n_(2Zm>p>fUcQNRra_V3?sEnmLe8b5x#rS|U1ojbRqW2r!a0#?_q zT~FuBb?eqyYM%mKza*{)wrp5fikx3cvjFOY1-X`H%I;Bac|>UXy_X2U?vw zceYx#Y-!c6U*9TUzPweoY+0*f#fnyg1`Vt>ZQ7i^raxrJ5bNffZ?+aLTxh-X&O6qR zKmMq_8mh*Uh*_1&CW^-+>JfeF5uN&C`o!8I%&YsAj~+d$eGH(1C=jXwYHbU(cHq*b zOHbb;FnaW8ORbUJtXVUwTD59cv0}xnq@<+N-vtX6Je@mh)v9HwdkNCh(@)PM%$+;; z^!>kIeDQ^)uCtl)rPeKXJ9p+!j1gVKOQ$$ZTkPfUD+X3@olhtE-?3wdqjLaG-v2*s z+BBoIT)ViPc)guBAzDNu9qyYpB}dUt6v$2i^_-{LgVo76p4G7;BO|OoSj$*ECR0P5 zUqkinTH1Bq)fix%n(QJEe?tMY71+LgyGR`QVnZrl-*4-{mNXH4)O<2uD1ZXaDWKL;4kca(`<@S1$?Zjo?>*o5 zqRIa>QTL(*%Wf#IA2n)}bAyy4p#TbKrGUCuP(9xlN^A(`J*ysT6}0yw)|3B^?oPMV z{UgD!=H+YKwQHxP|5tm>#l)DS^bh=-02G$k=^i zb`$ZqL>)vObT$L3CW_A3S6iaaQO^(Yg#swxUj^E>ZR>h0QO_%#9mDuHIW15I(z~a) z&ZkqkRIMeV_M~>|9ssAV|G)6U3&v=u`eO0iX5#VU)rIcIL3M6wy>h-#00o>=K&?^k zR1DAVI1?|gDjt^t&6B(?JZh>>Ub{$ybu|t?{P08P1}R5E0Tj?qf$Ofj&h>aQD76fE zll%WeVqn2tOF=NIUqhVCWwT+)Q_X&v=J2mj4dzy)8G;!iY z?Q#GOLIIN%cju;SsCBCJP8M_Y#vA2vBG&~_9+fgBWg z?z!h&k0(v)79wxr|3hLxc|qj~gZ1HFz5beOuF=l_SE^LW82#EbDH0MVc5B@`Z>TGx z(cO37okK+C&nSQb!6>kM_imA~TeEV0PhykZ*v9+)GY>HHx;iqf*Q^=L5ahKefC2_8 zuxr;Y*W*dyg0bXH{C~&{G_RlRI-^d_7u3win>yY9ul53S>f9ubbI0{{L*~RzoqOHL zY9czReP;MV0Tggf0kwyd#QG+AGWG|t6JvOe#f#~yQiY&)f!I*xk2(Tm#Z zUwvijs<+;H%ijrwvqJ$76sTOevPhis;@KoG;vt`@=Uj!wZ zySDrO>Z8?NJgMu+V|wPXVESe2%UwlkJEwf?f&~k-@&D=R>BeYRJ|(YbF`{dm;vzcj z+__Uayz_Y|;Clsn^yncnemB0z9)Q8*ZeHtb{iW`ub*fIu?l`Z$`l|0^1}BIDC}3Fw z2M%;SrYxV=(zDv09OP^c@_o@x@yBf3?47aUm^N*i>$!9G6mOpEC4cFYzwGqIm?7q@VOO+hQR}b2{<1v>VE6w2jT<+* zKCVNpqqBP7Ym3@>R$Hf(ND$HL*s)_erU2T60!Aw^ckWz~@vGJewUftquRrP$FZ%J* zwK9AE<(;HF z`~Mj;W*DPczPvHk(cS4G^I^9h%bT&bSEzj*==%~A6aAk|I71ZhKmmywMve1vmr%#p zjkUZ#v^kJh7q)dhM=8deHEZU<2<9VE00q2IKs}QhXbl_c>jv~l@vOEd--MQLbkgm} zu5?SnqlL=%x$nF4&O1H#|LxkfbA4Q&d)}e`zfYG^p2dgbdj?n$5xHE~DkUYwi}228 zqJZxe_~3&NTpzzGw)N~-(z7_FQ$D6G@-@|Cvl@#qK6vn8-^UA15Cu@+e+vBk^Utow zm3Ga%+1HyqC7-9<(!59e60UO^s((HAeVsdZ_SF9$J$lrNi;FWxuZN~L^sKJ_X>%VD zozyz3e4zjeIIqC>-+wPNhN~9vEKa$VS2?a3HPY0pYl<*FdGciE2Pj8G0Tj?ufy0Ln zyB=3+RLXd!i2L8szy8^Z#$Y`KB>iDUJ8M z*~7E3u{YzhL+$5a-p75FTBbi5sj>ZeQl$?Q>k z|NZy-AR=%ID1ZWiD4^E*h>VPMHFp*%6i42);eFl8DJC6P?F}D{-}3sk@4WL)$lhPg z8`$yxx7~J|F~q9Uvl8PD00KfKEye$c*jahY}6ov0&c z&YbC)|5skqiF1%R#>l}HJ&g-%7t5@ZkeZrmYI>mED4@Lp4H`5MiFx0?*UQs*<%c}Z zIRsw^)~uXggzxv?e_#8tP6JT@1)Nhr?OEn_t^ec3-sDa00kFk@)ID%cjD>F9x_RRN zj~_p7xjmofgg%+a@On>e_4%1?ar5VZ0Rx;1*c=H3P~aa5bnV(zWE^jMrK_zRhW8EL z`=Z%Et9X%k5x)2A+4GNa#eYx$1^lf*xpMA5TeM?MH}WR_-xdQ;-`h+i2Rh*c)qZa$ zPMipN4j|O~|KEN0U1Ky-_XX|$D9siVc5A~Y?`$HX*QJ+U>hC1N*`a`k3Je)CL}VPl zv827H@yc$z}9Wb?)CSNFk0^y@TlP2z81AApb8_#Qf@}60F zFRT8lS0hOz7dqhy=ggTS?*G+u2TrtI;utrLt>Jl0m~&G-5xvHa9UDFgg)>C~VFhN) zm?1KbAO62ap2w`L@*=-8zqYwhA4=^}la!PsJZkwk6hHy56=>hSz3aJ?d2|2frwipR zH-3NJ$ZD>$>Xi5G)vK4N|37*1q?JFv%sN3%X!PdN4xZQ2(zt8+nyu>RX?^|3W7bw#$?$+Bx%QHz99w|G#Yp zURxxyUb_?iwqU`6r|+jz`}qa?9m@0nn>K9{sS}*gCQm}Nb!1n%Z655_tv6m-T|~31 zuDU9V$jh%#00o>-V9AmtBI9`C1a^I~D$eZ|o+YG4vmlNWnT<6sZkE@QcZQHh>y}z0(2*v-a=M9`{x7)|L zsBH<`EM!$H1^c@RmsJtbY}~kU24w`AiUMXSuzK}sk#Vf{pb0j{@OrcSwr>3;weE4< zx^>MO^t2WQP{6hVYHw<{>-`zm)gf=<{~ckVbE{&m^Xk-ixc~n9#r(f|-oUALyM3HH zuCMC|3wCR@(HB<~(d_E0ueKehIRFZvK-LPp_10S=cz$c#oJ zY&UDxEbGC=Z&3gRe5*k3-o0IqFFLICMb0xP=VjMdQqOEV;eq@2?=Ry2|N84Mt5Bgr zu8(6UG*QQRZ$&39>S%R6PD?l|MekN0i<;KWeCYX!D!*&;HITQw@IMcm3RKk_$! z)H#{`ICpA&5w_JjV0@tf3WS#eefzqFMdN$CnXI%{IQzZo`3+sh>yX~~e{B;J4MTwd75M3=pG4wc z-ReocT8DD7~!_L@4bh6vjoJ9Z3kwDB?&KmorfFlf*q*W=6Z{^iM=T>p2BfwoPH zxX$d^p4HC3pLymP*Zu#PF=LF;Lp{HtOU-z3uQDRKO_(sjFX@8wKmqL(`2F|aMaFUU zO8K;jUAn|j+TpJMzxIl%B5ZU2zjk4b2BCoK3Je)C#P#^1?z1INxSJ=!N#Chg*L0m( zJD&gS_o`>V-QNGNL4yXy=&}CU4%)+x-Y5{Z3Je=I%=P#(xMvyiCfENRW8gnew{xA@vpu|> ze>ZK~)K&j~`0!yXCML!RJ>p`cEVYNDF7@2N)D#ijuD$l!u+1-=I0{H85E&Wi`dBVq zJVBe-rArK@9qwM&ky@j+b?ep=!<5fJ0Tj?kflDvF)b+gC|Dw|5P5i%O4E*_Ne=B#4 z`}Lk3-=F#3*w|R>=+UD=%>e}S{Qrgx8(bg1ndf5nr+RKfr+P8HyNv&zG-;AX5uc`@ zfd3STi;HtT4i+gCr&avYDVEX}cjf{9)mLVZniefu_%A4MMks&+*(xx6_;A%-J=gsIop;`8j1KC#4V~)5e%(roXvhA4*`^@=hyu11 zC{Un)>tneCP}lQj&yFR@oA`f68JIG< zy6fC#`gglO@44q5*ZhCKe*KKmK|QyjQ=KSv{eQ%W5oRR?T8jdPDNwX%QP<;Od|Z@P z@k^&zN?XkK|LQqKzEA)K!b<^(_5UwwTY|ia|96yum!E9odc9}Y_h-I;;J|^d`Tx?T zWv*doo=d1d)$%zo1K zl72Gx|2J;j*uBBYkx>8zv{ayf|NgG$%}y1Fg#vz2phSrhB4hc)o&nm$F(+an z$Ix>wLdyR)Y}n8*p@8#10Tc*Of!@7)yPh|@w8sCFU!Bjdb*m@2&aPAb@P{9M2zU-4 z(DnbGfBt!6&VSq`m9?vzM_*h~M87Uwx&#=Fc^L|zKqv~7ELl=yEFZ`JYZu4;Tw6)` z|9bW6g);1T4+@}w!3y-~(Zlt;*}Wb2|NA*dd3A21g#4Qma{wz>u5{f0Po6y4^|9;3 zxvOI=p4&{jy7B5uD~ssYvSmwyGXzaX0sR#yRjQQhV>vRC`~SVl_2K%tQvSbErAqn_ za$1N2DB!39>e`f3HU5Q;)2kEf|AlM*a`U|B&u-#6yBA_Q*xyf?GR1NK-=RYXW6poi zn?1Di|C2^k716JL{rZl^Yz~G3DDY1OB-TM;{XggL;d8S-@WZh$A5cLgN2&EQ`9c8{ z2rmUBJVf8FrM0X5{g4~N{Tx1Bdyz}8J3H?GlatNZ1F=w2taWOiezoIG zV{3@;Q>99k@JcG2EeZ%LP^L^7*T*vZ|LGUQ{ayp9=jO7iC!GFWe0;p{h~?u@00q2O zpiLY1*HIssnu7ml{XfSUP@b}2f!reb(Qdv~UVTxw#Q}W>^8EjoUw&!Cc`My|wAb_b zpWCjfC8D9aH<>RKKmqp@khuT9NTE2#bC}=#E9Yl#&gA-0)kJcX%G1Y>A9rtna%2=h z0qqoM-n_Z%@kQ;kMINx12hcBT{kpbsf8Qs&-aqsG-+ue8WB&hz7hZ6E+-A1h?$2ox zYH2zC@4l&?h=v6V7St~8(;yV^lLG4gWxH`Ir}vjCmY`)Eqc+I8Ht>Tkw~m*YqgL$i z-@o5aA%Sy20TjqV0k!XEPI=Gn-_;r>eu%}KgMN8->eV$}=hrU(neTt;rI#G@|5K+< zHRin6Jk?gq@&AO-`Vq0Qu{lIx{)_@BU`GKp$Cepq-TGM}C9jrojJia>y2PnInLVYh z>s)7!moL8f!p;!ny(oYJhAB|1mizOIY7G;o;vvWJZ>|faZ~r~t{pVLQ^P}CL)22;x z%>SpRri#@CcFsE@BA4~c)-)~0|MGb)#WXy5@}yyzf##xsISM2uCb~YBt5wXWWgH77 zZ}J{9>Zk{&H*}rr%>2G>+ct9sJS{~56tJy8xpL)Pk1uMUHu8-b`Np(z$*wL8^lxR$ zmUYDc|NQgMu8-M3&nc(Z4ewuG+p)j##m-_ne)ZK?zRVw-6bk5|Ky-Ap>tnfbokH5i zGU^p`>Xl&nYT1J=T<1D7hyVNE|JGqB(*_hk0U-q>=FM-(ct$&zn8$1VnakYj*MIeO z{~ngi9BJogL_~yj;J|?#=KykA|9{PzHDWb^o%2=iRrfEt)$ewX``Nl4Vmf~G(MLiN zosU6*@KWH!i4!8@xK*RV+Qu@wv5@!cS#!PqbbArDRjyvTbZK}64$c+@!dL+LS)SUc^6Mvs~yS~=|$$NU{ymVCn^vUi;nqy+qhnwau-!-s+>M zz^R}B3S_6ici(*{5?dDC(~P{q^?%nG_~YY#R%B#^2+MZo0EP@1V%z^$u3XuObFEP+ zziWN&R1KG$6f2_TgAYEKT`1;nD1ZVXD)8y2pNfoO)-f{wT7gq}L+Ut^bJU|ojS6uD z@-`Ge0n-%Ny?eJv-hAPaR@(ajsd&!kxKl%zvIby{8Z~VB|3ilkWz2O%ii}&^a~-|Q zYCrC4R?aV?rP}+EFBCul=M~tvaiho>o_Spz?c*8sg*)|ym%8Rpj1l3xckkZL4^EDV z0w|!R0-HB)7Ktls7q=sCa{b>`1_q|4h_Gze6RUNqj~qFY?HoXM>;FmBx^~Y~z5lKo z>$%$JPSj+bS{4)G=E^It)G`OqC=@VVfpzQFiHzY#XExG4o;eW{Ifh`)~#DZ_WuhPE;Qym z-&oRK`+9k3pRyu)_UY3nz^Kg2PyhvjQDDW26(VDJ#ltPNk7uFgPu{0*9n_?5ArZdI zl`9v_u;aBTfC2_9uzK}sk+`Dv*&@H_n_v9UH*211E5fo9{(s4mB_aF&$&)7=ah?$o zxvT?Q(zGA<*NvPN< z(|VlKI21qu=M;GI$tOkP%5OXRkvF;j-&F>F7Tn9t?i|2PH{BGn|4&U#6&bU3&#_$T zJg)Y)Q#In8o9c<^nUa#?T;S$ND1ZWI6u9G#J4D9t$7?P!BBnVN8#&HDeYjV8Tz#qB zdcOw`9y~Ly_y-E0fPWR3J$tt6c{46Hikyk}7h#}Ou>{w7w(E=4`_t0WLiYdV%a=Ff z95b$2cvUY2^SMjzZ7!l`OiYY*>eMO!CKJvK1w2wf>Yk_{KJ0BoObaId@mf7Res=wE z=M8m5a+In~cJ12b(J1C)Q2+%b6__+>lIw9Lr9=Wb6aO#5Kx&7QuJi1K|F2S|N=W|y z&p-b(X6^rJ6KaX{d3JSEAb;ENTt_ixe){Pr$?(o+p+HzDaK#l@xITu}^Gs?lwm@PE zuhHLAo76|oKG4E-zBB6@wI&!}D1ZX~SKwd&`j_i*rD3gtpJ+55Twgh<- z|1ZM8^YdD|&hxqXGSvTX-@ZL)|NqoePZ@K5Uu;Mf>2oLQ)w~JOBDyYHw#l6OIY#jF3*Wup%XPjp>zG-yX8Af+aB?Vs0{>H>QKLq#$CXR^ zl{3Z%kehl89-%=hjrv%k`) zQKPiX12hT+OjY3I$&*%8l>0HCI>x_sL$Gy*7q72eE>R@+ck0y1)KEaXQ2+&kP#__} z{q@oxn%>YTFW^ON=QEwFE$UWJ63LTx=K%Wl?HjcJuUN675$9&wJwFpKuPUNzmo8m` zh|ate1yCR-1-|*_8CWw+&3r2z~G+l-_sHZ_c^_$TD59H`TrwFj)+|6%BkIf{QZvW>x%Wa6Sd?6 z(;A4xLbZ1zUnqbA&MEN02Oo%x-It$iV^mCYA}(@_;C;GVnoS;6O@wo`Pwj~lC!8Cg z90>(bKsyEY?b|03Pd;1MgS?6V7h_=h#M&ZU2jYXXdrfwG0A#iP|F&)0j5sfK&M!S- z#@hdxwc47e+KOl!85wCEI&?_8TtI_Rz*Gg6ELkElc0XNvkysAPj7$8~$A5d>7xQN~ z5#e0r?=Qai!qjj;yHNlI0#IP>+O@97lc=Z&>*#Lw%=J2VgwyA*c-Wjh06zWn(=6`+ z$jbk(Sh2$O@tWOyMKFK+{4I0V{#Ro|a((4Zn>Gayop}igpg-vnRDp*de%STAS+-Oj&*Eh`d0x)-@9PA+UN>hC zfR|o+DPaFUd-iPC$7?Vi|3a@#h>x;P?j2y5o13m@|Wuqo4o^XsN)YNt0ZUC+(XRC2ulkF3NyO zdjQ;X&piSAf3+`9W`5TBXTw@%?vvf2c~KF4Cr_TNWj>%$C}5%jO`5oWUv%^O$)Y*T z4}O(%aDM(l%|l7#{u^$%!NgENn^6D-0#qO^EzR{*Lk#`Kb2~ODikh-%iw;*9@;BqHou(T?35JybJ|UASVTqlHA|#WoREW zW116jkz+XT<3rU{T~Bi&N9S}5wKox8D1ZX~RiJL&x~|6(wH8~bv5xoYlXpz(i$SSo z>;a&>;G%Ae&->2m`TsIy%s8i+*VQp{%s(NtzEZ)08TUv0^_PDW3ulG`LJFvL%5w5D zPW*lL6tng-F)d%y-oR?TD+X2&;k{C&N@(=phm##dpIlR<%hDDcxyKZ(SVcb0b~ zZ*u>?I0MV)nXw0e+5_^BTzoqtUcH8edar{?beKkk_ul5OW;-xVR6yM~CGiYn=T^mxj%jY^T8=MQ&;7bhZV$k# zuf95SsPPj8P{2nDNbDu1uBDM1h*@C>6i3`o^A?b@{qZD8^)6hHy36=>M7 zq3gMGNN@Jc!IS^flS}H+s!?Ir8F#`{UvtehIr@LKPk8$2`_(A~`2u*>TZn{ZitS+3>)aaNNN*v@p-qkHRX|L`_aXXKz<0mI4hc+;I7Yd+& zwhA0Ma>R;_jdeYS%rJBxu$_ABQ)<4)w^)YQ}*{lD6e$BEB!`xvt( zo4NPj+1yB7U+LJfqqaGMhM|D&3P|iZ`AG4+FFh z1yCRe1zvysb&>e7>M=9-0Xy3Z@NYA`epdZ7ePV49&h2{YYSpS`>;KhW@e=cOcF#k- zU+ue)RbQC&yS`mZi*OSW5pjC$#~?yCFGT?q$WUP0wrwI~G$uOII=VaE_?Tu={H3kg z*IZA`ZX&|I%IAw0FDBlg01Eg>0jWK6)V;LC^6XF}-iR@kSqI7ET2PWE2=ZdbG$GtyhCJj7*Q`erx}St2&FY zuk!ijmtQV3p!pOOKmid2>esLDdi=bXO{Pyhw|p};4fd?FGzS~N%|Z}QBXrwshE zHBE%|Oz&&w=awy7F6jTCfBtzR&O<#n?}z&9#GV0Gp(OX$N6F-6#E238NG_ZO3J54L zaNt0(c=+bh4!($Keu&GQ!{7HxReWUCfMW`SQkC$3ElPf4{_ZKb^<0w6bFP>6vGqaod(~d=x+dmlgQ&#~-cy`SXj! zji>Kz<{K~Ir@Rqv=hCEZAram)YsOH2s=eSAbz6MqJM-Ru^>gCHiAJ1*s!9C9*W-6I zHbV1IdE-`$3DjQ{8`tH#0VL?%dgWCbIaSk_)t>Jlp zJ5}3#_kJ%cBI3f{Ae27lJ?IGo<}mQstj4~HXHLaMj-$ss!iMKM8c`Dv@63sJ^c8*O z1OrL=b6cnO=@BQ%SK-|c*Nv=ZM4lWxc<=@Nf3s%Ij5vpf|F4m+>gAf1W$u-7BIa@o zayJY($AFsq`{vzVzKUnmLjI|R)Ea=%LTdmLSDcG0Xo;47XP{HdV&qM({cFL%eYZ9+ z!aKKY+46$^zhudhMx4XH=eNILo{{O^@6B&E`L>X}o+h6VG ztD1T3;&w*po>M&L@8oP42#x{v{WCl7hf*t;_MXeq%afm2!vqFkKr05;Jk{1$KESlR zKzskLT{geeMXRxKp*lP!CdN8>^5mI0fXwIrzxwJcBigUd>(_04eKqcnXY2!5xS-rV zfEQwe-v{U2&<;SkwgJ%mDlTnVatesR{h@ znorkWL~i2RFATtdHVml!*8CD*IS+r-0SWPD+&}-`d+(j+|CcUZs?FHW&J$Fxl+Tyr zUfs)--FfpjyfO^NZ`8d24kKEUs}#Lwqf zxm=^@meWy>~vF{)L-;{c& zNBa`wCa(X&01Rlsz^cbu`O*iNk`HL-`L#>O7Dcrf8#&eZ_uY5jdH(#sMW?dm>x zzp^)C5YGVQ#4dl=$G_4S_WI(hcY69ZmiaYChwFLWer;_d>H}huy_kf4=%+gaQ5nzv zAJ~#c?qu&jtr)npUpXUkX!~u~)Y7WYova66Tf{y9y5}C+M}6c3 z1MK^E{`|Rczc}r5ysaMxDB1c|v z#TDoI|BEg%V~w9DW;gNe*jM`i@C<;yd54;SzHy2H_Wd(A&r8-6x_s8r-RYJo>l-;W zMmY}g9tQMd;MVc}y#}aDyr&((*C*RtV44%o^K?^5cgrgzYKh^vNO4pd;hg# zVDb~4*!M5{JW8FRr#>5=>quT={dX9E0nZq?xK|n9*Z<@{ zJ@a2q{i4=$HlZd>NJ#jH|Nr&ZUyW$Dx-Nd~vvl8&{{?q7HKIREV4XHHPoNtE?E7bC ze$OfY`~B}K_vTHACO6^#U;qX@VPMI<&3#}0`#q2N_56&o|Id#1CjC3LLrL-y z-VX*~K%9ZN*eL6_9sR<>1DKQ(XzSngOo4o6__n=!_nz_p>({RrAIqV5fa;a zJFJoseG*DP@*d^@!j%E`{rfvtQa6~V#e>t$SSL7K;|u3aZuKhzXFhbzxg0`h}d8b?f8?d$^O6pljTvIbbKBFVO*`ZN$BrE6yWBdyme`oEQ$JsG%{6EI|BxX=jA(N>?wj@Wz0Hj18#^rWUgiSAfq`(0 zU(^kO)eR=;bZXx~t6b?kwC!?V90GGu++OE10jjQ{V^ zqlfEb*opdn)nl!~E(V;~Gr+2llGlj-aiWho26F*^Wq^JE!m}puV=Z|7sA}XSydMm} zfa?t0drSSWtNZ<`>d%dWkGu8w&d3?}z z`VR(R00zuw;6G2dGoo(5huQaGXo!Z=45&3m{`j~b^)5BPF${e9c26U6V%f4~&-nkm zdChpfTwMpJZZyAcqz~ys7=Qs7FrR_VFLkjtzSx;>G=KpZaFhYA_nDs`!Y#)i+}_s+ z|6ia$fz$r~#EBDDL_~!4ZO$DNiT7t75C&iX24DaNU;qYS00v+H24FxN2Gl+kQBnH) z>Bz`P>*UFk*3UoxtiAVF_Z<}}6sJuehufSM=gT}S48Q;kzyJ)u01UtY48Q;kWX(Xq z0=bRw)W7`li?wIZ9wXXXxm+UtpLsqQfB_hQ0T_S*7=Qs7fB_hQ0j(G?Wxw{%KmXj? zxN)Nq{=Z4xLR$4Pb6;7{eW44wzyJ)u01UtY48Q;kzyJ({69a0WHtDr8L;1XqKKjUd z?X}m8Xls|&#qj^k^T7ZNzyJ)u01UtY48Q;kzyJ(r#egaM;=b|58`kpW%Z>2=1A3%r z)yLs9pT)T{e+vUJ00S@p126ysFaQHE00UVw(6?)8BRutr6)UU-3l+T0T_S*7=Qs7fB_hQ0T|GVfy)O}Fv3$WTC~WTH*cO1ZM|+}HLd!Xxv#9}zR(3- zU;qYS00v+H24DaNU;qZfiGhiiS2e;@Kl2nS)42Lw=e($FaQHE00S@p z126ysFpxC^Gq0;-gr}Y{V}^CZ4L2Ck)(56F!2dJP2Lmtw126ysFaQHE00S@p12CW! z1NYui-w02A^UXI~akW@^>H}OXK}8~-@*V4zyJ)u01UtY48Q;kz(Cdvta!Mk5uW;zOD?hc z_U&s#Th}gbhyQ1u4+dZW24DaNU;qYS00v+H24Fxd23}p*)(B6Xo}O-X>(t9N?h|C#550T_S*7=Qs7 zfB_hQ0T_S*7|@D=&)-Tl!c*6&Q^%@OrHT=4{b_R_t@@a`udL_3&;?y!00v+H24DaN zU;qYS00zQ|fgd;aHo{X^uU_4%Sh1oJZT)RWKm0%Qd@uk5FaQHE00S@p126ysFaQHu zG4RXQG$TB9<;s<TuB zR?(tGjcDtseT<=S8bh2byu$ztzyJ)u01UtY48Q;kn81L#R&B!l|HX?Jw~~{SwQp-= zWCYj#xyJ_vU;qYS00v+H24DaNU;qYSKuZQ9BJ_X$zetfHR#H-u_WnO6I#SC%HeoJ` zHZo@l126ysFaQHE00S@p126ys?lKS^6`{SaE?BUjm6({QeLLghqVWIB^T7ZNzyJ)u z01UtY48Q;kzyJ(r$v|xGNbP-f{`~o^goFg`+nF~ZTFX9W4$a*;H1tJZ7=Qs7fB_hQ z0T_S*7=Qs27)XeZ(%)C-&1=QR#%kZr{E0F6f9CmM00v+H24DaNU;qYS00v+H2DD@# zU)~t)eRW)1oE04%t$jNS7Raq-ADb`_MH`tfg#j3V0T_S*7=Qs7fB_hQ0e2Zl%AZ?% zUmX(@V?{*hzfM8ng0c92=J{X%24DaNU;qYS00v+H24DaNv}8beR^9gijEs!L|1*BH z96!uYx;sCKzUT`BFaQHE00S@p126ys&M{z$|L6XH=lY!SgO)G=126ysFaQHE00S@p z127PN4488NKkNU6ADhG@`Wyye00v+H24DaNU;qYS00x|6z?Aj>*#FPDK4<)(B@Dm- z48Q;kzyJ)u01UtY41^y8rtJThn3$;jItB4@Q9Ps0It4HQ126ysFaQHE00S@p126ys zS~3uuJ5qaJoj-qmD=8^S`*y}eM{3!}%Ynb6)afLN={DJ-v38NM&SRM=Ys(lfB_hQ0T_S*7=Qs7fB_iLl7WbbT-y8UB1MW= zMT-{IzMX0x#Z&v3V>)+^iT}d{48Q;kzyJ)u01UtY48Q;kc+0?vJp+vJ)WwSzw@Q>K zVMJS%rf}^o*XWP_FaQHE00S@p126ysFaQHE@J|Mg?oKztQsRme)T)n}f75sVjlQ98U;qYS00v+H24DaN zU;qZB82J3HR3kifojP@_#*G^r(biqBcgO!T&j$lA00S@p126ysFaQHE00S_f6$78V zc99XDx>>VkR@=61jcDsftGj5`$5L}id=B%LFaQHE00S@p126ysFaQHEpf3X(U+ipz zr|!_9gVn8DHzV5m_VSMSf9CmM00v+H24DaNU;qYS00v+H2DD;e{j(j6@YFqe^sxH& z?Q29^*Dh|SRUb3|rtkb4eM8^C01UtY48Q;kzyJ)u01QYm@ajS{?x{~tPq&5+9cqOC zU-eik{6F)2FaQHE00S@p126ysFaQHE00UYvu;SsCMtJH=F1f@SIdY^CZGGmx=34c! z)Lasu!@MO7zyJ)u01UtY48Q;kzyJ*B%fRBf&5ZEWW5$fJ#*ZIwL|dPj-30&7JRc0e z01UtY48Q;kzyJ)u01Uu@Rt!8kvyl;=dg8>1)(tn@U_@IVnASk6K4$(+-}yKChQ5IT z7=Qs7fB_hQ0T_S*7?5J%-dpM$;i+%F`DSbS^yx;lb@r6H_Ls^b5d=Ys(lfB_hQ0T_S*7=Qs7fB_iLih+rj zS2e;@KlW9HxVoqwZm=o=V-0T_S*7=Qs7fB_hQ0VxKC_b+dR zr(U#Zk+ppJawFQB-aQ5X&paOtzyJ)u01UtY48Q;kzyJ)ufL08obtz?pr(UsQh4r8R z{Kts4c5YQnt3H;ROX72ww}b&0fB_hQ0T_S*7=Qs7fB}6OXy2@;5uSS8x^>p3O`D8p zYopo)@&C;8!2k@v01UtY48Q;kzyJ)u01RlwK>eCYMtJHiTeetx_wF^Kt(D3qYSqWg zzv(;wM&HmkFaQHE00S@p126ysFaQHm43sOK#|TgT#TQ>#`}glRqOFAs#^V2(=Ys(l zfB_hQ0T_S*7=Qs7fB_iLih-p3xsCAD2M->!PM$nzMMOks-`<$$NUi!XcP}RSzpMF;RQ}pDR}`>yMB7 zF$ch09}K_%48Q;kzyJ)u01UtY48VXE4E(ySuMu84DJjWn({ReyQHws7oKNDj zn7@Pp7=Qs7fB_hQ0T_S*7=Qsi8F*t!dn3Gb`}Xb6`2W;YGwxYf^;j$XKl6Mr00S@p z126ysFaQHE00S@p16nZf{JfS%`2V!Dv@`yH*sx(nwE5AQjkM@v=HB$2d!t|I7Z`v6 z7=Qs7fB_hQ0T_S*Nd_LA-p~jyJ$(4^GyZ?vxN%0bdHTfK_L=J{X%24DaNU;qYS00v+H24DaN zv|ylb*V0CK=|>-Z^o;*szI?e6ZEoANh!%a!+?$?rZ}bcO0s}Ar126ysFaQHE00S@} z$w147g^lpiD_5>OK8yKF7=Qs7fB_hQ0T_S*7=Qs7(364ui7`fa z>CZp^{EYuUc<`VRZH|b@WgYu0ojCyJ`d|PCU;qYS00v+H24DaNU;qX@W#I76{zmxd zT)A>thYlS&S4vj#Tn7|Z{O?XX&*E1rsupH{X)OM01UtY48Q;kzyJ)u01QYn z@a5Y*jquQU^5i+~{o8ciWGU~jzEe_CjA;Ajm%8BpndgH67=Qs7fB_hQ0T_S*7=Qs7 z@RWfMS9LbRLzgdK{yhKRs8J&$+WzvBZ9MH`$@wHci}_0!fB_hQ0T_S*7=Qs7fB_iL zlYy6>Xl;atZq}^XdH%mgj~+&}{qZ{*+T0T_S*7=Qs7fB_hQ0T}R+T0T_S*7=Qs7fB_hQ0T}Rj z__!z|JoNkTzkitF@3B0mv1zH0T_S*7=Qs7 zfB~}^s8yu^^*a9F*9`o3Qy*h|%lF@Zf1dw8dGe$c9UX1NIc$5StFKvd+W#-OtEmzF zN}e}6&(nYO9}K_%48Q;kz`)rItb3+CH9Kf(>%agEzyJ)u01Uu@90Q4YqOD)I^`&-a4#0N|3`|Wi z!edRDGUbB)|K5A=HR2pvH7e{oe%$i@>bO5{>}^E9l8fbXFK1M;RPekp?Hya-|^$7|NryT{zmkxR1V^EsCQrh z24DaNU;qYSK#qYb}n>HD74k}*%wxb_0 zB#3#$+%b{H^ey>VE+3;cTEhSgzyJ)u01QYlu>RQ&)b2sl?$TbC&kJt;~!#(1l( zTen`&|Nr;D|25`3w*0#*F(il>l5EKQltljFGpKW500v+H24DaNU_h1u*6#|=U*gC0 z*6YJn=B%&&%P+rN(EtDS*I!m#T$~Ye0M9+t0{47t7{i^hR$OfB_hQ z0T_S*2?pZhqOAQNrBS~JQNJ?>pzj>Ol6#vQ;jQxI$@35I-=^y(tNf}S|M;$4xv~-G zGHY@j;ztniqi*#iBl=Y$|L_^qIWPbNFaQHE00S@}&w$!59Z##Tr=@QK@0)28Y8m0J zs#mX`qyO*Lt(y_&GGb5#;ztnvzjfonM)WJWSUwk{Ihw-&48Q;kzyJ(LFi@*X0qXZ4 z>UaEj;C@_Mt4sQoGs0W-?AbF%|9{n0R~d0G?VA-PegqLeQahA1qF*I)51&De0|PJs z126ysFaQJIF!1j4ov7i1sNto3EuRjO9k!|KEOXZ6o^B>oLOTQ@g+b48Q;kzyJ)ufV&I~OiiJN$NwA4!18%5jqp{` z(b3lN$bke`oBQyZ(gV8v-@`Y#gx7ODpjg z?r_0fO^xVNuk#U~PfY{^FaQHE00S@p1MV~MjE@JV;Fz|7=Qs7@HYdG&1y^?A3z)nm-A3e#q^10?5Q3T6Js4ab}V53ul56| zSh1oJUh!Xj%Mmj|m^b|M)Be_hEos)b@Aa~Ftm$T{=L6na*1>vhQ9EnZW34Q;U%#xx%ZE_QJMC*ZUSM+;gL|5>_J6f%)w1;d z7ux?%`Tt(MdKuy28r5bG03F9`=KR7J8&WOx?7`Xd3lB_dU<6xE!Z3F`_00S@p z126ys7iOSWr;_-8{J${_)Tw61+W-Cf^$XhnPnj~s2#=OGA=)~%FR=L<9er{*w&}BV zJ&a(BTz%nOjW%cl126ysFaQHE-~bN-*#RBQjo$CzdX!HIf-W55v%zyJ)u01Wtpf#n%%s!_|EQ_F{IUzxO? z`qHIKgZBTMH*Yq^|G)S+djOa;4)Oo~$ko(b^dk(w01UtY48VXB3=HpI9{m^oZ0YDbQN2Y~?? zfB|zEC{ifSI=OcM^*nO`S~GCd*cwLER?*SX*3qL!gZBSw4ZsQ&Dj0E&eY%v=niaSG zv}wne_Wz}0@>?^Dcj6ljV8BHNrWfmAO)c71?E9voZLCQ}T8e&;O>SaIevc^B(7LQ( z1F`Ra6|8FwPO2^TJ+MG6t55!FqTgK;D_N4??ems*Z0Qbgyb8zz(#otswk z;F5FG>a$WZY6!{s>7vnjMdzjqM8#z}Hys-hE$#t6T-BL+9{;a31Krz|5FZzz%xhMy zTJ?h7KfCq+mH$soO*P^i%aqKcH7ln1bGO?o?f=VUTwBKfGyeetFaQHE00S@p1A#Gc zOVM^#OoZ$@XKJr$w`)+2&l&@E7${LR-Ux4;mX;Q>|G)nF>y0=^H7~ONqcmcMA#;Y( z{=aPQB>caN*L|s_0;{Fa37ud724DaNOk$v3d~s19(6APJdfV})yw}~ijUPAm799_v zT=&m>&&@aA9J2p^>ZzxUInVz*-46ec|Id=w^7wz|KbZf30T_S*7=Qs72#SG`g&Jj9 zS7mw(r+-F7aA@zK?%{RQVppEEwurt1%dFGjr{r{#-n~XWnJ8!599fsTo? zYk?2xU6y*@ka|Ac{QrO+DMol=wf6s!BS%8^|7s0DwSJ(T`3I@@R}CU;qYS00v+H225gLTyj%UA5g4toONoSyU%fln{VZOo#Cl+xkS;i z5UPi+S+i!g-an`H|CRqAG-!|!=Nc6iVg2!OKjr`om;+GzyT-@KttnfH>;KGu1bMx~ zq}q(O;w4}J24DaN++?6&lLv8#2*|TRG zajt5Pz-(`pGVBT9QCLhjxvyQfZk=ua zzkmOJ(J_DSIRx|nOZt@~UKkQDB-hX^8l9JXA40zO^R*1ljcau<00S@p127O61JjFj zu%aX6)&tLzkg980qK1Jr%k9uJ&*s_f`R=XrCG{j2IEP+dTm--nq&U| zmRoKy;+&P%uP$t>1uI^7YLh-w?E#?f?~)iF@sTm)`w;W}x%2=0pKC%e00S@p127PN z42&$)P^4zdtP4A}EJi(#|JQ*<5}|99Vg=a~OjYXBrCCmV6@g_2^e zQ~MY%CXBIJlk12vHK|BT{6GF524DaNU;qYS00u&2pjjT-^}tn~XhJ>-I zKX?A0|8q?U24DaNU;qZfkAeOLYKnS+?(IrY&l^zB`+5H3<24tFGJme859a?}x^!{e z|4*Jg*_iWx>h7k*3j^ZC=WnHoF?C77dia0*KMcSC48Q;kzyJ({$iRfc&Bf|A<$Llc z##krz44|erpr-fh9KhpuG!|t(7{7n+Yj3#W2FLyX3opE2%=wQUR*6_)K&(*r)FkGS z*#jUwW6qju72$WSfP%_y6C2|GhEi->_CeVuc~GqET&`Jpj7rtBn5-alW6r$(gzd9nld6U;qYS zz;p)6=1vmz0}oAaNKJ1@P4CA!fZA0Hi1MB}?-k0=AAkJOasRK@07ywmF+ziw=t%32 zkNXiX42Tz(_A4jCRJ*+8@c;OK7=Qs7fB_hQ0T{5sK+}X$B6VA)|51BI`O#N$PWrDI zcyN1PD=I2Nl=n>TgZ){)eEERAe=zI+DgU3Io^FH&O0(A%wIf~_;Q!}NtuMk<{rD2( zdmH)Q^y?M0pKER~00S@p12ABpfu8xRiqvhH{-;veMCy41>UlrTXZ(A98&TFXnGfaX z;K74k^Z#?^%rQoXo3E-tyf7eMY10X4nf<^ZlARZW!jP<(&pd+xpWUf2BpJMX+>j1Fy@6d_g^5GxLS z(qH7>nxv?B{6E+KVE_hT00v+H24KJj12+|IEA9nWKH7?!-hi6kZ~nho{bX_0GyQz9 zKR@{31K0fjkt0W}+_`fbp+#)&NbB&<{=^Fd;zf;0`CVr!Dp!Q{e;Mo6a?K)quUXLd z^gRr~01UtY4A^HNF;dnGsOzwP^Ol^C-p~K5>yx=-B3<_uNfO_6f{$H&lm!0R<>2J?I`>gB!f6tyh#^{j{A7vfgoleZqJZ4C( z0oXaQBK{x$4+Ag&126ysFaQHK7`Qm8j<^^2WosJsyyo@1U;O`(UFlYQT$DKDq0T9M z`Q?|c`~ScG`pZgAHfKG=cc1S>yf7eMNUQ-^FTObW-bTLXnu+~uCTNI;FaQHE00X8o zFfO^NxHsDRa#!kk1L}D{%mJ)_wu3m|p?d$~#ft~+{X=>FU#$VqyLWG6beT1|4)MZ( zcpWNoWb6R25KAQFsLl2+{;Z5L6IF z6chvj1w`q+C`yxFf(^xn`ht{z!1?Xv{f#a$Wy{RmJ2TH8`OGHSncbcH-E*JkoLk%j z;Q!(O!2lQl17H9QfB`Vz0t3%QrIN|I&bG6j#hLR~&ualauK_);2mjC3k8_4m9_Qrc z<*DZXr%#`*nfubNRW#y-2I7SpYXEwf+-Q;u{hikH^?3iNIe`H%00zJS7ytuuFyN>1 z9)K@DmjXSn0X?q=|IgNsR8iFj#76l*%ftUG&OqH7!K!lYsOPtRK3k8^ z8Sn4x`u{9n@adv_4NvvF>Z67vVY?C(rwv+{G1Z9TjzkN53!uJ-SW|NrZ+ zzsTR;UvamA!+3I-q_?unX(DE1qpcn)1zSLNCrVBG}@9zNt0mRnhQ@j4p#sIWw z(?&D*X<*Mvit(a`H#Wj++|2JzK>;3$Gxca#BlP!9_V-4ubKrBM#s>z#02lxRVBjAH zMnp7IT(1@OLi<*?g_ei^SB!yv-72WgbYaHr{hh7D=dAa4rT)+S|M>CaHFKZh%K9qC zixIrJTAwkqWwhcWRANlBd?d)sEJnf!6d${@kf`S6_ z^72ykyKiq^q^Re;I=&v_hTwU_EsIkX=c$}~ApAf4KNtW5U;qq&0WbgtTwoy7&0BHJ zW~=9Cj82A*7hK0{HGjd_vSm%=$38wjbp85uZvLOm0Z2_%-ml5k2Awiu5jO;n8&{6! zl83ul(eEJE07SjU$n_e0cJL1dzyKHk19C7>-Xl;^y;fNNkA9>kbiCj?UaS7UL+cn- zSuV`BBfqz8+twxT@9O-2=Kr66{&~&ZFFzj(T|0@rLqz{>Hmn<}I8%>c4M5a9T&Q`- zp__0G=x;Cp2EYIq&@uxxydo6WYqq}Vp?fRC|HJ>w&H$@D`gp55m&KNAM;}j{HjTUg zXL}Di`o4KSA8Uv3nOEaT&SBX7RTXC{E1(+uFZ?eU00UqE41fVJ00x|7pn*@U;(E>2 zGvu}}C%gA^M4#fh;(G{Z+GzE>7OHY=%d|6(4i?9_d>Ju|x3O z;qp1k?T4Q{D?ZTvZFWeEyCyN z-%a^3WqCn~@c;1tU;qq&0WbgtzyKIQtzyKHk17H9QfB~Ki+!vz$p6Qp58!13ew#`cQy6k+j&|92wa&r@sQwV`#v02lxR zU;qq=!NA}!=;Ukhfk?J};N#9S#2r z{|g4d02lxRU;qq&0S6fv6V+OE|8(%d7Sg{{FbV-TNKas{%z{islxjIg9i_4 z>Rt}Ir!r!Q;4!2|LV)5-4Gn9IoIi3PU;qq&0WbgtzyKIsJOqd*W26kyyM4@3+w;c7=XCAIL+M8$S^PZ>r8jV5rN~#qy4HV&Qtq< zD(LSW?C()`;a_(_8=wuq02lxRV1PFRo+gXpI?dJ}t)ABcx?N!1?x+vv@qFg}!b3b& z<<^#AM;}+LSW#B*FZcL==Kmjh=poJAPj>&ezL$zPB5)j8^+t2Wd8*|Lp$pC@cbUQXEt8vp?fPU>MIH}>+0_tHf#{y|6jd&m3(}BG;?3e zMtKw4YaX#d+NizdJ=osGGC0<=4^2etv#bP*5Pe|7UXmva+&NjRlV0%fip!v!V@RiNLXB z%+N%|d8+4A7X7^g{XOa}eCsW^|G58P01SWuFdza0Q5HYNHJYt%pFS!Hnq6ScE_yy< z`%?Aytgz+R(Z^l8c9q@xD>46{`Tx0d=c*bD9KDx?pZ}i$)euVrjwL&nr7O2S8x|f5W;?XMmr(;{D4*VGYpV+u7fXP;|~&vd!XX_ z%vR&i8k+*WF0fvA#E+}}+)qDfqbjSm+&c5PVZ(-scz>nF|1K;Ecqz2-N z!109Td!702IC4&;bq*Wq2z=`Zxc|8SU;qq&0Wbgtw8KDo4|VZh@_Hi% zRae|gIO01>d+xY#<22|0_wL=Rse4?hydUNO2<-olZD_9wPftWNLk_^soImuLcJvwA z3T*`jzyKHk14=Lu?-8tuK9juCt62XZ^-3rF3LE>+=6g#VY2kR_zyZzq|68|iQA|vX zrtb4+A7UQ>k#l^NpzBH0A%%%2MUUNARdJqTtn1h)ksrr3QFj3Y zU;qq&0Wbgt^u|D(N08#$%(hnh+QjQ2 z&ZD3J55;-P@UIO25C0DazyKHk17H9QfPqpNh*f$2zc(f~fKC@wr;Fw6@lYQkF4^F^AzpwkN&=t{vP!a$Lb@v zU$|dj01SWuFrY^UVyv1;PVZCNwcecC5IS98oi1VypjW4ORT(Xf;nMy;c<^Awe7}@W zP}2LeYp-3qR#W#pz|Wno9M45;5j3{E`%+_7czQg%3333)0e}H800zJS7ytucpace@ zta~Sy=4a&m|64D>|BL9cMSV|~kL8k|k405RUFCiA=FOV-|2J;jpx|J2_XctGzAu~I z6#idO|Nr};F63@8EB-xh<6jB=eF^=&9%~r*OsLI)0WbgtzyKIZudU9$evaPfY0o67!qbqjhR6Y63;-Aa17H9Q zfB`T728v<8->m$)%(gyi*Yb4ebNGL|82IgA7xHjde$22fpRPXsaGvs>iwTL1?!7C>dV!7{+VqZRq_8#e9NJ~FQ&goeaBe!9ke&v8w`K}FaQRMV!+d+ z?%e9b>)P4n{nXN=cpWiog{)m(n^<2Jzu>Cpl+F(d3Zm=Ruj|JDvvB}`vpO(vSl{4gd^*0WbgtzyKHk1BDovWc}S##-ysg|9WQ@^tr(L zT%>$R|vqv^xURs}D>7z78U+Lr0rAsx{2CVH)Z0dj*BWR3yVqi5@c;L)ZpXBSS?i!(v-uJ@Ke`ZJx_@5ZCem9~Hf=d|=5gP?eO2@R zYz%-@pI76!di82ewFPUxbqiV{)(9GF`gg0K3QyUA)!_f(|G@wl00UqE41fVJV8g&8 z)_szk@jA|)!|Fbwc}=_@@z(!aJ+FnTTsq6M?Ro3gt<$alzj5ORg@%S|s!e)il}D@* z)c>c4r{vpY#=rBp&RV?oZO)jV= z7by?YrERRLTuOX8dkhZ`r@#LCOSk@?jWHNBXppAbgzX#o>;BG&Hv-0+>!=2LF3JU9+gz#sh&?+^!LzwU;qq&0WbgtzyKKd ze+D`RR8>WTNuDgTWi<4-pn6=C9KiHZNvbj_vFXZj&z?QH_y4zV-=_HZculoUy;>oN zH-g5SjqkQrg(Y{B8;yx@hAbj+i%=_T^LSsK&Z~gx^#3dl4(^qp3Qy7Q{?I(oJYWC}fB`T72EYIq zurg57D?%0hCHbbAW0Il81=ZprJiSxY|ZR0UmVu zST5p@fN^Krk~Gy=!a9J)Ti+OKTBFUu02lxRU;qsKn}JyO0M+yt)A8@W+7vomKpifE z_rG+s8wL8itIDIR-m-4px?H?Julhgp|KrDx*Hjy^Hl9DVA>xjJapz`!cPbm@tqM=c z-qFbUqwWI+zyKHk17H9Q7@h%Nv$}q3=dyI@Z~=9=2>$=IiSDOk_*L_xY%U{JRcR{yfM3GynhQn{R5az1V*9_^yc;e{P-aL2+e$RpH6s>`4=% z(hS?@8>O~^&xtx77ytuc01SYEq8aEPlB|m6lKd5$+YS9Kp8gi0P5N2)g_Jna%5mYs zg@*P2fByL=`T6;2s?B`7-RQT2T@Zr=9Dg+YfoiI;)FY@C{6FeGU;qq&0WbgtzhQdNSRJ0{PrrWsG}UIT z-DZtVK@1Ww27UISdgFiMJc10_-=hvvbR7iu1@{FEfB`T728_f&W1n)W>i0IyqM*G6 z)ZV=P|MXEws&Xhto?*a%0o;7QlyBha{n=}8-@aXQ?N+^V0I~7ryqU-A-`xhRO)AH! zH=bljSVQChQ1<}?U;qq&0Wbgt497r4k6=~xJKNhGy7z9~i~G@oY9y$;2c;bTf6tyh zhWG!sZ{McMl`E?nL*!_??Mu@ThXl++jvH1>HI|aF7og$vj*)6R_^ha9f&nl92EagZ z4EUKnRMT5bx3fAg{4V^zEd!euslNw>s~)mSl`6!%uT+QUb>v9uYq4iYLS(4v6xw!*0H~jzK41E7- z4lyq#@u7vI#bTi!e)s|Y-)8N>jEoFTwISnd)WbFZ<`BNTbYHI4J$h$GW7SylG+Ag& zWNYLAQ1<}?U;qq&0Wbgt48cIhfU2tLET*?D)^VK$r}Ch=;s5_;;HigdsLG%m`GpQ0 zItbzYMXCR@F$nLy_nzk3F+9YRt{l((n?<$!EncVOTmx&9paAverDggj7^1&NZO1sZ z9keyt8VrB|FaQRMV<5#lMpezu)^>*WEm`{->HaXC9~$hbDuZ(P|K-b{SR8UX=|6j=evmC&XAwyJ+C$6?7J3p~X zAocW7`mC`j(Afg&Y##ZKPu^;&I)8Hb#Un?K z!2cIf`)B^2{WNLPM04$$l~xvUNx--?X+#}WS?U#BN4Nbw>N>`#>!6*{&R_rxfB`U2 z5(C`=YpSZPnD^T74(eZ|^q>%Z*pj5?cu zbvCtiKidP+Y*tU#+pGUed*0&3i{bxEsQokl&(=l=4-Z$(vz69n_Wu8ozL=Y&b{w$h z_0-N2_6tdZ=FzFVe>B&=em)lZ{ZJRgD8XXXd$ZJ?Pg34J5dI(j9}Iv2FaQR? z02t660~4+59C?`BRMqI6GGd{v1=H5{)ZgTO&Tj|1kgwHi*;|(t<#|s&`J`~Qe^LE^ zety1ne22Pgi^{>t3s2WYj1nwH6`aabeUH!wLQ{0t=NqA>fzOEA9T)%uU;qq&f#Mk$ z9M(W}|26ipTF};lX=}N?y*<}cdrdDne4)u?qBCdC!2g#r_Mg@MrJpu!+Nd65Ty5*J zQQpM-rac_vIqK~h!uE}EwQU_azmi7?{6FeGU;qq&0Wbgtz<{n8Xdj@io?_Z-)f>&B zs}1h|ubs@J=m>9BwY(#`zqseNYu8Rl?=NcopXC5ntXQGBc4qBAZ%PBiDZ%2@sVyCd zteb9dyw|hG z*Hcx)%jFAJty%^DZ&TZsYWyV~|N84MDqFU!=GwbzMSr@P-yN|^upB^IlSoxrO7IMY z|3}>i41fVJ00zJS7|;a+Y=0vkv%9KVDk9VidRj0&t#*FkuQS~#A>LnA?&R?Qv9Ymq z^X5(Xe+T_P%MFYfGe&dm&6rs+ry1gvVDXBzi5%Z&N3Jm-w4N^dd?VB}@EK9N0|Q_H z41fVJP&@;Vg*R4RN40Ae4LvQGo>trctG$l5BRapN=Z+gUPFU|R^7wz||IeR4PwwvO z<{C?COMCxUzjg@Xm0XLf?P?J^a5DwSQ@DK-aEaHP`Npn=Ok|5wiq~ zS>uP-R-L8$LXtJ#=c67{d_4sB2KNRGfB`T728_T!9q%aBH5A6v8hhUVx&^INXUU3-+JE2bwuoDT#jSg?<5Xvo01SWuFaQR?fF>Cj z9M(W}?Nl=%5E@!A4K1g)FYQ`;S7xZroE-iyB_&08@2`dWKg$6uT)0q^4D`&3L+lbP zcI{l2t~yIG7z3b5y@MK-{%TlgQ?w}<00UsaaR$=-DypuX2KP#Uh89dim*&~!{D0TX za;h^YhyP!+Xc7Fs47Gpe|8Ly5p~<}f-P}x+zpW$UmtgTLIWbuEm~wA$ZFpeReZT-1 z00UqE41fX6F~H_B%HfS1xyF*0n?OGcrk~~X_a$BHQq-7KfKFYQ`qtmCFF*74It)z?M-o42<&UAS-o{$Ix0KlA_W=f3;y z(;N?s)qy=R2B5U>yW0PM?7ph1v*d5~r01eikpsZkPcQ%mzyKHk17JWC3?zD~zXtoD zdn&{K8`S^z>!!`x|DZvGG~@lXRR3rG|HzReWHMD`wa!~Yx5|7*4O&%Eie zW5?kC6{!77V*pZ9Q&o>ca(KiC??o=NBtOpMf7$6}RcFb|WTDZKt&jsi-3JVS0Wbgt zzyKH!nt}cy$*Sulrn$e}oelqQK>y!gqqYCc%uG#rf34O3Sq@;;s#RQKk*hfXi~;B& zTrA(dG>r>O&3xm8?(g+fyTE5bEe;HT0Wbgtz<_fMqCr4d(s7*_Ex? zdH>UciVFAQ!czC3 zTJXQffq(%p00zJS7ytvpFwoPgO`OrUuAZ}aW)t{-gZcmaah0}0zgxR!#V`&Hq>lBdZ+Perug-sc;ou7S^q8Xgz`17H9QfPtbJ=n%k13%&4kU1(x~ zG_gJY-IeEju{wiHrZQY~cTt|+k-rTYGDOqfU+eXMmIKJo&nGuG_17qIgp=Z)+c7l; zu}+{^_tlOpZsU;HI=j#!MQah<7u**x00zJS7ytw6Fc4|+zQo1pRVDwPoEQu(ERYs1&AYq$|LsfDxNs&1!}r{C zkEVUUl(W#X@0Z^D!Gi~_V@R~Qenhi+;fQ$x#k_+bXL1{l6k+kD3DN0X`h3(?)TyiB zKI1-v0Wbgtz<{U>Bzs45@nsnMudUj>tNy=9au^rREls<* zq)*;zi5!4HIe>Pp`1F4)F15GLyAxFx;C(@}f&nl92EYIq&?f_9qFR%?N&We>Y(1>+ z_GCi`3#5Zx_4g&6zw-6wn)UvfnVGuq{(6}IFZus1TefJHr`pwm=w^O*#6Ce{AI~*O zuoj>`brtk7+7%3d0WbgtL}nl>pc)q)-MTT>{V&Nc>*;^Y>(r?p#Dz0CYX3WS?129l zsP-@A09v$Yp;@Muyxau-Ul9M#Vr~0YG2B?fT7b}qB5OpvH}DAtzyKJ~9|O_u{#pqJ66U;qq&0WcsU1A{{Aana8n?q>RRe`jc4LA0-u-v8RkJgQL6mkVcd z`2X$Ox5NJnSo_z*7=Y=ck`Mz0ih&(k^BV(zwE&?JMbwCRPv8;^fB`U|KL)CMg>&&` zoibvfdj-;C^@9pe$`@2**Ywr$%s z_i(^_R zGd36M)Rqp2hl0ez{U7li1Aw&vq2nCUad<9x0RvzF41fW985kYeidd~d4xi-cH6FaT zGPJHBT30FG&#rr7QwMUln7J_KD3e7!Uyrqaz50Ka18CN)nPyq*npqApQJ|QZ(}v#| z02Yg|79g~oy;=^>11n$v41fVJU@rr0{3~(O%B;Skr0>MF#h6==mBv>?7v<^g{ae$f zO?6rO*R%g$yLK(Nm}W0mB|UHZ(lo?HL2>{G*60^qRkQ24_OIvqKg$7p{PD+{<&JT?Xl7%?M?vD_;dSlE zZ055*E@Q!BGSlPXO^^dX-3JVS0WbgtzyKIQO+jWJhi|E*fJ(zW+Dg8$#KV~1w> zWBiUEUK?Wo1jzv$S>KM_-1vgWf>uhbmwDX>Ql;7MESG_+wfA{X)@c$Z|_b<)=myT`Qw$*G7z}w4>zTTOISSd)X z9MFT`TDdGHv3+`;h-l_ipRaU10oO;(3Jib&FaQR?fY=Q1to^rc905Hmh@LIY!#n%` zZ+2yqk2jw^CFSt`+1c5;_x?tx|Fayxp+kqPbGNm-_hep&@`#s$#LFK(%OPJM3)g&7 zC65rAgt`ZEAYcFtfB`T72Ec#=4DhV|GjF!!`u=_wnPp9IRG#K2EYIq00Us4R0eq0 z{$GAB1sYZW4eN}rx96OKQ+ZUiqCZz{?26BFcXy}!{CxO-9nAZeyuWn3|Ni?m%Ozua z`luwtPC;VloC)=~vsB9~vef<_^%UjnDY(bD$6!D?241StndYYSriHB@qW3%ghgNiY zl0Lroxxart={Y2$#Ycb>Bu}@C6*i@F2M-=>81HYC z`Tvst|Ni^$$=jQ6-B#kvnPY&TJF)rah>iSX<6qV>Y&8=CxyQO*!F3F!U*NNp^I5pJ zxVNe?5R*Z(s^`*z7K7-+E>F|uK`+whPtT`gQ&-U0IqT{CJG)Y zI``H#y0Y$sVxC^^e8H9VC-1!H!;{{ptwUbA^I7IK=ucD2wL{!R+|>*NZT%Ct=@qtS z@-O>4L%Ry1U6t_v_vXZL<4cbG!N`##4dwlfR{v)?fM0+8l>!0+G|MU5J9W>BHi)Bw z#L?8ok=$9T=TlZQ8U$X-c`t=~hkGY715?Un(pyaj5F3yG#i#}J?YzyJ^7)SD4GK1$ zp&#GfO$WvH~-3Zhw+@cuiOr4#ce za`A%+YJ^U75i>?wPDi z+!vAz-HBQh7ytvRF~H{KFUxv@b`N`vzOs(l*HTU2QLk_B^DkS+HL&>$yNA!ADDZZXr>JG0>bb?X1wT-drbg1PY}N4{X<#EFLU{zk0- zvmC&sOP44rDoWG5VjWffYXC^Of*x7rxw91P=1tE8#pmYR>$ydL-Y-k`-Wdi|G)mvDn6oNr zMLiy0w604ohX?0%jk0CS(&fvS;r|U#`vqvCx+AeqaC$$i@I$|BkJ-f8_c1>CcakYi7>As5yaa8_(Ryo$PviHnIH(Fkir! zo?OjbObxGaZra3bHqnvw?NIyIY3={p-Pz>t%WqzZ965ux-+tSW-ruP8f0hHddGjXK zs#S|yT$F>`-1g-VR|Scy!|tyt1WSE_>&mA6)zm0>E$Cn{z@GtDpZ>7xGxX)eCG^M2 zFX8tU+@cp?jV6Q+4Xp zpcZU$yl${{v3{ouGoba^dm{Jh2vT>R+Boioy4 zTkG25W}*|DIzXT5)c>!T(@gXJY2(I?hV}kNuK!CpfVOShYMSBlF+OzZXg9=I0b=Z1 zFEkW_B{tqqZjXTL!FPfI{V*`2awqzz`xrVoeHC5Zcp7znh3ou|<`gciIZB7dEvEM} zAEU`-v8MoHkK?hYQ($$jdSqbFO3_{K=7(=ID zT20qB!1Fum$$35hw-x(o=g?PZPSU-9wAvCTlI{D#;A2z)ANBzGeu^hn9 zKmSYt0sQ7kxx%q@ZvEOJ#P;DteB>V=AL%PbZZys#h$dR+074T%CxQWEG4N8A&b0o% z$#j0zaQi>)KF~HdOoQ=VPItzUTxk zDnLC-Za;7{zdJRo8_JC>Iav1h_ottJ`U(C&bKf2RE7ie`d>lW1yr!9E--}nqr6A@C z5OYOY3y?99>7Q_yHh>Q_mJdXG8>hV|$7ImLRuA2&^DUQyNpbTgUh(Xd9y0iZ?%26W26wD^v+uHPj3 zWyxN6euH@aqVfQ&{Wm-?m8Mt9#&=z(-}T~rzx4ME|H@o7Y*2s){dTYmG^hX?RBr$O z&8}?n_to}VX%#9|pljEz!T-bm|7+~Sf&~k>#!fkMTkTuLAodCnd)ZomO;f^z;EB}( z##`$Gl19K0bs{jJeFkP$>qdL^+tV!na$03#!s z6I=I34jt+2HCTOEZr_RP@t@Pm+90zf-!&ziWzzP%B}x_t@9&Fi!`XH3q0dInBaHDs zi@Zk(c@MV7!@+Tj=(Xfti2VkL{Z%~q&daV|Ie@O8&V%+8KzquaGnqG~f#!Wt)22=D zcs%BN@q_XIMXh(RZ{I#Lo6VYLosGf5JOD9rrlPC`Xewi(0ih|-fdpS;S%iVzEeT0S38w z(U{2A(11GCfbjR)_V>lL-@=v;QvR!J;rZeDU1EUc0gg^yhCKsx7XP2Lj{EmA@tv2Q z(*}A|?wY$O*XxuKt9d_!{r-v`^I&wZU)1NnaNz=lhVmUtf7fhWRS^F~H z0i1)4Sal5wd_hQA4w0rm*y1L=iUG-UbVD&sO?)6#vO`t^hNFTwl6|Cj9jSsviWAAh8PfB^2X*45bEHM1PzG-v9djZ2y^`5x9{@Xf{uUq z^W)>RX}}9KH8vA{gaCcS_^33BcK7G5AD(->7QDX>z5jw28*yjLSU|W zk(_m;GqtCZ&iQUnHU$TI2%}4F{k$WO6B85Z#*G{B|M34V*Z!ro0Jd-6u8Xw*)0;+O z&Xxdi`@ovE=QC>i_oD|D_y2-@bh{|NUU!v6*9%5x)h9-y;U`U&F^X=Jp7x1zpEM z*A=Jt@OSO!16Fi;k}iI91oQmi|8>K_?<)?_icTZZSE$%mJZatQ&&TY}U4IVkUj^Dx z0PX0gzc20i)1FD<&X%nfb@uVVfdk?F?ezZe|Bm_p3l}a>czC$xzb9<{xg+b_A&zs7 z^rpb1zD0Gd`|O#tRcG03m@cs^Xf7JgStN*hc!0p?&DK#}!hV)LTm1u;(E zs0{q^!2w#@emMFKnfi^9);a&aX8!B3$H)58A76HbPUNf;<@Ww;9Y;5-2XMwah;)v( zw>RbI=fnTQ|0_1`UmE`}9iM&nSXr`+QY~Q2PP6o6Ph` zSVL$znY5gqye>Y=KY5JFW!ut@M_-`=>)Pl>^?mr<$a(zDfc1Ou`7>|P3vnILcev1Z zjJM9gV{`F%`z$s$am(UVcz>OFf0oawP|lY-Uvlt0apFXHe@>i^Ew|5*;8prC-N zRja0p?@ymD7~AEjUsvM!V;`#}6i>l!-ZVP06?B{nIu2g>AFr&pd+}1$F4)%(bNrF_ zDT09?-`Pd;8umxu;bh;D;u9l;7I=Da4S0W@d4Hx|@5zo6f-hJ7f6baT>H78S@c;1t zs@49bF#y}PZ6mhdq^k^zaQ=c98zIhfj`M5})|L$;gyN~1XE?F-hxO*&@Okv>%hhPx zchesxHs1N~x@Qp{2>(M}+{g@ES$~q&^?x3Hhl4qQtN=0UN^Fhjf>T%{T8UZ@&uhLh zxq(m`(^>z+yw}#PTjBkk^!}*-J752oasYk$^wGt4$B3B=lf_Qk4)LK~2qb?%*Q z|I6dCkGC5g-`E~{kh30?J5O+GO9%4zwQ%Q44yFeT7y$3@g7=62cisPAxNw2kzLRqB z%=;QCi6O}M3J~wvSPb4Q*uK8Wy8dv#kR;>)kOMF@1Jf&J(a9HA!uQ$f`;1)s#%I5K z?8mR~e@<^T9boAAQChzC>ByE8;N~er-#>eNJ$Qcsw4j{+|JunsN~#$w1YfrL(wWE6 z(b4q#@4v(U!~d&3?q90?OUIQfSL)(B#lDBb?yritFF@QEZGM)I*_}p2G=qLa4#1EM z%&yau&M({r?+@<}2ApKz>V{L84^T}1!PfgL?-3}3j?8QsO}EbWfDRNu2g>RHAL&~~ z2)>;0`-RW>@WT(`{ay6_sQELg zD0e>^7nN#A|5sY=2LHEje5)4k)54Yy(tlSTg70(E_n{VkcP-rL_v6sG#WW531N_~O zPO|0%lDwmZ(2vm(-t^NKouL0X>pwYtKfBhN`7Nw#m6Z{KvBF;7(ckaA_g;8^8N5II zzkL4x*I$37hzPOPZgcc|B|Sep#FKvbEC+o6=RRP^`)R`M&sx{2Q?%&e@SgSS&y{T3 zHTOJ6S2v!9_lNff12Qsj?yYS!yY4;cORU~M)vuxuzRY6X3x3;@H0VCgx=(KJe{N3> zg$0W-uSD_~&K|?U!szFpe}?~u|K~pLU#k5}$9La-SBN<7?03udyjG1O=&v)~(HC&; z3)ucUw(TOqv3w)xOtL%eA8; z&o6`bhxZ2q3Nui!=?rZeIL(lK$-vNhWD#Jkf2I{Xrp92-KWD8cxA$k)8#6RfDDCKq zFUii%hWD4z`@{ds@Bh!AKTpBI`dDMrY&OyQg{_bS;M^~q+}weDt@|^&57}Y&bQ4dC%iE5MY(=3KA0hg4FHbkxx4JF#9p@U4-1_>vJ=w(8@v_zO zT7LY_JMX~z%k2G8|Chi1FXaF-Gc$Gb-D{K-N(HC#&_{6YBL??M5RR$Z-ciKXFD_2& z;P1FMT3~?f@AvcKPvQGG_&%f8zVZ4084K~tlD+g=axdNXC*uU#=a2cp*PpKsUB_A1 z$?g5GpU$JEDPh8CMQ8I5?c2A9_gBFC!~ZMi|G)qKdkP8)(#?19KLe_vpWxh2u(;kN zS-iO3#=nwo^_mvEE8e4PIhHpX^rhcc?1%S<_Xh(4FmUms!^HO7)LUGe5S>odJjLn1 z@5zpXrsJ&X4_1AUtJ!E@_E}PvH z{RQX#;+tLB6e`$WE^Phcp4N4Y^`_VGd0g|=TDX4;nh&B&YmUPA3E=xs2mhxIZuEO` zdEE(G+J3lh`V=-sF2yHC7(JMh7($niW7NFmFcBpv!x&*j+ z(o+#FbfMSatzGlhqTj#yjqii^N6jC(9}O_D>+#w2d`yOB`;|1mio$q*w%*^TAGCq@ z7eK?w>Hn`B&!xIG^s(<4^Zw!C;aKlqVegOm|H^uQDF?7}WvnQU6z`{?Bp& z7cX9<`1p9;d{5miX4<|q4gCq{{^YX{+mNS+SvamT{S!2!(~8n=_?zo>cG2$P{H71k z#Wk4kFNYVyHQ?!aF!1dgn`uVn9O3(xKEZX#ERgr_+%}fjm_a#xC$80l`~BRtJe@q; z#nXSz<^d{Hs6dx4U4s9I|JP0JUm6RrbLUQSb8{2Ut2z5!W$VbC+mpjR1{%E|dil8& z;h17|52k@c^MH6i`t$YnwCS9>_t1Y=9>SP^jQIxx8fW0#TifWRDxHPxTl$A2lf}9o zuCuyI?(^8Z@IQ}sgHGdItC3r${_t52#YB1w!}_#;~ViD?dJ<-RnMhg zmwpc4r*YrMquz|y6my)zkMHcFSv9%|*SGWyNfOHYvldH$z{q)oD{wjKZ_(`oSa z+V}PLwBhth+4TL}+u{A;{lS3F82Its-NbTx_QU}-o+Db_pY7MYZ*^N}GtSyfiCoEj zx#H|8A=P_aIVL3~(e>-s;s4?PbvN!`s{KpHqeqXDmzS5WasaQ4OF=)wxu5y|(;O-r zCEj?j2#YU`iEJ&5PE$h*;x+i^7hZ_#KxgNyhwsyw??X*q%$hupcKK=X9(uVZ{~Um5 z-k+_{wD#?m&}5u7nG)WA`luvbc?VBVPda?~FucFY-XHaU_3Qsq4q)oksk-_Ov;Jo5 zd#UJeIQKVStj-`GZ}HZcsOS+)3>^eQU z#nyg;jrnK${LP=*5L%407E{9e?|46rnAUcs)-Kw)FTL~G=OMvzK(YkO;XAKq5jUl{?4-vz8L*Be4oyJACG!7 zUQ^7m2P_BhYV97X=Kw_W{;bb`encH;FwPoG3Ge^)&MXQK@f1$ixuP@MwQEPWZ{LRh zhyU08xPPhkFCBmW`DcoXiqh5hnax4Jd@L9J59j`e?e*(QTvqDbG{1_fYc!rd6tAs* z9%94&Q{esK{lS327`U)(AH7;jy&M4B-$tZ${#l>>;JuZhy*O(xCA|NYJ(TVIRK1-C|FYmUJC!~25) z12gdbg6%Y;a*ksCOHN=lG70AWTQmqKwkMpHY7}^{_SMLq8B#-c{s4RZ?GqyRA=ROA zsY4!)VYkzTCOQTF~N(?3BtoyO)|{(h(nv=(Qrr9?jC zy;)6!T+2zS^Eq>D(4YY^&%^4^_~CmG;QRUce%pJWpPx?w0Rh7GEzW$urE|PI-Dvmn zbo5J{`z5vqu&<9rIJN@ZJZWS^bJ;Z-ymHB2S#S4eO1VtRe`PJaKfFH}00VzBaAwvT zdZB!KS^5{YZf!H)IN|!xDi!?c$Im-KV{z74N_hXB%hJiyLtktC2L=YxS6_Vv-!Dk+ z!`6f1G2dLk(xpp<>t7@<@9Z(mx+lPyZ5`1+aqgd%%@%V{fGBrA8XMJG7LBGiUyILU zUmj!cQ}h4U{HV!_Ta!iGpl#GXJrtMc?6E`+T;D_vwSqPs017<_iYEK(P$4y+ECfUE`zDsHRth zaQ$YvXdn7&2liT4!h7?+=6?@&rNk z`ZgF4lYvbGUU0Z?85P-*;yr?e>o21tyy^5-jH%@9)0KFArjgq;)7PHhEN@VwMh&`h zPn`9WQr>_1s3hT-lY`;6-g*n(UqJ5<|1YlpXZeVJ z{rc%H9=N%gX!)FG=)*YoVHXZ`p_&O|&M`~&j-g4&0hFp!o$<|jIOmgI-rM#MG# znU@O+@PPN%sqbf6b^FpZVtZwat(3m?$rn2bC9%Tp08DAqkdNR1U7=s|l|V$8oY+C~fK99`d@LV`Sm zWX~195EK+d`T6+l9`G_~)k@Y_r{*{pfu#QXBo0oUy^Xwk>noF8r?K&e~54CMDAT9&j9-c`Lg*G66 zvzY!XJj9a@ew+z?#91FHl}GsgQ*p;%y5jwrS6Q)Q1-!rD-k;?L;I;4e+M?c%p+kr2 zE=R~>Ombo{T{_wgeH`aLZo@mR$-~_&BxCIZs=)smJO}V@+7K$RuHg+oC9a=B+n{Z< z#K31$mXL>8%)EC*s26>?7T#Ye@6G$V7mswKx;4bxThbNZFP%Gb`qxkAQAYD9U26FzO`6>CDy5A( z$N%}x`}sHijfbBtF3IcxTBAmC)v1hBfP(cyg&TE_WVD~PfVCFLD)Xb(YR6g`7b}0 zg8ol{{!iq7itW=hF*+S%0d$@Rm|ii9ep|lZW!;ZDs{D0S+*90BEirKL<&_j25+ST^ zs$MyOzTKS-?IVEpQOf(z7@aIEe}#3pqrboK!VB>J8uR|}|JwBbw{PF3yu3VJ#uAgM z481wEA^Jhi{U95s_DJ6ty(g~CcU`HKuQ#{mpTt~O z*%4h{)N||9sY6$;T!H_G|Hoc}R$s2>`T<{m{WXP!g$doi6%{k=`J1S9m<^G@C+<_uOy@Y2`V$#v$ z%$YOc{Wb3W;s5pF|5*;8Uq5m8v~@JL6n=i$C~x{|M;7`_&bjiN`Q52^=XhcJv>-Px zdMvy#asV360p!2@i9?znwOMV|X3<_~FC`c_zvNSDQL~<~eG}6(X0wUd8t|_8N}MZx zPJr#>P(DWN@h62fwj;my?%f;SUkBbF{$D@-|Jt={RIi@c{huQ-rtots$NACuy`9i^ za?Sz#WgWBFtCP4n08f*J`iCSV2cW?mz=vI)hWAI!7Yu*_hZxu}em({J1qki^Jw43y z-mE6jFP!y@()p90zUV|%EBXt~VqtCV$nQx>Np$t{dMB~QUBLZ{a?yuY~8w*+}+)E8-tQ+A_t&!KW5MM+1f>U9m)&KnaMid zGTpxtasV310qhz68oWR1zF+_h*u}t^w>D9t;OqM{ZaJ)fv=c7|3O47{q9v8Sft>~sEmxGOcR8!9}HMfrMr|2B8-TzG$-d4KqSefocv0~kJhxUS<- zljJbEbhI1#R?dAZ+ZW)8fz^a&t+FTf2XuBXJ~hreI%PS$KkB|<01TAKz=aPFP?yGS zgzjr3Kh?QyEL}OC3w^>_pE&F3?LF`Ev0Q4=AY2nnN^ClMeDcXB;r(^!{o()h>;G@v zxb_tA3>3-0pX-j(GkFhcLc>_xOvL&?wfkMXp8ENNYbW!l zU8`tKaOtf6N={Cu%akt?_?+V|!>119<=Ir}HQ~y{ypMM&i=hqmPddeg669sQbhJ z6LJFj$O)`ivBEkwTim*=v$4wdye`%?cUXLePq)vfD|w%`ElHz5f3f$WWNQM9h-ii! z0EZmFC%wksrTLYvCF1(1SAzlZ88|(E6V*?sr5S(KwnY^Eey9sHhXK4ltNXKc9c?wI z-X1fLuyW-}cz*+Uf2{wf4{vX8j%L!NNxF_*EEczK6@$3|g7n4vR=1__5Kp0*!|r30kCnA z<)VFrX3lI~6Cl$+L3JOj#@>1&zQ+3gli~Z|`@jGgxWhpHTbrpt746jgJw43y=G2Dp z{eox=rE?@~Ua8*4{4;%h-+lMN`y0sn!~Yx4|6jj;ozl|Mg!W^Oc>Us@+p=KDC?R#n(eYtt-Bci_!o`6cBh*uH>qadEnjZB0|c=)Z@%qR$qf&;H9gS8_=21mT%;H@Q*g!0N~W z$eaUU^ZtKdaRB}w{vQk&l!43ZPSBLz!!)zDzf?=@-8mj}3I)&*YWRNk8f@%nt40yR zYZZx4XOHpm@$}=5Kf?PP(EG#x8`uA{+`zG8$0#HuME5bSUab(iZ~$xcs?~Rv_Bu00 zCtLTTFbU6HO|J+V9oY(b0GaXtYx_)s?=z_HQ@Wmv>x)08;J~bvRHIxa;p4uomtu4M z=T54R`hkJGKikitQBtU;IJITg-p8S#p>*QJ33z{ldVlzTWBY%W1K6=+2YGpU=|0va zCkE56`#Yl_7o;CwF{c^%c#FTkbC8=C4GOJ~9Ds{CfGOoN>DTu^hyREF2LlFU;E&Z` z(i1uTG^a6QqkQPo586O82%;HEt1HOy|KARFxiinhUJtF+=P}K{bLUQYe*=4e_<#6+ zmIGL|Y8AP;iSNZ+jkR@a1k+DnbV7eFNPm7{OQ_cyrrhyREFm(~cFJ$tt9;~tBf70dfk{l$@&`*o@!2iSlg8_puaBlH#>R7LpCgQrSpE8-s(4+mT(Dl=K&%RZcz@0DYRj&@k7v%D3GWZ@e}@6d|KW&Sz_4M%3=#jLBfRPGx_0Q_1?k_} z`iyN`Xk(8ZU$Y1G4M{={z=0gVdzp{H_Zh_ZDP2#-^~D}jaAm_OdS&1!^7ho;oWcM< zcY6QTrqBg~=mIr-KYNX18`^7P9HPDczNF`k961u+AKw3O2H^YQ`y~c$-@Z+~d-pa( z4j?4R19STX>gU{AOiM0Xk%mJL5u^Rp#{vQnJoPm8Wt)SZRRW+#} zY9s{E(e>@&{RPqlYWV*zR%cLnh^Ho*m9&Vx#~wX;(5+jy{`P)s{5O7#eGeq>ha>U; zjDdoJ0!m9uGekV}^Rdu|cUq&*7pTvFaa59ZEei4X24H<|pmlA){vpX23s6EHU{2D# zRIoW8-cRS=4|RF5>+(vr&(F)gpuz2WXjU@}x~DQ-J&_9?Adn7F!~1W2FO}Gs4}1Ny zmY~e@ZF+a)TMD7O~vHG-l%uyc)ENHfsovUShDpWpio-cLu~4|RF*>+(vq(M9Vxo=LqQCr@_|&1wO* z-Vdw&7T3?<@A}m}Ow)}Sny6WJ9nDX~#Kh27UwsAdkGg+}48Z5Z=aJ^F%3D>lDN=^)>6Pr4~`wKL_Ppy1Q!Kpmz)k$092n%acM}7|q3Zg@Y4wdNpQ1>@> z-Ct_|(!3x3kNf~*;Iq#@BR@YsO=|#0VrW{ENMifatJO#0bxO}SoZFK_O;f@&#h{nj zLRkS-X<~G`q4EHyXMP0lr*ZG6R4p0T)y6o2z0;RbQl%Q2inoRPcsADi(SB9v+Q~fh zy5{Eam2(fIN5UEzA_p+LPEWdyJ^zsZK>kCM44j&`kvi0CscGNO z`foN~Y|Z=@=)VQ(ztyaB{P0;0CDjbpJjaD|TE+eD;o(8+)~&P4_eu3%9F08=z+Uf% z=OItP82IqR56NP&7$&C1$NJLojqRZ!1k(^7&TURX0ot02YAR!*WbbGi9ob6Pd4O#X z&(x&vL0wuKb!oJdGVS#9@-OJI>^|gX*8aX|=}jYv`9C%NCSI%bF??#>qhlM|Q(ReJ z!{}5uH#d6!{rBPhQTKO<0r-0OdPf;}^UXJ{^;eT&Vry`q2W?-P1}!024&c<54w}sG z`2Xg$>$-oxVBJ6DKT!ME3)cuWJ_m|q=QSXQ6BVWK6m^W{pp>hCBS1ftC z3332}=?XTllg;nc;+{SgJc8-5@W#3t3-C^>hcx4RP)Am#j*R=Njr)3S;~9E;_*9Ar z*4COT#f^WiRw;n?f7BLzv|xR-n%;lKoMz5FW6d*EgEQZpDG`- zJ7xMO(DqmdOjLj>gyYx9yAB8h>mp z7^x4yQM`Ux={EVxx+d_$eG&|(L#Irc0`HHyze^0j$HT|F%D}W~(+n4T+cb-!-w$E+r{VqK{lS2M4D6o1lu{BBH5n6& zi`|{u#?sIGI-?I3tPfV&@7rGg;*oCDp>>R|xGs)&+rLkmG|463hq}M9>;6*vyXyUL zKJo{QfiYvo7%m3aObDd2+q0lQ1k@j&eb|N);{7$tB-<}=P-uNkM(|K<}qS zEg9F;#yEmqFD|9}RcmWD4%&Ji>2ZLcJH0lsKKfk&`(0aauJq&lZ5^pbLV&K=mKZPT zIDY(icz@LWWnlpR9sXS|21bnzCDf=!vZiBSQL(v6au}Vl`aWm+1DvCuxdFSE zrxTm|Q4}M3{@b(9J}Zmwlj^@X8hadoT;31YK^}oI@YGXJ87?NXy#W@y*a(_L(0art zZ?&Z82ye}DX|b*m*xWaco{elJY#!i~-V@;a1n_;R%WI=9uT(pI_R0s;Dygw%V_k9H z&CAn`o*z+%*!(W|c>VZzXWH_;SxpSJ#=rEP7&dGeyg%yxvN8bQ4&N>}10zO^(4GE} zVsLRsw*TD72dmS~eCQKr`gEnwIls3PwQr^Ed4irM3$^qUbFYBYGe3g=hyMoy92j8h z`fZ%Dkeb(Spv!)@ZjE3%ysjO5zo7YbrTcE_`nS&ZpfT39eYCjOZ*jWO-oFnWI#gEQ zhq}M9>;6*v%kBMeJ>(N^-@Z*OUfCPl^z^*$9m~^|a#^VE`6mbg#>wMnoZI2 z05dA((AABn;r%#xKc(u(xUTr)2-rS;YbU)$DOGD}I-V8R|Fbn*Sx)`h$vk*}gL{8A zmoK+{IbCvI9RJeaAAkIDVwzg=Y&gQZ%f$fvI{dm)3>a}e02Z@Zz2d7KSQk(<|k*L)0$BOuzV&N|=$7@u?A!kS#1l`z_hZbzVhkwd{cv666&M3X+!uhw z?=b7SfSVSzhJF!Pzvy8s0Ar2i0n+^|(HKs7fa5QG0Pm-g_d{J?{JOkSZS=>-M`+d~ zV<{>$LbqNBHGgBz?U!=&(sBFJG>Qx}-a3D*UmrPgq+-5LuKF>qqwTQ>@agdBN;5Ed z@?_oW728~G;m1tNur-UMz6?k4w9U7>vnjJ>v@ZDMkq4L-*MTmtI|2U>{|^QfV&KOW zpVPB_hf<)gcK0(a+&32WJFEGBu^Kgh=!F021h&VcyTz=FzPTvgOZwZ`v18%=QTJDz z0j0eku8;fzV_@pksfLW>EXLoP6Nfbc1Re*#^cEWn5FX;G3r2m-9(TqAj8b90faTdE z;QJKveM;4lab0bUAvpH-M(UHl!y|(N2aW1rRt7@Y}&IG_YqS z-K;On_6-V=LpP+~T)l3Ma zy(>}k=jpdadhK(2a;Rb5P~CH1)OVL@;~6t%!26@_uNnhtc|W`k@(hfD*Is*#%x3-T znxf)6t1oX^oQfQPz&QY>h1R~^k}8z*)r|%*moZVIS0oJ%Yan|b;Fl$P;r(RteyGc9 zqb{#RJN>@q2+bZgiE6|r=qBzI)dxy{W8=D?8Bzml`wQL|s+k+uxh$Qc!i_oCpLzdT zvu3I0`{b%0<2u?NM*v?AU#>O-ufP7fVRHZ;?q*{1+SKe<@mh|Lul)09HyZvxHDY5^ zCC#dbW4uQY-4k4!CPt^boC|m@xfi@YygwLlfq|3nY^5Px`ci<8pRVFeNwKnCtq?l+ zaVGjec>li{cy)X|V%n%AZuI&;=KWuN^;LL()csXwKyB}b*F(O6F))Ard~$PhGi1DH z{aEkL@x=DDg*SKHo2z-xPHgHxX-y(^$7!g=hq3~y(zvKJr}F^o`b~oObHV#5QAfr# z#UDd(ZPRI5_rgNz&^XOd^WnU`-00b%iFEyR9{N3a|2qs^J&{Wfbg!hl{?*=G1=GL_ z7A#QR_n~gD?Yg~O?FT;&KhBGRl`B`0mzOced$InZdgTB*wxK<=kl6e78Ud9(L+qX#FgYfJE?Va-quwlj zy%}x9uZ^y5JWU@=e4W}gYHf)1{0jGVf&T6^V{|gz{J-|jJ3gv1`@@^wAU!06V(1d- z5fuU`5CTF#S^!y5StYtZ*Rbj;t1Dz(8?G(3RTK-WtO_C!J7uLPxQH}q3Zlz`2r4!@ zBS(}}nPf6^%kxJ*6T-~gd*AoD_dVZp&U?=G(P)2@`?>vTgUp@QQ{rR89jpCg zVq)a2x84ev?( zE9Z2!FRuw9Q8J)@E4exK+)8r-rk^z)?eAgS7yTVL{T-;W|IpRD?@t$AA*qQej@39r za~sR9l^3A<(fvO&aBSOXnRI1a+w|CR+i%{yCL|=tiWMu+{>1$Q&Oo5GAIHc4pbTu< zv`HE@YUEg3N!O3A9TMf!<%54-D{HDx`CQ%S66l_Qf8KYFG)jxIEwdr6{$uT3eFH8_ z%#u4A_B+WJ@cKo!qW{tVFi?(xFJDozt*E6gh2Z{$JTKJ68;m z?p=}{eQ%_trOEpB>jSR)h}&B`Zttu4Lw}>c&BDNr9Xq6D%a)E_ACeOy6}2Yv`;V9%aC(xF2KN83@lzx;34wr9_zg>0x#mJXH?1De>L+u)z- z1k9ayj~sGoAM|Hn^(W)+|M5Svc)Kiq-~}ldJXVroom;=mt!wnPUF$e`=cSyJG+#~p zseHzqe(svi%W+q}f04^S9vp1HnmOh9ukQEE%uLy}YnN$spReM_e2=yB2+-Z=ZnH74 zfB$~z)~%cEwN!O$M(=J7ew!wy%0rh-l07f1#1B9& zfbAJrJ^eLfPk)mJ>5gBU+-sNSJ!$^a;jPrJ3B-D1=40+zHB@qYraAsz>DslceD&2= zXn*4VrenZt+K=1j~z7`S_3su`jX?CbL=$_L~RwdSt{elDSsb1a-HLd z+~2eem{t36Uic-HfwHnPDJm**{92-G<{7QxWW$^1V{=)|5Ae+KSMg)M$J%)W=xlVh6&QHnfd^bQ zWP%;PwnRmSNb!^|_y8>C15n#+pQ|pm_CB_IuYig)MQVJKTsQC{S$Ws>AXg|&oAB8gT^2;wvRFr-Dt(RX%s{4K9`Aua1 zy5ZPk7PQCy`|c1axUhw2JgvHUw&VZn9)UmPj+VD?eOkVMZ6kRB>=CGQ2EKc9v%GoF zvvU1~S4#Wlr#te#^Y&R19u{mor}TN{4-LsNte02t?S>IDcF1YmPp+7ML_~zV_~MI} z(0#=1tsS@b)%>BY(biUCVCBk{lAN5(dgEGeS~RUET5le^$$EB^&Y8y3#td%i=-x=7 z!J#tfjBYaR(wk)Kqi?WJ0AGO5d;wc$F8MjeUq3pAHN&-Lc;W-lIPP_qpDv&OXDDln z1^vtZvImyW&XHzKxUck{N=QhMWy_YK{fYZqiUBKWKh70jg)*>t^JY2iGH@7HPFbf)w%S zB+t?N0^BUSUqf7d1^czmk_Sg$EC0FmIr)0d2lxZX4=@<`VZl~e^3ZI# zqhOK@?AAvT>c_Dbco^Sz-(T)m?b9~JrRTn0%YHJ}w5r!M^;LIihi}b&@3e2U4?p}M0|pGh?)%B^)4FnZ-q2A_Y#)suz``*c-4}52@C?V+ z2XNa~r@khKM$3p6XUn6*Cdz+qep>cC_b&bbhxh}wzpz}MFM3$69X&yMb~sC-A|iS2 z*HG`f@2k@q#mL<^b&~Hlj%2;C@Ot47pM~~%)LypHQ6b!SKizjZIXUv(ci&l3_Yt?Z zcHG`q^M{s3OIw+NqeqX*`0?XelginGeY>X$HJhrAWB9{ns_ikhx$*&i|J#<1>=)qH zD3!ei|0YNphsDZ}MxEsT+$-eYe|SK)-aAjeVb6f&eIj4XUn8&m{Tcb|@2-_W-TF#u zVhYdqa?kh5?g>x--s8*^ne|Av9Czh$*Y+93=dHiaR5yp8y)#7mbW7zPEO!r1m@q+( z9Xp2hC+=@)2CS_8ICp#(ZU%~ri|G$oZheZYA7=RLt6SUofAiaKdsh!L@^cg8!?D52 zF1t{Q!_{`RO$ zzGR{d?b%~nbx|#ZHDk>_n zwC3|w?3nMdehz_KKkh&eh$sky?=5SX`BY* zGwS+^ z&S~fD_hi9+Gv%RcZk2+;W2Jk$ETJa4hJEq3l*9<5KJ3mF^zgI88sM*M`0|5c zhQG)c4BF*8Vq#)s?%cU(e`5Z&VZiE|kMqZGQJ#Ty>()t=CQXQwmWz|7CPy0ip8m2O zI8NQ>6dc|mD`s5bS&YJvp*y8@>TAYYTk+>IV7XiPvQ2%plP zoL0xNC;zX{hUs^mC5N`;dmQWKxm~x>6cH(!mv>h1Oy?eK0Wo5B`m0Q2mW*pqNk?dM|0rsGc@;?_o*IV-Xq`UUMkTdOx zE-L??@SqSQN1%7TW^!>tC;4-Oo^ofye#XyTO$Nv#9mdE%&-=a18~GPmRB(^1`ty^r z<=(mSzo(bTxAUEsJMhKa)w1@9*JbW)PsqJjO_r-ijF%xj`bno&nUYu^UsQRv0`YrT zXs`_H-&hvS?9DUYM$dSE`3=5!f2dJ+HW2KZ`IsF$c9fkvciJZATVDV1yR-cPcF=oV z1AdEB88~p@fD9cv6d%ATK7fR{aOwis&^FXsf!ez}COQ=6Phs90+fw%pq=wd$wvj24 z9n;j6D{#78n%G$ilh2VG8}yP}T{#18AHm(H4U%bD<78&PLMa(NSr%S?w~<4zrsz4N z?!c#yFO5Nf^>zptsUK==74yZS)-lUpksYxwZta`50mv_Coj zwq)Q`-Ne7q(sp5>tgOta)nbKp#^2{SsCT-sC)9rSqW18<=P#W_HG#jGa?0^EZy+Hg zN}7blNt=jd=@Qk@@D*t7!2$JKNuFze!LYctGA6#gT$IpJE=$ZZ_8VN+xR>1A>U{Zo z=TY)t_eCn9UHflwAdtS?A5|YWCqToB12@{unbx9LSNC|Y&F$=e9qZp_xXQ@ z%5YcCh#8nR+c^{#7D{PpsV#LMaersW{oV6#7p=#2;J2uZfhV7QQo_Tjoqp>28Xx;( zE&%qU{cJ#;(*@7=HflJ9hOjr_RQCCI-PfLDjD0`GnXO{w&Ko+4)@MVz+wZyU&pFkY ze-bhOU->>lUAaz=KKdxSpP0Yx8K_J%@ptsJofufMWQnAt&_}u=n|#2z4MltW`qTE{ zSpKtJwdR9rhDK@BbgGDd{^om~%9#3YOtqJ5!G$g4{gPas(Kg(>5Y}qo~>ppkmq}N)l@MycRJgY3UjM06r=t6b`8$#UPqY&6 zK~vk2fu&2AN`nRsDqI&lwcqUgzVy^6ne|9EHmS{h0B$>T|GMGw%suBwPIjuRK0F%E z&i6Lg7FfQuj^C7t?d0RP^LV~GA`hX6zQMWE0B$KZ`L)ae>Se=MY zx5xOaKdno<1o`V9+so#K1JV2rd!G7B^XqZ6zTe36n_$yaVbgT%*im-u*n##Z?(b*@ zJk?3O4^3@X2DB!?xN+lHFRNHDqoYEo59mOfRr?5PkMS#i+fq^zBe+MZxJS_H_R#9S zn#ah95E*!0y8PqTGiB!r`m6X;13U3p?)rZ9V?udOSMi)4GiHn&Jb2L2x{tWOv*Z5m z`M0a4A>e?Abby6vzPjQRX;Cuum9b5-;M4k<_`lu zG2o3x;=O2UyEE|i+iy!+S{gopD)f!!vgQwLBL97tm{uTcJu@6rdkO0P(u;;>i1sH( zt5$7$GCuYlpZ0Cy<;LG<%8EJtL}RdKxIZ}uXVeee{oVy~@$d}lwNzoR=(9H^B}Eo2 zSb*+B`@=vv2JEiqxITOq-ZHRj*DlG<&PLNzv!=#Ghf2}Jc5-;@C~RH_$GLR=Uwi6Y znJ}h>G)Ri%zNzNE!53g{Uw|?`IkvpM#%$f%3B){dklVPw67D_3*t` z_dM;{v#0Fdy&K(EPWQRFWwib56{HdQ)dt%&qLq~&cV*KWL-Z=5uzi4J} zIipn^&(><}61Ck53k&7gv14d|v_A|~z?vn7^}Q{^jStrn-pFp{bq1z{ekdEZQ$7 z&}*6%jvo~nV)VE=xH%u2nY`GO7})p0F!|?w=g64BO(h{NocqZGpPCi!d8?meJy(3c zPq$RL`44Bv8_%382R8BS@|ULNIMw@4l*cKBXNaz?R=?N$asHh;b&~Ddx1;^h{xDDt z15VL!TqpjD+AyF!0w+wE!20WC}ZTGG1A_v+D9UzaSV2chjxed zai+H)@$K?4Zho(vhuUZ&K8vPy8Ur(C%#i5lXx3v7*W;{qiSqXIeXy_b160Yt_Zvsb z{3m)!!G$fbcRjqf(DK#qr_jCo*;&a(&q~!&U%WrGN)FMs{?WFKbJgSg?n^n+txGa? zhKJ9>$jC@};)y4S_f`|{MGIH1g`GGyPSbB(FFuRfGO%{-T4~d!4QsQ9YqRPUt)KPb zTjyhY;|K7Ffh~&$$-{rkl2L=2N@_Aa1MTpVZciUYO96#JbK!R3>-Ri$fzyr zUW0h8e!UJ04L0Jt#Neuq{g}lTHPd-)Uy^6+CmA;^LzCfbR2B_c<}v%{Biz_rZzU zjcdkd;VTASdg&!eNJwDK_F~P}IGy&=I<$p4Tb|m7yzgW!v3cP@nSR$<^1J-z(za!+ zt50Y3{wJqvW~*Jl&Z+u(GLA(!G0kd;nhf0CcTy(X^h-e4raO z0Mc+*y_ekdf0;(_w&*BoWqV^!2lBnDea`BbB%0fC>vbKBnrB*zZRO0IQXyQ;7%PAr)oB?8-Il_8909Y zxD*u?NpLXvd)}_+XS9klY<}!p``EXEo=fd7u9pq~}~KK_DddrRjt$QktZ*%}lSWbC;- zcI+52U-Ul=_<#XlY9PJ~P3?3B7B5~b>FMd{3@>v5)D}3WbCN8cNv{BZ+oMi7-r=pI zJdv*h!H#M*gQd3jq%{Sjf^Z7vYIW^YJb^ki=!RdO9>&Iu| zYXDgf(Roef>PuS7E!VV{M{he*UVf~HET5etTBn?S_}pJSL#k(B z{Tl0d)zK<$Bk{rbtCJ$umpXnz>+F$2EVK71c~8V2&DtgKA#zWZ*8h={-sP=mE! zYk%brY+~pPY|QFyOvcE!V|3)BQKB`uweNuLBhY@_nzyU9=C!w+)}qrImVb8D>{flO zdF{%p{tP@X-SA=c?Vf7n7-*hByVh~i+*R*Fe^L@7L~CHy<|jQh%J?p=p`qWeKRvsq z7{~43EA8iV89%a_vHwA9i{IfoU+t+lL=(m!;x<}VmzHY zp4!9o;^7&tJ%K^k05z}yA|oTExVYG`rHI}BI(EyLFebHS0Ih~zhk?3dVB^M((z$bI z*8du;|LXe>4GEG7V_L{(?+ihkP$v)uU;qYSz|;)vST@-32kP3zUZG$13VAaY?b@}I zb?ep<@AYxKx3+qb&)duAfcC39?Z?W5u2>~8 zHRs0En0w|P24KL941BtLuuL4^TC^rc`L&DRJ@)}<{p7;JLOFW$DB2(G4+C|~02&pI z3IqOOV8x0R(z0bsY=au+0;nD3_5*zUHhusz+Q6I>+6)F@z)1|C`#sn9Rrx|PGBRZ8 z(xqs=I@Wx|@a+}Dug!d-{rsc-7-z;=8TkJD@1>xi03Sdtd;sPB03ZE(5cvS)1H%9e zzyJ*Rl>yE3C*JQH?LThZIKwuojh5lF=vo-?jsbKjx)cWd&%o=izb*|MHpCBrAHc6R ztCQk#Tq|*C7=Qs^GoZS^;KCM0ZJMg$+5BJizJUe}8pynP^N9Hq^M`=|Fo5>+zxHFy z8FOV|@7}#~!37uK1E{4Bz?~1Ewa(cWfW7Z)d!O%vDHwnO?Rk00h-T=1AFS89W}kol z`SSVapQHN%p!v*9>(V{RASO%s~pDwYnvG@UeU{`3brNMn0$;y}e5mzT4 z7zSVf24J9846J#zzfpTOgnIryu~FjU;^e8Po%#$OpwKRCGn z)#nR(lT+E_%oHh^-b+e9A$CRl5(Z!Z24KK*2A0pxF?`A1tU0{5>NQ+r{yTT>ME3<) z_t`a`&2@Q~*MR;+f5L!y7??F{mLw%5`NYqTE%Ku+(kU}RX54#@9N#v&R&gL~XU}bC z#)`3m0T{3v11GkRHhjiscVZ3prTq{eA1~9UO+)vi`(eOD450nYqy3l*=0X|x;)^e2 z#E2320DQ0?pu7#!ylFitp3+4QZqCOKKu$0WzyJ)ufWg3#k470j;?rBO53l^1>5Jd< z^73TYu3hLp6X`zU2`2EP9KYZ*U& zyaWXWVY}3UA3$xn*3If0H3AN7qDBC5#@fdj8AHYp1_H~#;jKUJ?QhpQj&-w+)=jlZ zCQO(h-+c28y3Yc-k2tw^adNwk7uphS2?N$*VA--|l9`!_EmKFfjQRoM>W3Nmq5pk% z2=PE0#{VqEuKL8BC01TLzfznUL$l{rO zWYnOh5*8Ya?yp1L9~BiPMMXt&3|N+>fPnxp@P0|I6kOPXI{tpp{JMswrluM_{mRP9(0vxxeZeFn5XU~zG=#Ky*AEBVn@QeVIst>TP20ee?dC!j9ke|#r# zWf*V<17EKlZsb=H>#w{0Y?bA=#l*xI_5F?>J&N{6`@?_@89?h!q@-Y91<1Zqe?WFtvOIogSJB*7Vw=v2Z8G1?Hw^s3z*lR2 z%VxqBM@WhD|Xg`N&KfA`Xxh~K18>-R^{2zJ}2JFYc{{8!nJ^>*i z)?^fY!36f50!A0DZ(*z<_-j(E9x)(|Z{`RCSM3AfCM(^T&Du+AD~< z{+{b4v?XI@CkD`W_S1LFDRb%x18di=l^#8MV1ETL?&7vXb)Regz$S)WeDvc{?LW82UG-0v&(4v83tLG2m{8Un6RbJCdi9cZ>(&wPC*BVO4rRa-oxpq0 zlQ3XU2Fl9HWaiA7(zIz)Y%&wrWaiC&x9nrOK3?8v1m26LgaLaq@YPpe8MOgIL&?!}=jNN`wP|{^5lhp&0L`Z* zW@^uvDf7y_T8RPe*QarQt=-@9w0iiDO{V*GE!Q5vUwrWex*y#S12FJ21L!$>>pA9^ z`K<{9TeohN{QP`uIg{CPZeK)lLWHqLKaNlXP_q9fX|>QVZa#-ELyZkI(6!VeP>epPW=HXi4ihk zObdDAnRD?4kRMK72n^H-14lj@C9gkyu3SF4g{c40?Th5~$6ESk8i&lxOnL3K*UvyEJ%xcXr{|4shOfddE7{lt4=00ul_01f9X4aa;l z-?e4n>#x6-Ns}f?R22I@-CElUuiAr4`wD72@B57-$qgV+90p)O4sFRddX4H{eyuTT zg=ZP(_~V{~=;&ypUhm$$dp)xE?HtSG+KAP|fOibkRtxZX^dt;8lYw2kb{V!uLO^9>6NGiv(p z-n|>$PplUPV4y|}pxvCQ-I#ag-B%2J`st^JEfNxf9cfj&RC5FJ2R1S42JBi%-2ign zot*=3xB1`q(?0%!3tJH5w?ICBW$Q?AaIn#rXWO=IHL~}Kk9rp$WxN=p7Y1OU zP8dL|q19jj2I`Ul^#k{grF zt?n3>`U5&;Cdie)Z7EOReYVkGp!5@R%Iz43=9+xZwcaaQpZ}@9pDkC6Z7Chw#!HCn zo^sz`yxK3;uXBp-ubGBH`!Q}XP%{SHwmGlpG#G#Ze=wka0Ig+&9cxcJwxW5h9}_A) z&P*}tk?EcRtw)Y_^u2auOszMjx_?G%^=U5u;J%F{Ie~tv6+J`j`Zv}6ixw@all)$E zQO$G_2Dg){V$ji&a4`B0rfQsz)prGGKo96Z9;^7(c&@EZ= z&PzG+y(`BV{c1h^%A9#VXUe#;uFNa@dJpKmP|-cY-|Rgu=zcV&6Er5*XkN}wwaNK6 zIt>P3z@H2(UAk0qb91qQ9q0!*RpX?mMj0_s-RG=%0(({s#V6pyedK6$&$W7O$7=t& z;YM7)cuE&T>z~mojy!&cKjVUef@Hve0Y+_Hbdh;=5p%=bIDr9w+W8y{T?qp)P#FX3 z)~%CqPya3e>4zX!m;; z7$=>h!Nu|34xk!tiN-^wCG?esn(!z<{Y32!wslG0~MU00Y%A zuy^lXDJm+GgoK0&HK0>%O0K)|Sfcht)7}FY4n9q8`%?!aCcEzS0iylV?Hq&V+I*MG zpuP5#nc4rymRqmuAY%qMHJGC3Ugh^4&!m&bCN?(K@L})Xz1vjwJ~3JI$7Go!=Ez?R zRA+A&+dJ-H=uRZkq$$H+?@kmWgHGJ0JeDe*u zpI9#pz<{Y42&7%lvC)+<00W*faOB7ldHnImrA?bQHP(Qh+Ht(EX7;aD$4z^#o!u$P z$Q!ufinj7VQ5Tu_cu)D@mHzZ9wBVkCy{m^AbEk8tb9sHi>BijZ94FCVkLRb4{ito* zwv{KJd{T}cJ!)!u-(PV>jzbI^2F%ZZr?xlmL#M$2448p|va&K+xNxCpJteKDY*o$4 zd0WTF5EU6>^lH->@uef1$&`uh*l;<$MXdDfnj#|xG?A;uwUWR7vAz7`)-&bh$9l-y z&-anFuMLn-mk*Y2H;iz+zu=qoBaE@oG10NnF?z%`R@(nj$4(? zzQ!K*EsF-p_9c1p)tce*_1YhQw1%Cp_TlSyxxZJBp~u?1aG-H)JqJA(?R}@`rZpAx zT=kr%xHP<8!)2qI8`q@Qrq`%@?Dd-2XHSgYpSr!a$4W~}Gxqj>`Q?}Besn(!z<}i$ zFp~|>xu7Xw00wHqz_DY;WY(-%(yd!J%V@yb+NFFR9pwoF+A~pWAXfFG@A2fjcn{1u zg@Ggkt0V+Xej-; zonotVo#;{+fPvaF5Ed3D`T6FkmePd|_Yn9q2R| zfB~~JP+D4Q^bOFsPDltf!fP8NVE_iK&OmT*u;k?A82iSKA3u)nC)NuCFyIIV z%x<%De&|XVfB|1KuzmY>BhHhOl2TzD$m%vN=Z`Lf0T_UR${9#VNHBWGeDcXBjQoF|$R24J8r8PI;tS6_X#BqkvI_5h*DtG3r0lI{-ao zM?J(f!L{8PaPRA%F=K`h>$jFJK}RxQFi`glSj{%)e9@CI00aJFVE69bQe0dt?c28} zCxDy)7=Qs7FgXLQTep^?q9Xb1v(Je2liLjgFaQIUFyJpcn&Y6^U;qZJ%)si^tEHfz zK;aAI%Q~ zFaQHyFyL?7nd70?U;qZ}!obd*JB|GT+1c4>fBlbA3Jz<}8pu!|keb)YF>00sidz{ZUm4ZE~u%a-^8@CCpC48VYo7--U@i4+zV z$_F2OfadoizGpVQ!TF$pVZb~L1kzsS*yuGFfB`!)ptS2z_F%w{wl~*=ri1|)FarZ8PMk38SLz0$>(F&D z00UJs5ET_=^j+2dtH+KVBi2u>9|m9m2I`0bGuX(S16mCRV8HGSXb(e;DJ`2$a=GF9_G7?ob}{FJR)YZ; za1sOVJp$?rXxOkJc>&Z5fB_h=9Ro>8Nk40Ta{KM4CD4b=DGXSP0VmnnTr0W~24KL< z43w6Z8ubDuO`0SvTC}j81|SZ4avYTLU_9*1fY$BT+9w+4KYsi;asE2m$BXW=mhNJ{ zm@hLhU}jsGb3?1a01P;p0qrR`b?Q{f&d!$L;9&d##D!r1229OBW@e_S|B|}>XdE+W z9L@m_VW46LoNQZj?PyCFfB~y8uy5Z!nK5IAQ6HQ7fy9mN95?3LtiyM7bhPB<<;k>Z z(`47KUBvi_@xuTNz<>o9u!`-=d7{%`00v;-M+P*PR^w|LXKT}@jj7{-XgTX>Ip&JF z@`QnmjEtZ2`l;Vnacqs4BjW-CFkof|u&2>fFaQHEU~LB6`viLT?k(Zr;rIi{5r+X7 z@EHRU5fRd-PanDKuDfK@rcK25ED+l>v+m&B(8Vwicm}Zht!?)+f6N~Yz(9Eh4jw#c z^cK|IfUK-62?`4GnGWzIHpqL3A;W<68ED?Txe?=^HEWi9_uY4Bel$M}zyJ)`h=KBU zBfp~~U;qYSz+MdO-Md%RhSxgWjT<+{7eHJX24LV<45Xx_7_~)oAOFssJF)X^WakrW z4ScMXIbaUV#sIdyy=;Bvllg=J7^sYava&K+w{D%>efQncuU|jW+FitItskpp4w*x5 z8PI#bfB*h+&pr3Z`t|EYpABZSPdOhn6AZur4Acz+mD!2>9Ss2kFaQJgW<^-DU)|W$Xcfj424KJn3}D~e+rDRh znO_)y0Z$n?apHt%EkVrz&d<-6q@*OYpbfR4x3Oa0Z@v72`t|D@dVlKFsYb7mW5+Tfl3*`o_Cf#&wMlAFaQI!VPN;}-BMCgBHCXd zJ3Ct8VELeZFHrWBYk|dE(CHKYaLbr7<0B zYjfDv%mecP12AA_2C&_oZM!r7%s&jkfUg<&;)^e2{`~oJq_mY`yNX`w70|PJs1J+}}*LEM@hn9c=7=Qs7IF$k2H?VNw zLZjCJc>?y;ulOcBpIdiaUu*Kunl;PFqrr~0o*m7cF=sFU16E_;R2z+dW4FTq48Q;k z_=AD(zWdIoO|Jb1)hCdZl_lZf;p7TXPrz0TgoK0``(m`GhH8DSpRsS>KH~b+=7Iqj zfB_f?2m}7G@i+!r0tR3J24KJw2DDF^))UZpsP1=m`voE*B5b7ziIaOCC%4L2XeX`a;K6{{cUFr>alXV*VE_hTz&{LlVvq42>~zNdxNX}udGpOT<>7}P zmTRuLMg|WaEN$Dim8hsFd;<=zGY}meZS2b*GGvIs#v_kBVz9D(`*u-wutDqI24##H zV;Fz|81O#>X0_WmFEj-VzyJ)uKwUC$=+Gf!Pl5I&m^N*iQJbxxpg?kRa*Tc48UrRi zZ_fC9b@QTgr}g!Pcu_3Eh*g{V2-H%Fy`K-hu%bfB_hA90PS}Tk+l4 z?l1rYFaQHqWuUaQ)X<45R;)1U5kC0fgL3oDH_PRhUoILm?$)iFWMpKB#*wSjqx`>b z{0KVM&6+hc#$M-O!h{JjdGch@xtTqCw&+}`w%55MrsV&a5@XJo!vGAxfcY7)s$Ir; zqbXnj24DaN%)-Ed0|!L&#@~JSU70s;o;>#0V{*$aw-|ZlRXb z&mcZN-tj&I9RtR9TS>e%WSV^^Bru4ImwBN%`I7%(>j zX0e?(5A1jtfB_hQ0jDvrfB$~jv15m#Vbk9QRhOS{Zv5wEvv@r$K`Tl8}&a(oaQw6!mYX zzE3~v{vP+M9z*l#^_aRxLeD{S>-C)U+-|tx2IE}yob}vwPlaB~%P+rdT$^5_UaMX+ UwxPLgL*|G1fdLqR0sAuW|5b9b%K!iX literal 0 HcmV?d00001 diff --git a/data/engine/icons/asset/dir.asset b/data/engine/icons/asset/dir.asset new file mode 100644 index 0000000000000000000000000000000000000000..b8989ffeaa783461f24c532d3233b31bcc7ecd07 GIT binary patch literal 1048648 zcmeI5OO`A*vR(N^^{Ivipsof`L(xF0*ilczP>WL)b*+;2(k_UPxd%Q5VAon)fWtii z!?puE5s{g<{^OUg|NY00=D$k!zx?&zk4DCR`QQKZzyH7g^UE*)L;8RH@BjWU>HN39 zuC)E@k_G}0fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;| zfB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U< z00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa z0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV= z5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHaf zKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_ z009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz z00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_< z0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb z2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$## zAOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;| zfB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U< z00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*#kP2l(6fB*Ae|N7UT z|NQ4a|Ms7Z%l)VSt)7q6LI45~fB*y_@J%4+&PdrfWZwE50a1v`NN1Rwx`Qwh|3Id|_gug>k!j(xJGXY|BZw_R6~>yfB*y_urmR?-{<@C*?)%jYd&_?6tP190uX>eTmt%elh6G= z|DWmo`f~AAOHafKwvilc)!o{)rVJkzpl^wfZa|Q@j?Is5Qs%UeP6$0w*KPn zNASX0tS848OHD)r0SG_<0y_}E`=5R0m-iS^-%ISEH)4bU1Rwx`^#t(#bG%=_`&h3k zB7gt{AOL~L1n~azyx)E=5m|f01_1~_00L_W;QeQNzvg$1x>ywg5P$##q7nGv3%{y2 zNGqQg^?Tzdt^J(Ie6in4MAIPgKmY;|fWTY=)~E4)zh@uvUgwXwYGXABKmY;|h(O?n z-~YqCH7Au~e&0uX?}Oagd6-k*AXdad5CTA8U&)`9>8AOL|e1hl40 zjZf>o=Q{NU=6m*jVpo1+)X1z5fB*y_FoOVIeTP?%dT%#FqpSe|2tWV=eF@a$9>2HGMD%_W-*4w!!_yt-F@CC)UyPxjAiApijgK;RjHr}Z4~f5vzA)9U}Jw|etDBfmNC z*Z5}hVm$~z00OrX(7NksXL!S{dFZ+CUA^CGuqO}Zf&c^{0D+$g*m~RQ_9;4YptE(4Lh*fImXrb{nY#A_4dD=b3yD7fB*zm6R3HD-oyJ>XQ|)%np4}($Zv1& zxAXO*!%Pr>00izKV0|FhpWzMn(2lcH&Gn4@TCdi1z3tQZ;t(bh2tWV=u?f`b@YC8` zn@jGM=8H|}+~`XAknvV7bN8docW&m`83Z5zfzJr!YPgQgs^y>UfLDJ?!2Uda=I3

(lpZMZ< zq2z{q{PWL)%LZH9jDW3|E6(O-xULGqTrLQG69S^Mm9=OSOoaItfz^6x)lB01^3~J-{RaIzRohA(^XMae zW@Y_LW651pd>}B2z)J0p+7t7RC17i=_D`+7E6+#H3(_&-yXSj^v8S5ZZzQ1g+qSc6 z`Hj3!+4Bm$q~4caL>0mXm=q2()T#djEvlo9?N0&3<`rQqxCz?}=W{s37cO z6#@1C+1@XjU$tk}?N1=BVWsOQwXHOV9cMng)#{$Kw$QF{`P#{!1uO2 z+We;dQ)_R!PrYWpyf;xTc-l|(a$Buozn>Ej&3Uw$KJ%$of6Vvm=g~7mL;|T+%=5b(pqkOg#PUJ5!#n^a_hIoh;JV+Y~?a{ z|B(Ft5wj8y)k*?6z1y)-+F!Y6){aBKYAx3vr9bt2ZDpO@`mHhI!~0trvG-T&CCHq-t{twz{8F~lK|YEQ05>Q8-NT3IKzert^Q@cx!Y?ENTuiF4|SWHkY+Pum}@ z)z$lE{g?z)gQNAQ{x9q3nonBd!~1vDOU#o`R4WMNG(4lWt=KDT?n6NR*|vDK@Ava& zoL{~-@#RA5Ys7r)QwfN4B!SfbXK8iho|yX_0zZ7_54>h?udy{|R(+9m?7H6mP4S&m zCD_SZ0`^?Y)c)IedELDPtX4h!nR@oblRiUy{0t%0MD2QnUhb_X>|6+_-bQH4es`;V zSx44{J_J4?pt>!!v-Mnxqcl!@cz;P7x$%*D`Q#k(+Pw*g)<$YeeLwvUcW-J$ABjL( zFIVU}jiGi;e0YCNAL+drdWm$NiDe#v8QMy{U-Uh1hpcoHfmM1=Yj)|H`0)OcHge;$ z^m0>;V6Wchq9>URY6ATW+V?!9MA$9n&Xp7k}gmih4hnm*Edv-L9W z6f$#E0_yqNisn)sdaj>pH7XC{I-kG@J-6n3dOn!%=f8P?-<735s3k@KmY;| zm`T9a*&g+D#C$V(u+|y^RyUr0FRiZGEvrHR0uYEppjSQB+TC-$IFyKF6am$Zr$t+% zvcS9$fWWN;?C%Y(`hBci{g--wYff(2cP{U_v7X*9^WVakeL?^N5NHwj;rqWu^L~k^ z6*u?yCXn;`bgZ}c^S*L#%@92VATWkNT6;a$BkHqwzy3F7r_36GKucevv=w3R!~g*Z zKp+}{R!z3|N7ZNbe!c^UrjEYxSS_Xfk=p9J3uc1=1R!t@fwUIqu1D5q>;JOOIb_+1 zC6LpVjE&Zoje$M{AOHaf{7j%!n`hK#^?&gJS?}k_xH^SEPGh6JpYN1TQ4jlo00c%7 zSXG~;MyvPZ|06TJcJ5SPGrS-FUz>AQhX4fjAz*9ttom%dU)SG<7?FAjXl|vQsV#4O zJO=>?K;U))v+J|<1?}ISgA@0!xt;0#vgU~_*%JgH0D%z%X4hx+1>26;7jv#9Ao*RP zt+l&mbqGKJ0(%kA-^tTf>bCV~Z~v2ezZWs0Z4vlH3pu@c=WE5qeF#7R0ucBnpuR8d z3h$SC{~Zmz69`yMX@7>cPGH9#AOHaf%p|bV`|itv zXsh==m=6LFfWR#TYBjn?eYW%G=DUUS>HD;K_VjaFc=I!a)48%g2tWV=BMIc{b+7uY zbC>2Dxi99PM?mxJX-is=anI}RGxK)HN)Uhm1kNL1>#6j6*5}rI=h3`#N2!KN*S)oM zCvA2O0SG{#4*^@Nd)MdIe0_GnEUO7v4VC&WEtFnY8khN2@0;}@009W>OhD`Fi25u) z(@p=Ab#%?0xe@y}0nKNr9i^@B2`j^*atjT7-g00Iz*M!>!YnC1Oa+oN$Ho_7SSPfI`N)g#_lzKfPuK>z{} zfB*y_(1U>W|5@HI>-317IUoQ52tWV=5O_yG{ePzS%bM?^FU>>_Q`vR zo_k;}2tWV=5P$##o)J*b*LH^Y%X^7uQSvkdAOHafKmYz!Tq>XM1?R%;SrW zryu|U2tWV=5Ewz=iU0TVe*Aw#CYcig5P$##AmAt9_5YsUkN^Ag!;=tz00bZafe{2e z{@>gCWxf%6VNM7@00Izz00evlTK+%6`{j2AebMn01Rwwb2tWV=BM8*|f0Xy*|06QV zoDhHj1RwwbKY^0}kMw^0-=80zd`BSF^=Lio-@(c{>Dr!a;``^n|E3szzq|B#rb(T}K9U9#HF1Voos zr{4ZdJ$qxa&k-NqW%bbNqnELI*||o(ja@Z2TU&4A<#l%u;OFVS@6uPDUtQPR&aN-s zxb!*V8|$sg+1swp#~oGnmtQ0wD_Gycmwi4XpuRuqdna%GvCpkIA9np#pZM^umPYJ- z^y1gcv+A|q)2p7dt2OQOm6!T7C3_URoNl_uuFxQvH1ri`}=U z|AtL&-X}5g>^=n2T=&w8&dYq%a@B&TMK9>ZqZ57R6TR$HrN1N9eS6wZ*rfA+M?mic z0%?Bbx~E>4@2ifl`h6Ypi=J2gu6Ry+QR~5OwYeJ0GL#aF6+Iy|De!wWCMu%rT#U)rjqn z){E9RS;wyH?Gqnf=+%lmhhET2553H<(9c%P?Qw?opGC>j5eVe8LaqF&lk)zA_a?s2 zU^D6q`S9g}^E>|hMyTDT7}A

ui?dVLT>*R3~~pOD}kn0+?m5FnBo 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 literal 0 HcmV?d00001 diff --git a/data/engine/icons/asset/img.asset b/data/engine/icons/asset/img.asset new file mode 100644 index 0000000000000000000000000000000000000000..9d8249a9dc4eb8fc03ec4d03942ddbae7ca9cd41 GIT binary patch literal 262216 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 literal 0 HcmV?d00001 diff --git a/data/engine/icons/asset/scene.asset b/data/engine/icons/asset/scene.asset new file mode 100644 index 0000000000000000000000000000000000000000..5d10a62ecec6dbe041f6a0491543c55d2b8dbec1 GIT binary patch literal 1048648 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 literal 0 HcmV?d00001 diff --git a/data/engine/icons/asset/txt.asset b/data/engine/icons/asset/txt.asset new file mode 100644 index 0000000000000000000000000000000000000000..079266dfd850d68b612dfa3765a05e2a1f2b201f GIT binary patch literal 262216 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 B^BVvF literal 0 HcmV?d00001 diff --git a/docs/architecture/assets.rst b/docs/architecture/assets.rst index 6832ec9..9bb6709 100644 --- a/docs/architecture/assets.rst +++ b/docs/architecture/assets.rst @@ -5,6 +5,7 @@ Layout {version} | 4 bytes, ie. uint32_t {general metadata} | sizeof(AssetMetadata) {specialized metadata} | sizeof(XXXAssetMetadata), eg. TextureAssetMetadata +{n} | 4 bytes, ie. uint32_t {blob_0...n metadata} | n * sizeof(BlobMetadata) {blob_0...n data} | variable size based on actual data {end marker} | 8 byte, ie size_t for marking the END @@ -13,7 +14,8 @@ Sections --------------------------------------------------------------------------------------------------- version -> The version of the asset for forward compatibility general metadata -> Common asset metadata such as file-path, asset-type, creator, etc. -specialized metadata -> Metadata specific to the asset, eg. texture dimensions for Textures +specialized metadata -> Metadata specific to the asset, eg. texture dimensions for Textures. +n -> The number of blobs. blob_0...n metadata -> Metadata specifying how the actual data is packed, required for unpacking. blob_0...n data -> The actual data, packed and compressed to be reacdy for direct engine consumption. diff --git a/docs/architecture/resource.rst b/docs/architecture/resource.rst new file mode 100644 index 0000000..856d384 --- /dev/null +++ b/docs/architecture/resource.rst @@ -0,0 +1,4 @@ +Resource Management + +=================================================================================================== + diff --git a/modules/asset_baker/CMakeLists.txt b/modules/asset_baker/CMakeLists.txt index 99b95d8..4115268 100644 --- a/modules/asset_baker/CMakeLists.txt +++ b/modules/asset_baker/CMakeLists.txt @@ -6,4 +6,5 @@ target_link_libraries( asset_baker PRIVATE asset_parser PRIVATE stb::stb + PRIVATE logger ) diff --git a/modules/asset_baker/include/asset_baker/bakers.hpp b/modules/asset_baker/include/asset_baker/bakers.hpp new file mode 100644 index 0000000..6a32262 --- /dev/null +++ b/modules/asset_baker/include/asset_baker/bakers.hpp @@ -0,0 +1,120 @@ +#pragma once + +#include +#include +#include +#include +#include + +#define STB_IMAGE_IMPLEMENTATION +#include + +namespace lt { + +class Loader +{ +public: + [[nodiscard]] virtual auto get_name() const -> std::string_view = 0; + + Loader() = default; + + Loader(Loader &&) = default; + + Loader(const Loader &) = delete; + + auto operator=(Loader &&) -> Loader & = default; + + auto operator=(const Loader &) -> Loader & = delete; + + virtual ~Loader() = default; + +private: +}; + +class TextureLoader: public Loader +{ +public: + TextureLoader() = default; + + [[nodiscard]] virtual auto load(std::filesystem::path file_path) const + -> Assets::TextureAsset::PackageData + = 0; +}; + + +class StbLoader: public TextureLoader +{ +public: + StbLoader() = default; + + void load(std::filesystem::path path); + + [[nodiscard]] static auto get_supported_extensions() -> std::unordered_set + { + return { ".png" }; + } + + [[nodiscard]] auto get_name() const -> std::string_view override + { + return "StbLoader"; + } + + [[nodiscard]] auto load(std::filesystem::path file_path) const + -> Assets::TextureAsset::PackageData override + { + auto width = int {}; + auto height = int {}; + auto channels = int {}; + + auto *pixels = stbi_load(file_path.string().c_str(), &width, &height, &channels, 4); + if (!pixels) + { + throw std::runtime_error { + std::format("Failed to load image file at: {} using stbi_load", file_path.string()), + }; + } + + const auto metadata = Assets::Asset::Metadata { + .type = Assets::Asset::Type::Texture, + }; + + const auto texture_metadata = Assets::TextureAsset::Metadata { + .format = Assets::TextureAsset::Format::RGBA8, + .num_components = static_cast(channels), + .pixel_size = { + static_cast(width), + static_cast(height), + {}, + }, + }; + + auto pixels_blob = Assets::Blob {}; + pixels_blob.resize(static_cast(width) * height * channels); + + // TODO(Light): figure out if it's possible to directly populate a blob with stbi functions + memcpy(pixels_blob.data(), pixels, pixels_blob.size()); + stbi_image_free(pixels); + + return Assets::TextureAsset::PackageData { + .metadata = metadata, + .texture_metadata = texture_metadata, + .pixels = std::move(pixels_blob), + }; + } +}; + +class TextureLoaderFactory +{ +public: + static auto create(std::string_view file_extension) -> std::unique_ptr + { + if (StbLoader::get_supported_extensions().contains(file_extension)) + { + return std::make_unique(); + } + + return {}; + } +}; + +} // namespace lt diff --git a/modules/asset_baker/src/baker.cpp b/modules/asset_baker/src/baker.cpp index d9dc6c0..2d3333c 100644 --- a/modules/asset_baker/src/baker.cpp +++ b/modules/asset_baker/src/baker.cpp @@ -1,85 +1,70 @@ +#include #include #include #include -#include +#include -#define STB_IMAGE_IMPLEMENTATION -#include - -#define ASSERT(x, ...) \ - if (!(x)) \ - { \ - log(__VA_ARGS__); \ - return -1; \ - } - - -template -void log(Args &&...args) +void try_packing_texture( + const std::filesystem::path &in_path, + const std::filesystem::path &out_path +) { - (std::cout << ... << args); - std::cout << '\n'; -} - -auto convert_image(const std::filesystem::path &input, const std::filesystem::path &output) -> bool -{ - auto width = int {}; - auto height = int {}; - auto channels = int {}; - - auto *pixels = stbi_load(input.string().c_str(), &width, &height, &channels, 4); - - if (!pixels) - return false; - - auto texture_info = Assets::TextureInfo { - .size = static_cast(width * height * 4), - .format = Assets::TextureFormat::RGBA8, - .pixel_size = { - static_cast(width), - static_cast(height), - 0ul, - }, - .original_file = input.string(), - }; - - auto file = Assets::pack_texture(&texture_info, pixels); - - stbi_image_free(pixels); - - Assets::save_binary_file(output.string().c_str(), file); - - return true; -} - -int main(int argc, char *argv[]) -{ - std::ios_base::sync_with_stdio(false); - - ASSERT( - argc == 3, - "Argc MUST be 3, 1: execution-path(implicit), 2: input-directory, 3: output-directory" - ); - - for (const auto &p : std::filesystem::directory_iterator(argv[1])) + auto texture_loader = lt::TextureLoaderFactory::create(in_path.extension().string()); + if (!texture_loader) { - if (p.path().extension() == ".png") - { - log("Found a texture: ", p); - - auto newp = p.path(); - newp.replace_extension(".asset_texture"); - convert_image(p.path(), newp); - } - else if (p.path().extension() == ".obj") - { - log("Found a mesh -> ", p, " (unsupported)"); - } - else - { - log("Unknown -> ", p); - } + // Don't log anything; this is expected. + return; } - return 0; + try + { + Assets::TextureAsset::pack(texture_loader->load(in_path), out_path); + + log_inf("Packed a texture:"); + log_inf("\tloader : {}", texture_loader->get_name()); + log_inf("\tin path: {}", in_path.string()); + log_inf("\tout path: {}", out_path.string()); + } + catch (const std::exception &exp) + { + log_err("Failed to pack texture:"); + log_err("\tloader : {}", texture_loader->get_name()); + log_err("\tin path : {}", in_path.string()); + log_err("\tout path: {}", out_path.string()); + log_err("\texp.what: {}", exp.what()); + } +} + +auto main(int argc, char *argv[]) -> int32_t +try +{ + if (argc != 2) + { + throw std::logic_error("Argc should be 2 -- exe dir (implicit) and target dir"); + } + + for (const auto &directory_iterator : + std::filesystem::recursive_directory_iterator(argv[1])) // NOLINT + { + if (directory_iterator.is_directory()) + { + continue; + } + + const auto &in_path = directory_iterator.path(); + + auto out_path = in_path; + out_path.replace_extension(".asset"); + + try_packing_texture(in_path, out_path); + } + + return EXIT_SUCCESS; +} +catch (const std::exception &exp) +{ + log_crt("Terminating due to uncaught exception:"); + log_crt("\texception.what: {}:", exp.what()); + + return EXIT_FAILURE; } diff --git a/modules/asset_parser/CMakeLists.txt b/modules/asset_parser/CMakeLists.txt index a53a21a..6c892c0 100644 --- a/modules/asset_parser/CMakeLists.txt +++ b/modules/asset_parser/CMakeLists.txt @@ -7,4 +7,5 @@ target_link_libraries( asset_parser PRIVATE LZ4::lz4_static PRIVATE nlohmann_json::nlohmann_json + PRIVATE logger ) diff --git a/modules/asset_parser/include/asset_parser/assets/texture.hpp b/modules/asset_parser/include/asset_parser/assets/texture.hpp index 7a9a1bd..e69de29 100644 --- a/modules/asset_parser/include/asset_parser/assets/texture.hpp +++ b/modules/asset_parser/include/asset_parser/assets/texture.hpp @@ -1,34 +0,0 @@ -#pragma once - -#include -#include - -namespace Assets { - -enum class TextureFormat : uint8_t -{ - None = 0, - RGBA8, -}; - -struct TextureInfo -{ - size_t size; - CompressionMode compression_mode; - TextureFormat format; - std::array pixel_size; - std::string original_file; -}; - -auto read_texture_info(AssetFile *file) -> TextureInfo; - -void unpack_texture( - TextureInfo *info, - const void *source_buffer, - size_t source_size, - void *destination -); - -auto pack_texture(TextureInfo *info, void *pixel_data) -> AssetFile; - -} // namespace Assets diff --git a/modules/asset_parser/include/asset_parser/parser.hpp b/modules/asset_parser/include/asset_parser/parser.hpp index 5dcb56b..49e7ee0 100644 --- a/modules/asset_parser/include/asset_parser/parser.hpp +++ b/modules/asset_parser/include/asset_parser/parser.hpp @@ -1,34 +1,276 @@ #pragma once +#include #include -#include +#include +#include +#include +#include #include namespace Assets { -struct AssetFile -{ - uint32_t version; +constexpr auto current_version = uint32_t { 1 }; +struct BlobMetadata +{ + enum class Tag : uint8_t + { + color, + depth, + vertices, + indices, + }; + + Tag tag; + + size_t offset; + + CompressionType compression_type; + + size_t compressed_size; + + size_t uncompressed_size; +}; + + +using Blob = std::vector; + +class Asset +{ +public: enum class Type : uint32_t // NOLINT(performance-enum-size) { Texture, Mesh, Material, - } type; + }; - std::string json; - std::vector blob; + struct Metadata + { + Type type; + }; + + Asset() = default; + + Asset(Metadata metadata, std::filesystem::path path, std::ifstream stream) + : m_metadata(metadata) + , m_file_path(std::move(path)) + , m_stream(std::move(stream)) + { + } + + /** Directly unpacks from disk to the destination. + * + * @note The destination MUST have at least blob_metadata.unpacked_size bytes available for + * writing, otherwise segfault could occur! + */ + void unpack_blob(BlobMetadata::Tag blob_tag, std::byte *destination); + + [[nodiscard]] auto get_metadata() const -> const Metadata & + { + return m_metadata; + } + + [[nodiscard]] auto get_file_path() const -> std::filesystem::path + { + return m_file_path; + } + +private: + Metadata m_metadata; + + std::filesystem::path m_file_path; + + std::ifstream m_stream; }; -enum class CompressionMode : uint32_t // NOLINT(performance-enum-size) +class TextureAsset: public Asset { - None, - LZ4, - LZ4HC, -}; +public: + enum class Format : uint32_t // NOLINT(performance-enum-size) + { + None = 0, + RGBA8, + }; -auto save_binary_file(const char *path, const AssetFile &in_file) -> bool; -auto load_binary_file(const char *path, AssetFile &out_file) -> bool; + struct Metadata + { + Format format; + + uint32_t num_components; + + std::array pixel_size; + }; + + /** Data required to pack a texture */ + struct PackageData + { + Asset::Metadata metadata; + + Metadata texture_metadata; + + Blob pixels; + }; + + TextureAsset(const std::filesystem::path &path) + { + m_stream = std::ifstream { path, std::ios::binary }; + if (!m_stream.is_open()) + { + throw std::runtime_error { std::format( + "Failed to open ifm_stream for loading texture asset at: {}", + path.string() + ) }; + } + + // NOLINTBEGIN(cppcoreguidelines-pro-type-cstyle-cast) + m_stream.read((char *)&version, sizeof(version)); + m_stream.read((char *)&m_asset_metadata, sizeof(m_asset_metadata)); + m_stream.read((char *)&m_metadata, sizeof(m_metadata)); + + auto num_blobs = uint32_t {}; + m_stream.read((char *)&num_blobs, sizeof(num_blobs)); + if (num_blobs != 1) + { + throw std::runtime_error { + std::format("Failed to load texture asset: invalid number of blobs: {}", num_blobs) + }; + } + + m_stream.read((char *)&m_pixel_blob_metadata, sizeof(m_pixel_blob_metadata)); + if (m_pixel_blob_metadata.tag != BlobMetadata::Tag::color) + { + throw std::runtime_error { + std::format( + "Failed to load texture asset: invalid blob tag, expected {}, got {}", + std::to_underlying(BlobMetadata::Tag::color), + std::to_underlying(m_pixel_blob_metadata.tag) + ), + }; + } + // NOLINTEND(cppcoreguidelines-pro-type-cstyle-cast) + } + + void unpack_blob(BlobMetadata::Tag tag, std::byte *destination, size_t destination_capacity) + { + if (tag != BlobMetadata::Tag::color) + { + throw std::runtime_error { std::format( + "Invalid tag for unpack_blob of TextureAsset: {}", + std::to_underlying(tag) + ) }; + } + + m_stream.seekg(static_cast(m_pixel_blob_metadata.offset)); + switch (m_pixel_blob_metadata.compression_type) + { + case Assets::CompressionType::None: + if (m_pixel_blob_metadata.uncompressed_size != m_pixel_blob_metadata.compressed_size) + { + throw std::runtime_error("Failed to unpack blob from TextureAsset: " + "compressed/uncompressed size mismatch for no compression " + "type"); + } + + if (m_pixel_blob_metadata.uncompressed_size > destination_capacity) + { + throw std::runtime_error("Failed to unpack blob from TextureAsset: " + "uncompressed_size > destination_capacity, unpacking " + "would result in segfault"); + } + + if (!m_stream.is_open()) + { + throw std::runtime_error("Failed to unpack blob from TextureAsset: ifstream is " + "closed"); + } + + m_stream.read( + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-cstyle-cast) + (char *)destination, + static_cast(m_pixel_blob_metadata.uncompressed_size) + ); + + return; + + default: + throw std::runtime_error(std::format( + "Failed to unpack blob from TextureAsset: unsupported " + "compression type: {}", + std::to_underlying(m_pixel_blob_metadata.compression_type) + )); + } + } + + static void pack(const PackageData &data, const std::filesystem::path &out_path) + { + const auto &[metadata, texture_metadata, pixels] = data; + + auto stream = std::ofstream { out_path, std::ios::binary | std::ios::trunc }; + if (!stream.is_open()) + { + throw std::runtime_error { + std::format("Failed to open ofstream for packing texture at: {}", out_path.string()) + }; + } + stream.seekp(0); + + // NOLINTBEGIN(cppcoreguidelines-pro-type-cstyle-cast) + stream.write((char *)¤t_version, sizeof(current_version)); + + stream.write((char *)&metadata, sizeof(metadata)); + stream.write((char *)&texture_metadata, sizeof(texture_metadata)); + + constexpr auto number_of_blobs = uint32_t { 1 }; + stream.write((char *)&number_of_blobs, sizeof(number_of_blobs)); + + auto pixels_metadata = BlobMetadata { + .tag = BlobMetadata::Tag::color, + .offset = static_cast(stream.tellp()), + .compression_type = CompressionType::None, + .compressed_size = pixels.size(), + .uncompressed_size = pixels.size(), + }; + + stream.write((char *)&pixels_metadata, sizeof(pixels_metadata)); + stream.write((char *)&pixels[0], static_cast(pixels.size())); + // NOLINTEND(cppcoreguidelines-pro-type-cstyle-cast) + } + + [[nodiscard]] auto get_asset_metadata() const -> const Asset::Metadata & + { + return m_asset_metadata; + } + + [[nodiscard]] auto get_metadata() const -> const Metadata & + { + return m_metadata; + } + + [[nodiscard]] auto get_blob_metadata(BlobMetadata::Tag tag) const -> const BlobMetadata & + { + if (tag != BlobMetadata::Tag::color) + { + throw std::runtime_error { std::format( + "Invalid tag for get_blob_metadata of TextureAsset: {}", + std::to_underlying(tag) + ) }; + } + + return m_pixel_blob_metadata; + } + +private: + Asset::Metadata m_asset_metadata {}; + + Metadata m_metadata {}; + + BlobMetadata m_pixel_blob_metadata {}; + + uint32_t version {}; + + std::ifstream m_stream; +}; } // namespace Assets diff --git a/modules/asset_parser/include/compressors/compressors.hpp b/modules/asset_parser/include/compressors/compressors.hpp new file mode 100644 index 0000000..dfee965 --- /dev/null +++ b/modules/asset_parser/include/compressors/compressors.hpp @@ -0,0 +1,14 @@ +#pragma once + +#include + +namespace Assets { + +enum class CompressionType : uint32_t // NOLINT(performance-enum-size) +{ + None, + LZ4, + LZ4HC, +}; + +} diff --git a/modules/asset_parser/src/assets/texture.cpp b/modules/asset_parser/src/assets/texture.cpp index 850524f..3e1b00b 100644 --- a/modules/asset_parser/src/assets/texture.cpp +++ b/modules/asset_parser/src/assets/texture.cpp @@ -2,79 +2,11 @@ #include #include +// [version], [type] -- +// [asset_metadata], [blob_metadata] -- +// [blob] -- + namespace Assets { -using namespace nlohmann; - -auto read_texture_info(AssetFile *file) -> TextureInfo -{ - json texture_meta_data = json::parse(file->json); - - return TextureInfo { - .size = texture_meta_data["bufferSize"], - .compression_mode = texture_meta_data["compression"], - .format = texture_meta_data["format"], - .pixel_size = { - texture_meta_data["width"], - texture_meta_data["height"], - 0, - }, - .original_file = texture_meta_data["originalFile"], - }; -} - -void unpack_texture( - TextureInfo *info, - const void *source_buffer, - size_t source_size, - void *destination -) -{ - if (info->compression_mode == CompressionMode::LZ4) - { - LZ4_decompress_safe( - (const char *)source_buffer, - (char *)destination, - source_size, - info->size - ); - } - else - { - memcpy(destination, source_buffer, source_size); - } -} - -auto pack_texture(TextureInfo *info, void *pixel_data) -> AssetFile -{ - json metadata; - metadata["format"] = info->format; - metadata["width"] = info->pixel_size[0]; - metadata["height"] = info->pixel_size[1]; - metadata["bufferSize"] = info->size; - metadata["originalFile"] = info->original_file; - metadata["compression"] = CompressionMode::LZ4; - - AssetFile file; - file.type = AssetFile::Type::Texture; - file.version = 1u; - - const int compress_staging = LZ4_compressBound(info->size); - file.blob.resize(compress_staging); - const int compression_size = LZ4_compress_default( - (const char *)pixel_data, - (char *)file.blob.data(), - info->size, - compress_staging - ); - file.blob.resize(compression_size); - - - metadata["compression"] = CompressionMode::LZ4; - - file.json = metadata.dump(); - - return file; -} } // namespace Assets diff --git a/modules/asset_parser/src/parser.cpp b/modules/asset_parser/src/parser.cpp index 55849c4..903ce81 100644 --- a/modules/asset_parser/src/parser.cpp +++ b/modules/asset_parser/src/parser.cpp @@ -1,56 +1,62 @@ #include +#include #include -#include -#include +#include namespace Assets { -auto save_binary_file(const char *path, const AssetFile &file) -> bool -{ - std::ofstream outstream(path, std::ios::binary | std::ios::out); - - outstream.write((const char *)&file.version, sizeof(uint32_t)); - outstream.write((const char *)&file.type, sizeof(AssetFile::Type)); - - uint32_t json_size = file.json.size(); - uint32_t blob_size = file.blob.size(); - outstream.write((const char *)&json_size, sizeof(uint32_t)); - outstream.write((const char *)&blob_size, sizeof(uint32_t)); - - outstream.write(file.json.c_str(), json_size); - outstream.write((const char *)file.blob.data(), blob_size); - - outstream.close(); - - outstream.close(); - - return true; -} - -auto load_binary_file(const char *path, AssetFile &out_file) -> bool -{ - std::ifstream instream(path, std::ios::binary); - instream.seekg(0ull); - - if (!instream.is_open()) - return false; - - instream.read((char *)&out_file.version, sizeof(uint32_t)); - instream.read((char *)&out_file.type, sizeof(AssetFile::Type)); - - uint32_t json_size; - uint32_t blob_size; - instream.read((char *)&json_size, sizeof(uint32_t)); - instream.read((char *)&blob_size, sizeof(uint32_t)); - - out_file.json.resize(json_size); - out_file.blob.resize(blob_size); - instream.read((char *)out_file.json.data(), json_size); - instream.read((char *)out_file.blob.data(), blob_size); - - instream.close(); - - return true; -} +// void Asset::unpack(std::byte *destination) +// { +// if (!m_stream.is_open()) +// { +// throw std::logic_error { +// "Failed to unpack asset: " +// "ifstream is closed", +// }; +// } +// +// switch (m_metadata.blob_compression_type) +// { +// case CompressionType::None: +// if (m_metadata.packed_size != m_metadata.unpacked_size) +// { +// throw std::logic_error { +// "Failed to unpack asset: " +// "compression type set to none but packed/unpacked sizes differ", +// }; +// } +// +// m_stream.read( +// std::bit_cast(destination), +// static_cast(m_metadata.packed_size) +// ); +// m_stream.close(); +// +// case CompressionType::LZ4: +// m_stream.close(); +// throw std::logic_error { +// "Failed to unpack asset: " +// "LZ4 compression is not implemented yet", +// }; +// +// +// case CompressionType::LZ4HC: +// m_stream.close(); +// throw std::logic_error { +// "Failed to unpack asset: " +// "LZ4HC compression is not implemented yet", +// }; +// +// default: +// m_stream.close(); +// throw std::logic_error { +// std::format( +// "Failed to unpack asset: " +// "Compression type was not recognized: {}", +// std::to_underlying(m_metadata.blob_compression_type) +// ), +// }; +// } +// } } // namespace Assets diff --git a/modules/engine/CMakeLists.txt b/modules/engine/CMakeLists.txt index 22206cb..becfdec 100644 --- a/modules/engine/CMakeLists.txt +++ b/modules/engine/CMakeLists.txt @@ -104,7 +104,7 @@ target_link_libraries( PUBLIC opengl::opengl PUBLIC glfw PUBLIC imgui - PUBLIC stb::stb + PUBLIC asset_parser PUBLIC yaml-cpp::yaml-cpp PUBLIC EnTT::EnTT ) diff --git a/modules/engine/include/engine/utils/file_manager.hpp b/modules/engine/include/engine/utils/file_manager.hpp index 0689e37..dea824f 100644 --- a/modules/engine/include/engine/utils/file_manager.hpp +++ b/modules/engine/include/engine/utils/file_manager.hpp @@ -7,7 +7,7 @@ namespace Light { class BasicFileHandle { public: -virtual ~BasicFileHandle() = default; + virtual ~BasicFileHandle() = default; BasicFileHandle( uint8_t *data = nullptr, uint32_t size = 0ull, @@ -58,13 +58,12 @@ virtual ~BasicFileHandle() = default; return is_valid(); } -protected: +private: // made protected for custom free(): uint8_t *m_data; uint32_t m_size; -private: const std::string m_path; const std::string m_name; @@ -72,68 +71,10 @@ private: const std::string m_extension; }; -class ImageFileHandle: public BasicFileHandle -{ -public: -virtual ~ImageFileHandle() = default; - ImageFileHandle( - uint8_t *data, - uint32_t size, - const std::string &path, - const std::string &name, - const std::string &extension, - uint32_t width, - uint32_t height, - uint32_t components, - uint32_t desiredComponents - ) - : BasicFileHandle(data, size, path, name, extension) - , m_width(width) - , m_height(height) - , m_components(components) - , m_desired_components(desiredComponents) - { - } - - void release() override; - - [[nodiscard]] auto get_width() const -> uint32_t - { - return m_width; - } - - [[nodiscard]] auto get_height() const -> uint32_t - { - return m_height; - } - - [[nodiscard]] auto get_components() const -> uint32_t - { - return m_components; - } - - [[nodiscard]] auto get_desired_components() const -> uint32_t - { - return m_desired_components; - } - -private: - uint32_t m_width; - - uint32_t m_height; - - uint32_t m_components; - - uint32_t m_desired_components; -}; - class FileManager { public: static auto read_text_file(const std::string &path) -> BasicFileHandle; - - static auto read_image_file(const std::string &path, int32_t desiredComponents) - -> ImageFileHandle; }; } // namespace Light diff --git a/modules/engine/include/engine/utils/resource_manager.hpp b/modules/engine/include/engine/utils/resource_manager.hpp index 58e5b1e..b4f5ea7 100644 --- a/modules/engine/include/engine/utils/resource_manager.hpp +++ b/modules/engine/include/engine/utils/resource_manager.hpp @@ -1,6 +1,7 @@ #pragma once #include +#include namespace Light { @@ -26,13 +27,9 @@ public: instance().load_shader_impl(name, vertexPath, pixelPath); } - static void load_texture( - const std::string &name, - const std::string &path, - unsigned int desiredComponents = 4u - ) + static void load_texture(const std::string &name, const std::string &path) { - instance().load_texture_impl(name, path, desiredComponents); + instance().load_texture_impl(name, path); } static void release_texture(const std::string &name) @@ -59,11 +56,7 @@ private: const std::string &pixelPath ); - void load_texture_impl( - const std::string &name, - const std::string &path, - unsigned int desiredComponents = 4u - ); + void load_texture_impl(const std::string &name, const std::filesystem::path &path); void release_texture_impl(const std::string &name); diff --git a/modules/engine/src/utils/file_manager.cpp b/modules/engine/src/utils/file_manager.cpp index 81ed290..e528546 100644 --- a/modules/engine/src/utils/file_manager.cpp +++ b/modules/engine/src/utils/file_manager.cpp @@ -1,7 +1,5 @@ -#define STB_IMAGE_IMPLEMENTATION #include #include -#include namespace Light { @@ -27,7 +25,6 @@ void BasicFileHandle::release() m_size = 0ull; } - auto FileManager::read_text_file(const std::string &path) -> BasicFileHandle { // parse path info @@ -63,52 +60,52 @@ auto FileManager::read_text_file(const std::string &path) -> BasicFileHandle return { data, static_cast(size), path, name, extension }; } -auto FileManager::read_image_file(const std::string &path, int32_t desiredComponents) - -> ImageFileHandle -{ - // parse path info - auto name = path.substr(0, path.find('.') + -1); - auto extension = path.substr(path.find('.') + 1); +// auto FileManager::read_image_file(const std::string &path, int32_t desiredComponents) +// -> ImageFileHandle +// { +// // parse path info +// auto name = path.substr(0, path.find('.') + -1); +// auto extension = path.substr(path.find('.') + 1); +// +// // load image +// auto width = 0; +// auto height = 0; +// auto fetchedComponents = 0; +// auto *pixels = stbi_load(path.c_str(), &width, &height, &fetchedComponents, desiredComponents); +// +// // check +// if (!pixels) +// { +// log_wrn("Failed to load image file: <{}>", path); +// } +// else if (fetchedComponents != desiredComponents) +// { +// log_wrn( +// "Mismatch of fetched/desired components: <{}> ({}/{})", +// name + '.' + extension, +// fetchedComponents, +// desiredComponents +// ); +// } +// +// return ImageFileHandle( +// pixels, +// width * height, +// path, +// name, +// extension, +// width, +// height, +// fetchedComponents, +// desiredComponents +// ); +// } - // load image - auto width = 0; - auto height = 0; - auto fetchedComponents = 0; - auto *pixels = stbi_load(path.c_str(), &width, &height, &fetchedComponents, desiredComponents); - - // check - if (!pixels) - { - log_wrn("Failed to load image file: <{}>", path); - } - else if (fetchedComponents != desiredComponents) - { - log_wrn( - "Mismatch of fetched/desired components: <{}> ({}/{})", - name + '.' + extension, - fetchedComponents, - desiredComponents - ); - } - - return ImageFileHandle( - pixels, - width * height, - path, - name, - extension, - width, - height, - fetchedComponents, - desiredComponents - ); -} - -void ImageFileHandle::release() -{ - stbi_image_free(reinterpret_cast(m_data)); - m_data = nullptr; - m_size = 0ull; -} +// void ImageFileHandle::release() +// { +// stbi_image_free(reinterpret_cast(m_data)); +// m_data = nullptr; +// m_size = 0ull; +// } } // namespace Light diff --git a/modules/engine/src/utils/resource_manager.cpp b/modules/engine/src/utils/resource_manager.cpp index ab33375..e698f02 100644 --- a/modules/engine/src/utils/resource_manager.cpp +++ b/modules/engine/src/utils/resource_manager.cpp @@ -1,3 +1,5 @@ +#include +#include #include #include #include @@ -12,49 +14,44 @@ void ResourceManager::load_shader_impl( const std::string &pixelPath ) { - // check lt_assert(!vertexPath.empty(), "Empty 'vertexPath'"); lt_assert(!pixelPath.empty(), "Empty 'pixelPath'"); - // load files auto vertexFile = FileManager::read_text_file(vertexPath); auto pixelFile = FileManager::read_text_file(pixelPath); - // check lt_assert(vertexFile.is_valid(), "Failed to read vertex file: {}", vertexPath); lt_assert(pixelFile.is_valid(), "Failed to read vertex file: {}", pixelPath); - // create shader m_shaders[name] = Ref( Shader::create(vertexFile, pixelFile, GraphicsContext::get_shared_context()) ); - // free file vertexFile.release(); pixelFile.release(); } -void ResourceManager::load_texture_impl( - const std::string &name, - const std::string &path, - unsigned int desiredComponents /* = 4u */ -) +void ResourceManager::load_texture_impl(const std::string &name, const std::filesystem::path &path) { - // load file - auto imgFile = FileManager::read_image_file(path, desiredComponents); + log_trc("Loading texture:"); + log_trc("\tname: {}", name); + log_trc("\tpath: {}", path.string()); + + auto asset = Assets::TextureAsset { path }; + const auto metadata = asset.get_metadata(); + const auto blob_metadata = asset.get_blob_metadata(Assets::BlobMetadata::Tag::color); + + auto blob = std::vector(blob_metadata.uncompressed_size); + asset.unpack_blob(blob_metadata.tag, blob.data(), blob.size()); - // create texture m_textures[name] = Ref(Texture::create( - imgFile.get_width(), - imgFile.get_height(), - imgFile.get_components(), - imgFile.get_data(), + metadata.pixel_size[0], + metadata.pixel_size[1], + metadata.num_components, + std::bit_cast(blob.data()), GraphicsContext::get_shared_context(), path )); - - // free file - imgFile.release(); } void ResourceManager::release_texture_impl(const std::string &name) diff --git a/modules/mirror/src/editor_layer.cpp b/modules/mirror/src/editor_layer.cpp index c27cbbe..d623013 100644 --- a/modules/mirror/src/editor_layer.cpp +++ b/modules/mirror/src/editor_layer.cpp @@ -28,7 +28,7 @@ EditorLayer::EditorLayer(const std::string &name) m_camera_entity = m_scene->create_entity("Camera"); m_camera_entity.add_component(SceneCamera(), true); - ResourceManager::load_texture("Awesomeface", "data/assets/textures/awesomeface.png"); + ResourceManager::load_texture("Awesomeface", "data/assets/textures/awesomeface.asset"); auto entity = Entity { m_scene->create_entity("Awesomeface", {}) }; entity.add_component( diff --git a/modules/mirror/src/panel/asset_browser.cpp b/modules/mirror/src/panel/asset_browser.cpp index c7175d5..7656263 100644 --- a/modules/mirror/src/panel/asset_browser.cpp +++ b/modules/mirror/src/panel/asset_browser.cpp @@ -10,10 +10,10 @@ AssetBrowserPanel::AssetBrowserPanel(Ref active_scene) , m_assets_path("./data/assets") , m_active_scene(std::move(active_scene)) { - ResourceManager::load_texture("_Assets_Directory", "data/engine/icons/asset/dir.png"); - ResourceManager::load_texture("_Assets_Scene", "data/engine/icons/asset/scene.png"); - ResourceManager::load_texture("_Assets_Image", "data/engine/icons/asset/img.png"); - ResourceManager::load_texture("_Assets_Text", "data/engine/icons/asset/txt.png"); + ResourceManager::load_texture("_Assets_Directory", "data/engine/icons/asset/dir.asset"); + ResourceManager::load_texture("_Assets_Scene", "data/engine/icons/asset/scene.asset"); + ResourceManager::load_texture("_Assets_Image", "data/engine/icons/asset/img.asset"); + ResourceManager::load_texture("_Assets_Text", "data/engine/icons/asset/txt.asset"); m_directory_texture = ResourceManager::get_texture("_Assets_Directory"); m_scene_texture = ResourceManager::get_texture("_Assets_Scene");