From b2e916d7c9e301df305ddaf4615dfc4f46d34543 Mon Sep 17 00:00:00 2001 From: Michal Maciola Date: Thu, 8 Jul 2021 15:50:21 +0200 Subject: [PATCH] example: PictureJpg.cpp Created an example for testing jpg loading --- src/examples/PictureJpg.cpp | 173 +++++++++++++++++++++++++++++++++++++++++++ src/examples/images/logo.jpg | Bin 0 -> 30853 bytes src/examples/meson.build | 1 + 3 files changed, 174 insertions(+) create mode 100644 src/examples/PictureJpg.cpp create mode 100644 src/examples/images/logo.jpg diff --git a/src/examples/PictureJpg.cpp b/src/examples/PictureJpg.cpp new file mode 100644 index 0000000..3174436 --- /dev/null +++ b/src/examples/PictureJpg.cpp @@ -0,0 +1,173 @@ +/* + * Copyright (c) 2020-2021 Samsung Electronics Co., Ltd. All rights reserved. + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#include "Common.h" +#include + +/************************************************************************/ +/* Drawing Commands */ +/************************************************************************/ + +void tvgDrawCmds(tvg::Canvas* canvas) +{ + if (!canvas) return; + + //Load jpg file from path + for (int i = 0; i < 5; ++i) { + auto picture = tvg::Picture::gen(); + if (picture->load(EXAMPLE_DIR"/logo.jpg") != tvg::Result::Success) { + cout << "JPG is not supported. Did you enable JPG Loader?" << endl; + return; + } + picture->translate(i* 150, i * 150); + picture->rotate(30 * i); + picture->scale(0.25); + if (canvas->push(move(picture)) != tvg::Result::Success) return; + } + + //Open file manually + ifstream file(EXAMPLE_DIR"/logo.jpg"); + if (!file.is_open()) return ; + auto size = sizeof(uint32_t) * (1000*1000); + auto data = (char*)malloc(size); + if (!data) return; + file.read(data, size); + file.close(); + + auto picture = tvg::Picture::gen(); + if (picture->load(data, size, true) != tvg::Result::Success) { + cout << "Couldnt load JPG file from data." << endl; + return; + } + + free(data); + picture->translate(400, 0); + picture->scale(0.4); + canvas->push(move(picture)); +} + + +/************************************************************************/ +/* Sw Engine Test Code */ +/************************************************************************/ + +static unique_ptr swCanvas; + +void tvgSwTest(uint32_t* buffer) +{ + //Create a Canvas + swCanvas = tvg::SwCanvas::gen(); + swCanvas->target(buffer, WIDTH, WIDTH, HEIGHT, tvg::SwCanvas::ARGB8888); + + /* Push the shape into the Canvas drawing list + When this shape is into the canvas list, the shape could update & prepare + internal data asynchronously for coming rendering. + Canvas keeps this shape node unless user call canvas->clear() */ + tvgDrawCmds(swCanvas.get()); +} + +void drawSwView(void* data, Eo* obj) +{ + if (swCanvas->draw() == tvg::Result::Success) { + swCanvas->sync(); + } +} + + +/************************************************************************/ +/* GL Engine Test Code */ +/************************************************************************/ + +static unique_ptr glCanvas; + +void initGLview(Evas_Object *obj) +{ + static constexpr auto BPP = 4; + + //Create a Canvas + glCanvas = tvg::GlCanvas::gen(); + glCanvas->target(nullptr, WIDTH * BPP, WIDTH, HEIGHT); + + /* Push the shape into the Canvas drawing list + When this shape is into the canvas list, the shape could update & prepare + internal data asynchronously for coming rendering. + Canvas keeps this shape node unless user call canvas->clear() */ + tvgDrawCmds(glCanvas.get()); +} + +void drawGLview(Evas_Object *obj) +{ + auto gl = elm_glview_gl_api_get(obj); + gl->glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + gl->glClear(GL_COLOR_BUFFER_BIT); + + if (glCanvas->draw() == tvg::Result::Success) { + glCanvas->sync(); + } +} + + +/************************************************************************/ +/* Main Code */ +/************************************************************************/ + +int main(int argc, char **argv) +{ + tvg::CanvasEngine tvgEngine = tvg::CanvasEngine::Sw; + + if (argc > 1) { + if (!strcmp(argv[1], "gl")) tvgEngine = tvg::CanvasEngine::Gl; + } + + //Initialize ThorVG Engine + if (tvgEngine == tvg::CanvasEngine::Sw) { + cout << "tvg engine: software" << endl; + } else { + cout << "tvg engine: opengl" << endl; + } + + //Threads Count + auto threads = std::thread::hardware_concurrency(); + + //Initialize ThorVG Engine + if (tvg::Initializer::init(tvgEngine, threads) == tvg::Result::Success) { + + elm_init(argc, argv); + + if (tvgEngine == tvg::CanvasEngine::Sw) { + createSwView(); + } else { + createGlView(); + } + + elm_run(); + elm_shutdown(); + + //Terminate ThorVG Engine + tvg::Initializer::term(tvg::CanvasEngine::Sw); + + + } else { + cout << "engine is not supported" << endl; + } + return 0; +} diff --git a/src/examples/images/logo.jpg b/src/examples/images/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..097d608f7d8f04e17824411f22cf9f5e370709c6 GIT binary patch literal 30853 zcmeHw1zZ$c-|#G5(xv1gjUwIMCEXyR0@B?`Bc*gBASs;^f+C;@(j|(7AgLfAAqW!R zQpy!$y-&RF?|bj;?3^>_-*L{FnVp&49oQWMFl8j9B>)fz1ZYD(!0rx!q-tzst1h`a z1c(B#Ffe;7WPyXM@JR6RaB%P_h=>SCXeelCs3@qYr_ix6PoZO>qoQKsV`Aap;^E<; zVGt1F;}T-y;^FQw0l`9O;NX$r;gNAqp`OD1<7M{=fQ1D64)OtE0Weq~SS-+PBR~Rx z02o+^;vnE?K}3Q_K!$?_!9c)-dyr!=2o5X^2yS-}K!b%4V!~nq0H}iei1eTG9}oPY z2gJ0SP*Yj?z_cvy;m0I7S5UCxY+viZfq!B z{RxcyhB}r?&*Z%Fq_YK}c^(2HuM=3xiLLw#LT_A#>KM>Hw7IfRAnZ55Y_-1Lam?$r z4lO|}f2V7C0t+N#M!Q}O>oQ}xRlvPrJf3s{W4{4)h2i?fV7~Mdo_f;0G@Az}u;A$m zGTuy{nn`}RTrxA25o~<|W53}-d*R&~(?S}gIlxW+X4BXStnb~^aE?z-0ry2}YVf}Q=^@>nl{wPe(g`V$Cr7Y#|*$*uV2M`Hp6&l9WoW?((8 zexsPze9dvQsi(_Mm4SDT2;lBAK0*2CJ|rOw`P8|5Q=ONn>Lo|0TVk5lsOFH!f+@cd zd-DnQAP+-Y^8^Nv#UAZ8?EPq^%0r!atK3E&{kFvBjEhJj81@SstW!Xtuf@$@xl?wGJKL;=VY>|nRaY0ehlB|7B)Wz#Gb)~CK5_jxf zqg9bpG=1s7$m7y-yWxJ6&V2_Fnz4A;gDs}>`J-$r}8f)r%*j z{CV#51di%1(yCo6edvD8c&0iJFZokQM#^;TOBH!1vl*G0>R0?@-;06Yh`GNtua^0i zL?6SX`@!({Z~!LyrP87;!b<1JhNj(e&oeF_W}=DVbo|))&fx@g?gi7E*Y~AmRYdnC z4{r2UFF15Lf6wJ_1ReE4uqLsU(1N3-6aBn!W_gG0epqD9=(2e$Rez6Iwc2Y}UCO}tM2 zz2biy>w3iQ4X^LH?Ct+Ekp45zKrzqM|0s9<$)10XQlL6Y`6qk+(tWTz?)zJ#<(J*F z2hU&YJOF`6%)*OG4$&gHbMKxxtjkuvDjnDbs{0?-3uLw=dmT3ar~se3ny;*X0735K zEssk55!Q(|5Rw_5cGO|Be8Na(@(Gk5HXw;==DmnN0KwRI&QreoA=-&Xu`|!C-yF8$ z;5%Gn7CM3Q-)}%N(=2#Ve;^meq^Y2Y7CIe7&OB4kJfy?9=VU@71Qi_&=1ckt>O<6I z)`!wOP>}(c{-tWUOb57d?~@0myP>1=V-GHr_Bz0&kz44MKdk?T8V+2bW-51p1md~w z7-|0-fnZwsiu{R#06@@JZ;@SoMQv}Ry2!4#0y8rP z0DsaSzEp=gBxffNR*z&PuR#KefwQO4Iz*!b-PThm{-B#2WY#uo=e+Jh|KWyjp`~*h za^dDk5S3Xn~8mC*00_c4y8k6TB6@}SFWPu`f7 zRH&%`N%bGO>AyYb9v`Qk$LiT9u^vq}Kho}7+p*|jl+w(oFgnoB=*0-Y=F$3RCzQA^~S z6U&4$2Ky!kLxlW&v{{?b`^(ny30YacoKwGXI_yU7Es{J5_p4=jR$({J7LA{NL&1NI zbPSMp$-4JPjJ7!!OpThdw&rNxoe8r;o5OswRLlYZ$X#sZeb9ww&p+$V33j=0ystO9 znTkY*8d-DSZ9j*oj1y~OGNb=Z_g~at8)r&KyIqKbJ_VXN-+p-aju!+O#BCIt0;Piy zmnAkESqsDxn{U?d%aPa0%7)ezqnf$Vq3{QE01a{P3;DzPKBu2=;J~^4+F}QA5Z82U zI+V(SPs!)?k{{3^KV_?cvKN4mOdZrC4%LxAos|o%eUd79(SZkaFjgJsRX-f^_)Q_g zldPI4bby58VPcxC{~Lk>Fbvj<*({1f)I0ZOHF%*S12AK=Ro`PC;KGe0YF7_HN9R|; zlP%?SfJ;5x`x4sV(d72i9|ezNI<^ej;PK1nDw7|GL#|@0h=Q`8AkR9;90l)ULRKNP z!BbJmV>=3-dB=HkXoHuStn@W_dM0Mj1`qeeY{*gY5?5p|K^wfHY*o6W;PoeJZ$KHm zn+`l_UxQcB`>M14z_Y*E!ZGCbqZ|c~-6-}kl)+;vGIf7`z#Eor;dRGv#QZ%l+s-um zOQ8c=qBvg4>-tdffg{W9H$Ae6$0!!sxrKaNKL2Y%_OX@UhcY1%XC1VU67mmbAT+m# z*!$|a#G+pNR;}_H+Gs@)wL^L8U^3D{Rlvu1;1G=WLvFmXTF|8mNYjK6N9E9yQo|#C zG4+Q#zb;VjNIgAsc!CIPH(ktD`)m9oD78i#NxRTz!UO=H6vt9gM){K2LZ5qziaQQ3I~sXh)KZC0jsDFg287K!ownG z!ePd>PW6KPjEw~OaT^2=vkT1hTb{)iQ_VMo*P*3!@&=R=Fz zom;yA@Pts3*&MKZ6ns+qfop8JVD9df~cH(G*p-#y`iosH*IpMjyRdQC@5 zsQ()=3R2Rc=e{30b0vx+889f-f5`gu-`HashF!YUr@X*jN z)PgW{ySP4q+`%~-l@nN3RrLYp+^CW4@bKjg``4#+V~XzEUQ4TrKne(`Tn1x)TtZ$3 z6RfSB@aRiZcph3z4VhQs0u5GX428eNSKMCQ1^ALX_-VLR{R-if&m<<-@K`y;*?B#+ zqQJtyz`RR=v4L$eqadA+#UwVwKooj3aclihQ zzMpk6aVmY|p1+B)Ubmy5MV++u>C9vL&-vrU!H-E6b^(TyM3>*c&K=1bdBpj>M;^|3 z)Khe<8Ps+>+Xdn-M#Qve&pkfjw|}sXGU$&zp+`z{p0?LMLb_L+MjBahiXAK>0k&02 zc9oB$&`LQdzd<-()~WI$nNsF{nsZo+@Y}^pT}=?g6W~c(8af>BqD(f8ntz! z#R@ZN(Qtj<%#}&EukG2mVPa-#?1b-l4i`TC>a^E+0yIaTo-3S>2m)y(Kn{%)No5cR zV9z21!z?;HNiA2==s}yQa!cwu5y_6QNxv$O-+OT>Ql2d(6ZEZl6A3 zr`6O1%J@r*3EK{evsH^}mF@y%D&R}HlusfPLHv}7>PcVF<6f|~jCX`>^$rEg@++rt z>ZQ>Y#oyY-#cQElqkm>w1J?RbR0KXhv1it2EIE$soEVg@)5vmc_Gx|DOT7}OjH7zh zgIWwk$|W_F&eYUyZbtf5h3;wmN>Ws@DP5IaT@hKahtjM2LZ*iNrI8U{SNgi1UY`OL zMK<)D(@On2C9z8o4MH!kVaMmAG|=N=Ga^w%%l0Mam(mf^KTDP$yEmq!HMfHqy8=NA zIbU|K3_FcU*8JXCPjS3RI+Ea0-O6w^SB3)5OsYrAc9iAl7@G-Eu5jfsS6#1==VQg< z`rpfTtn%D^qVtM&Vd4Gj!F)`m-X{ghN*w5|F;kXcqqqo?qn_P%oAld2q`5`7-h#YL zs({bD7>P5qvR_t| z8S(=Z@xn!p2A)bewX&;)QF!L@`3BE)sOeubtG5LIrqP_=o_MzMM_Otj0Linbq4 z;TUARm$oV40kgR+YsU6MrxTDS4z}{7ao}t23!@;@Lhwxx|jvTNw~=9s^yQl(?La+t}H*`{PvF z+cwdsu~0ONR`x8Tj&8~A9fzL90w8y6LJmL=jzRa1LqRaum{`pEMge%4U47C-%@j!0DIaeF>pl(WWARQL@&pOOJLcs2)q0E|+11 zOP}cb3zPz1Sn zqLC_BtyQx;j^dKuuO6fWHs$R)khFy*uD9m_u=2siUw{qyGI6fR6 zl>Z>9W)L=2{)r$3$Ihnfo`{`kt}VotzDxa<-3$4S0S-FlT%}i^-NHYo`K|EZ1>%#x zA@Jsnq>ZT0qt8|uJE=VsttlKd_mhfHZtJ!jy-F()s0v%(g-pS|)iuaWdvmGcYMvurze!x530{y*a=!?bL!1se*}dhUm7Ml@_CD_( zo#T(tDxRm|QurwbV~Nm;BYj^jqghbX!J(E*U@>Tk`dY+?KHg(|q{1DU*E}YM=gaAb z^7AfUm=(};5VWw&_^}7w>LH(^hzZW1^gJ%R<})Fz&G}N!TGyCCVzVU_ zHB^~O3#lA}T8o$AZqN+h%$DB6av`tWssKVc9j#3*o^DWTC2l;b#oS=iL0c|&ORVeO zU!ZD?Suey_Uhc~v?!6`Uyj(6g4)46g#@vAb69@-wYU5eXt^>h0)Ql7GgA#c{j%Z?N zZ<(f}igl2DB{7W=OMf}5cZ5L(FN_1pRthn(s+0rKzceWX{y^K*LZUfpE=INk!%Kp5-B5n-KQa_sJ%ytNc$l~Fkm`{ki&DQQ%tpX{#`_J;y^Z}yUGt^*{S zYT}f?uU^=W!JhoylN9ti$NbV8rkjl=(w29c<1en?uaT2puLyGy8P_KY{X zYY0TXui|;)2txX#!rrwV5CQ@k3K9b3af0u z4D-_G|Ib~^N!Y8X)M@}?50`>B$84q26&^Q(Da;AX565gK_xp(FYryKsWJo8PR0WGI z-|2`>kTCJSt=B?}H_f|H^8yhTdV>Abe+&Bb@o4OJ_xo2{DP6`=t>%tF+3_@A2F_Hx zHs|;xlhSH3on#cUwpFzdfKfNev7LYI!Js2+r#^;2+pAOBA1aAlvlI;3R^(YFzIf=Y zf44C_%~6otUH`IxAS5tAuEsVxty9N4h~_#kB5M26>bOjdnq??5V|mP2{Vwo&C+(_i zA(b;r!5ww^clu`Ps7;Nc_bzeED9)U(Z;ZO1?0a+CdDDhUCa+2oE>2tKqrT^dT|lvv z>Sg33Lee~+Y;ole)I3H5ftGDV@78w#@=>l)$+``Mjj6w(1e4&JXO3<*b$?V1;hBD) zrBclIaq`O1+-=s(lpkjF-@2p-BuOjh74|gjizoXc_~M+jLuN4o;!f8mR8+=KmBYEZ z$iUE*TjK+9f$la!pIe>My_cdF#qN%sUkj-+f4$IdGCj~SL#C$?W!f@=cFMHDc_7ff zEt^h;c<^DbJBWf7~6Me@hNM1HGE-rf$N($Z=U&#;rF2* zk3+|@xf|5Tr6jSaB``!irUj2J~o_Ix8&vrgw@ zKt8I54oOOPuIfM++X~uJtzg1-=?^v~eV-NJ2RSaA+)r_-6@C^qIauZ-3aeeB$3a2D z^1f9$fZGy*GCAo3@deiAzF-8fpFf7QxFb-iURr=?u=hFOM95 z-{szyQYkm{+JQ{|O1%%tq(c`Rv7CcDZ>NiLf!ei--YTguend<2d&=DQeivB54XA7z z2^JkPTzCeaFI&GFzV_PfdvZDqi@1k>7x4#_E%0U;0h(gkug{8|o zh^pCbI^wRUQ>&fLJwqM1Y-H`VgVRa&;p}G@ z*)7^Q^QFo55$i3Qc+UZe1$ouiwQm9w>~STzgwZgL{M4Alr!;xFT8_(GDUnV;$A&gR zg72Zk>?+NLPQHimQ5{Jb%OSn9;3PRWnlKvLO001_0CBtNxj$^&?Tl3%j8MM&2(1`| znK%uvj0P|jrv?(QVcdy1#c(EL)s3>#prc7CkuNE8BEI>xNyuOjS0^P&lw@2~pMZrh zg#Z2PbQpQp5aRF6Uu#T5!UH`~8MyVr7mMB47ASU{V?~;nPah2`DFyn_&S`fk;>>T%ukXM^4Vh!VH z6zQ`OxKHP3O?==Ay%wXlh$6oe$;M;NPkA1U6K$- znw8#W1=pLa{`A$D;2Wm90A~%*=6#oLy9>*`0Z62ap?un|4Aoe;UFQuA&12C`=ll@z~3wO@9+^G?r*-FH9L zKx2it+=4m05JMpTt1}pVbl^U+P2UO5M>ZS^B-8;pPbbKhV6^y4lQ2Hv4abel^uVAz zWHAYQo$=s8FW;W2$W`g$UcP0tv|7`oe8Ngk8pWA5ThHiwGbkr7-wm);aITMG7mmE_ zfFW4d1!EU4Z?h8rlq;-{FMke^UaSd|PPFqZjN;`d{TMl;4m(@jR7MG>aTYzfC(LbY zZru$LRj9wz|H(H7`P>WSO4@s`xSzN@62*DsnBK51<|MGl3Fo8%Nn-W__&#e52X{y` zwVz+&ggT)Vv|ZOF2?O_S6Z^u@~is?!KpV4d3(N|;`}`{w1?CWW$rQ7U#uj2b75Jac*pSK zlbi&7?ll}t_sgGf;pgEL3CgjA^dQ$6+#uH({{AjXdXym+Zp;0oiNkrt?&}Qm*P7Sa zd+#5Rqm8Md3WjpXN*Ai?Harl@#kafR121IhtL(1YO^ypYQ!kT>8-TruOG}8jg$C;| zS!r?Cy(5Q%=G|6mvuO|hG?N@f0zfk*oD^u@&-4MC=5(4Qx+s5=VL!1U zEH2j@mm%lVnOz4r3xPoJh;WdLNr&&afV>(5td#ZzBp_&jGZa*hh`2?x z_#n}`G0s$lqm8FBLo)3GOSbSG!(<($jPAGumDG;1&cd9Yce3rd-A1pktG_T_rJ7cK z$7+5*-;~W0v@GG4W=XF#c6&zo>Mi|Upu7nwzQ_vhI!_d??guf66?*&Am0JB3XZVp# z`|yjua^7+*WHy;;98bdquj3>wPr1bKpbedy9SkA$t1!7Gr)Mbdd!Wt6dF`ux1PJ4p z5tuN`QM>Lwf-qKR(QQ`6wbA(u9o?1ajCGF6KaCW+&q7 zHw5r&j8CT`hI4vfLBWahGr$!=eagx3)uTHAxo?iJ4ZQbgpBFx9DbZTZqpi9iYOb}% zT@X(az$=6Y2EHWOL|#mM^VKm+HM!DAqk`XT6ZvMqpM=mA`&f*Qh2ejeaeK%!Bx6Nl zWiH9Fk%tbrqt|G|gl=1aK4zvyKAa`0vK)EnI6w5YV35UmSE9F=m+cXNEaV!oS@;cf zh$!Ee9uCxA(if&$_I~DBKl0Gl!-qUQ_1$oQUV)UuY$K#V;JSSqtl?zp>7V`ik2VHx z%UY9mpUxn8c=nSLdR)_Lj9$6i8nJWX z;owzSFvvMl3NB$&I+Y7)qBt}se6BwTy;k#Nf$_ri33=#8v-A%^PqIk-9K-_N6;&k& z)FWtS1=*$6wX$Y&jjk=r>P~{-OZr*J+P$)1+dRJD2wgBoy{g;gOTC)V>5eQ}?Y#I= zoODuyBEml>d`HYhBhYnhWNut#{N6d*64NP!QTVnl*e80t90VmU))!b;cY#Qy8OZ4} zHrbO#0bfgEPUGnvye_K9FFAaqgfIZC7opA#5;**+@QwPld~ZYN0VkfQt+V(xxr}4U z8U_KAHJ=PG4j^dH1?Rlu%b@OWe6u=DRfIHm>xwZET4o@uSBmAah5Zx82hTB&QGx%}cYQHF>Mkq@aX@tqm#HQXr8 zAh1CTvHr&n-Ue|zzwk8-{*Q7Oah=&GO3XQp89zQU>VFnayHd^5Bcz|APfI~SPy)G) z0C+O=F`g#A%u_Z{VA&ZymO?+>Z5!*BrJ9ff&oI_ocrbugt0|1!Dj@FoOQaseuk(IPEurt1{zQq_EV0x7VDbCDhtFEp{#IAva{o-Y{zjb2|TOBb%M%_o2l$Q(7K zOxS*{eWM1`F^4Ed)Fz`_&(oq_S+?7L^ZE|Gu?#pu{kr}eM*cwf^k0Jzbv36m$ zC{^5*v`-Gz{kUf?M0ymV5|7N@^sE~PKG|#*nrXkRINAu{p7k-nY5thtdGrn|$c@4P zfEg)G`Oo@~2mX!+qzpnY{y2G}o>3~F$g6PAttiMX22g)K`|eDhP>XyQ*r0))$1bph zxZQF>N#R{!S>aE(jAMK`p$et%E--obPq;Lat)Eau8gUnB5uB(agN{+4;KB*VMq)t5 zdrz9E7D{M%V0sRpGzB7^az}wCqUHA-b|4|BK4FHG;EwcGiUL%j*@C#=_JkFC>9N6= z0tw4+efsmvSa#t{4*I}> zt>3zE7x-x&>;ffqo{;B4e&@!YC&KS2kHdeS49Bs4SO0lN{EqTC{O4(L9P4-WpXbK! zD38N`o*>7uepml#mOugw{pS~{0zH$RpN<>Q^VkLcNtYjc>z{P_VLt!gNtf^D{-wXB z$;w}Mw|0Ra9Ep6J)WiOY-gxqW;YTfGf29ig#_vbiM^M4PQemGsF!&+yeC3b@WUZR~ zA@sl7NCP>K+FLM=O!~D6l7BUL`PbM-(CE(}^@E(=L8syWiC*+&5~?ivOSFb6p-Mc; zV}0m`%UP)8NS{3lRTyO;?;pfzM-tn8#RxjRAOqc(tJ3@zD?dP|6WIa{B`wF0MFMpC z@Ha*w>`fhI&}p-*(789yR2o3141B`=yky=2l``Qk_b0K+5$Kqo-PdHu;yzT&Bjpd6 z4>>|-Y4X127M1PLDMNIq%xmbBaXeIp1v+Ks50t5b&h1i%%%OC9)S;z+==O)uSt@a; z43z19_$(HtgNDRjz+9a;)y zw*N@tF9abS9N__4zrZ;La{OCvhcerx51B*j_9y%JRX)&}Ox1A^ruWCp`9<=`94ce` z3!G!1Kg#0FI;)}M{}0>$um|o!?oFZEe*p2|uUQWMn*{`5F+-km zQqsQy7815$I{pYTCgf_da&JqbT(42MjcGWfh+<2~?4UMbmELRn5A2ZZ@{_O}FgCbX zMxW3nq^yqIa?wDIHN`8l04Fl>dERw?khCTZ6?=qgrz=ckiM)&%MQ-9wkG@kXx|T;D zcm$Y=oA-D%@3G8;8{=cEqJ<~-8de%bE|aC?ulsc4p@WX!BhhilAMw0HZUUB$zDX@| zwsrQBl<*z0Be5OfY~h)$B9NyvPUs^3a&tTWw*EluTMZ62<)vMW%t9t|0iHUH6enGpR@Np!DPa0K34*_d!8{NEg(p zPcGnqFjes><{vD;8(K1o`1tsQr&ng%qDA}TXan*Y72(2=2jzPmqso&r=V?rMrGK#F zt`-B^AcLU5Ww zGT7Y5DI1mXP3`ZJlj>7xC<(Wh_!;Gxi?M@6OHHt$gHy&C~Cw823B zMC#bzPJx&Kto@-)=n5Dzv>kuE8ZxvAq&}}UF)@}y?a2C9mNZ;5`rh8&p~!MxuvNQt zBFb<~+G|vgYkuA8lZEKdbykR}eX6L89Ysdt-?HIVGl-VqdopSE>n9Qjvh=ATr`fFt zvaSg7-a10-eu`wB6X0+}uT6Lb9S?J226tQ~rhY~)hMA#<<&szLFjQC*ZD7s6w)brJE2#cvYX zZv?F;MO@8Z@R)(Di`HmII{wlnTg}L+g)Q17;Z@T|8r3l$8L@FB6-xj9`cwz~r>LAaX9z zSsWhvF^Vy)G+t3Na`4&A(_XM%Kn0Dl1)LbwCuFL3aQagK{FX{N8#yr_m|_)>@r?!q z(;aUW;#p%^BkjB&^o|F(;4i@Q3f-CpV3u&of1#MlZ-J@Uxa$h`zgQ_RZ^t%Pu?)A_ zop1j|(PeV+o6|vHc`=wr)CO<~{_aW0yNgH37q@Qc-l zBH(iZWLUd^3AsBM2J$C;`$OB_nbO|f#LU7vuMf8v}S%){ImMVI^EjfDk zpde&`Bh!p-^?5)vK%>ymOzZ?}A=Y?dmim%*UUyH}#tgAdGxRGN863G^tYSch4Y^b} zV}inE2*WTNd-AB2EyB76QgURBkCK5fqFY$wK=>{I=j=r(*g)o4+uyx`>`#4Vb!Xlu0J-8^d73^*EtgW}Qx-mX z*HgTK2_IJ#^L?#@lE6suXNBdT2M(Nv*_3WvC5uq@BFv9aHrGae&2#g1ljuj9_p#^B zA~{4MSqP+DwNQs`h-1Mqw_Li{2m0m~yJqX-uv_ZB2$d9dtTI%9+r<)^P3Az!y;N%1WzKaSPEu{98r z*dD1gK_lg|PnJyNEz-A|A|my!cY9q;y(+1$Y7Ek=<|=2&#C$DsYQ3bgd@Q+gajZVyDseF z!8aK7zGs^k3O4fa+G9TFrHSS+(yzrw6Nd9vaM<;wRohpiVvOggf~A;C=k4G3Wy>e? zd@C{yTTkV|!lEdUF3#U@wfgZ_5riC=hYS+FN#n}T_eB4NfVHVb)2U6lbpIlum88$A zNt5YzZ!z>L4A(Ge)J<1p7^lNAUd`Xo)$fIozowjIMbzV@c!7ZVyzpgQgXHJ%R;iy+ zJB3neO_0ys4W`PhBXmQg>7bPG65*kF=lGbG)Gk)IMJkBc;GyY&2e)l#rpOyCbeX4{*e# z5m}wTp=ou4ib8~!9i{>OUCWXd^7R(%KKK+Df8`W$a-&jV+mI{O<<{>q$(R+Z2q(=) zf}czxZAFB2^HCv5-HDFnaQF3{E*t`G`+f1Y=IU~>zKyh*mSd^HS`lr5>qlrEpLe>r zo||kzHNJRl=|hZIph>7@xhRVFMi7Y%AdD^673SoF(BS+zcZ)|Xp(ZalQN%457mnCv z9c)Lf>sD8>^!_K`w~y4~;)_)=IrTF>5vopWQQ*rr6EDiWX0!nETMLWwJ*KY=6|1Df zYu1X6MywURxZ4SEjk;pe))Q8kX-eo@!;o|+rljJVFG$)<P zS!%lTLNopJ935S1(F>u5fDAO@7WfJTJA%&XDCx{obubymCau}AXM%NTGpB5MS@ILf zyU>j@1~XK(l)DJ;ETRF9S`mo$xV8&~x|NblQ|c^fbOPxJJ*c&05inkapgC8=l}@4j z5-Dv7DcSa+{#WI=jQW>09ayl~*+q&4^*Ww4tqLh;bfc`M>W3IS>L5uL^ZyiPszm)P zogb@3&g=6hc|}ZEJY5u5F(1lHr~N-iU8Kv!2AB&d6ECu7&h;VRiVo)>pTKphHV{JA zkSX1~U&@65uDSC9#yNaMDxUBoje^OvdD%6Y&oB8E0@v%@&4{-Zua*nC8GujrQAhdYHLUdLPl zHBTdu!5{;9^XScn zxOM!(!Ah}@9A==&IYQ0H`24y4gjbHOMvNW$d?a>Yj;6&$THRZ4vK(S(i!0KDX^*ei z%~k9Y=DMzeWlQf4zrxqD)~5mTCp3<+h~-x!HJDwQC}=4SCKZDz`-#U<-3W7^6@xKd zZ2do7mqo9?gq<`53x}eIBFSdpBaOf@?iKM&AD&PT>`NGgCBv>DQwBLg-@-<3Yp^ PuUbLgBMCXDdj0