ࡱ> xf  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~RdO)t^PicturesE6PowerPoint Document(FuSummaryInformation(  !"#$%&'()*+,-./0123456789:;<=>@ABCDEFGHIJKLMNOPQRSTUVWXZv?Nj{܏j׏ق@=e ^~~~jǻt,>?ց P 2qmk;3I?2b`L2$>c'D_ iz'>->|.YDh04dO.'{nz'q`q+X@@,& 'a-+c2:C2N#/E,GvY{zYkHmN^٬fR߾X%hS|ڿ_Kc o\};6ڽG6+j>GoM1g +NESնWOZZO/v'Nt77Qj ~hjͦ!ӖdyO}΢-[xifs3a|Nzlxߠ{˦=t=vF(E0T/$aI3ۦs3i@dhUώkP  M xYՕ{fAAc(#>AaP7ɷ O5}@LtQQ1]Tb6lfu5c:y"ϙ~T{wέ?Xǭ{~[ǭR1TM5(Jy #/3.|ߚ|F㔯2|yڼ5]ԯܭW/-J'K^(8o )k$60Ļ*.v]T)H E_IG*0[!cU 3:3VJjvlCz,>&!Yc(aqCRɦ#6Kbn# aH}8:dĿU&}'1@>G5F8 2`H2:P0"Ζa%Ve{{_AxpaneT=ΉŸ"clF샕=Wi/g\q4-~a,6gazTmH;[`v%|fP&F =Z.P`avq4fߖPg}qwE킄ݝf8%5*gJ \ÜS-+9ǔlTA:} v /Q'0ΏUXGNy0G6g X dž'[vJRՆ1([=>*:_]-n.6_'-U<-Ӏe,U\8+w8*몍LQdvr$SaXiP z)*sߗSzbJb!(VAP?{ZBiF=)sև<+[Y/ :|<c+`qXY#cGr Ӱs`{CY$R$*Ҳd:|H5/c]s-ԪRgw2I/ T5vm\5{E[y#W:f<~S5C1ly0eO?׵suk0p)yW3KXٙCzL5֯^Ǽ;]x"p݋3)o&ʔa8 ~G4J!b|6Nb#\fk\vw>4c#+nj+O LiI[$VmN#0* as|oP[Fō8 NE2_cceCv E񾒡HnĜשbV:(`YѴbпQ ZB1NU4[1G +#x*O9kFb>fI3c%[L J*X2y~p4i#s\ZRc}ܓ]xGd{S{US?6yÿxk "$Cc"S~S5žT=@ߨWl9<7-%b k1/y԰&GJ  N %h "MV.6TцZҐ-'?1Eۈa5.~m~{ymm_^Uj5w5u88ud?>~xUG#oxk:;MVjQOz mmw^] OZMm.6ommX[YHu\~yǕG ^Fӌ:FoRo7ھ6ȶ\VvV= ?wni̺pVgOeYX0dKiTЊuqR8%ĕqݝBC/]Vۊ3V9x Jo4iR ׉F*{ 7*-bQ6R. *fDo}rW(^<\Utb; >?OAN{O_ `hc\89j XWho|VAhGqф+t%$gt r HXmR6.CoB{٩ħx#;иvWH+KTnQ&2?ϒ:٭D%)a0:0M0z`|U\MD?y@ԙ2}5X6C?S1tcm>#0gRzSaaIû"?k8#F'phDrB\CɁ6sYTƂ2J0I[&v-_4^Og'DBv=Oaj8hS >h%=3v'M8L O8i5\{/FB4-4ևo5tHt_@dVmtKzQ%pW]m N?LJMtʤS ^Pߩ\|q.LԢI#&#D98JǏ=ZYz=Jtͨ$ĸ;TRF!kI] &9famX -eKBqSBT:#cnQp۽MdS?cfPQO 11sn]DT`UO$Oe2Cb`u ʗDGl%~-"4U}z^,v)n:%. PdѸ h_}0ChJ4E&# ;*QLiR"%Tlwk&R$O4p>dꫧ3di_[xuOS ǧ5e5AQ#,4{N/cDȜ#zu oA/ש 8^BZMқ((I_JnXwG;V-T $˲(QRHcwoҐV"I5ҒjiEOQ9(uf=[o bvh .XWx[Zr ȧQ>6tC"&_=eăl:RO-9Sgn &sZt=ܾ oRӔ1΄K\/O<q'J0,Sʺ3N'16DSm)-+ċr!cFta /jhkPNH4:2? N|<12T6宩Zqz+h ~Ax-xzmM$h} P^ς;vmN˒>u4e㝣4髾Rgҭd @>LEFfX^2a2a"Mxq{^:#9nQQaK@B _ؕF鼝(**^tS q{Ⱦv|6?̎nYAvxJ¸4?ai׍M$3PP#_tg vx&3P,0] ޳{,~6й]ONօa]~ ZѸK)=jY;{ %*}(ӛLIgu oHקJa͠kT] [Vt|yp<Ra?XpЏ C~,q +z=Y{-*?kJ_#m|N"[bBU'6j:u?%^鳳7כmo5ySoOnvl/nr~>+jBhz0=[r|7|Tp{ . ˀnzhVc/h(V;qvyCEGԅjN-YuU^mZ:ok0hZO}Fl= }'ȋN9.U2%nŃeH9\jdФaqz:JIc ۿl$@UnKXzHNUpT^tc2??7?8ڙTUĦGe~5s۶iomAԯZ?eن-~oxeՙ_޲# oXe߾m[+F78_UG< zb_SG`Jo{Ki ᅰ_@!N& 2qlё )MN+7_je -"5UZ vWP[)$ "h}3^D@u Gz-/9sm2ϳ49v륑bh|,J[dVH-"7%tVi0MxyUŝ-͎.LУQV!QnI8̜ D\H21,1g̈d@Cj h#MMmz_+߷χw_i=o*`Y/a,d_5S?Կ!>lFꇱ ݇*˩YwFƜOg##I6US&Qε(ȴP6/bF>]%l2: WI^:/to'O 1pTWO uP/Dc=56:$02U1)TJĕ}d 'Ɉ^%}?ec)\\r< ◿pת'SeLSv M'WV9O<= Vsd]Q/U+T[wRG)>sM ]ܱSޠ/l3 7JQڹԵ\ v֫?u 9:XXM*rg))2y6MH)ΤgYv%hI 3i$\иqB 2WW;Xy9wQ~" Wa~1bԧ/w:3r)|˨_G뮣cdܲJeximRzۄrgԷSt^wޔ.甥sEF"5tA*ә C-i}&{ޕrUh~[Fm2ZmohL&M~xN\9L5wz{K?kC)a߿L'SI/~szbbk,?2{Cљt{n(Q֎` YtE2i箊Ra礍Jigp1̳h6]tc ol9C=m(µ4vV R \^5 /'mMܦ1:z&ޕ8YwK/X 3/?_of\ZXrzaEN=eHb<--(*>Y"<{`ri$ :鐾-e5or}?qF~I/? +/cOw9{ʹA:_!P~qΤHfM~[m7o1Z{kѵe!&A/:{M^U/8Ufu7IF%:Jϧd(sc yPKkkiݺBj܁z@W|¤(:6.^N y1?'7j54Ki(+b:5oMY#_fJXW5MEEET=Џ?K뢗\O{$͛Mpᅱ(Ɵzm2*ҕ!W03ErDTQ_6I>@wHz-EOωR8EKAJ~|b{@cR$ʨ, 旸1 v=O6w!N7U1uҡBz˗7z.KxK[r^NBu] y祔VǙ:qU?NEwjO--w$P$t3 @nki:̉5'+l>,\43W擛nghПr\o/a&y?̂X`ɼǩJ-@#'sW_4m[ϺS$S]|>{ڭl=қ+mTS+e{zq>~Py014bN9H#G wXg%#=w3oL̯P['y<#l潦ZcUχSgԉ֥nR(e+fF9_yq6Q]otܳߞX8խ??jM5J۟BMV_uÇ5z O<~, ? ] b Tb5+Es-ݢe߻GkLZ\i;"vO'.?“6gŮ ͖jQV*'߹˚u=/MS͂Bc{ĕgԩWN5sW{#hSsJ I3t?/zei*i[s} yt9STU}Ŭj_*-WybvsLלѥf=UO3}iFUM3Όٷoj\>#mBcz'?%FԩSmEhniqܶWU\uM&]+yrӔ4n@W6̛9w̝r5$5-n1V=?Ur6ltg2T ‹#5ЗZJ>F&uImM] ]]pesBq Ȍ]^Vͷ{x>lcLsu$_&[>cc#M}Y?K[gR +W<-Ym]+f8M}}z4'N҂GEϐ͔ѻ. 4|noqgM)&F֜Y?m'BH7LwzG!'Ue񹸒$o|];otGv2IE/5Wow/;Hz_Hb>,U|@z@TEF^Ԯ:z4ui87Vt/c2QF"^M-5rz_G~LcQ>|\k{9:x^PT5QIq.fgsh i3LND3m[ٯ/Q-.밽L* ?&L+|X]b>_U&pz =K[ G3gjMW ʼ)*!7ѵ&NxeC֮q' \t~q%B=Yd~/UTZ6$(|Qrށ(|v֮b<,pz>*%YNj~cOtoJ;|r>? m#9g%ұ}_oSTAc& zrҢ=b0'C`>5$Yq$:y A0DoSy.AgIߺS+Ew+~„s^9jڵpkA jT| ,E)Ur+uo-Cㅢ},VH{}Y=|l[sK4N{j̢*c tV&F=D)Ӥ1ͨCR}XK#wMKɺo3u}. I n b@a㈦iPNG  IHDR-tRNSv8bKGD#2 cmPPJCmp0712` sIDATx^sK$x,Sbˇ\iҴN29l1ݍ8V_ݽO/tr٨Ͻiqwv. s3.훻`/\uЏP۹nWV.[zr}Q܍?<1 B8v]5a`A?M_'KS&m܋swOaU=&? 1 !zHלt(:>0n@9˵Vn?OlжQ#BVݧ1JψjT-:QNCӼ0z'eUeiL؇#5kwew93@j`ՏR+B2 n sr>g(6܅u7]?^e*g}ZVlyH{w;տT@מNnE^=$B@aK?4Nwo+~ŅT@\#kɮW:jō8Uf;RG|iTT7rݽ%g^-H/7 6-qϲ{R6*ĵVWM|mg~mUTKhT58ݰMTgyÚTymebKrBV7rؿ\ܿ @Bʫ9)ȰЀ"$Ta3[4Bje'S ;*\οݐw-e͕e-`-"ЙVx Pa2ZIw@UŒP ¬mmEGb!W*#Q00"˲z =i9F*/KBje ñp4(h,fEꆐ`/dws}菼I1VѿG7>^t#DAeCo^!T=Xp؂jh+z `rÊ`kL@]Dگ4jO*r#C='uYl cJ{c9}{ x4@X48/uw{(loNp*Von7=0}#o趤mz0n:\\ Br>y]ޛOPڅue{Y'NCΛZT<;T-lʑX'HEk xFh/|~ eQS-3!)TQ|zͦ_4sZqY|'YR-#%hկFsʘM=* ]UajvJ?_D2lTG7^L. dlbhP%ˇvr(@E+uQ ɔF~F+|I5OCD(D"2ajɦODI U U@#CVT$ŴnJj;kjJBY¢} D\0h?uт+RM®}2_uEۨU"+(F!D<543e"S64$h£,ɨ;Xw6;0"ұ+U8ql$>}pnnL?l0&@\"9E"LHC@4Ǔbj2 2*ΆU^0 ЇotOX*\>P1a"&}?yj}&jh+z V _ &@=`I Ȼʝ@JѪURT6w3KRA~ oue7MѮc!egz8@:r(kA'^YX [#hrurY%ssG;GC~u q兽m$z]y}$Z\CI.Q,y=jBP۟'Z|)ZkA񠮣<^M%Ϭ\/J vt;UF`>RHzk m5s[UikB8Zݭv.zaڀa~(E kk/#́QܥBͽDM>[>|v c!, +wZ\nwP9g!i$zcMCTw}x: A$W/eg/޳2y=;93i-QlWVG͍uG5y&#z7w`MG={Rzr'pd*52?zQ4TdRDY^ZZ^YyNOǒe4;іμ4I1i.M7M{\Ҿ6:>}nccI13[t-oIENDB`FZratk& fNJFIFXCREATOR: XV Version 3.10a Rev: 12/29/94 (PNG patch 1.2) Quality = 75, Smoothing = 0 C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?(8o \\]ipZY}ڋeA oP.N$\/tSjwvvg-VfkymBst[n{8-cb2 B6x2I&,OYfbL WFsI&nJ(Ibј2\rIoqDR.\-3X&+2qF}VW^N :*~2Z\ vUڋ^X?_]9q;NC^?; z a*h.OЩ&NC^?; z a*h.OЩ&NC^?; z a*h.OЩ&NC^?; z a*h.H_xzͦ_}dF>ڻ{A ߃kcG'~C?Ux?M4 4?C ߃kcG'~C?Ux?M4 4?C ߃kcG'~C?Ux?M4 4?C ߃kcG'~C?Ux?M5W~mkzڵYO&ݶA?(g?; z a51OЩ&A<B?; z a51OЩ&A<B?; z a51OЩ&A<B?; z a51OЩ& /}CV=՟"I۶ݑ6 @'~C?U?0T 4?C'T]@'~C?U?0T 4?C'T]@'~C?U?0T 4?C'T]@'~C?U?0T 4?C?> ;_;N3ι"K23/J}(51ס*A<B?  h51ס*A<B?  h51ס*A<B?  h51ס*߇^gxsCX iB$Eï {L|9_AiW}7$Tq\NO&4?; z a51OЩ&A<B?; z a51OЩ&A<B?; z a51OЩ&A<B?; z a51w׆=林+yyr2.F #Fv>,hwZEafW'$ɠ NC^?; z a*h.OЩ&NC^?; z a*h.OЩ&NC^?; z a*h.OЩ&NC^?; z a⫟[hz7"ىD,2 4?C ߃kcG'~C?Ux?M4 4?C ߃kcG'~C?Ux?M4 4?C ߃kcG'~C?Ux?M4 4?C ߃kcG'~C?Us6_~Ӵ C$[1"|ȅT0ֺA<B?; z a51OЩ&A<B?; z a51OЩ&A<B?; z a51OЩ&A<Bc wxJ;!9 8Prp?lWBփ\x2K4(ZڤLW.pJq=zQEQEQENNQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQESM]fTfϷ1cYa0r<`P'K_\ItP4$vWCfv6xjMޏ )QFC ] l#'Z \:\&|/+FC7$o 8203d>^Gi:/e *YPZ-7eGcaWoI6Iu-'Ҵ눧wI}# !;9'}._cUxͤ+c$ppb+Դ7Y[}SO\:u ʡF@`FpHϹB㼵JKH-0&8=[ޙm%{auiMa:67(YH-=nGӭt&g]lbv,nw)ʩ%WB GXt井gt@e[z>f yr8!xg+*]z'so\={h"DIGݖԅ@,c u'&ƺZvxioݜ!nqkGۡ\q&ͪCK> lS*/<+ |=ϭGs,:Ur]J:[2ȭ]3 Ŀ]ƥbytxpd 1$s9GUTf4xi.`#Lo9T| `|`2Qwy:uxY+0Z7ז#l@qҺ ~q政bHQ_p+&߼Tz ]7Guocr+YMfQ1*NA"F#'f?(cY)(:TjU-5vnQ\WmoY֦*f)e͓V_uuoenwActE\ R(MN<Ƹ,UOW}=I{_-s`g̮c?aS3kIhm'Y Ђ Պ%qKwny1 ڡpB|2DUmIvg 3$q#<IJ R;_RxQ]^w;Z*CYID[H nRpEsNJݢUчxаKdU(KNA&0,R1W9a*թҳ}LaC2*JToTmp #O9QEBV蓻Do9#†;>R=4 &&'FpAAyyvaEP MrTu il%mdٖB69\Ǔr2RWFiJ'QTfT3[_h6A~c碌'Ҧvi\(5CVl-Hf1䲀͵*TNy̥ʮ(ueʚ[ڛQEQQEQLXE(Գ*$ku O    EۚQE`YK^Ѷڪ1pPrS\E.IZM)ѝE'C~ö.'EΔqFyB6[[H:-#%-V4'aEUQ@wڕރo_߬=ڄ!P*33Þ?Tbk6XbfIVޤV##C >,#}JѝVڇcr:{h[^_Y(Q4+!wd-ל"vP(]Ei=M\l $rTo# ⻋P{5'2R(Pg%rݤ\Ew==\JyQp-Ɲæ^OيWդTM#Ŝ˖ےh$ Kƺn.][EmKd}`v':Gi [_>eKlbO_8i]}q mrfDۖr˵ԧ 4[ŴmkJU8xp UtW,bijqGذ4 7LF+mwL]UkK&4[ #fܝԋMS7ړ [Y+Lm#Y" ! ۋc\QPP)2ܺC?*@xYI7.gs} /aUh&;Tn䍭AEuL׺eź{HQ)!bn 5mZcjQZB-D pFߝ **C0mMoIMsGM{xۻ*C++ck+ /ykw?Mkje[gy#家#-|SqЄ(P>W|nO# [e y>YPC9$ZEڋhd" j$&'h,NsTI@|S—mޞV"xQF.n9cgZ@o#Fd bx1yc)u{ }kmϹ~Y6}a\݇n#WԂ[YIccy%ls _)2rh?LIo=ڼQ4) 1,1c7b  3Gv(,۵2(` vp|6G--_RH--͠.e<10Q:ͺſlm. ,c.EMfdu7ITwuU*|!{ n/-m6wgosOE)^ WKcK_ wK3_oU[yv91V0B;sHЏY5[K51qui/WcK_PBXdI#n?W;}K[gS+ƻ_5fEPEP?Q4$w|i7ϵ;;2Fb(~rKRKv+kIE[ (?d+nIu [>{Gm$Ы-rʃ=*{1;neRJz 1@߆ZkOhii4L'䜳'| 7nl-Db=x# 0 ti2kA6y0v1oGV&loy8$+S 2$7A.2Nؼ|tA㜀sלך5?dc0֥JJI$WM|i''7vnc?/!#1fPGLj.u{ax!2dPN` xnRYc+/eE_;|A c(knz\xg9׵kV!YnF^x' ~A!x-tΰꤕ P[lE~rZ__B+$Ie#$Xٶ 2`y(R"rcocmcofՙWL$rm?8'9RI#yg+-E<(䱕Xӄq'vzz(4KkZ6vJ Tvg(g^k6 }qw1ȱyk# 4d>p`MG\-ժ\$SͲA'";*mג fxfV|Ii<6*,Q::y"`o"2Spd%.j[3/e&^|QM_ƞ}gᯇu!٘ํywUA;Tyzi4h(ynAʷ!{y%3bf6'c<]M~,Ö10N ꠃ#spp@^IxJoD[R%S~Rvo|s'4'iIc QN$^ּCam*<ִ869 L$cd W N"{k}΢Eܱ#bRӊSkhce0؋yi_8ro R>T$ 'vPCq5vSx-i~ʲ"mXWL2 989z >"i[,IQPG^5fݤy9 RvmY.fO T$1XI>QG?p1Xg;&qd!TvcHly2~%^Gi%eP=j#76:E _JĨ8aR}0dGAԥfdWzs޹ou}6ASk1= u'氞*4PV]P2鷐[& y~b|=rO,Z#I)!H/Y#3ĒYn|u0Fwi/FNz-3Cjy$e3Bbq`r~fڏ-NL`HcIvUU R28o`F1_\]αDKu!gF8I p95F]~_uǕ!*>8x2Yr p/N_gufk~["5k 2k[e2G0ʳ~YOv܈aC2*JToTmp #\Ǐ﮴(%Bʌ]ˑ랃1e4mFYy8l:?^%KVs-v) ɀ0o5ZIkyRG+FAF܌F<`jKHar*HgnXλww{|tUM'|z֗ëivڅʰF$E 08=A#âx-԰YGl#S!8WVrH_I.2˱ܴm\n"6qA<\aH(r9 QN,fT&77mǽ3ʡN4]_pRsE1m/u]^jh# n.O˼.@| Ya;[[o-xtmAyAA]X^'H%k,B=2zfYxft*X@DQ p〼zʨT|LtߛzF13f o;kErmMYʱUuvT R1TZ7W j9^e/RᠵM6vc)FyTcld R_} isͬRⷹQGb3-Fp̣yO5kX}}]4۳X'08 $|~LZ\ ҵ.n$ci yː@y,9Sd1NsЎKVqR\ jѶit{ܺ݌i.&n  ۅ';t $Df|[ClX01A$9*y-t[CND !2npqp#$ZW}HYRfͫʋ\A*Ȏe(3,VYReF)ɿݬHơmR][;ɢ$I"F`UBˡ>WӖI@{y_g2r?tcDpy0y7}wqwRKeoaI,%4xCY}>]nS $8<PTm<.2R;hw{- v=gCNh1jMuin ʱY#0m f,o;8,.໵;&A"6  88 ¼:;[<-EohD&ɢ7fgn8 (ۋI+߆/Y3cs"K\~#LaT#ٻgO,.Uޮ}qZgepS$Hd *K V.gTO$HB$Nz2?*GKk[u(~[hbHȈ*`܉m͍x}2w]I y%Ҡu"Eg@;?.rING+`ѝ. yl ʤ,SV$մuHtu D&MZ4%uL䏕~3A}vkK/30Hѡ bʷ 8lwvQXŤ\=aHme?fQzyNߙ%VZ8fWh[$a9S#U}VRF{#U*0]Q\m]s/4@Ʋt4p'.9 )Bu涷;h%lᰡAp@;vWrF\ͮEj!&%1_Hv6zlVUkxn"6 U&HՉ|}isIoblQvH=%{kdn ,yteCL+ϗ/h} v-Əg>RE@e$#`>Vlc+ycud'LGi䯕,1NZlg<9Pjߥjݑ-3*`9$++0= s6Eo躮X` #DNCq0i\׃K伍 .[kdBGS"c(%R+O ZmvW\j0i$ kp"F'SoxnvN3{ GMխuEۖ ȻX =e8eej_$O/;~{5s[.q֐qq/Vl>!n5#ìi_d6rP˝`95W=;~u^<:K\$)=K3A7r~fe*xF6M?͹tGyEa'γ;Zvڥ-3Fw9ܖ={j暦VX<^ O:D^%x5O#yσܽ[q^^Odz aEPEPEP^#|VTh` j<"9]W8 H (-^^E_%?-`dl`eY>s\9ӻ_C RM+[_'.u oi2yL' {28hڐwF7K)#g8U.+4;mDJZ@II8?'E.;jSIwNKA&Irk6C`vFz?jP3\{J}g_\m$"O!)H(2fYe°ĬYPHh{h.h vdNI'g߼y][[Ʊdʤ4ñh+(eKuթ|ϾqVZ-.׿rq؅ APBI$5xoL5mmnZt!Hˇf!~\,GAv{wkwq[) $XCprs|c6&{mJڍ<n?x'= Pka2%e)v8< Em%|n-W{[at"n;Jb@YCoa+{E!w0'Ƿʬy]=G54Z>_B/>ChP[&K2D8ܐNyZr1lnq{9=/+=<e< ' lG,;D/hٶսDET?#(PvJ%|X=Q7C{,{?dX  ' F3Cf5W1G%r ;ߥ?[{^{9mw1(, r~kX,2__;,8Sہ6cJzt ӂrz.v 84mChZZd ɺ,d7c!xïN4Xm#IЦ2Fty(#mq9t&23ѮobWs:nRYs gP̛Zn/"08֦Z]Z϶~\lL%H*#sSB)b; rxOCq^mn~yFWXp{gm*qmz%ÝmA.GIBY`,c2#PquBYBoO( g XH!ݜ9f$iNdDqۍr.ӿ  0#]Ѳ[̹qEԢM25ԕc[iLm" 0ڣU hx/l!qk緘菼scN֣*gY~TNۄ?: \U7sHhH]eXQX&ջ*pjKEN+ToP^ȷ֭lҐţ )Q\ws#q )}fq$n#uG10 |Xr ymʴ~oJwN`_v'v@ﵽ+S-1cC[46y<{V~O-~ 9o3<F3IKZ:DtXG#78*]|+I2C(deQ>`sp Ww*ٵ2)a%vIJ=ovosZŽ޵$%y)dp>l%(|Yz5wU_& %$13h XU2T)h@kiw.0jqHs7&Pz$I'ԚHf^ 0V>M/?=N*Q_)I]w=\AN(э@ oeʎX'i_mԵGZ,<|_ό+V TxLb"< 0d6''g88QQnMq.pVtľX(fPc>S 6.3;¥j-/{[/tGT5ˉaIttY.n`wh;<;~M;CȑMX GcsYuh C'VF:GPA&{)bhBT1<  6ݥrN)u"VRWqQMz_}{X]#BzAGLUxG\լQoRy"u{>$*$.[zr5/x]>6D&TGUXoWዐAQ,LT6(䵧2傋{Y[_ :?dyUld%8#`e*xaTmFkjk^4pO 2"%l)\Y.^o59`jvn~\$`LK%0n_(R1^roB)S^ߡ5yKF ( <( 0]g:vz$Rèq4 0\$$+6C9"X'r|naS`w6CljFa q{U$yUZʟ'Lj}\=vcQO4(Xĺ:X<*c`F)N7zE儲YJ*Hr7/̣rÜwL^Z/m6;]؂c ^/H !0Bh4s@$y檴ښOF9v3M[K4Im"kj&A*GȘ\pN Bz{ ZZvmcI+^+-Rh("[γfU-yi7|tk+Fk[(t d0Hx2Σ$OL@5j<=ZNw{|[jkUܩ3 σb::%A^} #F0R?Rz529cKE"e%NFA *ugkfȆLǸ9S9^F,X} dH}i,&Vk,rh 0N$xFaYo@'n?;ww'II$湏BwZ>11ZM$l XF܂9H>r ]#Eގ6ʓ6b9IdE *#oBi{owr@mF8e!pFXc9:$A̺\[F>o C99$z!h=5ڥ]NcQ^fGS6FgU+^]h=oTMKiZi&eG/В$d>T 1L6חum4`gm` i 2b[Vb|[#im:YepiHo +#5 -W ,76A KHIXʬg[OGGe˫][GxW_Iy~c o+!p1Ab~PE} J1M> ө oVU(, GӡVm:emRba@.<=XUH[RF.}.!c$`w g'a_L⴪ƴתɓq{hIM0d F*E^] SNK?YS$Z+pKlp˒OIӼ+'֮<[P@vBEvXm%VZⸯn}ڜ0Oz]gLShڅշ]4d AJ ,ڥ.#x']kZ/zyT^W-ʐK8= 67^-Mm&!%C(sq2!e7RcXB ¨+7wp-zeeNk^"mWm;(4g?xm*$2h߇f8~pArM\BB .r&fyhŠ:=IM |e:qvaqu]U7%yhyBXqٲMdr;X|ZwզBçGnSqe gz'xeݾg1*U\6eB# 9n4 RPi'N(d%#m1/3lSo%4|[yΫcyggqkv+a &XY&Nv *F$^w]ux۷O3w[,Iy~/Ԯm/"}zDaҦhG5*T_j}NvKO @2>T過X\|']P8I^4@Q@Ể13%-$^W|ݛ7gݏ]6}yZ8rF9yoﴟb43%g_Y;Kp c܀zt]h+//a {w/pBLw8";ꮯMǽɻ?T?~_myH#r$Lqσ7׃VYȬ2!Fx\6WONnvLj3x8YN2O S~2{#̨Z.;ͯ?=%r_3q{/庶.[D8$a#$+mc80HxWZJUtS.:X$@ڳh~/ThtlP[-fx:lm0Kr.mhbVpdFyl:) 7Ė og!ɚ8Жffٺ#1ӑ(gʷʮGImI!NӪlYǬ^c ڽجca¨ May|S8br 쏌{.qX`H{܎o =Lg+Pױp0+ry8*)y*zJG+,` %2&9rۆ^I_Q4^)-uI̫H,y5ZF-I9sYO]>ci,dcTK 4f@p8'{Vu䖰^Bna5gBY#;oQCu |jMX˒o~{[~bv8.&rK9,ZֺĻ{/-UU%s A鴨*s[.U-_4Wpm2ᙔ@IsǞ# "/󷍛6wns딓_P8U{usW %i-n)|$fxC69V lt* ;ˍ*j5s:U%K 6CQk^$ z=Z͸&YŁ[6__?<,ӟ-[{:(Š(moԿF\V`Oo%߈ux"kyNE?yqApA"[:($4ݴ_TI7s+HhHӡWGV0 Y~Ѵ[{'i|C>C N9'W qbdZn.+g/bi?JdqT8+u`qY2xkK[md3X{ss7MHJ5VJnUom6iR<)42,HXAu סן/HtYcdc@0  cQ?8fێ>=Mw 丵&˶a+: (l` uj14Zb#"wtbGA u<2;MÚM]RXBV8(psvæ;Z#'N8(n՗yū[8˥;}Brg.Yy8$wOOxOڸωi OCac 8zGk .MgEvR+ Tsg2r"ԧnO?Z2zEқ~GA oIAut;wKdK"Eb†sx Kmmv$Ʉ#[ƥlm#Df 1 6NA/aZh)Zsmm??Sl$Ӿ wy/ʮg 9Sdu\M;[%'7Ia1mvwv+_C١otp|c̬pKprKdrNjm3P{x`n.d0Ld*1q8' 4/&T2WGf?(Ͻl̗6*R)cLԭ>tc_į1Ld?}vfs~ɶ1?zԭaQT-ڦ}Vaϭg[ȡm'NϕMw%7(0i(ܭpz A#Кt]MiL-XdA@$2ytx|2h7WQE]B`~\t+ZQ+irfx:r&g+ķ6![͆ď?Q?>6ԗVv4Jf¸!&H N[HKFџ6X4Q)\[20]85f7J "Ҵأhlz0`Gnkf!ۀ=py<㡭GrUF50KE{ҹ&C]Fq%WT@|lݵkxA2J6*AFx5sJ8m^EVU?hz~]LZцWJڬ^'&TIu 1ʪYv 0Q9%CUNh-vV\.YI<0O 0R8^TTY  6ΨE,8#' sS| j)Y(IK2h k][S:|9ʩT^j|_2M:̷ s؃G ?n:5gb-F~h6 [Q+.2: ƧIեnUu9ۃgyt'sLbP6ݿ d[CҮoRZGIM N3"Ҍ^"ޚv+Tz5_AlQ0 `1,1`WUKmY6OA2N[SH  A$Q0ɩtrx92V i~8$`nKlɡZ]oR\A G%wxžV*.&ު[^SPH\bpo$sc7)uF<Џ<,o#ҫi(@QdRSMcwal02N qGڵڛKI]ז_^w/c'=,ʂ}e;7Aes|3Z<5$p2.َ2*ep0YӒ·mSZ;|HƮC`dd Aq[xoyn. xŊaLA0 3/nZI,5-G->muk.ĭ㲝~<,>-kh+oTOkIvv&K!,屖$23~]{,%qg"{ag J0F0y@x6nrVy`s&uU,n@d8 La|KFקg w"`+l; c'$I$7Q)>Ph-b҂hܫ!.\ȹD)o=wz.>YT,PN^c68`Tp`ۼw,yt,5Y%nn=~/+ì_Lď(=vJѢƚ@?/ :!TmN7089EyuXʟo &hz͠Ό5C b]!SrG~sB ;&)XC+H@O$p:dV<9/֯+S>b/Ԏ. )M[GO"PLj܀I袾}Q@O/@?<+kĶ}[֑`#'\z׬WS+ƻ ( ( ( ^p'j ^p'jlQhĢYcFGHU kk[%"RQ[7s<rXarG<{gf}WZu\0vYG-8F7m[OVxӎ"KVm=Q^Q@dߩׅjmW4[xG B8bK9Tzo OQVsQ@q^'ݮ$OFO@NSN%v)qfjy:RYl8 %Z!4LGbZ/xAֱ|}q5VYʌ?a>o4_EcFqǣV' VM{s,-'%X6pė9\ sѯ仱G\ 8=8<pG%N;]\0{fF@TuS{`Fpek )*ŕNI>皸F$sbks`hԥӲw|7>.Ĩ>\qb>QzKy$* $ TU9At8`ȵ>2&E겡?1?1]LUU'm_O:\;6yGo,lqiw,ύs7zXO׭|l:Zi*/Cx~e7wW![mg׳۰#Xhfv Jc\uy׫ jb{j"l V$k~{kK7+Bzڤ}iZ~qU$K JfQ0h2/ʧ8c W1Cϧ91gbÒy H<[l?үxA%h4:sYet{} d_vӬ%9;^߇_K)0Ʊ*" *+r3Z #FP2@9t ׆u)ZJOo@)diyX(gb"\@0Vεu5>m22p9V#: ?&}|hŭ9eĩ"cH훷O(.c:>Vu+FF}nK :I$o85j39ڸ711Rez\izG⛇{BU<߁S-g%ڦ`D#`F:*4]XV\ȳGn9k.E K?]eK7Ē,)P^fЫ`>ǚtE% sE$PN1$ =.Ú6G:[ee\mQE=Ƨ]&T]`\ ;G!XaXm mKSi-KiU_GBZp9kͮo$U k H.Ͼ\iqswKWI}gZE=,'˘#}[SكZ,I4Wx]BI-xvB^39xh,viK[x 4IK͢F#bUR3 Qϣ\4k$R^ޫs( Wh~!S#T*Do~zwJn|Y0՚F/q 0I O5Y^iE6l?HҲ1( ;c?׶v5ukZ 7., ȻT?''\wzf'PHFrnA'ϴ@ߌqʖ/4v$';m ~=(? (<_5Jg@((zkMwAkeK gy$J"Sp_+_Qe>$qfb>B.?Isl00Qy|Egt=k7>qܶ]șRrxVswǚKHk=EݻtrKdЮ122{Pq;)"2zg8FrZmK>*<.q(8x=? H?菲+:v웕%&nXk:ַ9i*>UfPp@AoOJCX>m ;yC.⻃#9n!Wρʤˆ2HW8U',A 8 rlf mtVOlley¾W3Jյ_^&-iپ~n֤88`5̾89AUArASfErI#Ml;P@c_ I$I gg20 85X=I熚[|0lr' 5?w4w2F2ܧ VI [jk{Ed0eu%X[TՉ;Zjf:(~U~j?yt]Mm2J#ʉ]r:џMpܸss#$:R^;g,I=;`tJqYFV[KDCqUc-è@Y|Fz=* ;o|m]۾'R6CZ=9~Zݽ4cc/E܈ 0hN g[ȡMK͑.HVPJw!\5/w--|S"cl-opxƐwQaT+gsys*l&a% #0zWk$;JXn tdhfx)G- PK?%X|/lۜwrcۏl;3@ҙ"hirQIA<9霓 ?z稾't=F=R8ZI90.61>Ea2 *7#MO\Y5xHt?gE\|^/#Uvosl9^C098$ͽX(T3bjU'eQ.Q_i=M>UQYNydy?098 yvct^&;s.&{fpZj?DZtisOE|0yw?'7x^4x>o;rʲpU;X;3&'M_K^y]{ĺVfH( niSb勤Kp떰_ \"~orI$,@98dԒy|A$EM?^76з?"guᔺ^K);{qpup} kc4=Mdo:%@62P= Ϧx+EJ=/Mv) Z# GM[_I~79/C LJic#'?޽G7)AYƚ|ٴF"F=xJEcWz|@>h<,5F}үeͥ7'ՠ7FFH - A(8P0: ߪ-k۟3IeoՅp>=,t3E H͏_Aિu/}\W;"E+nΓ2}Fp'9 {97ٙiF/yF&{rѦxi da Ν(F nO͞elki4ĺ4bwB)A|n nݹ{_Oyj%eVp>bO3^]yEvO>1ZM]N-C_ V4Y<Ǐúk|1|J:šI*iШUB9Xos(eR3@e+u|Cid8O)W'Fj]&_kͲIpeo[._dg 8ƬhFmk/hKjZID%2L!89(vGYxR]7ĖR6RvWy |D|6hU]F{cs#Q+k@>qϭzuoou&7{خīẓwT(GI?6kzE;ס? 4>[YJ4=иGGđSk}9> %Ѿ)mbKn88FӐW<3^X$Q6s,,CSG:t┩|$N6PƷVRKu_nlH8֭,쫝TrQ_?W!BMoL}c FA$Wwe宝g4;mo7r0}qYt:RMoeJ SQ퉾`ϴ~O98mdxkQDf66አ!U^I@QHN1qo|O;iLB <yC6 rHQ*R}G~qUNJQW|?$zQ^hQEJg@'{OM=bH;~=QEQEx^XY.Kqi{%6 b7ܤ(Qs 4i`y$<%u! آ3JZ7yye2HQs7v$RY,KJ_;WWKJ_;PV\  ,&QvJ`w/UγdZFeRC袊((((~RX̖R,w%~Fa?$0k67mwoxt8mg8lonmoԿF\VrvQ ~{GEo_Eq]mr_ uUZ?`x;m`TqeF}~|S"^趭jc)?=9Di[\T C22H $A kk AmsI$O$I$I$SQUe{{I8_Nǔ|b[EnK8BXj{ p2iuq/Gᵛ!F򠲾P4,]89 ^uq/%?O'Ҕ)ASa[b(uu5u ׄ +5?x_ʝ{[%G'%r>ccrCQ oXmd[F(?b֭''jp*S(KIg%?IіU kN[5i",Omdc-ȶ"1;,*)_J:Q4ͥDq%o˞3H_^j_YN'Zgc^Ui48?lSp P=W>e[ 2 p@8 sT~2i^ $ߛ"&FZ{-G%o"_.[K<4JWUsCeN=CROqZFxU*u2#܎3がsjoen{&>ƟS@[vpx(VFzXr-bⶂ|T/$򃞤uz ȡZ_)Q|K;Ud$Rb/v?#FWMi?4XbU\"~orI$-rp8'$13xr`DB7$i 9-gf Z3,MuHY\='$Wwq%"+1+~]ۇ]Ö6Ӎ^9UV֏V_Ywnk ="Hkjm$$`%L|Jf1oJd?!\$;@Ч7&+_<|M1jrSTA02^e=NssXߍۈo|溟QP2mDM#3n\H=i܄A9A%oF}җw*_:|pȐZ}3停v24~<iYuGs&˓Os7С5)LWGVXAoB<*ʺFѿSڮU]>ίk]O_xC^AɴL|Lq$zIF,j[ 7V?FO02~bxsBsׅK\؏>JgaQ3%H&xf6* pAg-S褬oE)5(fTDUWCBѓ7ן6f )'@0O8Ö5RѓPqUIF䫸fog%ɊHVAPZ#uc g,1m+//JKx+EJ=/Mu Cq}K-?q]!}|WN<"^CoMzG$I4]ZINI\|J.^Y9Ӭ5JOXgQ7O}6v`{⻊?^&s$*r+ 񭼗>Dw i$m$9\߬ȡׄ-+98 u5,)n4w*Ia%nfycy|1լ]! ߯#+bچl#IC(qWU}YHܕc05!{ՍPPL ۧ-{_hljSg.${vҪ >`\GwݿʥxVI5y'ݡ'K{Sܤq|%;zMhN}Iu8r,Ibwz?6!K(rR6;It;_XM< ~[,ɽq1lkFPJ#mpG{񯇇ʃQ6 &%($eWiF9)$:GzS\?%V}oʷV}nu=?l5xE?4ۗ\F$ۃCОz{kvovSg`HܿgGCg[ε_PMxTMu!?=y/?'7x^4W_^3גsBsׅK\>Jg?C?7_?j~*M_&K?7_?j>(FΪT{;|`Zړ<Me*z8F_O9CSׅ[%q"_.޺ۏ%:ox]u*J#L|}H|"?EW%k ȹh,"/d$~S+Emp6]id|tM$gi:ͼ> dǐW!@#,s-E"ORTdPAW'Xhz#"h?P@#Wu_ ke‹ B@N ç#6OUV|'T{o*º?^}S˿ ȡׄ-Z|S"^趫0LJ&+㦑X+p $< Otk^,5 _ {խ[PraCH d%W"I=ۺM67>K3`FQC#ܑbrQW37ZзǓͽw!}گxKYn,cT ,  \6FK-?ekWLbZsƭZp 'Tm'FOhiآ; P8w'٬ ȡׄ-kZ?baY>CE?Z-,f+v"5 NSN& i2@ܧ>  FȨZR̿&nW1wGk=GqAT !zdRFKtY#ˉX猂0_(dw>_5Ėn%?p:p8χz\)-&{\\yr];ܫe%Tϳ[o_ʸ.ߊoq*6V!/ [rXH.⫥w^ .d]'r8N!T9yX\B}ZkGukGM]GҢ_-c|G;[UE2D#lf_]쵓A& ?Je'gv~pҠVԴ+Sj-DJ,",0T̯x__J[ܤ&rUa™j< VDOFIaxV7zv h +N6pބbh;8,ҭSVK8_i6 kxSZL7 )GR ~g iMJ9cޣ shxV񨴏k6ZPEXQN *?/͋YOg=5Eyon_y^5EyϏM>lNEvA!N7H [ϐ){H+ٷr ۯjwnnu{Uk~Ҳ,<B7!or fꚇß ZyHD$e "su\ ދo$[k˥pJyU$89rX-JnV:pE)֞zcYw\$:Gzm<7k 12?Td}NO@eESgI\ [SHF_ܻjq~񳸇IaojZΫom G,+t A;G3FX~):4_h\ݤVUefy:u H%fo2aup^0J1vnRKK4D_^3בC:}%pG$dҽ. NBi^i4+(8(œHgA67]^Kl2\,bdn9$tq·wyF}.UNe-=鸯Ok̑,w <2}HR+ͼx(zv6@HlG2!y_|_h_s?s_3KMҊe6]iRBLw(iw볎mSe\Aq6ku$ x h ic={֕@-G#l˜v^ִo鷑Ok g1daQ# nBQ_!SӒmS{}y{ VSIu6TRH'y='gofFEѡ5Yd ]T. -'8moQmFwYd‚ FH^e#Zxo,Om?ԯCR Oq^ajvq.ʅT0 ?)c7C"u#ʰ/pAuxv_͛Qӈ $2ƭĈd .-#4L9~e`cKqŒ5V霨cd>VtM]>獍QV\}͠ȡׄ-Za?MJ5YdH$P=: 2&Kɼ9 ɿJe(hZnTC,LsɇAY%yRTX?u ȡׄ-j`GF*..̿n1bxt?!+r,`PH3rUMF m&6"pec'(hZ֬ ȡׄ-kZ|(1_ǟŠ(0 |]xQnw&T#c2﨨5fua1RI5nM_:]٪,ʺ(P~x_Ba"RRŕmRrIIšls40$ P7)CAe96x՚6܅JpHO5ι *J: (9O^ë%IsK\$^@;wuo#~^2⳩d;pUU)JWNL__ZG+(C"C1:u\Aag#ŠHu8FO9\d!=I`۪p^˗=>&_^W|YɽựPP\Dmg8lomjZilXk|X <:W[$Q̡e]C+# $ Ѱ[ZÌn~_xD43Oi)bp2n}m`侻,\3[đIwdP=: $<)GkMIpe#sz\/=`]Y>uy vVFf#gV[kY%̺/5"ȎvHAy/p( FMͩ1DyO287.rX˜OuOeRn?iw6EGܾ4sgVˢ q^k&k%{Y?$,=r9\7/{)$׳k(u qmW8#p2-K%PƁG>ߦׅOo̱_?ɠ'4zj_[;ǧWo9f.~?j?zoi%ҷqm\*A $DgN1U涰-:ŮK̑|UKͻma=&$LO$I$I$U>ͧFI>D(,l3r 9M]?VwܩnUK >`\GwhA۷qck:L\'ȳq#~^2޵&F7.ekV]V))3FE"tq`x S0Nڡ*V(1 02I$I$sYCE?Z8 %fX]9z#$UmHC㱀WW'hICE?ZֵL>o<_QEQQEW7R;c\Exˑ4m"`2T!7#)qʌ8'fF0Zjޚ*B(?2Wv?=zy?k((((? v@? v@((((((/їY67_i.*e*z5'?(k_?j֬?OSRbY.`{x5.TN8,@:0Ĭʻa2 G AMsteәHEUEPEPY67_i.+Z;˧ΡX2BD̡R1`}2$ݚ:prK/G_&5?Vx[6rRGj*!PI$zgxo Pc󡸑! *a9ő2w"amcQMG68GJv$}[`x8 Qs%풴L_ڠ*Y7?!Ys+O_- xm _F$6!PT,JTV7iHaI dV!!g|Z$hDiVUncpSiSRmv}yأ>552Ur>` ;G=+2\Š;jW|:X|]._\\`!U3+2u 0CgU?&XGJW:/Z\ovʖ}&Ѹ@w9U:QͻiAvs0{lYp"z km" %uʤrMFSO'kƬARˢXϪ&fe b;~PB>JT"7eoV5 լ76FH A MElyno٭F 18'(JrraX,ӭVc#ڲlBFXPNTu`W!]FpVH#H4ZFyX{'} b9IdE *#EQ ?<]1LjG$vzWaXz-)Swni43]4d Rꤱ$X8;Em#ΫVUfOvs~$45XLrb6'-璣hvN)(ٷܪTnUo]nQEQQEQEQEQEQEQEQEQEQEQEJg@'m,{5{C=ǚz@I>QEQEQEW {/^,/e)MNvd 2O9ǿ57<5sܡ@)iX@{ KˌWOE}eWKIyekvu _"x+ĩ$),2Jo$݅'NyQwWts+4 ( ( ( ( ɷR OqZՓo#~^2[롽Z(0 ( ( ( ( (2t M)CZ [T:սƯ$)/zW/8+)CZ [V_a5?$kQE`xNIY{jq qcA8QՀ;KȲE"GC`yTW"+hn ޽?" t r b'ټF0I6mmAEUQ@Q@Q@s]]u]a)#D m@wa{qEEK}i䄣oƶ:?-ᶷI`~6sEUqېeL1FfYjeU*G C~CҔb2z}QVsQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Odz %cנPEPEPEP^/+^^/+@1ܝ6UW2*bF0^!-4 -bt{H'$I8=3QW,"# 7Vϻ! %,@ok+./]%ͷw;eu/  N{>8}ޞRc+qȼk-^&q=D/ê- '=+aʕUfWAEV ( ( ( ɷR OqZՓo#~^2[롽Z(0 ( ( ( ( (34K6Yƒ5W|*D S7PxCV_[I@$ۀ='N&*Xo- tmA 9#@#um[vk@'FpAAyyE0ƱDAP8Sיw˰QE(((((((((((((((((((%cנWS+ƻ ( (8[o]f(7o5)![ t_)eQ#aXdoN?̚KNwMU!l cGj^5k $F $U9olGXŪMmLQԎ3 "/F{?Z,KrCIW\d6c.aB*gCjhUm>F3\JM7J-O&rS(Uq~N:~׳AK-nwC|g\TVW/oekc|ý>Ykϊ#> (eͼ%mPr̬;pHyo|)?A-]YHFF dGC-m+l~#W1uh-u+p.'1ٵ@|ϙq@yyI36v&su g$}:wq22*K庿UQExfEPEPEPY67_i.+ZmoԿF\Tut7TۢkQEFEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPK _f-omI37ޕJg@(((_W"3Iڽ_W"3Iڀ;-kNu3~m%vW835#x5.BUVj?ydS:.m3])1DL :>KOK;ɬ>W\l0pr<ѷC)k4w7.sw5Ң9!@4-+NI&hZ%R\+QP0(((/їY67_i.*e*z5((((((((((((((((((((((((((()̕c]^^Odz (((K:fp^O"A#I$' 9Q?)ň[uIckS{:}9М\\? vMlu{vc\d#*U!<_|EgwO<1)y$($wsiWie}mr Ud'Ð{ElZwƃoi-ͻoRFqzH/.n{Uml*,ҳ|9%v=@uԟue}ztQErQEQEQEQEo#~^2⵫&FK-?eL_Cz?OO&QT`QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEy?k+)̕c]^@Q@Q@n_QIVL!ˁn6ޮX sL}[ؠST@uIl܀/c2zEqyKZ{HgH@Y73FVo?H{(||tڽ_W"3Iڀ=((((((moԿF\VdߩׅoGD֢*((((((((((((((((((((((((((('k1·v/l /hKw7FWWS+ƻ ( ( ( ^p'j ^p'j ( ( ( ( ( ( ɷR OqZՓo#~^2[롽Z(0 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (<_5Jg@((ukN,mqÈr~)reCSv64q<)|~`. R`1?f@_W"3Iں+Wk;9,Du!o-.F~GR3#`v%%{/?((((((+&FK-?ekVMxZˊn~ tMj((((((((((((((((((((((((((((%cנWS+ƻ ( (9YZ>gpn^,a-,.ġgT<e4-F!˥dV$ھ|H;ydQ@NywjS@ElEGa;FpK}?o}^^/+@EPEPEPEPEPEPY67_i.+ZmoԿF\Tut7TۢkQEFEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPKi =߉l!s qzZ%cנPEPEPEP^/+^^/+@EPEPEPEPEPEPY67_i.+ZmoԿF\Tut7TۢkQEFEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPS+ƻ_5QEQEQEeRF𮯪[m=,X2=EjWKJ_;WA=şu-K%!+̮2s`1`0Uxo?ŷiͥqEq6ݺW ?'ROQ^ O/H^9?g@Ey-?sΏZ!xzB :/{/ͦ_}ٮgY>RWs`z +iԅt ?'(?RO O/@/ї ?'> [OLYۢi6%hTMٯS(T +iԅuWƗ/}U%'nvG0یp3Y{B :?iԅtW ?'ROQ^ O/H^9?g@Ey-?sι X%ϵjYĵmnfqx`H^9?gG-?s΀=Z!xB : +iԅt ?'(?RO?',t^9<ח~df_1•PQ^ O/H^9?g@Ey-?sΏZ!xzB :?iԅtWo/= ͽo7QO.FB r(о$X{L|㛋-"od3n- Q^ O/H^9?g@Ey-?sΏZ!xzB :?iԅtWo/= ͽo7QO.FB r(о$X{L|㛋-"od3n- Q^ O/H^9?g@Ey-?sΏZ!xzB :?iԅtWƷ ;@l59&5ىF,2 ?'(?RO O/@H^9?gG-?s΀=Z!xB : +mc[xK6_slĊ#PÏZ?iԅtW ?'ROQ^ O/H^9?g@Ey-?sΏZ!xJg@#썦m}4~3s}r ( ( ()Un}v3*~BUT`(s_.4h-oLmRv)yY0Vds#(((jA-ZErK(v0[rtW'yC^OF,5;]-g3.T& a9.<tDEuj[$Ѕ8 ʠ]#TP# +Z<1q<ŵ!fX4cR hBc4-Oof?nݻf 8q Т(S.k\j>K,JuHgy xT_5PQ\;*}vHͮ/| \03`L`,Oj~9.p0r3JN9F2vWuIlu[#m[T湄&%"r4a'PEPEgs\~̂9m-ifʨpYAFPŠiVSGmqh#(m$6#:cb}kWķwvc!eK`Wp$M1cKc/h]"V5%FI1)Ö!NX# = ( (_S F,wdK[O"B8?0ە 4}CuWuHt$m~+Tdؙ&)UoʇQ5^[^Gݣ[Qe-CF0o rȍ.0ҊjPkkqah'.n݋7(#%PEPE]KFkq]Di56%o+ÉPPQ\\֯ko#+C ʗ.c9\!$Hc%7-tDmZKut[0$ĤZX9`$ +,瑣6w֖pa0yV,m*F0c'Y@Q@WfMcUPg}@ 2k#n҅Xg1V 瓏3=ֵ{]n? Kywo ]F8BVTv %~ 'D)uIlu[#m[T湄&%"r4a Q\}6g< ĻcnR1L`:((9o'R :ޥoly|Pm[bPqqg*MwWkrxb+㻴yj2Ḇ%h-AЅ_Neqfb~r-ؿACr0B>r]L`s_.4h-oLmRv)yY0Vds#((;K$ob3%^@BG=2ֵ{nO Eywv1mFHC$u ԁ#"73lc8,O\ݥ0(nPGK?kڅƒmŭ鍪C߲0+? ̟1ܮz:}eQEU=ZKtktcPKy) v)p[M}&|?mS DԴ@].bXmIB9'x]WuIlu[#m[T湄&%"r4a$ﴫ)#{6K6pKg1d(=5P[{x.EdLҩM<+D9PrTPEPEPYznc\4!Gmk qQu(((A~!:qJbBw:ȄdgV<7fo!Iv< 4)q1Dz8%"MC$2ypFZG0HP*#&|+bu݇g9v\L\&\pʪ00*lcCkoQH8Ppb ( Լ;%ޥa:ۋp]ʼnlNTۻi&sV|1K %G+g |dc¶+n]ux}%v !>I nQ@rxKHt5HT$8qb .ʼncY$I }((9u mfuk sU)+ FQcodv8 f(|%D2H_R(( Y&key&i*U*F H9J( Vŭ|뵻%r츘MθT``(TٰY4haa$_$"vpY~Lqآ2JiC1@ۖ"A1D? W*QEQE+M绻pcdU|D;381 I( 3[E;<˲b 7:UQSfedɆ-|;1d&A1Sbt *ᦷY;n[X,3e_EQEͼ9$Qr20cR pA <'oB_)f߳fT2N쭹N( 9<%:C$q*ysƒ]ǸIɐbı,$<[M4y˼_yx WI Q@foy<<2$(؛;T,ĖffТ((((((((((((((((((((((((((((((((((((((((nfc@F0lvzPNG  IHDRQgAMAܲ pHYs. . yIDATx[P|G 2JyH1ȯ/BzJ HHj&5y<@df2P3Lj&5y<@df2P3Lj&5y<@df2P3Lj&5y<@df2P3Lj&5y<@df2P3Lj&5y<@df2Pn044MsO4MuM%nf'r}*1mo[4} ;~d3ڶH Wvn W'mu5iEo9v[Yִdvj̲m͂}I'zue-tMG۶ Dm>5ceK-qy1nm~//hʅ.~+~/XoxΦ6᜷c\;v>ߛe|6{s6]ooU67KP۳@]\O\mɃa^{T~|>kuú]ٌ [2W|>m{mS/4;:%wt7g&pA71 kW{)Ϲ=Zzͷc_V[`~"`51mŕigÖ,`Y L*-qALZ/߀sW?O#p"Ǽ,1 w>Yd3,4/ݚY$U:& pYn%{>  A+ݬ*iq_g)*tA Mpyw42RU*ÏYf<l>)gION/=3X2fSZ!ΈxOZ֋Ëͺ5KLgy-Z^eR-M{g7iy'uJ PY_?ߚiIM<\b֪mx4׿nf}r6c9-f0$uWLywpf8bs"jV1kLB:o&=`;񈙧 "9ʟ퟽@*Ǔ];sd6Kx|gx}K6ٌ akg]a>WٱrYc 4e6||<_/4Y}!lsH۶tn9߇cVyGV+S>>ڇ|-ϑN]ބ`Y#_>Ϳ-=k: E U7o-ܶۼ ~eK͈lÕLjYˬ_g']?xVNnNx{~׶l=*7?ۏkl/ \Ag͚\WCG֦[&y疤lSZW&+ն7' a]jr<*ϋo; z&b+n o2dsBuj/sJ5;gB]6oUd~})dΧ'RBQI&@$@VTZ*'f[gۂ>b+muʙn+n6Y"e`T6{HP(Tx͑mHϤʎR>1 u9E6W!5qn)dBHv5l6ʊdF^0Ey8Cݙȭb)iTlNtbq-CEuddXڛpaNr\f]N(2M{y8w^z WN:ZA0ViDJ+&֧ -!-/Ζmr)dΪ^YSo'*; \xPy & JlY d---^ n[i[QgkC&+]$WSYH=o!"ս˻Ɯ4.Cru!qHO nҭna;IT佁XZW6/W@&*;P*+5pnYVΌkV݇m'[o۵&{9KB/|; m-rt}V4Hܳz_97෯{v6j9b_|wnۇ/!meX.wyIueVqcVY6d1Е!Hl~jE=Uj$] YGˎśQkv~{jC<[',*x8ͼmk2IzmT+2h<+(SZfm??[~m?QP_PU9$z5۲/ynq?#oi^_KFu5ڼKYK^@gcU n]M2^19yҥMFUSOz0AiڶoƉWͤ,xMFr=|c ix^K'?|·{!=dPoy8mdۄ=5mWHGApA"e߻Rh1YɃy^ ^ȹ#4ǒae'NF?Ui~}<?N;ð`w^.t(S0(lk"ņa8\#2/Q$?dE1EÙP뢱gX$T xPG{QO@` yc0ҨГ{'Ù15ƳmK/Ꙝ|nh0ODt]42@ۧ:2i*2 jzy8*Ar:^*3 òRBrVɊM1_v'5jM\m;9Sjפ_~GƷ[C318>s& е4lOytmm@{>!0^!ڭQZ{ YS#l6Oī4q!|~huYOib3*%f2Le۞E}/z^?t8ue5˚T 糹\&3o$}x9o/yO=#a.($lTQ'pbZ\ot=HR\J~gNuv;ey^hw͸^n[WV@~ԯClO*+ܳ\q,I%d%iyspVf3نI^3O_?o!1+@p{ #??-)j3ۏ,访FJdy~`d5tݨ ռjޅa~^e/GVݥnpucg]veQJ\ږ=2* wz@S9btMVbҝ~\=V"Lw]%hۡyo8 ;%.k]ҧC,<^>j5d%Kc }xbN !t'> V)7Gcˑajڮ QلU{R5r @T$[Ot]CG=IWѸÞTuaw iI4cm$:WOcn~U 0/Y\9 IA6>& #3NL7g/@wXdw.;vbEn=g!+MPgH#jtzLCIw>ë/Ĩ\2N$X9q:;iP7!`*4#IqB O|EL+挡kc%aC'59 w_a~䆄Ρ(/ ?A p wM'vRQ7>#6\ǩ `kŇh *Y] t%QpYl\p@.nƻ( El+BSe[͇3#FΧoL (*t yõ&"4 EwhX%AXgߨt=DKF apJfiZɲW4#^膄:EgA䷛@Mi n$ZDV tP^;aaI\c tנLK 3+% A'M&kP杘0:к3n̺,6,IDAT CE 20CQc&!NPAF**LFYA'ĕn:.%Yw#$/n1`!Kn0*jzZהtM2nB2>NsD:u?S$6HD N]۰"" +bI|vӼZHL]:Ճ9d7R/bMK#tΨ:y(^D9tGKoR"%t^k w~=BBstחZ;kߧ|blQS dmսK 3Dw}%b©6$,1iYN_aC)__gL ߑFI{+] :pNg&: ) ~KyNWnhH+AU{E"їd!][1~9T!aM!)%^*A1+15,s5xWm"WP]&;)R%*=-1/geAS&'BEYoQc :a%$`I<Ζ`!lwfE{( KtW8,ĉh_C 7{U|Y P!/MaRd_-=O~Uh(>#!-?Dv[b U"Z-C20PtH;I19"Ibscev 4uСTت\ :d [DcDFs+?d7֔~PС &RmC>yG{_jБwRtԽ 2/+MJCA$Dh  U_< 7r҅o,4Xx}#St(K'ۘc ytTTc!tX ! o tOږ\y<~'nhtJCڍVqߵ~07 VѾ2'ѲǬ t2/ghV!IDATSXDՎLf#ꌡ#C&2Ԧ_I^=[޸y#…dQw(|GĂNj:iKMC. ZoQ͂j:J`,&T1&G?P.NQ~71ūʷ)ˡK'7@TPb![5 Z:R>7RPб7?#N{t-t@4̤1 _1 ˰᪀u`{KX15бd\G@ES]4}|.^c%G'r.Fa8c%>gq𯂎Mbq1|ًF+ ǞIVZ ߥ -CsY÷Z/ {=-l"wNut-!hMBXM029}-dYW8vUoNXT_ָW2 ",%tA#0e#T8k-})t ԉAtl$D*{c6=1ckGa3n /u-HSC35Sq;e$f Y:7-t- l:>% 6nB'ELs@uaj5#4cKc:qFFBK=]N:Y$,=z~ '&AjEб&b<\b^S?`[^BLC#%')37=DB$hUώkP 7$b$b@a㈦i 7$R$Zratk& fN01b$VܴiI5<<$$$$b$R(ύ( O$ 0AA@ʚ;8ʚ;g4adadH0ppp@ <4!d!d%gʚ;<4dddd%gʚ; <4BdBd%ʚ;g4%d%dH0Lwp@ pp̑8___PPT10@ AAP BBX  C(C`   D?8E8G(H I JJ@L@M0NHO8P0Qp     RST@U@V(F0K  ___PPT9  @@A A B0B  CPC   D0?pEpGPH@I@J JLM`NOpPdQ      R0S0TUVPF`K@h___PPT2001D<4X0{___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 Ht@0   hnamd` Arial&Monotype Typography    hnamd` Arial&Monotype Typography A   hnamd` Arial&Monotype Typography( A   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 B   hnamd` Arial&Monotype Typography( B   hnamd` Arial&Monotype Typography    hnamd` Arial&Monotype Typography    hnamd` Arial&Monotype Typography    hnamd` Arial&Monotype Typography    hnamd` Arial&Monotype Typography    hnamd` Arial&Monotype Typography C4   hnamd` Arial&Monotype Typography(    hnamd` Arial&Monotype Typography( C   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 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 E|   hnamd` Arial&Monotype Typography    hnamd` Arial&Monotype Typography    hnamd` Arial&Monotype Typography    hnamd` Arial&Monotype Typography    hnamd` Arial&Monotype Typography    hnamd` Arial&Monotype Typography G4   hnamd` Arial&Monotype Typography    hnamd` Arial&Monotype Typography H0   hnamd` Arial&Monotype Typography    hnamd` Arial&Monotype Typography I0   hnamd` Arial&Monotype Typography    hnamd` Arial&Monotype Typography J   hnamd` Arial&Monotype Typography JP   hnamd` Arial&Monotype Typography    hnamd` Arial&Monotype Typography    hnamd` Arial&Monotype Typography L`   hnamd` Arial&Monotype Typography    hnamd` Arial&Monotype Typography    hnamd` Arial&Monotype Typography    hnamd` Arial&Monotype Typography MX   hnamd` Arial&Monotype Typography    hnamd` Arial&Monotype Typography    hnamd` Arial&Monotype Typography    hnamd` Arial&Monotype Typography NT   hnamd` Arial&Monotype Typography    hnamd` Arial&Monotype Typography    hnamd` Arial&Monotype Typography O, (namd Courier  (namd Courier  (namd Courier  (namd Courier  (namd Courier Ph (namd Courier  (namd Courier    hnamd` Arial&Monotype Typography  (namd Courier  (namd Courier Qh    hnamd` Arial&Monotype Typography  (namd Courier  (namd Courier  (namd Courier  (namd Courier  (namd Courier  (namd Courier  (namd Courier  (namd Courier  (namd Courier  (namd Courier R (namd Courier  (namd Courier S (namd Courier  (namd Courier TP   hnamd` Arial&Monotype Typography    hnamd` Arial&Monotype Typography    hnamd` Arial&Monotype Typography U   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 V$ (namd Courier  (namd Courier  (namd Courier  (namd Courier  (namd Courier Fh   hnamd` Arial&Monotype Typography    hnamd` Arial&Monotype Typography    hnamd` Arial&Monotype Typography    hnamd` Arial&Monotype Typography    hnamd` Arial&Monotype Typography K0   hnamd` Arial&Monotype Typography    hnamd` Arial&Monotype Typography ( ʚ;-ʚ;dd? %<   ;  @What kind of talk is this?Evangelism FUD Fun0  AErlang + EDTK + BDB: Huh?"D0General purpose programming language Runtime system Developed by Ericsson Open source Key feature: designed for ease of developing highly-reliable, highly-concurrent systems Enables highly robust applications: The AXD 301 includes 2 million lines of Erlang Reliability: NINE 9 s ZGZ%  XF$0  $$BErlang + EDTK + BDB: Huh?, D Erlang Driver Toolkit Declarative APIs to external library Automatic wrapper generation Tracks library resources and cleans up Enhanced for BDB support: Supports Erlang s  crash early error-handling model (supervisors) Meshes Erlang-style concurrency with BDB concurrency (private thread pools) Adds significant convenience layers for configration and replication Minimal overhead ;ZZAZZ%A  BLE  $$((l=9# 8 ` "CErlang + EDTK + BDB: Huh?B @ D |Berkeley Database Database functionality & Transactions Recovery Replication & in a different package Library linked directly into an application Programmatic APIs Schemaless: key/data pairs+Z"ZZYZ  , $$((,, DDisruptive Technology< a technological innovation, product, or service that eventually overturns the existing dominant technology or status quo product in the market. -- Wikipedia,z$ ?OutlineInterpreting the Title Disecting an Internet Service Erlang, it s philosophy and runtime Putting it all together Q&AjuD@$  , :WAn Internet Service XAn Internet Service YAn Internet Service ZThe Software Architecture$In any case, your software is a messEOutlineInterpreting the Title Disecting an Internet Service Erlang, it s philosophy and runtime Putting it all together Q&AluDD$@  , :GThe Erlang Approach Don t fight the problem Don t fight the medium (the network) Don t fight the medium (distributed software):k%- H.Don t Fight the Problem1:1 concurrency with the problem/solution domain Explicit lightweight stateful conversations (addressable processes) Arbitrarily rich messages 01D ,0 AI6Don t Fight the the NetworkAsynchronous send (location-agnostic send and pray) Ordered inbox per process Blocking receive with timeout (message-selection via pattern-matching)04F J@Don      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwyz{|}~ t Fight Distributed Software! No shared memory: no mutexes, no mutation True loose-coupling: processes are free to migrate Safe to kill any process any time Recovery-oriented computing (before it was fashionable) Let it crash Propagate exceptions Know how to recoverv*U86*3"8 ,bnLErlang Tricks: ProcessesBelong to the language (runtime), not OS Very lightweight Immutable data Asynchronous message passing Upgrade application on live, running system Implication: No big deal if a process dies l) , HuMErlang Tricks: LinksLinks connect processes On process crash, all linked processes get message. Notified processes can clean up, takeover, do whatever is necessary. Easy to create supervisors No recovery: just crash, cleanup and restartD4E , NErlang Tricks: ConcurrencyUse concurrency to structure the application  My first message is that concurrency is best regarded as a program structuring principle Tony Hoare, 2001 Concurrency-oriented programming Share nothing Pure message passing Let it crash -[" !0-[!   WOErlang Nuts and Bolts>Hello World -module(hello). -export(hello_world/0). hello_world() -> io:format( Hello world.~n , []). Erlang (BEAM) emulator version 5.5.5 [source] [async-threads:0] [kernel-poll:false] Eshell V5.5.5 (abort with ^G) 1> c(hello). {ok,hello} 2> hello:hello_world(). Hello world. ok 3>  Z\ZZZ 9CC! C CC ( ( 9 PSpawning ProcessesPid = spawn(module, function, args). For example: Erlang (BEAM) emulator version 5.5.5 [source] [async-threads:0] [kernel-poll:false] Eshell V5.5.5 (abort with ^G) 1> spawn(hello, hello_world, []). <0.32.0>Hello world. 2> 2Z" ZZ$CA @ C Cl( ( "QMessage send and receiveSend: Pid ! message. Receive: receive Pattern1 [when Guard1] -> Expression1; Pattern2 [when Guard2] -> Expression2; & end j"  C C CCCC C $$(C(,C,0C044t& )RSend/Receive Example7-module(food). -export([dinner/0]). dinner() -> receive sunday -> io:format("Sunday is fish.~n", []), dinner(); monday -> io:format("Monday is chicken.~n", []), dinner(); tuesday -> io:format("Tuesday is beef.~n", []), dinner(); Other -> io:format("Time to go home.~n", []) end. 88Z6CC0   SSend/Receive ExecutionEshell V5.5.5 (abort with ^G) 1> Pid = spawn(food, dinner, []). <0.32.0> 2> Pid ! tuesday. tuesdayTuesday is beef. 3> Pid ! sunday. sundaySunday is fish. 4> Pid ! wednesday. wednesdayTime to go home. 5> Pid ! monday. monday 6> @ZZC'    T BDB in ErlangErlang: Is Functional (not procedural) Communicates via messages Communicates asynchronously BDB: Is Procedural Communicates via shared memory Blocks on locks/IO/etcvUD9 UEDTK fixes mismatch7Erlang interfaces to outside world via ports. EDTK automatically generates code that wraps library API, making library look like Erlang process(es). Provides framework to: Clean up BDB resources after a crash Manage threadpools to deal with BDB blocking Manage administrative processes Manage replication groupsfZZ.g% - HzF TVAnd the code looks like BDBDB = ?BDB:db_create(Port, []). ?BDB:db_open(Port, DB, void,  database ,   , bdb_DB_BTREE, [bdb_DB_CREATE, 8#644). ?BDB:db_put(Port, DB, void  foo ,  foodata , []). {Key, Data} = ?BDB:db_get(Port, DB, void,  foo , <<>>, []). ?BDB:db_close(Port, DB, []).ZC!CC C C !   FOutlineInterpreting the Title Disecting an Internet Service Erlang, it s philosophy and runtime Putting it all together Q&A^uDD$ @ , :[An Internet Service \How does it Perform? KAcknowledgements\Joe Armstrong (Erlang) Scott Lystig Fritchie (EDTK) Chris Newcombe (EDTK extensions for BDB)0]( >  :  //1;FJ-Z 1` 33` Sf3f` 33g` f` www3PP` ZXdbmo` \ғq>9y`Ӣ` 3f3ff` 3f3FKf` hk]wwwfܹ` ff>>\`Y{ff` R>&- {p_/̴` ___f>?" dd@(x?" dd@& @` n?" dd@   @@``PR    @ ` ` p>>1  p(  :  T$gֳgֳ ?PX v RClick to edit Master text styles Second level Third level Fourth level Fifth level!     S  Z0$ ?` v T Click to edit Master title style! !   N?"0l   6A?"0H  0޽h ? www%5MMM $Blank Presentation zrp (    0D" P   v P*    0I"    v R*  d  c $ ?  v  0PN"  @ v RClick to edit Master text styles Second level Third level Fourth level Fifth level!     S  6U" `P  v P*    6PZ" `  v R*  H  0޽h ? ̙3380___PPT10.rb 8(    0ƻ P   v >*   00    v @*   6 `P  v >*   6`/ `  v @* H  0޽h ? ̙3380___PPT10.rd /22 5 0z(  B  C A R- H  0޽h ? f___PPT10e+D=' H= @B +Z22 @z(   B  C A  H  0޽h ? wwwfMMM___PPT10e+D=' H= @B +g 122 5 VN(    Tgֳgֳ?@@.H___PPT10( f___PPT9H@N___PPTMac11(    hnamd` Arial&Monotype Typography0  BErlang + EDTK + BDB: Disrupting the Web Margo Seltzer Architect p)(c0c0c0 c (6 B  s *޽h ? f___PPT10e+D=' H= @B + 22 L(  Ll L C Я"`  v l L C @"PX v H L 0޽h ? www%5MMM___PPT10u.Ttƒ+D=' = @B + 22 T(  Tl T C "`  v l T C "PX v H T 0޽h ? www%5MMM___PPT10u.Ttih+D=' (= @B + 22 \( R( \l \ C @#`  v l \ C $PX v H \ 0޽h ? www%5MMM___PPT10u.Tt`+D=' = @B + 22  d$( @C@C dr d S P`  v r d S PX v H d 0޽h ? www%5MMM___PPT10u.Tt`+D=' = @B + 22 @l(  ll l C 0`  v l l C PX v H l 0޽h ? www%5MMM___PPT10u.Tt{+D=' = @B + J22 `(  l  C p`  v l  C PX v H  0޽h ? wwwfMMM___PPT10u.rK+D=' = @B +G 22 FFV_oF( m aek l  C `  v X2  0`PpX2  00 PX2  0`@ ` X2  0PpX2  0p^B   6D`p^B   6D@p^B   6DP ^B  @ 6D ^B @ 6D@ u  <p"v50___PPT106___PPT9B___PPTMac11   hnamd` Arial&Monotype Typography  9ClientsAR8 P  P     PBCDEF18c8c?tt3fBZ[ND<8 3U238>0+Vo Er%3B=?GDwP_o|{}6K^s{nxd'4AuP^[<eoroijPu6|\$rElJaJ"hJ|1q+ehie]_QBC14+ -< "Gp}ws1q3f@P   <,@ `0___PPT106___PPT9B___PPTMac11   hnamd` Arial&Monotype Typography  > The Internet A!  6P3PP@pd\8___PPT10F___PPT9( ___PPTMac11   hnamd` Arial&Monotype Typography || X(namd Courier O Load Balancer&A A^B  6D PF 0   \ p  " 8 62"0  0___PPT106___PPT9B___PPTMac11   hnamd` Arial&Monotype Typography  ? App Servers  AT   # P 1 "  # lG? 0<P" 0___PPT106___PPT9R___PPTMac11,$  pnamdhHiragino Kaku Gothic Pro W3Dainippon Screen Mfg. Co., Ltd.   Bc z"  <G0*g ?"  z2  <g ?" @ N z"  <G0*g ?" * \ z"  <G0*g ?" } nB  0Dg ?"   nB  0Dg ?"2 2  nB  0Dg ?"O O  T   "# ` A " # # lPX? 0<P" 0___PPT106___PPT9R___PPTMac11,$  pnamdhHiragino Kaku Gothic Pro W3Dainippon Screen Mfg. Co., Ltd.   Bc z" $ <G0*g ?"  z2 % <g ?" @ N z" & <G0*g ?" * \ z" ' <G0*g ?" } nB ( 0Dg ?"   nB ) 0Dg ?"2 2  nB * 0Dg ?"O O  T   +#  " , # li? 0<P" 0___PPT106___PPT9R___PPTMac11,$  pnamdhHiragino Kaku Gothic Pro W3Dainippon Screen Mfg. Co., Ltd.   Bc z" - <G0*g ?"  z2 . <g ?" @ N z" / <G0*g ?" * \ z" 0 <G0*g ?" } nB 1 0Dg ?"   nB 2 0Dg ?"2 2  nB 3 0Dg ?"O O  T  @ p  7#  0  h2 4 s *" @ p h2 5 s *"@ @ p p h2 6 s *" @ p F    ;   |" < 0|  0___PPT106___PPT9B___PPTMac11   hnamd` Arial&Monotype Typography  DDatabase ServersA2T   =#   s " > # lЂ? 0<P 0___PPT106___PPT9R___PPTMac11,$  pnamdhHiragino Kaku Gothic Pro W3Dainippon Screen Mfg. Co., Ltd.   Bc l" ? <G0*g ?  l2 @ <g ? @ N l" A <G0*g ? * \ l" B <G0*g ? } `B C 0Dg ?   `B D 0Dg ?2 2  `B E 0Dg ?O O  2T   F# 0  s " G # lp? 0<P 0___PPT106___PPT9R___PPTMac11,$  pnamdhHiragino Kaku Gothic Pro W3Dainippon Screen Mfg. Co., Ltd.   Bc l" H <G0*g ?  l2 I <g ? @ N l" J <G0*g ? * \ l" K <G0*g ? } `B L 0Dg ?   `B M 0Dg ?2 2  `B N 0Dg ?O O  2T   O#  q s " P # l? 0<P 0___PPT106___PPT9R___PPTMac11,$  pnamdhHiragino Kaku Gothic Pro W3Dainippon Screen Mfg. Co., Ltd.   Bc l" Q <G0*g ?  l2 R <g ? @ N l" S <G0*g ? * \ l" T <G0*g ? } `B U 0Dg ?   `B V 0Dg ?2 2  `B W 0Dg ?O O  |N  @ p  X  @ p Z2 Y s * @ p Z2 Z s *@ @ p p Z2 [ s * @ p h2 ] 0p 0___PPT106___PPT9B___PPTMac11   hnamd` Arial&Monotype Typography  8.NETAh2 _ 0p P 0___PPT106___PPT9B___PPTMac11   hnamd` Arial&Monotype Typography  8JavaAH  0޽h ? www%5MMM___PPT10u. Vt+D=' P= @B +Q 22 PPZZLP(  r  S `  v X2  0`PpX2  00 PX2  0`@ ` X2  0PpX2  0p^B  6D`p^B   6D@p^B   6DP ^B  @ 6D ^B  @ 6D@ u   <` v50___PPT106___PPT9B___PPTMac11   hnamd` Arial&Monotype Typography  9ClientsA`F P   P    PBCDEF18c8c?tt3fBZ[ND<8 3U238>0+Vo Er%3B=?GDwP_o|{}6K^s{nxd'4AuP^[<eoroijPu6|\$rElJaJ"hJ|1q+ehie]_QBC14+ -< "Gp}ws1q3f@P   <@ `0___PPT106___PPT9B___PPTMac11   hnamd` Arial&Monotype Typography  > The Internet A!  6@PP@pd\8___PPT10F___PPT9( ___PPTMac11   hnamd` Arial&Monotype Typography || X(namd Courier O Load Balancer&A A^B  6D PF 0    p  "  0`'"0  0___PPT106___PPT9B___PPTMac11   hnamd` Arial&Monotype Typography  >A T   # P 1 "  # l/? 0<P" 0___PPT106___PPT9R___PPTMac11,$  pnamdhHiragino Kaku Gothic Pro W3Dainippon Screen Mfg. Co., Ltd.   Bc z"  <G0*g ?"  z2  <g ?" @ N z"  <G0*g ?" * \ z"  <G0*g ?" } nB  0Dg ?"   nB  0Dg ?"2 2  nB  0Dg ?"O O  T   # ` A "  # lP@? 0<P" 0___PPT106___PPT9R___PPTMac11,$  pnamdhHiragino Kaku Gothic Pro W3Dainippon Screen Mfg. Co., Ltd.   Bc z"   <G0*g ?"  z2 ! <g ?" @ N z" " <G0*g ?" * \ z" # <G0*g ?" } nB $ 0Dg ?"   nB % 0Dg ?"2 2  nB & 0Dg ?"O O  T   '#  " ( # lQ? 0<P" 0___PPT106___PPT9R___PPTMac11,$  pnamdhHiragino Kaku Gothic Pro W3Dainippon Screen Mfg. Co., Ltd.   Bc z" ) <G0*g ?"  z2 * <g ?" @ N z" + <G0*g ?" * \ z" , <G0*g ?" } nB - 0Dg ?"   nB . 0Dg ?"2 2  nB / 0Dg ?"O O  T  @ p  0#  0  h2 1 s *" @ p h2 2 s *"@ @ p p h2 3 s *" @ p F    4   |" 5 0d  0___PPT106___PPT9B___PPTMac11   hnamd` Arial&Monotype Typography  DDatabase ServersA2T   6#   s " 7 # lm? 0<P 0___PPT106___PPT9R___PPTMac11,$  pnamdhHiragino Kaku Gothic Pro W3Dainippon Screen Mfg. Co., Ltd.   Bc l" 8 <G0*g ?  l2 9 <g ? @ N l" : <G0*g ? * \ l" ; <G0*g ? } `B < 0Dg ?   `B = 0Dg ?2 2  `B > 0Dg ?O O  2T   ?# 0  s " @ # l|? 0<P 0___PPT106___PPT9R___PPTMac11,$  pnamdhHiragino Kaku Gothic Pro W3Dainippon Screen Mfg. Co., Ltd.   Bc l" A <G0*g ?  l2 B <g ? @ N l" C <G0*g ? * \ l" D <G0*g ? } `B E 0Dg ?   `B F 0Dg ?2 2  `B G 0Dg ?O O  2T   H#  q s " I # l? 0<P 0___PPT106___PPT9R___PPTMac11,$  pnamdhHiragino Kaku Gothic Pro W3Dainippon Screen Mfg. Co., Ltd.   Bc l" J <G0*g ?  l2 K <g ? @ N l" L <G0*g ? * \ l" M <G0*g ? } `B N 0Dg ?   `B O 0Dg ?2 2  `B P 0Dg ?O O  |N  @ p  Q  @ p Z2 R s * @ p Z2 S s *@ @ p p Z2 T s * @ p h2 U 0p 0___PPT106___PPT9B___PPTMac11   hnamd` Arial&Monotype Typography  8.NETAh2 V 0pP  0___PPT106___PPT9B___PPTMac11   hnamd` Arial&Monotype Typography  8JavaAg2 W 0 P @ 0___PPT106___PPT9B___PPTMac11   hnamd` Arial&Monotype Typography  7CGIAg2 X 0  0___PPT106___PPT9B___PPTMac11   hnamd` Arial&Monotype Typography  7PHPAh2 Y 0p 0___PPT106___PPT9B___PPTMac11   hnamd` Arial&Monotype Typography  8LISPAz2 Z 0`P  0___PPT106___PPT9B___PPTMac11   hnamd` Arial&Monotype Typography  JPerlA H  0޽h ? www%5MMM___PPT10u. Vt+D=' = @B +5 22 44;]s4(  r  S `  v X2  0`PpX2  00 PX2  0`@ ` X2  0PpX2  0p^B  6D`p^B   6D@p^B   6DP ^B  @ 6D ^B  @ 6D@ u   <0v50___PPT106___PPT9B___PPTMac11   hnamd` Arial&Monotype Typography  9ClientsA`F P   P    PBCDEF18c8c?tt3fBZ[ND<8 3U238>0+Vo Er%3B=?GDwP_o|{}6K^s{nxd'4AuP^[<eoroijPu6|\$rElJaJ"hJ|1q+ehie]_QBC14+ -< "Gp}ws1q3f@P   < @ `0___PPT106___PPT9B___PPTMac11   hnamd` Arial&Monotype Typography  > The Internet A!  6PP@pd\8___PPT10F___PPT9( ___PPTMac11   hnamd` Arial&Monotype Typography || X(namd Courier O Load Balancer&A A^B  6D PF    4   P s" 5 0  0___PPT106___PPT9B___PPTMac11   hnamd` Arial&Monotype Typography  ;ServersA2T   6#   s " 7 # l$? 0<P 0___PPT106___PPT9R___PPTMac11,$  pnamdhHiragino Kaku Gothic Pro W3Dainippon Screen Mfg. Co., Ltd.   Bc l" 8 <G0*g ?  l2 9 <g ? @ N l" : <G0*g ? * \ l" ; <G0*g ? } `B < 0Dg ?   `B = 0Dg ?2 2  `B > 0Dg ?O O  2T   ?# 0  s " @ # l5? 0<P 0___PPT106___PPT9R___PPTMac11,$  pnamdhHiragino Kaku Gothic Pro W3Dainippon Screen Mfg. Co., Ltd.   Bc l" A <G0*g ?  l2 B <g ? @ N l" C <G0*g ? * \ l" D <G0*g ? } `B E 0Dg ?   `B F 0Dg ?2 2  `B G 0Dg ?O O  2T   H#  q s " I # lpE? 0<P 0___PPT106___PPT9R___PPTMac11,$  pnamdhHiragino Kaku Gothic Pro W3Dainippon Screen Mfg. Co., Ltd.   Bc l" J <G0*g ?  l2 K <g ? @ N l" L <G0*g ? * \ l" M <G0*g ? } `B N 0Dg ?   `B O 0Dg ?2 2  `B P 0Dg ?O O  |N  @ p  Q  @ p Z2 R s * @ p Z2 S s *@ @ p p Z2 T s * @ p g2 U 0W  0___PPT106___PPT9B___PPTMac11   hnamd` Arial&Monotype Typography  7BDBAg2 W 0] 0___PPT106___PPT9B___PPTMac11   hnamd` Arial&Monotype Typography  7CGIA^B X 6Dp ^B Y@ 6Dp@ ^B Z@ 6Dp ` ^B [ 6Dp@ z2 \ 0h  0___PPT106___PPT9B___PPTMac11   hnamd` Arial&Monotype Typography  JPerlA t2 ] 0@m0  0___PPT106___PPT9B___PPTMac11   hnamd` Arial&Monotype Typography  DApplication CodeAH  0޽h ? www%5MMM___PPT10u. Vt+D=' = @B +/% 22  ( ilacitno  l   C ``  v l   C ЯP v n"   0p 0___PPT106___PPT9B___PPTMac11   hnamd` Arial&Monotype Typography  >A    6p$D,0___PPT106___PPT9B___PPTMac11   hnamd` Arial&Monotype Typography  JGazillion Active PortsA   3 BCDE(FAAjJ (P x`pxp @   hx ,$@,   C BCDE(FjJ (P x`pxp @   hPx ,$@,   C BCDE(FjJ (P x`pxp @   hpx ,$@,"   0 ˈ  $D,8___PPT10F___PPT9( V___PPTMac110(   hnamd` Arial&Monotype Typography    hnamd` Arial&Monotype Typography  x Fraction of a gazillion threads "! A    C BCDE(FjJ (P x`pxp @   hx ,$@,l      ,$D ,`   S 0A?database `   S 0A?databaseUq  `   S 0A?database * `   S 0A?database "   0P݈P (Xp $@,0___PPT106___PPT9B___PPTMac11   hnamd` Arial&Monotype Typography  V"A relatively small number of disks##AH   0޽h ? www%5MMM___PPT10}.Vtfm+g D' 0= @B DX' = @BA?%,( < +O%,( < +DA' =%(D' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<* %(Dq' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<* %(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<* %(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<* %(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<* %(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<* %(D' =%(Du' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<* %(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<* %(++0+  ++0+  ++0+  + 22 t$(  tr t S P"`  v r t S p"PX v H t 0޽h ? wwwfMMM___PPT10u.rK+D=' = @B + 22  (  l  C "`  v l  C @"PX v H  0޽h ? www%5MMM___PPT10u. Utc+D=' = @B + 22 @( ito s l  C  p"`  v l  C q"PX v H  0޽h ? www%5MMM___PPT10u. Ut=+D=' = @B + 22 `(  l  C "`  v l  C `"PX v H  0޽h ? www%5MMM___PPT10u. Ut'g+D=' = @B + 22 ( " l  C ` "0`  v l  C !"PX v H  0޽h ? www%5MMM___PPT10u. Ut!u+D=' = @B + 22 (  l  C P"`  v l  C "PX v H  0޽h ? www%5MMM___PPT10u.Ut+D=' = @B + 22 ( acnps l  C `"`  v l  C "PX v H  0޽h ? www%5MMM___PPT10u.Utg+D=' = @B + 22 ( rEalgnh  l  C P"`  v l  C "PX v H  0޽h ? www%5MMM___PPT10u.Utb+D=' = @B + 22 (   l  C %"`  v l  C  '"PX v H  0޽h ? www%5MMM___PPT10u.UtLw+D=' = @B + 22  ( CCF l  C 0"`  v l  C P"PX v H  0޽h ? www%5MMM___PPT10u.Ut+D=' = @B + 22 @(  l  C  4"`  v l  C `<"PX v H  0޽h ? www%5MMM___PPT10u.Vt6v2+D=' = @B + 22 `(  l  C "`  v l  C "lt  v H  0޽h ? www%5MMM___PPT10u.Vtn+D=' = @B + 22 (  l  C P$`  v l  C $PX v H  0޽h ? www%5MMM___PPT10u.Vt< +D=' = @B + 22 ( & l  C P$`  v l  C $PX v H  0޽h ? www%5MMM___PPT10u.Vtn+D=' = @B + 22 (  l  C pr$`  v l  C t$PX v H  0޽h ? www%5MMM___PPT10u.VtE+D=' = @B + 22 ( (< l  C `h$`  v l  C i$PX v H  0޽h ? www%5MMM___PPT10u.VtՃ+D=' = @B + 22 |$(  |r | S `.$`  v r | S /$PX v H | 0޽h ? wwwfMMM___PPT10u.rK+D=' = @B +iW 22 == FK=(  r  S $`  v X2  0`PpX2  00 PX2  0`@ ` X2  0PpX2  0p^B  6D`p^B   6D@p^B   6DP ^B  @ 6D ^B  @ 6D@ u   <м$v50___PPT106___PPT9B___PPTMac11   hnamd` Arial&Monotype Typography  9ClientsA`F P   P    PBCDEF18c8c?tt3fBZ[ND<8 3U238>0+Vo Er%3B=?GDwP_o|{}6K^s{nxd'4AuP^[<eoroijPu6|\$rElJaJ"hJ|1q+ehie]_QBC14+ -< "Gp}ws1q3f@P   <p$@ `0___PPT106___PPT9B___PPTMac11   hnamd` Arial&Monotype Typography  > The Internet A!  6p$PP@pd\8___PPT10F___PPT9( ___PPTMac11   hnamd` Arial&Monotype Typography || X(namd Courier O Load Balancer&A A^B  6D P"  6$" 0___PPT106___PPT9B___PPTMac11   hnamd` Arial&Monotype Typography  ;ServersA8 K   D@ pH T   # K 1 "  # lp$? 0<P" 0___PPT106___PPT9R___PPTMac11,$  pnamdhHiragino Kaku Gothic Pro W3Dainippon Screen Mfg. Co., Ltd.   Bc z"  <G0*g ?"  z2  <g ?" @ N z"  <G0*g ?" * \ z"  <G0*g ?" } nB  0Dg ?"   nB  0Dg ?"2 2  nB  0Dg ?"O O  T   # : K "  # l$? 0<P" 0___PPT106___PPT9R___PPTMac11,$  pnamdhHiragino Kaku Gothic Pro W3Dainippon Screen Mfg. Co., Ltd.   Bc z"   <G0*g ?"  z2 ! <g ?" @ N z" " <G0*g ?" * \ z" # <G0*g ?" } nB $ 0Dg ?"   nB % 0Dg ?"2 2  nB & 0Dg ?"O O  T   '# K  " ( # l$? 0<P" 0___PPT106___PPT9R___PPTMac11,$  pnamdhHiragino Kaku Gothic Pro W3Dainippon Screen Mfg. Co., Ltd.   Bc z" ) <G0*g ?"  z2 * <g ?" @ N z" + <G0*g ?" * \ z" , <G0*g ?" } nB - 0Dg ?"   nB . 0Dg ?"2 2  nB / 0Dg ?"O O  T  @ p  0#  E  h2 1 s *" @ p h2 2 s *"@ @ p p h2 3 s *" @ p ^B 6 6Dp ^B 7@ 6Dp@ ^B 8@ 6Dp ` ^B 9 6Dp@  < C BCDE(FjJ (P x`pxp @   P ,$@, = C BCDE(FjJ (P x`pxp @    @ ,$@, > C BCDE(FjJ (P x`pxp @     ,$@, ? C BCDE(FjJ (P x`pxp @    ,$@, @ C BCDE(FjJ (P x`pxp @    ,$@, A C BCDE(FjJ (P x`pxp @    ,$@, B C BCDE(FjJ (P x`pxp @   @ ,$@, C C BCDE(FjJ (P x`pxp @   p ,$@ , E C BCDE(FjJ (P x`pxp @    ,$@ , F C BCDE(FjJ (P x`pxp @   ` ,$@ , G C BCDE(FjJ (P x`pxp @   p ,$@ , H C BCDE(FjJ (P x`pxp @   P ,$@ , I C BCDE(FjJ (P x`pxp @    ,$@, J C BCDE(FjJ (P x`pxp @   ` ,$@, K C BCDE(FjJ (P x`pxp @   p ,$D,H  0޽h ? www%5MMMjb___PPT10B. Vt+D ' 0= @B D' = @BA?%,( < +O%,( < +D' =%(%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*<%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*=%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*>%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*?%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*@%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*A%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*B%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*C%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*E%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*F%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*G%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*H%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*I%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*J%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*K%(+  22 aY 8( ;]"@h" 8l 8 C $`  v Z 8 C 2Aapachevsyawsy0Of  8 <$  w/From: http://www.sics.se/~joe/apachevsyaws.html,H 8 0޽h ? www%5MMM80___PPT10.Xt+f 22 P( CCF l  C $`  v l  C P$PX v H  0޽h ? www%5MMM___PPT10u. Ut G+D=' = @B +;22 5 Pa(    Zy$gֳgֳ?` ,$, CA&8P2f  Z~$gֳgֳ?"P ,$, CQ&8P2f   T$gֳgֳ?",T ,$, C&&8P2fB  s *޽h ? f___PPT10e+D=' p= @B + F22 5 z(  B  C A R- H  0޽h ? f___PPT10e+D=' H= @B +`   `(     N1 ?!   v   Z"g g  ? @  v @Z&&MMssH  0޽h ? a(f  &(     N1 ?   v   Z"gֳgֳ ? @  v@___PPT10 V___PPT980___PPTMac11 ,namd$ Times Roman   Goal: Introduce the Berkeley DB product lines. We have three different products, but they are similar philosophically, so I ll start with the common material and then split up into discussions about the different products. &/z      H  0޽h ? a(B   p (       N1 ?   v    Z$gֳgֳ ? @  v "H   0޽h ? a(`:   (     N1 ?!   v   Zp$g g  ? @  v @Z&&MMssH  0޽h ? a(L?    p\ ( efertnp  R  3    v   C ~ @  v|`___PPT10@8___PPT9xpn___PPTMac11H@ ,namd$ Times Roman   ,namd$ Times Roman   ,namd$ Times Roman   ,namd$ Times Roman   ,namd$ Times Roman   Now that I ve defined my title, let s look at a  typical Internet service I need to talk about how such services are built today -- I don t know much about this, but I bet Chris can help me. My understanding is that you have a couple of flavors. There are the really big ones that have a bunch of front end HTML, PHP, Javascript and then interface with a bunch of custom software and talk to a big RDBMS. Some of the more forward thinking (and performance critical ones) use that pile of custom software to talk to BDB. Then there are the SOA folks who have a pile of front end stuff that speaks Javascript and talks to a BA application server, and ultimately that Appserver talks to a database. Is this right? (Boy is it not the standard oracle picture that people show ;-)N Ks Ob@ m} : eH  0޽h ? ̙3380___PPT10.raFh;  tl(       !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]_`abcdeghij{$?{ R  3    vr  # H" @  v  H  0޽h ? ̙3380___PPT10.r(S6@  PF( EDEDDAEDDA PR P 3    v P C p" @T  v< ___PPT10`X  ___PPT9  ___PPTMac11 ,namd$ Times Roman   ,namd$ Times Roman   ,namd$ Times Roman   ,namd$ Times Roman   ,namd$ Times Roman   ,namd$ Times Roman   ,namd$ Times Roman   ,namd$ Times Roman   ,namd$ Times Roman   Evangelism: I didn t invent anything I m going to talk about, but I ve been converted by the prophets and now I m going to try to convert you FUD: I believe that if we don t embrace some of what I m going to talk about, then we re going to be left behind and become irrelevant -- if that doesn t inspire fear, uncertainty and doubt, I don t know what does (other than another RedSox play-off series). Fun: Historically, building highly concurrent, high-performance, robust applications hasn t been much fun, but you know what -- it s kind of fun in Erlang. Some of the messages I ve heard over the past day and a half: Asynchronous Simple -- fork/exec process per request Scalability from day 1 Well -- all here s the talk that tells you how to do all these things.v > ( F$$((tF20K;H P 0޽h ? ̙3380___PPT10.Ttn  A    X$ (  XR X 3    v  X C W" @  v`___PPT10@8___PPT9xp___PPTMac11tl ,namd$ Times Roman   ,namd$ Times Roman   ,namd$ Times Roman   ,namd$ Times Roman   32 milliseconds of down time per year The AXD301 is a carrier class multiservice switch More on the details of Erlang later  Erlang grew out of a series of experiments which we performed to see if we could find better ways of programming telecoms systems. Our criterion for success was that we could program telecoms systems with less effort and fewer errors than could be done using conventional technology. Joe Armstrong Fosters a style of programming called: crash early (think ROC).N&2$- ?>D fH X 0޽h ? ̙3380___PPT10.Ttc-B  3+`( O `R ` 3    v1 ` C ʍ @  v@___PPT10 V___PPT980___PPTMac11 ,namd$ Times Roman   OEDTK is a general driver toolkit for interfacing Erlang with libraries written in other languages. The current EDTK-1.5 was significantly enhanced to facilitate use of BDB in Erlang -- the features of the EDTK were designed with BDB support in mind. So this is a complete, well-thought-out architecture to support lots of BDB features.&Pcto~H ` 0޽h ? ̙3380___PPT10.Tt\ C    0h (  hX hC    v  hS P @  vlh___PPT10H@___PPT9F___PPTMac11  ,namd$ Times Roman   ,namd$ Times Roman   ,namd$ Times Roman   ,namd$ Times Roman   ,namd$ Times Roman   ,namd$ Times Roman   86Think, highly reliable, robust, scalable ISAM Why would you want BDB in this enviroment? (Instead of Mnseia, which is part of Erlang) 2 GB per-node limit slow recovery minimal write-concurrency may need greater scalability than provided BDB well-proven in mission critical apps; know how to tune it, etc. X7.X ,EM "E*H h 0޽h ? ̙3380___PPT10.Tt\0D  Pp@( E7 pR p 3    v p C p @  v NOK, so a disruptive technology is one poo-poo d by most of today s web developers, but that will come to dominate the web service landscape.& ]H p 0޽h ? ̙3380___PPT10.Tt(E  TLx(  xX xC    vL xS }" @  vlh___PPT10H@___PPT9F___PPTMac11  ,namd$ Times Roman   ,namd$ Times Roman   ,namd$ Times Roman   ,namd$ Times Roman   ,namd$ Times Roman   ,namd$ Times Roman   rOK, in this section I need to introduce Erlang -- hit upon the basic programming model. Talk about its concurrency model. (guess I d better learn about actors) Ideally throw out some incredible performance numbers (I d like to compare process creation in Erlang to thread creating in Java and also look at the number of parallel threads you can support in the two environments, but I m not sure I can do that). I may toss up the code for the Web Server to give a sense of the compactness and utility of the language. Talk about how it achieves reliability: process-level robustness; EDTK valmap cleanup capabilities, immutable data (no mutexes), messages passing, etc. I ll confess that the language isn t particularly to my liking, but that I can live with it to get the kind of reliability and robustness and scalability it offers.XBXHj %t(@)>H x 0޽h ? ̙3380___PPT10.raFhF  nf( ޽h X C    vf S @$ @  vH___PPT10( f___PPT9H@___PPTMac11 ,namd$ Times Roman   ,namd$ Times Roman   LChris -- I would like to show that Erlang lends itself not only to greater reliability, but a cleaner architecture. So, could I take my software architecture slide and simply have a gazillion processes doing their thing? 0th #H  0޽h ? ̙3380___PPT10.raFhK  `( 8 R  3    v  C $ @  v iChris was also instrumental in helping me see the light -- understand Erlang and see the power behind it.FH  0޽h ? ̙3380___PPT10.Ut};L  h`(  R  3    vf  C " @  v@___PPT10 V___PPT980___PPTMac11 ,namd$ Times Roman   BNo shared memory makes process cleanup MUCH simpler Lightweight processes mean that you can spawn them whenever you need them; don t have to be frugal about starting them; can map the computation to the problem. 1 microsecond on this machine (check Java) &4H  0޽h ? ̙3380___PPT10.Ut$M  C;(  R  3    vA  C " @  vH___PPT10( f___PPT9H@___PPTMac11 ,namd$ Times Roman   ,namd$ Times Roman   -Supervisors watch processes or trees of processes The let it crash philosophy is what the ROC folks at Berkeley/Stanford have been touting -_ Erlang has been doing it for almost two decades 02 *H  0޽h ? ̙3380___PPT10.Ut(ȗbN  r( {5 R  3    v  C  " @  v@___PPT10 V___PPT980___PPTMac11 ,namd$ Times Roman   XConcurrency oriented programming Unix philosophy on steroids: do one thing and do it wel&Y!7CH  0޽h ? ̙3380___PPT10.Ut_ tO  (  R  3    v  C P" @  v ~OK, so you want to learn the language, let s learn the languageH  0޽h ? ̙3380___PPT10.UtQ  P(  R  3    v  C " @  v If the message doesn t match anything, it is saved for later processing!H  0޽h ? ̙3380___PPT10.VtWfS  v( |$%% R  3    v  C `$ @  vX___PPT1080___PPT9h`___PPTMac11ph ,namd$ Times Roman   ,namd$ Times Roman   ,namd$ Times Roman   ,namd$ Times Roman   JThings to note: spawned process (Pid is that <0.32.0> thing). When you send a message, you both get a return and also get the value printed from the execution of the message send. Final message all you get is the value of the expression Trapexit web server is about 250 lines of Erlang (a high performance concurrent web server)DK?v9 [>" !+H  0޽h ? ̙3380___PPT10.Vt5,T  0((  R  3    v.  C U$ @  v To use a Stonebraker-ism -- isn t this like gluing an orange onto a pancake? 4H  0޽h ? ̙3380___PPT10.Vt#" V    2 (  R  3    v   C $ @h  vP`___PPT10@8___PPT9xpB___PPTMac11 ,namd$ Times Roman   ,namd$ Times Roman   ,namd$ Helvetica   ,namd$ Helvetica   ,namd$ Helvetica   ,namd$ Times Roman   Well, sort of. It s actually not that different -- uses exceptions (yeay). Environments represented by ports. ?BDB -- ? Just means a macro BDB = berkeley_db_drv -define(BDB, berkeley_db_drv). So ?BDB:db_open == berkeley_db_drv:db_open lp3&  +lEJ  H  0޽h ? ̙3380___PPT10. VtHW  h`( # R  3    vf  C ͆ @  v If your architect went to school between 2000 and 2005, then you ve got a standard 3-tier architecture with clients, an app server to encapsulate your business logic using active server pages or javascript, depending on your church. H  0޽h ? ̙3380___PPT10.VtX  (( @ R  3    v  C ˇ @  v 6If your architect is a bit older then you ve got an infrastructure of 12 different languages and abunch of code in each of them.aH  0޽h ? ̙3380___PPT10.VtuY  ZR(  R  3    vX  C ~ @  v Or perhaps you re a really high volume site and you need a high performance embedded database, so now your application code is all tied up with your database code and you re still using a combination of sub-optimal languages.H  0޽h ? ̙3380___PPT10.VtSZ  (  R  3    v  C S" @  v@___PPT10 V___PPT980___PPTMac11 ,namd$ Times Roman   hYou ve written a big pile of code to manage it all -- isn t there any easier way? I m going to argue throughout the rest of the talk that Erlang s runtime philosophy makes it much easier to manage your concurrency without writing a big pile of code.&R,PH  0޽h ? ̙3380___PPT10.Vtb[  zr0 (  X C    vr S p$ @  vX___PPT1080___PPT9h`___PPTMac11ph ,namd$ Times Roman   ,namd$ Times Roman   ,namd$ Times Roman   ,namd$ Times Roman   xDon t worry about having too many processes -- just spawn them off, independently of where they need to run -- remember, distribution is transparent. And your server is a combined Erlang web server and database (BDB). How does it stack up>?DD ,7H  0޽h ? ̙3380___PPT10.VtSG  tl0( @G R  3    vr  # e" @  v  H  0޽h ? ̙3380___PPT10.Wt"H  tlP ( aM  R   3    vr   # `" @  v  H   0޽h ? ̙3380___PPT10.Wt"I  tlp$(  POO $R $ 3    vr $ # " @  v  H $ 0޽h ? ̙3380___PPT10.Wt"J  tl((    (R ( 3    vr ( # " @  v  H ( 0޽h ? ̙3380___PPT10.Wt"P  tl0,( H 0` ,R , 3    vr , # pE" @  v  H , 0޽h ? ̙3380___PPT10.Wt"R  tlp0( {5 0R 0 3    vr 0 # 0$ @  v  H 0 0޽h ? ̙3380___PPT10.Wt"NU    4^ (  0` 4R 4 3    v  4 C `$ @t  v\p___PPT10PH___PPT9___PPTMac11 ,namd$ Times Roman   ,namd$ Times Roman   ,namd$ Times Roman   ,namd$ Times Roman   ,namd$ Times Roman   ,namd$ Times Roman   ,namd$ Times Roman   Threadpools? Why not one per process? Well, BDB wasn t written w/Erlang in mind - opening a database is a heavyweight operation; with 1 process per request you d be opening/closing the database on every operation -- not exactly whaty you had in mind. Although Erlang can support millions of processes; your OS won t let you open millions of file descriptors, and a database needs to open files So, all that ugliness I told you about in Internet service sofware architectures gets hidden in the EDTKb'w` |h  6  'W;&H 4 0޽h ? ̙3380___PPT10.Wt"t\  @<( ltncltnc <R < 3    v < C $ @  v ___PPT10x     ___PPT9     . ___PPTMac11   ,namd$ Times Roman   ,namd$ Times Roman   ,namd$ Times Roman   ,namd$ Times Roman   ,namd$ Times Roman   ,namd$ Times Roman   ,namd$ Times Roman   ,namd$ Times Roman   ,namd$ Times Roman   ,namd$ Times Roman   ,namd$ Times Roman   ,namd$ Times Roman   ,namd$ Times Roman   FX axis: imposed load explained below Y axis: throughput (in KB/second) Blue: apache on NFS Green: apache on local FS Red: Yaws running on NFS Take away: apache falls over at 4000 parallel connections; yaws makes it out to 85,000 16node cluster Machine 1 has the seb server: Machine 2 requests a page from Machine 1 in a tight loop Remaining machines 3-16 generate load: start large number of parallel sessions; each session asks for 1 byte from a file on machine 1, SLOWLY -- HTTP get request sending one character at a time with 10 second between each character (think DDOS) G%" W $$((W,,00p4488FF:iH < 0޽h ? ̙3380___PPT10.Xt cxp^RЀ3ÿ lHbP  @AL G@;b `B&VaGrPICTj HH HH  )l%4 ٖvuvuvqvuxSuvrl‡uvt~͉ĮٖvuvuvqvuxSuvrl‡uvt~͉vki90G@?sZki90G@?sZD Xed eX"BXedeJD3>bd`NH6`dbrwD Xed eX"BXedeJD3>bd`NH6`dbrwyu xtV}~NH0yu xtV}~NH0z]`YNH]`YNH57HFNHg lqpqjή57HFNHg lqpqj uc 7\4gNHU* uc 7\4gNHU* R%wMGINHe dhgcέ R%wMGINHe dhgca d}=e2CH L0<NHa d}=e2CH L0<NHsz ~q(c,!NK,sz ~q(c,!NK,A%_on o_&= iԃ = ܷCkonlsOqng;ionml߮A%_on o_&= iԃ = ܷCkonlsOqng;ionmlec /k  6,fT9Iec /k  6,fT9IՏmjkjldswhaceeezjkismjkfjjkjlՏmjkjldswhaceeezjkismjkfjjkjl  ՜.+,D՜.+,DocumentSummaryInformation8?XCurrent UserYGl    'On-screen ShowOracleM## *TimesArialTimes New Roman HelveticaCourier WingdingsBlank PresentationPowerPoint PresentationPowerPoint PresentationPowerPoint PresentationWhat kind of talk is this?Erlang + EDTK + BDB: Huh?Erlang + EDTK + BDB: Huh?Erlang + EDTK + BDB: Huh?Disruptive TechnologyOutlineAn Internet ServiceAn Internet ServiceAn Internet ServiceThe Software ArchitectureOutlineThe Erlang ApproachDont Fight the ProblemDont Fight the the Network!Dont Fight Distributed SoftwareErlang Tricks: ProcessesErlang Tricks: LinksErlang Tricks: ConcurrencyErlang Nuts and BoltsSpawning ProcessesMessage send and receiveSend/Receive ExampleSend/Receive ExecutionBDB in ErlangEDTK fixes mismatchAnd the code looks like BDBOutlineAn Internet ServiceHow does it Perform?AcknowledgementsPowerPoint PresentationPowerPoint Presentation  Fonts UsedDesign Template Slide Titles# 8@ _PID_HLINKS'A`http://www.emc.com/%_"u  Margo SeltzerMargo Seltzer