From de36820ef51097b47937b41fb76e4038aaa369cb Mon Sep 17 00:00:00 2001
From: Ali Abdalla
TkD+t>Q>2xkl00M^p! zm1nILt@8=M)VFB1fJz0c8Df`q3;#812+#p{M-7C#;+8PZ}|t(B6U@B@9BlWU>t0IoIUi>z(Ld+r|zCOB5FZ<%osw zhC&xQv<7}d?gH 8D?& ^+i%_{Al`gj}F z(OT}N#j2FKJwsCEEX|G)B|)xZeOL#>pZ-PC86?lD#edPStUh{LVMrj>5y#=+mHknj z%nF$MgnFqEryTg)5J!ti)-n5-*iuv;r^jZqt(lU?-f{k^)48cQeA0e2dgw!i{8@bK z5TX^2=;AayU8zUHbxU7!n)`3O0a9&1>*SBY6YjR`)TEy=?YeBefl;Mx{oH1)3IP>E z@ao5$b ZQ)kISVlrGd^B@mqra*8oSWr0e%KiNwvW7sHao^n`{z$L zZAJj7IH@C%tr{w wqK8%Bdc zgAIY4jCZdqhE7^KVrdUFX-$}#v<<} #r#-8s6(ZZUJ*Ve3q*#s|qlt 4THAWZNPIY@Z4@R(YPj-|^Y-?d zFTPIGsVUL8H!xxytCZ}vFkigd-~@bTv%4ML-vPk(!QmDo9#dB3)d?XI2l3e_^ke3L zgz(iETP^wia1Mh%Jnpu<>vIvxlRl5lhTa|3Emq8!1HJ0fHxmCc6f+h8=05|%!Td{O z|D~{h843;ng2%?8;=;nEmZIUt<3XULmHwBrkp87IAUw=dQpJ_U6Kv=~ptB3@>EgtJ zTMr^lt3aFc3Ae?W>4C9Dlt;8tyo1AM#Y!4y`9ZIcJ3@KPszIML#eNlgNb2L_4U7SG z*NZNz^VdG2S{s`Q0&|8o;u+hfu?~tPI`X*vr(wYl#X)C$cdE;r1Gy7PaslSn%SGhs zzgeBLE7!w4BSR+EBAaLwaP_{0@*CLuF5~=aYDqIwxk2Dqyw4swEt2L$gJpYGKtANc z7)|#q8+lx hOBLgO#X7ob zXL|a$4W*Ma6etWqZd4H+RpKThX=>KBC^Y#-MBjjt*-c!#m@evx_8eR4- 4g~oPb@2_Vx27XSv`)ME*q9g`gxueATb1fn?&B1nd2gz*IA~+=K%@vu-c<5oWC~ zhvJj~@&e^T6BQ1^xD_GYpMi*YE$wcn2+r__Hi-%cG_oq0v>7L|EF*Ne3q6?-t{bUJ z(LhiAjC%cw1XgYZTmDKmkzhrCLR}lM*q72SJRBNamRQcQ#Bcb_F}O8yX!)rKRXh`g z# <|IG$Kf_)G1I7Nvt(rM8J#dL^`D5b5gMFq2fL8H^mj2Sn|T} zK6GthHURB)txDOGDy%+^B@ttNpsXA`TgrDi?tz0u2U%;QBg>mKm4{>U7V?D?+_MdO zejSaf<|rKMW;aCmyen!*$ip^1NM}p*Yp(#!d6*Q&&J4G+V4#+s MV_e zG)U?lkTj0qqRwj-v@P1e=y99%`QbdI>gX!)eth<}0(WqzjpD>xHU3oks*mw2v&`6p zC6QcQv(}#Nl^A{+`}&oPp@@Q!{OWzys#9O0I?bz%he97@ezriBoz$ 3MUwvNg;(+C?4`JjeSUvpMGnnbiXd> za+THmJ~l?4dtx3$?X<99`<2Qf9;$<9_ClmyZ<76S#es2M4Vv;Mf2fh^=L7_ Owy%?)xEYOBq_uNr(B2m=)V=w1F-3>W3Sqy@$R_KQI1fb^i8m z 8TY+Xi%$*yE)9G<-d |nk zXe(k1k q~WfIx&c>qrT&f z% H$VDF7y=r&j<@h`l)c5tTYc8SoPL57 z8IG>=9lZnSG@BLA#>qvP;qaj#?XwhZIN*wCQ2H VYR2k8P<|(WTx}s2RS)=<2d6_)vHlNNuE)pYkPSU zFH5PP+-s-br7`YOX3k>68rJQ{OdXKJ9a9yO5EDKvvBmi| 7o06yAdVV$|X`-yA@=d_7R9*lUK~I z<*gDn+i9vNpjsP>H(~!K?}Pe6cz-3x&^{sC &veS+b-xHUKK`P+nm7o6(H_8Z-0<>Owqhu<_gU5r`=xX4`ceqrPC!(ZZ7>!IUi z1NH%lyEigZzqW5hgMR94*m4d)hh-B#eB+AAsBnB1{BreC_#8HPhsLTA=#y5XMnlSK zjXkMUPx6};tn0=aR+~a k>me#fKr^QedHF4>A+=;^HmpLDQkTsA(LMd+~(CK(xZ)m{w@bXr2vFks|&Mnb-+6 zSOmf8hodWokKrT9C?R|U-G?s!$_5S%GrziCG)Ss1T=`cpg{7JFND2$9(r)?sM}CYS zLHn4{qWW5Sv}Sv0OBh_@G0W;jh0gKAMVC(|S-!qpC@ku#NqSZ!tozem)34@l3+ TSbBc{j1 z&)`*UZG%oJ^be=efc_V!{U4C_zd#LyMTJcX%Y`FF&8=ziKLG6?+mryFLp?c4X{+y> zXIZnrDc9{M4@zIKr$Ai3(d^gvpEI~U)=t2T6~T4MPx7KU97p1-MGNO8V>bCo&M7u~ zG@~EnoGYaChJT~pOc|v6_$$gSvM;bvu&{oXMP%hxO#j~PIlo<(R5np3^Yl^3{v%c# zZ7o(*5s{cM^`*g${9HmDZ&a(YLYy#*xZ(-Kxmj!enkY488Y*OoDnn$IJzh4&T9RQE zA%}JUStvDNtSlqHDi1#>MHj4KsV*X}ISn;+)=_y8%(vI%_~M=Dgp@*r=`RQRCF2;A z^Lbb^h=tWEvGFRV9*kM`%MY4llVbVHAmyKfX#dAS|FP 7aWwY<;hql!!rElgu<7!yOB_q=-aNF zmH~p=n>ABinbL_@CH;;6!JLtB_YR0E=+jF4atFqY!YkB >p8Xt$J7m8n5BHVO`m`%)+!8op7honwFVKA)BdxlK{+*yr zgOh1k20l-(1ts)M!ddzV7kr4J*~VU5g0P?+BpSq*@_fK~&@Dh3lhb27vknx)1`(8L zNnn-9*)}!P6(kPozaen>$(AZ`U=C3iJeVmHnR2jzGOv2-Bv|nF3t2FK{0H`humC_< z7&tgsctp7W_0m6gfvC7(v86Pzs4YBjxWnM2Q%ag}DQP&hEC+Zb7p|?YJj3_?5B5ip zfO(l;)FH)0lGs|9%2&`0+|gapIbG5OGGYZC;=B%vEHT=2(-h6upPg2J1#!v!P?7<4 z5Hp`jw2R>iJK3B5lF-e`WaQdkzk+|Ww$N~3X!g=LI&?7Xcw0K;lGE^f1uf$g&(}RM z^DdTN?I@@(t2 f9L!`%xKM_H0FpO=Ox6We+nj z;AmzfqiI|o^`i)K6(zMx^Y`LZJ7GOTotWh)>0^-iB9B3h7v%yo-GYRrNTrxgmc9m7 zT%nB{m$u2xp#fJshdx slgEXG-L fo_klHP(wJN}$uE>5UP3}8Q-; I~@jn|{n0 wWi z6O;XXb!rR4n194NWfLse^DA4+c(YG7V}qQN6x=+L(Yoro$%NvX$jH3GUz z 61vHY2WIdet!>lEHvPSv5!sJ7l)CT>dSQyT=H3SCgQR7-eCp5a?DY6lSog^? z#^2`>O?U`6H9xiPi`DsI2pV`Zl-_(p51p3`g>mBStNZ |v@|9*X|K$pa+iV)-T z?5z1!P=R#DMC00ilgIiz^Z7`(b^!r)I+S2bZL7<8c+LipQa|}Pru|0H{BT%u9&Gyu zmB;g&p&@Ftmj!qJv1ZFeBgzy~T%`Jr>=-JpWzEMLW}oL&oPJ)eN1`nci=Tpv0t zwP3@9P2~cZ(plR1r!Bs0bVBE(Q^6pd0&wh$s)Cl1>@&V-$XF~b)qOs{MNDgRjI1O* ze1}~9?G{2Br)&Oom0TN}d*TQ}8iEGm R^#igqmP7qsLm{e&Gs@h8}a#z=o zBfg;_7+}Iz$7i9rz_&}Tn{BUQJyZc6SfqnneThlz@hm28PS6pWkE1Q!m~?VxVf>>e z&- Pk5VIZ_&L^^-Z^U^%mWsbpTN4!7xL>WyHOD$%JLp6PNy zsK!qn)by&lG81vsN?pd{C~XVW+(|zI^{dtWg}R2ZQMi+Nh-hk=YsW{&c2VFSRD)1I zYw09^R8WF!Obz!yNHGyt>rSOgl)0HgV8Qy)$BcISWJGN~rQf#Q;7;vTlg=-D=qifl zj&d45y3qiBiM>`Njg)m?VE}1i~tr%lgR0 yXFQMaeComg?&eUGO(BBH=Dro7YxFlQ92Yh#%x{ z!(EMI)FL(#@PUE+&eD)}CA=--DLsvLte*NQG%`;Go6YwPUPE;=qhkWK;vK+Z)qrB6 z*dEsm^F{6_m7;)JiifusBF7N?pszL $zuiXNom6 zdr)Q@r+76wi)YsQ!$wwevu@Fco22H*JE?|-7gpUw2W`<@N@qm8L}!AZau7Hm17s+@ z_Bh|bAWCS{KhG2Wx>~mPlHt-* usx~EHtyrnLAx+Hzn z4CvTzPl$`=rPe*cLjQXb#y9LUAvg9#Pa2p2Vf5l6-s?>l`^|8#{ivC GXy;Pti>;NfqiW ^4Sz;Q=UFtTIQR2ssPa52bB}VeQ?|^jT_2rWO z1+>e>&lzeOgl?1Mk{ CQKLU6Wn2U!B(U4?ZD1-FDu*2$^qM*0C4K31=~6@eEnQ_ z9~|@C-@raOk+oo)#|`bD-ddt91R6jpm_>j?=?nE*M$BF`L_HdB-_b&i*0Irp>#>Kv z-|Z%mW;&G-(d?>;b6pX`&$~dMj|s07!YVp;r#u%YA26)(nex2oX-#OITIE)2orAp@ zwwfwnp%s^;@QG$$@3W>2zhUkN7yPX_p`23i)yh7M}Bf=uZVO*1eB z)<>G 85 gIZP{fy9$9g-DZSuuyiZMDw{bP=XAiJ z+m^73zPSLVQcf>yjeGNuQ&51Hm|amjZmn)nt}v_gRtooPoSQ7WQ?pl|+5l3&)d!6( zOL$txJjZPmn#T{2-X%nvf sH?zT_h);|r2cCbk|m z+$TUAC-6D@S3`9n8P&lVN;ei3@EuFuD>b3|ic$9`To#%JX3zYM(^}fUvNoXaH5@%P z=p3lF!_u@n&BERbd`$t9N1!!DsqqfH1w`Gw)|8mGFZy9RGScO$rR+NLuH{wZQE+kz zI`#rOVo%kYDD~;IrwL3wRk!F1Fzn7>DsrRH8JOm)n|tY;D^5b4zE|fjuGn16l(QR> z_?Z0zs0{z9(Lh*Oxc^_(4EPV9N@-engr#7WG+hlW>|Im-UnyFGDh$a}HKwG_G%}n8 z4XGTWo8YvfBf=nPsh86zP1;K)UQm9ujua#;#;XxY{niDJx5S*a{M5)yQlNA!c~uEM zwd106-W!t%R;KZEn0v8SSM=$V62W0rGP|=PX;8YO{8JXl_=)pnG! Xq6V0#9J{X)s>dINyVH|)8mxx zH8yYNJK6KO^pDXW`(h`SeO7NCI98YCCL<~K=541#9<*MkiH$4{!o}&BQbs~c!2-KS z`%9LBdr= @uRam?S*(qMyleF*V)*>JCyc1cS{fyna8a z&wNn%dlPgROvSiH+fRz-Q+yLXRh(+jo1F|Il#=}6r~J~1O_fURSXs5>nCa{Z{4&u& z77ITkKv}@8#B?qq$T6PglQUtk4|m}X-!BxyquXmV6eQiIto@B706!`ONH2K7qHozu zx65e@aMJ{ChyReR)y{Uu53itNv~U#``Ynt(!7iUoi_Cq-V5}D*i=Rkgor9PRDZsK; zO|o#Y*~R;5#fOv|YpqL`S29?jh+-5=r0gU=ibm2%Z+aD|V6F%b&HjbZc4H3TnK}vh z)X$r(NtadZV-+lZI1W9;P!AhU(YgvA#pbCpBm_-qFca8^n7$!mv{wubo+xq2DFpRK zswb2w66(6Cpp81PTDK>1|5M>2%_88TsK7F&b2k&hF{X3H@RCGJCJouxZ0|834pQ;_ zXS9=W6wOGy&A(Z{S5I&(7+HBk%c#!n>1RR=dF5d(-oDCq<+{->N@lN;{|$)J9**^! zlE)Pgbsk5FYMN`psW#Ykl)gah1)i}Lt2wyFNqV2q$km2(E+=wc5mdDL{dog^w3WVa zplA}iAvr*pB2oHb{giwfN=5!1F;)k2xMZg-B|d`SQ3BR2?17sOf(3o-zQ7k@6z;*U z|A6uRAoz|1%fAT7wk&|>o?fLoo&r?bonJKJW41>9^F!emZVrgQ&6v5hH@c ylJ z-BjTKlXrBz-25XtB9E5-r`EA>0ucNw7{c!KEE1oK?437evD8hv(d^HX3;m#)`W^k+ zRaxhU;t6;c9BhR|--|dE&828@h$c0)U|3=u6!Ve+yT?n(mYfWJkZ<%0zx)%M&+$9X z6OXP+evF~C--I?}+B%GC;~fAnLjeo%HU3Z^=BMk7r`BMEOQ0JkCXWk^q%0p9yyN;a z&j%xXHpxQB>vrOzGO-9R{kKuxN{})Ki(Rt{DKRv1-3Fu3hKV|fE>jdqZF!^<-kU(n zh@kD;W*~GgZ-B@}dIao}Mh;|>X6VM>gYDm;(wWnoV y@N+`9M9jsD3;&S=?+`W3|yOyd7yFYx^KibCU*dXcwYs!xC$` zIrJiq+$NLO^;IT&{WC&6Y$Go^T|@)g7NtS?1l;Z9))`cm3~dV*wHOw!tV&n;lvZ8P z>St9i*
)^~axOOBC-K(^q*Ji<9fLv9d=ID6%4PWFkwp nI|lr z&a6VEJJ7b= 6Z-#j?Nb4?9pkEAx9v)Vr`Q;KhAOEx9o>Ra->VWSi~je1>}P z#{3+6V9wsO7V5ZQ0Te_lL?L5c>?4j>5J13LyNHtZ?EZvUOgt-0Dtv97Bi@oHB=kTP z+c4yr@}-Y%JKW>TdU86$?1YzpjG|9;D)9i`yVJe4T ;>{9~R~Uv184i4ntdQA!*(!;(ayg07I=qeNewfdnq1$SVVUpD7 zE`Ibti^kp3(TqfHwl-M@rLrhGBrx}3B+iD?iPqb2y48(%T2twyZw}?*IW_S^6{}pd zZ2SwzrJtKvxz&^Z3y_~5F0mwk(n_j^RE6q#uN!@szU)jm+gcXEg}x2miDYamYsuIS zZElfGB*r#PsF^llZa(M=VR*)Yw#jI|X|vLU@6!d|MkE>Ecf@QdXhMrjDpjFuG@13L zOPAo+)<0yTc*W`R(bx|!ao9A%?c}AVhye!b3iYL`JdY7(m*k2c$O(fOsr9<3QF!3D zSFbwg17v%N$E1wcklZt6`$cE}lDlKdeTXn2L$ov*or_8iA6r4{%wY8tJWzrfZk|}G zdP*RAy;3Q1t@8XTS;9(pE=5l+fhTWh7UWFXl7)w1$foLwbRCzUY^+eF!q%7^(piV5 zN_|c?AkVGko^TJ|qh}JWE)hir=QY~>+)U+eNYN1px9O9Ve+s>tYw%DSZq77ab=> F}}oc%HeoM0Uk(F*&o=9OXl(@giRsB#R%I + zdf&1cABn(0TIB-x3~{Sd!mStIHHDk~v}?asLM;BlV^1q`+#YFCAabn^hu0fRKNpiO zOCy~|Eed{G)whwCZ*sBVNWzj=>m4v3&&Z>(d_`1O;%FgUx)8-C0;SSM2}UAh64aYp z{l(5ym6gqu9BMcEND5-U?Y!6KuKcu9r>tUN6~2r>FYyP^ZkTjYTyhOl5nf7UAKPQA z5B1TSLR1`g*3V8q@^SLiWaen`j%)d9Z7d5`#5`3BJ0h*M=>!eTZAF8a2oRxKe@WbD ze5F$Y_X@%Rt=od#cykGF*la6{GMU6I}5St0o~xX$ >*R8ho&ocD$Z4;&cbgu^Qjw%x`2uOM+AjHC~M z^7N{oa1Rs80sp<)>+;-wG$Cn&F6YUj+4KN6tDoSJhH7a+B1{WwqlWu;=fqd3x9|xE zsW|o{tC2s4{YB&0=J;U_vc@G}l#I|5sPM>@5Ky9trIA0tGE)x{lSqw}PI&aq!%`SU zZ0daMMw5%uu9T+N &-^lTVnDn=|gb~U=fAdv)e=)Ex_>6 zOi{)JSc`P680*3hDcGx47S_uR$bbQrR5+#yQwUQvH=4@w@oTWE$)!1*2cSHkvw&JM zBdWF5BQj4;KKgN2 1dIsu65Q zD%x65(IMcP$Q5w%JYrps&3p4wK3ZF`pd)d~?S`WbBbPqS%v;G~W0%v73QjxFSgEn( zHq9y7#^KWSD6~i~*GDju73!aVr~RI?I)eNrW&UP_vUGfPSs3AB57Bwak&)uj`9s+c zZd-D$(z3GGBYvj+;EBei;tzV7G%$j24Dy=BhlkZLrda?x@z^6WiaY2Kl23#u6iN(b z0Ens|TW)bxKDvGc(e|0MwT;p}5z0?kq~i|i$j@g)?%BeGP{%4E%HvI`jL*~MD-q%< zE9zd8AJNKC(w>J|!MgjbsfXtvGLHy$gNtj|T;-x1#QJM@I2Cu}7f3$)hmGGv`;!mP zX*g 9Z13WPiwo6_9+EK}xmvpncvg5vR;c z?ru3p{$e5THjgGG3r1HYyvKi~)ou}}z Bq*(G zkqJLR7%w%>`f9u;J-xmv&1KmA9QD;~6=%TjC!p`Jbjfz<=cjEN{2h{VC|*zDMEc zt3!!#F7WW~8MI4{ack~~;xKCknGkoQ>)UM59|@dGZE>3bw(dl}re?Xn%OQJ33AgfA zH=Q+L?LWUKLN;au8b7{7X6;Pgt-N9O9{Yc(ZZ6x}sPN4*d%I|Sv9s6x#@UkV2V`O1 zMD4Ld-^N__{(=IzMPA8J3CH1dwakwxG}0Qk2yXw#7%AvqTjT%Q|1GEh{*f`Pe{Af37}$Tc zCahqPbHC#1rUd_8k>Kwf{vibZ!^%vI7mab>>8^X>hricp68!RK-rkw!3ZI%fmlx-q z=VdO~op>loto;4*Z1+t(pcU6Q!)i$$2;IJ`_dt%Uhwcb|!t H2q^dcW~Bjun}GFTFQpnN4^`x!+fLPRlhqrOpOHu$PK&9 zQNep~t KM2l$WiG6T3EXO81|H7|37e+FChH>7ysPR5tBuV1nOgyH2Q Nfd9n`vNh$;TQ2(BfHMp6) k|WV+ApegekS>-};xw@2yRnhlNIGH;UA+G{kr5z&`cS58no2Y!ZKO6d4o?vl`5eQKbgyvV6^N zIn|i>R{-hH#Ex2Nr$|l24zUx^%5qz?hVL7 P#f69egvv7EOf>W!z40oDT`&GqRgp&d!v0PWyjo~bCi`8&l+P$+=S!QL zQxmox04hirC%|Z#Orci?q|zK@7%GIIeh5Q;mf?4|SWc@nY(2v|do*aHMP13mSaqBs zMpvnXU>aj%DTk_o|2v=w5NoR;rd||G8s-NsCJ$r~zqZH+au#Rp*B*?ra4A!9^^Lt= zG618#^pidu1G&U15~-U)<%Ie{?||vJI-*f5Z3tFk$OE>ap+9RSF9Y(~J0O%P)6@76 z62z_IKSOAnjlbQ@hLL8Ma*Wi@6^VMUcxiBJCq*+tKU?&dEXSCvT#3AanMktaWmk<( zKK+zT}4_(0FRL}ZC>Kk2M~{!ecx4tbN_p5&>s&cJEip^(Lz_gii-$5h?qs7)x}{rOIA!y zSr@%46hgd9W3VOZnq0^f-R%&}_qZGqN`o}8=SRE)BEyX#vNXsf{Uj5H1Qlk6lyKKc zThP7SM(KK|n6;$AR9u-r`P%G=V{)aVHLAMd-bg*d>uRh5Rf^#6P543Bn2n#@NOzOw zt#_}}lC?;iW?O@2=}@F_E#e-NdK5~l%Q6)Iek-dBiAz)%$0FN#j91}R#wM_%u5I2w z>ZeoL59tYGA|#-;_!LR6=ER8Q((?i43WPh;yilnMpqKVM(6 X^x2TIQdig;Q z{jy)TH7pP+#;>sYH9&ZR%iW0r{N_m|6@>sA=Gfti{93HrxI+I9kl>^sLwh>tdKf?u z(h>Wx<*|qgCrRTqs2M5@h%@gTq6FD?IAG?l0*i>|t{(m8e4=P{zp89M+v> z#CLVqG<@C6R;Ew5s%>~3B%OAnq=>!)+tAMSoGY~%6faC9KMOB6tBYw(6JsHHh53MP zZez%%lP6l7bNC6^z{tyjvRiN%HeO#LbWg`;2w9U+W;HL*gG@b!rDwXG$Ta!{ILF(v z<6Q7#Jvd0T8o5rXD+e^2thdN44@s-FMM b zM@8-NfgxE1`{-PTF6(c1u>vB-pD)p8RKm4a$niQneILgiaN-6uv;;@+HKS@0(W+c7 z(Rs7g(Xz++2WkfdMm??QJQcZT%)h|(RNPWWo08LPE31~$>f^ma?-g?_Fvhb*S7vqS zW`7}$>;Z0ZZehu@-N7QmMw%FQ4-Z2)R8)qY(;92Dtk FwIv`sWs4ISZ&+~E%$p8jz~e*+wZ5N2!Dpkd;XfFCFp z*>yCiFGOB@G` ^9OIUMHwl`U^AWcrVJykv!RTfo z;L40ExDNj@h3z4m$(g$?_GcWPGnjh&nu0z|LsZVRbG-VqVR*q@2t_`2^^$TB^E)6{ zV2Cg-&N=$>@A1FJYdQInGDt*-h4QZR=xnnb{Tb(3rW>VI@Krs!m7$wQA~UrYvSx?D zEWW0Pg1SNZIJFZt$^M7CaMV#7c_c^+$HN&Y#GR!(3)}KuLu}_^>d+_>?w8o-hyFXV zaLQQEPj_NnIOMX!NHa<{y|UjZ%UjAOX%Jk%F+MmL9r}q9!<1V-U1(yU`J74xE~6Oz z=l+v07{>#*i~J+WR3`l&8MoJ9L5rI3(t@1sLXhFVMllKf6ff2srC&!4m-?wC6D_nv zTeCS7!0-XiNk&slA37n~@!LrH>r@;OcRevsyvxC7Ya6t*_`z2969%?;xH(>F2|?tH zZoESJ!o&zucVnhus=xY>4Bm+Ive>B^IHm0D(WpGiVdah=ZXvT Bh>JJAJwR!B5w@NvEns2nP^cxNr&^ z;)Q>ghWHiMQP8QGiS>P2u5D6q-gPv6EFv^$_oo=4Ujr+|oOHe+pFcYof{LBTW9qs? zSR)U) C4@ckKH&QQFy>UaL8 z#}mTsyxyfR4d@n{e)@YrO3flE>wbgX3%AW}CRYOE$ch`Zk6jL9FHN%P&~25HAqR*` z@24Fr+SbNON0Q8C9CUFr${bu*|D*D4WtNp|QfUEaIl}B|ns2vc(bVZ78;`MCFYoO5 zJReQ737MsAg7{%{ynNC`@TH+^5ceq7#sf)gT3v|F38dIJs)&$!bd?ZWIZIE9N;saL z;}(NBl;G&`;T-@QISPj$nf=*A6jzYitcRy{khUZKX_)eW;S)VbVI`PuGx z`vYUqqv)s8N$J)Z>6KXt+f1ou-*56@`TE8;CQyal`a=UmfhpYIt{bLy8n)u2oXcMN z%EP{u=-HTr!}sq8N9oS=7(y`kWR{UixNB_rCq-73N;FpR5S=$qYXZqzlYo3WXmJL; zDaBx?DfayK*eRqzHR1f2uuNNXBGe+Op-yhRU;_+7HaR+Ezy)#?HfmI9|5*kRy#tP9 z=}}b^?fE;^;&%Kzr9TY|5f5}~KcCU6P@++^<(ZC{`UYC^5tfYfZG@%*x@ixCs)9R{ zVT+{(%qAX2>9J)rL)Ma
g(% BF{3Pm$AkN;kI#?9&i$ZPL8{WeNA Ok!M$&Ny=tKodsUg zZL|Jn@{h!6vbyj|U2PUcfb#JKkBW~iESla)Jck-08y(S{!E0dy{-xoaQ3RWs#Oo3N zLI!#%!mvt8#QdaL&OtrenJ=veOMk(v;(C5}5I2D)uzKvB#0F!a)3(O=h39o-AA(NI zriUO*WKJ*Pz4Au{)gPG}6@i@qS7j6vx25lB5H0)_c~3H=*E0;S=t-2zs^=* FHO6QRQPMSF@c_<3lAbgg%OixcTDM?om>Wjj6HgWTXj#j}wo2 zhyL=&UIx(XtOUmOT!CT1M4OGiyM#YC9Gdy&^W&leF^geBs;}z25rINIKor7c{+8rs z0{w95g{I{X6^96O94~L41&bmf+uSy}a`=%uoo`<11UkEkgpu^Bmu~xWV+N8Pu1!p3 z&kqBsIA~i#4|SSMGAi7HPes+oNPfkl+H<1>rMyTaI-ggn1EtED2snN}KvEE>;A`Rf zq(skHaU&@06W*?qm%{Rjoy`1j_bC(D6CU5LvF_32!)c+1YMG>)duU}YZ`^vB{W{iT z<(gnf_Mn;t{=ND3XQzDFdSdmDDSwXH1MG?B9nuy0P1%f9P%_}QvKJW7t;1mIn>8`& zbX1{ayJYrkjqd>CVpFYw4~J%TIC$||FP$5Q7A$>9TNXn0asuywM3oH`lJht5P31!? ze8S7Wvv|&v`U!yxeL+ybz!xu+7v!5g$IdVKA_2`}R*S>Mv;ZA&xIP*egAmjd?(9@ess|8r}?b|A{^( F)e$;SB y5F03j@)NW^|@#l=9B*OIA+Nl?YX><6-aBT3lWK*KOwFQB9 z9O9*)D|_nNkwlLjmFecUznTeh=BI`4fO_Ukx{B&RoO)VSy64~=nYMga0lieOhoNd8 zSTX*j{KCLRyF>FTV)0?67wa$zBskB!LHz54hK*y8XNG+dkvg>61A6>AnttA&Hxffa zGkE=R9A cyI|SR0gEwb=~&v$KD8LW%zF^hEOGn zzP q+P`^*JcUmcCBBXnATzoD_TtPXJc{S?BM&c?b)2yf_(?_ zfuHFpAdVnLg6#uT7<`boXg3QI9o0nh!=+y+G6{h%!%zqX6}2WVxlWjk*%()pjpMi; zM(%A2O?9L~w>wxLMfrloAK8H^oa- {?Gyyh!N}e|3FlN0IE(KhaCo?hYxdn3UUe2eB&2R*9xnYgaDQDmJ2c;P zThOkB T6ZXKt7{Lov?+EggT5lMzj7?vEdWREYh*Df0SJ_AF*Po9mk~jAJ z4#<(;(FlaQHY82-#G6hs{+I^qg)U4p&crh7dPUt7DVf%B9hr=phVOv3rx$_QIiS!L z5)nb`i$i%}A18VBH(bwD%T{Q(r`;ahWpsv)P8aFhgt`6ngHVa}*e4>fiPu+)+7h9Oe@1 MB>xL+i{RuUi$)V=Re?QIcO8`vAtMW6F<4 zIV@nd>}~CDl{13XF_PBE1%-s{So%2e24Wii4<>J`2iwrB?7>vtXc6`%R2+jUluVJR z`pfFYpJK(5gYK(KIv(Ex_W*ZTu?n a#V@qxu}EA}|U-VPkn-OZtubGl{|Ijj&XM9zJsX)hn4QRJzDn z^s4h!qZnq)JNMG9r#LoYcutr2L!C{uMQabe$UC4jgSi<=JVfA(9wllZL{KKvkj!nx z)ZJ9W-G5oYTc$kvttr!cc}JWX_IVhcbx0KyY#k>&WGxkcfiY-#BmxnzScTOp2BYVn za-D*(Y|@rR-mYQPLE-Whto3!^WAr*LBsn#xj%qzVN{3*Q_@9+XYee2F*n0bS09TGu zZ)}Z3(Le@D3ct^bU;s!9`(ulT7{vU;x+G`Z!O!z;_2J?sVrr9sfL o+y=F_v7Wr!Q=X5 PefA4&gn@tT%J`=mdkmjA|^G{ zZ7Q6f%-GGhM>m!w2Tc%V>4plQ3G}W%Rqeph=X)oFQBIS1sfqet?QEG75kR~73%PN7 z+v@)l^acz0E!*PhX$-c^#~mq-@?c porN`9+vK^n<;vfq_Bj z1-Wb8T;DLbKuabkYH%)z6JnE?o7qmJz{Do%x~W6MXWVANtweD;tnENJX-uFZ;!%TH znTAk-j9DYYpo~j;(=*nmCZ3%jtkFD`1~ZzP)Lj05&zNEbR03n8d`#?!aR#jl>!^M@ z;~zt12O5Rc{{VR;ui6ll8t@Lk%!Ap|AbyKJ^_(Y2-oTAS6FqvueMDhEh%q-`Jk*$S zFxG4F1kXgV&M^M~0l^?5r2;2%ZzO;M)FE*{pUzpI4_}Yn<42v&hS>QWq0)(+-r@c~ z?g>t3z$|y?`y(lG3n-r5&zOjrdBQ&`m|q3LNT+|CYJqT(S()O<`TSoXXlBS)Kj! zjcSrXO6cK`-EIROkjP3HP^=dXm2rwo&dV{mw8!+~A;onQ8<&lKGry1+F51+5`pAV+ zBW%cM2XegJB&bTVzWn{&7)oM5iD0zLZ1V(;lhsfN(j+v*8|7mTP%4DYm=Q@NG&Q|B zX2}2#9o%9zJl#a%lFU*7)1zopbG_q4lKDxITeDpw1sLxlbf6d*bTaWeFeQ^jQ6n;o z6}Ow*VoCy0Skx(o0e?7}qs=()u4DSDh>{E>#VmPsRPVfzGGcIaPY0>+Zlo;{NhG5| zL?P;A<>9zhBYBIkPg9pDD!a{v*gGO-cZV7%w>0L##d`TlDwvsLC9s{**BM`u?mmBC z<_y`5T+KerwNObA&tuEt8^}pY2^OnuamGwJ09$T3UM}V^S5~A2m{>zGja*HOD2ggE zsPp6h05K#NiCwleCCiMF0Lc edQ!q(tDS_rz2w1` zHs4n2c;LvS%ppnASNJ_%oKOwpw6hRB>B7gfhyw(}D2a(Yy24UK5mHAIU2oOn!cG=c z-klQB<<|)h6v&aaje&YrBTx+45GLqCI0TxV%{f$VO-#i?=(Te}7=CP|5n@R)Z>~pK zQ2d|_4(>na-U}v>w6WnoAI?DV!qMON>RGCC)07gYufH;Rd}Fh^fXQUeJlR=fi*!!E z1BF7ML;(Q&NArnKAiqBF)AYRzzk$n@QeC?+#{z$t+Dfq}dq&$%BU8KrhE!IB)OzFn z!|zC_Wk*Cmy3X{&Yz9StEb%yqLt3UUPM&KdZkR)NN-676jKWBiiFN#ap9$BjgdCM^ zp5GTnL?=;1$dc+}DkJJvSi7vtV8L-%GnZ79cU(;M{o)}E=tL)G_0F}6Ich=jiTCcX zQ0!_{lgV(-C|GQSo+5Sg_<5eI0t~VvCCnNx+nSCC!!yg_)7Ix1p&^*Dz)4BFF-fM7 zU2YkA{k$C)76XRkcRnLGu1X>?=1tF|0Ewp2Ato6LE;)FU3&eIQpA!HV964m1DCs05 z-oAHP629!C1Wv_5`tgB4S%@=|M*KhfkZXv7LvgEze~g?uY*?miS{8g_3T9#~NS*Wb zhNmWkNR^&A-!Iia3W|yU0F#$+MPc(2^Y_f)I`CAKMw`^gd}Tq|kvR59>&7*hGKJCz zKeTU{wGf#%=TR{~TEra{yCJ UPS* n@j+OA`oi!bE=?#gr`qta(c(d)pXrI3oxrmLhIB;XGhrIaa%^v%jh16%jL4T>k*& z@$-QJ5ot&=O~V}gIeOVLkeWy-LU-pX*H{HXBj!koK(7o(@znxHxLtAM(?+UnOCW}l z8S~su^^7L$jS_uDe%>lh*=R_)HT-zS9^D2A#7c4NB1NGBN=CKc;1z~hp<69LSBO4x zL53n=yHS{y^h8evCyr)p)+)Ewzwk!|q|>R>w$f@189m+1D1+sW_kHDd>`1*Y5ps%R zlPtYnNclmba|f kCO- XW@0xO9xwB(t-OQ@=H 7eH`7F zyGvD-D gpt~Dxvm|_dmY>wEySvv;qM6 z$FfNO|33bIdjCIqaAx)nW&i*P+F!eknYpX!UmW-sTbbFL{bN7*2Yb3Xxd8y6N`En$ z%ijt9#ec^DXeR%~UjJar|KiyH_^7Ff{`DyU0HEM3|AS#_{=p{y!6+U7U{fm>djJ4u z_^&^isguj!_&ERMBL43j{vrSX>7VBzvNU%vcQJM|HzWFw@&D%Sf6E2#`gigFZ^r)L zWBq@X=bydv-@Nzy|Jf5D7#aU#b4&pMxUK*IVB-JS$Z`Py#1H_Wt@nRyCZzyCdm;dU zwQcI|;_=^jVE;7W02lxw01bc*AOMg8r~vc;762!J7a#->2gm>v0crqkfC0c1Uet;lAI3Na)2uKBF0rCMQfJ#6epb5|p=mrb`MgdcRpMYh+FTgI~5O5B-0XzZT zKtMnsLEu49L9jsxLC8U9L0CYzKm|-a z)eE%%bqw_ejRZ{&%>%6nZ3gWPod8_|-32`deF*&qgA79n!w;hdV*?WelL1o)GXk>- za}Ns(O9IOcs|;%m8wi^L+W -h;l20mPudkjAjXNWf^q zSi$&%iH|9aX^t6%S% M;XTx zCl6-?=K>cEmlxL*HyXDIcLNU;j|NW#&lj&4ZyN6rp8#JH-w8hxe+d7A0E0k?z=j}& zpqJp35S37X(3&uXu#fPJ2%Sin$c`w3Xqf1R7>`(r*qykLc$WB$gpx#^B$%Y0WQ!Dr zl#A4YG=+4K^oER(OrFe-teR|t9GaYq+=@J%e2n~=f|5d$B7&lw;)D{5Qkv3-vYK*} z3Z6=k%9*N&YKa wY)Ogku(@fUf)ne50*P7DC(YDs^(1Fy^&?(b-)D_oF)jiZ> z*9+HM(Wlh+(w{KEF|ae}F+?;pHf%NmH_|k!GI}>wG%hlJG?6yRF}X1nHBC1?Hxn{T zF*`NqH%~S{w&1r&wm7lmxBPB-Y9(luW_4jLYMo_$Ya?ZoZ}V)cXj^XkWv6LZZx3Z} zWZ&t4;$Z7A>`36~ lE&^>&)Yv>U`rO>r& qy<$dfU;Zy1h=4 |gi| }DrnP8^i U}>TrZ`m+;jH-iZ82ut@93*(lbi%&5<3 zv*^hfrkJ#t_gK@|$vEb?jJU6Oi}=|Dj)c5Kh(w3Pl_bHWie%(upXB}T^55H1h*F|c z9#RccC(_u`^3!3`-P3n7 vQmOqH>;d&2ks=g!1b0@$+Ny z{}fmktQATYwiQtnr4>UIdlVm)Xq1eVa+Ow=;grRceUv+t?^dW(3|DeiR#xFvB~*h} zyH}sq=+*qJ6|3#2qpvHh$Ec5K05rHaoHZIXt~ALu4K{N%*R_zh u_t@{$e=%S=us>)x_-jaO zXlYn^cy>f~WPDU&bZAU?tZ$ruynBLYqH~gKvVDqUs%@Hmx^;$qrgfHMwr!4cuHz^7 zrmC`Q8P=g@Hw}#nC0{rKx3w<@pu$m9 k^+(sI?C0i}{nyvOT;N|W@Glqmmka#M1^(p%|8jwUxxl}=z`we{ zzq-J`y1>7>z`we{zq-Kxk9C3n)N%f@0pLH3pm-GkQ1b-< u-Gr0B~?5GIezFcCog!a-$=1cQq%na4|Qx^9I2Dt&tJQi30#kQ-E9$n!mLR5CMCd z1o0A*LTtP;fDpuRV?8xZJW0f<;2GDe S=p3B1Rug%Z3H%Kqqsktk^)i=cp_=CBRIRwYy zuc0TX55=>cPs@az^}ek)s8^@2udnqR#b?g1zHZ6O^e>I=svB;yfi$b*!4?B-La7Jg ziu8MB0q~YZap@o|LzbJ!U^D=GH`BA|YnE19(f9azZ6JYw;` Y+=@5921G0>8b) z&@hcY$VB^n_&f}2SP$`P`oLg_pkWTFM}+P+*Mm@KYhe%r0$~%Lb^$y)i0x9H!;uTz zcaP}Hr>mG?xeg6c3kJ&tZ{*JLY`3VF>Ve7kx<0KOdT6mNl>qm{N)2cQD0=aE?S>w` z{=RLeLSjjYlqy$!q0O&ggiZbdg+UlLD38c*Ou&wp#vmncvy52FYc#PSwY!PUkw0}G zoY2GmZ m{9W0>59RcRO{+#~I5{LmfWC4mkOPB+U(;!}YtQo5h5U z&L>o$g6KzFsJ6}q-mcd@XxK uiQl~t-X#n0mk`fK c#`*MzMy9v?PNJ2-LD56vGZg$lei zm~UmrUT~XS%Lvu7G*~Itn-Q0>zD&fal7)jeVBKLZ?k;);6Gwr&N)4(}1Vjzvc?Nk6 z@QHSz)|5A2(!xt-D&HEJdX=GkSuC8aEEYV?YxA}9(i(@<4|)wR3{@_wDl2^x&lGA5 z^LC%?up!) F36qJX%Mj% zm_WlO7qd&jcmAUL EF~RGQ)LzZ#r46 zckgA1=d*E#WXs|qX+`8_oh*|i`!oYNQm^7jo$W;_QndRBtBlWmX&k~~72l!0X$||O z5sGQ=@yV~2@C+UyxN=)yv=jp9CKU2z@3y|>a~Z@9wNmk(oTZOjocbWYNqLW`H1`@Z zXFDZP{bb{gDWzMQ_pS^VdT)Q}Q6C0VOwu+C#2@n~)o{aci+*una4#QLHFWb-YF;0< z#f0ZEdjUJr9feq!A3aH70otkjX++PFUn2Z=TN~I4QF{CXlDys(gqJZ-esTOcl&G-S zat672^_BT>n0yNdy`RbLo#_J_eW9h&y}a;XZ~wzRUiz2M#eF>^@AR(wcl;Xz`Pe_r zwxUP`qt_I|upX=cz-K=&TbfF{YI!%{Cfgs%-_4Tr4YTVSv<}0nGypUbA`o2an`ic% z2LxtQ(xF9R-P$4Q5}Fepw_HTBmF78&k!&U9{e2$H?oT!+J@PeNZl=&kmcS&hwT4EL zq=e|(mTgRhQokh|Jl#){@bH5`h#J=iPa58_u0Nn&Q83zWS>-@T)iJ(59`opypqLJE z8VKJkPjs6MJ#b=tiv9pj!@o$)2ep6;2nDI)L5PZP-GsIQUCdaK_YzVUdGs2}>jQ6C zsx9~Iq34Y_K26LsQ3xDeoBL3nX!$66YFV5W P!U$&P<`w zJ9WI4v0TA$!S{m-C78w|@qpp5&6A^-CG{)kW_W>%vX~#M&-?g~h@9U$$eoRkF5) zf{Gt4)!nI$h_D(h2HizbkuVI8CfFkxOF(EYldbZ%O%+YJrpT+eo5BL7S$_;5x1FaW zAd9h)UKCJ)aT+ZZd@-s2@)eQhWirPIK{#dJ*YO<6CQE$IG~VYQvn$Q&73%+PO@M`H z (qQR1PD9l3f*BghU`Ziqe0zPBYs_t1P^SR1ddbs zss4dk+C{SJobEU;8vCAA^+|?`3{HDUqCt>{)I=_J$fA}>L|wR|I &^*LBZm>UIP;srP1b&;G|+oO@_ zD;X2s6&aWsLs=B?s5q+v9^;R;6Et-7Ygp?=JveWWDH3EH64a~&OTR^enC>f;z^P#r z`@Ef^Nc4Gz4A*oNR; ^kAO(!DUJl`G<7%xK7`yw~M#^9s z#gRtc0~4DzR@+X6Q CYcM10&QA*JjZBWk)}N57=8 zm=dmFx{@NFiH2xgc!eOV r@7zvx#bt%d2dl6Pnv1!aRNOEOOgHqRXFbH zw;mWeYk+VG8RTt@iAA3Mo&1FkuyBIB2^AUyl6Uc|` NG2x96}hvWU#xQ_~+|JkmX)$h%u9Uh28@+#jgG@diJxifFk- ^mc zu8nC*6>@JSfmJE&SX?i|-@Yc79u9A6m1Vya`g|O*+$k>odE|nMz2{ArS&*=9r)o7t zacA3I|4o6rOh(GO6s<&2t&6Wcm0aWnSM&X+288fH0|lK@eNu=hdD`KDf><5y>@5>! z5rWL+Xez3(0a^WOmdzNI_UQPK-_JT72usLi$+ymJl_{=BJ{MSj0A%CE;4Z|o|GBo< zhk;hS3KD)V!weo_X^-J>DidOC^UV^OKrp4lW#;;CkMDtBElboZsSTZ3f=cW*&`IR2 zBv%N Fg+)Wqdl|I~3Z!?NL-<|5j~tC7 zKwB#fD2iVEvQBv00O+B^@MQL!CIje-agu!=VW-ENDZIpW#v10{qAi!bHMNJIry0%j z?Z#sfhVXAOO@YUy*D$Wte0<}>*{R8`UFBEl$dmj%vw? *E8TZj)Ymy7Sgvbm`xs6%{-~NmJESCg{%!JjHra?~2t$)-nCJL=61GEL zGxhGS%V{uEUu$T*FC@&&@40!`!IPr$>Q5d!3_+ki!6R3?(IT--WcloyJ?4u{Y#-V! zzV2zj?Aa*8GgDoK#qFWM(fq-fmxMWP*z_`$^AI!-c3cnB&2qS09UVH~1Mnk;1|x$k zZ9!K MCMp-EDX|>Q z-qE_5mYm4hFS`+6iafK0fpF|x;Y~D7>A=wWYT;o9_`FeZRwq}FdyAil!B3yQ0l5su zI1-wFU+ge9a)rqgo;U#^Sh*4w&`Km?+@$U$uJZt4?v1Y4%gj5Rtt#3QB1WmH*cUP! zEXET3+pQC#CG2Bn9D|X+R&w~{zcMhLcH);FBX{>r%0RX@^N)KnG=D|ScI`uRedBb! zHrbO*km8bAqzp|6sA=*g`*Pbx)(^|2YOpLUUXyfc{D~f*o2@I5-UR2QgJsD5N&eve zI;|rrM`D;j{c%21^n}V-o>TA$a*8DbQ5eHkUE}Z=s7CC`w>;CKaiqa{WC0=E_1naA z6ffk?!T{p2&p_EZ2rVMM2AZ1A+Kl)5C)9qI$J)245OZ<^xHWAh(%?Umbd0CR;^DjO zSXsR0_Dmi6V{<5=hWV_|mr?ruY4O~&?iA_s%^>3WIe2&Wl6)=3OOBq<$h4L|o%UnZ zGkV%x5&;VAdiFGN?(o^3vPu$V{zA1%vn2yB6>62B8SeJopZWRQp*_gH#k@Qb Tva>sbm+Y2Ouh&r3GwOY5|cY8Gc{-ur*XL4F`++1+K@1hH5OI zC_VJ?bqWh^#M6($QoLZ=s5k5f6i`*P>y^6KL6lJB166Z~Ofwj&Q8z5{R7|4YFd2y~ z;|VJKQR;9zPkF5gGi7auO7IRt3XC9-Qp6Eey^R&^2RjN!Q9i1{=W%s=ze+B@fK6K@ zr43sZsdC@8A7xejq^(imHJxu4iQ}&lUBaN`NFB$IHxudtD5#BV(|cxNQW183i0=87 zE61I5XJ0i$0A`@-k`q(H$}P Evz7Aw1%a)m{< z#$t{~pnqTqefq-^Gxa_DGYaGQ#ok60YmvlSSVCb-x*vp*poIb6tTVO+zV){Yh>m>e zf>(b~A=#D%<#6=A1^JUK@*qBXHU|%sE!G^QGY)K>F)Lnc>8TGp@WaVzTISw BcDp6dw%S=n8Y!MH)piH0O1+nzZe?AJjoevd|c$YZ0WDu709b`hA|^eH>`& z#@rZJt_PZz(b fl&T|Xonma#e-p)1F;I%h}5)2AG zeh}hK74k9TCkO9nqO5#KK$=zvZkBN+5C*Lc?_iOhj3a{tY!!_6!&{^!m9GBzf)A8e zE-aVnB*Ps7BoPj=$ionHt2oAbsUDpz&-{x;$-4RixVV=qrM<2Nz}bft7O@O#>I_i7 zhuj~lyvM$Hi=WUBATJa{wU#g1Q-Ym*L#PwxQi3^5G$c?pPP5X7Z~shU%Hh~fZfAZy zqVKJFdK+2vaZ%SG{`lcnH+NN+(q}3xg9&k8Ld5^ o~qRqGls} zazzsopcbYb{;=nXn=z&nsL1A$;C2R-cTgRDpp&ZcJg3>Gg!VDZe$C4yJ`oLGZE<}$ zS;{L^4qnw9sYYqt>DqAFIx&Q+WgqC{n;wxP)qwVXHI!KpJVnT $ehGo^R+!}6Bp|6yR>Tx5q0hZ1$SA2=-$`(@=DeJT1Ag}^PY}r9&Giajd zj6(d%L^9X|n4&>@2sN-|jy6K-2|2VJvT5X3m?(w#+*kE3)voOqnOluAhV^tXv-h}( zb}&hQuh?n|9f(OR6!*HX{6&oiZ;=&$q>zoFuo#jsYmiG1m1#F%W3&? _a+fWitS5ePYLT*&!pcTV~&erhT3|m8oo?W 2CH@>*^`A*5_hK}j6lvbwnwW((wWwC#Mx)}hDTnv9UJsw6+pf1OZg!EIDQ3x% z=>9Sm;Gu*iG1Co;760 u+KV$T^A@!YQM1K_U&~ zhe<Z9bV^K@PooOr?+OInIkUs9WNJ*dAUL`w<-^0RDX1>W1 zdhaP8J;h`GXFm-X%LJImEop>O?OYgNVORBfNWO+FgB*)Z;u~U}l(vM7*IT5Qyxeu^ zFF#FiAQ5=fjc6=L$oXgt75tWh9otAH+A}@|NWP4?kv208 rI#ms}Ng$)1o5SHp^87TB8Oq$-cci=gJdj&Hb_FRlJ=tc#sV*J#-c1b{UDRO- z^&4)$$vb9hGXF*RmppBUjINuxGFrBI?SEw>)^Yd^!$F_Ed#A zq&f&me+HOO)L{l_glv)0@3w2nCueduqKJ~2(cWut{6PWSl~f6{x*rb)jX&{uQ(+az zQ^8JYyqsj=eF;rXqhh^Rt-{oL;*n1~vVwPYP$R%v#iq^Dr`FBLUp@n^RFE~z2h&7! zk6lC~U1WEwu2B{_x`=UU5{wN@8a22!SWiBYkK;iG%_S7=E2kaskQhhEx#UzwT&7aH zxb>lQEndm_oPccuM4um=??rL;>ZXk0%B@Y=+Y8y@-hoH};c0)L>E%h^5NmUZg{*_I zeg8SU8|+t)BLJ`ls=f`PWqWw2CVet| 1XiWh+_xkGF0yK_9Zk|Q;r~JeZdXI zrAtczu6EKd44ZVH_HeJvXjlY6cXNkBrcU%fKGHraC0ah%3G`L_sqJ49R?1m3tw|-u zdJx5v;gnY${9dwsn9hra`)6OzZbto9*;1XHX~khxz8i-5I2=a4h_{}G4Q+f`j8yr~ z`}HQV2I3nBFOy~_Hni%ab%_Mjb({s_aFQbxdyNt!HPK-sD+Ow^{Q{nJL0ij+7g2R8 z2gS#%KRI3PN(SM;b@q)j@PaAgt-7awfT0jQZ?q7b3}(YOu^)t6Ty(P!6&-a4BgYn1 zf8oQ 7k0pe0J}G)j9-jXGYVXmc`W=jp;G4N1=YbbgwkuJu-1W&q^?*8j#W zDZCfeeA2%?y!1yf;k)JKS^L!ZoxyMYxW`8Kd%a|6gL$%B-KGm{S^qo{n^ z{jjK%zqp!w86_B*#LvHUcw)DpjOx%|hUmBpFI(_&;aIR6Dt{ukJ|wZLz0{AJLe(nw zCxuM0YUGp&UEUMFD;8-{jQ5t{ZDPq^B^8B%?9z+4-K=hpJy^F*Jf|N9$$Kw9>!0gA z`Fc3D@^Opt#h`L!LHgpNaQIsGP`d!pD@M^;7Qh<(6_g8F;3d{{a?gv4` ~ardOS=o)4 )x{OSo9s(@K}E26ySp(rpqg$GE&?*0Alv+YQk7S}VzH6ps@Dj20Avb#UqBvOn1? zkP0%f#Oz3@e;{afS?MBx)=ed`VzBMGHLY~fO1*BBi5V20DvDY(M0TF5S|kVia4XtI zBaFln=@)n!p>TNwQ5I2vaK)Zsv#IpNE*kk9Gu0F`T6}-!{J3>g&jB|JZ jo# zFsSJ%A5CR-2mHMlwuYVXa952W*|6jA`Z=79f9H$m`rV(!RM#5_SmkF}U@E2l^sre+ zs-vM4aQ}2Co*2@)(*hUDC~v!$I;u#q9ix{lKNc%!%@2Vtr0CHzIN85m`ijz3hz7^I zOaEA;8F~1=zL)S6-oYMs{^^G-kzo!wRozD!sQp{3+X* V{nXi %;s6KV$l-{kCVH=-V7k;rGd?)JSGrn@L=B+mzop}WLr5qbF7%6(^A${t{ zOl`C|P#AeUh4qHS0qDYXrvs4pJg4lH4rdVEQc#J)XK*~pe<(&ygd5gicWy+wzRRT- z46jHL)g~jCW+WmoK*U*yptNQ9(7mNZxJ2h|@h3`nscB_CCF!haFe&Ceo4C@S!S9O` zV(TiGm6a@`Oeo%L9hxJ3tXmod-(fTQRm1BJLAzF!Lp!TaWqhtNN_x)G^y~6(?qXnM zZp(S&8$47+5`05aH7ce7>xU|{j3}w#LhJm7Ugshqbky` ZYL4+pbXdDnG?E5y@jOcGrRGD!80R |`&X;(+Rs5EF z1m-#+FxG)d6>ZM2 rS)?=DfYa~FWZ0(LTF@)h%YSZ!9}8&Ym@Vn zWo8p{-FqGm)pw(la_Us`q4^dn$kcUl`l4lqU*sn1iL<#UW!mnGa1N&a;cX|+TSDGE z^9PXNU|h1p$hLQ++{!%^)(37*_TZLF`_%y)J&As&z(IZrhicq~)!r8AysIo`eRz6E zIuBMSlJX|x86OJ?D$dwG%bDsDce =U_$G@78<6 z7gTX$JPr!wR6YGg@Wl$t>C?04sP~dz#)EbibQ%B=4^2crmDP3_=Yw4v{QUg$%HfH+ zP_*v|Y@5 Y{iQnGuB zx;7HeUQNWX&erIlWhgPOKfSlMH;Qblh)xMYqwEl83DK!iYEa+LxwOQGOj;P^sJW=} zyLZ!blFo50-vw`{D~?yTE4)* }OKUIGdIvb*9+YrS25~C=ya$;I!(6!%y5w+LR`M3gLHViH!*rBW7Bz<& za%ST|MUXY3-lbmmEt#1NBUs4l%G}!Azgd1~yc8bUd3ZJOk82 ukUuEvORV_~4C9qXctx7Uqo8))zWYt$b3#dO z)^~}gT>~vFH6LcpB2#dX$$&(qGDsLD1(L>>3c>{!pAG}LyhG`uI2iLI(v#uXKJydb z%Fh#`oZTzEd?m->M$^8>3v|A6KdFs^r3I4FZbPbtYN3xU15&N{9}hmu`NK|jVXEvm z1kh{DMr48yHQaIflSD3Wy-n9%aeEv{hW$Ff4l3s4?pS =Jek$s&N#c1eHsBQsZOl?uu2ygi}yl}*~i)@MY)_LtW}X8S*p6|BN0 z9y4s$WAN@jcg2}lduO(z?QPU$i;Ox?dY?>UoYWa`ilFaQ+N@e9^2&F`N8o-tRLS0G z<~+8D4zu3x=C)oH_e`1CApxnoVrMKHwvN{(t zfn*U!9)44Sc>ePAo6;$wcHYP25b PqE`b#7LBKkWKJ z{DGJb`u?}lG>9?eX3}Xp6*|EoOmt)_lF0PC($+XDV&NJr^3n& 9!_OQI9q$5GmMdI~d$%gS zH$E o2PJ9@nkIAud!5wRb{30 zT;@Jn%|NOndd_b%JGJ8YC*Mvx`8un&_2JU8;0KN((R<# bs15oJWqo&lSow6Ol zlO1zG!n&JA*`#_(74n@G@*+BSIQ z4^MfH zDCP@YKGos0DS^ h418au9^IxhLi0k6q5|flg*=XXh_~-3T-WqcfR~ymGG;);mE`_cM=8ly8ca$J<*d zq*7o)pC>0ACoQL|dw >BYnd|2rn`80tn_ge@>7#RId5wa_sypU)dzT}|Acc7-ib<^GEGj&{39u!1T zS#MSBm|UV&abyA7-zKO9331*U_&% ktQAh4s66IR{9J+h^#z&-sdVP-%ljT6lrZBOx3DaE z&}1w-@iE68P_ogdn7$oQtPG;A#QvHLw-V{M@A^sHlVj +Xs*wY?+K#v7G=3U*-t^IPq=8La)_+nXM{`->n zK6r-Ymy9Nz%hbANp-;OS5@KmvJ_cf3reb?;c`G|BQ2;e$BDAkfpZe6w=GBH{{SgkU z{g`5ft5Rt{BDrI@EtO65Pid~RAX)m-nWmt9KlmVdy!8YHDhh38YLLgzy^KA&ONm8M zTF+$xW3&oI`s9>N^rvxJovFPlB=15dC<#r{1QW0!Pz#jUo@Xh&fxRei`wyZN@IQXi zvm^1)>H?~QZtlc>loVV2U0at19CgS|*xrI_e==0KWC4}JJc0pE3aLDD+|FQz2Tyzt z!~TT$lcNFh%KVF~-BSyUW%7;&d{CZ6`xi<6loMG})8E$QnDu{?CWcX&RifuBMgYp# zkgtane|1M;CMBsLX-7Oz;aypQBBsORykM2v9$bj2JVP5b!2Aw=&K#?kiVb|Pp7C2x z;}N`6s$h4}^;pLt^O;{7I1F13-c$MsVKu?6vYLO#Z&oa~xFur^hB~!5|Lc=d2D32a zuxkKAsk0X0oL9g8`j>wr_9jBd tZBp?6 wR~wR@w*8sEK%C%Rypmn4@*PY z(i!z9hRIuCNu4D|ohlV@#VsYcWKvW9#xaO9NZA-LJtmv{UF>E_-1HR1(Xqvyw8bdr zFSr@KD*YqV>Z}T#P~EgX2tIL6gi0d6#HNU|dB;yTl@}D4Jsp#+#r!g;@DHH&EC51V zac!s>$asjmYi%0Vog$lv`4rVGIY#LW7=!nsTDJZVtt>xYUlEpJ5dA=D@| p3NVOKWzPd$OGG z>JIX%w0Z?x2Re&v@?&chD9hqP_=66mXUI7Y1V4ZwcsrdTU`>SQFQkL<7En(t7&?V! z!{58hyowBpHoxZ>QTQ;%>^6O&zh9%jcOKTU4LVOV&4j^j!;RCR4<4!2?d|XX{W*o` zh|II$MTS-Xml0cHji0@Dw|>loENaV4WN07dv^T1HcC ggbtRo&5G`6fB>=U;`WV@N-0 ztiazlt&cl; 04Wik;cJw|-F8wn)y>MivJw!)tL^(3N^QkS9 zhwn#HiW&ji{V&Iz#*ft78Ra=RWC|YDhXmY^9%+6;W~(|jBZ(14MUWH`s|m0p0EB{d zq+wtkoxpFv;38@L1fiQPPV+=go%QG1I>E)v1wRLvO@g-~P!XEN#*F#+J~1e}>7dEA zFlm!SmiQbb@*;UK!0h`9nwhy{kI0VGJ|A6jMAo=IQQ*nxWu@32zhP*O4K=VdaUzgN zYDW2uq}t=G*8;F_qA`T^seZ7plfQg1tq>_i9uc0RQOV3BPboueAf^SPgVFh>A_@+h zD}3H+>&!<67(J)9z`+d)NtQvgBm5Bx_o{8Bt?9{**5d~Gtv$r@{_V6EmS&61$t^YY z;GBd`-`B&=2|m5b6seAT&4zDac;fR7E*P!k&T**fisluMgKax{`2Ke(`5W5PQ-yay zpl!KlqBzgI30AV@l(AF}fC}WU1<^0NpFVG~akqYT1+`GuEBYnhqj!m3n*y`2FHV-2 z+?2r#>I^XCHP$lQV&|)I9S1IoxZU;p&(>}}(p#Tkeh;T_BqYmil5i2N;A@l(Jsv+x zzwVkddymfNpWfi8w7)8vlxEyE<*&F1m)JwlTMsX^8P =X67N;rb~vcN>?sAG1R`HXqPjNBnF2CemN9Gg1%e(u VZo-1a|hbbV>TnB<8AIof{6AO*7 z-;u!FgWjW&>dM3!h%waJlVA~z@LlG5SBH6B6c6qOkQNwX`puWF5Y!H{R9w}@S>-z4 zn40}-lrqaRf4WGn?jskw_tw%CEdROHzv!fG5u=Mi%~2>M+F3$9Bw7|pTvb#qrDm>Y z#s6xDDa=rhz>=!ORwgpQR(Vp~hM*8br$_D{c-5>;5jp{L3F=b`@JtrLR791V($g#o z>Tm15_R AenS0FZ3p9- 79bEZgkl~{Iq|$B)Cj`XDwrFi2^NHZDrbYu>_o^!-biXXtnYun;(Th|+t&;t zg^Euw=C4w#8H%}X9O%Sy+h0qWCNKja{-h{l00G^`hFY-}XTX%bl1XY {je8F?<)J$)Psy z4t=wF2`A9?-gw}dWT(nz`$G=X2<45pfK(*9KY0q0O0Y*ac7>)}=tP2$$cS|4;GLN^ zNU0ZE{?W6>#09AF#uWUA=_OKXU1cSD3(KdLX+iSp+lTKh|9%mOp-c}IP5T5h5<4Ix zE9@2lHP>FBkC4IqEcX~$i1c|(W_F`vBT8nD*!J?k;O;Vp|4Lq`)kJUmE9<1K8xb{w z_8NB8+)}Qs`uWo7+Dc({ij@L2B_LpDlFd!QFF9C_;8nn-hn}H^h6}4C)|zYM_**^- z_!bL}XNWy5Rzudxp?38Zq>QP_Gw;Pgqz%!aPn&0hZsDTV?qg}35%Kprn+9l*ZHXI- zn<@3pTLY9>RThH&uH38s@A^?1@0F#S10rC(v`7U7=09y!ftuRVXPN>TbgtwkmJ6#k zmB(00^|15^E|Z4NtaoS *IO6~ zX{65IQ;vK}iOy+0WPwhj;(7cR$Z(tF;ar(tj7ZBjd%VkNpqeqw!`phZ4fA`6XV*>( z)gVo%80*OP(NR#u4Ons?;htuCZrC^I3-Wy*0~wv9;ncfvr=CJMlSyh^P*Jih$mR&D zq=EdX_$_j9RNq&j#pyvY=?_aucSKAQ@jS&`}Su{>)Kl4{g0zsNHl>~*=&!xni zR28QCc77Do^TD0!>=8uCk+spy!dLYS?HydbjW6w&PU(Av<4x&sl##9x7#u$MdiwUJ z#Iht+QwY$R;u;}ANUEYopja*+v JRLWRz_=gPLppE!z>JU1TZ52ayY znX3wXSMnisNk6Yli(Mo3KFZk16p-SzDSL2(-Rej_a#L#sX!bxRQ+g3!OB)|_eC1ar z6VB)cdCF`a3voP0?BW8p${sxMtXNV6{y52FO``rl(?RS)G}!@>Q>obFq$C~)D?o(% zE#D)9!@+?XhkFws1K6#8poy+oR2vf|uM-Mf49q?hm1i#(UPC!`+^0=lyK){c$N-5S zF2R|vF?ChZTQF5jYW33nXu2JR&q;CjIaKE6H#3c&gfuI8Zu^F880f49Ysa6# }I) z&kgcIseXMuzD7QSwzw5Pj4^Uky*rMWz=>0Fj?GW65bdsSCJ;#oNR&*+nnzU_d70rh z+f;%+a?;*T4Rg>p_v!gP_E0)Ut$(!rQPSFok$?J7auJ@*?dY}tp4clvGbd$s(D4+B zXO4JH+U524 Yp3G0zPHL!pF zR{(hqhVeeyhpQ}PLZb2VE~-zuiVmNUt*lTaqs% ;Cpr}mdA}D93C_+?l+U(wTBG>9^|AUd$8<7 z7M+PbDg%mA4!Dz-Xpj^7lPyu<3K2plyUeiP1)b@GsG+A!v~0so>&?$CYtqF=^FCmh z5qt1X)IKid%;>QsXPKG3BjySx ?)SK)uWRuB<*h zF0Z$ol&oPMc#Y@Ot0KY8@GOiN|MC&xl>a3JTCKuX4dGBsA&+eRz(^NF*%104%;nHn z17I5*1pT~?h+j{^7&}Tqbu~9kw|OpCN@>1k)iosuI0mYhCs_piS9U&vb}8%uD7;(q zKtfUe-0Q$+<&0zIrfFXEq(}0$b-rAL-}}Q=rNsy7VU-^v kBjY*oK50BfJS) zp82sdR70p-H!}=rF&b_7=EyB-iw@b=btqCQV;&_XLK7jwwZ%GT%MB4(3r98tX&soR z-h17Nk4wF?QoheSmOq9zCizzsnXH(Joo_tUC-^I 5@%gv_8zGNvR-ppNH zWG*Xm&a?gnGbc#8{hW<`XwIP?YUmC&kR7COoGL@OTFvaq(*khg^rZ|1y2Uz`vw|%n zTqG`=z;7Psqt^hi;t)i(?%*EYKpmQ&TgxGjdS8LoM`npOv^}l7ml-gw8)&oZmYN%z zU8N(X2y0UzyGp#%8ofFRW^{B&a6@e?*#{xjW#Iraz(IlYVpF>-mqLu21tli2QJ49N z^oGX)nuONE%{g>Q#eVELfPbG#c$q=m$mX=N;96e0zI!PjOvb>2%tw^GjCTOt&EmZg zhLR(=t{Gpe(-Hri70Z87N?1aNYI3{A*K5)`SgDAY_F?*i^#OH2!m$t0LenrWYEFx# z0rqfqo~EKG1;1tL8#t*~-t^01`22L=E1_nVZbXtGtV6ZKi2*$rgZSPyL+kOHKc&G& zUdt;VA4NEma31yN3v-Nps2OM6-Vwu-S9}Ak{m2J#ibTV2?ba@krkl=BzqO}evAyuP z(*TeSq(!<6lVWjN3pvcpeM2B`+rfk9M6c9Keg%_Br%Gha%25|L7doE;053LCu2LYA zNIAbwBph 6%w1cHKGOhfbMtw|lI&^FB%* zAWU3XJ*EoVC~CCV1v!o(KdI(ghasegZy&R=n>A#&pc-!Yur|q;RfKPS>6As|kuMdt zb(CSG2fi!(+b8B7|BA2fRYwBa>3o;p-WRXDldLbDeB)o^Kcc&pvLAI7zNrPdmK7aW zTim7Ab^07_qW$l$N3_xR@g}hkw1YmQnk9^4MROt!{2o{AeRqAoz}=@(gYprPR*v)h zM9|3|=qeqr;hz<5xfwk|{;5RXM+=g4TO3-R|BN)J!_GE?a X$skTtPjI_nJvkFg24|Kj1p_gNjwCz)a_T9Xtw{007lNg5BwqgdPWW8^pV z&2pXL0h0|=lKRG?y9D)VyN$o&-iMA=z8mbiOP^8SUNHU&)zynqfb!IGSYOnr)3W%H zD^`;452*1hV|Wyb-WM%QeXLEVs;Lvw{d@OjNkG)yOu1myeq<@4t3PWs$$PU@6%ndn zd%)2uGsD0_Y|mB`*#2@x7Z`_0=)R}gZVRrhd)WV2fr$PF*nlI$XcN(<1HN$SCDfQj zCr_o&$7!M5eRFn17A&%7e0>d{(@HCgz^l*ib5hcthEMozfbXWLp9kE51$1O4(!kL| zC~2UZtL8_mRg%#M1yL-5z5A=>`o@yHAUBcHsQ 1DRUC0MK~R`D0x9$9VkUaq6NxLR@7 zS4l7Ts99a`71`xpx|i_8`nP~!o$Bs!-T~_CjeX}fBb(0}EMy2zF`Xe4w6&<(cas6> zaqdkd^CE*5P^RW_sL2+tYa!tI5`K@x-9=ZIqBN7G)<)Dbuk@h2e_OW3dljlU@f^L* z6JWJV_k<{$5*=#TcZBcebR*G&2SRo~bfdC$q(XU8)6er>dpVYqUP;u0^(Iqt;>_7d zDJh~pz9ewgn1t`jZnmN+F~qV)qLmav^A>RVzALAKbPpicodD;#DE6}G)lPa!9PX5R zywGxRqcV 1ik^*Nn#P|;WTyIs5Oa{#Jqq}>`N9?wK=(p$7bn~(si2x7clmQ-1SAYQSz zNvee}DRw^jWu5$~j>kqRM2icdh7zLbNjS64H8tXfM}FS6AH-~54-w9KX8%1F?b0;P za>TUbx7f<>tff wp3AutI6Ac{oD3Bp=zz=0aW?f1*imd0QMU6D}#hLl`j=A_2JU8?#`O4>pE zz%)%tgAGUgzhC^6WqKTopAkcy?|~VMW-WBr^7{<2qgN&e0HNw{-vI2nH+2R<*veeK z1xD7y4R(b6`;hzlB3_a_e$1yBKm{CURNb}t50s0UIVfPsA+#<~1C8E=0=T+F+YwIZ zg$zBf5aY8=+G9LBFH$)0CSbk@2ID(W ?DF$&rQDw&prxI9ibKmdWv z-ho^VEP-%8O_od!->0H_F}aG|1uN&r2164_KZgJJS X7^4qQ@L(#Kp&1mBRk|0v>6B=1<2PRs$zVxksid3~Z?Uz@gIZa2fE zlC%#}2Ia-O&}sF-E^rTViBt ^>aGw+U=@jy!vL(we3vwt2h^#OKlgWD)vFg_rK`cevy+D<(=2!EY }8&BL~v-Qn*i1<2%O6-hlC5EA1G0rL}NZ$h)$ W D^+D=FRjXlmOOhta&ptcV!DZajK%^(GIymraI2bu|7D zg#ZJYW-%L!OBgc69e_=BlfAE{YGWD&q;U*ab)5BNKB^%KA6Si;y(=+bXB~febIS&= zPsV*njqtnKIGsh%Kb0q}?uPMm1!UJk uflz4QQ_WObsITtu0~2Xt6@Qf^SWMecW`aavYzR;#D59=r zJxvK7mnli@+V~o9r!J?1n)zYTf@`w@s~N7F5e_KC!-GIA0PT8!og~n_P3kh1u&LWX zD ubpLhrR~p`MmK?X6{|N(^> @;w#%FT`QXwp#b^#0#e13`&~? EHkZPP~Z# diff --git a/demo/blocks_mask/run.ipynb b/demo/blocks_mask/run.ipynb deleted file mode 100644 index 254bb7e332ef..000000000000 --- a/demo/blocks_mask/run.ipynb +++ /dev/null @@ -1 +0,0 @@ -{"cells": [{"cell_type": "markdown", "id": "302934307671667531413257853548643485645", "metadata": {}, "source": ["# Gradio Demo: blocks_mask"]}, {"cell_type": "code", "execution_count": null, "id": "272996653310673477252411125948039410165", "metadata": {}, "outputs": [], "source": ["!pip install -q gradio "]}, {"cell_type": "code", "execution_count": null, "id": "288918539441861185822528903084949547379", "metadata": {}, "outputs": [], "source": ["# Downloading files from the demo repo\n", "import os\n", "!wget -q https://github.com/gradio-app/gradio/raw/main/demo/blocks_mask/image.png\n", "!wget -q https://github.com/gradio-app/gradio/raw/main/demo/blocks_mask/lion.jpg\n", "!wget -q https://github.com/gradio-app/gradio/raw/main/demo/blocks_mask/lion.webp"]}, {"cell_type": "code", "execution_count": null, "id": "44380577570523278879349135829904343037", "metadata": {}, "outputs": [], "source": ["import gradio as gr\n", "from gradio.components import Markdown as md\n", "from PIL import Image\n", "\n", "demo = gr.Blocks()\n", "\n", "io1a = gr.Interface(lambda x: x, gr.Image(), gr.Image())\n", "io1b = gr.Interface(lambda x: x, gr.Image(source=\"webcam\"), gr.Image())\n", "\n", "io2a = gr.Interface(lambda x: x, gr.Image(source=\"canvas\"), gr.Image())\n", "io2b = gr.Interface(lambda x: x, gr.Sketchpad(), gr.Image())\n", "io2c = gr.Interface(\n", " lambda x: x, gr.Image(source=\"canvas\", shape=(512, 512)), gr.Image()\n", ")\n", "\n", "io3a = gr.Interface(\n", " lambda x: [x[\"mask\"], x[\"image\"]],\n", " gr.Image(source=\"upload\", tool=\"sketch\"),\n", " [gr.Image(), gr.Image()],\n", ")\n", "\n", "io3b = gr.Interface(\n", " lambda x: [x[\"mask\"], x[\"image\"]],\n", " gr.ImageMask(),\n", " [gr.Image(), gr.Image()],\n", ")\n", "\n", "io3b2 = gr.Interface(\n", " lambda x: [x[\"mask\"], x[\"image\"]],\n", " gr.ImageMask(),\n", " [gr.Image(), gr.Image()],\n", ")\n", "\n", "io3b3 = gr.Interface(\n", " lambda x: [x[\"mask\"], x[\"image\"]],\n", " gr.ImageMask(),\n", " [gr.Image(), gr.Image()],\n", ")\n", "\n", "io3c = gr.Interface(\n", " lambda x: [x[\"mask\"], x[\"image\"]],\n", " gr.Image(source=\"webcam\", tool=\"sketch\"),\n", " [gr.Image(), gr.Image()],\n", ")\n", "\n", "io4a = gr.Interface(\n", " lambda x: x, gr.Image(source=\"canvas\", tool=\"color-sketch\"), gr.Image()\n", ")\n", "io4b = gr.Interface(lambda x: x, gr.Paint(), gr.Image())\n", "\n", "io5a = gr.Interface(\n", " lambda x: x, gr.Image(source=\"upload\", tool=\"color-sketch\"), gr.Image()\n", ")\n", "io5b = gr.Interface(lambda x: x, gr.ImagePaint(), gr.Image())\n", "io5c = gr.Interface(\n", " lambda x: x, gr.Image(source=\"webcam\", tool=\"color-sketch\"), gr.Image()\n", ")\n", "\n", "\n", "def save_image(image):\n", " image.save(\"colorede.png\")\n", " return image\n", "\n", "\n", "img = Image.new(\"RGB\", (512, 512), (150, 150, 150))\n", "img.save(\"image.png\", \"PNG\")\n", "\n", "io5d = gr.Interface(\n", " save_image,\n", " gr.Image(\"image.png\", source=\"upload\", tool=\"color-sketch\", type=\"pil\"),\n", " gr.Image(),\n", ")\n", "\n", "with demo:\n", " md(\"# Different Ways to Use the Image Input Component\")\n", " md(\n", " \"**1a. Standalone Image Upload: `gr.Interface(lambda x: x, gr.Image(), gr.Image())`**\"\n", " )\n", " io1a.render()\n", " md(\n", " \"**1b. Standalone Image from Webcam: `gr.Interface(lambda x: x, gr.Image(source='webcam'), gr.Image())`**\"\n", " )\n", " io1b.render()\n", " md(\n", " \"**2a. Black and White Sketchpad: `gr.Interface(lambda x: x, gr.Image(source='canvas'), gr.Image())`**\"\n", " )\n", " io2a.render()\n", " md(\n", " \"**2b. Black and White Sketchpad: `gr.Interface(lambda x: x, gr.Sketchpad(), gr.Image())`**\"\n", " )\n", " io2b.render()\n", " md(\"**2c. Black and White Sketchpad with `shape=(512,512)`**\")\n", " io2c.render()\n", " md(\"**3a. Binary Mask with image upload:**\")\n", " md(\n", " \"\"\"```python\n", "gr.Interface(\n", " lambda x: [x['mask'], x['image']],\n", " gr.Image(source='upload', tool='sketch'),\n", " [gr.Image(), gr.Image()],\n", ")\n", "```\n", "\"\"\"\n", " )\n", " io3a.render()\n", " md(\"**3b. Binary Mask with image upload:**\")\n", " md(\n", " \"\"\"```python\n", "gr.Interface(\n", " lambda x: [x['mask'], x['image']],\n", " gr.ImageMask(),\n", " [gr.Image(), gr.Image()],\n", ")\n", "```\n", "\"\"\"\n", " )\n", " io3b.render()\n", " md(\"**3c. Binary Mask with webcam upload:**\")\n", " md(\n", " \"\"\"```python\n", "gr.Interface(\n", " lambda x: [x['mask'], x['image']],\n", " gr.Image(source='webcam', tool='sketch'),\n", " [gr.Image(), gr.Image()],\n", ")\n", "```\n", "\"\"\"\n", " )\n", " io3c.render()\n", " md(\n", " \"**4a. Color Sketchpad: `gr.Interface(lambda x: x, gr.Image(source='canvas', tool='color-sketch'), gr.Image())`**\"\n", " )\n", " io4a.render()\n", " md(\"**4b. Color Sketchpad: `gr.Interface(lambda x: x, gr.Paint(), gr.Image())`**\")\n", " io4b.render()\n", " md(\n", " \"**5a. Color Sketchpad with image upload: `gr.Interface(lambda x: x, gr.Image(source='upload', tool='color-sketch'), gr.Image())`**\"\n", " )\n", " io5a.render()\n", " md(\n", " \"**5b. Color Sketchpad with image upload: `gr.Interface(lambda x: x, gr.ImagePaint(), gr.Image())`**\"\n", " )\n", " io5b.render()\n", " md(\n", " \"**5c. Color Sketchpad with webcam upload: `gr.Interface(lambda x: x, gr.Image(source='webcam', tool='color-sketch'), gr.Image())`**\"\n", " )\n", " io5c.render()\n", " md(\"**Tabs**\")\n", " with gr.Tab(\"One\"):\n", " io3b2.render()\n", " with gr.Tab(\"Two\"):\n", " io3b3.render()\n", " md(\"**5d. Color Sketchpad with image upload and a default images**\")\n", " io5d.render()\n", "\n", "if __name__ == \"__main__\":\n", " demo.launch()\n"]}], "metadata": {}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/demo/blocks_mask/run.py b/demo/blocks_mask/run.py deleted file mode 100644 index 93e24a12ae3c..000000000000 --- a/demo/blocks_mask/run.py +++ /dev/null @@ -1,157 +0,0 @@ -import gradio as gr -from gradio.components import Markdown as md -from PIL import Image - -demo = gr.Blocks() - -io1a = gr.Interface(lambda x: x, gr.Image(), gr.Image()) -io1b = gr.Interface(lambda x: x, gr.Image(source="webcam"), gr.Image()) - -io2a = gr.Interface(lambda x: x, gr.Image(source="canvas"), gr.Image()) -io2b = gr.Interface(lambda x: x, gr.Sketchpad(), gr.Image()) -io2c = gr.Interface( - lambda x: x, gr.Image(source="canvas", shape=(512, 512)), gr.Image() -) - -io3a = gr.Interface( - lambda x: [x["mask"], x["image"]], - gr.Image(source="upload", tool="sketch"), - [gr.Image(), gr.Image()], -) - -io3b = gr.Interface( - lambda x: [x["mask"], x["image"]], - gr.ImageMask(), - [gr.Image(), gr.Image()], -) - -io3b2 = gr.Interface( - lambda x: [x["mask"], x["image"]], - gr.ImageMask(), - [gr.Image(), gr.Image()], -) - -io3b3 = gr.Interface( - lambda x: [x["mask"], x["image"]], - gr.ImageMask(), - [gr.Image(), gr.Image()], -) - -io3c = gr.Interface( - lambda x: [x["mask"], x["image"]], - gr.Image(source="webcam", tool="sketch"), - [gr.Image(), gr.Image()], -) - -io4a = gr.Interface( - lambda x: x, gr.Image(source="canvas", tool="color-sketch"), gr.Image() -) -io4b = gr.Interface(lambda x: x, gr.Paint(), gr.Image()) - -io5a = gr.Interface( - lambda x: x, gr.Image(source="upload", tool="color-sketch"), gr.Image() -) -io5b = gr.Interface(lambda x: x, gr.ImagePaint(), gr.Image()) -io5c = gr.Interface( - lambda x: x, gr.Image(source="webcam", tool="color-sketch"), gr.Image() -) - - -def save_image(image): - image.save("colorede.png") - return image - - -img = Image.new("RGB", (512, 512), (150, 150, 150)) -img.save("image.png", "PNG") - -io5d = gr.Interface( - save_image, - gr.Image("image.png", source="upload", tool="color-sketch", type="pil"), - gr.Image(), -) - -with demo: - md("# Different Ways to Use the Image Input Component") - md( - "**1a. Standalone Image Upload: `gr.Interface(lambda x: x, gr.Image(), gr.Image())`**" - ) - io1a.render() - md( - "**1b. Standalone Image from Webcam: `gr.Interface(lambda x: x, gr.Image(source='webcam'), gr.Image())`**" - ) - io1b.render() - md( - "**2a. Black and White Sketchpad: `gr.Interface(lambda x: x, gr.Image(source='canvas'), gr.Image())`**" - ) - io2a.render() - md( - "**2b. Black and White Sketchpad: `gr.Interface(lambda x: x, gr.Sketchpad(), gr.Image())`**" - ) - io2b.render() - md("**2c. Black and White Sketchpad with `shape=(512,512)`**") - io2c.render() - md("**3a. Binary Mask with image upload:**") - md( - """```python -gr.Interface( - lambda x: [x['mask'], x['image']], - gr.Image(source='upload', tool='sketch'), - [gr.Image(), gr.Image()], -) -``` -""" - ) - io3a.render() - md("**3b. Binary Mask with image upload:**") - md( - """```python -gr.Interface( - lambda x: [x['mask'], x['image']], - gr.ImageMask(), - [gr.Image(), gr.Image()], -) -``` -""" - ) - io3b.render() - md("**3c. Binary Mask with webcam upload:**") - md( - """```python -gr.Interface( - lambda x: [x['mask'], x['image']], - gr.Image(source='webcam', tool='sketch'), - [gr.Image(), gr.Image()], -) -``` -""" - ) - io3c.render() - md( - "**4a. Color Sketchpad: `gr.Interface(lambda x: x, gr.Image(source='canvas', tool='color-sketch'), gr.Image())`**" - ) - io4a.render() - md("**4b. Color Sketchpad: `gr.Interface(lambda x: x, gr.Paint(), gr.Image())`**") - io4b.render() - md( - "**5a. Color Sketchpad with image upload: `gr.Interface(lambda x: x, gr.Image(source='upload', tool='color-sketch'), gr.Image())`**" - ) - io5a.render() - md( - "**5b. Color Sketchpad with image upload: `gr.Interface(lambda x: x, gr.ImagePaint(), gr.Image())`**" - ) - io5b.render() - md( - "**5c. Color Sketchpad with webcam upload: `gr.Interface(lambda x: x, gr.Image(source='webcam', tool='color-sketch'), gr.Image())`**" - ) - io5c.render() - md("**Tabs**") - with gr.Tab("One"): - io3b2.render() - with gr.Tab("Two"): - io3b3.render() - md("**5d. Color Sketchpad with image upload and a default images**") - io5d.render() - -if __name__ == "__main__": - demo.launch() diff --git a/demo/blocks_webcam/run.ipynb b/demo/blocks_webcam/run.ipynb index 730332f69314..bf4b993fdb53 100644 --- a/demo/blocks_webcam/run.ipynb +++ b/demo/blocks_webcam/run.ipynb @@ -1 +1 @@ -{"cells": [{"cell_type": "markdown", "id": "302934307671667531413257853548643485645", "metadata": {}, "source": ["# Gradio Demo: blocks_webcam"]}, {"cell_type": "code", "execution_count": null, "id": "272996653310673477252411125948039410165", "metadata": {}, "outputs": [], "source": ["!pip install -q gradio "]}, {"cell_type": "code", "execution_count": null, "id": "288918539441861185822528903084949547379", "metadata": {}, "outputs": [], "source": ["import numpy as np\n", "\n", "import gradio as gr\n", "\n", "\n", "def snap(image):\n", " return np.flipud(image)\n", "\n", "\n", "demo = gr.Interface(snap, \"webcam\", \"image\")\n", "\n", "if __name__ == \"__main__\":\n", " demo.launch()\n"]}], "metadata": {}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file +{"cells": [{"cell_type": "markdown", "id": "302934307671667531413257853548643485645", "metadata": {}, "source": ["# Gradio Demo: blocks_webcam"]}, {"cell_type": "code", "execution_count": null, "id": "272996653310673477252411125948039410165", "metadata": {}, "outputs": [], "source": ["!pip install -q gradio "]}, {"cell_type": "code", "execution_count": null, "id": "288918539441861185822528903084949547379", "metadata": {}, "outputs": [], "source": ["import numpy as np\n", "\n", "import gradio as gr\n", "\n", "\n", "def snap(image):\n", " return np.flipud(image)\n", "\n", "\n", "demo = gr.Interface(snap, gr.Image(sources=[\"webcam\"]), \"image\")\n", "\n", "if __name__ == \"__main__\":\n", " demo.launch()\n"]}], "metadata": {}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/demo/blocks_webcam/run.py b/demo/blocks_webcam/run.py index 4b9259868408..1076d0b1afd1 100644 --- a/demo/blocks_webcam/run.py +++ b/demo/blocks_webcam/run.py @@ -7,7 +7,7 @@ def snap(image): return np.flipud(image) -demo = gr.Interface(snap, "webcam", "image") +demo = gr.Interface(snap, gr.Image(sources=["webcam"]), "image") if __name__ == "__main__": demo.launch() diff --git a/demo/cancel_events/run.ipynb b/demo/cancel_events/run.ipynb index c258553b8558..4dd11c03ac70 100644 --- a/demo/cancel_events/run.ipynb +++ b/demo/cancel_events/run.ipynb @@ -1 +1 @@ -{"cells": [{"cell_type": "markdown", "id": "302934307671667531413257853548643485645", "metadata": {}, "source": ["# Gradio Demo: cancel_events"]}, {"cell_type": "code", "execution_count": null, "id": "272996653310673477252411125948039410165", "metadata": {}, "outputs": [], "source": ["!pip install -q gradio "]}, {"cell_type": "code", "execution_count": null, "id": "288918539441861185822528903084949547379", "metadata": {}, "outputs": [], "source": ["import time\n", "import gradio as gr\n", "\n", "\n", "def fake_diffusion(steps):\n", " for i in range(steps):\n", " print(f\"Current step: {i}\")\n", " time.sleep(1)\n", " yield str(i)\n", "\n", "\n", "def long_prediction(*args, **kwargs):\n", " time.sleep(10)\n", " return 42\n", "\n", "\n", "with gr.Blocks() as demo:\n", " with gr.Row():\n", " with gr.Column():\n", " n = gr.Slider(1, 10, value=9, step=1, label=\"Number Steps\")\n", " run = gr.Button(value=\"Start Iterating\")\n", " output = gr.Textbox(label=\"Iterative Output\")\n", " stop = gr.Button(value=\"Stop Iterating\")\n", " with gr.Column():\n", " textbox = gr.Textbox(label=\"Prompt\")\n", " prediction = gr.Number(label=\"Expensive Calculation\")\n", " run_pred = gr.Button(value=\"Run Expensive Calculation\")\n", " with gr.Column():\n", " cancel_on_change = gr.Textbox(label=\"Cancel Iteration and Expensive Calculation on Change\")\n", " cancel_on_submit = gr.Textbox(label=\"Cancel Iteration and Expensive Calculation on Submit\")\n", " echo = gr.Textbox(label=\"Echo\")\n", " with gr.Row():\n", " with gr.Column():\n", " image = gr.Image(sources=[\"webcam\"], tool=\"editor\", label=\"Cancel on edit\", interactive=True)\n", " with gr.Column():\n", " video = gr.Video(sources=[\"webcam\"], label=\"Cancel on play\", interactive=True)\n", "\n", " click_event = run.click(fake_diffusion, n, output)\n", " stop.click(fn=None, inputs=None, outputs=None, cancels=[click_event])\n", " pred_event = run_pred.click(fn=long_prediction, inputs=[textbox], outputs=prediction)\n", "\n", " cancel_on_change.change(None, None, None, cancels=[click_event, pred_event])\n", " cancel_on_submit.submit(lambda s: s, cancel_on_submit, echo, cancels=[click_event, pred_event])\n", " image.edit(None, None, None, cancels=[click_event, pred_event])\n", " video.play(None, None, None, cancels=[click_event, pred_event])\n", "\n", " demo.queue(max_size=20)\n", "\n", "if __name__ == \"__main__\":\n", " demo.launch()\n"]}], "metadata": {}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file +{"cells": [{"cell_type": "markdown", "id": "302934307671667531413257853548643485645", "metadata": {}, "source": ["# Gradio Demo: cancel_events"]}, {"cell_type": "code", "execution_count": null, "id": "272996653310673477252411125948039410165", "metadata": {}, "outputs": [], "source": ["!pip install -q gradio "]}, {"cell_type": "code", "execution_count": null, "id": "288918539441861185822528903084949547379", "metadata": {}, "outputs": [], "source": ["import time\n", "import gradio as gr\n", "\n", "\n", "def fake_diffusion(steps):\n", " for i in range(steps):\n", " print(f\"Current step: {i}\")\n", " time.sleep(1)\n", " yield str(i)\n", "\n", "\n", "def long_prediction(*args, **kwargs):\n", " time.sleep(10)\n", " return 42\n", "\n", "\n", "with gr.Blocks() as demo:\n", " with gr.Row():\n", " with gr.Column():\n", " n = gr.Slider(1, 10, value=9, step=1, label=\"Number Steps\")\n", " run = gr.Button(value=\"Start Iterating\")\n", " output = gr.Textbox(label=\"Iterative Output\")\n", " stop = gr.Button(value=\"Stop Iterating\")\n", " with gr.Column():\n", " textbox = gr.Textbox(label=\"Prompt\")\n", " prediction = gr.Number(label=\"Expensive Calculation\")\n", " run_pred = gr.Button(value=\"Run Expensive Calculation\")\n", " with gr.Column():\n", " cancel_on_change = gr.Textbox(label=\"Cancel Iteration and Expensive Calculation on Change\")\n", " cancel_on_submit = gr.Textbox(label=\"Cancel Iteration and Expensive Calculation on Submit\")\n", " echo = gr.Textbox(label=\"Echo\")\n", " with gr.Row():\n", " with gr.Column():\n", " image = gr.Image(sources=[\"webcam\"], label=\"Cancel on clear\", interactive=True)\n", " with gr.Column():\n", " video = gr.Video(sources=[\"webcam\"], label=\"Cancel on start recording\", interactive=True)\n", "\n", " click_event = run.click(fake_diffusion, n, output)\n", " stop.click(fn=None, inputs=None, outputs=None, cancels=[click_event])\n", " pred_event = run_pred.click(fn=long_prediction, inputs=[textbox], outputs=prediction)\n", "\n", " cancel_on_change.change(None, None, None, cancels=[click_event, pred_event])\n", " cancel_on_submit.submit(lambda s: s, cancel_on_submit, echo, cancels=[click_event, pred_event])\n", " image.clear(None, None, None, cancels=[click_event, pred_event])\n", " video.start_recording(None, None, None, cancels=[click_event, pred_event])\n", "\n", " demo.queue(max_size=20)\n", "\n", "if __name__ == \"__main__\":\n", " demo.launch()\n"]}], "metadata": {}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/demo/cancel_events/run.py b/demo/cancel_events/run.py index 83d7b7d73d93..56f8d9ba21ef 100644 --- a/demo/cancel_events/run.py +++ b/demo/cancel_events/run.py @@ -31,9 +31,9 @@ def long_prediction(*args, **kwargs): echo = gr.Textbox(label="Echo") with gr.Row(): with gr.Column(): - image = gr.Image(sources=["webcam"], tool="editor", label="Cancel on edit", interactive=True) + image = gr.Image(sources=["webcam"], label="Cancel on clear", interactive=True) with gr.Column(): - video = gr.Video(sources=["webcam"], label="Cancel on play", interactive=True) + video = gr.Video(sources=["webcam"], label="Cancel on start recording", interactive=True) click_event = run.click(fake_diffusion, n, output) stop.click(fn=None, inputs=None, outputs=None, cancels=[click_event]) @@ -41,8 +41,8 @@ def long_prediction(*args, **kwargs): cancel_on_change.change(None, None, None, cancels=[click_event, pred_event]) cancel_on_submit.submit(lambda s: s, cancel_on_submit, echo, cancels=[click_event, pred_event]) - image.edit(None, None, None, cancels=[click_event, pred_event]) - video.play(None, None, None, cancels=[click_event, pred_event]) + image.clear(None, None, None, cancels=[click_event, pred_event]) + video.start_recording(None, None, None, cancels=[click_event, pred_event]) demo.queue(max_size=20) diff --git a/demo/fake_gan/run.ipynb b/demo/fake_gan/run.ipynb index e0c21f7cb4d3..77783d1e3ea1 100644 --- a/demo/fake_gan/run.ipynb +++ b/demo/fake_gan/run.ipynb @@ -1 +1 @@ -{"cells": [{"cell_type": "markdown", "id": "302934307671667531413257853548643485645", "metadata": {}, "source": ["# Gradio Demo: fake_gan\n", "### This is a fake GAN that shows how to create a text-to-image interface for image generation. Check out the Stable Diffusion demo for more: https://hf.co/spaces/stabilityai/stable-diffusion/\n", " "]}, {"cell_type": "code", "execution_count": null, "id": "272996653310673477252411125948039410165", "metadata": {}, "outputs": [], "source": ["!pip install -q gradio "]}, {"cell_type": "code", "execution_count": null, "id": "288918539441861185822528903084949547379", "metadata": {}, "outputs": [], "source": ["# Downloading files from the demo repo\n", "import os\n", "os.mkdir('files')\n", "!wget -q -O files/cheetah1.jpg https://github.com/gradio-app/gradio/raw/main/demo/fake_gan/files/cheetah1.jpg"]}, {"cell_type": "code", "execution_count": null, "id": "44380577570523278879349135829904343037", "metadata": {}, "outputs": [], "source": ["# This demo needs to be run from the repo folder.\n", "# python demo/fake_gan/run.py\n", "import random\n", "\n", "import gradio as gr\n", "\n", "\n", "def fake_gan():\n", " images = [\n", " (random.choice(\n", " [\n", " \"https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=387&q=80\",\n", " \"https://images.unsplash.com/photo-1554151228-14d9def656e4?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=386&q=80\",\n", " \"https://images.unsplash.com/photo-1542909168-82c3e7fdca5c?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxzZWFyY2h8MXx8aHVtYW4lMjBmYWNlfGVufDB8fDB8fA%3D%3D&w=1000&q=80\",\n", " \"https://images.unsplash.com/photo-1546456073-92b9f0a8d413?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=387&q=80\",\n", " \"https://images.unsplash.com/photo-1601412436009-d964bd02edbc?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=464&q=80\",\n", " ]\n", " ), f\"label {i}\" if i != 0 else \"label\" * 50)\n", " for i in range(3)\n", " ]\n", " return images\n", "\n", "\n", "with gr.Blocks() as demo:\n", " with gr.Column(variant=\"panel\"):\n", " with gr.Row():\n", " text = gr.Textbox(\n", " label=\"Enter your prompt\",\n", " max_lines=1,\n", " placeholder=\"Enter your prompt\",\n", " container=False,\n", " )\n", " btn = gr.Button(\"Generate image\", scale=0)\n", "\n", " gallery = gr.Gallery(\n", " label=\"Generated images\", show_label=False, elem_id=\"gallery\"\n", " , columns=[2], rows=[2], object_fit=\"contain\", height=\"auto\")\n", "\n", " btn.click(fake_gan, None, gallery)\n", "\n", "if __name__ == \"__main__\":\n", " demo.launch()\n"]}], "metadata": {}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file +{"cells": [{"cell_type": "markdown", "id": "302934307671667531413257853548643485645", "metadata": {}, "source": ["# Gradio Demo: fake_gan\n", "### This is a fake GAN that shows how to create a text-to-image interface for image generation. Check out the Stable Diffusion demo for more: https://hf.co/spaces/stabilityai/stable-diffusion/\n", " "]}, {"cell_type": "code", "execution_count": null, "id": "272996653310673477252411125948039410165", "metadata": {}, "outputs": [], "source": ["!pip install -q gradio "]}, {"cell_type": "code", "execution_count": null, "id": "288918539441861185822528903084949547379", "metadata": {}, "outputs": [], "source": ["# Downloading files from the demo repo\n", "import os\n", "os.mkdir('files')\n", "!wget -q -O files/cheetah1.jpg https://github.com/gradio-app/gradio/raw/main/demo/fake_gan/files/cheetah1.jpg"]}, {"cell_type": "code", "execution_count": null, "id": "44380577570523278879349135829904343037", "metadata": {}, "outputs": [], "source": ["# This demo needs to be run from the repo folder.\n", "# python demo/fake_gan/run.py\n", "import random\n", "\n", "import gradio as gr\n", "\n", "\n", "def fake_gan():\n", " images = [\n", " (random.choice(\n", " [\n", " \"http://www.marketingtool.online/en/face-generator/img/faces/avatar-1151ce9f4b2043de0d2e3b7826127998.jpg\",\n", " \"http://www.marketingtool.online/en/face-generator/img/faces/avatar-116b5e92936b766b7fdfc242649337f7.jpg\",\n", " \"http://www.marketingtool.online/en/face-generator/img/faces/avatar-1163530ca19b5cebe1b002b8ec67b6fc.jpg\",\n", " \"http://www.marketingtool.online/en/face-generator/img/faces/avatar-1116395d6e6a6581eef8b8038f4c8e55.jpg\",\n", " \"http://www.marketingtool.online/en/face-generator/img/faces/avatar-11319be65db395d0e8e6855d18ddcef0.jpg\",\n", " ]\n", " ), f\"label {i}\")\n", " for i in range(3)\n", " ]\n", " return images\n", "\n", "\n", "with gr.Blocks() as demo:\n", " gallery = gr.Gallery(\n", " label=\"Generated images\", show_label=False, elem_id=\"gallery\"\n", " , columns=[3], rows=[1], object_fit=\"contain\", height=\"auto\")\n", " btn = gr.Button(\"Generate images\", scale=0)\n", "\n", " btn.click(fake_gan, None, gallery)\n", "\n", "if __name__ == \"__main__\":\n", " demo.launch()\n"]}], "metadata": {}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/demo/fake_gan/run.py b/demo/fake_gan/run.py index b8d8ab732d72..b3ea489cee0f 100644 --- a/demo/fake_gan/run.py +++ b/demo/fake_gan/run.py @@ -9,32 +9,23 @@ def fake_gan(): images = [ (random.choice( [ - "https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=387&q=80", - "https://images.unsplash.com/photo-1554151228-14d9def656e4?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=386&q=80", - "https://images.unsplash.com/photo-1542909168-82c3e7fdca5c?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxzZWFyY2h8MXx8aHVtYW4lMjBmYWNlfGVufDB8fDB8fA%3D%3D&w=1000&q=80", - "https://images.unsplash.com/photo-1546456073-92b9f0a8d413?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=387&q=80", - "https://images.unsplash.com/photo-1601412436009-d964bd02edbc?ixlib=rb-1.2.1&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&w=464&q=80", + "http://www.marketingtool.online/en/face-generator/img/faces/avatar-1151ce9f4b2043de0d2e3b7826127998.jpg", + "http://www.marketingtool.online/en/face-generator/img/faces/avatar-116b5e92936b766b7fdfc242649337f7.jpg", + "http://www.marketingtool.online/en/face-generator/img/faces/avatar-1163530ca19b5cebe1b002b8ec67b6fc.jpg", + "http://www.marketingtool.online/en/face-generator/img/faces/avatar-1116395d6e6a6581eef8b8038f4c8e55.jpg", + "http://www.marketingtool.online/en/face-generator/img/faces/avatar-11319be65db395d0e8e6855d18ddcef0.jpg", ] - ), f"label {i}" if i != 0 else "label" * 50) + ), f"label {i}") for i in range(3) ] return images with gr.Blocks() as demo: - with gr.Column(variant="panel"): - with gr.Row(): - text = gr.Textbox( - label="Enter your prompt", - max_lines=1, - placeholder="Enter your prompt", - container=False, - ) - btn = gr.Button("Generate image", scale=0) - - gallery = gr.Gallery( - label="Generated images", show_label=False, elem_id="gallery" - , columns=[2], rows=[2], object_fit="contain", height="auto") + gallery = gr.Gallery( + label="Generated images", show_label=False, elem_id="gallery" + , columns=[3], rows=[1], object_fit="contain", height="auto") + btn = gr.Button("Generate images", scale=0) btn.click(fake_gan, None, gallery) diff --git a/demo/gallery_component/run.ipynb b/demo/gallery_component/run.ipynb index c76f30131a09..ce858d3c1ff2 100644 --- a/demo/gallery_component/run.ipynb +++ b/demo/gallery_component/run.ipynb @@ -1 +1 @@ -{"cells": [{"cell_type": "markdown", "id": "302934307671667531413257853548643485645", "metadata": {}, "source": ["# Gradio Demo: gallery_component"]}, {"cell_type": "code", "execution_count": null, "id": "272996653310673477252411125948039410165", "metadata": {}, "outputs": [], "source": ["!pip install -q gradio "]}, {"cell_type": "code", "execution_count": null, "id": "288918539441861185822528903084949547379", "metadata": {}, "outputs": [], "source": ["import gradio as gr \n", "\n", "with gr.Blocks() as demo:\n", " cheetahs = [\n", " \"https://upload.wikimedia.org/wikipedia/commons/0/09/TheCheethcat.jpg\",\n", " \"https://nationalzoo.si.edu/sites/default/files/animals/cheetah-003.jpg\",\n", " \"https://img.etimg.com/thumb/msid-50159822,width-650,imgsize-129520,,resizemode-4,quality-100/.jpg\",\n", " \"https://nationalzoo.si.edu/sites/default/files/animals/cheetah-002.jpg\",\n", " \"https://images.theconversation.com/files/375893/original/file-20201218-13-a8h8uq.jpg?ixlib=rb-1.1.0&rect=16%2C407%2C5515%2C2924&q=45&auto=format&w=496&fit=clip\",\n", " \"https://www.lifegate.com/app/uploads/ghepardo-primo-piano.jpg\",\n", " \"https://qph.cf2.quoracdn.net/main-qimg-0bbf31c18a22178cb7a8dd53640a3d05-lq\"\n", " ]\n", " gr.Gallery(value=cheetahs, columns=4)\n", "\n", "demo.launch()"]}], "metadata": {}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file +{"cells": [{"cell_type": "markdown", "id": "302934307671667531413257853548643485645", "metadata": {}, "source": ["# Gradio Demo: gallery_component"]}, {"cell_type": "code", "execution_count": null, "id": "272996653310673477252411125948039410165", "metadata": {}, "outputs": [], "source": ["!pip install -q gradio "]}, {"cell_type": "code", "execution_count": null, "id": "288918539441861185822528903084949547379", "metadata": {}, "outputs": [], "source": ["import gradio as gr \n", "\n", "with gr.Blocks() as demo:\n", " cheetahs = [\n", " \"https://upload.wikimedia.org/wikipedia/commons/0/09/TheCheethcat.jpg\",\n", " \"https://nationalzoo.si.edu/sites/default/files/animals/cheetah-003.jpg\",\n", " \"https://img.etimg.com/thumb/msid-50159822,width-650,imgsize-129520,,resizemode-4,quality-100/.jpg\",\n", " \"https://nationalzoo.si.edu/sites/default/files/animals/cheetah-002.jpg\",\n", " \"https://images.theconversation.com/files/375893/original/file-20201218-13-a8h8uq.jpg?ixlib=rb-1.1.0&rect=16%2C407%2C5515%2C2924&q=45&auto=format&w=496&fit=clip\",\n", " ]\n", " gr.Gallery(value=cheetahs, columns=4)\n", "\n", "demo.launch()"]}], "metadata": {}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/demo/gallery_component/run.py b/demo/gallery_component/run.py index 3acc659c7a90..1bc775fb6910 100644 --- a/demo/gallery_component/run.py +++ b/demo/gallery_component/run.py @@ -7,8 +7,6 @@ "https://img.etimg.com/thumb/msid-50159822,width-650,imgsize-129520,,resizemode-4,quality-100/.jpg", "https://nationalzoo.si.edu/sites/default/files/animals/cheetah-002.jpg", "https://images.theconversation.com/files/375893/original/file-20201218-13-a8h8uq.jpg?ixlib=rb-1.1.0&rect=16%2C407%2C5515%2C2924&q=45&auto=format&w=496&fit=clip", - "https://www.lifegate.com/app/uploads/ghepardo-primo-piano.jpg", - "https://qph.cf2.quoracdn.net/main-qimg-0bbf31c18a22178cb7a8dd53640a3d05-lq" ] gr.Gallery(value=cheetahs, columns=4) diff --git a/demo/gallery_selections/run.ipynb b/demo/gallery_selections/run.ipynb index 23d890efbf3a..51a66fce2b29 100644 --- a/demo/gallery_selections/run.ipynb +++ b/demo/gallery_selections/run.ipynb @@ -1 +1 @@ -{"cells": [{"cell_type": "markdown", "id": "302934307671667531413257853548643485645", "metadata": {}, "source": ["# Gradio Demo: gallery_selections"]}, {"cell_type": "code", "execution_count": null, "id": "272996653310673477252411125948039410165", "metadata": {}, "outputs": [], "source": ["!pip install -q gradio "]}, {"cell_type": "code", "execution_count": null, "id": "288918539441861185822528903084949547379", "metadata": {}, "outputs": [], "source": ["import gradio as gr\n", "import numpy as np\n", "\n", "with gr.Blocks() as demo:\n", " imgs = gr.State()\n", " gallery = gr.Gallery()\n", "\n", " def generate_images():\n", " images = []\n", " for _ in range(9):\n", " image = np.ones((100, 100, 3), dtype=np.uint8) * np.random.randint(\n", " 0, 255, 3\n", " ) # image is a solid single color\n", " images.append(image)\n", " return images, images\n", "\n", " demo.load(generate_images, None, [gallery, imgs])\n", "\n", " with gr.Row():\n", " selected = gr.Number(show_label=False, placeholder=\"Selected\")\n", " darken_btn = gr.Button(\"Darken selected\")\n", "\n", " def get_select_index(evt: gr.SelectData):\n", " return evt.index\n", "\n", " gallery.select(get_select_index, None, selected)\n", "\n", " def darken_img(imgs, index):\n", " index = int(index)\n", " imgs[index] = np.round(imgs[index] * 0.8).astype(np.uint8)\n", " return imgs, imgs\n", "\n", " darken_btn.click(darken_img, [imgs, selected], [imgs, gallery])\n", "\n", "if __name__ == \"__main__\":\n", " demo.launch()\n"]}], "metadata": {}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file +{"cells": [{"cell_type": "markdown", "id": "302934307671667531413257853548643485645", "metadata": {}, "source": ["# Gradio Demo: gallery_selections"]}, {"cell_type": "code", "execution_count": null, "id": "272996653310673477252411125948039410165", "metadata": {}, "outputs": [], "source": ["!pip install -q gradio "]}, {"cell_type": "code", "execution_count": null, "id": "288918539441861185822528903084949547379", "metadata": {}, "outputs": [], "source": ["import gradio as gr\n", "import numpy as np\n", "\n", "with gr.Blocks() as demo:\n", " imgs = gr.State()\n", " gallery = gr.Gallery()\n", "\n", " def generate_images():\n", " images = []\n", " for _ in range(9):\n", " image = np.ones((100, 100, 3), dtype=np.uint8) * np.random.randint(\n", " 0, 255, 3\n", " ) # image is a solid single color\n", " images.append(image)\n", " return images, images\n", "\n", " demo.load(generate_images, None, [gallery, imgs])\n", "\n", " with gr.Row():\n", " selected = gr.Number(show_label=False)\n", " darken_btn = gr.Button(\"Darken selected\")\n", "\n", " def get_select_index(evt: gr.SelectData):\n", " return evt.index\n", "\n", " gallery.select(get_select_index, None, selected)\n", "\n", " def darken_img(imgs, index):\n", " index = int(index)\n", " imgs[index] = np.round(imgs[index] * 0.8).astype(np.uint8)\n", " return imgs, imgs\n", "\n", " darken_btn.click(darken_img, [imgs, selected], [imgs, gallery])\n", "\n", "if __name__ == \"__main__\":\n", " demo.launch()\n"]}], "metadata": {}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/demo/gallery_selections/run.py b/demo/gallery_selections/run.py index 77885a5e26e9..446431b55358 100644 --- a/demo/gallery_selections/run.py +++ b/demo/gallery_selections/run.py @@ -17,7 +17,7 @@ def generate_images(): demo.load(generate_images, None, [gallery, imgs]) with gr.Row(): - selected = gr.Number(show_label=False, placeholder="Selected") + selected = gr.Number(show_label=False) darken_btn = gr.Button("Darken selected") def get_select_index(evt: gr.SelectData): diff --git a/demo/generate_english_german/run.ipynb b/demo/generate_english_german/run.ipynb index 15de5a6d8d2b..52608e681203 100644 --- a/demo/generate_english_german/run.ipynb +++ b/demo/generate_english_german/run.ipynb @@ -1 +1 @@ -{"cells": [{"cell_type": "markdown", "id": "302934307671667531413257853548643485645", "metadata": {}, "source": ["# Gradio Demo: generate_english_german"]}, {"cell_type": "code", "execution_count": null, "id": "272996653310673477252411125948039410165", "metadata": {}, "outputs": [], "source": ["!pip install -q gradio transformers torch"]}, {"cell_type": "code", "execution_count": null, "id": "288918539441861185822528903084949547379", "metadata": {}, "outputs": [], "source": ["import gradio as gr\n", "\n", "from transformers import pipeline\n", "\n", "english_translator = gr.Blocks.load(name=\"spaces/gradio/english_translator\")\n", "english_generator = pipeline(\"text-generation\", model=\"distilgpt2\")\n", "\n", "\n", "def generate_text(text):\n", " english_text = english_generator(text)[0][\"generated_text\"]\n", " german_text = english_translator(english_text)\n", " return english_text, german_text\n", "\n", "\n", "with gr.Blocks() as demo:\n", " with gr.Row():\n", " with gr.Column():\n", " seed = gr.Text(label=\"Input Phrase\")\n", " with gr.Column():\n", " english = gr.Text(label=\"Generated English Text\")\n", " german = gr.Text(label=\"Generated German Text\")\n", " btn = gr.Button(\"Generate\")\n", " btn.click(generate_text, inputs=[seed], outputs=[english, german])\n", " gr.Examples([\"My name is Clara and I am\"], inputs=[seed])\n", "\n", "if __name__ == \"__main__\":\n", " demo.launch()"]}], "metadata": {}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file +{"cells": [{"cell_type": "markdown", "id": "302934307671667531413257853548643485645", "metadata": {}, "source": ["# Gradio Demo: generate_english_german"]}, {"cell_type": "code", "execution_count": null, "id": "272996653310673477252411125948039410165", "metadata": {}, "outputs": [], "source": ["!pip install -q gradio transformers torch"]}, {"cell_type": "code", "execution_count": null, "id": "288918539441861185822528903084949547379", "metadata": {}, "outputs": [], "source": ["import gradio as gr\n", "\n", "from transformers import pipeline\n", "\n", "english_translator = gr.load(name=\"spaces/gradio/english_translator\")\n", "english_generator = pipeline(\"text-generation\", model=\"distilgpt2\")\n", "\n", "\n", "def generate_text(text):\n", " english_text = english_generator(text)[0][\"generated_text\"]\n", " german_text = english_translator(english_text)\n", " return english_text, german_text\n", "\n", "\n", "with gr.Blocks() as demo:\n", " with gr.Row():\n", " with gr.Column():\n", " seed = gr.Text(label=\"Input Phrase\")\n", " with gr.Column():\n", " english = gr.Text(label=\"Generated English Text\")\n", " german = gr.Text(label=\"Generated German Text\")\n", " btn = gr.Button(\"Generate\")\n", " btn.click(generate_text, inputs=[seed], outputs=[english, german])\n", " gr.Examples([\"My name is Clara and I am\"], inputs=[seed])\n", "\n", "if __name__ == \"__main__\":\n", " demo.launch()"]}], "metadata": {}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/demo/generate_english_german/run.py b/demo/generate_english_german/run.py index ab9d7144a76d..621007e77085 100644 --- a/demo/generate_english_german/run.py +++ b/demo/generate_english_german/run.py @@ -2,7 +2,7 @@ from transformers import pipeline -english_translator = gr.Blocks.load(name="spaces/gradio/english_translator") +english_translator = gr.load(name="spaces/gradio/english_translator") english_generator = pipeline("text-generation", model="distilgpt2") diff --git a/demo/image_classification/run.ipynb b/demo/image_classification/run.ipynb index 434fbbf4ae7e..97e4ed4974cc 100644 --- a/demo/image_classification/run.ipynb +++ b/demo/image_classification/run.ipynb @@ -1 +1 @@ -{"cells": [{"cell_type": "markdown", "id": "302934307671667531413257853548643485645", "metadata": {}, "source": ["# Gradio Demo: image_classification\n", "### Simple image classification in Pytorch with Gradio's Image input and Label output.\n", " "]}, {"cell_type": "code", "execution_count": null, "id": "272996653310673477252411125948039410165", "metadata": {}, "outputs": [], "source": ["!pip install -q gradio torch torchvision"]}, {"cell_type": "code", "execution_count": null, "id": "288918539441861185822528903084949547379", "metadata": {}, "outputs": [], "source": ["# Downloading files from the demo repo\n", "import os\n", "!wget -q https://github.com/gradio-app/gradio/raw/main/demo/image_classification/cheetah.jpg"]}, {"cell_type": "code", "execution_count": null, "id": "44380577570523278879349135829904343037", "metadata": {}, "outputs": [], "source": ["import gradio as gr\n", "import torch\n", "import requests\n", "from torchvision import transforms\n", "\n", "model = torch.hub.load('pytorch/vision:v0.6.0', 'resnet18', pretrained=True).eval()\n", "response = requests.get(\"https://git.io/JJkYN\")\n", "labels = response.text.split(\"\\n\")\n", "\n", "def predict(inp):\n", " inp = transforms.ToTensor()(inp).unsqueeze(0)\n", " with torch.no_grad():\n", " prediction = torch.nn.functional.softmax(model(inp)[0], dim=0)\n", " confidences = {labels[i]: float(prediction[i]) for i in range(1000)} \n", " return confidences\n", "\n", "demo = gr.Interface(fn=predict, \n", " inputs=gr.inputs.Image(type=\"pil\"),\n", " outputs=gr.outputs.Label(num_top_classes=3),\n", " examples=[[\"cheetah.jpg\"]],\n", " )\n", " \n", "demo.launch()"]}], "metadata": {}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file +{"cells": [{"cell_type": "markdown", "id": "302934307671667531413257853548643485645", "metadata": {}, "source": ["# Gradio Demo: image_classification\n", "### Simple image classification in Pytorch with Gradio's Image input and Label output.\n", " "]}, {"cell_type": "code", "execution_count": null, "id": "272996653310673477252411125948039410165", "metadata": {}, "outputs": [], "source": ["!pip install -q gradio torch torchvision"]}, {"cell_type": "code", "execution_count": null, "id": "288918539441861185822528903084949547379", "metadata": {}, "outputs": [], "source": ["# Downloading files from the demo repo\n", "import os\n", "!wget -q https://github.com/gradio-app/gradio/raw/main/demo/image_classification/cheetah.jpg"]}, {"cell_type": "code", "execution_count": null, "id": "44380577570523278879349135829904343037", "metadata": {}, "outputs": [], "source": ["import gradio as gr\n", "import torch\n", "import requests\n", "from torchvision import transforms\n", "\n", "model = torch.hub.load('pytorch/vision:v0.6.0', 'resnet18', pretrained=True).eval()\n", "response = requests.get(\"https://git.io/JJkYN\")\n", "labels = response.text.split(\"\\n\")\n", "\n", "def predict(inp):\n", " inp = transforms.ToTensor()(inp).unsqueeze(0)\n", " with torch.no_grad():\n", " prediction = torch.nn.functional.softmax(model(inp)[0], dim=0)\n", " confidences = {labels[i]: float(prediction[i]) for i in range(1000)} \n", " return confidences\n", "\n", "demo = gr.Interface(fn=predict, \n", " inputs=gr.Image(type=\"pil\"),\n", " outputs=gr.Label(num_top_classes=3),\n", " examples=[[\"cheetah.jpg\"]],\n", " )\n", " \n", "demo.launch()"]}], "metadata": {}, "nbformat": 4, "nbformat_minor": 5} \ No newline at end of file diff --git a/demo/image_classification/run.py b/demo/image_classification/run.py index 9860a9dea5fc..454f94c12369 100644 --- a/demo/image_classification/run.py +++ b/demo/image_classification/run.py @@ -15,8 +15,8 @@ def predict(inp): return confidences demo = gr.Interface(fn=predict, - inputs=gr.inputs.Image(type="pil"), - outputs=gr.outputs.Label(num_top_classes=3), + inputs=gr.Image(type="pil"), + outputs=gr.Label(num_top_classes=3), examples=[["cheetah.jpg"]], ) diff --git a/demo/image_classifier_interpretation/files/imagenet_labels.json b/demo/image_classifier_interpretation/files/imagenet_labels.json deleted file mode 100644 index fa059ceeab5d..000000000000 --- a/demo/image_classifier_interpretation/files/imagenet_labels.json +++ /dev/null @@ -1,1000 +0,0 @@ -["tench", - "goldfish", - "great white shark", - "tiger shark", - "hammerhead shark", - "electric ray", - "stingray", - "cock", - "hen", - "ostrich", - "brambling", - "goldfinch", - "house finch", - "junco", - "indigo bunting", - "American robin", - "bulbul", - "jay", - "magpie", - "chickadee", - "American dipper", - "kite", - "bald eagle", - "vulture", - "great grey owl", - "fire salamander", - "smooth newt", - "newt", - "spotted salamander", - "axolotl", - "American bullfrog", - "tree frog", - "tailed frog", - "loggerhead sea turtle", - "leatherback sea turtle", - "mud turtle", - "terrapin", - "box turtle", - "banded gecko", - "green iguana", - "Carolina anole", - "desert grassland whiptail lizard", - "agama", - "frilled-necked lizard", - "alligator lizard", - "Gila monster", - "European green lizard", - "chameleon", - "Komodo dragon", - "Nile crocodile", - "American alligator", - "triceratops", - "worm snake", - "ring-necked snake", - "eastern hog-nosed snake", - "smooth green snake", - "kingsnake", - "garter snake", - "water snake", - "vine snake", - "night snake", - "boa constrictor", - "African rock python", - "Indian cobra", - "green mamba", - "sea snake", - "Saharan horned viper", - "eastern diamondback rattlesnake", - "sidewinder", - "trilobite", - "harvestman", - "scorpion", - "yellow garden spider", - "barn spider", - "European garden spider", - "southern black widow", - "tarantula", - "wolf spider", - "tick", - "centipede", - "black grouse", - "ptarmigan", - "ruffed grouse", - "prairie grouse", - "peacock", - "quail", - "partridge", - "grey parrot", - "macaw", - "sulphur-crested cockatoo", - "lorikeet", - "coucal", - "bee eater", - "hornbill", - "hummingbird", - "jacamar", - "toucan", - "duck", - "red-breasted merganser", - "goose", - "black swan", - "tusker", - "echidna", - "platypus", - "wallaby", - "koala", - "wombat", - "jellyfish", - "sea anemone", - "brain coral", - "flatworm", - "nematode", - "conch", - "snail", - "slug", - "sea slug", - "chiton", - "chambered nautilus", - "Dungeness crab", - "rock crab", - "fiddler crab", - "red king crab", - "American lobster", - "spiny lobster", - "crayfish", - "hermit crab", - "isopod", - "white stork", - "black stork", - "spoonbill", - "flamingo", - "little blue heron", - "great egret", - "bittern", - "crane (bird)", - "limpkin", - "common gallinule", - "American coot", - "bustard", - "ruddy turnstone", - "dunlin", - "common redshank", - "dowitcher", - "oystercatcher", - "pelican", - "king penguin", - "albatross", - "grey whale", - "killer whale", - "dugong", - "sea lion", - "Chihuahua", - "Japanese Chin", - "Maltese", - "Pekingese", - "Shih Tzu", - "King Charles Spaniel", - "Papillon", - "toy terrier", - "Rhodesian Ridgeback", - "Afghan Hound", - "Basset Hound", - "Beagle", - "Bloodhound", - "Bluetick Coonhound", - "Black and Tan Coonhound", - "Treeing Walker Coonhound", - "English foxhound", - "Redbone Coonhound", - "borzoi", - "Irish Wolfhound", - "Italian Greyhound", - "Whippet", - "Ibizan Hound", - "Norwegian Elkhound", - "Otterhound", - "Saluki", - "Scottish Deerhound", - "Weimaraner", - "Staffordshire Bull Terrier", - "American Staffordshire Terrier", - "Bedlington Terrier", - "Border Terrier", - "Kerry Blue Terrier", - "Irish Terrier", - "Norfolk Terrier", - "Norwich Terrier", - "Yorkshire Terrier", - "Wire Fox Terrier", - "Lakeland Terrier", - "Sealyham Terrier", - "Airedale Terrier", - "Cairn Terrier", - "Australian Terrier", - "Dandie Dinmont Terrier", - "Boston Terrier", - "Miniature Schnauzer", - "Giant Schnauzer", - "Standard Schnauzer", - "Scottish Terrier", - "Tibetan Terrier", - "Australian Silky Terrier", - "Soft-coated Wheaten Terrier", - "West Highland White Terrier", - "Lhasa Apso", - "Flat-Coated Retriever", - "Curly-coated Retriever", - "Golden Retriever", - "Labrador Retriever", - "Chesapeake Bay Retriever", - "German Shorthaired Pointer", - "Vizsla", - "English Setter", - "Irish Setter", - "Gordon Setter", - "Brittany", - "Clumber Spaniel", - "English Springer Spaniel", - "Welsh Springer Spaniel", - "Cocker Spaniels", - "Sussex Spaniel", - "Irish Water Spaniel", - "Kuvasz", - "Schipperke", - "Groenendael", - "Malinois", - "Briard", - "Australian Kelpie", - "Komondor", - "Old English Sheepdog", - "Shetland Sheepdog", - "collie", - "Border Collie", - "Bouvier des Flandres", - "Rottweiler", - "German Shepherd Dog", - "Dobermann", - "Miniature Pinscher", - "Greater Swiss Mountain Dog", - "Bernese Mountain Dog", - "Appenzeller Sennenhund", - "Entlebucher Sennenhund", - "Boxer", - "Bullmastiff", - "Tibetan Mastiff", - "French Bulldog", - "Great Dane", - "St. Bernard", - "husky", - "Alaskan Malamute", - "Siberian Husky", - "Dalmatian", - "Affenpinscher", - "Basenji", - "pug", - "Leonberger", - "Newfoundland", - "Pyrenean Mountain Dog", - "Samoyed", - "Pomeranian", - "Chow Chow", - "Keeshond", - "Griffon Bruxellois", - "Pembroke Welsh Corgi", - "Cardigan Welsh Corgi", - "Toy Poodle", - "Miniature Poodle", - "Standard Poodle", - "Mexican hairless dog", - "grey wolf", - "Alaskan tundra wolf", - "red wolf", - "coyote", - "dingo", - "dhole", - "African wild dog", - "hyena", - "red fox", - "kit fox", - "Arctic fox", - "grey fox", - "tabby cat", - "tiger cat", - "Persian cat", - "Siamese cat", - "Egyptian Mau", - "cougar", - "lynx", - "leopard", - "snow leopard", - "jaguar", - "lion", - "tiger", - "cheetah", - "brown bear", - "American black bear", - "polar bear", - "sloth bear", - "mongoose", - "meerkat", - "tiger beetle", - "ladybug", - "ground beetle", - "longhorn beetle", - "leaf beetle", - "dung beetle", - "rhinoceros beetle", - "weevil", - "fly", - "bee", - "ant", - "grasshopper", - "cricket", - "stick insect", - "cockroach", - "mantis", - "cicada", - "leafhopper", - "lacewing", - "dragonfly", - "damselfly", - "red admiral", - "ringlet", - "monarch butterfly", - "small white", - "sulphur butterfly", - "gossamer-winged butterfly", - "starfish", - "sea urchin", - "sea cucumber", - "cottontail rabbit", - "hare", - "Angora rabbit", - "hamster", - "porcupine", - "fox squirrel", - "marmot", - "beaver", - "guinea pig", - "common sorrel", - "zebra", - "pig", - "wild boar", - "warthog", - "hippopotamus", - "ox", - "water buffalo", - "bison", - "ram", - "bighorn sheep", - "Alpine ibex", - "hartebeest", - "impala", - "gazelle", - "dromedary", - "llama", - "weasel", - "mink", - "European polecat", - "black-footed ferret", - "otter", - "skunk", - "badger", - "armadillo", - "three-toed sloth", - "orangutan", - "gorilla", - "chimpanzee", - "gibbon", - "siamang", - "guenon", - "patas monkey", - "baboon", - "macaque", - "langur", - "black-and-white colobus", - "proboscis monkey", - "marmoset", - "white-headed capuchin", - "howler monkey", - "titi", - "Geoffroy's spider monkey", - "common squirrel monkey", - "ring-tailed lemur", - "indri", - "Asian elephant", - "African bush elephant", - "red panda", - "giant panda", - "snoek", - "eel", - "coho salmon", - "rock beauty", - "clownfish", - "sturgeon", - "garfish", - "lionfish", - "pufferfish", - "abacus", - "abaya", - "academic gown", - "accordion", - "acoustic guitar", - "aircraft carrier", - "airliner", - "airship", - "altar", - "ambulance", - "amphibious vehicle", - "analog clock", - "apiary", - "apron", - "waste container", - "assault rifle", - "backpack", - "bakery", - "balance beam", - "balloon", - "ballpoint pen", - "Band-Aid", - "banjo", - "baluster", - "barbell", - "barber chair", - "barbershop", - "barn", - "barometer", - "barrel", - "wheelbarrow", - "baseball", - "basketball", - "bassinet", - "bassoon", - "swimming cap", - "bath towel", - "bathtub", - "station wagon", - "lighthouse", - "beaker", - "military cap", - "beer bottle", - "beer glass", - "bell-cot", - "bib", - "tandem bicycle", - "bikini", - "ring binder", - "binoculars", - "birdhouse", - "boathouse", - "bobsleigh", - "bolo tie", - "poke bonnet", - "bookcase", - "bookstore", - "bottle cap", - "bow", - "bow tie", - "brass", - "bra", - "breakwater", - "breastplate", - "broom", - "bucket", - "buckle", - "bulletproof vest", - "high-speed train", - "butcher shop", - "taxicab", - "cauldron", - "candle", - "cannon", - "canoe", - "can opener", - "cardigan", - "car mirror", - "carousel", - "tool kit", - "carton", - "car wheel", - "automated teller machine", - "cassette", - "cassette player", - "castle", - "catamaran", - "CD player", - "cello", - "mobile phone", - "chain", - "chain-link fence", - "chain mail", - "chainsaw", - "chest", - "chiffonier", - "chime", - "china cabinet", - "Christmas stocking", - "church", - "movie theater", - "cleaver", - "cliff dwelling", - "cloak", - "clogs", - "cocktail shaker", - "coffee mug", - "coffeemaker", - "coil", - "combination lock", - "computer keyboard", - "confectionery store", - "container ship", - "convertible", - "corkscrew", - "cornet", - "cowboy boot", - "cowboy hat", - "cradle", - "crane (machine)", - "crash helmet", - "crate", - "infant bed", - "Crock Pot", - "croquet ball", - "crutch", - "cuirass", - "dam", - "desk", - "desktop computer", - "rotary dial telephone", - "diaper", - "digital clock", - "digital watch", - "dining table", - "dishcloth", - "dishwasher", - "disc brake", - "dock", - "dog sled", - "dome", - "doormat", - "drilling rig", - "drum", - "drumstick", - "dumbbell", - "Dutch oven", - "electric fan", - "electric guitar", - "electric locomotive", - "entertainment center", - "envelope", - "espresso machine", - "face powder", - "feather boa", - "filing cabinet", - "fireboat", - "fire engine", - "fire screen sheet", - "flagpole", - "flute", - "folding chair", - "football helmet", - "forklift", - "fountain", - "fountain pen", - "four-poster bed", - "freight car", - "French horn", - "frying pan", - "fur coat", - "garbage truck", - "gas mask", - "gas pump", - "goblet", - "go-kart", - "golf ball", - "golf cart", - "gondola", - "gong", - "gown", - "grand piano", - "greenhouse", - "grille", - "grocery store", - "guillotine", - "barrette", - "hair spray", - "half-track", - "hammer", - "hamper", - "hair dryer", - "hand-held computer", - "handkerchief", - "hard disk drive", - "harmonica", - "harp", - "harvester", - "hatchet", - "holster", - "home theater", - "honeycomb", - "hook", - "hoop skirt", - "horizontal bar", - "horse-drawn vehicle", - "hourglass", - "iPod", - "clothes iron", - "jack-o'-lantern", - "jeans", - "jeep", - "T-shirt", - "jigsaw puzzle", - "pulled rickshaw", - "joystick", - "kimono", - "knee pad", - "knot", - "lab coat", - "ladle", - "lampshade", - "laptop computer", - "lawn mower", - "lens cap", - "paper knife", - "library", - "lifeboat", - "lighter", - "limousine", - "ocean liner", - "lipstick", - "slip-on shoe", - "lotion", - "speaker", - "loupe", - "sawmill", - "magnetic compass", - "mail bag", - "mailbox", - "tights", - "tank suit", - "manhole cover", - "maraca", - "marimba", - "mask", - "match", - "maypole", - "maze", - "measuring cup", - "medicine chest", - "megalith", - "microphone", - "microwave oven", - "military uniform", - "milk can", - "minibus", - "miniskirt", - "minivan", - "missile", - "mitten", - "mixing bowl", - "mobile home", - "Model T", - "modem", - "monastery", - "monitor", - "moped", - "mortar", - "square academic cap", - "mosque", - "mosquito net", - "scooter", - "mountain bike", - "tent", - "computer mouse", - "mousetrap", - "moving van", - "muzzle", - "nail", - "neck brace", - "necklace", - "nipple", - "notebook computer", - "obelisk", - "oboe", - "ocarina", - "odometer", - "oil filter", - "organ", - "oscilloscope", - "overskirt", - "bullock cart", - "oxygen mask", - "packet", - "paddle", - "paddle wheel", - "padlock", - "paintbrush", - "pajamas", - "palace", - "pan flute", - "paper towel", - "parachute", - "parallel bars", - "park bench", - "parking meter", - "passenger car", - "patio", - "payphone", - "pedestal", - "pencil case", - "pencil sharpener", - "perfume", - "Petri dish", - "photocopier", - "plectrum", - "Pickelhaube", - "picket fence", - "pickup truck", - "pier", - "piggy bank", - "pill bottle", - "pillow", - "ping-pong ball", - "pinwheel", - "pirate ship", - "pitcher", - "hand plane", - "planetarium", - "plastic bag", - "plate rack", - "plow", - "plunger", - "Polaroid camera", - "pole", - "police van", - "poncho", - "billiard table", - "soda bottle", - "pot", - "potter's wheel", - "power drill", - "prayer rug", - "printer", - "prison", - "projectile", - "projector", - "hockey puck", - "punching bag", - "purse", - "quill", - "quilt", - "race car", - "racket", - "radiator", - "radio", - "radio telescope", - "rain barrel", - "recreational vehicle", - "reel", - "reflex camera", - "refrigerator", - "remote control", - "restaurant", - "revolver", - "rifle", - "rocking chair", - "rotisserie", - "eraser", - "rugby ball", - "ruler", - "running shoe", - "safe", - "safety pin", - "salt shaker", - "sandal", - "sarong", - "saxophone", - "scabbard", - "weighing scale", - "school bus", - "schooner", - "scoreboard", - "CRT screen", - "screw", - "screwdriver", - "seat belt", - "sewing machine", - "shield", - "shoe store", - "shoji", - "shopping basket", - "shopping cart", - "shovel", - "shower cap", - "shower curtain", - "ski", - "ski mask", - "sleeping bag", - "slide rule", - "sliding door", - "slot machine", - "snorkel", - "snowmobile", - "snowplow", - "soap dispenser", - "soccer ball", - "sock", - "solar thermal collector", - "sombrero", - "soup bowl", - "space bar", - "space heater", - "space shuttle", - "spatula", - "motorboat", - "spider web", - "spindle", - "sports car", - "spotlight", - "stage", - "steam locomotive", - "through arch bridge", - "steel drum", - "stethoscope", - "scarf", - "stone wall", - "stopwatch", - "stove", - "strainer", - "tram", - "stretcher", - "couch", - "stupa", - "submarine", - "suit", - "sundial", - "sunglass", - "sunglasses", - "sunscreen", - "suspension bridge", - "mop", - "sweatshirt", - "swimsuit", - "swing", - "switch", - "syringe", - "table lamp", - "tank", - "tape player", - "teapot", - "teddy bear", - "television", - "tennis ball", - "thatched roof", - "front curtain", - "thimble", - "threshing machine", - "throne", - "tile roof", - "toaster", - "tobacco shop", - "toilet seat", - "torch", - "totem pole", - "tow truck", - "toy store", - "tractor", - "semi-trailer truck", - "tray", - "trench coat", - "tricycle", - "trimaran", - "tripod", - "triumphal arch", - "trolleybus", - "trombone", - "tub", - "turnstile", - "typewriter keyboard", - "umbrella", - "unicycle", - "upright piano", - "vacuum cleaner", - "vase", - "vault", - "velvet", - "vending machine", - "vestment", - "viaduct", - "violin", - "volleyball", - "waffle iron", - "wall clock", - "wallet", - "wardrobe", - "military aircraft", - "sink", - "washing machine", - "water bottle", - "water jug", - "water tower", - "whiskey jug", - "whistle", - "wig", - "window screen", - "window shade", - "Windsor tie", - "wine bottle", - "wing", - "wok", - "wooden spoon", - "wool", - "split-rail fence", - "shipwreck", - "yawl", - "yurt", - "website", - "comic book", - "crossword", - "traffic sign", - "traffic light", - "dust jacket", - "menu", - "plate", - "guacamole", - "consomme", - "hot pot", - "trifle", - "ice cream", - "ice pop", - "baguette", - "bagel", - "pretzel", - "cheeseburger", - "hot dog", - "mashed potato", - "cabbage", - "broccoli", - "cauliflower", - "zucchini", - "spaghetti squash", - "acorn squash", - "butternut squash", - "cucumber", - "artichoke", - "bell pepper", - "cardoon", - "mushroom", - "Granny Smith", - "strawberry", - "orange", - "lemon", - "fig", - "pineapple", - "banana", - "jackfruit", - "custard apple", - "pomegranate", - "hay", - "carbonara", - "chocolate syrup", - "dough", - "meatloaf", - "pizza", - "pot pie", - "burrito", - "red wine", - "espresso", - "cup", - "eggnog", - "alp", - "bubble", - "cliff", - "coral reef", - "geyser", - "lakeshore", - "promontory", - "shoal", - "seashore", - "valley", - "volcano", - "baseball player", - "bridegroom", - "scuba diver", - "rapeseed", - "daisy", - "yellow lady's slipper", - "corn", - "acorn", - "rose hip", - "horse chestnut seed", - "coral fungus", - "agaric", - "gyromitra", - "stinkhorn mushroom", - "earth star", - "hen-of-the-woods", - "bolete", - "ear", - "toilet paper"] \ No newline at end of file diff --git a/demo/image_classifier_interpretation/images/cheetah1.jpg b/demo/image_classifier_interpretation/images/cheetah1.jpg deleted file mode 100644 index c510ff30e09c1ce410afa499f0bfc3a63c751134..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20552 zcma%ib8ux(^yiChy%_Jsw(VqM+qUfqC(b09cw%#6O>Eot#P;lbe_Ok?f9~nJRk!Ng zKIe0*x~o42{deW>4gg(FN>&O00RaF&{2PG3>i}^8EHpGU3^XhZ3@ifdzXu5(78V`} z84(c)5fK?3`F{i*85Ip34HX#+3mY2?i-?erkcjmE%6~>6;Naj;kWql>=s*G-3>0 ztNj0c`P&1)fd3B@6a)qU5(5GX1LE%hfao7i7>NJi{vUybgo1{Fg8;z)(+Z&jAR(Zj zAphb2?+>8 9 z&By=G+y86)f6s^cr(*gC;-5f3|K|Yaf1E==VnC5&vWh}uQK+z)xQK zcMX6H1@R9x6b3*TfM!=Lu)q^%W_oP}y;P_(>Zpu*uZm=ja16)koli*CHjZgKl7i`S zstpHUWzxV~WwxP=urY&(u3&}$q6k*3xRdA)@vau(&s;Ez?6PC+D_n|_S`)S%BBYfV z4qXB?0kOqs2zvM>fwC9c)R5+TVSvjGRn|ylW!5F}7}{W2V4)?tVSRjM-h?LW+)EW~ zG@5shv#o%_i1Z}x6Ko5VE1% &0(dSUx<`R5N0em>~jR8W00*EX6-?H;)C_ZZ 06h3STfrFg4gWu KO6XSxs|DlNHy078>(#3?4!3%P;L#_+-@cO(@f)WtCYuBNSOeB$3B~w6^m%n0 z*ohlDxO)6$YZzdLT$XLr-TpFrN44h&QS2pK3O1 k{DIA8`m*1}B(pCli*y`c8sEfUk#0 z<0n>;CY76maW<03zz4rvYj-ZcH+JV-oy@+zBk#G(g*>f_%+O?|;xi6xSRiMdn8cDh zO(7cx%@G&ncPQi-_C)PtXU=JXxWWQ-+0Wqw10x&!urD+2hjo!r4n<-U0bvRc|B(5H zW(Q71;*PC5MFntKX+H$U%zq!5uHU1=-lSeY;)W9THD6rAi!V>7-W~4GZ8)7KEGbI) z(wZpHJW6k&`UP;dIs7B!&l8T!kzGA?wD4z882z7w2x67lTgi7Za>nX@hn9}WsaVg; zUNUFtt#%MUZ!zM@w;~(xmQA`8NU-`mVr!4F=a#E{<@n<2kFL`fYvyF;;uE{&WSAKA z8@5eRRwyBfM8H*S;za8P+Oh1o_|1ywY#th(a-J&p&yj`!b%{btbMrNIhz~N_(T5Kk zy;s6gdzQ9mdCMmf%FaNBx~PMgeF&MgEpwC0@r{|ApRS$;r+)#c?jJ(x=tVXtN$Cfa zWb}hh?ycUi!o~0X91SHAu^C2g*T=G%2&!um5lb=|{^*c>DWqHv_pi}_-2NCte@||t z8G^q6c+91j+=D{hHJNYDYz8@Qt $kG_sw?#A_YTs4JyWLpsO!XcCqzb{ER=ls*6l4i}Xtb8G7i6d# zi@Cb1oH1iae*qDEb;*;uETg8=45Eam=F%Rqs8YjpVNl6-3^#wyt->Dxc3qTSPN0z) zU{PKl#Wn!PM~i1a_Hr!gBIYz+V#+Hnb>7;|5m6+;+*F5BfEG+^VMzp$i+8111P2Lj z))Pl=MM|fSEt^Kfquwx{t>Z~tW5ed+vA+;L<>44OQHtyc*{YMS;>eNuG{Fh4YEi|k zYydO44nwuH6}!sUm9@;s+FbWnGodun7Hu*vE>zXiONnua1o$NYVBvT# yK+OA zYJz`&H-@k@$kZINxqEezG{B>fIHlds1g8=kgtAE@HKQ|;rdD?$%1-(rH3272B8;`x zUk97StuAxTcsWMO@>KB%88gl&Xu?TwU9RBO`GVv>=3~=%h~1_@Pp8xMt@JR`Ot=Rm zKbs{Q uISDGl!qggcciqeIA+(s6Q3$HMn$dE}v;YVYy&R z`)Hmq8H289R%YKtd-TphC>v8M@S$TiZ rW4bCSVO (-8R4=lEbMO@aM=jPW&yY6TLyY!<4P~*U z 6tHV{eq{GEhmG{>4r<+Pci_PVy_8y1Gv1>}SdC<=wS!$l?Qr||x>f~&V zlcUJ|n!<7hHOr-yk}I4cbsRFHgLpKKsck)D6{+eX4=w5Yf(c(W#Y_WPyhBp0b|;XN z@x&18G@*Y%=zT*_B8hcze)Dtj5+3_R!x=1xCBw}S01%ec@+$qC<1gUUv;)WLglbL* z%v90*il^L5{83X>f}L`+^NPtIroUQuqiKYE@c|)>6^L)sZd?5rfA*+4-ptrpC2nIG zm$jTLD(tK8qdh;6`O2oOsCXXAzpOGu9|OxHa-lsUdm&;<9UZnE<7y=l#sMkQ;Oe-y z9(xHj!Pc4WDkupe5X>@dN7C*jL!w}?E)_6_Xhahcq@T1s@YRwDV@Lp3h4jOK1x8rp zpUB-#U<|~2g`@@G{mtXKR_SrIf24#Xj5iA#-V-T|BzZ74QcxKixYZ@|5_ZO{JRW<1 zqDEJhs`T^*NbpSVB&wti;uZ0NSvU6A(xaB(3`TBtemYE`MeYSq{u%|`HhI%iQ~8cz zXPW!mzzf8)=>*~8wGHZ}$VD|~G1tVM(_`bVLsr7-{TNwsWkVyC75u@1!}XpZwlreY z=P=`~T#<*36|V3XpeeZQLFW*j&uvz8Zy-cdQ!_Dl(I*o*;h9~r<8oL*<2Z1*lQ-vE z5_7Hp4gTPTM tPS +M8l{9S2xBClr2c ziMC2o KOQo`q5*RbI^nF5ql9(Mut4ydN{mU)xK0G>`O~+Z4uIk zF<^E4=-i+>hv*N|+z->g8#+7bBsgWsMY1l5Mya03+!9T5^ qjH znQ4r;MEZRgj@<7IbpqnSC;b{ur2gDmw`Pt0oHu{7y-xX11h(axz+c2;1Z%IU=k;%& zU1fHYDyOU@4_Z%^)XgtiApvD@WO70%zfqyWJs2b7K5$<8`X|}w9KA-#8ep%Lq?<3< zI9NEBf!7 U+Kl zd<`@kf0}gljT<=YJIyS +z{I{fc=`smT+|a_I6@0S1{ZQJm?J z$ZC9X$^Hrl%DqZ(`4gif3q#=szJovdr5SZ$r3$eTTZ#{TJ+ctvKC~y_9`PE$xf`km z-N2&4t6x!16b-;%KYe^#BxgLArKprW=@N9x4^Wiu&aqHS $|mMX*v=Q7=N&VR6jO}{EGodE)c z46gg;RO|~aq>VkTwIxwgSr@PlFRMpF z_ej*s?Z10a*9pg@_040H4=+|ZfPW2chA(_otm^qe=&0n>_dLRZy$BaE#EHaD_`@>Z zTSCcMWmf`fY@g03J2p1y W+CyH$gJ(b3XyI17$GGpD)Ah3IKO5{e7!CYqJ$1Y zVpP4=sdhBYT|-A|JZ3`)eo?bZe|!)3_5QG^ P(@72qsJ35xbBer1*pATyZkXgA1g`; zl$}D+mCC;^%ulANp6aUv%ULE#L&tj_r2Nr0tXzDSRwPxb |A>lV *ogNjK{q7Qz#a`FCcwiqj`rASqsCe0 z{aQqRk C1G`AmjKA&p+q^v9IVCIWmq-X-oA1L6toy!K79&_SL(Hy(~^WCrf z%R!3c+$eT^1QcTSKHLqxaoB}?rnp)Bq{0>rBR7o?_0S!V*Ks}c=1MKLkt0dm%yOyk zkCvZD{E^69HZp79ZO{gy_0(#%om7Bbkb90(p^?m&AZ`cRBv+-R>|}V-`C*E3=E0N% z%kc6OU55kwPUS7I{zz$J)Ij0m9Xjwc6^E?`I?KRJNd=}8rrQvln2!|NtA_E*Y#oln zhs@c6TEoHOrEEn)m!sWISuU~Iv*NC2{eiVqZ6zKWErQ@{d)LR}M6aHGF-4SlVfS3j zz5tBGg*4S93Spl7I5J xs33mgT(O$2V<=#K`;F?!ru2$j#=2v*8k@JoP(7L+}Y ziQf|bg>yDWq5kvk6Iq6*OjVuTK0-dLAbt~9F`}@%0cU<^{$+JRbyb|5bel9m*6T{c zrjD0yInhvcX_TI98TeBc4Db)ryuinz(X;h9Nm!t&=Vq3cg0-(kc*UR-{&61n?`kxK zIKi$4om=@~k>5k>Z|bKJbvB+|y?+7gk=NrDPoqE{;z?h0`Q#6xT>RUkQsTW0nzoD* zuQ+YY!MY-2nuABkj`?57av4BM2+6NcAAg`Vr)Yv>q^tp#+fBxW+X{dZf_s#E#J>P) zUX6H9LIl!SPtw|A*Vi9D`~e(IqJfpLy-fu-AX1r8t?38jY$A1R4vlf++(Pe+AnbZc zLarTJOHiy|W|f&3mx`Y50Cyu+lvPT5Dm7t3De>onU4e%^%`68}S#?6xIAbq=jG0|P zhTg?lNgH)4mwP{il<^MMVCoDtIz#Ebdcwh1T(#~?l&0 U$?-DO$c2(mg zBH3`$OZ1MRbs@ 9eD~yNx zu&Yqon=-GE3NP#j^Xa>sq3x$K{Gn_43y6NN;Cb37dtD|4)kaO`vrG{iD;MkR0g|4d z?41LqLF+i*gZHEsnNiN#EK#rv?Rb>uQlUu4w?h(i1I1iu`KYE0*i}2lNa$_Q-aBO2 zCMI}x{c?rr8gdE*XfrLp1??#6`E`EXT}dbe36Q`EHSzW~3RqUnbF`UTpfS^lsFPhn zdu_;)q)zvi)^DWf66XB0iFs+^Chub58A3Dpd>Blk=QDAai!e7RlcheTDFlJKg|>aY z$I8AJY>lmd;Lg-_hHg@(d-EHm!7V$w!V1&Pg D)DKap}rfx;p4gE_7|XH zpiPl}t3)5P0%f6aQ7>0pKO}u&0LN0SXbtq19E1YJ{wOe|2+@W^W!3KY;eAs e|a)8#o+OJ y}cG6jOJ*s B}T?h*|k1e7Fq_NP%0Pv6)Y&sH*V=mx)2C
e1OU{+HeYucNj0 N@DJQ&wm{0`q$1G5|c3bQpl(YCKcJV`oPU@p((p78zP72!bo zV$0#b09Vk(^l9dAQGbVdDkS7(L!!%GT-rns`1fb&JIKqzari=Y9F3-k_z`b(2^SBq zQZQ#Xu4FnIE0)H7C!`}O=Ekj@R_AnAu8e7(3Dg$p>JzY0-%r|>AFug!oP?nv)SCqY zX2YdP%30{SCff(}{wvej3VTD;84(1(V#ORR6#&35)xy_>DrZdCw$*g8nU{Bd14)=( zgbtXs^+gB-R5r6Uy78z9eR)nmlwaUh69-R4IUnhe828T%f_$`tN@LD@iyL@7d!hBw zx(o_HH~Z8a_|fp=a%K|{Rgh(zECn4gy@V!Vlg9CqUKBh67CvwQqE9nyT}1auQgIf2 zZ4vX7BT @BDer8um=fin^lSa>DZyT^kE3XknG 8B~$zk!+Z*EL1he z1iZ79AU5*oVwwdsrK#j*Qy;jM&Xzn2-ZW#SIchX!Xg1(HkVSX3fVEOAvweqMS&`y~ z?%(-f xqV(|1(A^k8R>Qm()0;*6wp(AFCMN$gC?&bzG lowXu_|N z#UFeOyeB;zrig5*>-=h O3GtyAS zo0Y9Tcfnr1@55S*;NsvJCY0S`z%JU{+|?YjuL2KB9B8w2efL>;sp~eBbbhT>Axic) z0S R0#+qxl>|;qNB%6#(8I2r4HpiYU?t@UTU05P{=6lDm+DvTx6)NGRd5}8kQ98 z<|f*oKX-Yog~QgjFfv4w=U4F9PK=%AGl{hg6Y~GZ#(z}YrY{n`tKAABDY$TrVq+W2 zWA- R6E;XNK8$UwWW%pdLL*?PxN24DuG4LV-Bfr*WRV*s$GceB$%e(`-8Is%79-f zhB^9X=U97wnzX=ih=CkfzX{^0x76i;QwE&To_z>iR7VLVU8a60SycW7pr?r<;DbQ) z;mW-KHtBROR|kK7l2Ei4w{^k#OUS-|Sa7ij@e~~I`>DFL8*xWB%c&H hhxxZXG-$I-0ufD@ip zX~y*Zx>2o-(qAm*mIv6&14zAu@#V3w!qxtaJ;PcgretkO8 clp*m742KjDZ~HFYDG5J zL@cHy-P)01x>h<)Fw{x&Kn7d<;O155>s>MXb1eh(HAC(a{POD_`K2MCGLu@~LgV8A zjs9mkT4OuzPVDQBOP+2i22t!I;X`0?nzTL58iHYe_iT&@fmpM(uVHaBd$KdE*A6m~ zbI;@On_52bVxn#u-7Wb UqTRE0fls|av&qLS>e*68BSMbI@!Ydsuy<$nfk$xp?ma#4mQ*Qq--vXeHNC<& zOgqHk-hk~4jX$Exd1_2A4IT~AHLy@+@WeRx(TKV#MR!JNJ_jE*vb5hVa0~kus&Rzv zQv0^YTsZy4Z&~w83|+jn=r5Vm%cL;nU$g>MkG*n3B9v_Vxv<=3Yn=%ySysg{@J9U- z0dPiLGfWmb6jOh=kb~iShrocG-?n#xVhZJ;7D9i0g$N$gOt$OP+egrp6n`ihX|*QL z_te^3H#rABD*>4~5qy7X5{Jm~gz >)tm>Zr7iChQq&6n)%h5|&Qmx-thE+QKJhK`g |*|)X>3t(#a5mIO#b7CYRkfC)T4vFrijqb=%!4q4oEIL zPKCK{fmH#z<9VUh8vB#ep7B55fQPLu$ui0G>ai(Alwnwx$HZM7TGVvXT7)zQ%ef@g z5o_>k)~2z^N#*1Tf%w1iN^H71!b1+qRSMU)9$=0mvGkB+vS~Ffjj)-xF^0>^OOnqm ztHKuehzP9AOT#6k~w_ilE+Jr26JlV#P(@BG@**FJN-W;DE* zY~|@iicKXcgles&UgS?YF+Q0&`X0UtZ#iwu;xY|J9VQtniqU3X$Si0)1Hk%3fF*c( zNmQoo_j2KNSQP!FvG7$ym{!cf+NJ_}_NtO_`*P@Y8k09fsR78iPJ=@%g1jYrNbnb% z1h^=N-zyTO1O&>?(TE43@P7~bT#?OQWUkh2vqigW0sDPYvxK^{HC$w)!9R@V0{BZe zPwJvmrY`pVhoS6}Lfei(7lxUmepY!jO+|XsIHgK($wNaRhM#cROsuh=2bqVHDJLiW zNayAA?$y%D3;VxQ!x|k@z*Qt_d3{}>5NoZJRF6|9l8hj$Sq{6l#ysTk(8aq>mQf3k zkg7}L@lxkeG50IqMj`3J)P*k>Q_cc&Q&yH5<-nx`R?lQJr{%aai@;VB@~>l+E@EIo z;cu$++2v_xugaX9Og5pEbHb&_lGHCo8aM+j%Y_|! 1pBxUx~+UhV>=jyL^0JD;Sn@4;ZCSEcUhe0hOo=nm7+&}=Q&fty2 zKILepz86<|y*TB>6PFSMIg)fco6D3pdC1cwV+EnLn<^KhqhpH0LX6bOtT#hfmrK%C zQ=wA<%;ZY~tK5LR>rVy%pu;aE&)>6he?*!}_@`g>P)5GHP;Hgodi!=G)fPURIeCph zN5(dI*ZW^F<}AWcnxlRmrW?I!vqi4o#o2oUa|!1&d52mkE2A=n({* Sx3m{^qO?66U_S