From cf6b325cae90ed4200cb91e263eb9caf6222c9e8 Mon Sep 17 00:00:00 2001 From: scurest Date: Sun, 27 Jan 2019 00:02:16 -0600 Subject: [PATCH] Update README --- README.md | 91 +++++++++++++++++++++++++++++------------------ frontispiece.gif | Bin 509038 -> 925697 bytes 2 files changed, 57 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index 7ffe9b5..c0d6fcc 100644 --- a/README.md +++ b/README.md @@ -1,86 +1,109 @@ -# apicula +

Ore ga Omae o Mamoru model in Blender

+

apicula

+

+Build status +Lines of code +license 0BSD +
+Rip models from DS games. +

-[![Build status](https://ci.appveyor.com/api/projects/status/bavh9qh25mbta41x?svg=true)](https://ci.appveyor.com/project/scurest/apicula) -[![Lines of code](https://tokei.rs/b1/github/scurest/apicula)](https://github.com/Aaronepower/tokei) +----- -Convert Nintendo DS models and animations to COLLADA. - -The [Nitro file -formats](https://wiki.vg-resource.com/wiki/Nintendo_DS#NITRO_File_Formats) were -the formats for Nintendo's SDK for DS game developers and were used by many DS -games. This tool is for dealing with Nitro models (NSBMD files), viewing them, -and converting them to COLLADA .dae files. There is also support for loading -textures (NSBTX) and animations (NSBCA). - -![Ore ga Omae o Mamoru model imported into Blender](frontispiece.gif) +Many Nintendo DS games used [Nitro +files](https://wiki.vg-resource.com/wiki/Nintendo_DS#NITRO_File_Formats) for +assets, like NSBMD files for 3D models. apicula can extract these models and +their associated textures and animations from a ROM or memory dump, display them +in its model viewer, and convert them to the common 3D formats COLLADA and glTF +for importing into content-creation tools like Blender. * [Tutorial](https://github.com/scurest/apicula/wiki/TUTORIAL) * [Hallow's tutorial on VG Resource](https://www.vg-resource.com/thread-32332.html) * [Common Blender issues](https://github.com/scurest/apicula/wiki/BLENDER) -## Downloads +### Downloads Pre-built binaries are provided for Windows: -* [apicula-latest-x86_64-pc-windows-msvc](https://s3.amazonaws.com/apicula/apicula-latest-x86_64-pc-windows-msvc.zip) (Windows, 64-bit) -* [apicula-latest-i686-pc-windows-msvc](https://s3.amazonaws.com/apicula/apicula-latest-i686-pc-windows-msvc.zip) (Windows, 32-bit) +* [apicula for Windows, 64-bit](https://s3.amazonaws.com/apicula/apicula-latest-x86_64-pc-windows-msvc.zip) +* [apicula for Windows, 32-bit](https://s3.amazonaws.com/apicula/apicula-latest-i686-pc-windows-msvc.zip) These are built automatically off the latest `master`. You may need one of the Visual Studio Redistributable packages installed. -## Building +### Building -Building is done in the usual way for Rust projects. See [BUILDING.md](BUILDING.md). +Make sure [Rust is installed](https://rustup.rs/) and [build the usual way](https://doc.rust-lang.org/cargo/guide/working-on-an-existing-project.html) + + $ git clone https://github.com/scurest/apicula.git + $ cd apicula + $ cargo b --release + $ target/release/apciula -V -## Usage +### Usage -To view a set of models +To search a ROM or other packed file for Nitro files and extract them + + apicula extract -o + +To view models apicula view -To convert a set of models to COLLADA, placing the generated files in the given -directory +To convert models to COLLADA `.dae` files apicula convert -o -To extract Nitro files from a ROM or other packed file, placing extracted files -in the given directory +To convert models to glTF `.glb` files - apicula extract -o + apicula convert -f=glb -o To get technical information about the given Nitro files apicula info -To receive help +To receive further help apicula help See also the [tutorial](https://github.com/scurest/apicula/wiki/TUTORIAL) on the -process of extracting Nitro files from a ROM image and using apicula to convert -them to COLLADA. +process of extracting Nitro files from a ROM, converting them to COLLADA, and +importing them into Blender. -## Compatibility +### Compatibility -apicula was primarily tested with Nitro files from the following games +apicula recognized these file formats + +* `.nsbmd`, `.BMD`, or `.BMD0` contain 3D models, and often their associated + textures and palettes +* `.nsbca`, `.BCA`, or `.BCA0` contain skeletal animations +* `.nsbtx`, `.BTX`, or `.BTX0` contain textures and palettes +* `.nsbtp`, `.BTP`, or `.BTP0` contain pattern animations, which change the + textures in a material + +Pattern animations are supported in the viewer and extractor, but not in the +converter (neither COLLADA nor glTF support animations that change a material's +textures). + +Exporting is primarily tested with the following games: * Kingdom Hearts: 358/2 Days * Ore ga Omae o Mamoru * Rune Factory 3: A Fantasy Harvest Moon -Importing the COLLADA files we generate has been tested in the following programs: +Importing the resultant COLLADA files has been tested in the following programs: -* Blender +* Blender 2.79 * Godot If you can test in others (Maya, 3DS Max), that would be appreciated :) -## Special Thanks +### Special Thanks * **kiwi.ds**, for models and documentation for Nitro formats. All NDS model viewers seem to be derived from this one. Now defunct. @@ -97,6 +120,6 @@ If you can test in others (Maya, 3DS Max), that would be appreciated :) invaluable. -## License +### License 0BSD diff --git a/frontispiece.gif b/frontispiece.gif index 3938017051eff3e29b48d6a51602ab0a1e3effe2..471b6691ad951f016dc8e7baddaa278b52f3dccc 100644 GIT binary patch literal 925697 zcmWif_dnH-7suasy6)hHxCqzYT(U{mmK8!W>e_o{M96hr*A|hTt`V}j%8t6WtjJ8N z8xnm~+M4&<_xU(~!1>|49_RIVoyV~_Wv-*^r2#eseTM=6CovkJCIW+9z}z^%20#ED zg5ZGyD9&JS6own6smaB`#U){do3>$nywE@H+SMa~%~B5WxLm z3rY|KHI0Ri@CpkHi2)pVS#A6mwm4Q?TtH4-O;?=FmXH*ZFpZb|hhcy$0wJqmEhj7| zuV$?9maQm3Q2OylMczPF*ILy+RSkhqJBn22z^ea)XsgA|tEHu-^N%gIE&`z|r>CoJ zU>MwX@*g(mjj#enTBgPbgfRkZVq#)y`man)pR+B^EiIkAP9eChuvjacfR&?+9=xF3|4<+g}JDaN|Uvu6AHxU{Fv{ zuz*1DKN1T=u-Fiv=#YO@ZH9)1hJ}Sih|5RR>_~<%ZcLRiQ;mJOuM9{q+}W8GPC5>a&mHV#c{df;bxMMMWi=8YLwqr4}}&j}^-+Dk@ZtR}6oz{Kl>l7q60+uU`FIFOP5Z^J`L3 zYP#LrqN~^1+S(>B-=-kZmRQ`j!)`Y*Zg)I=N5|}L(3wtxPM5rVSMHUruCDGAy7$9k z2NYBXRCET6P7TR5PJ7Pzggl;`ozE&;I2XL&|<`O zJlMX`y1lvidhh*?-}(L0#`m@M?{7K3Z|Hi@torup>+hkJzkmO-E8W?R;q1Og?727M zY?Pgu(-{*Zdoy(v0tEC=4&pzcFem^6l>V=c|H}kGuz??lW0nm1P#S_)!DEt9Gm?Ro zw5qb~s2$7U*y5Aa3P09rF!GIb?9|=*M@4dHnyU~r?y^#X&s5c^dkwRdI?-=89^Gqv ze3O`l6tRlgDRo+^f418}OOlG}5UaDO9YN9~WWCulSS!G^3 z9`Zuz2hBVBW%kz}!+o85i^lTq@HD}$|5h1UD*iTYYqC!|qW{}z?GO3yIWukI{BLF9 zuJgG&$P05D;U8Yk)>#X9w8no7x_9|`+1#MM)AIaa4qHt1Ymr9q%YIu$t-OI>-?im4 zGEP5yFl#uN?RVzF{xojl8%$30!e`DvR$|tdkEhheB1bTiHm~AX)EPf#d^*nR670&d z-#sU)Y0$8!rc|6Hmw;eHri+firUu+obr7+XLud~4ak3q#xu7QYeldr7a&~xeRSL~l-YS&g!o$WwBg6eyS}td+z*?uh@@-2cDliLbCk0kj_0JDJX$0o znVYMF&iaq;x~BUExOXeYcIAt2v8wG4N0B6^&bX-h104=JY5O=r;Of5QL`_zHha8Uj zKi{E2TZI)&+G_BRDH)F;GvWGOeG<($8g?XAQ8g*yl#_B1!H1svx>8;8R3yj+GsLZ{T}{eUg?(U&o7OWRFkEKEl2qtOB9W8L8`2Wc3ekD zVn!N8IqQAfU@fLriq4t+R_V%I^(AJT(wXUvxgiU~ z<$+6ZK-$u}Fe)i`GcO}RGSzQn^{n-Rzz5n^_KD$n>_?$P(~U0zlZtBYep-b{KoxH+qe@H zc{JA?O8k}3f{S?mwi%-lA^uIS^mw1p23*m}QAyFanG^W&d1L}rQgoRGR@in>j;*)O zB?$VfUFD>m|Epg1JiBzxH>>FEoSMMDf#tc^!MM8TAa_8VApC4nge}{KQ%r4SQa++w z`&BOd+BMgDpoR%zN*}S&F=sj%u{rdBEdh~vsjB8TCV1L4p?Ul*XPZZP5quLyT8X}b5%5h%^;RkO>wQP?EYDrICkRBc?sOFfmnaX@a% z&ZdA7i9)e*V9Y1ga2gdzs;{qrfEX6$ee9j2BcIcS>Cxf$NaK9e`Lh+d;yr?qOz4XJ zXhi&e>lR_9qt{_WrK}hAB36-L=#bfau}8(D;C<}J;OBzRG&xminE28}lbmdc%881` zH1E>9{Rh;Z-W$Ypui^B-R)OIbw}U`zF6q|}STG%7j5S}pU~$E08XFU$^7a|kIr-I0 z!27qQX@Kn1lRUPdyer7gfEchrql3f?vNAf<@@NeiUK)b45FKt(kcuAleY|pT z&!i(Y_X7IzyekRJ&+zg#nObNH(($RNjm4jQ}aDWnUQTqMhNWF7T%A?tS5 zRP%qeZoc8Gmxy=um>(nTG`P9k|Gqp5KRBvK3@H+?3|;%-C02%|>ipFc5Sff9pRMvg zFMFSRn$4fS5%UqOyIB94a5|N@nnewM2z}Q1^HQ6}uXiez%cDwiJ!PoE@XI&T`#(0k zzn@a@Wlt#iI0a4{*+6FU3S6E~XK67F|9n{EtYXD$#WTj~C|ANSUSaR*whPHSiW;xp z*$@H3MR5!37!S2AOAepVqAtY^=2kk;{mjDd)A5&d&P+~Yd7V?}idE>2V*C)Q%09X> zMd{gbXX&00oj_h6BQ#O_<0biWT4N<_?^AVn-q!5TrDw}u${oyv-Vu zM%jkhLsa1n{0!M1HfeS~)K&5qDr?nLLgOQ6h5oCLQ>TYeLc||i`jV3vXQf$|+RJ&D zATms52ky;)Sz=?dSG+|z5`9z8wynm*bzMH1d6q{`Fo?(zzU4A@3u5#=`lSr=p*DF) z`^=3U{Dehx!Rp28PZGD8p;=fz%t|oBKN--v6!x0%i=Y;+j$wS}%wB-*$RZ}oPGMKPZW6oT5OR}&2PBILPIh!vjmKjG}8G^G$Ip~PeeM z^J;MBP_UFhlnvITZ$7Pd-Whoj-DphBULa{7Wb8FkjaYH-R^zmRl&ni}^7iR*k?Do2 zz_oys;sC4jhbh%17(Y2AVhtvC0PgPEf?8D`t2(KOQM7g6)jWO5Y5$%l`k6m$^ zzMLh5*c+v}uEbo!01vr(E{h-#m2wu{k$Gp1MR6H~ z1Wz58GRnt{OgJKj_f(d*-G6_R~$uRVw6hS3rVc)n# zywP(^fM`TsuNw<_$b>#5#=!ch?>M5kO7NOG=@Ij&K@$94Sqc4IVL%WE{S;<{N|_{K z{9TL4z%^HTsV5m^NeE=QI%RxAU1OG+eGJTC_rNY(n6`L9LRnNHMtVqubmz%Vv=SFk(U8ux+xf!z`XY~xp_Xa!yxb; z_soc0sB?`pJA^*jZ9pzYZcYJPNbn%QeOS<*VU^&F3y9o9&oK#FB#2gw_t0*_a$o5^ z?YheTy!AlN@&ZmKzPZkgVN=^osuZ}!gz(V2DgYxnUvC_XAuZE!Kf}8)sG}B7s~*P) zTPG+2-0du+0v(LT(ofvN^ECQ*(C${n-^1u#xp+MLR$#W){cLj_RPPx_E`Z`;0_FeR zQ($0N49pt<7Dwc)YpDv}(-S^tLS%K?3wL=Ez{~QvB06>YoLX34P5=+8wQBZh;e|fC z@92e4j_fWk=vI#7aLxdU&2vWRcj)yM@s1I!rZEz3{q>1l&klOD=>QsgmvG-8gMBH> zmfUM7gES(CECS*u%MjWmgMtv$EA#j(0U?=3(r?mHhAn+RggMS&F^?Er&X)ZR_rZ@3 zFtaQxtpezfT!-v8kP0?@^#|yWX`KP5)?*}qz&BSi?=wSqA3hs0i(>er&~Eqh3WSDY zfI2aHsS>t}lIg9*=$~d3?mG>FJ>c6UaLRx8%70n3j3IU`;@2`7$~tSG>bXrp1n&DA z@VgthMixk(y(0U@h`}5|GY3zEfJW&kcaL-;0M(3Trq6eJ5#e5>7E03{4Yxq;ENJI+ z?!&{@dU~HS9*Q^M6HA&fj$-tqfS!<{VY#8;-r<*s{O-%%wkT)@`wQkV1HG)@zrcJL zbpYdL0-FjT@k;#l$zX{_KaEIZ{>ttx4r;c8+RnrsTl7P>2EQE(h(LvAKXcIV7l4ce zHibAw39xIS98SPEYRjr6WZW0%ag;_&1Wx{HfJ7vzbJgWNWWfc|U}Jp!0i8Kx2SDAA^>%FB`*FW9Q|;W& z#3MHvjK1MhQh?Y9P^(MF)zI_!b4)~7k9RV_K{Ooo0Jt6s>fFD_PXacl(9al{g-EUo zx#%^P-bKEVcgNuFWEk!sIvgbhn~TM z5JY58&@i`CtOJn)dH5t$A3SO~gK!;hL7_562}BmAzjYch4}ue>ueYM6{Npu9S6Vhe z3qGiq4S5k{blav(78#BF6BdL$fo48x3-wR<31>w9n>rAm=OZ+J4H?O`z*-P}j&{6+ zzJP`n1Dx*+X2KM?#+YP+$YNS|y++u583Yj0wD`nkmMFq|^2EBXI22D@3I_o0V$RWf zd7dnUSiy}_GvJ2F9Z-GD=9BDs#uq7ig}BC>{LBG}7u8ulxHW`I8I ziI?NK&vsXGD-jofIc?L`1@_|n4hI0Rrlcz+lOs2HhzpY^){q5#NIH-X5Z;iu=AzNL z@74;h46-sy`^)1}B2Pn93YF;kn+B%-eK>)zWs3YwJM}9xllQ z-?;R&=Up^LIQ*wA=eOr;wFM~JyM+(4FG!w`7_9ScF8**52~7rzFo7l8j&(WYq`k<+ zMZ(67h?jA0$L9bM1_%xZ;LMN~9*%PZAb~K@h9am-3E5E0wP#NQd^m>pqivX_TwnrM zQ-lpO@g*&=wt#c;0Hj9-dJ9;1EP{5x(s{+YXvmw2eMMp+o}=eT(daa-mNfqIh*F}d@Bj1_L&f+3>lB?kkksKmxsh)%#X&JP~ z92CcR7Q`gnLP2*6xEiF8>a5i?&prNGphzj?M++dr+N%LqH|FnW9})szzzX96aAb5jY53=8qP$0-%FBds7EML$gQMAp zx{wctFVH`$heT9C{COK^>42KuN0am0n(cX<7ly)~ADqw%v}Nwy2|xHS2naAf+O>b= zCxI&O_nlRO;ICqK?2+vxWCQ8bo$UlMBKIE}`X%d=4e*)3eYjfI=z z4I^Sm#W`%6W*=2P9~zj>ZJsZ3;tEvI(bvKxl}NzSfFT4Fa5~3x3;A?L!<8{fEG**W z_1);t-Su7^%ZzyGFM%qGDbbBy3%z|!d<%dy^WZGkNM0il6u*kAE0%xQ^)9wTqr+Do zgD0kM#3jm1g^3e`p45j8(?g#!yyRnGNw0>So1KoDcKJ=a^~bhfzOEkIx!a@S>H6FK zyJA>-=+ld}Wx~#IBj1WAZd13Oz`$^zH!6gtG+(AB$qsute#5=T{P|!q8(yt%k7`+U zYS$p68=C4i!Z($^^t~D6mJE%H`l#$4>Px=%&8l?H&3oYt>Nsott0IEo{XHLZEiTNx zr}pxrSa)rVxGD05364aD@*t*DTi1$MAXu|RE=Z8iCscqlF-jW!NN>6UrAAm(5}2C- z&9+@YW@U@kSy{IfESVDk5X7eHHY|-&*I_PfwE50lr~JR<#Q zXE#g1l&|7HFhr^U5E$|B|D=LG8+VFBBxF1%o6s`vLs$GZ;D#qd!7)SWcllV4+kYTW zIr4RXdB%ODc|7>uEWqIbfZLDB?WYdS6%pA-Ls!nd;pYt4OE*TH7$uA(>lozS>$@UY zX!^t|dYZ>Q*Edge&EK1zZhP6c%UL)&M$_e70L(`R&cvEX!(AYF-YO+!=AWVe<63Q*=bM<5KT%2J>8F1f-8xe&goD1S=*T+p7K%*JrASF4;}~= z8MW|v%HHr}^!b(eeY;h_wWPB}laJO}3cVNVFJCWc_nZJ_*5 zy2Ni-_>NICm)Y@FAViSl8F6afl#RJRDYB|!9By9&VK22w?=v9#(@c}CTbFJmejoFH z=|{6O%S+M!oKR9xI{T&6|C?yXtMZ-fcxv)WLY_WBYBx1w-PFJ8<5l4dgNs>OL9Z0l zaPvme5ZAf%_S*cPuWuUb*nZoI{riJ-{hZ#GjIbXnYUW*6hZkDdx!C+p%Y$nE#C?#S z{VQ7Jo00zZ=(Gz3-(NhUkx~&#_6&l1;OPLFfRzVV%Dj$Qn-!$UpExYK59-_EA}TGI z7Oh@+Iz`6D8*2I~UPt})q*~E&VbCT@Mxg5Fu(DDVN7SvW!Y^3`z7GmH zdpw%Y!=}v~EFEM-TZ72~0}jAKuesa84sK&N6*?Yyls}0Hpb1P4*LhtLD(N|Zu!@R3r_^F?F7qSA8MfWN=qQhBp05n)X7QBSTj_tPq} z@F{x~qL-@6&oI?YWGk6!xiz+;+uv)vnKt{WQKRHGOis*?dFFr{%k^<31qra2?+Nl+ zClm4%M(!8&PNir5T`MZ~k|YDr1C=4PKmJL9xkDTX9sXrFjL*AX(IeHwt--9SLgz@M z%;&tJ)FUQ;={E^)N-(guAHc?CqnlNIj#mjqw^U(V(zQP@ml-5Kj0Xmc^y2jG<4P-k z1p6`5SdydiUs8~o?DxxR=qu-Z1d5{I+T&lys7`_sSeob(@~ZK(ePR61(IPHE0vYgK zZUu?#g4LO+sHzOmhUKod)Y81AZn3fT?@^`MOHQ_v@|Z~$U*or`)a!d5AR~8C~pv-+Ou6)=#p$@j@jS}oiBJZXl zr1ggT-5|K4Lbx{97`eGQ7UX(D5d>y{L@3KLu9JhfY5#-n#vp_RRk#(z_#NbiqJZ! zeEqxNl-!|Q&?DAKTqc0+Wb(8`KM&&ik#~##9e;+MS>o)QRr%7MfqUc_RdNTi@jWFD zNdOuKpBV2o$WP7<0(n{Yw^Ww4d$l@p@|WrO9dk1HCjZ?SZ6;{Mw_lTLLZcpoq2)f* z@|~$xmmFZNemWvPU82*uKzrrK)ap2X58r6d?n1U?8l{BU4Oej<3kbU;EFRlUh6c+_ zE(XnmlK)22gZ64XBF|+X?HZNFVM2|Y-t)UFd^CPIgz*$FS2)<#XoV0#Y}oU{r3S;; z=1WNyLT6aZMscse{?AulgNc57I#KOsJ5atGl>1_`Q2Z`2!)tnv=fJ$1FU+A>R__<7 zv1Zf$rd%qw9P`L3q6g_z5EkKH^6bQF9FG(B{mob9nd}1#6p%P+8s4zic*NxjPy;u| z*1i?HFjjKx*7FE}t{FdojQyp~fBFo$Pg&yY?dA61>)6#-DpHBAO_g`=2$O}^4r!Mn zqL8h3C^s{4x+1M5@I|7?Yp{ zPUlGGPGL~a1bIz|oER-xtiP(VJxmcYpL_g3`^WnYAY*54#H9nuZcf0`i8)RZhxDdD zy`kUxLC5|kz7&u--}-c1i8mwkKSuYGt^C*7Y^H?o(wj~LF& zi9B14baG82>)x4}eVoFi9T>bWzh)VEc~`g@E4!4ayab`dRYx~LMw zpeYwT2qWdG3GyNj2X|`7SB{rBN>*RoW2(sUz#}zT(f{t4K+iS6Kl8zvX}E7>voip7 zZsK(yLc4K&A|@)(n4IC`3QLj7D<(I;IKZ3(;rCrTHR4Bd-Dtf_HbzubrEMz%=N2|WOM#frxnpgP;bNJLuD z8f7aR?w<)q`2rbr0AGyGbu}{AZz*gm`iMb3FP~|KVyyxU$s6j0KuG7|F55$4m? zb2V+stQJ_0aT}}XWl>AW9rs3y3vl2a;_P+%KNex*e zJG-8!>4z*8pcIRWypIXk%2gM(~Re5LA4CXmbpwfV0*2R7v1@Fjd=76c_mmAT-NDegOR8x^Tb>e zJ71JDi_e!ylh)~q@}k9`D}Z24O+xdyNSNkb0GL0;_^fx`VW^oYbjgDf78X>x^nbrd~>DI2b)|O(e9TQV>)yq@xvYB!Hp&OqgkGwJgZtOq$3;>XV znMWI^dK7YNJF_k&8I?FqSsy}&d~=wcC>j&mK^kq#NOKSKnQ_>^WB|&ZZi#AZhe{Cu=tdNlaZraY`vY^Z$EDj8GsrW z^u$$N`vIk@WIle|IsPq%w(67f&KHPccE0zuS-~0MG=V4t4VG1^=5RV-jUtVs2qZne zK%TQ^$u_ofa@#SYtt)u_*0&`lzSFG#Va7UpS&+VNko^8|eV= zvq{Da44`28BH;Qe3u5NuXmO~pz9YkJe9)uz%ig?ork-B8<8~+1w3ly&aP+-gS`1KM z2Q23Qc;cL1rDYEy$U&YEL`cR;8f`^(v8Y3JliR-)s4aI3x42CYsWzSF=CjnOG7k4% z-sE|X=}rJ%GICz&xDOoVJJO>LGF0ns1`mkk zZRb9-S#vR3YkP-tg{6fYlrJ`yN03lnL)@OqRD1H&($>VMzBGC~grvAWB{%GjJ*S_n zn$(fb++I*kDKXV#^~Yd+!D z=u5P{`8{|&x$Ww4zZ{Q)yQ4hvOS|Z+Q}DL0ZlZhZYqzfR(uauAdGbgA7% zLtD!3^DMJtV7_^)5GH&|1U!9xI^dY@eZ;~PW9diapfT3dOZQo_^WtwrT||>;>pS$y zqN)Mi69}G%=2vA8WF#@u_$Ra5fllP-0^Oiz`VI@|^LMZYDl)j)?ZIaQB9!kH@U|IF z{dbfbBrjtOO)3*&l9{INnifb(_eIcz=U(|{rk!4+NIilI`SS4_zEokH;Ujw-TCGk= zuhvMrk=ibBZzz6RU}cLu$GEuPN7OMZgd60D9~f09f2bF~MBJ38WQ5?Cgs7v9j) zME5okzUE`_kyJ_Y`tc6@TH5RIE%=QY=%|dh3^pUy71m=9Q(B|gmvOcv-*m*nlyKc5rs&Aj%a5#cO%-?yu3;yos#KCZ%@igVnm`s5?-k#*HL#j{@$-dZ!TMn&X;C9@#H?adXNuEhGSZ6SxU_Lo>q!%W&%!#98<6KSWl_r}vp#vUd^hZpVy zRvrX)z=LFfHxdI|*Gl}&^N<{oz;)5SR_giE@Br)ULFwZ~DukPAHaC6Gk5*UPi{gTX zj=UXO!T25-nTnsdLAvv)!=j~i3Tv<snh>5YKp z`<)kgu((LK1dy$3z+QDY##)D(I1#rK{=u+|Y1OVz1aaF_W_R{~{muPc^1*R8xU#_i zTX;lJ_m;#`paTL@6!#x`GC~>vUx(WgneQHP9n1~#{{0*Fuo;bU55outJ$%9W=g2-{ z0<%+cv4B7oC;)QL??VE@`nx&J$H4p4M`oRSDv>C*J^z3C-C4}3tG>k`9u9B|e;%41 z9b|_TZu-ct`tB<&DrhH_9vBv^lPc9471R(daxzMJ9?Xpx(&zj%)f8$ed*0`-DHm^~ zPY35)m)YI0Ph;o7oSB~##5ffMzUH$)oUE9A^fvK|MYbqdP4#nAG(2FJGRjEri~mr* zS8Qx)e&aJ>_8piz57K*?>TQu)4}gQ1@Se5QCKgC26DfoT2R$YS-HcmcfyC(`p|w=w z1M*SJY-81L{}N(hSI|Oa?}ZC7=h>rw=V0PjzieF#eKG!CVKLlSG+cuJb7429DB`Ol z8{x=tn8QkSO0jr*KGyD1tiElUbXg9cGL>B`M?KfGas3y(r|fIi5t2^~ZtYxo}X! ze$u*&p^*njI-XpV{4WVkC1fTIHIg|a$+GcaZu&QV+&6wEMdW}io0*C|`0JgKv_J8e zLkCbTNRhJ#M-)^+>p_7yrjQL$HPG43VKS-rFux`R4)iJO_P^7KilLY2e+ z@Igz6FiojH1sWs9e2U%!y;Ql$I`NKTA$W`RJZm_Emz{M_=hOC7Df^fU5*1$eB##!R zFcq_8^YnOf^t)yLGY88Pje^f8HAoTE@q4fTqbpMec(L;z66pu26G>+b;z_^|C`I!d zF8R~!cbq%oaFySLvu}Y@1*3)+I@5l1J2wP(t>I{hr%s*MrS?KC2ca&nFAk2!Voi&Q zx4yU_BWE7zNahhl&PwL%zMU+JxP_3yW-rDT!+A+r7oQixf--Dn)-?s6#p@TG_2f1v z7{j8x<)|aNn|y zo^}5kz9KIy__G7pgijr(zzU1*X#wvl9&`?Ow11%^1(YZ)|I58 zA7T{Fd;*1tjV){p7)C6zj2(K7kS0NLimBCgoL^q4CWo6fInOeG&E9l40b9Xl?flw} zF)dinQ5?}Jm2H9v&p0-6C=L)#4-Tp4Djq{hdB--_i`%OR-us!;f)V-gvG8QJj(SiD zqVqr0<+xNTgY6ml=vK#gKa!T(_!h2_=O~}VW_7O@9Vg^h5 zW$V-?86o*)lhPv5IZt_`3x48V@X5!7qk~Mv@fpU9piWR>2-k;H4$+q$8G*~!931@C z3s-bw)m-~rc7^asA+=dKF>8Y-@}i^JgF^}ZnUh~DBAfa{no-qizuY*#20Ea3>D^ueUd2#OQPdgGR%J zzI?75i>X|pMhXlD-t`iFL`3ux1^5|mwS46CS&z>c>p%;kM?Rw0DgwHgAQg;+WBS*r z#uEoeI&@wrO7L9jY;!EWlSF3He|8QV!jScnVl6L!@5ts15a&8bX~+0Bpv#vq0v-hvp?VV3IYXo5tFo`xg3(<^*UY1L=hM9k9b-j#6whit zqLr_$shS$;q&DSe?D1A9S2Sheq&tcXb!%l!9vutwJnd)?twl&**OfWO34EC*V>)}y z*xfM;K#&(V&Y3_|2TLGbtn1{UJ-R-(Ke+Mb*1c^{wOQ_<=L;W8ed~c$lIk_WQO?xW zTOl$H3Ta%_Z6l6J^AIdWUU=rN^51)}l^-I;`R8jY$@4o`osQT%7Ho;&q3*zM$oIMx zW3yEvhtw?QwcGHi6{`$0gOqyP@N45>(mok9Y%Jpb(a9PA%T<8%RjT#W!i_$%>>l*) zDOxA9`uo1Dlf&J|O^&g$Y$q3EOKF|;qj}?mg6s*LHC z(~>`hjM!tsM9p4z!w>xJSF4Qa0xU*-TL8&dqyM4V(9tU#?SlmiG`lU|p6c#a3ra)l9k>vE zov(Z5<;m?Hls*hJYSqHMcbl6MK-yTh?Kpte?d7oiWShwFCK(h7dB*8U6x3XE<(*r$ zzDO}+VA~HQ^6(dEIT$7oj!jdjr7v8q5x^EFhG21o5-!$K&fjOPf47UwlxQxUB9G3g z*xi3#hJ=cH;!=^!dB`*K>)m`07*;a5lqvO^Aw-{&X}|8q)@34!J?7cOVaiISReZf3 zbjlhPe6SJb_`Y`O5AOXa7N*wZQg-6A$}ft`uw3Re1}_y6F!u|D?mh00Tgnzj3d2Om zx%o<#!m4SEms8c6_kJIrR~)g)kc@S;(~TBOJCU1ygv^2**#U*B<(@`OpPLhUL8wmY z#Ae1sjv_TbW`)r=AL5$sB_v3bx$r)MMd_et17&%)TO6 zf>zrL{pR