PNG  IHDRX cHRMz&u0`:pQ<bKGD pHYsodtIME MeqIDATxw]Wug^Qd˶ 6`!N:!@xI~)%7%@Bh&`lnjVF29gΨ4E$|>cɚ{gk= %,a KX%,a KX%,a KX%,a KX%,a KX%,a KX%, b` ǟzeאfp]<!SJmɤY޲ڿ,%c ~ع9VH.!Ͳz&QynֺTkRR.BLHi٪:l;@(!MԴ=žI,:o&N'Kù\vRmJ雵֫AWic H@" !: Cé||]k-Ha oݜ:y F())u]aG7*JV@J415p=sZH!=!DRʯvɱh~V\}v/GKY$n]"X"}t@ xS76^[bw4dsce)2dU0 CkMa-U5tvLƀ~mlMwfGE/-]7XAƟ`׮g ewxwC4\[~7@O-Q( a*XGƒ{ ՟}$_y3tĐƤatgvێi|K=uVyrŲlLӪuܿzwk$m87k( `múcE)"@rK( z4$D; 2kW=Xb$V[Ru819קR~qloѱDyįݎ*mxw]y5e4K@ЃI0A D@"BDk_)N\8͜9dz"fK0zɿvM /.:2O{ Nb=M=7>??Zuo32 DLD@D| &+֎C #B8ַ`bOb $D#ͮҪtx]%`ES`Ru[=¾!@Od37LJ0!OIR4m]GZRJu$‡c=%~s@6SKy?CeIh:[vR@Lh | (BhAMy=݃  G"'wzn޺~8ԽSh ~T*A:xR[ܹ?X[uKL_=fDȊ؂p0}7=D$Ekq!/t.*2ʼnDbŞ}DijYaȲ(""6HA;:LzxQ‘(SQQ}*PL*fc\s `/d'QXW, e`#kPGZuŞuO{{wm[&NBTiiI0bukcA9<4@SӊH*؎4U/'2U5.(9JuDfrޱtycU%j(:RUbArLֺN)udA':uGQN"-"Is.*+k@ `Ojs@yU/ H:l;@yyTn}_yw!VkRJ4P)~y#)r,D =ě"Q]ci'%HI4ZL0"MJy 8A{ aN<8D"1#IJi >XjX֔#@>-{vN!8tRݻ^)N_╗FJEk]CT՟ YP:_|H1@ CBk]yKYp|og?*dGvzنzӴzjֺNkC~AbZƷ`.H)=!QͷVTT(| u78y֮}|[8-Vjp%2JPk[}ԉaH8Wpqhwr:vWª<}l77_~{s۴V+RCģ%WRZ\AqHifɤL36: #F:p]Bq/z{0CU6ݳEv_^k7'>sq*+kH%a`0ԣisqにtү04gVgW΂iJiS'3w.w}l6MC2uԯ|>JF5`fV5m`Y**Db1FKNttu]4ccsQNnex/87+}xaUW9y>ͯ骵G{䩓Գ3+vU}~jJ.NFRD7<aJDB1#ҳgSb,+CS?/ VG J?|?,2#M9}B)MiE+G`-wo߫V`fio(}S^4e~V4bHOYb"b#E)dda:'?}׮4繏`{7Z"uny-?ǹ;0MKx{:_pÚmFמ:F " .LFQLG)Q8qN q¯¯3wOvxDb\. BKD9_NN &L:4D{mm o^tֽ:q!ƥ}K+<"m78N< ywsard5+вz~mnG)=}lYݧNj'QJS{S :UYS-952?&O-:W}(!6Mk4+>A>j+i|<<|;ر^߉=HE|V#F)Emm#}/"y GII웻Jі94+v뾧xu~5C95~ūH>c@덉pʃ1/4-A2G%7>m;–Y,cyyaln" ?ƻ!ʪ<{~h~i y.zZB̃/,雋SiC/JFMmBH&&FAbϓO^tubbb_hZ{_QZ-sύodFgO(6]TJA˯#`۶ɟ( %$&+V'~hiYy>922 Wp74Zkq+Ovn錄c>8~GqܲcWꂎz@"1A.}T)uiW4="jJ2W7mU/N0gcqܗOO}?9/wìXžΏ0 >֩(V^Rh32!Hj5`;O28؇2#ݕf3 ?sJd8NJ@7O0 b־?lldщ̡&|9C.8RTWwxWy46ah嘦mh٤&l zCy!PY?: CJyв]dm4ǜҐR޻RլhX{FƯanшQI@x' ao(kUUuxW_Ñ줮[w8 FRJ(8˼)_mQ _!RJhm=!cVmm ?sFOnll6Qk}alY}; "baӌ~M0w,Ggw2W:G/k2%R,_=u`WU R.9T"v,<\Ik޽/2110Ӿxc0gyC&Ny޽JҢrV6N ``یeA16"J³+Rj*;BϜkZPJaÍ<Jyw:NP8/D$ 011z֊Ⱳ3ι֘k1V_"h!JPIΣ'ɜ* aEAd:ݺ>y<}Lp&PlRfTb1]o .2EW\ͮ]38؋rTJsǏP@芎sF\> P^+dYJLbJ C-xϐn> ι$nj,;Ǖa FU *择|h ~izť3ᤓ`K'-f tL7JK+vf2)V'-sFuB4i+m+@My=O҈0"|Yxoj,3]:cо3 $#uŘ%Y"y죯LebqtҢVzq¼X)~>4L׶m~[1_k?kxֺQ`\ |ٛY4Ѯr!)N9{56(iNq}O()Em]=F&u?$HypWUeB\k]JɩSع9 Zqg4ZĊo oMcjZBU]B\TUd34ݝ~:7ڶSUsB0Z3srx 7`:5xcx !qZA!;%͚7&P H<WL!džOb5kF)xor^aujƍ7 Ǡ8/p^(L>ὴ-B,{ۇWzֺ^k]3\EE@7>lYBȝR.oHnXO/}sB|.i@ɥDB4tcm,@ӣgdtJ!lH$_vN166L__'Z)y&kH;:,Y7=J 9cG) V\hjiE;gya~%ks_nC~Er er)muuMg2;֫R)Md) ,¶ 2-wr#F7<-BBn~_(o=KO㭇[Xv eN_SMgSҐ BS헃D%g_N:/pe -wkG*9yYSZS.9cREL !k}<4_Xs#FmҶ:7R$i,fi!~' # !6/S6y@kZkZcX)%5V4P]VGYq%H1!;e1MV<!ϐHO021Dp= HMs~~a)ަu7G^];git!Frl]H/L$=AeUvZE4P\.,xi {-~p?2b#amXAHq)MWǾI_r`S Hz&|{ +ʖ_= (YS(_g0a03M`I&'9vl?MM+m~}*xT۲(fY*V4x@29s{DaY"toGNTO+xCAO~4Ϳ;p`Ѫ:>Ҵ7K 3}+0 387x\)a"/E>qpWB=1 ¨"MP(\xp߫́A3+J] n[ʼnӼaTbZUWb={~2ooKױӰp(CS\S筐R*JغV&&"FA}J>G֐p1ٸbk7 ŘH$JoN <8s^yk_[;gy-;߉DV{c B yce% aJhDȶ 2IdйIB/^n0tNtџdcKj4϶v~- CBcgqx9= PJ) dMsjpYB] GD4RDWX +h{y`,3ꊕ$`zj*N^TP4L:Iz9~6s) Ga:?y*J~?OrMwP\](21sZUD ?ܟQ5Q%ggW6QdO+\@ ̪X'GxN @'4=ˋ+*VwN ne_|(/BDfj5(Dq<*tNt1х!MV.C0 32b#?n0pzj#!38}޴o1KovCJ`8ŗ_"]] rDUy޲@ Ȗ-;xџ'^Y`zEd?0„ DAL18IS]VGq\4o !swV7ˣι%4FѮ~}6)OgS[~Q vcYbL!wG3 7띸*E Pql8=jT\꘿I(z<[6OrR8ºC~ډ]=rNl[g|v TMTղb-o}OrP^Q]<98S¤!k)G(Vkwyqyr޽Nv`N/e p/~NAOk \I:G6]4+K;j$R:Mi #*[AȚT,ʰ,;N{HZTGMoּy) ]%dHء9Պ䠬|<45,\=[bƟ8QXeB3- &dҩ^{>/86bXmZ]]yޚN[(WAHL$YAgDKp=5GHjU&99v簪C0vygln*P)9^͞}lMuiH!̍#DoRBn9l@ xA/_v=ȺT{7Yt2N"4!YN`ae >Q<XMydEB`VU}u]嫇.%e^ánE87Mu\t`cP=AD/G)sI"@MP;)]%fH9'FNsj1pVhY&9=0pfuJ&gޤx+k:!r˭wkl03׼Ku C &ѓYt{.O.zҏ z}/tf_wEp2gvX)GN#I ݭ߽v/ .& и(ZF{e"=V!{zW`, ]+LGz"(UJp|j( #V4, 8B 0 9OkRrlɱl94)'VH9=9W|>PS['G(*I1==C<5"Pg+x'K5EMd؞Af8lG ?D FtoB[je?{k3zQ vZ;%Ɠ,]E>KZ+T/ EJxOZ1i #T<@ I}q9/t'zi(EMqw`mYkU6;[t4DPeckeM;H}_g pMww}k6#H㶏+b8雡Sxp)&C $@'b,fPߑt$RbJ'vznuS ~8='72_`{q纶|Q)Xk}cPz9p7O:'|G~8wx(a 0QCko|0ASD>Ip=4Q, d|F8RcU"/KM opKle M3#i0c%<7׿p&pZq[TR"BpqauIp$ 8~Ĩ!8Սx\ւdT>>Z40ks7 z2IQ}ItԀ<-%S⍤};zIb$I 5K}Q͙D8UguWE$Jh )cu4N tZl+[]M4k8֦Zeq֮M7uIqG 1==tLtR,ƜSrHYt&QP윯Lg' I,3@P'}'R˪e/%-Auv·ñ\> vDJzlӾNv5:|K/Jb6KI9)Zh*ZAi`?S {aiVDԲuy5W7pWeQJk֤#5&V<̺@/GH?^τZL|IJNvI:'P=Ϛt"¨=cud S Q.Ki0 !cJy;LJR;G{BJy޺[^8fK6)=yʊ+(k|&xQ2`L?Ȓ2@Mf 0C`6-%pKpm')c$׻K5[J*U[/#hH!6acB JA _|uMvDyk y)6OPYjœ50VT K}cǻP[ $:]4MEA.y)|B)cf-A?(e|lɉ#P9V)[9t.EiQPDѠ3ϴ;E:+Օ t ȥ~|_N2,ZJLt4! %ա]u {+=p.GhNcŞQI?Nd'yeh n7zi1DB)1S | S#ًZs2|Ɛy$F SxeX{7Vl.Src3E℃Q>b6G ўYCmtկ~=K0f(=LrAS GN'ɹ9<\!a`)֕y[uՍ[09` 9 +57ts6}b4{oqd+J5fa/,97J#6yν99mRWxJyѡyu_TJc`~W>l^q#Ts#2"nD1%fS)FU w{ܯ R{ ˎ󅃏џDsZSQS;LV;7 Od1&1n$ N /.q3~eNɪ]E#oM~}v֯FڦwyZ=<<>Xo稯lfMFV6p02|*=tV!c~]fa5Y^Q_WN|Vs 0ҘދU97OI'N2'8N֭fgg-}V%y]U4 峧p*91#9U kCac_AFңĪy뚇Y_AiuYyTTYЗ-(!JFLt›17uTozc. S;7A&&<ԋ5y;Ro+:' *eYJkWR[@F %SHWP 72k4 qLd'J "zB6{AC0ƁA6U.'F3:Ȅ(9ΜL;D]m8ڥ9}dU "v!;*13Rg^fJyShyy5auA?ɩGHRjo^]׽S)Fm\toy 4WQS@mE#%5ʈfFYDX ~D5Ϡ9tE9So_aU4?Ѽm%&c{n>.KW1Tlb}:j uGi(JgcYj0qn+>) %\!4{LaJso d||u//P_y7iRJ߬nHOy) l+@$($VFIQ9%EeKʈU. ia&FY̒mZ=)+qqoQn >L!qCiDB;Y<%} OgBxB!ØuG)WG9y(Ą{_yesuZmZZey'Wg#C~1Cev@0D $a@˲(.._GimA:uyw֬%;@!JkQVM_Ow:P.s\)ot- ˹"`B,e CRtaEUP<0'}r3[>?G8xU~Nqu;Wm8\RIkբ^5@k+5(By'L&'gBJ3ݶ!/㮻w҅ yqPWUg<e"Qy*167΃sJ\oz]T*UQ<\FԎ`HaNmڜ6DysCask8wP8y9``GJ9lF\G g's Nn͵MLN֪u$| /|7=]O)6s !ĴAKh]q_ap $HH'\1jB^s\|- W1:=6lJBqjY^LsPk""`]w)󭃈,(HC ?䔨Y$Sʣ{4Z+0NvQkhol6C.婧/u]FwiVjZka&%6\F*Ny#8O,22+|Db~d ~Çwc N:FuuCe&oZ(l;@ee-+Wn`44AMK➝2BRՈt7g*1gph9N) *"TF*R(#'88pm=}X]u[i7bEc|\~EMn}P瘊J)K.0i1M6=7'_\kaZ(Th{K*GJyytw"IO-PWJk)..axӝ47"89Cc7ĐBiZx 7m!fy|ϿF9CbȩV 9V-՛^pV̌ɄS#Bv4-@]Vxt-Z, &ֺ*diؠ2^VXbs֔Ìl.jQ]Y[47gj=幽ex)A0ip׳ W2[ᎇhuE^~q흙L} #-b۸oFJ_QP3r6jr+"nfzRJTUqoaۍ /$d8Mx'ݓ= OՃ| )$2mcM*cЙj}f };n YG w0Ia!1Q.oYfr]DyISaP}"dIӗթO67jqR ҊƐƈaɤGG|h;t]䗖oSv|iZqX)oalv;۩meEJ\!8=$4QU4Xo&VEĊ YS^E#d,yX_> ۘ-e\ "Wa6uLĜZi`aD9.% w~mB(02G[6y.773a7 /=o7D)$Z 66 $bY^\CuP. (x'"J60׿Y:Oi;F{w佩b+\Yi`TDWa~|VH)8q/=9!g߆2Y)?ND)%?Ǐ`k/sn:;O299yB=a[Ng 3˲N}vLNy;*?x?~L&=xyӴ~}q{qE*IQ^^ͧvü{Huu=R|>JyUlZV, B~/YF!Y\u_ݼF{_C)LD]m {H 0ihhadd nUkf3oٺCvE\)QJi+֥@tDJkB$1!Đr0XQ|q?d2) Ӣ_}qv-< FŊ߫%roppVBwü~JidY4:}L6M7f٬F "?71<2#?Jyy4뷢<_a7_=Q E=S1И/9{+93֮E{ǂw{))?maÆm(uLE#lïZ  ~d];+]h j?!|$F}*"4(v'8s<ŏUkm7^7no1w2ؗ}TrͿEk>p'8OB7d7R(A 9.*Mi^ͳ; eeUwS+C)uO@ =Sy]` }l8^ZzRXj[^iUɺ$tj))<sbDJfg=Pk_{xaKo1:-uyG0M ԃ\0Lvuy'ȱc2Ji AdyVgVh!{]/&}}ċJ#%d !+87<;qN޼Nفl|1N:8ya  8}k¾+-$4FiZYÔXk*I&'@iI99)HSh4+2G:tGhS^繿 Kتm0 вDk}֚+QT4;sC}rՅE,8CX-e~>G&'9xpW,%Fh,Ry56Y–hW-(v_,? ; qrBk4-V7HQ;ˇ^Gv1JVV%,ik;D_W!))+BoS4QsTM;gt+ndS-~:11Sgv!0qRVh!"Ȋ(̦Yl.]PQWgٳE'`%W1{ndΗBk|Ž7ʒR~,lnoa&:ü$ 3<a[CBݮwt"o\ePJ=Hz"_c^Z.#ˆ*x z̝grY]tdkP*:97YľXyBkD4N.C_[;F9`8& !AMO c `@BA& Ost\-\NX+Xp < !bj3C&QL+*&kAQ=04}cC!9~820G'PC9xa!w&bo_1 Sw"ܱ V )Yl3+ס2KoXOx]"`^WOy :3GO0g;%Yv㐫(R/r (s } u B &FeYZh0y> =2<Ϟc/ -u= c&׭,.0"g"7 6T!vl#sc>{u/Oh Bᾈ)۴74]x7 gMӒ"d]U)}" v4co[ ɡs 5Gg=XR14?5A}D "b{0$L .\4y{_fe:kVS\\O]c^W52LSBDM! C3Dhr̦RtArx4&agaN3Cf<Ԉp4~ B'"1@.b_/xQ} _߃҉/gٓ2Qkqp0շpZ2fԫYz< 4L.Cyυι1t@鎫Fe sYfsF}^ V}N<_`p)alٶ "(XEAVZ<)2},:Ir*#m_YӼ R%a||EƼIJ,,+f"96r/}0jE/)s)cjW#w'Sʯ5<66lj$a~3Kʛy 2:cZ:Yh))+a߭K::N,Q F'qB]={.]h85C9cr=}*rk?vwV렵ٸW Rs%}rNAkDv|uFLBkWY YkX מ|)1!$#3%y?pF<@<Rr0}: }\J [5FRxY<9"SQdE(Q*Qʻ)q1E0B_O24[U'],lOb ]~WjHޏTQ5Syu wq)xnw8~)c 쫬gٲߠ H% k5dƝk> kEj,0% b"vi2Wس_CuK)K{n|>t{P1򨾜j>'kEkƗBg*H%'_aY6Bn!TL&ɌOb{c`'d^{t\i^[uɐ[}q0lM˕G:‚4kb祔c^:?bpg… +37stH:0}en6x˟%/<]BL&* 5&fK9Mq)/iyqtA%kUe[ڛKN]Ě^,"`/ s[EQQm?|XJ߅92m]G.E΃ח U*Cn.j_)Tѧj̿30ڇ!A0=͜ar I3$C^-9#|pk!)?7.x9 @OO;WƝZBFU keZ75F6Tc6"ZȚs2y/1 ʵ:u4xa`C>6Rb/Yм)^=+~uRd`/|_8xbB0?Ft||Z\##|K 0>>zxv8۴吅q 8ĥ)"6>~\8:qM}#͚'ĉ#p\׶ l#bA?)|g g9|8jP(cr,BwV (WliVxxᡁ@0Okn;ɥh$_ckCgriv}>=wGzβ KkBɛ[˪ !J)h&k2%07δt}!d<9;I&0wV/ v 0<H}L&8ob%Hi|޶o&h1L|u֦y~󛱢8fٲUsւ)0oiFx2}X[zVYr_;N(w]_4B@OanC?gĦx>мgx>ΛToZoOMp>40>V Oy V9iq!4 LN,ˢu{jsz]|"R޻&'ƚ{53ўFu(<٪9:΋]B;)B>1::8;~)Yt|0(pw2N%&X,URBK)3\zz&}ax4;ǟ(tLNg{N|Ǽ\G#C9g$^\}p?556]/RP.90 k,U8/u776s ʪ_01چ|\N 0VV*3H鴃J7iI!wG_^ypl}r*jɤSR 5QN@ iZ#1ٰy;_\3\BQQ x:WJv츟ٯ$"@6 S#qe딇(/P( Dy~TOϻ<4:-+F`0||;Xl-"uw$Цi󼕝mKʩorz"mϺ$F:~E'ҐvD\y?Rr8_He@ e~O,T.(ފR*cY^m|cVR[8 JҡSm!ΆԨb)RHG{?MpqrmN>߶Y)\p,d#xۆWY*,l6]v0h15M˙MS8+EdI='LBJIH7_9{Caз*Lq,dt >+~ّeʏ?xԕ4bBAŚjﵫ!'\Ը$WNvKO}ӽmSşذqsOy?\[,d@'73'j%kOe`1.g2"e =YIzS2|zŐƄa\U,dP;jhhhaxǶ?КZ՚.q SE+XrbOu%\GتX(H,N^~]JyEZQKceTQ]VGYqnah;y$cQahT&QPZ*iZ8UQQM.qo/T\7X"u?Mttl2Xq(IoW{R^ ux*SYJ! 4S.Jy~ BROS[V|žKNɛP(L6V^|cR7i7nZW1Fd@ Ara{詑|(T*dN]Ko?s=@ |_EvF]׍kR)eBJc" MUUbY6`~V޴dJKß&~'d3i WWWWWW
Current Directory: /usr/share/doc/lua-socket
Viewing File: /usr/share/doc/lua-socket/lua05.ppt
��ࡱ�>�� ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������  @�n��?" d�d@���������  @@``�� ����q�7    7%  .      "$&. 2 0 3 !4#%'/156(),-*+?��$���$��b�$�:@X�\�&#NZ ����� �0���A���A�p������������@����������N�g*@ʚ;62ʚ;�g��4dddd�n������������p�pp�@ <�4d����(����  �F/� 0��|�DArial�0�0w��b������� I�������W�@\P^�\!�DTimes�0�0w��b������� I�������W�@\P^�\! �DCourier New��b������� I�������W�@\P^�\!0�DWingdingsw��b������� I�������W�@\P^�\!@�D-�3� 0��0�0�0�0w��b������� I�������W�@\P^�\!�� �`����� .n���:@X�\�&#NZ ���PNG  IHDR��0X� pHYs  ��tIME� ; xޥr IDATx��Y�$�u&x�{�{D�R+ A,$H��D#EQܴ�)Q⦑4����y��~���鶑iآ( ����̈p�{�Y����6���&��,���2ܿ8����^^^^^^��/�����" " ��������}�7�,,B9K.��B)�<n��Y$�$J� 22qW��ؗy>��j���f�����;@ć���P�0P8��6g��fsv�����]�cDa�B�9%aF$GEp��������1s#9T���lǩ�v���p\j�Mkmf�u�U�[�VaEۇ���T&��������l����g>�Խ[g;� P`�>�:�s�L�`�r&bwg�q�%��q^z��v� U@"N��yj�kg@V�n��ǥ+j{�������7�^#�]�>��BfJe89�o��{�c�>s�4 ��@6O���׉����U"TH$�2 ���@���5 8Q.�\=™�����m2ۓ@n���-�[���K�/���?{�xuy��r>��d%����P���|���^��K/={�����ۛb��ryy8�!�]]�/��w�@Ԉ�~��Yv�MI��~8� ������0<ܣ��a���䜘9"�:���s@!3:f>t�1���;�z��ѣz8Z]>��m����'_x��>����z��&��w�py٦��x5͵6m���{����D�RZO($��p"�s�@ ��73@ff�� UC"Dt��4"ȹ0�z�p &&7�(�*_�������˷�駗�����8"�����i�mo�}�3���~�c�<�̭r�%z�}��׶,W��t5/8�q�f���Aе#�{�vL�"��ƌ�� ��D���j D����hn��J)���B!�C���:: �2y��s}���o?x�[ǫ��j����WXȒ�o?��s��‹���3O�آ9b@�u�=Ц���8O�e����]�.�̙��#�@U{WUED���3`CD�@`DD��f�" ��I�3@3E��0�{�D�ZGDD$"�ps�@��`����~�������G���$���{�W��Ͻ��=qk`�$wV���K]����-�=|�h��n�DDD��4�L{�"23 ��FĎ"b��*"�H�����#2��,)3��V�t}M" DD �nf "@���.���A������O��?���C`���T9�}�/~����K�oosN��\ �֙���o�}q<x�<x���������f ��IU#��W( 1=>��J),��23�C@��!��ݕ�����7Վ���n�H$�(����1!�2 ����Ï���?~uz��%�>�/��Oϟ~���o���?���[wv��f���rfuU��r|��w�_,��󬪺V*� �@�0�P%�Ƙ��ݯ!�kacB 4�,�R2SB@DB@wGrfffBd�X_J]{���k�#"D"E @!@ 5�)oDDi(H<�����ǯ��ӿ���7_������*���s/��ʧ>�k��g����(�LmDBL�"0��p�����rqq��U�̈́��U+P[["�ufѨn�>zI����݈���x̄���=F�j ��2��A�����Z��F8�sp""A"���[�E ;�eǟ=ڿ����_�f���V�3��}<�1�r�ŏ��_��^�͞��B"�#&S�D�`�LW��pu��4ϵN�I�USg&IC�����H d�!у����@< �#�Y � �I��� A��C��u%��h��\�*>�$&�ʪ���n9K8�{w��p뙉!����=!F�����wNo=}�?|����w�;?�+�σ�Rn<��O}�7~��ɻ���q��xz���t�aK��k���q���x<^.�V����������8n��a��vs_���P�~*nA��JF!'&r�$���l�7��!�!��S��vtS""D<��RSJ"���NH�����f&����/�AU�)���sJ�R�U%�T�����q8v�ɛ�������m��x�q�ﻊ�,��w^��g��/��O1Y�O�n���?�ˡ�Z�t��Ӿ�b]��U�k7��f�j�0$bD�0w&F_ 2a���#�1�H!@8!G��g'CΧ7��t|�m��і��)�-s�����D�B ��ED4w�p՜S����w�D��q\ju�`��&�'�w��'o>���'�������l>���#��`��� /����׿��� ��5�5T{��2_\<�����j�:L����q�3�O��T��)̣�ֺ��ںu $�%��AAX8B xX ` !rJY��-��������uѰ~~�#��p`��f�X9|'F\YS UDBs p@7\ɭp��@t׈��Q�X�ޭ--\�!�v��ɳ�w�*�<�:�la�`!Qޝ�������[�zz7�����᣷�~���qBH�m��/]�ZK������,K]��s��F"�`�Dtm�#t3WcbAF Br����  �#�$) !CT�~��ؕ�?{p��gڧ^�V���#�J��H�S���|QN4�K�)��J�y)'D $$&$)C5[�Vզ֚j��o�tc>����?�|�Σ�����}�cQ.7�}�_����Ͼr�f�M������|���:o�O�|�{7n��G�����e�ͭv3wPծ�Z;(H11�J�ݭkwsB�� $2��$9��0���&DI�'I�(� �lܔ�j�����T��\&��պ�$�轻{� 2"S�i3�4l<�� S�ٲ̽�͸�H�����:?�xt�:�*�o7���ӳ����O�Б�o���������e7��슅�۳>�[�����#��m����?��k��쪧�x~z���QT��q���狇�� f�DH��H����֙ q����������%��Q@Ĉ�B��A�,��f�XY�:�̂���S�{�yx�xXW7�����u�H"E��#3�D9�03��cɉ7C�Pr �PU p C`⒓ZÀL�-��;�}���x��~܇ٿS`!��3�}������G���H�xyq�ξ��y򅏽�̽[��eY�4����j�T�U�##�"��#H�����ק ��D�HD�DD()%b�`�X�����0�� ,� 憀9e"333���{@DfFL ��ɜ2�p8�R�03a�0%In�H%ᄀ)�\�;�Y�b%h�n���fx�wOܽ�vy������4`q�x�7�����o}d;�yCF���O<�� /<{�� ��|�Z�һ>x��oܿ:�����x]��Ý��3'B�p������u �pJ�N)�9��pͣB��EIBbr�ֺ� ! �9�)�!1�03EP ������q��p%И��,� 'Ffʂ) Ly�|���*D�|"���|�ӟ~`�� �R�V�?�Jۓ�~��o��+/�31Ax�j�P��0�6_]�]^<���8����C]i(wǮ�n���DXRJ�6W��؄���{�U�񈕂 "fD"�p$$$!��`�X]_9sʉM�w� �$���Uv&U�5w��@D���AD�K"�R21v5$L9�R�zw r$dfN��+���P�� 3�$1��� 2�>�=��s9��Q�z��8���W�;�����-�*�"�i��W�!R]�puu�������j^���w����u ���S�̜E��&�zT"��D��������J)���3H�9%�0��q�a���^k�KU�YWu@�w���g� B "LYZ�������p���� �, A�����䒶�m.���V'�p�`!D�9�Ͻ�L��z�qyt?�>��"�<����_~�[_�ē�#��X�3 s��j����?L�4��4�<-����LH� D�BD93�Z�D��"�@\�fGD��|�#GDdJ��>�,��<�� Y�sE�R��n6ϭ���EW� <z�ں���k�b�!�2Hʨ���5�k�uYz��R ��z�^�qr!���sX�@a����n�%r!��q��zo��(�w7��^x��K�x�~=<|;���D'O<���}�����v�,�uYP8ֱ �j]��.K=]�j��iZ�h��k��dA��$)������Z�����_ 1��X��3���\�9 �0'��DD"��9F03�^km�����[X�f�~��$"g BµϏ��{�Z{o�j�][�V[_��RU0'���8 I���,%Sb�yv( �y�ֺiw뭙��RI‰�����u�Գ��޷e�` iw���ï���}j, �5�9�z7[�m�vs�e�k[Z���<MK�؁� ��v��a�a�]�Y���`nfj�n �,�HD,¥df�\���9#�!CaDH)�R�0!,s�nnn�#9 �{W7wbL9�� D�TD VG��p �@@� 4��go�Z�+j{�P#@ﭵ:[�ݺ�%��f�����DD�0�"����� �37wO<�҅ѻ?}S��,�r���w����|��F(�C#�k���n���1��p��i�S�v8��e:.��D��� �v��T!���)e"2� 7CG L9�H�3�v�J'7cN\$�; ���2�B(1rRJ��k��E"��P�a����{@�LF�\��g�W/3K��a�D„�x=�a���5%f� ����a��������[�3 3JI�nN�M[%a!NA���$wn�y�ŗߚ�k�F���� En}�?���^�-���g��2��犩�qW���m��z���p��e�&ո�Ԍ�W�8K�U��N�����צb""f@H��>e� )"��3'f�`�a9���L���DR�%�޺������9���v"`&�r]6V�1�l�!��"�V�l�!K�Ldn+i�’R3W7D�U[���Ԗ��i����V!�l6�� `H%���GDh� (� s�ݴ���g_��Þ�}��S;�{ ,�t��O|���g?qbJ��.�����R��lܝ�"�tX�4�/��.//��sνik0�YD�2 �d$sU�P�n�T7��"��AD��l�P$�ٌcJٌ�8Y_u(��э�p(���i:��a꭛vRӕB���, �N������b�����������<-"!3qD c���zSU7U�fq@r��4��a�H$,�zm���ʡ8���Cx�t{��}��7�p��խ�Xg�|�/���Wn��)�ֶ�Rّ0`H.���� j���Η���Ԧ�„u��@�p)eSƕt6����"W3�:��P����@p�َ)')C�m��fS��%��Ą�j������4��󴴮�lfH�,D�ی��5:�# B�!`FHbPuG��]��L�a�nHLĪ�zw�=�XD�]�0X�6UWscbHX��V�}3@ʔR� �(����>�ҋ��տ��g��g�:����_�/��gn�( a�G7>�u���$�[�2��0�/�|�z���ñ�91P]�ei�NH�d�0���yV7 O%��5f�ja`!9m6��n�%���vۓR����0l�}�ͫ ���$�./�5�n��"eܨ�Y1p8 A�$���?N��@��jkha+��{w��5�ƃ"���T���:W't)eZ&��7D�u��݈u,�pF&`̹ `mK��29�~�􉏿9�;o�f�{�"���N�y�w��?��o�d3 ��x������<P���4�ei�|u�����p�q��޻��*F����!@�š��G�J���x����$�ڃx܍CN B"��v����WS`�$�����8��A����0�p�@dvwH%^;��=�Y$�X��Һ�#�#8��u�u��¯���=���#, ����� �f��!�`N)cÁܬ���Ū$dA�7�z�Q��������p���W��O��k_|r[F��8R�5�N��n�Y7b�3U��L�_������l[2�$B��_�.�ڻm7cWuDR 5S3bRS3 �@�Ļ����Iz��4��� X�X���M�{����$�2�Km�B�y(1���P�@s�\�23��jG"$$�uH wW3�` �2 57u��yZhjf�aq��� �n�[����f�P֜b @3ϥ0 C0�C!#�x]7����p��So\N����~���/X���g��;?��W�9�<���="b=�]�z��mAD���Ah)�ӳ�P0�-˴���.��j�譵�Y$���spbp7\M)Ev�MN��%ao6O-<�HJ��2��Ҹ�M����:�9E�~ �2���f��u~�f^rF��%'fƜ9�"��,$��7��KVF��׷�rݯ���S� ��p�^�=�����0#������3Q9??K�<^��U73o]ͻ�y�vuS�6<@x�qo7���_{�=z��:���_0�8�/�w�����CFvbN�P ��="z�n�]��>S�4�H�y���tu��� ��E��B�Y!�9��p.E���KN)�D�Z{8f�F9�l�í[�w���D᪮�Q[���0-�Ń��qj�̌$J�1K��ڎI�s"��3B�̩� �v7��� B]Z��̐(�XRJ%Ex��{�u��@��ī�k%��z���M����f�2��@@F �`���ֻz�E�n��4�#�z# �ݛ;~♟���ӻoA�X��ӟ��w���O?u6#��ǁ�V����ͬ����L$��<��Zs���i�JY�K�� ���"i5?13"��Cɛ!1���;"��&e�\n޺= eS�M(�׹��.sWmM���~u8εj���*Gx��;�ڈh�l�XD�����yѮ�����)�V���t<L���z'���zS� D@ww7bJ��Z5�q�����F4��=������]6lFf&�0w$�p���N,"���F�)�n���_}�^���j�a�B��>��?��_~v$)�f�%���ڑ(z��ޭ��{7BJB�`��r�_]�K�O󲴥�U.C��]��_��y�0B��X �'�pw������1'���t�Ɍ�m:�y���0�е/˲�fL�wU��$s�<�Kޞ���M"N���CNIC�x�j�p5mB��ԛ�"�n�ī"��da~����D��E2���Et��ͬkW��T�iO�� M5�K����=�3�"<"��INo�ymo�_��� XD�_z�������@��0����nv����[�֖eR��ZSS t�Z������qJ�].�{��%I)��91���a�X!,�[����X ����I�y�4 ������q:���yZ�e鶴�ĭ7���#�P�H%���mv��d��mO��������0��p�]��(z[���u^����Rr����j!��*��-���#VsNo}ݥvw@�Uf�d@T����nix���v��S�k�SJf�K�=z�1�CG����͟<��z��Wvx���a�},B,7n���÷���� �R��f{���� [ W�Z�-�M��nH���eYju�n����v�sN�kJRJV��\ �l֙>��!%�v61�Et5s�@ �����òD`xwG`&�5l�γ���'���sF���CJ�ͮ���RJۓ�8 ��{��D�၀jf8����0��zצ�q���k2�{0���*2�+�� ��:��c���910 q��3�EJ�R��zm"���� IDATX�y4���8n7)˺�O,�RDn�����������M���2�������AМ9���|�=K�:i��y�p��[�n�a���x��CNRY�b�:�pg�Z�Ҫ� 3�je_ap,�v� BW]Z$D^� �$�P�p�JBĔ�!���4�k��)s&�)#�8 ��6�"�0�$�n��Y9' F�P��Z7b���s��dD���SL�D���C��V�Oo�(̉@c&Bw'ND����eM ,9��4119JZ �LnA$f�a����e�XHœN�ݽ�ԛF���v��� ,�t��~�/��{/�9��M������y�>χ �fj�w$�}i]��) rN��s�a-Jn��$4<�3%Y�&bs[�9d"p�wd��Y��d��}��f�6#<�b��P�� �f,��n���������QX�T��͈0�DL@�KwE$Ja�r���̫�S��pJL��k�| @N��L�E " ��YX)e�N� �(�B�ٞ��3+B�7'�J����~�`��!��i@JNBL'�gO�}�jy��Z�D`���?��w��ffS 5Ne�CI�K=^N��#<L��l���;0 ���)@�9!��!H̄�f��5�����׊�"��գR�Y��\ � �! �p"A�$��׷�J)"�f I�u�� ��Pi�a�¹���øA���!�����]���̽���y�{�ua��p"�m}$!B0�@`&�^B|,N�.4C $B� �BL�]��2O�R-�o7�7;岿�U �ę�m�l%�Պ8�l(�,�r�7����-Y\�`!Rί|���k_�w2@���%o�,f�.�U��`�.�~��i�DIR�Ǟ��.�2IB�$���l �2���,];1$JYݗ�D"��) '�̔� ���7���H�َ��Z�(���1�pJ�$]/g�!�cu}�^kE �һ� �n1M���*Ϲ[���� ��ZzVS��� B�ڳ{"##B�Y$1���c�;8�XDdm#�C[tUu� �m��n�n������#X7 C [y`"a�)�P&Ι�ݛ7���o���@��$��'������lE;#D����A�ZW��5#$0�������E���B9 3�":����%1R�l��q��6WU�L�Zk���@RJ9��z���YJI��j�6���lY$I��P���33y�n��Í1�$L"c�["�9eI�U[[�EU��) @i}�:��z-'`Ax'\�b��憈�]��;��i�~̮�)����%&��]��P��Ú�%]uM��0)�l�Hތ۳����t����*213SJ�s1�!��R�B�p�t�ԝ�u���H`�p�ɯ����/��� ��%��L{k�"81�*D0Q�O�N�}�a6����̺5��*� �\��R�"O������ë�ü���,,�Ӛ�AL����Z�̼�l�y���j7�k�-���|�UU�F��d0ssEtS_s���2�%�q[[km�ui�]K��"r~�$�ܛc�����{�~}�Z�Y"J«�Â��R[�k���8�,�+щ��N!��$э���ӓ�y3��R�"��y�+#0��j��$g����&�I>��~����g�Z�� ���/~������ €��]�T�:��&w3�ޕ$K*D���7��XJ_f�j�A�E��)� mY�}xqX���uzbFA��RJy�-Ih} �Ă) 1�2k=H%�UU�B ˪ծ���$I�9�d�\sk`�N�!c��\����Z�a?�9���Y�v����jm�@�{[Z���ǜ�$Ɯ�xaJ$�D�AI��)�֓�)�Q ք^7"&َ�f�i0zɖ8����Hn�]U��z!$I%�,�$�$9�ɍ�;���'?�����䩗?����Oݽ��.�a �t�5v3b�`V�)�m�s�R�{�ǔK.9e1��;.e�0������S7'BD�@$Z�89g꭫"���d<;ۥ�`k��Jk�'��ı植cZj�R��u�O�0 3y� @$9�2 �a��MU{� �jfږ����x�唺v�w5�X���0�q[���B����=,� R�,��&U�ʞ�*�1�Hy�6�[���S��-��s)�����s�6�f([pr�H\L6��ُ���k������o�q�s��������SVՎL)'�I ֔ �u����{���S�s��Gߝ�9�%���f<n7�Q�bͮ.�� ��u��n`n��)�f����n1-�,��ؓ0]=�#@)��Q)I#S���:}�p�"�00qʒR@��Ĝ$!r�h�vc�!��lz��FxJ�s��)3'y|ҁ�����8g�C)C&F�$,ִ�n}���u�w� "&���0�;�z�!c��&%@�,n]Q�Y"�x��em��2J�,�v��cN� C�Ӛ<MI��x��n.)�Ï^m���s`Q*/����߽��!�Y�H$"�z7��8Iʩ����a�a(��r���~��Z�|uq���=�X��(Q a�u��IU��i:.뷒L���� S)�tz���l�Vs"^��d������0���a��@��{x0aY���%��(pJ)��� �R��vG)3��P#a.C �ɶ+uN���Һk���_w�̀P$�������f����=ְ̜�_�K:�\�Ą�@)��f͇�j��0�4�w/�4%)�20 ",K%p&�)# ���4� �4gޞ������װ�� ǻ�ɟ�7?z��0ppQ��S�NR�)�16�����4oNO ��xqq����b�u:·�q:NӼ�0l9Ir�e��.��CD�s�K h�@�ی@"@^�@=8 �8�� � �������մ�qːY��f´ǡ��RJy(1�e2W�룼�awrzrrR��0�����e53&\i�u� �b�)���3��H�{k���_��׽�k���7��CA�E���Gںwuw��Yz�f��H�݀Vsj�h>,`}s���j�aJ�9���HbI,"�ER)�9�D����zq��~>`Q_�—~�/��)�hkh�j�9q��h{�˒�o]#�>�̬���� g�3��& ��!?��@��?��6 X�-���H�W�s���<g���Ȧy4lZ�K� ��:�D�Z�~�e̙�3_��y�-���z=�s�}���z~~���m�� ��a��Z���?�����w��|��6lD����d�u�@@��‘Tʩ�p�01�\�D ��ee����g&�f�E�S%����pG�H��2�íH�\��e�0a`���nB��>|�,�����9��˲,��Z�����9V@Ra)�� ��x� w@@��fӢ�H$<4�$�q���hQ�^�͢K˵�� �.Z�A�8YZk����zQԥR9�T���PeQ�X�o~��W�c��/��Do�����o�ǒh}��=3�! ��*�udY���xyh�g����d�~����?��vߏ�h�O����0�Z�|����w_ ���\`��,`�f��̢����z�>~��/O��>c �~���y��™����,3��‚s���2�������R��T�Z�2`�'i��[�^b�!<�DH�"�u���<��0�ȄD�p���|�O��,� -JH�.ATbL�ʄ�{��QCLfZ�� F�S��yY���Xz�����!�q �����[�ׂ��D�X���=NO�_���O��/���%�������←�6F��A� �(\J!!Y���qx����i_��O_�c;�};�F�G�{�Y�6�3|��v����s�~�\>�����2Z�o����=$D���KY���.af���}Xw����R��3���������e�F� ���9Zu]�Z �Y�����K f�� ��K�X@��p�>����__QD��^���N�,6��:CG$fQ�9Ł�����y#�̘p��p�9gI��?HYEj) l��1�)�Z��H E�����BE�6%"���_�������.,ķ���o���1�#��0Q2���û�@��ZTdnl�{�ll�d���~��nc�_�!�,br<<b��̀/����1G�_��j���ᑙ���ʥ�Rϥ�0s�G�� �,U"b�S,"� I ����eAT"^��$����6"��7W�Zt�0�h�߽{yy������.�K)��t��HS)"*�LTKHD`bd�O7s��}t&L�I�ԙe�|}M8ez�$����P�p.$�uEY���$"f��l[3�"�L��RN��j)eY�`L�Ia����G��'����o� ��'����yS !!�Y�«���vG-k���rւ��m�J)۾������?���ָhf&�%�وD�E�1<l�Ha��?~*B������5�GDD��z�^ψYK}||�^ϪD�@�v���ưu����e���ZX�����rzxxTe����e�#'fx?ھ��c�v��{��Dc@=23�Ч�,�pJ�>�}'��U#)"�W�jΉ�׀��HL���: sO@ �̂8)�("�:��"� >�DU�.��3e��&b-��3`�A„�B ,\ʊ��b�9��LE�t:�����_�F/�o P�|�7����z��0��9F�.�*���ᑨ,��Zʲ�k ��޺��!�c<��ɂ�����կ��*� dU&��H�����"PT&Fbe��~�z���i�`˲��} aB�0�(���&Tx��6`x�gHpߚа������lDr��L�Ü�X�@pH���k$6�����=�2q��3�.� "��01,H������F�y�&Af�Kb��V�E�zٷ�"�zZ��<��.K9�D�Y ��Gk �y�`$ �"�'����{���?z�����K�Ya�|���?����T�8���p=K ���.�e&€"Ykm�ALZ4!Q1݌� `X�OxPR�s"�;"����R���<f���m$$ե���[��?�����mX�@�p` �jU�}?ƴ���9P9��Dz�F���pFX�=�(1��W�7�0������D ,3k=Ml�eR@`��k����0i�Ჵ�ĸ����!_��I�h��P]eD$�y�т�5̉�^f��R �BPד�*�.�b䎄:�}�ַ@t��$�D���.���W������~{���*�����3�tٌ��棏��[�`d��%!�1F?�r�v�����y���ю77@t�y�#�ja���݄�O>y:-���hH4��,I۽o��eX�D%7o{��`�h�ef�2w8�<�d6�8,��"�}�`$6��s~BU�LC� p�W�'�pQQ�LD,�ak}��Ɨ�ED��f=�gЯ����V����u]`��"�j�\.u-Z��q^����̬Z�)�]��1��U��1`��$A��m�Ѷގ�D�:M���> �'������?˿� ������������b���Z��h{@d��+#�겜N'������~��ɱo}��"<F�d��01K�������e]�� �Rp�nGk}� $-e6J�7@)K���>���'39s�}�TfR�L����GW]�1v�H����r�#  =�}�k231,2�5(�!2"�Q��ϑ��C�RkD�1�a�ͭ��Ru=�ө�E_[�R_���A�)�˂Oo�RkzF+s�I�Wd�@H�tp�̺�eY�/�2}e��ɷ[���~�m��P�L�� �3�đ���+�n�{�i�������8F��� ������]�Q`)����z�L�I�K0���~?z�{�Շݺ���?�  Ӛ�m�)f�o�R���ͥ��ֲ���m۰@.S�Pk�a����"Z0�����Je��z��ɛ�?���w�&"絞J]u1pfQQF��֚J��m��ӹ���+N O"L,nD k����{4s E��4G�D42�-�RDO�Ӻ.Ȕ �!9�{U\ �G߶ 1#��e `"�\�"������3'fB��G�Y�s�2OI�0�3��� C�3e�2 eZKF�p���������~����_��_���4d��O��k?��uaHL drC��~߷��) �cx� ì�n}�Ј��R���=2<͆ ^���o�>=>=�˾�>z�k[n�:��0T�T=� !�6���8��A ��ʹ���-�.uY�2�y�X���z93���~�������8z)��^<#"12�Tѕ<^���qz%�`:2�`)�30���S��H���S-"%3Tp��Z�� 9�<�^1�gJ��*���|���u�؎ 0���뙰Z}��e����.Ky��3����0��� ���K��(�������O?������/?������?��g��0f�LGV6k9�=�d�����m�7D��Tsێmo=�)g�>�^d�~�`�����7_|�����h�龜�l��뺔RJo�拷�v��Y�=f�n�$@��|:�� )�J0�=܉@�JX�E���q��#�Y��a# h;Z��}�'��~,*���A�����oS�"��r�_֊�������2��íaGDL�p�L��S����8(�N�07�D���� ��<q���׍ W�_|�>80��I��)><�������1�"���[޷Ai�E*M� ؠp�Q����{?�џ�/��ҥ��7�Χo�I��c�(�h���zAL���i��{ג�B�}kH�\���L���}����Z�@D &R�uՔ\T����z>����@u?��� "#���Ӡ�������R��3�Ta��-���{��{OQ���$NPUABB�)�"c"��}�_^^2� ��e?��8z���im �RxYtY*"2R���x���#&$�H��� ��R��pwָ��N�Y�����L��I4l����Q!�# ` !��d�j��+�m$�xd��~��[�o_����������~�璇0���<F�ÌGo6���1#(0[�������6��GS] �����(KM0ԅU��ض)E8��ckǺ.���GN���G��@�<�3��rN�o�_�����2��ڼ#2�.� ��H�9��p��a9ƨ�� 콥{�^��L�%�f�����|��`��[��y�\k9�]�Q�[�YCD Q8�0i!�H�E�2E��PI�Kq�����0A#�DQ��7"dE��4�� K-r~��0"GfRk��(�3!Hp$�a�w�,L�����S����z�������c��� ���׿����5�zxR�[���l"�٘�"ct��n޿� �B�nc���tZ���L@!�R��>_��Z ,��裏���2E���R�u]���>=>�N+ [�鯉z�Z��PT��z:��Rʲ�ZDH�@�n6�������T�%��m�Ѡ��3pr���M��4�D��l�g7g���E�Z.��C�����&r&Zj]�5���=���ȉDPTX I��"#k��\��%�N\��ry��>~c�1Z;��sMD0��{C0@`��z.��#GoBH�#,!�ɇ���?k�_N,9_�����s���05���qt� -��-���}�,�0�y�K��e� x�j��u]�E���mG0����F��Ƭ�,��VVf������Z��֚ i��h�!��]T�03 ��$$R"xf��!1�nn 3���fƬn�%.*2��f� �����uy��'gL�!"�c�7!~x�V�yk{���[�cQi-��U�!^��ZO� �ZTV"p�n*R�Ek�G<?�D�!>�����ȵ�<�I��H��m좨TZ�ᣤ2P�q cъ4��f�a5M IDAT��F�:V������|��������_�� '2:��#R�ޞ_n�弞6w�� B�t�Oժ�I���� i)�H��,��� s������sx��,��҅y�mYJ��hG��^�x!Epz12òV��uN�ӣ� h�4>�>܈��қE��'��)�i]� A@x���"�an_�#= '�jF��{[� �DUϗK&�H�n� $ x�]Uܧ�{�m>���� ��(�L�I�LYT�v�ևar��Z�t�I �CFxBf��я}����p9�����3Dz�a�)��ޏ� ���#�[��<��}������/��o]X�ɯ|���O ���A�}��^v��4 �03��8���K�ݗ뛢�|@n�r�^ͬ�� �#��r>/c���O��{doM�R����f��}�ݣ{;��8���s��1��eb80�Rd]�T�� �L����R�c�Hp�#�}�"�*��_k��� l�o; =<<�~SfN)�+2�^3p]Vo�Jo�.�i�wF|�� -K}x�23G�Y��D��1Mф$��D*� e��2z����i�j$QY�zZ,K?<<t)�ff0ݶ62,[G]g�JcM���^�#̥��8�(1c�ߎ� ��I��w����_al��B@�˧��R�F�R41}��c��B"�gbR$��1�,��[�TF��v�\H0|(��"<}$����SQ�������#I� &�ގc�����c���P-����ts���,t�����tZ����l�G�L��m���Z�a��|�}��U��AȐr����o�~4���i>TJx��pzfZ� ����r=�R��|o�B��yY����#3�e)�dv*4lX�ۭE"Z"13K��� f7��#_zDQJ�Zʌ��ywS�T��S;X"��d��_�1�#ܦ���'�{o"�ʅ3�����o��s��I��� 2��ͯ|��J�aݺgBp �u]��2 ��Md ���$E�o�g ��P�-��Vf���EŽ�-�������PU�qo���R\D�*J����H���+��}YW"�H'�ea�{�Z�R��6a}��v ќw�ψ�����G��r���^����G7�`���EF/Rh�0#b�0��,I/p�.ꊌL"��"H�P�f�љ Y#�Y0C�P&�S8f�0�Y��%�")��:���ɗ�Vٻ��c�� B���3q?xf c"�7O�@�D�f4�N���>|��W�� +��>���6�F�K��*��9I k3���L��c "��j�� �� ˲0s��\�˚�f"3Ͷ�ZJ �qusY�R�U+�Ø���߿�"!}:��54X�ZO'�w��[��!��0w���25�6|; ԥ̅�R+�6]�� ����2�}�62���! i�Z����}�R�Ǿ{G�<�/*���L�1�Φ�R�Z�h���>,�Z���5�e*� _��� �b)�!�m��Ē�jDwD�Ha^��[zD � ���N&�y33��E9�1�ˇ�㗟�����i����go�8�e ��#8��J\kEi�>�SY�y��Q��SA,Z���a\J ��r�XN�����{F)\����W�ֺ���O�e%��[s����ǧǶ��~?�;88�����V>�D�@�X��|����/�[��mt ���-�+#�1"#��D!3�HwU�=�HEe~��IL�J��v�~XD$8@�6*3�U!����ZY�F�w)z��T�$���X��X�ю8�MH"2�2�`�>��\�Lj���c�JEN'"JGOlG�"f��,��j~���m��,�ѣ�>.�s���5B]����>Z�~��?XO��L�����O>���zZ ZOBf"rK�4 H4���lN�"��Y"sL(P)�ƈя���v�}om������ .�7���E�r����5R�U|�9�� ̉L�`���=h��@8_N���@�Y۶������Y$!-��""�DB�bd��A@B�9��2�0��gjf�Ց��iG;�h�APj$ ���JJ "�$A @r%Rf�1�tyPe)/J/����M�R;�Y�}�7� ��r���˺���i�"I)u9m{�ы.{���(�U�����>���{�eE��$p�H��Or����Z?z���V�<}��� �6�4f��B��ov�%�#G�;@]jEf��H�Bb=�,gvC����� �f��9z��5f���Ĝ �5"R��6��v73�D !D|E&�>8-=��} b���Z�� 6��|Ǿo6#��E�$e)��r>=��i������{�Zk����,��uFD�iY ���˘4���}ԡiI9��N�uo='�Y#��F��z�0+b�� ����T�yct�h�� �e� D���t�> *E���eaf�1D��L�:s �[� ,PJ�RQ��ix��H'U}�������c3w`]J��o�NO������qa���� پo�6Z���J�h^���{���6>�c�����}���z�X��7R9�yZ��haD�$�"��� ���"kwy�E���̑ P*-K}l[h(Y�><<=>|������޾�p#�"3Y *�R���͛7���F�Ҿ��~ذH��Cbc����/��މRX�dJU���:���:�F�J�� �`��q4��`��z �nV�R �G���T��JE���)"����~?2� ��뺪� �U��R��i�(�O�3fd8�h*hTb !]���Z?�UX���z�ǡ�0�g 3a� � x&� �;j|��Û/?���c~��B||���˕��kށ@���B�ZD ADZBO�! �j!H~��Z�2ݷ�c����J)�,Z>��3����ֻ���`��C�aJ}tD�H����܊���vc$��.Oo߈�z�cߎc���{D�E�ZO�z:�j]^��U� ��Df1P23�֞?|��Rt���R�S��.Z4 aY��;�WDL-�@� �1��m7bzX�p߷� "��$e��DZ��6ɕ5��׺L�D�a������)��Rq�G� ���M���A%^ץ��ۇHjm 5]�n#�4����DP�$!� �n���v9}���������\XL���Ϟ֒6�1:�'R�Ya�ޏs��" �DB��4+@�r���g=_�m;�����p�u�s�2><�щ�r���v�؎9�-ݑ��qߎ�(Z�5*��l�d���o�� C|}M�m)|^��ÅX������}t"I�L�Z�D�L�p~��{o=<.gaR���t:]2�ݙ"|]�0DP032F7���� Rd"°���b��� �6�Dj���n�����u�!�& bX8��vl�$��)?����������sxo��a�7ƨU=\er��|�v? 2[���km>l��e�����Z���nᔰ@~��h}�oRX��ӧ-��c? �3����!��yx)�(!&"U�����Z� 0������J ��{��UJa�B^N���L��dnct�62���{�E�b�#�i@���m�H��z�msO��8̇�@ �  ��[K3�Z���f�,�Xh��lG�H�8?�Rd=�j]�۶owa�\�"����.$*z�>U�C F�R�#���L�D X�#�%|��l��*A�ss���c8��c�� Id�؟.DZ��)�o��E�,��T�"�4FyDk1y�I ��`��CQR$�&K�(�!�}�-)ž��]�_|�D[�1�e��آg�n>"��j9�ZuY��Xu"V\D�Yo���hB��iQ�<��Ç$nic�1�O�t�w?{�3P���qxx���y] `�� ����"2� �dp�f�Gs���+����GzDz�#@d:�7��2���\�����^�˘��,��U���C�E��d=]�:E��o��h��h\=��8�_j��E�Gov�Z`���ed;&�oY�G����1Zǁ��c�r��K����}��,瓪��<?<�R� @B�1��`�je��Gk������Hf����� 1J$*�I$��J�����={��Z���Go������NW7o�Az�E� �jUV!BĂ��"i��FJ("*���J���=3!<��,D��eYk�=�HpD6����=���`� #��B�) ���[�'��G~�}`fRY����U���ZP2�{�e��/��O����v@�����-̵(+�t.L���{cL��ݐHKB�v@�Y��)�úgd`t��UVd~�|ÑeU3���� ����~��1��ܾ�R��ݼ#80q$u�<��w�w"T�s�"���/�K��uUR��D6�����u��a�>���>��D�%o�|z|{#���,�-s. $#KeaN�c8��hR�D��L���� $0�2��)Z2��*�Z����[��T�U���q�Ç��[ocR7�LyY�f�z� "2�t萢X�J��9��9$� EL�,U�"'h�uYY��"�[�t3�Z�u�,��W�m�zۙ�� o`�(�t�ּ�d��є3�82��,E��=Fb �+�vx�g��n��[���~��a���<?zct� 3��"���:�ԯ��ʺ�۱m��=<,��UdE�K�1"b�+/. ��;��^��"�8zj},E�Ā�L�9��ѧ?�������>Z �q�J�6"_��QK}��D�pD� �ɂ@��̷� �����e�zb�O��^^�Y"0��zZ�����x���[ks�L��Q��E���2SmXO�E�U����0��b#� f����!�n�\�I��]ǘ�f$��!a"$|e��~�m����L)J"R* �[�0b����m�ˆ4��u��j��'"2��c����}�c?l桅��q�c�f&"��i��zM(c �p�}@� ��-UM��,ƒ�^�p�f������{��HD�.�v�� ���f����G�������%ؙ���ϖ��/���X�O>�0��LL���} �PΤ\P�h ��h���h)�����‘�H��l-�u%�8�Y��t}z|�?�E���ÚE�N��_6��<`=����>�}�c�+�ZֲD�H��u]��k-���rY-EU_Cu�&��7ό}�60�e��q4�ѭ=��P��̿��0`��V&R���zw{q��5�Ù'SgNV#bo��L����n�V��͛��Tu:<R�F�b�����L! �1�lQ�3z�����A��!t"cX�B "�D11��Ԩ�QGSR���D���Z��ȧ�z#����= ?��qADK�]���"My!�aL�L���**�a�3��$���c�dB&�9?@'��TY�qֲ��e?:1i)�~c`�2�+_߈�E� �t&"D� l�Z;���j�zY�۱�a^�%����D�t�~��Hf�d�'d;�� "K|ʏ�LB��} !fTb�������6�8�1�� �-" _c�ƙ`������ڶm�}t�ׄ�@$HB��%��;C� 3�{��4Ţ�4��޻�2#_�����D�}`�� S �$���c����PL-%� �|��I�W��/-,9���X# �t)ٷH{�8�C&���s�Z����p33�B�Z*�����y�6f:ڄ�"�O+ ��3��\ُ���Ah��Ԝ&!s#�& ��CD�e�dD�a��$�f�FD@�3�iJF�{"�XDȌ�ݾF���; LX�D����e}�ջ��U���އ{dF�������C�6�����0�Ӻl�>�m��1��fSH8�@Œ �?��� #��5l^�w��c/��ޥY�%��[���y����9�@�6Y��4��)2��M6ɮ*� �̈p� <QFE�1�Ɍ�p���y�G��m�ŜA�9ӳ��X��&�`���X��e��?*��m�S� ���fo�?q� �/�>��H$'���+�y=b���oo� 1n[۫��X�GD0�2Zk4��9�'�$�;cd�u�ΈKڽ�m\c��Ϗ�u;��_~�!`�J!��9���m3�D麎u�Y�9'S-���_c>�8����8}<�co7��fv�5� _�e���U��2A{�Jg�iT��%��Ͷ[����:�_j=��GQ�#Kh�_�H"��c�1�T������F���˵�m��y���όb�@2 @�@$�(B%Mܣ���A�\(DpB$�� T��'ig��#�>IY�1�38P�F�{k2�=�g������Mw�"z��y �$��� ����?X۶�n�Ef� f"V����z>g�~o���+� ���o���QQ2Eb�z�B1S���YU>�y���*�U��̠�����Pշ�7��xΔ$��^w�V�Wf^׵��ki��r�*,��,�����QU��}'Q39r=���:Y����*W�:9�y��LVc���E��D5��7Ӎ�A��b�/�vf���S��rm��h���uM�b�W�'b�\��b��� ʊ �̄�\��Df��z�FDQ�U��U�̜�\E�qf&�C��B��ç/ �l�10�#���ʘ���1D�����s�"��/o����I��J �,B��M�P�bE�U,�D�Q�xs��Z"P��[��1\�n����d��6Ӗᕮ̧gA�}�>$�����W��Y��!��q\Slg"Y˸p�T�@a��A,�f��cp�u^�qfդy[bHQ���]�܂���v�`F�W.������Z'�mﭿ10���:�u�eD��8��JzbR�/�o��|z?�1�じ,���>zW�V>���+ba�LTE�z�(��(V!^i�����٘N&�F�c��T ����(0�{�uMI�ʄW�’$��&i�QQ�~<?@H�u�t�=��Q��s��~���|���j=����,���e�JU�55S��!����yr�I��o�<�Ǿ��+�Ĭg��Ψ�xT��ITbz�Õe���#«@�&��[�b���*�!z�����~��1�1�Jǡ������}�o�Of�*��<F�PU�rw�a��V�q���0���JS����h�n�7f������y�<��DѨ����>լ�+���o~�ӯ��_�_���-2E9���6}c��8�irF�H� ���V�T��"�~�3�� �"�f������qxDF���u�*���Z �9��D�3�Rj1U��UrF���ӛ��k�o7-�`- D~�ͯ�ݲ&����\����d�� δ�%D��J��Kx�Z9�&�RUI�9<j�m��۶�j�{8m[���ï�T�Z[�90HjΙaٶm߷}�32��oo�����o�y>���(0��m}�r/�"Җ�|-�A>�:H_�PZ?3�")��������E���o�Z�y��[�kq���>�R3�9�rߵo*"}�*Bĭ�����X2.c����<.�)FU%� �3|�N�EE�X&+^���Jd� �yx�}��5����(���m�=d�s�t�L0F3ɦf�i�#+#��J/bj�B1Ad�t����x<���cŪU���%%B������Ҕ�2�W8U�@3� g��,W��jl�z����T^R��f޺u��œ~�Ӻn�����*o��կ�>�㼮��Ki��}������o��Ȕϟ?߶��a%&Q�r�V�(�UƯ�c�*�PL2|� j���M�fӌX{&��*�j��� �I�s �� ��Y�zc�f���n�}�nfB�����s���vO�qׯ�Ώ�!\�E� �a�f&[�DY��u�,⢅�\��t���� �#<���%q%D8��#ܣ�l*����)2ETX�[1��D�+��8��:+��Y���HI���I f���0aTu߶�VېD���'�����&�UEH1��Q�ĕ�%���^Yc�H @T�\���9����ޘ���w�w��$HҦ}�ڬ�U�֙m��͚�p���T��l�X���y�� IDAT������Zb���Π���,V�L��j��BE��Z��~_����g��T�1��|fo�Vy���[3a���3;��1�����z�Z&�c|z���\W��Ec�"�1y��P�Xw%B��Q�Uƒ�MG`a�,mˊ,���Vj�]���.o�q�֑����g����U���DA���p���|.�����O٤�yW3`�����u������S*+���8ϋ�HT�T����=�|�6!��#`U��E��~���9�m�_��ڞ�Lu�y���Q�ʫ02�:����~��He�IF.)Mk�L��5�S[`z�Ė���z�V%� �������Q� $+D�,A�s���D#�1"#U�����wi�WD�7�Ȍ<�ӝ�����<~����x���-<��:��r��։�Td�r]\��f1P�I(����9�5��8�sE���4rQ1 o}����U��� &�6�Ȅ$b�=bR�q� ɠy|P��w���h�#�������8h�ϭIkbTu�9#��jD�GT VH08�T�9�**� ��ƙ1}���E�*���'�ɦڒ�VY%<��_� }{���$"���r�5e�zY�#C@���l%^�8cx�y]M����^'��wf#VbfB��D�g:Kr�I��d�(��ڽAPD���y��z��I��|6� ��ڈ�r�=*�1��I�x>�y4�Jij��<� ��qтD(�E�͢JU�f��"b0����C�M�{�Ͽ<L�7%N������դ{T���0�Ql�� ̢ܛH�0`�B�D������~�� �;#b�N��>LUi���ၪ� ��U�D�,{�\��M�ڬUD�l E��k)�1�i�;�##�L��5�{'L�c��0����+E�1@��=�#]d�����=��n�����@"��}᩠k$��t�{~4�i) �53W�~�WU��<�'��mg�b-bI���" R���A��5B�s��N9���HZ��u"a�u�D`��J�ܪ�Dyͳ%+cm��x�����y�k�&tۛ�03Ed!|^���@�/�T�Vai%S�_��^TT<Q�:���q�_�f���`e�q�I��*/ʕ( Q{���缮1�W���H�PPDL��˅ij���l'��$�G2�=�v��D j*BsҶ5�9|���m�����e���[c��7^�7P\�32���4 ����NV ��s�����F]�x�,u�v�,�D�LXX��� M�|���7طM�#��֩��猜�w�q�o��ǹm��32s#��m ��y�߻�_��_^?����YJT^G�fjb�~]c���4(��D��&hT�q!+<��pUe$Ι1���*�j�F �YU���vQ՘fZLYi�ED �!� ����� �¶[��?B6d�1GEh3�#�9ì���^ӳr]�q�$n���2��R���b�F�քd�QR��������"�R�DĜ\h-��;q)D��8ٓ���u�3Gf5BA�AfQH ��~eTU1+�ۊog����,����V��Rf1T$ f�墘c ��D�����s��u�m{���O,r��Ɣx`��5�HLP����/����~�������,�����3���Y�UL�j��{��D�ph�7j��H.ֺm��>��"�9 ��Ă��� 3�R�R!�k$e��@&G*�y����?_�2��w�,gʢF�k��u�#���(�c�\Lm}!���f�!�n���<33�.�L�v#&j�Y�5�@US�M���k�ϟ?��zfΑ1�Z�Θ�ETpz��D�,�t��p$����H�\Vv`!@T�V^� �#X�羑ȧ"x�B�h�|EDTL��d�H:=��Δ�{�z& <F�ڶe�aMT$��f��~��ϟ�lc������DT% ��3̙�cD"��t˝�J2K��*�R[�IQkbf̬��caY�����m��9�� �?�㢌~37D���t���������c����i��x����X-� ��E����B�Xa�%�J�#M��V2���JI�/���-�3���Db֤�bS��ۺ���{U�* �s3��5�U9�(o� s����P��bBo� g��T�1fE�K���#K� U�U�aM�#s��U�BD"��Ȫ�m�E��&F{���1'@jZ�9\۾��0��U�5���� ��}L�z��1���E@�#j}o!uE&e.�꺮 Bf��VqMM�fb�kx�YT>��)��X�<=��KG -x~�LfU����q� >�`��/a������q�BN�d���z�q��r�uU'�DR,"���2��(�Y�6b!�DxbQT�9�V�Y+K�3 32�H�P����6G4���������9��k��D�qE����P���fF�d�0E�D$ �Z��aAr&ZMI�[�7��Z�'��u]sN&*OZ!��5�$2�ʘ�y�kΙ5�7�c�1�HD.�����;2�v��~|�6}��=|��+-�@�ʜ9�,-2�UBU�~��p �1��M�w��wQb��3h�Hʶ�sLg�.b&�,�}x��㝠��� �� �����N��[D=�q<�:�7N� �mf�*k��?�s &�%x[�b��9F��x+�b5���q�z�P�I��BP�(SUD�^��*�5�QL�T�H��繚���Y.��0_ ���H�F��j,r�1�+��K���� Pf���*��cYklԗQrݨ��*�Y� VV�kĜU5}�1笘�IL��[f��y~����&��x���u߲�q~\�,d�b��a�k� ��w�d�C�Ru�̞k�ʔ%�m���v����1�I�x>��M�1f�V�H���J?`�]�3�5N��x��w2�%���Ƿ�q���V����DI�yRxV��?#K L�MEMI������5�Zgb! �+|J�+;ϑP�39� 1!�$�ED�9<� ��O�A��ƨ�/�y �%�Ԙ��"k��`��7��L�TL��P�kĸ�XUzkF%��R}�"�����y�gD`�A�n#L�)#&��q*3����Q�eL�XƜuzƬ�k$�����~O��V5Y��@x���������(� /,h �"� )��d��R�s�����[������̳����1��93�o��Ҍ�J���bwUU^d,d Wŷ(Pi�x���||}�Ϗ?�b=�� �H����%a_@ȵW��$�&��ۭ�}%K[�ބ4#<§��m�}�+ y|<���6<����T@������w��u<E�YƜk�_3�*����d�=��Y0�*��f���z��s��q�p�M̶"n��1����i^��\�DSef�$�*��/�Wqf������\���#�|8@LA@�[�Ƙ�?����9~��_~����[�׼DTD<"����������edE�j���4�m�}n�==�q|<�kTUD��&e�2*SԈ�gd���0�K�1���F!��v�_�>�|��=�+���~\��ʜBT�8�u��5�$hk"f,&̢j;�.mH}֘ U�����~�����9 W$1�I�℀Ԕ�6�IC�y~�x|}���Zgٶ�VΑ(ePDTѾ�Ltm���K̷}�b⬈�#K�*�m�P&(G�P�͝�71�F��"�w�3����2gF(z/Њ6���c )ˁD�WE��3Q�~}���qxDE͙_�=�bk�5�t����y����B�.F!Q��0�b���#T& +��Xߪ�Y1�Yh� ���He�q�����u�/?-3 ��u@4@���M��_N�_���q�߾�K��m�k^ǙIk���\@N��dHW�*�$�����Lepe���E �Ws�fLD�6b3�%I�o�R�(-��$ s���"��Zo�n}�nDx����K�M^X��s�',<�kαjgQX^&�D�N�3N!���( P1���3�X(�!��P�U��>��T�Ғ_�̈9�9��##���Ff��x�O_:q#�+�1e�ȫ`���)�B2;9��DUL%L�i̽o�?*���"X3VVV��m��IL�3ƭ�n����Q3:��}����{E����:����SKa�x� &��"#������XD�zSU*�J. 3�5L{�f��(Ѧz�3D�gU9�#d�o�gJ:�@�-���v�eT�s�kz�����OwNT�y?�3Dؒr�uR����"�d��1�<�J�!j��{^{dF�.��� N��{f��� S��_ R�1+����c5Ϟ�c�C���O�q6�h��rfF�يe�B���x4(�1������]��'n��e����q�W��N�R�t�}�ۭ���Z�{ND��H��_��w�z�����1A������k�/?�?��o��~��|^�+ݝ�(��#˩e�aS�uR���Z33�CUY�K����ݯѬ1%h p����"f��i{��b�m�߉P� ���,��4L�P1�s�nEQ!��<���Y��Ӈ3��Ӂ"%��)2�#���v�̪�(LE�  {����0�k�9���5ǘ~-�< ��� ��q�5�`�gU*Ӆ%�� v����u��`b邗ݕ �U`��c��@�jTԚ������T�q$3�4eS��8 �Ǽ��O����G�yQE{�}o��$�����?�!�=��YQsF~{<���=��+���[���Ŕ��� *&1y0V,�H2K��XUa�5T@�N����>��lW�U� ��d���~��rM�U� AeT SeP>O��O�g�Us�*U����nܧ�r*˺ի,��n���1�_c�K "Y`&�s��V�B��gE�*��J�E遗_s����yGV]וnf*�\�<�g�Z���˯����c�3���A�� �g� �h*�$��y��}�T�� �pB�ֺ�O�faNkm��I�u�9/UY��,�p��y�1��9b^U�R��'W���÷���J�{��zS�C䴲zk[k/�,����!TD��3�Yb�B"RT����""�S��WXdD�u}%$��*�3c5^*��� ��,�q��p ��\���T P��h���z�.E�(/�U����֔��bN��,K�'"�uU1aY�����Z��E= ���_}�n�_�����x�|<��1�G�c�,V�0�m�P�׏Zom[�$%1�M�r�sie2JE�q1A[�L?ݶ�y:W}�����h�QF� ���g��Nw�3�\��$2}�t R��9ψ��_i�2.�������8��?�5�[���������&�d�AUˢ�`j�e��ԕ��k*� &wU�������u�qle�*_-f�^�m��(jf��^@y����� ��X`����;1��3P�,J��=Y���*�@��*�hזY(^��|ٵ^_9�z�u0V�#��R%aQD��$Tb��=�h�������Ȣ�day��EN>�'���9�+���Y���۞Y�"���J�+,moo��۶���'��O�?iۈ�����M�L�[���Q�<�SUz�S��U��$�m�>�3�~�qKNm������y��u�90�C8��qe��dZـ�5r�pe1 $"�X��� �,^��܈��� D������,R�b>̀ �}E Q�l��_U�̢Vq C�� QM_N�c�Y^��*`�"��X��1F���}��n�M�Yc]%��u�Ng���Fd5�">�k��G:�D���/����Q����ua^�U#[� b�{&e&��= �_~� (T����Θ� ��@f���OoH�o��UU{� X��;K[z�\ TU�J�e-� ں���NQ�"��K��1+|^�(Ex�)�۾_$���9��]ÿ�`����oߦ����}�'��JE̙����B��H����1@Yj "b����؈@%UTEJ��I��W�2+���#�UM���sf�8�, ��0�Eko���S��u;_X�jƸ��ӧ�m����1�bPe�T5Qkxe�q��=� ��.�rf�*=*�Q��>��|����m���lۖ�f�Yѣ`�X#�W�#|������zx�| ׈�mEc���ͬ������Zo������4Q��: �֬u᷷�69��x<�r�Z�d��sN��[�3<���Fđu��||T�*e��O�XD����_���?��Mr_s�B&(�@��&�$����c�����~.ʀ q�J�J��J&&��s��p,� � HF�$q�L�:�j�?1��㺎9!� B c�*f݄��9s�Z����ʚ��֬�{;�WC2Xo�_������<�%ExEU���]��KD*Ɗ��q�/�>�0kz��y�>Ff�|��$S�a _��� "Q�j��)��Cи��tB��~�o۞�����˧ۯ��χ��|�Hc}{�ҷϭ������B2T(�n��_~j9��=�)\��4�ē����0�D��P�r{:�?��q^����B;�������o�q7B���Ut���e�}_�1�q��]2#BUb���Z1/Z���Т�EU�9U�0_ሥWY����0&�E�jӫ*P�s�,�s�l��J^��&DD E�Dx>�sD�3�#sTI�T5Τ?ED�-e�u[�I���"��� �<��1��z?�U�s^��e�#��*Pan �<)ց�"��HUA�+�=��C"�QMu�����o&�*��.f�/_��mQU%( A*�H(�d�RQ��N������s���u���Bk����P0�!2FĕW��q>~��_ގ�k�wb�������7��,�������3�ڻ�<χ���m��7Z�� NA��.*�������ӯ�QD .*�9�J����Hյ��� f��"���p�Li��z�Y��n]W�!��������288@&V�q��Mj*Z��Ϙ^�w!C�M�u]�R�֥��o�9�s]z���㒇dqf�iI�m$�(f��D�=��I+=�>|&�X�H����f[W�����m�`�J������IB!�*T�L۶ �Ŵ�إI���s �L�o��e�d�B����~���_�CZ�J������������2� �g(�ң���C��Og*�:�8#k�Xs7�&��w�=�I2Q�)Te�>��� ���_�g�*�B1�=��QIQ��>��9��� � �����*�<gd�媒�ˊJ���{���8KҴm���Ľ7&�����YT qk�i�yeͨ�"�$��Y��m����1��:/&^��%8`$ʔ�:�8D�����a�A$@�W�l��Uo��~�5+�P��d��m߶~����Q̕�T��bU�.~��0b�v.RqSUc�8�Wkr�Ҿ_nj�sΏ����w������0�x��y~j����ND��Y*�m���p��+�Pf-�22+����{���%BQ3� ���&��o<���F�8 �\j+��Z��E Ϙ��JUef�w]��s �5��D��dxz��qfrƼ�(Jt��_E��}���1#߅[�*k���Ә���������7r^R���9ָf9p�HT��V�F�G=8/_����H�~x� D���ɯ�|j�Ց��Dl��#�����%�Q�|a뿝��F�\׸�S��d����Ԙ<G�4U��� >�F̖A�Z\�g��xֿ&+�7�'�����ۿ�/��K�I��8ݝ�JHhVT������y�dQʈ�~΁�m�mj �E5#���d�bqqy��*� � 6h\��QT�q�_ 2� F������"BT�WU1CD2�H$ң*��S1/nt�X��bAyD���H@�����ܲ(�{�x$"YH�k+�{�\�Ӊ�_�T}M�+=��gU�01��T����8�\�*i�D�*75�~�r��5s�(�6c��Pm�5�,>�93b��TI���NF SŊ D—��YHԲt�I�lL縦��k���߳������oo�T%��� [����2/�`3p�GSMU j�U*b/0H��ܧ���K��0���-̈́�bdz�0�5�U�D IDAT�s�c�LOp�׏u�(�����$�"�jz���s���_;b%�- 9c�1�y�1�1��,D$�5�#�FF]�u�sN~||��K̹��IT/._exe�="(�֞����j&�Q?䚋�b� -���EDU�����1+I�T��@U@��5U^Y��y�`fD$�U�8N�K�q�sx�L��������q�?�ʚ�������7o ������n֙8s.B��_;Sa�n�Z�yq�*�k�c�t�u�]~�4����!�����DTe�����tW =P�Y�U�gd ��Xd]-H�GULf3�H�9Wa�$��U)��U�[�(r��X-�bFVt!�F�k�uFD)ʧ_c^cĸ����y��|�qo�cIr��}�����Tqmv�lj�hZ� @�����FM4�Y\�X{f�v�qw�oӅ�$���Y]��m�dF�o������LS-�N� �n���` ��������������<O�/n��|>��J�\'���u-L�r(�f�H!bK`D$L*3RF�Y���o۶��4ՙ����궯�������> �����7����_�,�?gXM{���_������?�)u��ݼ� M��j�@� B4sL*�D��{vaDBf�4� OC�4����=t7"40�T�75���BHi ��TH��m�H� 9O��X�A��b����2��%"1���N��" �3���TT���P�"���X��3 a.��2^��NԈr��Pj$!�ka�~U�(!BeXr&D�kƀ�ԂnMa��2G��2a��3��r�755��X$�H"�l�ĉ������!�\%\#�3��X�T�H�f�"; ׌��$S�ܛ��9��������/�����*DB,$�2y��0���_��"2!�+"��;xP���Fĥ�A�1�!��ƀm oD��_�'x( $DBs���>��F$4W�)C\X��#<���gF������1��2|lqAdb�E���x'�@x��h����wS�OJ�U�q��뺩��d&�޺�����U� D�bw}�7�����b�U�����I�Zx�nf�c�p�3�z@ e�T����B9�d�w��c�C���)3Um���:%55L��Ixx�ڧ_���E��O��� K�W�����[�`*5 9��� O^"M�}��Q�#P.�n�[G��`!�*Hy�w$�{�'`BA���V�C!�(����q�"bz`  ���9ש�j�/���!=2���r-#S��?�!F~ �%D�Zoµ2'P#@��强[&%b7��Á�� �<O�Bd�;\��FK3 � �Q�! 12"�"(LO3K3 1;���\\j)�� U.�t�x���mg���Z�-���E ��"Ӊ��=P3" <R��[��p)r�[���<(�l����顝/�?�� }{��oN��� ��� �H�h�ȑn�'�� �0B�,3���<�2.�,2az7SÌ�H���ИkD5�}o�t(��8��M��Yj@ӑ>�P�m�nѴ7�2n�Œ��0ڷ�<�Ȝ��,�>�=�1 00F\�$��E�N�V�3#\=l۶DD�ޛ��ty�Z�y�������L�<�r�2�w*L����ƀ�f���e<׏��gD �4�'����r�_�������+6Z�t3�=F�lPgOڞ7��gz�Hh�{����T8"�GO@����[o�j���ڿ������'_<�ǟKA�k����ȃ�~��32�sp��&p����{7�H���֞^I<�k�е ĺ�9Q����¨�� ,��wU*%S��[t������ �t�;!"B�J�����d�KBf3k��.j;`q$�Gw�{_u3*��"����O�SDPPJE�dfU���"�D�8"�VI�A�3�Q' L������!��(�P�G2�/^�~Y����90� I�����Hx8Tij��)@ " !"Z,�41�%PΗs 73�D�;%���鋯�_=���ھ��_�?8Pw�B����� � ��!#�Gh}($\�u����7�$�����;Dw�X�̠@hZ�;0�aq �R<�̅�2/"%/'Su��� (�� b�w4F&��mU3�B�I�}�������R8�2 O!�Dk��z���v>�ՔK�������o�(2 xlL@"y� �h�DD���c����5�轧 sq A+��kS ������~z>'�e}�k )u&��|s{2���M(0 �O�o_z��|ۚk�M�@���[��������/,ȼ��_~��O���s�f�AqPhP7�HW��i��<"��U@ޣoC��I�x������$��j ���QD���"B#�pk�Oe&.�Y�d���r�d�p��m�6��Z�x�Ʉ�47���!�$� U���!G@�Œ(EJ�mlO �(D�g���2s۶k���u_��-ں�@4���@"dM�j��M-�ݝ �S�F��ӈx<�d�2�FddoLP'�����tz:=>E���O�k23r!�B��tN���$�&"pQ���7����|�Η�E��)���������{o�����ˮ�n_��?�p�yj��-Y�sP�0P���M20cLM<�C-¯����#��������{�U� 3�ܪH����C��$�0 e���)!#b��sI&��^����r�a���&B"�‰@��\������nl��Xs�cB�i�k33C�ZeԪ"��=�Ɣ����k�e�PD�L@mı��@ ��4LL��/�]��&�/o�㋃0�R�,s嶇`s#�I�������{k�� ���DP�ҁOO�};m�ɬeXx``����7�_���/~�k�ֿ�`}��w��ջ��O�9� "��13 _�Jȡ!�")93"�i$�ٮ���0�4U�@ȼZG23F�0#9��0frz��[d�k�Ӽ,Kf0�DܢCBX�������M�0�h�(��ã���؃�x�g�"H� ,��c 73�L ��WO��#���ٮ�@���=2�d=����æL@�a2�T�̈�T������05#R}Ȉ��s�W���;i�7��q:��~7S�2 �� � е!IF�jg&L5��u ;]X,�ytH`ψ�R�>����Oo���3W,H����g���9�*�T�2���*�b�����$S�+1!d�K)���WW0s1S������#X��#����J7 NTČ��V�^��R*�"��B�<M˸}0�<�%��:��{b&�3� KF*""2v�j�E��N ��Z�m�}W̬ۙ�ޚ�G��̯}C"����ª��>1�2~ ND� "!�}���^s��ߧ�2���9�Ȳ�����?��p��J-wǻ���R�Zy�!io��V)ĕG�̝��d �*u�{۶F��7���U5��9}�x��/?����?����} ��ӯ����/~����B�;� ۷��BH�`�e�T[�@�>�%a1LU��H�̥3����fY�x�A��",�� K- B�aͼL aT����/fj��ur�.&BbD(���TA~+��0!Xo�AT�[�mЋt�[�;��jF�D�t(< C.�e�ɇÁE"�t9'@���p��r�P3)��y��YF��9��!"�2~���Wu�I���Á�d�պkJ�����:�� j�D�V@$&M��x�u�ý�nM/���K�Gl���û��`�}���_��_~����o+� �@j��Cd�v��5 �ˠ 3aG��̬��"�&b ��"�i��M�&�tX�h�=���ל�q���)RJ�)����L�L���'�����%�A2S���fr�pF2&b&p�=Ѐ��3!���wo�" �MUGz�},�0Ղt\��y��C���/_�-˴�}�-�����y+��\�ه �iwĄ�L�p&qψ�R���r��x�; J�LA D�BKP��͆Jj7w@��2.P$P�Y��nnnH��a���{o��;��H0�k��E����g�~���7ZX��=>���O��#�t�L��B”є�3#3dl�hztd&Z�ʰ����*\(lj��F ��<�Ñ���j���Ԗ�2`WsS��5�" �4G6̀$J\�CN�֓�� �L�0���cԝqmO���Wf�$1��M#�,z _����oۖ�,��"SfD# �Z�&*��� �w��/�==��OM��p�d�f�[.B"2� ��I��� @�����z��L�r�E�JB8�A&W�"b�R��� TOϧ�������G���v���Hdj����z{sn_}�����o�IkO�����/��Z�ybL�187w�9vO3�F`�p�c5�Hh��(��L e��p����9"��{o���0����ױ�=�M���_R�P�o�DRd��PdfI5��|ٞ�c�u9&0I�:Y�vݷ��aM�y_����a�RK���C���r<N�"R#����$`����T�^�9ҵ�4f��)#ZD469�eF�*����>���2M�≈<�{���_Ƹ?�H�$�n�8�l��s�� X��j�ޛ��9�!�f�������ջ�����O%���W,���O~������pS�<M\* �� �H��p f��(L����U�m����2#e�̼,Kx�u;'H-n���H�U$=�}����p�=��Ừe���]w�RX����a����Lf��� �Ōx��I$�#B�᭫FXx�S�!G���V F(T2�8� "�z�(�@�i� ӻ�� LR����� ���B ��M=K)IL\"L��� �Y�NJa����#2J��m{k��(R �R�D �"g�����`�@�Hwk�[�]u���Zz�� ����~�/�����t���Yf��� 5\d���x'EL�D�kړ3�g �8��@�N�]<���qb� ���+� ��"�\Ě�@Oa����*�`�Zk�i*��˃e#��ɂ����; w��77ߴ�ʜNK9��}���m��_ HfD,�h�BZ�i R߶�w�����։F?� �]Yw�����L��7�Ln�~�ZD���2�H9,�<Mۮ#6B,5 �53c��2{W���"}�L)���(�yc�Ll=j��{�4�p�m�Vm_}��^.����؟�/P��_���"DL ��Vf�yZX$��-$麹3r��Rq��C �H��Q9Rc����zcL(�LWc*$��uoCόI��T��!k��ڞ��V'4��\��i�1!��$��ɑ ��tWW��v�.�}���i�/�z�V�����ҷK%`�R*aEb���L�P)2~憜�4!U�}��u�����4Ԉ��kv����áLeN��Z[8�/K��91D0��Y��}����������vn��t~||>���ݶs�&�jf�����(�j�R�f�n{k[�|���_�V���/,���}����N��T�1��|L��F�5m�p� �$,S����9�N�U��4,��="�92�w����i�&��I�e����z�P�j��ᒞ,L8�ZL4�RDD�SD�Q՘% 30�} 5�� �/kkm�]MUu`rL "s;??8�2f�3Dq�p�4��X��x�g�Do=3��Ǚ.%O���qݚG*�0��2M�a�o�����b���+�D�����ps8Z��es� y�lۺ>������b�����y����7p)<K�aQ�m7��L�<-�۹Y���E����e������Ǘ?��O�L�8�ܐ�ijf��f� 9���1�ʙ(��p:�Q�!���,�J�Re�B�k6��e�.>h#�,u�B��3��*d���gh�R)�NS�b�cPI<e�����y�o�o�漢 ��f�.8��kdL�N�K����4�S��z�!:dB�]ۦ���hZ�2�U�}�,�>a��勗ǻ�����Ջ�7u��Z�y����Ӣ�[���/����n���kx�p������L�<�T����U� YX�JQ����r���鳏>���ﵰ��v����o���L�`f��[xwU3WU�@H�fn�I\����VaD&&$NK�� w!�R�a�Ă�5�p ���6daJ�ZEDXj)\�B�P)=M�x�t�L@��Z�X( %@B�������f�Z�[�}�9.�a�� @��=3Y�KbSǰZJ�� YT���γp���' n{�� �U�S��%<!R��N# �tP7�p�pZ��x��ts�y��մ��=�ݛ�������|:���{�9�'X�����8"��²7��{� ��L"O��e�ΗK�wo��^Ͽ��o�_ �l��-@ƾ>�����2W�b���ul�&F�Y�qmQ�G���rMC!�T�4uD���BJ�1{ŹP@�����0$�R����$ &�P�͵��@�D��zo��rk�t�Ld�l`��[���=��[k�+�0/����2k���j-\ƭl�&ba@l�ᙐ8��ֻ��!e@>>>�<ߌ���i 3��,T��R�BM�*�V)�2����0�]��?<?^N$ؚ�}����A{G���5�ڶA�T+ �f��Z*�z5�z�c;����ԾZ����}�:^��3�{��������� ���|x{@�L�X���"�Y��L�3�dd" DF��p�#��G�gШ�3Rz`�bA�N(�Q�i_�W=d^�I�z�"&�Hw7BpwOO%�ӣ�ZFzt���z2m�]����r�"a$"�:bt�EWK��x�Te܊�I��k���{��id��G�晨`$��2E����QP�; f��4`)�{W&���I{�n��}[���9,s �(�PJ8X�C�n�-"��w���Ln������O�~��i��U�-�Xcm�������xy'�ԂE��]�mDdD�h��[&b��"��p���*A�k�25$�<��<+YJ)�Ȝ�0J� RKB�����q-ӈ�% VF�Lս��n����׳�ֽuM�]�ޚ�9"��G@o=<� �Y�E�T���˻WSY�L��2-@R�m�ߋz���k�OE��(� aI�R�0�i*ӄ��2��\J���3ˌ�q~ywsws[�R7D"e2�����OOO��O��s�����������X���n���,$Eus�0���~��W��_��o8�K�XW�ߧ����O��/~��6%B�h"����Vs7���k�D�cK���#}+(�H���T� ,C<F �^.LD��s-�<4�"�>��lf��B�Ũ)��/BƚI��2&mf����zn�`)"�Etu���̫ ���s�Ł�2���y-��mJդˮ��M]{��Zx�4k����BE(�����ۥQMh�� Q�`���]<�����K��=�9<n����ǧ��cWu�2��l(F&���yfL���!<݆M��k��j�?>�ߜ��?�t{x��m.W�ra@�����?�?����խA ��JHRJ��b�} 0�q��A=� J�i("�.�WD�n��(�ʠ졄�³o�9�a��*ٷ� ���r�#����A\�#?�n�EPZxn�~U>G8��H��hZ�������Nk� �ޭ86�����k���m�y���}*���j��<�E��LMu���֝�Q�K ��nͽ����oO��7s3�pE��Yzzdb��x#w7��O�[��E{�~q,��>���/���Y��\U�~ae������~���?�����}��B� ��W�*Q�wU���Y��u�4HG �T�iA]=z���,B\���0#RX�L�Sd��tC� 3���{$'ZF�_����A�",H�D�1��H "�̭iF�/_�:ۨ�9�*�� D�Ǜ�L9 �f�g&`�U|�]9 IDAT���p���`ۺ==��i"b/ra|>���YLȀ.�P��PF)\E��c���=�O���֚ZCDs;�FB�����(L��Nǵ�D���L8�j�����Oo��J������w���wy�f�Zoo� Ub  q WI@E����Z��f� ��9*QA��$up�c<���&�ؓ�"�2 ��FD��f�X�8�s��x �i�o] ���1�Lf*��Ⱥn��s�+AW�L�����`B������\�k�r��2z��ޞ��*R�ʧ�������ҕ �1c�i�����"� �y�\�«�a��NId��k{x>?�׶�۶^w����3=<F�:S)3*cg^/���E�V�f2���o��xs���>~��g�_C��XX�ۺn��^ �J*m�`e��5`@��Wk����6K ��%H�@& �tbdD ��X�P���\��2���)\ �M!rf$�{��y8X�EH��@I�:�:M���w�抌�0��� ",E� �+�S�8�e���R��e�t{:=Gئ���1�"�����SP��a$Ef/��T�*����֭��N����ۛ[�n==�{���k�aİ�"� �9�2���ށ�2��v:8"�,<MM���r�~��߾����z��~+|C�w�}�����?||��|�W�Y�3ǹH(�잙��F:Dr�XM�(���L�œ����@Rj$d �6,EID�@���j�~�ց�&��H05C��L��-a�3r4-G�b���b�a*�SSk��s�e��L-�`*d��\k�����������H%���d $���H�݇�'��A]���wc�\�+p�\��:,�t������v���LpH`J���3K� �@uZJOcL���������޼{�Ϭw��� �?�����o���?�ްaU�6\�@E��� S�����)(�|>�H�H&N wMD��$)uZ2ӻ��<O���P�C%P�ko1NS!VAh�"6�D��b�Lt�k���a"!�*�_�Ƨ��˷��)"��T�X�x���憘[s��4�y���x�n,����o��}�mU��0BN��I��H��2�a]M�D�!���pS暔��CGA������1��c�G�"�7�1}����͡�zs� �|�<����~������_����:d�wYXn����^��O~tw��=��8iWm}�F�44#����8��&2��"�J�L��N��9�R�P�JM@�H`�a(��˶O�x�c��:f -@����� ��1�����FR�\G�Nʥ{&<,�˻�����W\�!b���f�x 30�M&��zywj���>r� ��h�SBd23�f��)՜#�����Јed����j��=2�|�0�q8� 3!,9h\�=3Q���M�\��{_[�n���o޼{���w�������>�Ǐ��t~����H��P��z� `"��6G�6" ��L3S�z���s�{)�<����y�ɱ�a�U���[ۻw��Rʼ&Y�����M#��i�="Pjs� V�2�M)�����;�}��%���"r��7S톑�,ű>=<��4���YJ�D��x`#\�,���j�j����~�� �#/��P2��t7U�{77ww� �? "2`�K2� p.���F���΀Hضnۥ?��/�~�꓏������O�}{����I���8ž6������E��)�r �=�LIKq@�qy.�$nyU0@�9���LR� FB�B�{/u�ur"��.����i�d@}H��4\=`�������l���̷��x�����.���rf�z9�������[7c�@�����nW�/ �0( �;l[��HaD���kU� �^���ի:�H�H�����~Y׳�S���Ջ��R�i��z���i�P F��r�?{��ӏ>�<<�)��o 2���ֳ�L*/_�(��{�9���i�$���j5�!�K���M��D`�f ,B��z c���V�L&/1o�h���DD"#(�����iNDbdW�0"t��v�=�#{��}�N�����2���i���5����$n�w�T�p����B�d�趭�6�_"<��{k��"�� "g���9@ ���|�u=�N@���n{dQ)2�Vj>*�1hL ������q�}��DЁ�[\�uk����Ǐ���W_~�!�����[�P P-�r3���Ȅ � 2�)d�%|��F���j��*2"��,���B��:LKR�V��d"s߷�#��X�X�`Dba���{�ޑƿ�"�mc�Z�M۾ﭛ9a0�H�$N���|Y��ߛ�i���H&�D��ә ��[��۹놐,<ȏD�n�#0KD�00|8*'����{���� ��� GPµ� �֬�Xd��p�'*�a!H�n��?�p9�`�mf�u��o?~�����W����V�m���t�S��ò�/�^�uJHb����P DV5WMB]��v 75b��"�Z�Q̺�1�i�s�F3�<j��́3a��3�:�Z�̴�n���C5 ����z{��#�*4�B,�~z8=ܿѶB� 3!$�����w/���ܞ���msk"�Lf~=�y�=3��"�� ���M��/_��\� F��+ ����Px��)f�_��G?L.�y%�W��?��j����|ٶ]/�������w�����Y��ޭ(���ĥ"`tU7Q�k��v ��PG�S�ps����2�~EF��+� �f8 UY\��� �1Tu���i�R�4/�iZnJ=�����ͼ̕��CJA�u�|[ z���LR���ֶ�]c��~����}���|H�q=�Z5C��sؗ�1~�Lx��?���q�>�1�GX"32x)t{s���e��x�y�!̇�5W;,��_��p@.��i��?<�����/�S�w8������t}ںg!�m�}'�I� �)`�%3�H@�HaH�ݣEZ&Z�#q�G��Rƛ����6@@O!@p�p�t�p�9n�D ����"E� #K���D�b��<�Ԥ�d)E�Z�_�,Ǜe����W�4�纭��%�@e�B��O���n$�mW� n��#����׉� ���d6#������'�������@ܚ��ʹ�a�Y�V����%hY/-�K=�noo�馉\"�=����k{���������������𶭗��w/g߻G9�p��"��r�5C&���W"�" #���^j��T���3! D*���v�b��f . ���w2sb��Dw0$&*��:f�j�P� ���z9o�T� p%�@D��޷�Frd�K\2��dK;k�00����0�#�4��dU^"��!�Y��.�Iӭ��D�����Lj'��T 2s�T�c�n�!8��B�L�dro�����u�ÿ��o�B�d j>�|�B�U�� `�jA*5���uz����{:��ܜ�>-O��mY�����<���:~-T�Z�z�n���?}{��ͥ�}��piW$d�љ!%5�N懘^�4�b��n>g�\󑆪�$)?dJ10�k��9��bjz�2�ju ����ͬ��k�m�Z�� �×Zt���� ��y���h���� ����1g&f����5��W_��@����ߑ�c8�u����)�\�Ԃ�禸��3�|�u:�M�����}[�����޾U�5�ի�e��~Y M�)3�pa��du�k3�aH�3z������sK{�"�L9��y��i���!�k.�H���H w 3fʵ�D.����32Ô�v���c�1Ɗ �S=�*��[k!":ć�6]d��ж�m���>�TApN�1��=��Pb&�W�V�#ŗ 1eL����4�:����#�Ǿ��'��r�32[ uغ=~|L}{�Ý���>^�?���{Q���Z�����/?���_� �ڶ/K���r)�����4<��ގ� �0�2c�Ah���x�E�>�G�" q ��8�.j)1'���FD�K)̄D!6�5�H)g ��u�O�Mho"����]EO�֒�� �5���CFF,̉�)�\��#�@$Ĝ��8OS�%1�y�9�1lJ%���>����]�t��bv0m�ԻypYv�6y��>_!�&��_����~��_� �m���t ꌔR2�19�|C�B=ܷ}�{S�`��3X�\U�铉�;��G"����9u��o]'�����9�|(= "sN�ԒrJ)�Tz��@ $74@��sD��^^��vs��#�r:��f�hM�&�oD�G�kNy��!�8�ĉ�~6EL�)%b�)��ĉ��s-)��)�jfΔ!0��ֺ��u�{,׶�{x�̀j /�dս�/ח����o�������U�o�&��۶zʩ�Χ�1t�U�0�DD�lbch�3+�� s $I��ܥ�CFPuMD� ���1(Q �`"�˔�r�)3q�R31������1L��1L1Q ���E�l�o7GDJF���"D{ﻃ��!:�#����`�s��<W@&"M�@@<]��) g�h�S&5�۸���?>}x�]_T�m����*ۮcm��O������&��?����Wn����i���Rr���`fa�D��.c GL����vD_�L0|ʳ���L�)���"23���2�{P�Z��s .���9�Z�S.S�Ή���;F3~��*�h]��z�[[o�� 1r� �&7���Z�!Ce��zxx0ұ�9'"J)�᫽;3���j�xwNw��e�h�e]�[�-�}���t���Sb ��F��/˲~z~y����Ǐ��C�� XǺ����7:l$�ZQ��8�P;y���0er7�<<�!8 8�!�ba���@��.g�H%s�)� N�<�4���;��Ý7���8�˲����G� !;n[����۾\����qLjќ� ��~�Eꭋ�sJ��K.�䜋#�! �i�[3im���r@ �4͜r.�-<LԺ�������v�����m�u`���ӧ�eSs�������i*%3�c$A�e:ͧP�idNbbn�XUì�����D(&L�s)GO�S��<M�<�8g�!�E,B�" ��8ժ}�[[��D�&[��>�1 P��>T@�$�� ������(�L��a҇��>�Lq�J�Ճԣ��u���_S��P(&���d��T �ֵw������w�~��~��/į�����H�����'�R��r�#�źK9O��(��R��S.�d���sws�c@4�57�2�_��82�j��Q.�t��?�z"@w1B>LJr�G������n�������$ʌ��2�\j��M���U�D�� rJ�<��KI�S��T��B�#ZF���j)�yYWp pԑINs9�f" ��|���Yo����k�h�o�~]�?>��_����F�͗�W*��u��T��\.��`s3�1�)�� pUpC��Q���� 5�k`�Ĕs��0q�."���xt�Dĩ a ��ۺ�m7Q�רwG��x��\�TJ� �b�m(���p�%>����,�2��:ה՜/�K�N�K%�T��TS>]�4M�L4�֙/����r��xNx>O�ib�<ͻ[ �[���e]_n�޾�~|�_���E���rݚ&�)s� ��懅�"1��H���s����t^�k�#�Kbpp� �m߻ >T�EE�����B,Sr��������R���~�."��4M�s�� ����t��Ӝs��9���]�3O�a��+�Q�Rj�T�S�Of�8AνuPI�R��̓z B���6bۺ�!�֟�������o_>|���ꗡ&�-=��ۧ��/������<|sW�T ��FI)�K�yk>�r�1!�s��j��AD�L���l� �� H ����`�2!�S�y�����~�����B`�,j��S!"���5g�u�m�Ϸ�1ϵ�gb�ӑ�>��SxJ9#�Tj��1��|�.Е��C�مT�5T4Wt���e�>Bw-�|���,�#|�r��?~z��]_ֿWS��X��ѷ�<��|z^�&�� ��>F�WMZ7��r9�TD]�͕��-���� �� �OuB�@:��S)sqt?�t@(����� ��#�^���s��.����H���99q�bf�)!&�vpd�թ�����ui��}s@l]�!L�B�a���>�[�����{ w�xYn/���y}��_�����XǶ(�ݖ���.������g �!&@�A,�ۑ�h���39�H(CU�5�/�Dy�����\s��fJ�@��*&���omt� 7U��������88 .�"&öm7��. ��xY͇ؾ�mY�eٖe[�;�20���3'@PS�"�P�}�L��$g^��MM�ɧ���|{|� �}���#�u�����lk�zۮ�e@�\ �eN�m�[ f3 S7b�� �<�G�#(�6d4S��� ����t��u�A���: ��,C�(1#�q �����zkk�56]Z�Ǿ�)��3G8��������h�`�9Q"u�@�D>U��އx@fc���BZ����������ǟ����ˤ�s�_K���Ç�ܞ��o�5���뭜.�<<�7�6�s�����)c�Y٦���H)[���)!�E�1����<M�V� �mD�4�8D܇�XJQ������Z�Ҷ�t�� 1� a� b�t�\�i����S��ֻ,[W&�=�d���['bBSU15wP��â�z�����}��=��ۧ�q�� |��>�{����O����s.���2we����̠�� ]s������R8� J�A�SJ�T<b���}�t�j�V��� 9��f�vD�傪��{�=�u 33$4�""�9"�9e:�Bܛ������h���>�f�N����X*<L�ms�#)c��jk�ۺ������v�����[�>w`�L�����r����RbQ�ZKeƈ�T/w�9�m Dsuum%bq�̞��00����9e׽���9�@(u�+�8�{�I�D`��)!2#��R�C,"P���-v qT�����.f�0_P�u�uӔ���m�tO��o��O�ڇ��� ��[$�/��<��k��ܟ�sMs*��|z���ϧ��[P CJ)�J)9m:��!�{�\��j�̌k�!6F�& �\ID�u ���u3M)��Hx��TUE��Y �JLl�K�18�#n�3��ض�‘XM�U�ț��ǻw�����{�_��0`��N��Kɵ>|��͛�7��K�4].���4Wx��G�y��yN �(b���s��S�5��|W�!������&n���)hW3%Nj�&��M�C�C0�������|| �ᡠJ���}�s ���?~��T_��� ����n�������������y����Η9��kN8�w)Muʹ�DȄ*� PJ.SA"�H�����J-��}[M-�j��ʡ�j��D�1�0�:Uo{3?<9�t��|�0�#D��sZ}LR*OO��|Z��>�=2����?����_V��X�٢����pww9�/SJ�ܧ�4����T���ĜԣNSI���v��SJ��S={����h�9�q����{�1�8�0� �Z��轫*"8�f�9��} V��wD�<��hO{�E��]o��ޯ/���|���W����n���ZJJ�ε^�K�J�i���i>Ւ�?NDL%eP�N\jabQ�#@�\O3 �*"��C�Trw�Wk�8d\��R�� "ș���%�#�55���xk���,��em?>��}���[]IDAT������'��|J9�\N���r>�RJ��� œkb,93��33�3橸���}P`�ӌ���UBA-М8%S;����1��\�����\�C-�ֽ_�[Dܿ9�[��޻�-��.�򲽼�g6:� ���;�l�<M����4��uJ�w����t.'p ��b�rɽ���� �nA%�PP݇JI��<]�W͠�z1���D��1z5$�G�� L���{S�6d�>�O/*���;�;�hS=]�i*�K=�7���:rJ4%�ħ�5S�Ԛ�i@d.[Z33��!''��� ��ffધӄl�!{6�m�(�#,[����p�.&���:z{ 7��'�_����!�ʥ�i*�<�N�V'�;fff��5���</8�Tj%B��ų��(%$��T��{��ZGQ� �-���elm컛����[�����L+�8e$�@������Mn~�P� �a��0S��(�����m_vp��@ �q��m=��$�����1���ÐF%��ݛ��l"�hc����� m�M�����a��������o�^�n�h��g���/�k}�������Z_�k}���;��#��~�lUIEND�B`��  @�n��?" d�d@���������  @@``�� ����q�7    "%  .     ! #$%&'(    0-1)*+./23456789?��$���$��b�$�:@X�\�&#NZ ����� �0���A���A�p������������@����������N�g*@ʚ;62ʚ;�g��4dddd�n������������p�pp�@ <�4dddd0���gʚ;<�4!d!d0���gʚ;� �g��4WdWd�n���L?������������p�@ p�p<�4BdBd0���gʚ;�\�� �___PPT10�����(��@� �8� �H��@� �x     ��P ���     ���          �"�X  ��P ��@���     �!�P �#�0�� �___PPT9�� �� ��P���� �p� ������ �     ��� ��      ���          �"��  ��� �����`     �!�� �#�`�h�___PPT2001�D�<�4X�������___PPTMac11�’@f   �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typographyddd0���gʚ;<�4!d!d0���gʚ;� �g��4WdWd�n���L������������p�@ p�p<�4BdBd0���gʚ;�\�� �___PPT10�����(��@    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography ��D   �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography �`   �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography � <   �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography � t   �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography �`   �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography � � �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography �D �tnamdlCourier New&Monotype Typography �� �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography �T �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography �"�    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography �$  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography �@   �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography ��   �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography �!�   �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography �#H   �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography ( ��ʚ;�&�)ʚ;�d�d?� �%�E3���LuaSocket behind the scenes�6 )  � �� Diego Nehab� � �4�� Short Bio� ���Graduated from PUC in CS & E, 1999; Worked in Tecgraf 1995-2002; MSc in PL with Roberto, 2001; 3rd year PhD candidate at Princeton; Computer Graphics.�D�A% � ��5��Outline of talk� ��~A few historical notes Case study: SMTP support Protocol abstraction Message abstraction Implementation highlights Conclusions�p0C   � � ��Historical notes� ���1.0, 1999, 1.5k C, 200 man 1.1, 2000, 1.5k C, 1.3k Lua, 500 man added protocol support for HTTP, SMTP, FTP 1.2, 2001, 2k C, 1.3k Lua, 900 man buffered input and non-blocking I/O UDP support object oriented syntax�N@+#G@+#G �23KQ� ��Historical notes� ���1.3, 2001, 2.3k C, 1.6k Lua, 1.2k man streaming with callbacks added select function 1.4, 2001-2, 2.2k C, 2.2k Lua, 1.9k man LTN7 added URL module named parameters�l&/('&/( �o2� ��Current version� ��2.0, 2005, 4.6k C, 2.5k Lua, 4.7k man Extensible C architecture, split in modules LTN12 (sources, sinks and filters) MIME support (partial but honest) Multipart messages support LTN13 (finalized exceptions) Package proposal Improved non-blocking code, robust to signals...�p&d�d&,#"  ���6��Outline of talk� ��~A few historical notes Case study: SMTP support Protocol abstraction Message abstraction Implementation highlights Conclusions�p0C ��  � � ��SMTP (RFC2821)�D!!��  !� ��[lua:roberto] telnet mail.tecgraf.puc-rio.br 25 220 tecgraf.puc-rio.br ESMTP Sendmail 8.9.3/8.9.3 helo lua 250 tecgraf.puc-rio.br Hello lua, pleased to meet you mail from: <roberto@inf.puc-rio.br> 250 <roberto@inf.puc-rio.br>... Sender ok rcpt to: <diego@tecgraf.puc-rio.br> 250 <diego@tecgraf.puc-rio.br>... Recipient ok data 354 Enter mail, end with "." on a line by itself Subject: World domination: instructions. Commence stage two. . 250 RAA10452 Message accepted for delivery quit 221 tecgraf.puc-rio.br closing connection�"�pnPZ02�� 6  ��$*��$/��  1$$��@((+,,��00)44��88�,   "    ��!��Protocol abstraction� ���status, error = smtp.send { from = "<roberto@inf.puc-rio.br>", rcpt = "<diego@tecgraf.puc-rio.br>", body = "Subject: World domination: instructions.\r\n\r\n" .. "Comence stage two." }��d�P'Cc C c C6ccc C $$�                 U �&�� LTN12 sources� ���function ltn12.source.file(handle) return function() local chunk = handle:read(BLOCKSIZE) if not chunk then handle:close() end return chunk end end�,#d�F�C� ��'�� Using sources� ���status, message = smtp.send { from = "<roberto@inf.puc-rio.br>", rcpt = "<diego@tecgraf.puc-rio.br>", body = ltn12.source.file(io.open("/mail/body", "r")) }��d�P)Cc C c (CcC�                 ( �,��Message Format (RFC2822)�,!��� ��| From: Roberto Ierusalimschy <roberto@inf.puc-rio.br> To: Diego Nehab <diego@tecgraf.puc-rio.br> Subject: World domination: roadmap. Content-Type: multipart/mixed; boundary=part This message contains attachments --part Content-Type: text/plain Please see attached roadmap. --part Content-Type: text/html; name="roadmap.html" ... --part--�0}P�CC)C C CCCC  C  $C$!(C(,c,0C04C48C8<C<CC�"[ �.��Message abstraction� ���declaration = { headers = { subject = "World domination", from = "Roberto <roberto@inf.puc-rio.br>", to = "Diego <diego@tecgraf.puc-rio.br>" }, preamble = "This message contains attachments.", [1] = { headers = { ... }, body = "Please see attatched roadmap." }, [2] = { headers = { ... }, body = ltn12.source.file(io.open("/plans/roadmap.html", "r")) } }��<CCC  C c0cc.c c $c$(C(,C,%0c04C48C8<C<CCC C cCCC  C $C$E(c(,C,0C04C48C8�j3} % 7 /E  �1��Our message API� ���status, message = smtp.send { from = "<roberto@inf.puc-rio.br>", rcpt = "<diego@tecgraf.puc-rio.br>", body = smtp.message(declaration) }��dxP)Cc C c 'CcC�                 ' �D"��How hard is it?� ���Message structure is recursive; Need to return chunks but mantain context; Nightmare to write in C!; Use coroutines; Write function recursively, naturally; Call yield with each chunk; Next call resumes wherever we left.���d ,7 ` `a` ` a $`$((�"gv �:��Zoom in on attachments� ���[2] = { headers = { ["content-type"] = 'text/html; name="roadmap.html"', ["content-disposition"] = 'attachment; filename ="roadmap.html"' }, body = ltn12.source.file(io.open("/plans/roadmap.html", "r")) }��d�FCC C4 c IcCAcC C $C$�:"} A �;��LTN12 filters and chains� ��)Filters process data one chunk at a time; MIME module provides common filters: base64, quoted-printable, stuffing, line-wrap... Can chain two filters together: factory Produce a filter with the composite effect Can chain a filter with a source: factory Produce a source that returns filtered data.��O1(+*-*%1( +*,� *�<��Zoom in on attachments� �� �Q$��Creating filters: high-level� �� �U&��Creating filters: low-level� �� �S%��Creating filters: low-level� �� �>��SMTP dependencies� �� �A ��Error checking� ��DFunction return convention Return nil, followed by message on error;�Bd*dA � E�B��LTN13 exceptions� ��try = newtry(finalizer): factory; On success, try returns all arguments; On failure, throws the second argument; Calls finalizer before raising the exception. foo = protect(bar): factory; foo executes bar in a protected environment; Returns nil followed by any thrown error. ��"d}ddXdg��c` `  `e��`.`  a $`$(g(��,c, 0`04e4�� 8`8<e<d`` a ``�� u�C!��No 'if' statements�*`�" ��hInternal functions throw exceptions; try calls tp.close() on error; External functions can be protected.�xi%A  A  A $$� i�O#�� Conclusions� ���Hope you like our API, we do; It is easy to implement; Function factories + clusures, coroutines It is fast; Time critical in C, management in Lua; Questions?�l7* ' * ' ��/������� �$�)�* �- �/ �2�7�8�9�E�F�G�I�J�K�L�M�P�R�T�V���� I`� ����3�����f3��b��3��>��?" d�d@���������%�t��?" n��n���@���������� �@�`� �n��?" d�d@���������   @@``��P�R    @ ` �`� p�>��>�'�I ���$��( � �$� �$ � �Z��������� �1�1Ȝ��Ȝ��?�� �@ �� > �T�� Click to edit Master title style�!� !� �$ � �6������� ?���� �� > ���RClick to edit Master text styles Second level Third level Fourth level Fifth level�!    � S�`B �$ s �*D�����1�"��������X� �$ C �"��A� moon"���� �`�H �$ � �0�������޽h�� ?� �������ff���b��3��D�<�___PPT10��.�.&��@��� �Custom Design� ��� � � P���* �( ��j`�j ��� �� � �0��A|����� �P ���  >���0�___PPT10���6�___PPT9���B�___PPTMac11�   �hnamd` Arial&Monotype Typography  �P��*� �� � �� � �0�`J|����� �� � ��� >���0�___PPT10���6�___PPT9���B�___PPTMac11�   �hnamd` Arial&Monotype Typography  �R��*� �� �d �� c �$��� ?��� �� >� �� � �0��Q|����� �� @���� > ���RClick to edit Master text styles Second level Third level Fourth level Fifth level�!    � S� �� � �6�@\|������ �`P����  >���0�___PPT10���6�___PPT9���B�___PPTMac11�   �hnamd` Arial&Monotype Typography  �P��*� �� � �� � �6��b|������ �`� ����� >���0�___PPT10���6�___PPT9���B�___PPTMac11�   �hnamd` Arial&Monotype Typography  �R��*� �� �H �� � �0���޽h������ ?� ���������33������8�0�___PPT10��.��q��Z�� � �`��( � �`�� �` � �0���O ����� �P ��  > �X��*� ���� �` � �0� �O ����� �� � �� > �Z��*� ���� �` � �6���O ������ �_P��  > �X��*� ���� �` � �6���O ������ �_� ��� > �Z��*� ���H �` � �0���޽h������ ?� ���������33������8�0�___PPT10��.P����]�����O��'�O� ��0�$��L�( � ���x �� c �$�P =��$����x �� > � ��r �� S ��`�;��$�� ` ��� > � ��R �"� s �*�������p��@�`B �#� s �*D�����1�"���X��X�X� �$� C �"��A� moon"���� f ��H �� � �0�������޽h�� ?� ���O�����f3��b��3������___PPT10�u�.�� �"z+D�='� �̐����=� @B� +��� �O��'�O� ��`�H�$�( ��.���1@�� �H�r �H S ��0���$�� �@ ��  > � ��r �H S ������$����� �� > � ��H �H � �0�������޽h�� ?� ���O�����f3��b��3������___PPT10�u�.�� �"z+D�='� �̐����=� @B� +��� �O��'�O� ����@�$�( � �@�r �@ S ���`���$�� �@ ��  > � ��r �@ S ��@Q���$����� �� > � ��H �@ � �0�������޽h�� ?� ���O�����f3��b��3������___PPT10�u�.�� �"z+D�='� ������=� @B� +��� �O��'�O� ����-���( �k�� ��  ���l �,� C ��`۸��$� �@ ��  > � ��l �-� C ���ܸ��$���� �� > � ��H �� � �0�������޽h�� ?� �������ff���b��3������___PPT10�u�. �q���+D�='� �̐����=� @B� +��� �O��'�O� �������( �{5 ���l �� C ���}���$� �@ ��  > � ��l �� C �� ���$���� �� > � ��H �� � �0�������޽h�� ?� �������ff���b��3������___PPT10�u�. �q��+D�='� �̐����=� @B� +��� �O��'�O� M�E�� ����( ���� ���!�� �����  � ������ �$�D,�P�H�___PPT2001�$�@F��� �� � �0����������"������� �X�P�H�___PPT2001�$�@F��w� �� � �<�@�����������' � �����0�___PPT10���6�___PPT9���B�___PPTMac11�   �hnamd` Arial&Monotype Typography  �3�� David Burgess� � �� � �0����������"���`����,$�D,�� �� � �0����������"���8��x�$�D,�P�H�___PPT2001�$�@F��l �� C ���F���$� �@ ��  > � ��l �� C ���G���$���� �� > � ��H �� � �0�������޽h�� ?� �������ff���b��3��. �& �___PPT10� �.�q��k�^z�+bk��D�� '� E�����=� @B� D� '� ����=� @B�A�?%�,(� <� +O%�,(� <� +D�4'� =�%�(�����D��'� =�%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��*���������%�(�D�'� =�%�(�����D�f'� =�%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�hidden*�o3�>�+B�#style.visibility<��*���������%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��* ���������%�(�D�'� =�%�(�����D�f'� =�%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�hidden*�o3�>�+B�#style.visibility<��* ���������%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��*���������%�(�+��� �O��'�O� ����8�$�( ��A �8�r �8 S ������$�� �@ ��  > � ��r �8 S ��P���$����� �� > � ��H �8 � �0�������޽h�� ?� ���O�����f3��b��3������___PPT10�u�.�� �"z+D�='� �̐����=� @B� +�l� �O��'�O� � �� � ���f �( �����ff��� �����l ��4�# ���<��#�,$�D,�� �� � �6�����������"����P��X�P�H�___PPT2001�$�DF�� � � � �<�������������4�#�����0�___PPT10���6�___PPT9���B�___PPTMac11�   �hnamd` Arial&Monotype Typography  �F��from�� ���l ����{  ������{ �,$�D,�� � � � �6�����������"������h �X�P�H�___PPT2001�$�DF�� � � � �<������������-��{ �����0�___PPT10���6�___PPT9���B�___PPTMac11�   �hnamd` Arial&Monotype Typography  �F��rcpt�� �f�l ��X �h  ���X ��h �,$�D,�t � � � �6�����������"����X �h �n �� � �<������������� �� �����0�___PPT10���6�___PPT9���B�___PPTMac11�   �hnamd` Arial&Monotype Typography  �*��body� �r �� S ����$� �@ ��  > � ��r �� S ��p���$������ > � ��H �� � �0�������޽h�� ?� �������ff���b��3����___PPT10���.�q�"r+����D�'� E�����=� @B� D�u'� ����=� @B�A�?%�,(� <� +O%�,(� <� � �8� �H��@� �x     ��P+D�4'� =�%�(�����D��'� =�%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��*���������%�(�D�4'� =�%�(�����D��'� =�%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��*���������%�(�D�4'� =�%�(�����D��'� =�%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��*���������%�(�+�#� �O��'�O� ������\�( ��A$  ���l �� C ��p���$� �@ ��  > � �� �� � �<������������� $���� �� > � �� �� � �6�0������ ?�P ����,$�, �~��What if body is large?�:d�� � �H �� � �0�������޽h�� ?� �������ff���b��3������___PPT10���.�qh�+�]%�D�O'� E�����=� @B� D� '� ����=� @B�A�?%�,(� <� +O%�,(� <� +D�A'� =�%�(�����D��'� =�%�(�D�'� =�A@B��B��B��B�0B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��*���������%�(�+8+0+� +�� � �O��'�O� �� ��0�( ��.�p�1 ��l � C ���&��$� �@ ��  > � �� � � �<�0(����������� $�P ��(�<$�D<� Π � �� � � �6�0����� ?����( �h�`�P�___PPT10�0�(�v�___PPT9�X�P���___PPTMac11�\T   �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography  ����pUse callback function that produces data; Returns one chunk each time called; Signals termination returning nil.�LqZNE�� E � q�H � � �0�������޽h�� ?� �������ff���b��3������___PPT10���.1�q���+���YD�O'� E�����=� @B� D� '� ����=� @B�A�?%�,(� <� +O%�,(� <� +D�A'� =�%�(�����D��'� =�%�(�D�'� =�A@B��B��B��B�0B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��*��������%�(�+8+0+ +�{ � � O��'�O� $�0���( �0B0A0B ��l � C �����$� �@ ��  > � �� � � �<�������������� $����h �� > � ��p � � �6�������� ?�� ��h�h$�,�4�H�___PPT10�(� �f�___PPT9�H�@�n�___PPTMac11�H@   �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography  ���What if body is complicated?�Bd` d��` � �H � � �0�������޽h�� ?� �������ff���b��3������___PPT10���.3�q�F�+'�D�O'� E�����=� @B� D� '� ����=� @B�A�?%�,(� <� +O%�,(� <� +D�A'� =�%�(�����D��'� =�%�(�D�'� =�A@B��B��B��B�0B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��*��������%�(�+8+0+ +��9� � O��'�O� .�&@� @���( � � � � � � �6�����������"��������,$�@,� � � � �6�����������"�������$�@,�P�H�___PPT2001�$�@ F�� �  � �B������������"�������D$�,��0�___PPT10���6�___PPT9���H�___PPT2001�$�F��B�___PPTMac11�   �hnamd` Arial&Monotype Typography  �-��headers� �r �  S �����$�� �� ��  > � �� �  � �0�������"���� X8 �,$�@,�� �  s �*������"���X��$�@ ,�P�H�___PPT2001�$�DF�� � � � �6�����������"���� Mm �,$�@,� � � � �0����������"���4 M �,$�@,�r �  S ������$�������� > � �� �  � �<� ����������� �x ��$�,���0�___PPT10���6�___PPT9���B�___PPTMac11�   �hnamd` Arial&Monotype Typography  �-��headers� � �  � �<������������, r ��$�,���0�___PPT10���6�___PPT9���B�___PPTMac11�   �hnamd` Arial&Monotype Typography  �*��body� �� �  � �<�@�����������tXl�D$� ,��0�___PPT10���6�___PPT9���H�___PPT2001�$�F��B�___PPTMac11�   �hnamd` Arial&Monotype Typography  �,��part 2� �� �  � �<����������� ��� �D$�,��0�___PPT10���6�___PPT9���H�___PPT2001�$�F��B�___PPTMac11�   �hnamd` Arial&Monotype Typography  �*��body� �� �  � �<�`���������e tXL �D$� ,��0�___PPT10���6�___PPT9���H�___PPT2001�$� F��B�___PPTMac11�   �hnamd` Arial&Monotype Typography  �,��part 1� �H �  � �0�������޽h�� ?� �������ff���b��3���!��!�___PPT10��!�.3�q�F��S��+�f�D�d'� E�����=� @B� D�'� ����=� @B�A�?%�,(� <� +O%�,(� <� +D��'� =�%�(�����D�'� =�%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��* ��������%�(�D�'� =�A@B��B��B��B�0B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��* ��������%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��* ��������%�(�D�'� =�A@B��B��B��B�0B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��* ��������%�(�D� '� =�%�(�����D�R '� =�%�(�D�'� =�A@B��B��B��B�0B�%�(�D�'� =�1�:�B�hidden*�o3�>�+B�#style.visibility<��* ��������%�(�D�'� =�A@B��B��B��B�0B�%�(�D�'� =�1�:�B�hidden*�o3�>�+B�#style.visibility<��* ��������%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��* ��������%�(�D�'� =�A@B��B��B��B�0B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��* ��������%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��* ��������%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�hidden*�o3�>�+B�#style.visibility<��* ��������%�(�D�'� =�A@B��B��B��B�0B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��* ��������%�(�D� '� =�%�(�����D�R '� =�%�(�D�'� =�A@B��B��B��B�0B�%�(�D�'� =�1�:�B�hidden*�o3�>�+B�#style.visibility<��* ��������%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��* ��������%�(�D�'� =�A@B��B��B��B�0B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��* ��������%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��* ��������%�(�D�'� =�A@B��B��B��B�0B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��* ��������%�(�D�'� =�A@B��B��B��B�0B�%�(�D�'� =�1�:�B�hidden*�o3�>�+B�#style.visibility<��* ��������%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�hidden*�o3�>�+B�#style.visibility<��* ��������%�(�+0+0+  ++0+  ++0+  ++0+  ++0+  ++0+  ++0+  ++0+  ++0+  ++0+  +��� � O��'�O� ��P�(�H�( � �(�r �( S �� ���$�� �@ ��  > � �� �( � �B�P������������ $�������� > � ��H �( � �0�������޽h�� ?� �������ff���b��3������___PPT10�u�.3�q�F�+D�='� �̐����=� @B� +� � �O��'�O� ��`�0��( � �0�r �0 S ��@� ��$�� �@ ��  > � �� �0 � �B�p� ����������� $�����H �� > � ��? �0 � �6��� ����� ?�� ��X���@�___PPT10� ��V�___PPT9�8�0�Z�___PPTMac11�4,   �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography  ���UTransform declaration into an LTN12 source; Pass source as body to sending function.�0Vd-`(`�U �H �0 � �0�������޽h�� ?� �������ff���b��3������___PPT10�u�.3�q�F�+D�='� n�����=� @B� +��� �O��'�O� �������( � ���l �� C ���� ��$� � ��  > � ��l �� C ��0� ��$���� �� > � ��H �� � �0�������޽h�� ?� �������ff���b��3������___PPT10�u�. �q�꾖+D�='� �̐����=� @B� +�c� �O��'�O� V�Np�P���( �+R �P�r �P S ���� ��$� �@ ��  > � �� �P � �Z�д ������������ ?$�����X �� > � ��~ �P � �6�� ����� ?�� ����<�4�H�___PPT10�(� �f�___PPT9�H�@�n�___PPTMac11�H@   �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography  ����ZWould like to send PDF; Binary data has to be encoded (Base64); Want to encode on-the-fly.�>[d`(`` �Z �H �P � �0�������޽h�� ?� �������ff���b��3������___PPT10�u�. �q���+D�='� n�����=� @B� +��� �O��'�O� ����X�$�( � �X�x �X c �$��A ��$�� �@ ��  > � ��l �X C ��PC ��$���� �� > � ��H �X � �0�������޽h�� ?� �������ff���b��3������___PPT10�u�. �q���+D�='� �̐����=� @B� +�� � �O��'�O� ����\�6�( � �\�r �\ S ��0� ��$� �@ ��  > � �� �\ � �<�`� ��������� ?�����4�,���___PPT10����     �v�___PPT9�X�P     ���___PPTMac11��� �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �����[2] = { headers = { ["content-type"] = 'application/pdf; name="roadmap.pdf"', ["content-disposition"] = 'attachment; filename ="roadmap.pdf"', ["content-description"] = 'Detailed world domination plan', ["content-transfer-encoding"] = 'BASE64' }, body = ltn12.source.chain( ltn12.source.file(io.open("/plans/roadmap.pdf", "r")), ltn12.filter.chain( mime.encode("base64"), mime.wrap("base64") ) ) }��d�FCC C9 c IcCccc) c $C$(c(,c,*0c04c4#8c8 <c< ccc C C�:"� � �H �\ � �0�������޽h�� ?� �������ff���b��3������___PPT10�u�. �q�꾖+D�='� ������=� @B� +��� �O��'�O� V �N @���� �( � ���x �� c �$����$�� �@ ��  > � ��� �� � �<��y��������� ?����H�$�D,���8�___PPT10���F�___PPT9�(� �R�___PPTMac11�,$ �tnamdlCourier New&Monotype Typography  �U���function ltn12.filter.cycle(low, ctx, extra) return function(chunk) local ret ret, ctx = low(ctx, chunk, extra) return ret end end function mime.normalize(marker) return ltn12.filter.cycle(mime.eol, 0, marker) end�.�P�CC � ��A �� � �6��^����� ?����H� ��@�___PPT10� ��V�___PPT9�8�0�j�___PPTMac11�D<   �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography  ���MChunks can be broken arbitrarily; Filters have to keep context between calls;�4Nd"`+``�N �H �� � �0�������޽h�� ?� �������ff���b��3������___PPT10���. �q�꾖+���YD�O'� E�����=� @B� D� '� ����=� @B�A�?%�,(� <� +O%�,(� <� +D�A'� =�%�(�����D��'� =�%�(�D�'� =�A@B��B��B��B�0B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��*���������%�(�+8+0+� +�& � �O��'�O� �������_�( � ���x �� c �$�0I���$�� �@ ��  > � �� �� � �<�@ʓ��������� ?�����$�D,���8�___PPT10���F�___PPT9�(� �R�___PPTMac11�,$ �tnamdlCourier New&Monotype Typography  ����int eol(lua_State *L) { int ctx = luaL_checkint(L, 1); size_t isize = 0; const char *input = luaL_optlstring(L, 2, NULL, &isize); const char *last = input + isize; const char *marker = luaL_optstring(L, 3, CRLF); luaL_Buffer buffer; luaL_buffinit(L, &buffer); while (input < last) ctx = translate(*input++, ctx, marker, &buffer); luaL_pushresult(&buffer); lua_pushnumber(L, ctx); return 2; }�.�F�CC � ��H �� � �0�������޽h�� ?� �������ff���b��3������___PPT10���. �q�꾖+���YD�O'� E�����=� @B� D� '� ����=� @B�A�?%�,(� <� +O%�,(� <� +D�A'� =�%�(�����D��'� =�%�(�D�'� =�A@B��B��B��B�0B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��*���������%�(�+8+0+� +� � �O��'�O� ��`���L�( � ���x �� c �$� ���$�� �@ ��  > � �� �� � �<��+��������� ?�����$�D,���8�___PPT10���F�___PPT9�(� �R�___PPTMac11�,$ �tnamdlCourier New&Monotype Typography  ����#define candidate(c) (c == CR || c == LF) int translate(int c, int last, const char *mark, luaL_Buffer *buffer) { if (candidate(c)) { if (candidate(last)) { if (c == last) luaL_addstring(buffer, mark); return 0; } else { luaL_addstring(buffer, mark); return c; } } else { luaL_putchar(buffer, c); return 0; } }�<*FqA�CC � ��H �� � �0�������޽h�� ?� �������ff���b��3������___PPT10���. �q�꾖+���YD�O'� E�����=� @B� D� '� ����=� @B�A�?%�,(� <� +O%�,(� <� +D�A'� =�%�(�����D��'� =�%�(�D�'� =�A@B��B��B��B�0B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��*���������%�(�+8+0+� +�V%� �O��'�O� ���� d���( � �d�x �d c �$�`� ��$�� �@ ��  > � �� �d � �<�� �����������"����  ������0�___PPT10���6�___PPT9���B�___PPTMac11�   �hnamd` Arial&Monotype Typography  �H��socket�� � �d � �<�p �����������"���� @@��$�@,���0�___PPT10���6�___PPT9���B�___PPTMac11�   �hnamd` Arial&Monotype Typography  �F��mime�� � �d � �<�� �����������"���` @@p ��$�@,���0�___PPT10���6�___PPT9���B�___PPTMac11�   �hnamd` Arial&Monotype Typography  �F��smtp�� � �d � �<� �����������"����@@���$�@,���0�___PPT10���6�___PPT9���B�___PPTMac11�   �hnamd` Arial&Monotype Typography  �D��tp�� � � d � �<�� �����������"���` ``p �����0�___PPT10���6�___PPT9���B�___PPTMac11�   �hnamd` Arial&Monotype Typography  �G��ltn12�� � � d � �0�������� @��,$�@,� � d � �0��������@ @ ` �,$�D ,� �d� � �0�������p @ @ � �,$�@,� �d@ � �0�������h @`h �,$�@ ,�B �d� � �6��D������@`` �,$�D,�B �d@ � �6��D�����p @`� �,$�D,�H �d � �0�������޽h�� ?O��dd d�dd d�ddd� ddd� �������ff���b��3��1�)�___PPT10� �. �q�꾖+,�fD�)'� E�����=� @B� D��'� ����=� @B�A�?%�,(� <� +O%�,(� <� +D�Y'� =�%�(�����D�'� =�%�(�D�'� =�A@B��B��B��B�0B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��*d��������%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��* d��������%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��*d��������%�(�D��'� =�%�(�����D�u'� =�%�(�D�'� =�A@B��B��B��B�0B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��*d��������%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��*d��������%�(�D��'� =�%�(�����D�'� =�%�(�D�'� =�A@B��B��B��B�0B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��*d��������%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��*d��������%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��*d��������%�(�D�'� =�4@B��B��B��B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��* d��������%�(�+�+0+d ++0+d ++0+d +��� �O��'�O� ���x��( � �x�l �x C ��0d ��$� �@ ��  > � ��l �x C ���e ��$ ���     ���          �"�X������� > � ��w �x � �<�pq ��������� ?����@�$�D,�l���___PPT10���x     ��___PPT9����     �� �___PPTMac11�x p  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �c���function metat.__index:greet(domain) local r, e = self.tp:check("2..") if not r then return nil, e end r, e = self.tp:command("HELO", domain) if not r then return nil, e end return self.tp:check("2..") end� �Z%CCc C CcCC C $c$ (c($,c,0c04c48C8�RD  T �  �x � �6��} ����� ?�p�� �$�,���8�___PPT10���F�___PPT9�(� �F�___PPTMac11�    �hnamd` Arial&Monotype Typography  ���-Tedious, error prone, virotic, not finalized.�".d-`�- �H �x � �0�������޽h�� ?� �������ff���b��3��h�`�___PPT10�@�. �q�꾖+�{ D�'� E�����=� @B� D�S'� ����=� @B�A�?%�,(� <� +O%�,(� <� +D�A'� =�%�(�����D��'� =�%�(�D�'� =�A@B��B��B��B�0B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��*x��������%�(�D�A'� =�%�(�����D��'� =�%�(�D�'� =�A@B��B��B��B�0B�%�(�D�'� =�1�:�B�visible*�o3�>�+B�#style.visibility<��*x��������%�(�+p+0+x ++0+x +��� �O��'�O� ����t��( � �t�l �t C ���!��$� �@ ��  > � ��l �t C ���#��$���� �� > � ��H �t � �0�������޽h�� ?� �������ff���b��3������___PPT10�u�. �q�꾖+D�='� �̐����=� @B� +�, � �O��'�O�  � �|� �( � �|�r �| S ��c���$�� �@ ��  > � ��  �| � �<�0n���������� ?����- �\�T�x�___PPT10�X�P ���___PPT9���� ���___PPTMac11��� �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  ����function metat.__index:greet(domain) self.try(self.tp:check("2..")) self.try(self.tp:command("HELO", domain)) return self.try(self.tp:check("2..")) end���Z%CCc C Cc c)c c $C$�:@ ; �l �| C ��2���$�� �� �� > � ��H �| � �0�������޽h�� ?� �������ff���b��3������___PPT10�u�. �q�꾖+D�='� ������=� @B� +��� �O��'�O� �� ����( � ���r �� S ���=���$�� �@ ��  > � ��l �� C ���m8��$���� �� > � ��H �� � �0�������޽h�� ?� �������ff���b��3������___PPT10�u�. �q�꾖+D�='� �̐����=� @B� +��� n�f@����( �@ ���R �� 3 ������� ��  >�l �� C ����|����� @����  > � ��H �� � �0���޽h������ ?� ���������33������8�0�___PPT10��.��q��Z���  t�l�����( � ���R �� 3 ������� ��  >�r �� # � ������� @����  > ��� �H �� � �0���޽h������ ?� ���������33������8�0�___PPT10��.�q�T6����  t�l�����( � ���R �� 3 ������� ��  >�r �� # � �@R���� @����  > ��� �H �� � �0���޽h������ ?� ���������33������8�0�___PPT10��.�q�T6����  �����( ��� p�`� ���R �� 3 ������� ��  >� �� C ��p� ����� @���X�  >�@�P�___PPT10�0�(�v�___PPT9�X�P�b�___PPTMac11�<4   �hnamd` Arial&Monotype Typography     �hnamd` Arial&Monotype Typography   �Y���David, who lives in Melbourne, knows RFCs by experience, whereas I only read them. First FTP server written back in 89... My inbox has about 700 messages from him. He wrote all of them while being upside-down, which always strikes me as odd.�:�S&+M � ��H �� � �0���޽h������ ?� ���������33������8�0�___PPT10��.�q�T6����  s�k����( � )� )� ���R �� 3 ������� ��  >�q �� C ���>I ����� @����  >���@�___PPT10� ��V�___PPT9�8�0�J�___PPTMac11�$   �hnamd` Arial&Monotype Typography   ����What is SMTP anyways. Text mode protocol. Send commands, read back replies. FTP also uses the same underlying command structure, and the implementation of the two modules share a subsystem.�&�5s� ��H �� � �0���޽h������ ?� ���������33������8�0�___PPT10��.�q�T6��* � ��0���:�( � ���R �� 3 ������� ��  >� �� C ��0` ����� @����  >�|�X�___PPT10�8�0���___PPT9�h�`���___PPTMac11�`X   �hnamd` Arial&Monotype Typography     �hnamd` Arial&Monotype Typography     �hnamd` Arial&Monotype Typography     �hnamd` Arial&Monotype Typography   ����6Here is the simplest interface we can come up with. We can add some sugar, such as the multiple-recipient list, passed as a table. It works well for small, static messages. But what if the content is large. Messages with attachments can be several megabytes long. We don't want to load all that up into memory.�H7�*[ (`�"( �H �� � �0���޽h������ ?� ���������33������8�0�___PPT10��.�q�U���� � ^ �V @� ���( � � �R �  3 ������� ��  >�\ �  C ���#` ����� @����  >�����___PPT10�`�X  ���___PPT9����  ���___PPTMac11�d\   �hnamd` Arial&Monotype Typography     �hnamd` Arial&Monotype Typography     �hnamd` Arial&Monotype Typography   ��� The idea we use in LuaSocket is to pass a function instead of a string. This function will be repeatedly called whenever the SMTP module needs data to send. The protocol to these so called "source" functions is formalized by LTN12. As an example, consider a source that produces the contents of a file. This is actually a factory: a function that creates and returns custom functions. Hail Lua, where functions are first class citizens. Here we are also taking advantage of Lua's lexical scoping to store the context between calls (file handle)�~!HT!* ` GR3) $`$A((�:�* � A�H �  � �0���޽h������ ?� ���������33������8�0�___PPT10��.��q�,���� Z�RP����( � ��R � 3 ������� ��  >�X � C ��0Y` ����� @���H�  >�0�P�___PPT10�0�(�v�___PPT9�X�P�R�___PPTMac11�,$   �hnamd` Arial&Monotype Typography   ���<Here is how we can use a file source with the SMTP module. Nothing is really loaded into memory until the module needs data to be sent. Even then, the source can control the granularity. But what if the message is complicated? We don't want our users to be forced to know all the details and write a file to be sent.�>=;�.S ` �"�S �H � � �0���޽h������ ?� ���������33������8�0�___PPT10��.��q�,���� R�J`�$���( � �$�X �$C ������� ��  >�J �$S ���n` ����� @����  >�l�X�___PPT10�8�0���___PPT9�h�`�v�___PPTMac11�PH   �hnamd` Arial&Monotype Typography     �hnamd` Arial&Monotype Typography     �hnamd` Arial&Monotype Typography   �p���How complicated can it be? Here is an example of multipart message. <<describe parts>> We want to be able to describe a message like this, without creating it in memory. Roberto would never send me a message with an HTML file attached, but bear with me. �D�DS T� ��H �$ � �0���޽h������ ?� ���������33������8�0�___PPT10��.��q�,��,� ��p�,�<�( � �,�X �,C ������� ��  >� �,S ��0�` ����� @���,�  >��H�___PPT10�(� �f�___PPT9�H�@�N�___PPTMac11�(    �hnamd` Arial&Monotype Typography   �"���Good thing Lua was designed as a description language. Notice the ltn12 source doesn't load anything into memory. But how to send the message we have just declared?�8�)`m` �"� �H �, � �0���޽h������ ?� ���������33������8�0�___PPT10��.��q�,�� � ����4��( ��� �4�X �4C ������� ��  >� �4S ����` ����� @����  > ��� �H �4 � �0���޽h������ ?� ���������33������8�0�___PPT10��.��q�,�� � ����<��( �� �<�X �<C ������� ��  >� �<S ���$ ����� @����  > ��� �H �< � �0���޽h������ ?� ���������33������8�0�___PPT10��.��q��Z�U � �����D�e�( ��� �D�X �DC ������� ��  >�� �DS ���������� @���p�  >�X�`�___PPT10�@�8���___PPT9�x�p�J�___PPTMac11�$�� x  �� x  �� x     �hnamd` Arial&Monotype Typography     �hnamd` Arial&Monotype Typography   ����We start with a few historical notes on LuaSocket Then we move on to our case study which is the SMTP support shipping with the newest versions. We will focus on little details of Lua that enables us to taylor a very elegant interface to sending e-mail messages. I realize my abstract mentioned more stuff. For some reason I had in mind it would be a longer talk, so I had to downsize.�N�2_v r �(\�H �D � �0���޽h������ ?� ���������33������8�0�___PPT10��.��q��Z��� z�rp�L� �( ��@� �L�X �LC ������� ��  >�r �LS ��`O~����� @����  > � ��H �L � �0���޽h������ ?� ���������33������8�0�___PPT10��.��q��Z�9� �����I�( � ���R �� 3 ������� ��  >� �� C ��P,a ����� @���H�  >�0�P�___PPT10�0�(�v�___PPT9�X�P�R�___PPTMac11�,$   �hnamd` Arial&Monotype Typography   ����The solution LuaSocket adopts is given by LTN13. We use Lua's error reporting to implement an exception mechanism with two tiny helper function factories.�>�2_ ` �"<_ �H �� � �0���޽h������ ?� ���������33������8�0�___PPT10��.�qI���.�" ������>�( � ���R �� 3 ������� ��  >� �� C ���a ����� @����  > �L��&About 100 lines of nice, modular code.� '�H �� � �0���޽h������ ?� ���������33������8�0�___PPT10��. �q����O�! ������_�( � ���R �� 3 ������� ��  >�� �� C ���8a ����� @����  > �m��GAll SMTP code, with error checking fits in 100 lines of clean Lua code.� H�H �� � �0���޽h������ ?� ���������33������8�0�___PPT10��. �q�qO����  ������( � ���R �� 3 ������� ��  >�  �� C ��0�` ����� @���h�  >�P�P�___PPT10�0�(�v�___PPT9�X�P�r�___PPTMac11�LD   �hnamd` Arial&Monotype Typography     �hnamd` Arial&Monotype Typography     �hnamd` Arial&Monotype Typography   �Q���Roberto would actually send me a PDF; But PDF files are binary, and SMTP is text mode. Need to encode as BASE64 before sending. Want to do everything on the fly, with the same requirements: not allowed to load everything into memory.�:�&1)i � ��H �� � �0���޽h������ ?� ���������33������8�0�___PPT10��.��qGr��.� ������>�( � ���R �� 3 ������� ��  >� �� C ����` ����� @����  > �L��&Introducing LTN12 filters and chains. � '�H �� � �0���޽h������ ?� ���������33������8�0�___PPT10��.��qGr���� C�;������( �{5�v ���R �� 3 ������� ��  >�A �� C ��0�` ����� @����  >���8�___PPT10���F�___PPT9�(� �V�___PPTMac11�0(   �hnamd` Arial&Monotype Typography     �hnamd` Arial&Monotype Typography   �����Once again, nothing happens until this message is sent. And even then, things happen chunk by chunk. Filters are great to use, but how hard is it to write filters?��e?� ��H �� � �0���޽h������ ?� ���������33������8�0�___PPT10��.��qGr��v � ��������( �{5 ���R �� 3 ������� ��  >�� �� C ���a ����� @����  >�|�X�___PPT10�8�0���___PPT9�h�`���___PPTMac11�`X   �hnamd` Arial&Monotype Typography     �hnamd` Arial&Monotype Typography     �hnamd` Arial&Monotype Typography     �hnamd` Arial&Monotype Typography   ����Two of the involved modules have no depencencies. Socket and LTN12. Socket implements the core comunications capabilities. LTN12 implements that technical note functionality. The tp module implements the command/response structure common to SMTP and FTP (and not by HTTP) The MIME module implements the encodings commonly used by SMTP The SMTP implements the message abstraction, and message sending functionality.�D�2}a? O� ��H �� � �0���޽h������ ?� ���������33������8�0�___PPT10��.��qGr��x�  ��������( � ���R �� 3 ������� ��  >� �� C ��%a ����� @���h�  >�P�P�___PPT10�0�(�v�___PPT9�X�P�r�___PPTMac11�LD   �hnamd` Arial&Monotype Typography     �hnamd` Arial&Monotype Typography     �hnamd` Arial&Monotype Typography   �>���This is the error convention has been adopted throughout LuaSocket and many other libraries. If a function succeeds, it returns whatever it is that it should return. If it fails, it returns nil, followed by an error message. I subscribe to this idea, but it can be challenging to implement code that conforms to it. The reason is that each function might perform many operations, and there can be several layers of functions. There would be a lot of code like the above.�:�]�n, � ��H �� � �0���޽h������ ?� ���������33������8�0�___PPT10��.��qGr�� �# ��0����( ��� ���X ��C ������� ��  >� ��S ����Z����� @����  > ��� �H �� � �0���޽h������ ?� ���������33������8�0�___PPT10��. �q�qO����$ A�9P�����( ��� ���X ��C ������� ��  >�9 ��S ��0������� @����  >���@�___PPT10� ��V�___PPT9�8�0�J�___PPTMac11�$   �hnamd` Arial&Monotype Typography   ����LTN12 describes a series of tricks on how to implement these ideas. We see here the code for an end-of-line marker translator. �&�D:� ��H �� � �0���޽h������ ?� ���������33������8�0�___PPT10��.��qGr��|�% ���p����( ��� ���X ��C ������� ��  >�� ��S ��&������ @����  > ���hWe talked about lots of different modules, so lat zoom out a little and take a look at the dependencies.� i�H �� � �0���޽h������ ?� ���������33������8�0�___PPT10��.��qGr��X�& �������h�( � ���X ��C ������� ��  >�� ��S ��P������ @����  > �j��DLTN12 describes a series of tricks on how to implement these ideas. � E�H �� � �0���޽h������ ?� ���������33������8�0�___PPT10��.��qGr�cx��p^�RЀ3ÿ�� lHb�P  @���AL �G�����@;b `B��&V�<�Wq�o� ��2�#��D@��4C�~wl�r �� �]� ��&B�� � V#DFH�N�8$�S& �?�L) �\�f,@wX�l�nt1 ޔ�y4�.�� �{�}'�������>\�Ap��/O2�)�j���I��������� �J��?��^���A�f����!���Vٰ���(����  �F/� 0��|�DArial�0�0w��������� I��������@\P^�\!�DTimes�0�0w��������� I��������@\P^�\! �DCourier New��������� I��������@\P^�\!0�DWingdingsw��������� I��������@\P^�\!@�D-�3� 0��0�0�0�0w��������� I��������@\P^�\!�� �`����� .  ��P ��@���     �!�P�� ��Oh��+'��0T hp��� �� � � �'Slide 1 Steve Overbyb})� Diego Nehab75�Microsoft PowerPoint@���L�@��� ��@�VMX��&G<����PICT4��� ��HH�� ��������HH  t�L�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������7���� 8GQVTI:(��  >LTZXM>,��  :DKPOG9(�C����1�}h`cfimmfT(��8��ze`cgjonhV-��8��jXTX[^ba\M+�O����"s��mf__j�xrs{�i)��)x��jd__j�xqsx�n0��'r�y^VSS^t}legktd/�U����L��y_aecgp|�{v�����W �� S��t\`dcgnz�ys~����` ��R��eRTWU[amtlho~���^ �X����_��cfdgr}�yptwsz����u��e��{`ccgs{}vortqu����~��a��jTYWYflmhbfhber���{�\����V���uhffy��vxtspkf{���p��^���odcdv��|uwspnicu���y��^���a�Wi��lfjhea\Ub���w�a����?���~lkl|�����{vpjhh����Q��GǺ��zggiw�����xsmife{���]��Fİ�ykZZ\iwv|�{lha\XVi���`�g�����ĺ���|ru|������yspqty���� ��������umqw�����}upmmot����)��������f]cjs����nhd`^_c{���-�g����s������w���������||xw|~���Ɏ��z������p{��������yxtswx���Ù��v���vuycmxqz����tjjfeggp�����m����&��Önj|v������������y������-��,����hevp|�|������}~~sz������8��,���XYgamoly����nnogknu����=�m����i����q����z������������������t��o����l|��zu�������~������������l���u]p�yldv�{r~��pr�x{�������s������������������~{{������������� �� ��������������{xx��������������� �����~w�qr��umjju������������s����$���������������||������������)��*���������������x}x������������2��*�����zwzrs{x{�qjni|���y�������2�s����A�������|}}��������{���|z������I��F�������vww}�������v��|wt������S��E�������gfgmv���~�xhqvjfer��~t�S�s����^�����Ŭ|w���������t�vioq~�����d��d�������sqz��������p}rdkjw�����o��a�������eajv������wbndU\\f��s�o�s����t�����Ͻ�������������|prr{�����_��z�����Ƴ�����������~�xknmt�����i��v��������q���������ouj[^]co}���g�s����pǵ�����λ�������Ƿ���wrqr�����L��w�������ı������������qmmn}����V��v������ɺ������������xa]]_l{���S�s����dȽ�������ƾ�������zvlje|�����3��mø������ȼ���������ysifaw�����<��m�������ڿ����������mfYWRfp���9�s����I��������˼����¹�p]]ei}������!��Rļ������Ϳ��������p_\cgx������)��T��������Ų��������fTQWYg�����&�s����(����������ɿ�����fbcb�������| ��/���������¾����ȼgaca|���������0�������Ž��������t]VWTm������t�r���������������ý��ų�e]\_p������Z�� ������������¿�e][^n������b�� �����¼���������tYRPQ`w�����Z�m����b�������ž���ε�yqgZUh������0��lǼ�����������Ư�vneZUe������8��l����������������j`WNHV�����5�m���������������ª���ta^������a��%������������¾����s^[������g ��&������������������fRPn����|] �g����fǹ��������Ű�����zpz��zw��)��rĴ���������������vmu��zv��0��t����������������i_f��pg}x-�f���� �����������������ru��lX_�I������������������os��nX^�Q��������������or��scep�aLPsK�a����,��������������h^[��[MbY ��5��������������h]Z��ZK__ ��3��������������rZQLnxN?QV �[����-�������������k]WW��xpU��5�������������j]XU��unZ��4�������������]QLJrwf`Q�U����2������������skdctkmF��:������������phbbrknL��7z���������sqa[VTe_aE�R����\���������}��yph[1��b���������{}�vnh^5��Zs�������ymnyj`\R1�I����"Ou������xz{nY3��%Tw������xy{n\8��"Ljw����ylkodS2�<���� 7Thqng`VG,�� ;XluqidZM2�� 6Pclg`ZRF-�+����  �� �� ����������������������������� �� �� �V����8�3�����5�T� �SM�8�3�����5�T� �SM�8�3�����5�T� �SM�^����;�6�>�^2ӱ�T� ��h�;�6�>�^2ӱ�T� ��h�;�X�>�m\��T�8��o������;�6�-�F��X���'��=!/x��yQ��T���;��}���N�;�6�-�F��X���'��=!/x��yQ��T���;��}���N�4;�j)�F��X���'��iGb8x��yQ��T�Q��;��}���l ������;�6�-�O��hG(�^e��fQ�R9�T�s!�.T���͈�@�{ �;�6�-�O��hG(�^e��fQ�R9�T�s!�.T���͈�@�{ �5;�l*�i��$nQJ�~m��x W�^[�l�zA�R\���4,Ѝ8�\��T%������;�6��R��o��k'H*������>�$� T��� ����x�h�;�6��R��o��k'H*������>�$� T��� ����x�h�6;�m*�{-��:y���LQ'`��7��95ǺZ�K6(4e���J=����!��D������3;�[//&�s��]�mE�d(�� W�G-�W �w�DT�%܍��2�v�3;�[//&�s��]�mE�d(�� W�G-�W �w�DT�%܍��2�v�5;��Q5&��<�I�nG��l�s=��Ph�zI�y?�E�OZ�c� �N�l2�>������;��.����ħ���ۏ���Y���`��T� N�-X����d�;��.����ħ���ۏ���Y���`��T� N�-X����d�;��0� ���ǹA���߮8���vP ���?5l�)f�Pt�Va���<$��������� � ��� � ��� � ��� � ��6FOGD;9H>FB;G>L;.MDJ= 3FA?$DAAI#$B 'KCA@K* �D��������/     �������������������7������������������������������:�������������������)�������������������������������������������������������=��R��?��?�R��Y��?��,��?��?��?�n������������������������������������������^��\�H��J�\��\��Z��\��Z�<�������?HV^�_% B\_ B28THB\__.S^27AU^__ B\__KV^�:��������       �  ���������������������������������������������������������������������������������������������������������C���������������������������������������7������������������������^������������������������������������������������O������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ ��՜.��+,��00������� � �� ���  ��On-screen Show�6��F  ArialTimes Courier New WingdingsMS PゴシックCustom DesignLuaSocket behind the scenes Short BioOutline of talkHistorical notesHistorical notesCurrent versionOutline of talkSMTP (RFC2821)Protocol abstractionLTN12 sourcesUsing sourcesMessage Format (RFC2822)Message abstractionOur message APIHow hard is it?Zoom in on attachmentsLTN12 filters and chainsZoom in on attachmentsCreating filters: high-levelCreating filters: low-levelCreating filters: low-levelSMTP dependenciesError checkingLTN13 exceptionsNo 'if' statements Conclusions  �#�0�� �___PPT9�� �� ��P���� �pR����������d�O�����)���;�6���Pictures���������PowerPoint Document(���������SummaryInformation(���������������������������������������������������������������������������������������������������������������������������������������������������������������      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopr�stuvwxyz{|}~�������������������������������������������������������������������������������������������������������������������������������quf  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcde����ghijklmnopqrstv�wxyz{|}~�DocumentSummaryInformation8������������`Current User������������A������������������������ �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� Fonts UsedDesign Template Slide Titles�#_���ǫ �"DDiego NehabDiego Nehab� ������ �     ��� ��      ���          �"��  ��� �����`     �!�� �#�`�h�___PPT2001�D�<�4X�������___PPTMac11�’@f   �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography ��D   �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography �`   �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography � <   �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography � t   �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography �`   �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography � � �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOP������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography �D �tnamdlCourier New&Monotype Typography �� �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography �T �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography �"�    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography �$  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography  �tnamdlCourier New&Monotype Typography �@   �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography ��   �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography �!�   �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography �#H   �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography    �hnamd` Arial&Monotype Typography ( ��ʚ;�&�)ʚ;�d�d?� �%�_3���LuaSocket behind the scenes�6 )  � �� Diego Nehab� � �4�� Short Bio� ���Graduated from PUC in CS & E, 1999; Worked in Tecgraf 1995-2002; MSc in PL with Roberto, 2001; 3rd year PhD candidate at Princeton; Computer Graphics.�D�A% � ��5��Outline of talk� ��~A few historical notes Case study: SMTP support Protocol abstraction Message abstraction Implementation highlights Conclusions�p0C   � � ��Historical notes� ���1.0, 1999, 1.5k C, 200 man 1.1, 2000, 1.5k C, 1.3k Lua, 500 man added protocol support for HTTP, SMTP, FTP 1.2, 2001, 2k C, 1.3k Lua, 900 man buffered input and non-blocking I/O UDP support object oriented syntax�N@+#G@+#G �23KQ� ��Historical notes� ���1.3, 2001, 2.3k C, 1.6k Lua, 1.2k man streaming with callbacks added select function 1.4, 2001-2, 2.2k C, 2.2k Lua, 1.9k man LTN7 added URL module named parameters�l&/('&/( �o2� ��Current version� ��2.0, 2005, 4.6k C, 2.5k Lua, 4.7k man Extensible C architecture, split in modules LTN12 (sources, sinks and filters) MIME support (partial but honest) Multipart messages support LTN13 (finalized exceptions) Package proposal Improved non-blocking code, robust to signals...�p&d�d&,#"  ���6��Outline of talk� ��~A few historical notes Case study: SMTP support Protocol abstraction Message abstraction Implementation highlights Conclusions�p0C ��  � � ��SMTP (RFC2821)�D!!��  !� ��[lua:roberto] telnet mail.tecgraf.puc-rio.br 25 220 tecgraf.puc-rio.br ESMTP Sendmail 8.9.3/8.9.3 helo lua 250 tecgraf.puc-rio.br Hello lua, pleased to meet you mail from: <roberto@inf.puc-rio.br> 250 <roberto@inf.puc-rio.br>... Sender ok rcpt to: <diego@tecgraf.puc-rio.br> 250 <diego@tecgraf.puc-rio.br>... Recipient ok data 354 Enter mail, end with "." on a line by itself Subject: World domination: instructions. Commence stage two. . 250 RAA10452 Message accepted for delivery quit 221 tecgraf.puc-rio.br closing connection�"�pnPZ02�� 6  ��$*��$/��  1$$��@((+,,��00)44��88�,   "    ��!��Protocol abstraction� ���status, error = smtp.send { from = "<roberto@inf.puc-rio.br>", rcpt = "<diego@tecgraf.puc-rio.br>", body = "Subject: World domination: instructions.\r\n\r\n" .. "Comence stage two." }��d�P'Cc C c C6ccc C $$�                 U �&�� LTN12 sources� ���function ltn12.source.file(handle) return function() local chunk = handle:read(BLOCKSIZE) if not chunk then handle:close() end return chunk end end�,#d�F�C� ��'�� Using sources� ���status, message = smtp.send { from = "<roberto@inf.puc-rio.br>", rcpt = "<diego@tecgraf.puc-rio.br>", body = ltn12.source.file(io.open("/mail/body", "r")) }��d�P)Cc C c (CcC�                 ( �,��Message Format (RFC2822)�,!��� ��| From: Roberto Ierusalimschy <roberto@inf.puc-rio.br> To: Diego Nehab <diego@tecgraf.puc-rio.br> Subject: World domination: roadmap. Content-Type: multipart/mixed; boundary=part This message contains attachments --part Content-Type: text/plain Please see attached roadmap. --part Content-Type: text/html; name="roadmap.html" ... --part--�0}P�CC)C C CCCC  C  $C$!(C(,c,0C04C48C8<C<CC�"[ �.��Message abstraction� ���declaration = { headers = { subject = "World domination", from = "Roberto <roberto@inf.puc-rio.br>", to = "Diego <diego@tecgraf.puc-rio.br>" }, preamble = "This message contains attachments.", [1] = { headers = { ... }, body = "Please see attatched roadmap." }, [2] = { headers = { ... }, body = ltn12.source.file(io.open("/plans/roadmap.html", "r")) } }��<CCC  C c0cc.c c $c$(C(,C,%0c04C48C8<C<CCC C cCCC  C $C$E(c(,C,0C04C48C8�j3} % 7 /E  �1��Our message API� ���status, message = smtp.send { from = "<roberto@inf.puc-rio.br>", rcpt = "<diego@tecgraf.puc-rio.br>", body = smtp.message(declaration) }��dxP)Cc C c 'CcC�                 ' �D"��How hard is it?� ���Message structure is recursive; Need to return chunks but mantain context; Nightmare to write in C!; Use coroutines; Write function recursively, naturally; Call yield with each chunk; Next call resumes wherever we left.���d ,7 ` `a` ` a $`$((�"gv �:��Zoom in on attachments� ���[2] = { headers = { ["content-type"] = 'text/html; name="roadmap.html"', ["content-disposition"] = 'attachment; filename ="roadmap.html"' }, body = ltn12.source.file(io.open("/plans/roadmap.html", "r")) }��d�FCC C4 c IcCAcC C $C$�:"} A �;��LTN12 filters and chains� ��)Filters process data one chunk at a time; MIME module provides common filters: base64, quoted-printable, stuffing, line-wrap... Can chain two filters together: factory Produce a filter with the composite effect Can chain a filter with a source: factory Produce a source that returns filtered data.��O1(+*-*%1( +*,� *�<��Zoom in on attachments� �� �Q$��Creating filters: high-level� �� �U&��Creating filters: low-level� �� �S%��Creating filters: low-level� �� �>��SMTP dependencies� �� �A ��Error checking� ��DFunction return convention Return nil, followed by message on error;�Bd*dA � E�B��LTN13 exceptions� ��try = newtry(finalizer): factory; On success, try returns all arguments; On failure, throws the second argument; Calls finalizer before raising the exception. foo = protect(bar): factory; foo executes bar in a protected environment; Returns nil followed by any thrown error. ��"d}ddXdg��c` `  `e��`.`  a $`$(g(��,c, 0`04e4�� 8`8<e<d`` a ``�� u�C!��No 'if' statements�*`�" ��hInternal functions throw exceptions; try calls tp.close() on error; External functions can be protected.�xi%A  A  A $$� i�O#�� Conclusions� ���Hope you like our API, we do; It is easy to implement; Function factories + closures, coroutines It is fast; Time critical in C, management in Lua; Questions?�l7* ' * ' �,V . /������� �$�)�* �- �/ �2�7�8�9�E�F�G�I�J�K�L�M�P�R�T�V���� ����'��� ��P����( � ���r �� S ���t��$�� �@ ��   � ��l �� C ����t��$���� ��  � ��H �� � �0�������޽h�� ?� �������ff���b��3������___PPT10�u�. �q�꾖+D�='� �Ɛ����=� @B� +r�O ��#����VӰ