ࡱ> /*+,-.`!\5;.%nfh*5xU>tw1ttKKwwww]Ғ "H( Ae]=WWxF>?>;^'1D"/U8( 7p>b{Ĉg!/ק1"G . /&O=/F\y1#Jpɟ;[#QY߁gHvg,;e Awڒs]T2uKZ2%v-"q99K$1]RRJ$*$I6Irc%%upbsI9ӒQAI'W%-RRnIb/q':yaO={rtEƘΧ?o9|>?^/|I -]oe ̐ 4s0קrWGAJ;,T@RS0]Pes_YN=Vmnr뭼[mURX}7ۚ҅YG7ܺ~u q-mkj\#W湊+e\ArANvű;.Fh\&Niӟ;ߺz]/ E.b.2@OvYgWڹbڕ殼5rUc5]C[s]g_;{m?k*3~yU3~\wW$-| %P#nŷ'.aCx5wKxA{4SCn^v_wTqgu w_统tM'q(ņųhOsvl \!eюXFmeD{ҡi\ -vz%p0L`qY,YMز]h>ϳJM**Xb Xy5"[iXDʙ=,rwl09d蟉:cc;.pz:5?(RUH)-SUH&H2$In&ETlROHa= mG[wmֶLZ-o5< #d-}`eLks-u~U{i=00GG&u3o>/FR{atmչzHm^M}I}-%k,љ2K8="t-K=}OXo]( t4X?ocJ-Pv%uF{3}&kCI.u@{2=CWЉvu"s }#ףE\pzvyVgӵ12lksB 4U㼚jEOk5tVweѥ7uҽ֯~>|uͬiS]ɞK{38o*Oe3C9e΂csէ7bd& q WϿQl[KZ^C0Z+·j6|m{-ZHk6_MZs5h:+Efevkn[g5ޫ*Wenub] zCFj%W䄊qbS )6[MMbTQUЙ\ qMݿsew/> wTVSZ{2>R?6 N\IK5ֆvgvFXI6ZGrB]L&Iפ$G|=ɡIz=!t$ŒR'IZoo Єl[? 9 bS ΪieyƶzVac>QW+'^;ayl7zl7ц덷X荶v(k퍴pk P Zj^*^O̾@yuUka#[fe*YZZYf^FXr/%Xw j Tiljhͽ֊3ڰG[GSGt; d]shjM٧)t7a݈4>yyJcl{={z=@oh'ioI+{y.:[ PԦ6㵙[55<W)w$ބ½|o?{ڠ7ܽsޠ =^Kuz!?Qz{UAMPoGoe]6Ȱ 2ll /ЊVȵ%cͭ 2t3HSoQEY^\|st~;û}+h۱]g~t/~n}'}gBm^lS-Ѵx'o9H<] cH0Fn׉$t~< f/Gx6Ȼ>?9 wѭ@9UC3F#b42;Ưύ Y`n^9i?+s2PکKy8;2IIЯkLt5*:큀V~hukm"|=6njS»+Ż:Ad;l`k0k(YHϗ߫<"sZ[*AWE2r:J+|d94Բ9Le&'9G|> ZdryVz G+X`u~~7@Ϸ˚W'[wh\dVZP0: ӣ_“‹> ~P[oJF(o@7I\]*1Dբit}{8e?ڽ@?dj^ |j`5W KTgPyi.> ho>wom7Cϸ: ѡnvr}륵\gZjqWW󸊚.vsiIFQZȳ;3dΗѺVfCѯeĽz[菲O}qah:mgskywSk=֖g~ծ7iO'E~. tlKh#\8ԦD]\% =/1^w5wM-wW|ncOq=r> o:}D}֐+1Y\O,)] 2T ,}gWҀ2䞿>b(NܮEܮ wCܯ___-cDHq;,/NKb]Bn6Mh)9u?:=}B5k,9͖xxMV=,xDĖ&DC)MNCӻlnp5.Xt~pS0v\;.kl룕\w Wu5>2.kinW sfidoMoM} |J||| }J}}7yͶc>|35#vɆt4Ǿ=Xykg+b[OwK 7F?c]\{mhcP J3kt=IF c22}_,ղ߾xJaS80 ܞee62MہD.;}dCe6CØ3sGV@:ۄ-~$e4G2Np믂790N#CxG7Tm_AJjKsŮVڑg0 uu0u NEC ՕnsC4i߭cXEH9}ꎪybPAcQ ]4fTϺ?Ez赏ݝf#s@v[u[-+u[n6 OnxΠ=Tg%71>|#LEߣcip|KpG ^ 荄PKaO8eh}P9|* Ǡ#9yԏcPs| u#Kd?d w=&lU|оw9Oq׿yЀ;1)r=գd^g]Tb.>7=s-*HoѴcF>w>tj'VEK{-dvhyKƸ:vD:UMt᪢Y54I\m_=MX-Ѱt BwI>@"CyGdQhn.##SA <( ʀ"킥#&ruVaIu:U%e߉H*nPRQ$-֤vEcr2rᖗ*sn>U3ɬ%kK4Hg 0Lh0 4Lk٭ZZ۪Xۭ޲Q].=(r$z>:5-@ko5ע/`]!kni~g%O}qfZ>x/ m$'V#cZ?7l>OlF"J@ys*D_.>JzrxApzgj(}+HizybyVZ[l@smuIFh* -~nv{,o`F&6LK𪷑J^rg3F:'VjC4'9*\++o%uЭVL?"hlAvf92N;,~j Kx g?ck[~  (JtjRӬf65@kNٺhonaSG]ð gX֌a14h}&{W9; 㫭5^$˼!:g/ЊȤ$y7j-״BS* xQA$<ӥR[k_=uuHGDc ?3T򬯣iUUt.E/9˴%'ŬYKùk:hľw/_1喝S96dn3nbfu( Ҡ( UٙgKXbvL 3xF;'T?(H}R %HieW_uvZ> dY@zJDꯚ4>Uf@\]SX\ 4$Af Ԅcř[^}z= 7!&hI4tM:FCaѴhIN>'R-{F> ^ EqS;G FzJ_r%ee0(-L2RlK% ,D[ Yae%D>f?ϙ뎱oEAB'jiēDUE[ܵdWLZ 9a䈕oA Bcyu;`1^,LcI3x\x6-,ȲۖKYnN sTn2&3g έgq`Ep_z|ԱT (g)] K Zble.Ԝ ?~vWua%}+8;!Ϩ:;w\$!8N/t|Sm&|֒ Z<ֲTKg% FIs~*5'_BZY wYfHn8N2+ΪHc%TFRɚw )amu\UzKb+)l$wdZ-VFy>4K;.E_! g2 (t- Of|~Ǵ#BceA6s¡\疙`:SƧ0oܜ CIe{(|y,gt7T1<[?Ox? UJȗP HI69}sirG'/:=Jbp$; ,6R׶"/<оvOA0(j` ^uBr-,k-,5֒$.3Czn[]r[w }oȭ[$J^|jKU}kK;GeOcr=%cg-8iղo&.rl}:;b[cmݰvޱmnKMY닉s_d4O%f m,,=ŶPuվ&\{ɢgtYr˥H߶2:=jB|m8K>bl{}?$N6˪'V;m5e֐!wl`XKKk6MPrt c @l֥6g>jU6X+n>#wz*xoZcNj+x.CKМpi +*hPe׿*%ՒfTvnaԣc([^d=H|R#TKTrB ϒQ @2"I# w"X" 9դdA94@+y#=\7qwqUjԾeoN٭SAG]}`@ 2=}is;#!Hg*\fsSSO2Le|bl]~v#Ev1E%E ԧ.FcdeNzKh?Ay=ƞW~W!hk7=[i]7L t;w>k㴟Al#4{J\T!dH+5KeYA.Y+-qd1%cJ"RVCo؛ʢy-)FEsL/ZԲkd4YL|DLCT-#BBڇ(J#E9(`^G %KxKX% bN(?ae ip#&dА hHYmqܻKU5P_n áhR(O7 Ѯā!hd$Gk VwF}GN$7IdO6j#^I +-R,*ııfĵd@ɆQi!O>ľv F3V!ڌ!-vRF9@4Hss$ig!JFy+lm }=}\}tr+:xDkS$Tq4SJWN"T1rPo%iALgqDP2tr%^Hf6e{֮v}S޿sdpwm{lm{`=wӆ69w]ޠ;Zk4佁dE˞uܷ,3'qޏYmP QXUw__XM{XO;c{{*;r4*ߤ4cYWnV6X.-nr[ xG &Z7ҹzXrΒ&ն4 c,&>5sm`]]_ F6"y n]p|"&윞յ,pݹIw( :sC݂67@(C$}7\f nws7vi`2 ÍڛbE9_/|ח?^P|}/_|};`~{+Os| IC61}carz·aw5宣ױm}Cؐ2cm`*M54e#6 tm4 .yx9}Zq;?i@Ͽpeabok*`JPƆ0g0s#/b\l?V8 (4<2s%g IOl{dă}Sp<UאnBn-``w58Vz -E7o9Nvb.hq`?3㰭`]G8z #81H|2b xqn)+iko[l24OAų\$3)㞳Ьxx035߫%ncS`]l'1C=O[!uM%Kl9Y:5rز[*_k9sZNkeu媶k:@nX0 [zPMy$s!r?K/kYZYdXpC-熙<1v] 9sL2,NHwk,]tJH+'M,ԳRYEJ#U5*3T_Y!c#Md-kXL##E:ُTw'?M+>j:Q.#GZ@f8d 5]lf|~FL hMjG$ȳ ;+qa(R) 噋_1TRŷ÷>a+gJ'%t_,|¿>8O*%/樾!h^9df5vRNM)۱P6j,ylt>% W- E-?\?zXfcD~ ETku}I{BkxFݚM#aim(:=|6(f5@ehմ@DEG1@Lk {< DUJyK*Z [*ki%et\e][NeyY~U |U-xSN㴏kIX\Nj1Ex/)J&lOOOOOOOO&7oؿJScI8@EUDFY{oZe͑iDfZc\!sޏtn / x$ăo +H>] C՝5&Jې[wp +XgWں孊+ۀe@i&v |FNDjYJUeY2 /E5};~\^ tIWѢkhp6{p׿%?r5$hhV ºjKtHF:TtIj$igddėeh.ra]$`KY tdiR$z #cC&I;F;[|Ril z;bcAl &֐5 ՓNV]}kEVV-led%}u I󓝲G^2E^9c~o|qʮ9O"h7_^'&O~ܖ.@/zY'x?BaƏ0ϲ_=ľ t>s; BI-OA NJ*h:` QQƹj2dk 3]3 `xrek)k\[0 ΀,+Y,pMrh v\uw]W )H:qm\kһ.r.+r<.[u]٩紼1:uU#}*i qDۤ$[y۾WЋ<Ӌ||G>_}|O;uή:ZڹV 4UA)d! HHZ懺uaץPhIp͗[ =}՛[%7R?{gf)x߁?uXԐŇz%#s}WBЩYL{d(I3mV!-^d'N)$6{(d_(^gK(޷t}=a ǨƒdQ|=ouV[Qq]*ɥtKrw_$;-하nDsYDq$2](@wGE`mdFF]7V]b}PrT+Zhulv\ۧUo3~<['=% =Gnq_A(oo}xA9s9>'}9S@_Лٽ$6t ݮ`!)0q(ch9(<xThUurcX%[6a3'xZaoj)>Y9m̈́rOk#bT6h*ZbmYTԊ=K/|9=s/CސYbY3Y9͚ϊ"EbV7|Ȕ"'Th9̝bn 7bݚzGN'&9`̛Y]t U>rB4?_Q4Z3yΜ\L &ɰ&4{#%>.-5).A,qc1܇x+ KtI"iN %Mj8uIحKd$e H~BѧRui9QNʨ-T r6+h .B(Ҽ9h!'( QDnР*fZY-t\Q<+P$j&):)vU(+_-$yaP_~>7I?~ d~rYCEX-_ɓrTe?[Ni7﹄woK;,y Yq w&(ȯ[-U~qC7o*ϰü^.riuƬE|{b6M ,C b#vN)$}c/m>]y^x/Zl7ݧ絶MccfBR?tuV?=S&BdFX`! Wg[Ep0TO *(0z xW TVU&,T|U"@hҨ|SҜ` R u|?2L3H-T _VFLkZs{{e Ii7z 0ǜ6BN!/RI]0d>!X}ð|$9۸=atМЦNcgt|ZDz/ ԗSMfS2oI\Bsfy\ga~nxaSm˫xo|19N''vv9ݜH RoڱAMݯe?f.f4LbO$)"3J|!%rNʄqQ:>hhhE.4@9"P뢑K~.= l O+) V"^֣,A/Dwcx=f?}wy{s&aQ iyK.v9#r w_܋Ӓ@$!4bjb%*d;.Kjpu#H+AV.![.#K\q ! +1Jޱ4ñGDX9+%VX,,YR.Fkol8,pVTzat~l>( l3c~<rk1\JJal|لewe1̶x62 6Dt8]l +X|BM($sNI4\"øL&r&Ýxb)OF^) rƁ΍t8GjwnQ 8@/Q+Fڋ-y(4_at)_R8Q]$/H[>#}!|/rIˣ10a*Hގq4.BA:p>!t_BvU2|Jp6+Z"zǞl%+:M.BXKeVj@,ǡw=<9tǫ1 8wQDXL6&s)>Df&|N+Oqr2 mplkSq$JiT^$?y-bt _qmҐ{H(<_Z>Oh,2ɳ@&1FIJ&֮OS$J8JRw&1ɗLRfUQi|tizgh!*e ?mηYvцe4V`}YEzBExff4n,Z1ޏD*] "I1&}Y>!=L=6u5uLنo"ŷ*wS,Zs0;1 s $I ՗0Vt[ l \#@f!^ <'̐cW-Z"iU٭'@3Z$h:^A5$t uZ{ށUZ eTڼZ*lj{*(OYB 2" L!}3HidJ)dwfdNH ,BظKlyY3Ƣv@`DYõTrYE*%d,4Pƍ͑hC4ݘuc,0@Oa}3'5qNSmVSkokA?5޽G37~`!}TQ[п\ b)H8XxU tW!HC,/!IjD8Q[Ji&AKjehjԔcJ:i*JJSFgٟK< 7K"uLE~O|Q/-f“iIPiDUHUiF( ' Y%^~վdJzKH2hA&NĜd$y"c3Yj'at3Ћcgj0']l>Zf7VH`O"~MNSxz@bMha-E-C=EM`V2~1Us_JQjy;hs (}[gVa|3dLf3HIiҰפb&OL6|lڰ֚&61@^ɦ%+񦔔H+4Eܔv[ieK9(f\gfH߳!lʙCNl{ +X%anu$/cMAOFtRx 0[Lo3Fz0 yݢʜ8jWI{* S^V^CՈ2vj2*C:XꢮҁW'5)];RegS89#إ'_ϱ[fv[M^MVbrlչ^ʼ%챐̧Þ=Led&26rVXVbG[f=X 軌[,v?`93md;~W # ;ҜV co+F({BTw‡3|ݧyno ]Rl<6~wGO]. cekPB~&?|)5mN5-+)[,OrޖCH 67U$ޑ,du2}C&geتknks F Gs76EZmC;y܏616q3:D[]uElK,m>wHbw(K+`!OM4Y &@`1YxUMhA~ofMcVi!<<T[o P A x Jz ZRLz 63U{3&:HATKQ_ ͆fXeY6K  u MN;'MP(zEF`۷p`ȡՙl x+Bo٠W HHيV[2-#5f'O^VYQt0eSt\y [0!ea]rq)Rc]+ VE˷g'VCVE4:{I6q_Fcь">'Q3KG8VNZӫ-IӟU*hUh`!oUttL &$HGf]xVwpݽ$ 0#L #G4 %2^p`1ŀM7Ƃ,bS""dH)"D "<#3f~ooO%H@E%CEI/gG]s{^V3/P:M:yUiDdiFp(3Q~1'C>̼W ̔u.1:;t&6lх+k0J7bn }K覩GNO#Z>Dcgq"ZiSi+c>|$-otm[dd<̕yfẚ1th:q&)?S+"S &dͼ)<2r@r.fŕgjk_nmGsF1Q+sFp Z gV4 h&׽gxΤgzΤ,},h&˱2`D2QfiUy0% BϑE3p o 8! Ր0GV_;~&8'c~Hbd+}1ݏû~F`^~ /ߋ>0b|&FK‡ck8_=m9>mߙ/aY'C?b{I^['q/\7p?±8*J*-whA=Yd?{\j3s3VZ̒fZ\SxS| g?e}.g. d2NNWs,atgtbmif&c I v'ՙ 8FLH˯XZ`4_H$NJO]\>=[F^;;kD$T)( ~\,;UYl^)-vK2d|$[&&ss26q*Fqr:}˗D$`*:b` ˌ 1?4KF]Q~aa?oPg. YW14t13 1 e#?r`@<۱Bjs/˗e8]OLO1?<&Xan|a`/pxs[xcv}*{38ŹeƊH &%ь x<0ǐ$\'qh,YrqqXa jk'9Zc9Y9KpֳJVnVoΓZeV!|ʧ -.#P].UJ+kUj3𚡵!;F7sM85gkw\,Gr ׌sm|Wnak];^A׆ݛp1|\7}"\9Dpd ;7 ,GHC%#.a8?ֻꆢX7~zYZkWZ jURVJaF Y_*ZӴ^^tm +5k4 6il^=tk~6 %FQr`*")(rg$hB.RQLXJAd!CشHLA=73wO2sUq-7PUS<=PW*>n`DԺ%V.mصiEɆuXѬu'_}&k1O-F:D~6 ݄a݂tlz,߀Ky >m,WyXE:-ukQ7.㖨 ˸=<]x;mn-q xwK61u\^e$h[:`iqZr"Nfc/3I%c]yѮt^\ɫ&FJ]J[ :8h\M,m,5d&.t*W 9SFΤ9Xw j4w<@3PETh o+RB+"\\GCR]/Eb%&bh}yEǛ:ۤnq'`Vtb(-ueEԺ^zmm^ okr .y]YWЛ{ Es s-07Ds 1Ѯ^3\I3e5aL 'v' 443El])|,N!),q -B[4t?nr'Y{`ϚEYh/%6jTid3{6;k{{m>OmVCЌgp{ؼkwfh>ߚev2Nsn16nyѭ0Bf}E. ՠ*&?5˟MCqrrJ/_Fe(oU@—`IF}V!+oj>1$bR,i 7܅>{Q܊.q5,pfʈ%j}Qm-i)\JP+w#@{&~Fp(' #:>#ORn@ ՖDބoʏ.| 5jj\b*=¯rNA8|[&p%5s~EIYi }1YiY9u-1:'ѿt:iH;u5Bz_1p9d*"Jm4AR˥8.5x24- ,l ')qwFp)w9fG9N%T8~y`e;7@VLJ!i/aQHOY$;,d$l:K~SO'13/ߴ%q􃼷uN^]/TTUIe2! 4OJvJ0N%%NƞM-ma u$|vߢ4dY ق&/nvzYyYo2Y@;2o 2'c5xlL [;]3ʮ0l/A7a!;f;{Q6[hɋZnv)0mw65y?S9{f,ki(3_gf0_K~ywQm{VϳI^}+f{lζš3~:o7&_66q~ yFeRhOs#v0 &@_q5e_1\P|8M٬0v(>0lU\ 4@ DjfR{[fSmհ=u'hjvss0nmP p \6BV?C!c c,doOпL!c{4>cl2!6ym<.xrG{ȆH2[^/M\䞟7J?XS|?#S9?]b7~X dx%ҷ2I|w%光9xfbZ"&1g%Ē@UlJ| 2^ˉjbn_~:\F=j߿_~߿@{߿OKǫ֮]o]%JuU^|IL//BZiVzֿǿgg_N]aҪ?#`9}_^Ŀ_%W 0_RIszIR M@ 2(|̈́-\݊4aX'6s5585o'nvon=ɴ$% J'c$ x]'l3z%RH8Sڶm³}'wӃ~M\ntRܝҒ>ڴ8ܔ˕2A 8ϋQ[6 ۈn se)+F].*RS)k9UM} _u4 ms۸X-- `m}b =L/wAB@OXM.B)SiFlAo .KM!]ዞՐqhO XﶃvLa)bi0bh_1w{ެ^XmԲn!|;9[E/^_С3Juy7YQcgqP4DRÞ|$peo_H>Ҟi@{Bo4E yQ!3AXK7Q9b3bu8<9^ko8xC4Ip^^݊\}o= =;c'tv7{pz{s$cs'4톆=;6IJS_+7qmGlݐGPVہx#]vNo6m1OمY/'QsQ{B8^]!Ԃ˂ʹTƥ.sB] r(;w0%sg; { &"ނ o7ӔbmCОiGDodPKDr8"Qy^Dt6ώU)) d{&sm E5EGU07lT:XeP9kO*h~7F@+Ȩ]ihȺSS:6ކa=7pڿ}zi?ϕx`!F b/F4'L:* ][]0p  x{ޏ1Ƹ ˌ`̸ $e 3D.Y D&*(HJI+Q(8$2:D}Uguûg}~y緟LQDnaqD!%,RrQXkPd$@S)]Sk1.GFDxYVх8旁&uY>9 B,P?g+&RwKwaj':z*iEkA!dp Si)(sexD 9RpZk<Nrr/-h$✥_ui^穧 V?CN&7p%yj?'Q=!G Na]/r|Mo a~B;ۀn Q0Yn=l6<8cIAԠA W,Ȧ7*Ck ^0 ;'І`miGt(8@?Gp:9+tn cXNWbJ.JUpy]˱S A~M n[q[^X{>5 8G=2XP"#< 2Z8m 5IZL֒3?1=c[|V5Kx쩺yNy:~.~<]{ا)#jB;x64kùZ /Q6|N ߋ(M[si)%-S,AY al"s-F򂉼d7x]vX/;q^gx7n]}'3>"[ϗl-_ul R+ DI δ3iY<4Wh@#x+ 㝔͗@,ry"2st" Z` } SܝOr7>|>.y5Ln34gq# @=5ac,*<5Le"?eA) x2G$6zH|A e>|zE+ԆOē @< b0.J|Z5>Mc"ٔ  ޕ4hAk_Y odyֈgZS'(ع>]%imu8%,|O=~o y_x| 8,RںA77uy>mIOp| |b]v\Z$foK['i^ζ@J_$9)C,j:)vLۏz~^5mknt5~)Z̲86\y*b*XnM(|JMV\[1zȢGF>f[-_ zRJYj,8{ TAɒD)҈K*BҌJK,it҅H:l/S2D.ci XZ ~)I/en'izk] viW4.N"bŵ7p!0v83soێ_"6/z X R~-MxUTkET#<*%XRN܃zqoʰSDu6'ø1=ͩ$m-]mKyiRg^Tk_.:_P{.6ַ-mw=.6L{_3^*xC:ƪuߴvΖ<vkYuogR:rG.6ֵi^gd.Žeƺ]^N )!.6S&>mqTIlSV]l _/g֙PbcMt]Yw޵uJ6bXk.}]nS]l%E/r| \3)a-m`7Aer.v>)u}%F9B'#!yXwP>}F}wt]@`.?LfpWNmka mm2nFn1+ݮ=ϓOyfFJ6|*vSv=mX{ߌIS6t9v'j lv=MhF80|ʫf-.ɣxN_E;#1 @wTك '0ㅨE׮-Q^9QRc_5q|[=QC۵Y p/Lq 79\_|| qCl[&q8Gʣ6Yy1atGi,8{, 0k]spOt?4|.Rل3ovp|n*VwtKttQX}.^<{0#ᦢ>r/7yr Yuɯ+ZA]\jnkG:Z# ߊu*ڴ1G>?ܛܺ\7E[צ6mJsC԰'7KY0wNϹ껸v~rh;d-G|DžCc4> itox9@?I5iecKvNZz':gG;ћv`={+0=gF\9ܛ1(QC4.;cgڽ4oWo\j3&E}ar>{8o8X4oFsk7F,׃_${eF FjӬF,-Q+ai:Pu?؋v%-}t]j+=zC]hv7oybwuضG oۄM1~Kiu\ K.6 xo^k y:6^ |ƺVI8ȁuVV_%^S oX٭nrv.6nQ Րt^#7 r0Du[`/䁢X݊[|.6x"t,`*4Q]lr_H#Q]l56|=nr Rd:gjԖoec.6fn2&!"ª7οLV]l4JnaVr[3Sw'(z|g%|j'ƵRl02ǚmRMSWƲܴM)LGtݲ'ߙ^_e"M83WJ%%F{qpJn  P8遠=_4juwВF]_И:7RA#jԧ T:(OA1u3~_Z9h!Yi2gg9f6u&b~WLytg-ɐ>t30G+wyOQ?Jy5U>/.~jR{Oq7SHVgey 1_rO[09g!o2N tލdGMKOh.f975ns1Ϙ2X2$KMKдs;KX:WX`9fr< LwnɷۄmYA܋f[ = 9p 5TbrüԢAPL TA2tq^ .Jऴ ~&rMRoI`P|,hG5R),u}08#6AAOTgUzg ҁZxPϮ;詠 rc~0hEÂ[i[ӈ@oǼڄ>q֤sjg=8}Ms3b usjۈ ct4|&T(c>[Ι3Xo~p5GSYf#v B׀Se&R:NPR$I`Dr,x,8ٲ-[xF1TfQϱm3'[x{x }/|υz`xg}}.wsc {Zg0SG$ǐnq}os3>G9t:Z:#qt5Mq$ݯi>L7si~}Yiڷk~<;+ܳl yُ4YAL׾5?Y0ۄiK?K_k"_#;DesSman׽? uA=vC]wEi߉ޤs !:mR1܇iAS`KmfUUQMpgތƸ/RM}iÿY*~7[8Q/`! MlO9)뜬 u@X<xTLU>sE~H1 Me¥9F shIJN -EľSԖIsYT+t1_PЦIL[w{9=9{Q!_,LT{t$f;@<$0 8Wh~8!!$}hPNm~(>KQ72#}C)rE>ʯ~TL{Mmfk1Ӗb[Ev1`_T^z׋.2\tJFKD<@ j*)Q'L92ucq= A gˑjjDQnFuLW{;tK^۵ K].26fu+@/szR;{ZI.!f{5T:4;7q=XiKrZaJz :O]_!qrC:^sT`JAXN\#Ux+g' Tp7<ZiPUyޠ>jQ|R=ʟ+E5ZAj4^%>8yp狟 )"5,|yIzAVI5p^/Nn<>Wi#_\y׼DNk\f5ż}A>utCt9BzPU* 4A_7ia'SCT K4R9E4%Q w9xr&*l T[h+'a#RPvH*YtFQ~ӳwnR_sPxL.O6̓\-wզLEd~j<9^ ߦ[ܧ cUpbQlhOn>}$B賟|`!&w#PabbG =#8h@hxř tEI$d !* ;*";"<dT@E EF@PA@0A/&"u_{sޜw2;;[{wU׭S$F0&r.eږYs0O@7.y F F 7ZjU~fD p[S;Z%@SOrP>sh́GUpJ RbM A(&BQA5 j R7?.9toK?]7{)D'?c'!2gP/B /Ӱ%țm;Z)pܜ׬3BDK|Z 5AJPī"WUcpIZqgBnOEqK{/^&Bm"3LЛ>MNZ]2T%QI:Zbu'hfI`_߾)bbFHvB v%P8-?ڳr֞3.E{}UkyWmWb6S[WVӼ8mॄRWCzDy-zVxutAop/C0!yH{[{yKB;yi;om>loM/z۵K=ӊM~EYyHyhCSUv}Z"ӲG!lGVZ7ʟt_ ^}uoȷl<٦KW>!+,f{2!?Jq͇L5Mo3Imѷm~oFߙ/Jgtd+U͔%먭>.'vi|KON "#!نA= h!`(x#4E $ gh7-bD'"%T  bx(H$XQT僠HRx$sT䍒xLx-mB0P$d-U5ίK/ $V*҃gH``$2;2!n&ø1ڤ_} z#ݓ`fh)ptL\]-IҕJgVӉ|0J7!>3{6?#U[F#4k "A֊ ̕5Sak8Mkr} z!h4 uz';PօFqڇj?np:FZpOpH}EN+v_߃S8bsy}wq>[Hh:;?Cxm_^j{q΋l+^h,m)D>Ӈci׾b蝝A ۫^n2i/;pV6Ddo[K,>TЋH0x_01$ O`l\([#vqfe,Sv6qCLiS>cLci7[7&4v{ƴM;d}s5FH[NQ22LY B#lq&6[Qd9fSO&%6]m,M%B36r2 Dj Ȳ)Ŧ2zȈ2;bMa߂U*:dn;cC~ю5v 7(kGlv ?e$۞'#6٪A:֧BomH]lcZFtMV.jcg|1k9tx fg\F3:RAK(V)^ρ3HRP"kmIgms:lQͤAk0%|sm@OQ`n-J~BJI.էtd#ߚҨJR zPgC3C:閭+Cq/ZH 52#EWQ͔f P}su)ݔPCC؄qf&TlíLnwaaR}LEdpOɽM hrxiLlqů޼ˈ~Igps"4,s"Z`ŦV~h>Bf=NJ [1ޠc]2sHa"Es-P "8D2Q0#PJA?UTIzPtr'Ւ@QiCCM%h AUG]UL%I,5h4Xu=u1ZErR(8B+vjUف6iMYuВ5]iCY-#BKSÚk̏:um|5˺o~WASx'էLu6p*˦ڒisJ3f9m#C:gWC}xC{mq4T*2hWC ZPF8u,(HA"FP7q2ۄS2"_GEoڡvk7]ymn4_u64:һ-fTmjj5HR0kJgA @$iZ57 m=#${ w⌸, pΛ f:+n0 ^Y6ھh<>e'w}N[x\>:3i'P@ٍI 74iݨ4iDN#V:t4iTNc:u4&=MՓ_O8_g|I.>sq\7ǹxu.sqѥO|jbui80<4@s;C{7N.;}v:ow}{ANj={^='_8q{oR_ EC1\ bAň.Vt1ϱcJ(W0m}qj7}qr~6wfONEQg;lQ9zD˦3qTwL jԢ&VtLVʴ5d/LOjҗf ><@!h7V|>0hOA.B|Ϣﳦލgn=AL*K.4LeV؏'ꛧyJ0SG$=hӽf4<[]kiӹfN7stg1O,"^u? NfNhw'4z36}Pwtõ=h_I]ϣ55Zi JR?ZH åkPhx~=(C, _κx^q.#VI*˙ZsmA @ك6ǓTi^XzЇwny60ҧPvu%hG1T)kR7"p{p b &)OG h*/F|*)WS9^q7P,A*z>KIi7a(ۂF(NUZI?RD"E4L@<8 ]c- . ]AGuj5z`;cH<)x./h| =JA,#X 9 *G}.C ECt9 b@BIaA'E@%vA$w{ f)V 3dLpRB-- mDAΔ4 oVOݒ.D`1޸t{auΑ1w|0Eggq#q_㜺R \7zӊa7e7s^;$mJiZB XW̽C,믎KjqImIZ;3QF܍jTW=KsFeVLvEHnaU o$h[]YR4g Xnk|۪ t\9(-i#ayXA`K=]ϙjRQ];M5Ѓ--!9/]Y%1ƖίmQҖ0{kc}w%uVXGv؟P\5jFMuY /m)mZ5N/]QGJ;WKbdY'C Xy~cϞ#W_hߏ^apМ_Y8>'3Ŵ% J^WW^V%\ݓJCoU㘫*!Qgi(>i  Ebӵ1GZ/,ІbEyGzh5lA6 xYxm:shm"ko`6H^9Z ^:5ׯAʒ"qA^kUKPM0LC#La`|rulIa(W|1S?'ࣂҰ#eeXY*!O)ByPhb#Ve} -5<+x}T_ߣ .N>E8!+3&e Gw&m,?Zb 겷I"2 ɋf'^r/'EaRǾ]ĵl/P,g1lEMiDz=|khIU[;iaP2 12m觚"RT$%f'0idG_/3w ~@L?ُ eb,%c9}J\4ֲ>7g#k+RpgcoYHwc]ml+N!e܎q dZs9NDfa %q_eJowQщ_M\4E/xr9rɷ&7Oc/##u>(` !P\GCƳtTm2Ko̾HE֛>ȧ1cVQ:v킶;^P}Ib0V?Qjq2s'~XC59&>6*lAg8v4vv lFX9<ї&Da{^}=]Y1V/( q1i+rw>yy4֭[;HՓ}po1cr\$ =fqc\fY3sz^rȫ\gv-󓯥!d>sBJs1hR*y_(K1I쑭Cvf/(Gw咬벊ZT Ѹ61/ pV*JZ(JξFI3È_ķA)YKDdvph b5 `)caeۄ1jKƲvg;05eY(dLk`YӢid^ݘct‡dcTҷ%ÝrT[x~.v>v~h_C-&2\i̧&PsLh wBu Frwx&'7/I X8njC%ݒhMph˲["=rL9KNF>kWnq&)v"$'e|L$~?,;Rd'^m|DZk/%ź xcg$e e@ jj-B O#uu р9<v$Ux> r'1O`O@ &#?!oB#Ꮱ(((ިH^xJL/ F{Ֆk-ϡ&% 3Tc_ jQZZ5#[z*=O#E191*ˈt;b*'[Y.i.:Wf%`%3 f2ybJUYC|ɗ] -xNt$p.1;lvwp{{{ ;GtA c+HWPx!Bl42d!m-\>^vFScfQXem+l*T/;G C-B3[ֶLF-wնbΖ|e7KVTP;7兒B^!(GyE?uJTExR>iQB_y %MHVB>EoѾ#wA/=}/?>#񑟈a~Yslg"$yg\\JqRrmK<2?{PyZ$$!Lh0yEN2Kô6f:TVb~醨%r!rp,hGa/PXl)g/>F]}(i|6$(A ʯh8s%Ln?}5's~,(ON.^b>9ĥ鰠bBL"Bqy ^e1^aIqn)bYfB9<ˋwkhϋ@uF*% cYHJHkRwq2v.ލ6d"fRbE ׉7lxП1J{1^yqHc'|#ުo]I60O٘X.Oy%(J#8\*ۤv Xnx,F]by _]nsdo<)R{UHzKuw\EώJo =G |6Nun鋩!͐Lįf0I3FR/2yJwA ț!`ς>8}#mqK Joژao1ҭ1ԿElq-Y9l>>x=(A ʯr}*:$Zka0Q鑾W|K8syGa3ҷŇr- Ufcd8-ׄ6opw%ḰwP_mʿ.^} "ƿO|#L//ȿp d?޷d\ qm A8"&?z{}ݱMܾJ櫿hai3J|swOZkq`y w[ۈJ܅<,} <OD~n~r`Js0U2F2Ǣ*G CPggbE6EcC w| TO@`DiωV=IS e30êaϢɅ̂Q̌L2ns"o2s\ ,Eƫ,I\JeLxfbfB̏E,8DLjg],c$Vʷm kbbyX_#(i zjns209C㝊w8݄>L㎑8Lhk73,qYyXxl*lb|!b҉<ʧctvqqWpSuHF3aJ”8mtuGFP6[ld8e5O].\U/qVmpFG'Om@9[42԰x4xMm/`;Ng{xY}}9. Z -=^"- 6`f--ZX&kfrY屺-eߪ* <UCuTb'Qގ.wHӘilGNF)a꯬B-Lǫd9BF )ֈvMe=5/G!/=G3m zuʯWWd f8vs>\hpWn\oۅu66Slz}}'tFe-&BCBU!Lu%eSĺ1ua6Ȍ:Ys^5݈-3j/فgpO#rEkD¢Fq v֗'_x:]vH>0cJmx~~SF`!1w5厖 6B H7&.$xV tI| #!TZ_Eb fY  [|QԈbFLU5ɘ?ZtDrD1sZ{sy{{D@ 4#Q.UJA`6kL!iPb^JYmL6B*yjj}Qq#RL OL}utZb급STjUHovQb;__cĉyz_z$rwGeqVc*T.*`tEݨZ=`*Y[lK5l mF25KW$ kF]dlӅSJ.=D4-EA{\nSk*GI{V*P& za'"1a]Sw+zW:S&+~^Cs } ol8pU3ØS؏XDY!R>PJ!f#vcdZHkc4FaE?jˠQ_GCh&8%K)CwMi ¸7&OD3͒$t>i3-4+Q]-'%U`</J41  \ncЇh ݎ[6 FYP+$nLq E(4, }-W1LhtA҃FKM޴LJ %rKdV2X$0M"-e\ 4>9xVnq^pD*f򰋬׿"?Y7EфXdu1EaTNGeMu,r{<}ů;H4g3*f4[!Լfss4 Ս|0=oAGC:(׵Ӧ\"_v.:nYN}]OE7`ZYn}9Jyf6be;h0r;v^0DH4v231Ia\|;%J- .o{ KOIz [mjWdu{V2_8NvM0TY9M:- 7Ms>s3NV{.Mѣ:Mt. gIhh[lκi淺G{4s$g@b24A(\l u7"KO;ڞ|DE:ҙq?h:ra跞W(|=:PqNک-6jڡf$Z}9,ҝXkA޽w] ZԐyO ̣)H񹎤O]su֋gh==KJMfo IWivсW#yۈ^8k5xϧ1^nXW~|zGtMC C`bºDc?:&e-4r+n7v)̅pˣei]rZr;ghHi.:z"eCT1ģuշ8:P^h(w4\{~Ypvzzt#n{Vh!7oo𗮻!L}^NZ<9ːfKn3ܿL^jz׹RX/)?˽j)\ dwwEjQ[:V3brA;. uF m/iך#h.A"M +}P"CP.#QoZzE ʖ`Z (E.`8x6 ((4Ɵv kh9]Қ>fTfy7 1 1 ˰o>(~8%B_ŝ]B#5fl!ޗKiF />\U}?|չR܃kv(  < g0SClip (MS_ClipArt_Gallery.20,Microsoft Clip Gallery0UClip (MS_ClipArt_Gallery.20,Microsoft Clip Gallery0VClip (MS_ClipArt_Gallery.20,Microsoft Clip Gallery0WClip (MS_ClipArt_Gallery.20,Microsoft Clip Gallery0XClip (MS_ClipArt_Gallery.20,Microsoft Clip Gallery0YClip (MS_ClipArt_Gallery.20,Microsoft Clip Gallery0 ZClip (MS_ClipArt_Gallery.20,Microsoft Clip Gallery}0 [Clip (MS_ClipArt_Gallery.20,Microsoft Clip Gallery0 ]Clip (MS_ClipArt_Gallery.20,Microsoft Clip Gallery0 ^Clip (MS_ClipArt_Gallery.20,Microsoft Clip Gallery0_Clip (MS_ClipArt_Gallery.20,Microsoft Clip Galleryk0`Clip (MS_ClipArt_Gallery.20,Microsoft Clip Gallery0aClip (MS_ClipArt_Gallery.20,Microsoft Clip Gallery0bClip (MS_ClipArt_Gallery.20,Microsoft Clip Gallery0dClip (MS_ClipArt_Gallery.20,Microsoft Clip Gallery0hClip (MS_ClipArt_Gallery.20,Microsoft Clip Gallery0!jClip (MS_ClipArt_Gallery.20,Microsoft Clip Gallery0"kClip (MS_ClipArt_Gallery.20,Microsoft Clip Gallery0$lClip (MS_ClipArt_Gallery.20,Microsoft Clip Gallery0&mClip (MS_ClipArt_Gallery.20,Microsoft Clip Gallery0'nClip (MS_ClipArt_Gallery.20,Microsoft Clip Gallery0(oClip (MS_ClipArt_Gallery.20,Microsoft Clip Gallery}0)pClip (MS_ClipArt_Gallery.20,Microsoft Clip Gallery0*qClip (MS_ClipArt_Gallery.20,Microsoft Clip Gallery0,sClip (MS_ClipArt_Gallery.20,Microsoft Clip Gallery0-tClip (MS_ClipArt_Gallery.20,Microsoft Clip Gallery0.uClip (MS_ClipArt_Gallery.20,Microsoft Clip Gallery0/vClip (MS_ClipArt_Gallery.20,Microsoft Clip Gallery00wClip (MS_ClipArt_Gallery.20,Microsoft Clip Gallery01xClip (MS_ClipArt_Gallery.20,Microsoft Clip Gallery02yClip (MS_ClipArt_Gallery.20,Microsoft Clip Gallery0\}Clip (MS_ClipArt_Gallery.20,Microsoft Clip Gallery0]~Clip (MS_ClipArt_Gallery.20,Microsoft Clip Gallery0_Clip (MS_ClipArt_Gallery.20,Microsoft Clip Gallery0Clip (MS_ClipArt_Gallery.20,Microsoft Clip Gallery0Clip (MS_ClipArt_Gallery.20,Microsoft Clip Galleryz/ 0DTimes New Roman0$$ 0DArialNew Roman0$$ 0" DSymbolew Roman0$$ 00DWingdingsRoman0$$ 0@DCouriersRoman0$$ 0PDCourier Newman0$$ 01   @n?" dd@  @@``   <OO!   / 012 44638 <* : >7BD8 F!"H#24?,-  1E9:(& /2$;.%d5/2$)0q(ch9d5/$/2$Wg[Ep0TO R9/2$}TQ[п\C/2$OM4Y J/2$oUttL M/2$򾖇ߘ.) }U/2$Sm3=4%-lOW/2$b/F4'L:N 'o/2$ \r(hKf-ux/2$MlO9)/2$w#PabbG =. /$/2$i1ĩ -gy;/2$pvI_*fM/$/2$1w5/ 0e0e     A@  A1 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E||@8 g4MdMd0 0( ppp@ <4!d!dX4g4:d:d0 0( p@ pp<4BdBdXL~? %O =J8Writing  Exception Safe C++$`  Alan Griffiths (alan.griffiths@experian.com) Work: Experian Limited Senior Systems Consultant Mentoring & development OOA/OOD/C++ Play: WWW, Java ACCU chairmanh-``>``->L       y Overview `   RThis talk breaks down into the following sections: What we mean by  exception safety The problems of a nave approach Guidelines and a rewrite Applying these techniques03`w`3w  N)Timeline   1990 - ARM: Exceptions (experimental) 1995Q1 CD1: Exceptions in language but... 1996Q4 CD2: & library not exception safe 1997ish - Many exception-safety articles 1998 - ISO Standard -  Exceptions safe   P*Some of the articles  fH Muller -  Ten rules for handling exception handling successfully  C++ Report Jan. 96 H Sutter -  Designing exception-safe Generic Containers  C++ Report Sept. 97 H Sutter -  More exception-safe Generic Containers  C++ Report Nov-Dec. 97 K Henney   Creating Stable Assignments  C++ Report June 98(4 3L[  H  F  6 :Writing  Exception Safe C++  `  What we mean by  exception safety The problems of a nave approach Guidelines and a rewrite Applying these techniquesL#`FT`" S w Call stack: a() to x()"`    a() calls b() & e() calls f() f() calls g() & x() throws an exception [handled by a()].$X`W X f() is exception safe if...`  The weak exception safety guarantee No resources are leaked The system state remains valid The strong exception safety guarantee If f() terminates by propagating an exception then it makes no change to the state of the program.j$`7`&`c`$7&]   Divide and conquer`  lf() relies on g(), h(), & , x() Objects isolate changes$7`6 7  Other definitions`   There are other definitions of exception safe. For example  deleteable You may have encountered others& Some references in the notesF/`W`/> <   @  2Recap:  exception safety *`  The  weak exception safety guarantee requires: Resources are not leaked The system state remains valid In addition the  strong exception safety guarantee requires: There is no change to the system state \0`8`>`(`08>(  :Writing  Exception Safe C++  `  What we mean by  exception safety The problems of a nave approach Guidelines and a rewrite Applying these techniques|#`C!`F3`"  2 w   How do we write f()?,`  !`     class PartOne { /* omitted */ }; class PartTwo { /* omitted */ }; class Whole { public: // ...Lots omitted... Whole& operator=(const Whole& rhs); private: PartOne* p1; PartTwo* p2; }; !`    W               Assignment operator`   Whole& Whole::operator=(const Whole& rhs){ if (&rhs != this) { delete p1; delete p2; p1 = new PartOne(*rhs.p1); p2 = new PartTwo(*rhs.p2); } return *this; }6!`                   The nave approach`  y Whole& Whole::operator=(const Whole& rhs) { if (&rhs != this) { PartOne* t1 = new PartOne(*rhs.p1); try { PartTwo* t2 = new PartTwo(*rhs.p2); delete p1; delete p2; p1 = t1; p2 = t2; } catch (...) { delete t1; throw; } } return *this; } Fz!`w (*                            L    a   PartOne* t1 = new PartOne(*rhs.p1); try { PartTwo* t2 = new PartTwo(*rhs.p2); delete p1; delete p2; p1 = t1; p2 = t2; } catch (...) { delete t1; throw; }4!                S I'nave approach - assessment   Good software engineering: So simple that there are  obviously no errors This approach: So complex that there are  no obvious errors H/./.  #8Writing  Exception Safe C++$`  What we mean by  exception safety The problems of a nave approach Guidelines and a rewrite Applying these techniquesxD`C`F`C  w !The guidelines  There are three rules: Destructors may not propagate exceptions States may be swapped without an exception being thrown An object may own at most one resource(  The revised example`   class Whole { public: // ...Lots omitted... Whole& operator=(const Whole& rhs); private: std::auto_ptr p1; std::auto_ptr p2; };6!`$B              $revised assignment operator`   Whole& Whole::operator=(const Whole& rhs) { std::auto_ptr t1(new PartOne(*rhs.p1)); std::auto_ptr t2(new PartTwo(*rhs.p2)); swap(p1, t1); swap(p2, t2); return *this; } !`                    A +assignment operator - again`  Whole& Whole::operator=(const Whole& rhs) { Whole(rhs).swap(*this); return *this; } void Whole::swap(Whole& that) { using std::swap; swap(p1, that.p1); swap(p2, that.p2); }6!RZL       y L(Recap: the guidelines  Destructors may not propagate exceptions States may be swapped without an exception being thrown An object may own at most one resource  .:Writing  Exception Safe C++  `  What we mean by  exception safety The problems of a nave approach Guidelines and a rewrite Applying these techniquesV]`C`F\  w ,A smart pointer `  arg::body_part_ptr<> When an std::auto_ptr<> is copied ownership is transferred body_part_ptr<> copies the object pointed to by the assigned pointerR``$6X      0  8 /Another version of Whole"`   class Whole { public: // ...Lots omitted... Whole& operator=(const Whole& rhs); void swap(Whole& that); private: arg::body_part_ptr p1; arg::body_part_ptr p2; }; !`@    $                0The latest implementation`   Whole& Whole::operator=(const Whole& rhs) { Whole(rhs).swap(*this); return *this; } void Whole::swap(Whole& that) { using std::swap; swap(p1, that.p1); swap(p2, that.p2); },!`L       } 1Specialising std::swap"`    p namespace std { inline void swap( ::example5::Whole& lhs, ::example5::Whole& rhs) { lhs.swap(rhs); } }q!`qb8         8 Base classes `   HHealth warning don t do this at home2`@ % ;Extended Whole$@    Whole& Whole::setP1(const PartOne& value) { p1.reset(new PartOne(value)); return *this; } Whole& Whole::setP2(const PartTwo& value) { p2.reset(new PartTwo(value)); return *this; } .!b     3      ?   $ class ExtendedWhole : private Whole { public: /* Omit constructors & assignment */ void swap(const ExtendedWhole& rhs); void setParts( const PartOne& p1, const PartTwo& p2, const PartThree& p3); private: int count; PartThree body; };%!%(  D                              A!ExtendedWhole::swap()      void ExtendedWhole::swap( ExtendedWhole& rhs) { using std::swap; Whole::swap(*this); swap(count, rhs.count); swap(body, rhs.body); }!$x       A      B"ExtendedWhole::setParts() ,      void ExtendedWhole::setParts( const PartOne& p1, const PartTwo& p2, const PartThree& p3) { setP1(p1); setP2(p2); body = p3; } !              8  E$ExtendedWhole::setParts()  8       void ExtendedWhole::setParts( const PartOne& p1, const PartTwo& p2, const PartThree& p3) { Whole temp(*this); temp.setP1(p1).setP2(p2); body = p3; Whole::swap(temp); }!x           e G%: Strong or  Weak guarantee?   Choose a design when designing a function Strong is more convenient for user Weak requires fewer copies and temporaries Document the library, class or function Implement the design decision correctly I don t know of automated toolsB* N p *Np  J&:Writing  Exception Safe C++  `  What we mean by  exception safety The problems of a nave approach Guidelines and a rewrite Applying these techniques$w`Cw w /R+Example for discussion `C  ~counted_ptr ptr(new T()); needs a counter allocation could fail so may constructor throw? and should it delete initialiser?J`Cb`" bL    `    ./( " % & ' ()*-23456:<@CDFH K!M"O#Q$'()* ` f33` 3f3` ___>?" dd@,|?" dd@   " @ `"  n?" dd@   @@``@n?" dd@  @@``PR    @ ` ` p>>0 % ; 3  (  F J  JZ  s *?PP fN +   + Z2  s *?+ U Z2  s *?  Z2  s *?+TZ2  s *?Z2   s *?+UZ2   s *?Z2   s *?+UZ2   s *?Z   s *?Z2  s *?J%tZ2  s *?%Z2  s *?j%  ND=(gֳgֳ ?P 3 T Click to edit Master title style! !.  Hd>(gֳgֳ ? 3 RClick to edit Master text styles Second level Third level Fourth level Fifth level!     S  Z>(1 ?`` 3 ?* 2  Z=(1 ?`  3 A*(2  Z<(1 ?`  3 A*(2N  6޽h? ? f33  Contemporary.pot"   !! "!(   >F J   JZ   s *?P Z   s *?Z2   s *?+JUtZ2   s *?+UZ2   s *?+jUZ2   s *?+UZ2   s *?+UDZ2   s *?+UZ2   s *?+:UcZ2   s *?+UZ2   s *?+[UlT + j  # + jZ2   s *?+ jU Z2   s *? j Z2   s *?+jTZ2   s *?jZ2   s *?+jUZ2   s *?jZ2   s *?+jUZ2   s *?jZ2   s *?+U#N        B   c BC DEF?pp"-<HbutP}@w,riiiigglu{rke\ApbSF=843k"S-:4!4 *&3: {q"h(a(a*^*^*^-\/V3S4S=OCMHMNJQJSHYCY?Q2Q2Q/Q/Q+Q+Q)N)N&HA= <)^X2!n`-J3ro@Z c     c B8CDExF?#'(,.#pbW UW#`,g3t7k7b7]7U3%.'nEw k^RG>!7#-!*$#(3>GLLw8i(\QF:/&-8?JXi{}u}lgccaaglnnnlllH8*yl ^SE84443 !* 8888:HWcnnnnr   !!$$$/8CPWY^bbbglnr!t#w&w*t,t1r5g1\&PC:!4&+,(1*5+6+:/:8:=<?ACJCJ?N=S=SGNSY[denune^SH;1&&+16:?HJJJJ?O,M7D>;G6U6`?kJvXer|{{* 4>?]Nv^n}}l\N?3$'2;BFKQV_l|zjXDXj|?bufV/FL2e}rbN>-#}#|#xxvj#_#W$M-37CYepw#=@@{  z   c JB?CIDE\Fd?*A:H>H>C:A:>,8%-"   -8*A/0@ Q[   N`gֳgֳ ?p  T Click to edit Master title style! !  H`gֳgֳ ? p  W#Click to edit Master subtitle style$ $  Z$a1 ?``  C* 2  Za1 ?`   E*(2  Za1 ?`   E*(2N  6޽h? ? f33 0 0dN(  d  d  fDz1 ?P   3 ]*     d  fDz1 ?   ( _*   d d c $ ?  (N d  f$z1 ? @ ( RClick to edit Master text styles Second level Third level Fourth level Fifth level!     S  d # ldz1 ?`P  ( ]*    d # l4"z1 ?`  ( _*   H d 0޽h ? ̙33X   @(  l  C t!zP  ( l  C !z ( `  c $A ??P  H  0޽h ? f33  P(  l  C  zP  z   C T z<$ 0 z `  c $A \??p8 \H  0޽h ? f33 # `(  l  C zP  z   C z<$ 0 z `  c $A ??` 2 H  0޽h ? f33 $ |p(  l  C #zP  z l  C $z z `  c $A ??@p H   c $A ?? =8 $D  0H  0޽h ? f33X  (  l  C %zP  z l  C T&z z `  c $A ??p8 H  0޽h ? f33G   o( @  `   c $A  ??#p      f1?P0 ` ,$D  0l  C TzP  z l  C &z z Z   S   ??pp     3 r'z1?  p ,$D 0 x() line 1 . . . g() line 183 + 8 bytes f() line 195 + 8 bytes e() line 209 + 8 bytes . . . a() line 324 + 8 bytes main() line 360 mainCRTStartup() line 257 + 25 bytes    H  0޽h ? f33D  $l(  $l $ C t'zP  z  $ C tz<$D 0 z  $ c $A ?? 8 $D  0 $ c $A ??P  8 $D  0H $ 0޽h ? f33X  ((  (l ( C $P  z l ( C  z ` ( c $A ??@  H ( 0޽h ? f33  ,(  ,l , C P  z  , C D<$D 0 z ` , c $A ?? `  H , 0޽h ? f33  0D(  0l 0 C P  z  0 C d<$ 0 z H 0 0޽h ? f33d  (  r  S P  z r  S D z `  c $A  ??p8  H  0޽h ? f33X  8(  8l 8 C P  z l 8 C  z ` 8 c $A !??`  !H 8 0޽h ? f33v  (  l  C d0  z B  s *޽h ? f336   <^(  < < c $A ??Pp 8 $D 0l < C P  z  < C $ <$ 0 z V < 3 r1?p/,$D 0 .Don t do it this way!!!$   < c $A ??p 8 $D 0  < c $A ??  8 $D 0H < 0޽h ? f33V    @~(  @ @  f1? ,$D 0 @ S `0 <$ 0 z l @ C P  z  @  f1? ,$D  0 @ C d`<$ 0 z H @ 0޽h ? f33 ' 0( w l  C P     C D<$ 0  `  c $A ]?? [ ]H  0޽h ? f33d  @(  r  S P   r  S   `  c $A ??p8 H  0޽h ? f33   P <(  l  C dP   l  C   `  c $A "??p 3 "  c $A $??p8 $$D  0  c $A &??@p 8 &$D  0   c $A '?? pp 8 '$D  0H  0޽h ? f33   `L(  Ll L C $;3P   l L C ;3  H L 0޽h ? f33   p(  l  C ;3P   l  C D<3   H  0޽h ? f33  $(  r  S =3P  3 r  S d=3 3 H  0޽h ? f33 " |t (  r  S $>3P  3   S >3<$ 0 3   c $A (?? `8 ($D  0  c $A )?? @8 )$D  0  c $A *??0  8 *$D  0H  0޽h ? f33d  (  r  S ?3P  3 r  S @3 3 `  c $A ??p8 H  0޽h ? f33X  (  l  C d@3P  3 l  C @3 3 `  c $A _?? & _H  0޽h ? f33  (  l  C A3P  3 l  C A3P` 3 H  0޽h ? f33  (  l  C DB3P  3 l  C B3` 3 H  0޽h ? f33  0(  0l 0 C dC3P  3 l 0 C C3 3  0 c $A ,??|@8 ,$D  0H 0 0޽h ? f33  D(  Dl D C $D3P  3  D C D3<$ 0 3 ` D c $A -??p 3 -H D 0޽h ? f33  T(  Tl T C D3P  3 l T C DE3 3 H T 0޽h ? f33|   l(  lr l S 4G(0  3 B l s *޽h ? f33   t(  tl t C H(P  3 l t C I( 3 H t 0޽h ? f33   (  l  C zP  3 l  C z ` 3 H  0޽h ? f33   0(  l  C tI(P  ( l  C I( ( H  0޽h ? f33l   @(  l  C J(P  (   C J(<$ 0 (   c $A .??@P8 .$D  0  c $A /?? P 8 /$D  0  c $A 0??P P 8 0$D  0  c $A 1?? P 8 1$D  0H  0޽h ? f33d ! P(  r  S L(P  ( r  S 4M( ( `  c $A  ??p8  H  0޽h ? f33* aY` ,( w ,  ,  f1?0 ,$D 0 , S M(P<$D 0 ( \Z#include int main() { struct local_file { local_file() : f(std::fopen(__FILE__, "r")) {} ~local_file() { if (f) std::fclose(f); } operator std::FILE* () const { return f; } std::FILE* f; } file; char buffer[1000]; if (file) { std::fread(buffer, sizeof buffer, 1, file); // Processing that may throw an exception } return 0; }$[!Z$        %  1    O    M   ,  f1?0 P ,$D 05  , HM( 1?`2 ,$D 0 struct local_file { local_file() : f(std::fopen(__FILE__, "r")) {} ~local_file() { if (f) std::fclose(f); } operator std::FILE* () const { return f; } std::FILE* f; } file;"   (  4         B , s *޽h ? f33 ( p(  l  C tO(P  (   C O(<$ 0 ( `  c $A 2??P3 2H  0޽h ? f33) @8( w   H4P( 1?N &Alan.griffiths@experian.com http://www.octopull.demon.co.uk H Muller -  Ten rules for handling exception handling successfully  C++ Report Jan. 96 H Sutter -  Designing exception-safe Generic Containers  C++ Report Sept. 97 H Sutter -  More exception-safe Generic Containers  C++ Report Nov-Dec. 97 K Henney   Creating Stable Assignments  C++ Report June 98 D Abrahams - "Exception Safety in STLport - http://www.stlport.org/doc/exception_safety.htmlj=x0x< 3]          [  H  F  8         B  s *޽h ? f33 0 hJ( \X hR h 3 d    h C dd @   XThe difficulty in writing exception safe code isn't in writing the code that throws an exception, or in writing the code that catches the exception to handle it; it is in writing the code in between. How do we want such code to behave? And how do we write it to behave that way? I m going to deal with both of these questions in turn. Imagine for a moment the call stack of a running program, function a() has called function b(), b() has called c(), and so on, until we reach x() which encounters a problem and throws an exception. This exception causes the stack to  unwind , deleting automatic variables along the way, until the exception is caught and dealt with by a(). We need to write each of these functions so that something sensible happens as a result of this process. If we can achieve this we have  exception safe code. C  C H h 0޽h ? ̙33 0 zl(  lR l 3 d   ( l C dd @  3   H l 0޽h ? ̙33R  0   p (  pR p 3 d     p C Ded @   ~ Consider a typical function f() somewhere on the call stack between a() and x() when the exception propagates through it. How do we want it to behave? Well, if f() were to handle the exception it might be reasonable for it to complete its task by another method (a different algorithm, or returning a  failed status code). But for the moment we are assuming the exception won t be handled until we reach a(). So& f() doesn t complete its task. If f() has opened a file, acquired a lock on a mutex, or (more generally)& If f() has  allocated a resource then the resource may not leak. If f() changes a data structure, then that structure should remains usable - no dangling pointers. Or generalising& If f() updates the system state, then the state remains valid. I m going to call these conditions the  weak exception safety guarantee . There is also a  strong exception safety guarantee which places an additional constraint on f(). If f() terminates by propagating an exception then it has made no change to the state of the program. There is a more formal definition of these exception safety guarantees in D Abrahams paper "Exception Safety in STLport" [http://www.stlport.org/doc/exception_safety.html].g  %    Q        I  ?  r       0      T          H p 0޽h ? ̙33 0 aY|(  |R | 3 d   _ | C ed @   uIt is impossible to implement f() to deliver either the weak or strong exception safety guarantees if the behaviour of the functions it calls isn't known. This is particularly relevant when the user of f() supplies the functions to be called as callbacks, implementations of virtual member functions, or via template parameters. If we assume an object-oriented design with fully encapsulated data then each function need only be held directly responsible for aspects of the object of which it is a member. For the rest it must rely on the functions it calls to behave correctly in respect of the objects with which it interacts. Fv    x H | 0޽h ? ̙33^  0    (  R  3 d      C dfd @   There are other ways that functions can behave in the presence of exceptions and variations have been tried. For example, if we assume for a moment that f() is a member function of an object obj then after an exception we may have: obj is in an invalid state and the only operation supported is deletion. You may have encountered other& My experience is that the  weak and  strong guarantees are powerful enough to build systems with. (I also hope to demonstrate that they are attainable.) These references appear elsewhere in the slides, but they are repeated here: H Muller -  Ten rules for handling exception handling successfully  C++ Report Jan. 96 H Sutter -  Designing exception-safe Generic Containers  C++ Report Sept. 97 H Sutter -  More exception-safe Generic Containers  C++ Report Nov-Dec. 97 D Abrahams - "Exception Safety in STLport - http://www.stlport.org/doc/exception_safety.html JU #&N. 0   &    H  F          H  0޽h ? ̙33 0 @(  X  C d     S gd @     H  0޽h ? ̙33X  0 P(  R  3 d     C gd @   rIt is time to consider writing an example function, specifically the assignment operator for the following class: ss s H  0޽h ? ̙33 0 z`(  R  3 d     C hd @     H  0޽h ? ̙33  0 XPp(  R  3 d   V  C id @   Historically, there is a  canonical form for the assignment operator that looks something like the above. This style of code pre-dates C++ exception handling and is not safe. Either of the  new expressions could reasonably throw leaving the p1 and p2 pointers dangling. In fact, unless we assume that deleting the old parts won t throw an exception we can t even produce a  destructible whole. (Presuming that the destructor attempts to delete the parts.) [FWIW This assumption is a reasonable requirement - we ll come back to it in the next section.] An obvious reaction to the problems caused by an exception being propagated is to catch the exception and do some clean-up before throwing it again...Fk8 }  H  0޽h ? ̙33  0 V(  R  3 d   3  C id @   d An exception in the first new expression isn t a problem - we haven t yet allocated resources or modified the system state. If an exception is propagated from the second new expression we need to release t1. So we catch it, delete t1 and throw the exception again to let it propagate. The two assignments are of base types (pointers) and cannot throw an exception. [Does anyone want to volunteer the code to handle an exception being thrown by one of the delete expressions? - For a simple case like this I think it can be done; but not on a single slide.] Given the assumption that delete expressions don t throw, we have some code that meets the strong exception safety guarantee. However, it is getting messy (we ve doubled the line count), and this was a simple example!"    H  0޽h ? ̙33F  0    ( @ Q@ R  3 d      C jd @   . I ve already shown a case where exceptions being propagated from destructors is problematic, there are other problems. For example, e.g. during stack unwinding an exception can lead via std::unexpected() to std::terminate() and the program aborting. There is no pressing reason to allow exceptions to propagate from a destructor, and it severely limits what use can be made of the object concerned. Don t do it! The second rule isn t obvious, but is part of the key to exception safety. Even if a class owns resources, exchanging the states of two instances should be possible without allocating (temporary) resources or throwing an exception (if the allocation fails). For example the STL containers provide this facility by overloading std::swap(). We ll see how useful the ability to swap states is in a moment. The third rule addresses the cause of all the messy exception handling code we ve just seen. It was the fact that creating second part might fail by throwing an exception that doubled the number of lines in the assignment operator.H *  H  0޽h ? ̙33$ 0 t(  R  3 d     C Dkd @   In order to conform to the rule regarding ownership of multiple objects we ll delegate the responsibility of resource ownership to a couple of helper classes. [I m using the std::auto_ptr<> template here because it is standard, not because it is the ideal choice.]. L   N H  0޽h ? ̙33 0 D( @ R  3 d     C kd @   RNot only is this shorter than the original exception-unsafe example, it meets the strong exception safety guarantee. (Sadly it doesn t compile with Visual C++ - but a strategically placed  usingstd::swap avoids the bugs in its name lookup.) Look at why it works: Everything that may throw is done before changes are made. Each resource has an owner whose destructor releases it. The destructors for the temporaries are called if the function is left via an exception (or by a normal return). Oh, by the way I ve not forgotten about self assignment - think about it. [Articles on assignment by Francis Glassborow Overload 19 and by Kevlin Henney in Overload 20 & 21 and an article by Kevlin C++ Report in August 1997.]>  0L]     &   H  0޽h ? ̙33 0 z(  R  3 d     C Dbd @     H  0޽h ? ̙33 0 z( @ Q@ R  3 d     C bd @     H  0޽h ? ̙33 0 z0( U R  3 d     C $gd @     H  0޽h ? ̙33 0 z( U R  3 d     C jd @     H  0޽h ? ̙33 0 ^V(  X  C d   V  S d @   TActually, I ve been cheating slightly - if Whole is to obey the  rule of least surprise it will not only have an assignment operator but also a copy constructor and (given the earlier discussion) a swap() operation that doesn t throw. Using these the assignment operator can be written in two lines [above]. This doesn t mean that the previous example was wasted - the techniques are applicable in many circumstances where several parts of an object need to be updated. However assignment is a special case which requires updating the whole object. I m going to come back to the subject of writing the copy constructor and swap operations, but first I want to replace std::auto_ptr<> with something more suitable to the needs of the current class. We will also look at the impact of there being a base class. X+@+    H  0޽h ? ̙33 0 (  X  C d     S td @     H  0޽h ? ̙336  0     (   R   3 d       C d @  z This is part of my library of smart pointer types which is available on my website, like std::auto_ptr<> it manages ownership, but it has different semantics for copy construction and assignment. When an std::auto_ptr<> is copied ownership is transferred. These non-standard copy semantics cause problems in a number of areas. For example: in the current case they don t give the compiler constructed copy constructor for Whole the correct behaviour. body_part_ptr<> copies the object pointed to by the assigned pointer. [There are also a few other differences that don t concern us here& If appropriate the copy can be made using a make_clone() method with a little extra work from the user, and the effect of dereferencing a const pointer is a const reference.] [For those that have read Kevlin s  Coping with Copying in C++ article in Overload 33 arg::body_part_pointer<> is an implementation of Qualified Smart Pointer that incorporates the ideas mentioned in footnote 3.]<FY\%7p Rd7J    p           '   4  | H   0޽h ? ̙33~ 0 >6 $(  $R $ 3 d   z< $ C d @  z Rewriting the example again using arg::body_part_ptr<>, we can allow the copy constructor to be generated by the compiler (unlike auto_ptr body_part_ptr  does the right thing . We do need to provide swap() and assignment operations...`"L /b!     S     S H $ 0޽h ? ̙33  0 h ` 0( (  @ (R ( 3 d   zf  ( C Td   z  , Does Whole support the strong exception safety guarantee? The default constructor will be exception safe if the copy constructor of arg::body_part_ptr<> is. (If you check the documentation you ll find this to be the case.) The Whole::swap() member function will be exception safe if std::swap() doesn t throw exceptions& The default implementation of std::swap() uses copy construction and assignment. This is good enough for base types and simple value based classes but if used with a type for which either of these throw then std::swap() will (1) throw exceptions and (2) will violate the strong exception safety guarantee. The authors of the standard library have addressed this issue by providing partial specialisations of std::swap() for the STL containers that call a non-throwing swap() member function on the container. I ve done the same for arg::body_part_ptr<>.& So the Whole::swap() member function is exception safe and also conforms to the  doesn t throw requirement that allows Whole to be used within other strongly exception safe classes. The assignment operator will be exception safe if both the copy construction and the Whole::swap() member function are. There is just one more thing that ought to be done to make Whole a good citizen in the exception safe world. Any suggestions?>@zK +    1: d Q>x     .        H ( 0޽h ? ̙33 0 @8@(  8R 8 3 d   z 8 C d @  z N~If a client class attempts to swap two Wholes the default std::swap() implementation provided by <algorithm> could throw - we need to provide a safe overloading of std::swap(). (The namespace ::example5 is where the last example fragments happened to reside.) [Generally speaking it is a bad idea to introduce things into the standard namespace - it leads to undefined behaviour - but since we don t introduce a new name into std this is allowed.]@'  8    H 8 0޽h ? ̙33^ 0 PP( 9 PR P 3 d   z P C d @  z &There are two important categories of classes: Value based classes (which can be copied, and instances are distinguished by value), and Reference based classes (for these a pointer or reference to the class is copied and instances have an identity rather than a value). There are other categories, but the Whole class I ve been using is definitely a value based class. OTOH issues with base classes are more frequent with referenced based classes supporting a polymorphic hierarchy. It is very rare to derive a class from a value based class, it is even rarer for it to be a good design decision. To avoid introducing a new example I m going to extend Whole.R/`e@3U     H P 0޽h ? ̙33B 0 `\(   \R \ 3 d   z \ C 4d @  z JAssume that Whole has a couple of mutating methods - setP1() and setP2(). (J@J K H \ 0޽h ? ̙33  0 pp"(  pX p C d   z p S d @  z $The examples we ve looked at so far are a sufficient guide to writing the constructors and assignment operators. So we are going to focus on two methods: The swap() member function and, A setParts() method that updates the parts.    # H p 0޽h ? ̙33! 0 @8|( D |R | 3 d   z> | C Td @  z Swap looks pretty easy - we just swap the base class, and each of the members. Since each of these is a non-throwing operation the combination of them is also a non-throwing operation.  H | 0޽h ? ̙33" 0 N(  R  3 d   z  C d @  z \ Writing setParts() looks equally easy, Whole provides methods for setting p1 and p2, and we have access to body to set that. ==>*Is this method exception safe?*<== [It is, but it only supports the weak exception safety guarantee. - Consider what happens if setP2() throws an exception?]    H  0޽h ? ̙33$ 0 <(  R  3 d   z  C td @  z JThe way to support the strong exception safety guarantee it to ensure that nothing is updated until we ve executed all the step that might throw an exception. This means taking copies of subobjects and making the changes on the copies, prior to swapping the state between the copies and the original subobjects. [This is the reason that non-throwing swapping is so important.] 6   g   F H  0޽h ? ̙33 % 0 t l  (  R  3 d   zr  C d @  ( Should we always implement the  Strong guarantee? I think you ve seen enough to realise that it is possible. But the strong guarantee is costly in resources (more memory for the temporaries, more code to manipulate them, more time to execute them). [FWIW  deleteable is even cheaper to implement - but it makes client code more complex and can impact system stability and maintenance costs. I might use this in classes used internally by a library, but not in interfaces the client code sees.] Whatever decision you make, the user of the code needs to know and understand it. Currently, the language has no direct support for validating exception safety and I know of no automated tools that help. (In fact the support that does exist - such as throw declarations - is actively unhelpful.) Choosing the right design is a matter of negotiation between the users of the class and the implementer. Validating the implementation is a topic to be addressed in code reviews.$d_6   i   L H  0޽h ? ̙33& 0 (  X  C d   (  S d @  (   H  0޽h ? ̙33( 0 1(  X  C d     S d @   3   H  0޽h ? ̙33$) 0 t( @`P@ R  3 d     C cd @   \It has taken a long time for exceptions to be integrated into the C++ language. They were described as an  experimental feature in the ARM and had been adopted into the language definition by early 1995 when  Committee Draft 1 was circulated for comment. However, nearly two years later when CD2 was circulated the library description didn t address exception safety. Following the publication of CD2 it was apparent that exception safety needed to be addressed and a number of articles were published on this theme. (There are references later.) When the ISO C++ standard was finally published clauses were in place guaranteeing the behaviour of the library in the face of exceptions.  H  0޽h ? ̙33* 0 4(  R  3 d     C $dd @   BJust some of the articles...  H  0޽h ? ̙33' 0 z( p R  3 d     C $jd @     H  0޽h ? ̙33+ 0 JB( ̙33 R  3 d   (H  C d @  ( pThere are a number of possible ways to implement counted_ptr& Prevent the constructor throwing exceptions (at the cost of possible exceptions in copy ops - e.g. assignment) The constructor throws, and the user code is responsible for deleting the T. Should an exception occur, then the counted_ptr deletes the T.>969     H  0޽h ? ̙33. 0 z (   R   3 d   (   C td @  (   H   0޽h ? ̙33:/ 0 8(  8R 8 3 d   ( 8 C d @  ( 0A local class can be used to release a resource used in a function. By releasing the resource in the destructor we can guarantee releasing the resource in the presence of exceptions. In most cases it is better to produce a complete wrapper class rather than the rather trusting implementation shown here.$1  e    H 8 0޽h ? ̙33xVLUe?QAEP"dgA'D>|>[0 F%gn֚:5jaVRb;^ Zm5~w}|9~{jzK S@IAЧ 1@?K" )3ϵo̅b|4Xɣvn!1T?御pmzFGݒ k)._%K?e[!Pxznخܐ͑# 4T=PS=]1o>: a5?!hfVscAQg0Ca``3̌`F moqs8y'399yo-m۹vU*\-.-.9\’i^cfO|ּ<8qˤEe7{蟫䪻`8 l{Vej-ҥ Y>ayj:'Qe m4?$ܖgggP3_͵T^oAׂDZI?TfmUgiJim;HI5%10TC yf C< c6 $|a` 0]˲dHq:(=iyU-!ۭ&֢!6򩞲-D@.e6R<{C4vJ@RL0nb$8Am 4N"6MxVMh!.Plr,)TXNa=mA4j [qV© sFba9lǓpul0݀ڇ hAFg沗S1Z';Y7x_-m{e#$b ipgzolF51a 2}PlnJef$,ݦUYf6Bs0/3ƚ1^ g3)MEy)l.nIJ45=eSO>x2^:ji8(ȱf3LbD/yh 3CXڨGSF rjal݃tۃH:ʡE;yE$k 9S^.rhxj^#N Jǔ"  wSՏyvDhZ&E|G e"WIK IP[kvGAaՌ-sV|jA<`U1Ϭx~UYgu&,ffdk|UcE xY؝eU?wp'%]9%W/8o^xҒs$e%/ZV\,/*k\/Wu>&W8IC]NpZ_ҖTeTn.D\vB:9 {ыs xWyxW?D#2H*b5b bbQK͠GJ-3D-c_=&Z0Zߝ~"?=ܳ{p :KPryc7\Odaa'E?OsoE"W'64H(@iăW)@#&g-Ѻaύ?B6v(SSxL-;Mm*U^{wݣrPRhUp=>!h}J{*+M=З^ǥaG윶_'+l>vgadQ {CKG`E1EqE E"Tc"L9EyEy Oʊ*jձ"R@hHAXDThFj#ov>^#qАAB ;~bRHn%pyX7;jMxX,rsboI(48>z3#W;R} YS>+e4uej14{ddz=#kbxhtmѪ7Uo]n 跿u;lNa,͕{OK5Y6噳/<=9 vr8&LUQ{5f>Jlwy-њZ%M8Mq a$rIZMw<syFnLx3qlsӈK0.b"_J^g=6~luK&bUo jT7TgR/K'!цGsx4&,;Пb4q ~&LC6|ة24K:ô2y>Z!~{R-xreaH^ΐ"jK>WhԞjKcDrp=.ǯ6/G[^!MsMxO#Tm5Q/@o/oD:W)Wh1*br 1S1͚c(avǬ֓|zfA}оdwj&MFd+{y9fYO.SrRL~hh&'Mg=4o@:nGnFvC򨝥T^nmjlhk`b=4JWу21򘷨V&ul 寥 HޙL;1[1x:tL?c"!o H0D )l L-n.bsNw%#թ<^XJ]9.B(2ı4F;ݻ9fcv4 7ITͨZTWM4U1_cji0󨓊}SrϹeݜ݃g>{gnx2HmjX}Ym^m6iضe_jDÆf]sL켣z` ҔۓbW:ƺx&Eij#?kd#|BO Ol7 xtVEߙb H I J(b0 5 @E`aAD@" X94A*(R4)r<–?ϙ)̝sлwY1c\Z \SE@VDr+O%Cl~?y E{|+(TFĸ믂Lw5xoxiGaum_OPFEy-K) b{)е~q‡\9hP;[SH²*ߐQ;?w`о/>u۞[7`RN'w )K;@yx/#PT$"IRT#Ѥ:3$H Mꐺ-O I#Ҙđ&)'wҌM=v}R|"N³{[ʠ̑sUA٭FܦС v<[z;K FY=UdXSYqWǓ NwH NjI!]w' }1ؗ`Nu*G#j|T1WP\EYcb, Tg7P}ަκ%ir R{Uj{KXjc,sc cXN wیZwg!, nlsSm-n2{9vK7ϻ ؿ68n4fQ,,2DW7$q]#-|rAZYi~.3wD$] I9(`1$X$b ֘$cSx鈱N NAҏ<@tf ^餣R!Ag|B pV`CW8N8{!pN!T*TxW Ju/pH% 8ӗd4Ld>SأVbڀj;^Rou3qQǼzj[˶!ZGTT f**@TWͼ+}KBjXιjJИkpqhb8~-Q5P[U#QW5T cr( X$.|)pZ^1Ydr8+K/y.K6Ju,*/اcq.PR-ɹrQWGT9+I򩴐I8R_>r9)QrL*! }RNvK()-{ɇbo=/ȧ#d~^G9lA^7딙[6 lіf-چ9$dSj6`2QXe?k29Xa3vx.O۵XjbC ̳g0~nb &o1^h۫hVQVg/CEQΞ(.1}1^]9ӷ ,BKf*.YL_;"kSD&2kngR̃'ȷ;v5mȗƕM4^jM"ZhmPU)+T~?kHİ'4=)Tq<0Nq-mEE8s_ξC}Hji#G0(ӗj|YرpGBc>pqg3f][ Y'jضUzBnF)pn[V$}>/ȏ>_V{}r}|iwo=sRzxVkhU>>mR[TjLRuA & f1Ck +lI!UP1 6Q 5V%0(ΝϹ3gcCY>̽w_~aYȑ]n+cYֻn=mJ4ns"(nDU_?xa/લ c~P}#s%sxÙJ~ю5vOiF $D2:%p!.]{zXk ).F>i C}r7&*=קW92Ca4& wrmvb3T~ϞYkU%[blX'  //]rDtB>fV@'&&yn>@8:WwpZ٤e_0li\WҺh1__؄xolY j>vf٠vI4 &sv趎Қc=];DB}UE,;jk Y}D1Gz4gdJ̾X%N)RyK LX[hW,m G}ZCpgn@bX,李 80qF9W+˔9c2Þ/%N䪬쎶x6*8߫Z>/obH6kqip3hq wv>>|0@ZxVkh\E>3wIvS[TjLRuA MKb$׸V6ttBD1 6Q 5V%0{=g}61?c{ssfb̩#{AM/G3!wMukZ_̈́ gGPΝ3k ~1 s[Ue 2EGrsyC묞҄Z x&qcʌg #Ga#@-+3J9=4izUA )}P" rWl@b3 Nl:mGJM;Mx+6Dv  jw D܅ZO42Ky;F"~OS8<2[;eh!.]{|wk{!LT^Q^JL]=G7&jG92C)]oH3(;fq#>ϞkUA1kf6]6J՗9p:!/3*S87/v ]ifllJûu8jlRgh떎..Zt E6!c^=cV0¾vxϖY6^MqhSO177WWZtLԋb^1Ѩ>ÎiZZGuE=5m,1LzC1sF9R3sq3jFiX^[V JN,fLv*Ŗo[. U$ߕ__ɲh.vJ۸ڜ kդ_~F_Ԛ-H=ymA CO,\J˵Ӹf]y95z+ʪ–wfU|.dx LKb-INQN|&W[WUgD&VΧjR u8Umh#bOjP*SZwzڡ]q_9_`T=E}5Kǧ!W>(#jϲfLߟ)E*o99Ik uAS}/=͡p}@K0 "aFb}]=cAڴ6冗;*':ʽJ >gQ&3Z~rbAAɚ\/hKw`=P6^U+WQ}+p>M^ˍO=oMๅ 1]ZZxVkh\E>3wIvS[TjLRuA MKb$׸V6ttBD1 6Q 5V%0{=g}61?c{ssfb̩#{AM/G3!wMukZ_̈́ gGPΝ3k ~1 s[Ue 2EGrsyC묞҄Z x&qcʌg #Ga#@-+3J9=4izUA )}P" rWl@b3 Nl:mGJM;Mx+6Dv  jw D܅ZO42Ky;F"~OS8<2[;eh!.]{|wk{!LT^Q^JL]=G7&jG92C)]oH3(;fq#>ϞkUA1kf6]6J՗9p:!/3*S87/v ]ifllJûu8jlRgh떎..Zt E6!c^=cV0¾vxϖY6^MqhSO177WWZtLԋb^1Ѩ>ÎiZZGuE=5m,1LzC1sF9R3sq3jFiX^[V JN,fLv*Ŗo[. U$ߕ__ɲh.vJ۸ڜ kդ_~F_Ԛ-H=ymA CO,\J˵Ӹf]y95z+ʪ–wfU|.dx LKb-INQN|&W[WUgD&VΧjR u8Umh#bOjP*SZwzڡ]q_9_`T=E}5Kǧ!W>(#jϲfLߟ)E*o99Ik uAS}/=͡p}@K0 "aFb}]=cAڴ6冗;*':ʽJ >gQ&3Z~rbAAɚ\/hKw`=P6^U+WQ}+p>M^ˍO=oMๅ 1]ZZxVkhU>>mR[TjLRuA MKb$׸V6ttBD4b@$6Q 5V%0(ΝϹ3gcCY>̽w_~aYȑݠn+cYֻn=mJ4ns"(nDUC_?xa?cલ c~P}#s9s]g*yF;= wC/?MR](3~7hF ~<}p-_nΨRL˵O|f{a`pߗ+[W1B_(CP"!#A^(8lH7!nFlނ㭈Ոہ8PC@܁q=Z TL.P3틆MpX@$?aMw,1G qcֻZ{IqaMkDeꓫ51Pi-?>&6ָʑyP 1inϴDiB8~Z3r(hf:Tl~U})# 12:>11sa"ݥhɸ'_Ӛ&(k~a똞NrEka&ş}>>`d{ PWٶ3KI01.m 6:Jk)vA {gQ=W[hgZ]0%ǐI'a 13κgt%532]㢶hΙmդ9BkfdǭViV5.@^E~!]&lzȋVҚi-rOݴVCecEiˌԛWߦDiP82Υ\8;-*9qgVHĮ'b2#{/UIv &:.60MN:M|SkԤ66fvMا)JZw׷"OʛyFθPWZu|2b|L=,i&Ȕ}oJ RġpWO45cѮXB`;X?; X4ճ3M;Spx_U/S?| {޿8ee*K;oMWk˵f}^ߊ oHށ'Πݷ&+qȸZxVkh\E>3wI6m]5&A $ f1Ck +lI!UPR IAZQ 5V%0({=g}61?c{ssfbs#{AM/G3!wMukZ_̈́ gGPΝ3k Ap~1r[Ue 2EGrk=3<#묞҂{ x&.J6GvC/F#+3J9=4inz| UF(}P" rWl@%b3 Nl:mG*M;Mx+6D5v "w D܅ZO42Ky;쎄AwK(t? c2ڻe/vɮ=f̵NZC&*(P\%Mx#NbcGz7%twrivd3T^ϞvkU%[bllX'  /0/rDtBfT@c7̓tr V.NMcff&JZY:F G<|Heg D`bR<+:lLt,1%WET4ϰZ@}Qh%:`VHL ^ ĈsB?ռN\tڢ;{זUzƬ 9,Z[8nywyzח!/ZŴKk]6<6g5Z 闵u&GK-#Rw^}BtxG§A8Ңr4@dW^vN ފĝY7EGA @X ʐ*ы@ b`f5` njuX'̴V8e(`gHb"nB!V_fڛÐy*C1$Ae O ' (j!V?D` d2)2rk3~H~G29y\C0c vL./O+Qp,p,*QpOI-dC T--M >ѩiiɩ V1 Jb "1Ezi +:. 1xl\^qs9ȶ)@>UC|! qg'@~Ϗu̍`1J@׷rHF=B!t*IK/Q0 `6,lPgGRˊlN$6 z +ٴ ; A!P77txtV׶-HpwVݝ  VhR(Z(RܥBoIOo/q{c0k/k"=q<%R0*i|htO}6ޯx8a<@BQẸh :bX 6W$ A"$IA2 %HR4@zd@fd@v@n@~P@PȢ3+_IИ|WaʬK|o3"ﳦ,icݯx?'>fڛZܼNUxǺ>нSxw =?/0@gӗ~ߕ0ۉO(]c[Yv]]s۠ztW[瞥zUlݭ[^_n?QFkdkkvйm{S޿uPf{ ;wN\Yu:~G_To=N%0EL3|{>k\߂+Enls#R{/faoC.Z 8w | wFoz.ۊČ=NX߯oGr=;',oti7?H:bH6vaT11w4fܦ}Fa˾ >yyej\{Z&5)p-MnjRBwF6q89Mhb$&Ma|F&,9S2G>.ӌgq2S?C6s/\#۹Eso},192ybúTM#yCo#||K|sK6<O\>\Q_,8?0,s]:.jL{ܠ8JRظ^:;P$IxOXJ{I@Ez{J3٣v;ݢE-ih9\؅Zv6 юvdimlKl0HGغ:VY~fKZ[Pߦ36޴/Q}#'ǹ&9(ќD waɞhoND6_e"sl4~m" :Ԧlζږ涜6U5mCfk%NڮܳĽGin;QY.R?mg;Hd"Fg>$kx\x?C0/JpG %o#ޗyiok2E]f5-dr˺KI~J{)im_o3O_SQ%\8$s짽Sb8:[&ONmw=';UYM2۾I7ƍ*ldhchW{=]l2mm66-A;bI-uGl2 DK`&369ffXL{%k'ֱ~fѾݚgQ9{VUv%Xy6"[IXXʙ=,rwݴ?9ix蟊:c_`[}6uq:5+ʦ<1%) LN9m>Q6dY&\jd5$i#~e:PTdp fRWH9m,Hr 'G[Mi-:i!L2\ZJi' `&hC$̐^F ' .BZdn-Fͼ~%u/%BJ,fl2'WMWԓ^D֕u7di,ҷL-Pvn*V֛uG %b \ (0x=Iz 2AX126DGI /%9l(LG &KcdZhB5hy5]iH5dTϤ2'EJ.OJ)-?29Ju,dd*i*Ks{a Mdq2apf iplF aCx)sJB6򃔀W%0|;/JV Ն e |_W"eHjvZ209h"evr](g^:+gB4.IRz4NFt" z|F z ^ ҚZm,rIZ"N- 9 їMx^4"SCs;J ^ٜ)ƘSTN)yE9燏{^(űh/- K^09WR+ɚ-ث{q-)MTޕgek)1hq^x K%WXWeا,.E-PEMccM {6fFܥ!uq /a쉇 {"/I{h%ғX_xo&>QeFyCi,Yqd&P2T eILe\?d&7%u#'<0$'HLxG;VٌzfYsbJJ(qMQgdxOӪuVZ*閕ZRBCg?,%EFj?jdT@4ThGLT[#wo(_q_fvS_v:8 *&S5X箏JPݤJI*4 wM RQrMJ-g|*¸!K'!GI'eLTR8 7G~.򻧝*TI Q_栲,LeY nFT_XW洣lAڔ!0=Hijh@QV slT{/Ko 1'$3 A(cxI7!82 GC$!YA t㾁ps_j^^NU'M]orxu/x+-YU5H#RI#K[ꈄ:Ktv ; Fd Q^yZ!c^-W<,DQ@P -'19;.$Й2"H9PϝJs*P\ԕ"P\X>+X`us'wcO'7 nP.tH3u}$kpB{ z<,'ѿZDjaRDKi-@=^Dh)GJm>US|۵?78fd5c(df^mkBO5Th璻&\2)o_֛8Đ&5D3yoֻzӓJyeA ny9_Dx+׹.9ԋ(~*9kvCd mt)lg`[J1[Wr K2Kb IJ2 f,"4Sj%׬f7눃{[)?ĶGKooH9{Wj>tJWط 6 tMmRedPzw:.?#ƣ][ܴxޕܳ!'t0bgRKod_IsUiw&ʓzGl:}`C맏lj}L/fP>B1IXxZ(弓2v+4i,ٲ.X%H琼D<ѩc1ąw6B޲"r"SOMAbϰQ'aɟM2Ů2Ηht;z'I7AgОvKhϳG\C""%pD )2A?8L>+@$ԅZ {)'d(t>}Ƀ@~# J.M5<${Oq"Ҿw@q"wy;h o12s6^ύom$By&q['4Du'Sb1dڻ-ނHr nDۛHQn/}m=iGckQ[Y *UCRښ&Փ81d f ۉDt'dOР)vy?Aޏ#4>s;hnd8*~;ɾTgI*d! Ҡ2}A+;O`):UؽXq,,!w\m]WRwx%$DJ /pW Cnέ;Bsj5uT+h|]J@: L0 A?MiHMJ^!r崒Rn*#lіrOۊCuᢺE9 $*wm,XцROe}J GrKsxog>1h.yy 'ԡ8[ 'X'}?@nHyO_T!JA9s"D%_.0Aj.*d j(4qyb,-sz9:C8A_ 4@~I7N]`#X OXFu`iI^96b >獟Vc v2SR-%_h YeZ--5YAFکe&4ՄrIMNg ( PZVqбUZ% LF2PKu4Z;Ig"X]?. 5@B1fH֌`k}c&{W7g/˵5 BbbaP³'rhE_ dR⧋%.TL|u9i1@Ce0Oe!.T-%$XvJ2"d9񌏕n2R<)2LjJTIREf"3HZrR[Ϛ҉@3]VCz¾?c^N,Q0֒ػדRա 'TRJAA-1;#PD옐IgxwJ;T?/(H}ppL2ܫl| z-RNI1@fג\^IU8D7VyT箏J*SS]禶D~;~G*ro+/ygD % d5Ѹd8tn'WZWԵ֣zEm]3Yk]ŠX_ /֗KJi>;iLc fַBXAE,z*- JkNOFDYTsRͧ曯1Yc* vjP[ו@iCܱc-.:̮ͪ6Cm҂@ Rڠ>^$=)ՕGXn.:e#YI |F{6uWKUȇ+WsUdm5%ȩ/T0C/! pipQqzL=Lg8= ~8J>%^ok-Lcь+єz5-vS f]*jW6jrNOq Cc xG_$HbĒ$&J ?1%*BNgM穓FPVN\#F&s5TD_h v P>ƜD\9-VPUР/%ՒdDvn!ԣ#([d=-H|R!T/T%rH [1_h&6 wBH 4&%rH#ILzddu#2**#ԯ}?mԳx~|0w>㮇ɝ)pn2M֢5Ž?~ڣWEMD">H?Ïgj˛çx+.5ƒ' 5QwqvtA"ė+"0LelsF1w$v4{N̛Lh9/:HoR4I_" k-{E]AչrJnxm>&F%kAm>dlIH|M .?}ȝ !H2MG"D& 11QQ~K^7o3[u |t~mM mGJzR[Kc :i&KE?{#ﭲSWr5҉ֈF6^I DXZYUh-9UԎD>``` c+ JVj)h.N'RҹRT3lMRs:U=h ,E&nqq,L?H;v0$݀ONwS VD'3I3ZX>;3t&rE:??Nd*#TzYϴ'FDB=.uAS*ZP O&9뫯4'j{zF^Ev{[ _Q[ݰZkl%v\3 MFIo-ن7 IEJIV*$mA73t0W[sbd1cJ Z#|f2h^9MFĆQT&&i@9TW>ʽDZH=ݴ8k18R  /xvew}Pr]W]&HNy, 8 ~#a1$灻>b2NZ )f˽kTœV& 1A>;R4-JGzo|O=_g?8΂*gsA_{N!A#1^%}ٰ2YDJIw${{{{{rZ³E-cSXӅdpǚPQMC9"f9&4^deFo=Ab8rz>lG=s軆lKdkOF!/9{5R̀nfA7dSdE&~x?HZ$=6 Ɋ^DBc~n5ozVL&"xqU/_ç{lk_<`I.9/X&^qkO @t<tyoAY=wO9h.K9#LqL~k[] @P=!W'36#4AQ6j#&4G:N}! 9G~pNkd!rmlssr/MXQMEX8SE_ħįD(Po%iALiq~Dw?2bKf06e,mbtFM'qZ~ݕx= XBac+疲/尦rX^y,˕gd>]:m?{B[A{Sه>/Ϻ>tmϜ`{]{۫@'{M[&! eg/i]ch48N~\kZni5{T#08jM;Y]oV[c+{;K+[r4G˃2?cXWn⠨ݢ&mjN\%.҂v󵰝>sxEejf;T`5mImMnkkj[gq[rF\6vЮClWsA{=a'E'bb[KYl{IrjvM+ ~l[Њv nLPú#qN/v:홺 `3bgvxct_[w}bEv^ꉫ/W\}r/W\}ۏcէ~RᰎBw]4]AC?ĞMa:q ۺ Ć\ WCE '?4Ҕ~X0lh_h]޼^A^OiOǘw{^@269 ſq_i?! wfw^szФW>`?cp4-BM$~{h}Ck*7v^CGlOw@K[h3L= L_,[ \Wn{xWQ􍀓#(4dN#L:a)cHB\/_6xh6OBHf6R=Yc!%Ջ_xÒĊ d0vn l!u ѲG'̒,e(9@,CgJfs\3R̜T6&MknH0 6dy.w[ykbh\~6'FEav;PSv:L;y.5ctoiwK;hcUkZt⦕5M4L-M@fc*T7RmBSd/ZV#3DF2?S?A>~^RW6p_u]D4p*j12_G `КԎHԑg"K7bo+qa(R) ᙓl]1TЧJw kV~)Cie~M~\hu?A/dt`nst_>/%3$/9f~Lf3Kl'&)lh$0$YE6Ty3Nk ,_Q=,h@uJM^?ZzR'FfdȮkN'3 u;PSTKZ]jM}Mh*Q$$UKaMihEӛ؜f14I9LLm7JaqMJ7>1 'R,fN?"¿3w~6===٥ĥȥ̥Хԥإܽ{F7uoˉFp)\i$xx"V3h k5t T]ifWfn5ޏz 6SW}c㐿' 6$$$"dd tۗ\++6&Jې[w +hg[Gڪ崊-ۀA) vq|FD*dj 룱kL8CS(~B//`F#FӳyOOhyмdho*$t&f04W_Me&2*Z *z?)O8 v^(*w]GgjͯwuR.1)g$21L 3M$49A^F P APz!& Ie`>!R5Mfl`r2x&291+gF[Mm^_p1ojRs.^}#&=Ek ).2:^*tIТh{#8?GIК&4QgQTºjhڑ.:/M =lReGfNߘ f֘6>,'+/5?Ֆ ,l5MOL?5U@r1m `o2 2nz޴C n.4u@|tGl59hb*k#S AmȚ36$nkUJf/6YݗUb1;49U!>\E  )=G ϐ ݿHm.b4 Bѣ&ugϢMOr?~3-EO&, ox(G?ʼ?:w}x)9࿸^J [n;λ;0' l ^T0l53$Lt0g`mnۖfm Yf}e7ygXfg#6oc x Hvmg[t`̶f\6cilAfdeAv*9-}N]3Q~gRۍ .1bDOb  ڂ3,%;YnP0zfS'[qy^mY8=9O{;!?.\~|sW.]~|j tLgimVh |ARҶ1ig; 86-4AKϦ6Wnyt77߽fn{wRw{\w]{U^okX;=uqa5kLRsNgf2(ƂMbә sȩS&{((ddw(>w-ݵx]02# C=FP-ԣMy\ZkqrIfIhϘxmwvjkn6BV@Pt5_.f^G:3߂ ]Ǟv73Uhx-oHhqt:M;ޛ.F ۃc-p[PĽ?nzc./G\θr9rA.G]κv)cIdvO :\zBTr2 x TUǟ~@ (Jk h☌.DNi:f-\eptFqLǥ=Dz(4,gΙ9>w?Ͻǖ]8z 2.c5Ly"RQ,ʬrtgoS*)=e6/4&<\T1m9 Ƕ[eEdGϠqG(1BfM,ONnWgwHfw֩o3CI4A7kSr\WQ*gsPMrR[C&꒳6DA1W( FJc%Xi4U)͕hZi-cPSI鬄++]J݊[72ri[ljr؇ƦdIOΜʼn7(E qyF*uީ](t(ii(DzJBRi,|W8[,F߲/}W~t8 j`񣦺MtO4 6թhQR(SzC݌pS"igHKϤ9.T3*J K^}_Z)IBm@BVif6i RǬ?F|* cF[:7He+/|'xM %'p)4Qa< EE[[zq:zrKSىr1//gH.wr OK  ]eTH 6HjK qS BX+v.N\98l'a]6 hDxobM,6u1®0 nG_wÈ=^֢6@l2L#o$[m} { Y m$r1LG=v]XlwXV٤bۿg0Ԃ@=f%()d>GeB]Ų˥Pwb/u]#57K^ yU%KJI̔2UVy_&vɔÒ&ge؇JI; ݩ;%zP,dP]y\2NaG/7JW4?c:=l_DZQQ)"+|Ta2LcLTRKI})&?p J'Xx,hYFd/UU뗩}Fn+9N%%#id5z7ѓeב\SOr}\R@#4 o>71he\zT47 4m'KkikIre:@.LIPFy %cMd2)3Mwt-lZ!LnnW>6>&T`IWTwq"uAO4-B^IL3Ll3$54dh :Qhk\cdPÄǴA)IS^u 27ų9Lo/0bB2|VFNf7 7i]NR:qzTBKr휞.y3;.MwIYRRR3ݝB3R+}օ;/d;͵{N⢽QO~+M\)w,ww1jO$^ݲ91 b589|;iCF1- wo_g4 x TUǟ~@ (Jk j☌.DZZ:epr)!t\Z\Se)4,gΙ9>w?Ͻ_Iqip~b}Eu]WPfLE"RY,ʬ )#_jTwWQw=ޝsZtWkUb So*ŞBK.!RSuOoS^UYfzGL#a+pY5*_*o~Ԣ,~zKW6~%QsX,g1`/F/G:T^$~c}Ο_D{Hsn*upG] c'Wh\{<'gh %h&gi\':/?/ ^-=͛Q.\,xeGK!|Zv򷲛/"U9Vd:wзMꕲ]z&?ja|nf3ݓ#tuMMj:2n|)T>Pc%ԔJgsA:3|-sih9(5LxRMev٣I-w?JwSmH*-&A|1yeΑox*$e\I kRT ڊ_{57ЇV=F}UXRd'|$G^N"G`\oRFTRSOI+ĥOZAZDcٍ1eXF)V^W0E  BtFF:W8aᐝv"vlcQhP`cE%6sm*fL +ZH_tA)I¯$SWi<. ue - X%{k*y]5 Y I2GlY$eLdlt9$)rV}PtғH[@m$ˣ,:2ܪbՁqS!A H[va`ms i&^LBXJn,8XEÐC""µD={OQ )_k%8oun%eE㌎SO ?ѳ8BtKɮBU)[~[V+U%ĶT(Ôa%Yb%v<`XM}!XmkqۦlHD[[dǬ {3%sȶ'1bw[rX[)Kppop^a1&E,#+J3BgQ/ p,Nu6>&X`H5Wts]4\jZz<^)dጙ&{L7xݸ1$#Ѥ"<.&HkLjPxvƁ8 qԪW}pcLK}#a5?\71ȉc6ͿDZX1Z'Zo@=ш~Xa%O'i@Q3>=cTtRRr{@wZ|KpfZs\ח}!s m3_wt/ϗf度;=A#jW$xݶ91Mbԍ5,1x;~#G1-OpFE }_uxp^RЀ3ÿ lHbP  LPÄ!?(f+4>GA @X ʐ*ы@ b`f5` n(= 3gp`)@s HW02}P` &FPIfoՏ! e@>@ ߑ?gb b. b b> gWed悤]+$|3Js2 JsrR*APx_,7bK {A@"Dtg`*++#FPjqiNIB~Obq[f^&U -E%1iiɩ1zi g?lk%nuSBY3~s#X܃5d8P4srKR2S5qyozX ّԲ"B^d6rc)t6N3xr; x{36 0`.n1[nV:ȌRB$*š)NLĩJLOOYk{k{៯\}.)mɒ* (LaݩjY,SE+R 8YXeKqԙn@y^[pb|A~[As_녫``Ǵ;%F#i̿5_"p r?7P;2vA9T&喝it oY{S:"E7^f/kz/ e(@~#@PD&*l(TUA,@uP@mQ]Păh@"H~Ơ h +A}@@kІ6v=:T t{[Zpv/]?nFM̍K5ÄܸcfL DW1OYoEޢDžmq^_obOKR`7CKdSdkQ=Sϓ:jp@2=VSCWm@x?;j ]:h`dZgc--{*9@05cTGNR`p;NtwNzpR+H W\_bJ%HiVyÄx@r2 8Meg`-]|ZEqQV߂ ճ\t;!9>O>H);vˋ-4Vk I:4պJkIơO\UeV1&ӵ %`&SL6h;٤iE` $_GGzlLo60C,9ȗzץrRW)]+u`#-cO'{>ˇzR.S!u3!Fطu|1p`.=#[x6d(O(G[anuin9Z= {[ lJXx 鲂w@2xy A S2s*IݒI3N:>\\,nLMbh33N7yZL՚fƙYZܭ< 7jOy@z^xUz/9=t?|~QFo|P/)]yNױ zKZ@8*!N]h1BNs8<̫h=w܍㮼;cl'^=jqMg%jk>)657kx党ȳ @ۭ z:VږjWѾ\JwvynvntD\>ni3Ιk肹 )R/4*k{PJl*EmQ5PӶ:6mSj`QCD 6m%SS氵lCȺbkjW2-Gl)ꉏ4.cMh'}vhwM{"ZWW>EMZ׎z4JvVM0Cm7MUtL;=g)/pPM7zOs!wHZff֨!}n̝8>qҸLC"(ߏRK신y N2B*+Qɪ?˟Zڇ4xYUEҮ3! 0 3!`@@V$"QJT% $*#EDpQ% HM$E@ 3#~s9>G׭^UonGd9eEBpD^2~U?~Y,@V dr@N Wp P  @о;G bԀMb\RJnoc᭶xxI^C,"RԜ^hlr{Q!øԝZ`iUu2#OI 9et|e _ 6X43uJӈP\u ܻxմ)KX^r ,`)C]oڪsHwԗk.dlF>x%R͓z>ٝ ]Svj:޷S*wPe?  ck3.ڒH ?=H*$`n޴Oc@n ]c=ưmojVz}[ˬiav}M5e̩0P說zcY}Gi>o$Gi:t3~zUkzYo)z M[iF0|+fޣW~)S]z9rV/qy :\~^qXS;39K{-$knaWlBwZXדzwV.߂?uшO#k 99#HwX y5tOozHNϸ\q9*ށ=+oUn0˱Zi?اYi[{A'HYފ< t8]̻8|Nf&L̶=|p,tgg9vv}ɾ#,I %>o+ƺkNm^->3Dz qh?j~C^/6A9C7HuP6iԱӨO'h>7Q4oWf铨L&:7Ez97,٘ts9}SOb9:^f"7.O{o60`#9ڟs>ݨsLG;tjK42zr#5n} K#49:qF];>[ ~@E>*yQ2ܮ}YA`ߺq3 AzXmo_>ہ33oa]`1mj-N z0v[dR/NtF d uԡKvN2]H SK8]x*Gsox& u͛N);]x:΄x*E1=ozn0,X4W܂6@~EkIhS;r0r)]x Fs>ܛq!]xe|=C!-oE1\;3pI]xMӘxgzf]x-Loq#Yх:Jq? :L~%UQ/њ~2/P]Lvd/36e+Un;6E;F*TUykTCX5/#Um-3>ՋP'T6j!6p5Wqm?ine^.^!%߽R+ T*Q׈FxmWZ{@sMZȫN;lkz%/{9cdjW ^j"^j/R5竧 :1z+Z~ZU*+SNQKlV@no7Pa;#~֭C9j ->jzUqTNv:nmZafc2մ;)]FJ7).:vu)WA9U;c؎R1J`wbuRCM7/تX >}ruX=TGޫ7ہmwц7CUusWީxJ*|k:T^"%cO$co${Ũ]>hEun\qI-MfOH8E\;5K\߳Jm<^ap'1V7+Ts@@U] {UbwfY!1?5^&4ܓ/6O{p<9IضžoM}\{?>#pOlkQ; mEy( >u#=bTg [筺w7G]qekBWzPcNU}9%a%/@^&Q~Z ǧZPl̳`Qq&G|9)?y?Gr-B.PQS):An?/rfs]KvMh` ꌭ"*mT5TՅ'M竎O $jئ`2oi~ ugyߜ3ա8qkA $'pJ |P =7y_uPX_0hx?] Y_h6|;xG( hs0xVkh\E>s_;#M4&MFDSi1̓hZIY++&n6`H >b`זV)iBQjlb޹;s{vM-~9g93|sf93H$j-$Ltf)P.O9MA%lmzgݜ1/QyJץrSHҜRC'4B+b yJ]|[ ʽYqHH@U) 3x(/Mv'%. ,f6 #r@ K@p Ŀ(昮'V yA[- Uk@2^c=s[~ϸ(:Cv?۶ɕ U+ g   ~"vtG`r\r-"N J:*ݘY#Tg$LҫЏ3 Nc]@LW:g k,== 9_#'dD2641"ؘex1nъD7cHlLiǿЮƫ\O!a|ng(>G/qz D#:U6s(.dx);eq)ۊW\ΞīX)/+X!.a*̵^ފ_PcJu|u|쥇>x꬛ ?9=-~]<{}e~r^';<r쨽]nB"d=~.Eji"RvOp8,qGx]7+:j[AȑȃP r{ӥwӷWQCj6 L_*F¹h?RewvQuv&/& @7aw@Op QeJGW" SW 7@{7-c|$w[֮'Yp4_,,(.+, g{'uxJsm~\t6枊λD׮4`kv+ﭺI'Xʽk;>Gn6^(q3^&XƔKRq$:ͮ$ɓd{nvNo&>ۀ5`\IwoISj:Z껠=AE*ҞH7Jg+ծT r+ 1NXhW8{ NKp=?PgV:xo0g0ˤQNd􎳜rz '3'i3M4Do-ÃVlu8^dgNsq=QQ*ζO]oKۯor\g?:%jsXg^f#.5?+,VjwqOՇCjizT/jV>nWyZvl8SSOwJtlx:l1r >aV"6siSg= %HГ9a|ы\@Oi Dͫx3*qF\5>ಸJ\/<~+wƩ1ooOn᧱ЇvUU R3_p9VbD?UvriS U< xUXqZ.U|*WIp}aoMD:(`b JQBULTjYlͲέJQF;N ԕq{a {c [z[(D7E+:wߕrGRHFYrIvס/E) 07B2䖧7|Jz5O<]$9OKӁN{St 3z:C=hgm_<|*=sk+uRƵ|kvs:;28`p \5x " Ex䘧D < 9o.xܢ5z,͕zTѣ6}DvRQIU]QjPHK+!tie.&i%)`v+cfbf.0"9jPC_4QGw>c<. W\550᎘ #R N9/qN4s*IKtpKWvBvZJ8@w0IsF˽DFY$]ey_Z9%Y#͝u|" &iU;IusrJg;%+ }Np_g(gN1z\'n9^u^UVRGBݫzJ"gXO<urXz^&iߒm׼vRk'9S |PUU-ު*J:mW.utPm#j }>j3VĤ7SyjWP Kic:ӹ|6QQ0Ghr zV,i./:}6k]_j@vx:|VW _-:sui^/:?! \0P<]uE~EW:!݄_yOI O=xNF?YB>C40p:ۂ:Pzh~t_\l&bsu{Վo|IUj7 Z׍>07cs6/NCFaJ4BA) e.ae%W\UTZRT5APkJ'1L=afyy7 5&?4i祦//6xM3k*&7ng>cn*v7Y;݇c{܉}S6w:oug"zߺ;_p]YV9&^4UBM 7CUʚ'UEgQqfjjRjn;idΩVjgWrOǽUcNQ,A-|W8fǘE |)P?IA`B1Gl0 d*{S݃"tW;QݖjVT_'QN hb@5UD]It8TG?ՀUMUߺ@o>!8@+vH wmzTVC -y]b|H~W鏠%e!!NFݐ#J]|IvYYOFVw`Pxx=H-mNoJ?h45҈>8: tVCYkEx%oH:*4J#h n&&@*c-A; 4 Ǎăn9S5+r7 E.-䟓Ӓ8͑tqY>,l 2R fFI[^Ved>t y@,FH 7R*o@:(K;7q-X 7L5Muw>oVLy429yܤGwyՌ6(#fi$٦ njqa^#0t;TA-Pej@V6ZZi5jPVSZZk5jՓRNPlO#?W/آ-vaI?~׬f7Yuֿ~kΧw>gtԗPkEAcaV>[zmu}^&E%?BnxځBvbڍ{3ݞYxW(+ɳ#^g}@ ZGo弾d@_i!fcr~o83qR83QԵ]ۚTQ*ETUe UhZRUP8fB%*Ց6SՓ6J݃^UJCTZenzW*VMԿh>ʟBߧTW֔❠b* E=ˆxGΒRz㱢'z\U'X9=jP$_="xY&B#34fh5k1KlJ>w;&aq{r;WЮRwZ5M*Y>rD;b쎲a99>^ %L2Υ/靿5ֲ֕k1ug7 FFcطej3}7Xi4\!ӆk7%%1mTw흝9=͎ΫmblbBsA)1Bwg^BqU|.+R(']t{KNm]?*dhfo8ɪQ~Pc(3V{dY"LgSJ'c1[:ur$o#AEwMGgݎzq0V(hY֪,W06e>er;ɝ<#]xJzKga*H^xUY,XK^VN]RzܠG'E?6=5%Pz~arVo5RrY s1REKEW@*b5)k+Rf/,+! 殸Ĺ(irIK礩l2XםgMwU,>fIw݌tۙ(vkYըf'6v[trXѭkYԭbn9/R~xLWn{[m^6BY\Or>ɚʑڗ=LGsrV$t-9ɅW5TxO„ ݃u#GIܸ~~2 *1L67z2tWR,A1Yax3,y$3[) ggYeX 9ZZV24G$C:2_Y|I#7 A$`:b c`%2"0 qҏa? PV.X{`><'`G/۸ӯG'~=F9-|$[h1E|@_au}T VI0}wbn}يUzkg߅]8? ((Vh_k}pa|bn؋l^WW*2cyL$8.Q4@e`tfMfҎmVK 'U*8ZNat^Wc y)8" aC2d23!]^{Mwd96țxWblZي5%Sd6MNw% y 'KW,;Rn*:Z`4?K-֟:8!_FpzǶ;>`~t Qq(!>8Os69%/aZYhi2iIH1[U /QX,xqr".،Q/P 3qF?4? Ov?M,4P/F_a66nqzj304| |vy B,*LeK0e/ć||+/~3L1]l8bϕq87p [q/qzT=f p" sKr ֲ/φ挕8x1Ř/HdKW/I[;۲M53;8LsIm紮dl.o'Y)QsQ-dU^^T -..!(lUTu!;q+Jd&c֮;1ל5Ls8uIZq8+\KMnvm͵nזX[9K2aPBX4tC­(Zzwq 17{]6Xe.] ڻPC ]CD긪I-nV1;a` ZOkuLzv{ӵj{,x,ҮX`OؠKPYvdm6 q.wiyb]$JfwϾi휔?S$֏\1싒1rA ,~S퍒&Ć폒){LwlroFtA;R_"Yyn~7/?ƷF x t?@ @H@ `X"T [ Kl#4Zv(T"(cڞ3|wfGQJ@4#NJ8H'O7G_\FA#5 FEQ٨bT5%!F-Q',o :F&h. sc [BMΨ>5eXJSSGxBļī$ob|i^X^^}cs T讜KHP\ SapV-.{K~Tќ0Dop[@Nf#jLY#"sءO#K`fb1K :ct>2$o u?#4!֊,5YT볰6fmmk}lK҉6;xZ24QfYw ] wX(v0}i4pyVG빍Y5,V[0t ԥ<+__-6/uWL.'8GbqzhOvN짭8Dc8FrFsl  k*V%g_#_Iٸs~~ 9 *! ]E#QZyf#n~{< Kxsy( q}Ͱ5xaK~NLpȏ^?;`l'"* K|/1էbD y뗡wu﷢ߍ[!֟Eڇd;_-ׇVH'?O`?01L64Y;Na NsP8@QVG6FUE}vBK]px3mgslq qf󺂧,W—͗yg0S89㹌cGs+yyދҕu3[JGv[ Ksd919zV ǁ2J /-Oc6y|l2meX/o]Ykd V,Lx49}Ff`L2/H*JI"Ho,X"c܊gu:i?Hck'z+? p\b_p絎mW|38mXD#QJEA} WIqgmܳS^5,|d&S),c+6We,G㰘ΉhI _ p;Y?, S0?t43E1~؀}]aQn 03R6|{n;.3 1k0Wd/488ʇAOE`'`ֲ&v=z;344Ohs> $ewe;ŽZGVyFxA `;lP=WvWP)$rV븺1n2ڹ⚰k>לVLs83u׉c]'jX8۵\K[h,wm6ɵVב\~`u|lg] *P 7"(R+ BtC T`GX1ݍi7 G`qa]& tw:5Ѯ&sqE++-eVi;JcFc ZOimLX4$ms45 ;]X}ku %a>X=LWuFC{mr8SǼyBIC&Iǖw320[&5b.!^?7rs#5 -%!K !S3;囑B{k)vfa,ne7/?=- xtǟ~IB {) 2"L44aRPP "PDG2-  Qp+|w{}?۹yo8*?0D|/MsȲB".'ɼnS fnk~kDu.2~'me2[Z)&`?lF`o -+kF{Jkk?MHg']r#rBgJi#ON-F{`0km?Ϛ~]kk+",~V1&~oџ|F~,]A:k R(j@"%ج>4J2FY#(g7*JhHQըfTcM kFm#XF=hh42}j6Clwu?}3Z i׮ojjRȬԵwNr$kПbn4'^(' EyĐ ݙu UQ;G촊4w9Jr-A;4[חw(Yay#<߾$FA0G[Cd8a>L: $&tY󐮯 U"Y@}.k&:Vt}HЏPϡF1V˲VaAZy ô5/I{xF)ғ_J? xZF<+2<Úm-u|@7s\|G?:=L=MInӯK/p^zGS z|E-(@cR.Z*RIY[R6qFjyu\ i`4s1ࢤ#-&γ:,kS`%QF,v2me>QMOl6Y6[keW[n9#R^R.>}7ۼl\3Dl}4#/ջE۳6 (iZ45jX>=c Z#Gqg+)[0Nae6Ev"C6ztWB,BqYf瘉 V3,)Y/a gF˰(+1dOQgojZJ<܅|\ 븈 sLGa #;kPٸ㤟~ b-~6ݰwb}LA?C~.z~-:L[- hϠh#Ge'_=-ˇO j!<`߃~;֗Xav6Cgp, lZl5:2pgLr fۜj,&[xu9OZx2/3/.mdNNLR;-LAi{Jg֐l*mFna'iR Ӥ8G ˵j,18C5$d> Q8 O&a# @{waw߁w/ij$_)_|=񈿌qW?4݅o+C\ 1Șcx'pgaʮKeOc2'$7?aMlhixI`;;zҎ _lt2^ic'`VvbG{vfh;>ֱ$+?j h1vZiyU^+.BE친*.d'N~VrEYѕ,UY`qfG׀]\C&\c1͵`׎#85Y%XckU̍5cK? WB1ŨP ]AL$bCZBQ0<"BnN!8bKF7+\0ΥKE;w~zX;!ֵB!hҒ81vjӫ8Vi,kiVxkz0M[b<.,^v5t݀oi"k7+n@Z3?1858=W3i$i7=)5)ojRisў(i#԰74{(i\u|(|qReYiM=5hG ]YD K uo/? &%\?LCU x tWǟ~IJP5BP;A:*S-icK ZSmZL[JUEZ&F;TKZe/K)ә3w~~;w?22GGFi9VLA2?ʼĜ;WI!w )(KU^AkY:eyJc6>6~#Xϰ0g;He({F3Y%Y{Ay %>¹q瘄0`G@'lBSA ,G$^Ff㒟> Xv?[ l=wb @L3񐟀V>?}Ro}6p?x13h=Zplŗdo!EkZ1`ߎ~e3VkM~vY(K( *۠;Bg&̴}s,`\Bn؍l^󤅗*C2J:QpEiqy= ;%l6[-->UfbEtN@cN1e40c*94O8?OC3? +hGi2~#M`ƞ7ob|E2L3A_#}(#2_!i(fY V:c1N`3%"̔Geoc',72?a}y6fd3NDc1W@;K.35_vg-ہkv֮Wog&p mgdll'Y9QGKӪ0Okϫ^lw. (aϕt;q +jUd:.c>;暰15%\[u Lw9uIX3rm8\k fntuNמX[K ,捁F T '(Xx wq 7]26AXe.]*hmch\cڸqS^JX6&h^b64mٚy ;X}kt %a>=LWuBE;mr8SǼy|IC&I3障20[&5LK^1퉐lf9#Yv!{#dŬeq9ieu&cho #Ů,,w~&%\?\} x t?;A@E,K*-Є%F( ( (TA("(Ge)Zv(T"y/۱BmOi?ϙof;3߿kgs8&?0D|/Mɴ".;9ɼaS dfnk~mDf .2~RN dďhSLN]~P6dewXZح9{Jkk?UHg']róCgHe#On8 `L~0O#58kNk+,,~V1:~oџ4J2FYQި`T4*%АHUQݨZ6b:FNqF=hh42ˍ}Z6C,wu?m˵NI*-\))i#2WSׄk$oПbn4;^0; EyĐ ݕy UQ:GJ4w%Jr-A;5KWwa~#<߾$FA0G[Be>K8c>: +t"3)Li31R"M_E.A.G}]t׍A#^?BC=Z -Z6j}& Ӗּ,yAnY OJO~),L+.ӿp;nܬqv"e~WxL=?097)]rY s1REKEW@*b5)k+Rf/,+! fĻ(irI 礉l.;ǚ4/X}̒As1Q`qQOl6[Ym`EʮfQ2F%.Q]uny٠Js>Y0'j*k_ާwvgm>ڌ4#"'h jAHp!bu\{z8n|k@9JbƝou;Tdمtـ[H,,@ Yb<`%s#>vǣXϰ1;^G0=fuaVfȞ."JղҕyE>"7p 瘀0@@/DlF#A,C4^AfᲟS~"N8G`~ wJ|1٧`C~ZKݿ;ZtoEC?ޣdsV>|xo{=_F?tQ?)~/Y_`wb+Opڟ±0 2J>*%j=$6OaN=b̲9XͶ{2 ^c_a _f_$NhN ;L!{Hg֔l*mFne'iR*SGIjWpjJ2 |(8$#qPbLnye:ɋxObn,:yjX-[Jv`l$YMSge8 xQR0[1G0Ozbt"6x9JA[;^m/,4Ӡ;]I#AQ} q\pyBqNy[V",%O'O#C& IFW2 mJXxb'Gc!"Ѐq`FD*LA%<~&i'a h짣:~bRcuY#7|%go$h>p@/v]w bWa/d_/C}!>pCx_X+La?a{#dq,Ily29Di{@x|f'e_ -+lg'Xx1ɘ#8_:U;I7.53_6va5ہh'vμW`hژi];ɪ]NR^-#ZN<+zZ%p=wWQՅʮ+RVk5n6Z:k^F?טfLu8صca=GxNpM9pkٖ6XZpmppkͭ-w6ϺX•aP Ţ(:ЇnA2n㒰 DuRݏzj6NqP5@Z_iIvjӫVi iiV8K=F-1Kav|튅z7jou:n@di7+n@Z3?18%8=^W+qDi7-II-1oJb،Ԥpo\2VXfZdž틒I&&, Lwlbo2ڇԠ)xeY,a7ep[?ojǥ x ǟ~3`a;A,DjF3e"A"ABAE!Kb)SDK;K===}Ͻv(|d%ʏ+Kˉdn2y9`19k| P2 g-[WT}#ٷ~#z,-iF{Jkk?]K'+]rsBgIi#Onڭ8 `L~0O#5xkc+*,~V1:~oџ|F~,]A:k R(j@"%>2JeF9#(oT0*hHQͨnc- kqF#XxQh`d44u5SPdv%tRۮOZZrƈO+'U5ysOi1h7W{/W؄"hiKck^ĉڇ]Ln[qqVT-ęyW5TKxOOc1݅u#WIڸ~~Y ,;1TzbtWB,DqYjqq?gXSͳ ^ fueQVfȞ. Jղҕye E>"q瘀0Gv6V !/#pOI?h#v?[|lw |w0٧aă~X{KͿ;toA H?ޣdsV>({X=/Z]_#ݟP?)~Z_6cw`+Opʟ± 2J>*%j=6!N=b̲9UXM22^e_f _bȓ8m<.ڸgbcdXŧ )"+6W%-Gcqh񸀇#_F"cq;? 4?T4QFq~X}!㌑b53R0| ]}gvxIB*LK2e/|>|ϛ~3LG1]`8dϕqY87pq/qx*{38E8 kٗgFK3I t<̘d̑v/|NEҕKM{MmXv&Ȏډ8Z6ZNj{4%G*?Okϫ^lw. (bTu!;q+Jd&㌛V;2>׌vp9̵( )'[3t-9K] fntŵN׆X[G፡(FX JN"&Q, C#"F#nvlt.c]*4s51 pqEcq-aVq;c` ZOiuxxmj"k,ԻT{ڍ7Vk?vJFI]L'u@Bkm8Sǜ\AӒmӻgwwJII|}ҒeW̅{g3o;԰74k(i\u\(tqb1YiMMf#,"{e~~|z xtǟ~IB {0eAXFT +Є#KрF (ED@ppd(PDhPeer>_X紇;s{{ŏ}Q%{iGqyqOu2o [P#7Fx_?&C)1A[!~Eb m[nĥ%: cOUˠE.\kyv$Y'R?w%N{`pL~pZ>k^ ;@ Z_0:FV \F "FpJ %"%F) jBF$:"erFyQш1**FU5$Rèi2j1ºFQShld41u5S@xvu: cCR2cڥm/--9cTΊw鞔tsSZ =͋˫kblfBsĜ;WI!w ɲ$U^AkYڲey |mxGaOa6w<'xHc({F3X%Y{XAx %>¹q瘈0 G"v6)V:!/# pOI> (ð?|6XaY~&4L#aV^?}o$-hwcg{l#G/CxVH'?#x`ߎ9~e3kM~vY(K(  ۠.;Lo8fq<6ӿdz\Y6gs Vb7^y]Ɠ^ƫ ˌKly1ʼn\1|+$N8˳6!/a*Y%h)2)H1 G32^#,,8dp<s.al(H8܎)p:?4? c$ O6?t4Q/@_j0֡ Nq(n73R2| =|7xBL0e/|!|ϛ~li.0[nj8,88Ɨ80Sv*{38%8e c˳1#%$ v%9҅IHzpi}i=k\v=z;35Y'vմݻdG-ZN3.pX(`DN":𡅛Q* E#,F#nvlt .\*4$GmѮ-spEcqS^RHk4m4s kw,ԻT؍/VՁvJF=LWuBE;mr8SǼy|C%Kw22: [%7b.!_?;b䶳#5, -ffŅ썐I;C{k)vfa,ne7/?Q&xxEϙyH J K(!%"Л 1&"@4)E/XP EҤ*Bs?Uw7޻ux~;ϙ >4wiHʸo"Ry#" .0c|]s?P $(uV?3t,ˡhJgӨJ? a1e*tÆ7[mtr;j {[84% ԉhlBB?OQ,L3Ϡ_C)hTԛGLs1jGJ OÑ/j(+oi5= ??0VQi?ݻeYfeD' 9ѭEkjaq(dٰ)0F9tɇsFi9=Qr윔Ngt6(#AC2ˆ_\azk:6uj\&BW'y~K>َ=~c(IFI;[{ &Z C"m@O 1Z(*y&xl*@%[{ls++|x-ю7u{^X>n>~D}ѿ?ʺ!wu7|D$UtPyח"RBn rSMn%Rnur=u'.z'Ӟ蔧' at3yFAXO 3Ob Cs"U(M#QTqRUW:Tbu4RGH_]Z`cZ-f2]Y ̧Hv4Wۡ/(ߏ#S;sF1gis\s}or_ tnpGLǑNqHm8'J9$٩)i,D봐d紑T= ^n߃*(יr~QҜY{]z: T:KKg$9VO$(MJ}3|.QV)pg9{_"AOQVɗWl)Fkz-G nR*C֠~X[{UoV[d )X>GVKwtK^,-[Nyd<5c*xޣs[U%ޢ"@ R][ڥ>tDmgtRmS:f*7P^Mz9@#?F1 fG/iNOENzH0[w+݇ !J0RqM_S>A4]<-EZ/F}6i4Z6ޭtxM4a^G`VH˺",n/fND}w8ݚ'ƫt Wc̤j: ~ x0!vCh #@ L A ֽN UnCuK(V'R41*z:`ǟjǪ{S_o] 7RVH}{;;KeJ_߆.1z%Z+GВͲQyLPeNeinHUQ$;|_L'y+λMk`Pxx=H-mFoJ_h4҈>8: tVCYkEx%oH:*4R#h n&ƛ@*c-A; 4Í-ăn9S5+r7E.-䟓Ӓ8͕ q>, 2YR ^fV &ZmijNVKZmkj^)'')YNPO#?G/آ-vaI?~׬f7Yuֿ~kΧw>gtԗ'PkEAcaV>[zmu}^"E$?\nxځBvbڍ{3ݞYxW(+ɳ!^g}@ ZGo弾d@_i!fcr~o83qRpf3k˻5=Uf-PѴXU%-U1>q1hJ5WwѧmV}3 Ie'*hʗ]՗z[7Qy( }R]7ZQjw( ;,W :[J8LjţKqVjVczXQC|lVd( TPSe. LIW#<}&pqkd8m%^ECK-kT<7U9zKꂱ;n&:{%P0=Ph;οw>XW4y MW׀M`+参3 Y ЅP*I1'%8z ڃC]ڌLjx 1ob) F -ʻ!O<ꮡQ QQq$?L>\N ŭ@WҜ~b8'Y{ gcƯ*KȟWP ^箥`y5(}r1dz6l#Ƞ}@Wi]Etz h&A(8]\ASzΠ H2qwAM8 `>BkGKlsNExJ'V4/6lNχ;0?w_ xtǟ~Ia” h2"3ЄT@@BU"" 882Q("X6*Bn" ϛ:V9sG#s_/yT~d$$`^^eD\N$sy!/#׈YgeJyi'-̐? ~֢M1uAU7[}]~ϥE: ވ1wOic`$}ev`Q }OZZrȬO+'U5}cOi1h7W{/WĄ"I: t&F\dH%H[Bnt+:>GhaQr,XPk36`m0me}lKҞ6;xJ:t<'L2ϲf.d[}=u-͜;8Gr+t?Vs&[$ܥ_/C̣iAHfKZL%.Z*RI9[6ݍR꺒hJH.tN:φ"뺳N,2`n+vp-/u.gcX+rt.◺Gtk6WeJ8gCt>Wbvcgmڜ5'j j!Hp!bu\»z.|k@JbƝou;Rdى7K5e!R8 ۰.`%?"ly"~G h`Ye"byqV*JW.{(_EWxc"> I؁؄XXh%? '}&18Gb~{a3aO?bes/A7ko@߂~n?F+-G >} }QxO{<_F?S8#1SL1olrcW? cddTb+f{4ё) >8fx1lWa7Jƫ6xxa|1|o4pp"gp,p4HnarOػ3F:t`3iǶr KjL|@B%'0*K/ת<ՒTP⠌}]tlFzYޑUX-J6cl ـIO&ڻO4LxNyIlIy X&b[-Fډß%{I=|aֱO6!h}u,#ȫ<6{&vȋl>Ja/X|xye"Rd4~%檤0vp r28 9;lHQH8܎)gq:?4? c$O6?Mt4Q/@_j0֡Nqzb53R0| ]}gvxIBLK2e/|>|ϛ~Li.0[n*8,88Ɨ8Sv=*{38E8 c˳!9$ v23&s$%/IHri}i-TQ;C5c4k>u$nw;JOZ{ka;F*/vhq"\]A5'?J[XNj1θh갣kή s͙ZsK`a=GxNt8pkٖ6XZrw7sk-wϸ8•eP o E1*BWP"t1-܌be(zGw7 `qۥ`^rRϥ!݇/j6Dĸ("-k ;U+5 ׊xRk`ֳK}LƘ0K0W1_`ޅn5eXIsVkļī$ob|i^X^^}cs T讜KHP\ SapV-.{K~Tќ0Dop[@Nf#jLY#"sءO#K`fb1K :ct>2$o#AE/B7݆κqyVFi%К,YX`>% r<-yRK`a(GyEYXF粞.f}}u=-;9Oq^0Ks~ƭzk֋<^1TC _k|cE咖h)⢤TŬlkRVnQjY^CWV\s6I e;Ǻ4k/>f9w ] wX(vcXhv&'6s,sYխkXʭdQan/~KyTWpn{[l^6֙\Op>LM({.&h/vN짭8Dc8FrFql  k*V%g_#_Iٸs~~9 *! E#QZyf#n~{< Kxsy( q ؉،fXXH0%?|&Nq8Gc~0A{b%7S1ɏă~"[{<˿;:tY[-hϢhGbW_},ׇVH'?O`?01L64Y;Na NsP8@QVGY6FUE}vBK]px3mgslq qf󺂧,W—ŗyg0S89㹌cGs+yyޛQҍu3[JGv[UZ44)$1rcrrKǁ2J /-Oc6y|l2meX/o]Ykd V,Lx49}Ff`L2/H*JI"H,X"c܊gu:i?Hck'z+? p\b_p絎mW|38mXD#(>+$8Oȳ6)/aYehi2 )H@s^#qX HD4$\؄/c P ᬟ ~i~)m~:h碁_Xel@C>b.q(X_hc0)lk>;{μ|!} &JLef2GP>GeLB 1̶v4suc !KC);> f!Nb .d9nfe~zلҊ1x;M#).pY(` BTC T`GX1ݍi7 G`qa]& tw:+\;sMjF+-ZNvzj ژv{iI ӵ-h:GRB效iYVHA27ʼl`o0yȜ5nE/]b 0MFx+Y6UllCv?xˊpcOYˠlxȜY)(w~v+!N=0ӵSgi?ZC $p_i 嶟A?(`KWP),1$ЄHq F$&"FQΈ5F%jT35rXFQ)ިg77 FFco]f(nn HRzl䡭cKIIL❺IsMSZ ՞ 6166 ϔ@.!R*> S~HV).G@W\%hfrr4+ 9o7d(?1FXhR(C,vSبB3ИO`Nx:i2Rt)uշKAw݈κ t?#4aQr,UYPk3gm0mi}lKҞ6;xZT[8Ewrr+WpF=)nׯ[/^zS 3z|^KZL%.Z*RI9[6Ffyu]Ii`4s%$EI+GZ8'MgɺkӬ`1F,v1mc>ncU͛ܟm:6n]bn pKyIK]£5߫bAs}!fh*Gj?ޫwvgmϾڌ5"'i i!Hp!bu\»z8n|k@JbƝou;Rمtـʛ#KY^F YeyJF|xGa1OcǙHa8{F&0YEY!{D-Ee+ p7=Dr-!瘄0 @/DlF#A,G4^Bf㒟S>'X?[@l}wJ}0ŧ` 헢 w7ߊ6~7n?FK-Gs>| ;i>xϴF?tcQL?~/fY_`wb'8AXY%YMktd~6!ΰ̶9XͶ{r2^a_b _dzaï?4 ݅o+\G0ؘx'qaʎ1Y XY}y6`4c$`}LÍ\i҉/IXqi}i D;v=z;ӵj|FIVvv柴j1vZU^+2""\]AU'?+J[XNjj2θh갣k.!{]c1յ׎i#85Y%XckUM5cK?WB11ŨP ]A)Ą>p `9DhvCq Mn Vx%bKv>sQvBkB"\u\X|pBKةUNX1XeVZ4n/0Qalmy +]Xkt@%b^ݬLgu@Bkm8Sǜֲg1ug7 FFc\߷fj3}7XN)?89\Ԕ!3%MMMJ❺&$'^%|7vs9B9yMMLh.23%4j$ pD_A};ilXИObN8Q: Ru) ѷKEw݈κ t?#4aQղ,UYPk36`m0me}lKҞ6;xZ4׵F\%1kVRط:ad)lBlo-$tWR,BqYfq;QgXӘs/ fa gxF:˰(+3dOųRteDiFQHudb>3Fo腝h5ˈl\qO ?HCV?}"6nX`پ?TLV^?RtoF$hwcg{lDz/ʞxLkZ'0xb߁~e Vk~'v9( +"[6ۣLo8fq<6ӿdz\6gs Vb^y]S^ƫ ˌKy399cGr+yy}ރҙ5I;[IZ4`?4)$Qrrǡ2J(q/[vmޓyd KNĻkd=VX)1Y)4{2p #I+/=Pb܎r+VHk) 8YjaԶq/,4Ӡ:]YI#E1}y1\'qyBqNy [Vb,EO/OaLDƯd\"N"C:ǣ!'"&44혊Jxg,3M1O$n@?uBeJc=Q2g+-F?>#@{z7odǾ |YL3 #|8#2 _a 1̲v0se c6 !KC)=m|"\˳!9$ v%҉IXqi}i-T;v=z;34c4Oh>u$fwy;JýZGVyF#xA `;Lp=wWPՅʮ(+RVk3n2Z:k^F?ׄLs9%0u0מ]<'fbX8˵K[`,s-6ɵV׎\[~`u|lg]0_(7b+ BlC Xh9 GD1ݍi7G@q`돗]ƹwHpb]kr ㊖WZ'4Nvz*b-R1i+NX]H2m7>XN ( ,|fe: R5h3ǡ8 w& $=g999ݷ&MM7<-9b.%_?7|sÃVXfc쉒&ą틒əf;67ۇԠ)tfك,nep[?oTǾxV lUP(-ԓ`+ZjR5RJ++AbFQ[ L ?HRHŤ AhQtRmy웙݆S^y>Aa6hgID1u?a|~&Syv9 \xÚ13&7֝t`O5zFzrȂE؟]u<]:n=Z3FkBFOA<A9,Xζ-'uJ%&h/`48q T ؄@N jx Աv k1ˡ=p]^NkݬfL}=hb:6?7 Om+O3mO1Eǜiqpggz9L260337C酕f,.e bsM5=f222e.Rx )CNmyqln HdiK?`4/=e[Gezx { ?2qM~i`z(3-1WFfHu't@s[f-L=Ht rqXN^/TN9򈨗o(^v􂨧 .@1 "ՃyX '-U"V]+r(WHKIP,kۭC%c9u|j>kU2xyփxw~UY%McxkNV9-U'7\b%cGb5~V+m|x}MĹe BFZrYHrKV.*sJj`ɫgb{ZE1:6>+Oڲ̟hkߎ;BT vdOW՜xV]h\E>3?IMjkjWInQ iU mH\nXdMڴBD1 VZM"R}/ZkQ?}p5w3sf%g3sϜ_}:{b|46`ٵ1JBylv%O0~11EZNs4c+T\M7i ru?CvuLMMup5^.5W0 ^6a1?dUڙfG̋]29.lruT\I,srP0cr_]U=5C& cA0kEE;׮UM==+Jb5:qh*Wݷ9CtH/ĿKUk7ʢ]ZvFxZZ3WGk-iN8X4(XL^/Tb$WEIb*SU߈3FțFnS꫷۬FN]&0D`]y;YFc8;;[WZsu|n~ֈG1{4S~gx|](F'T|r8ۗ;tw&ޕL;|t$NchP*e2-= X׾7YwǺ:2GO0 r? rIddM6!x\ |M׺k b1UQ)S!UJ EBipK]C 55~? D!s HQH'DIQ(Cj㭤Go%E1kbdɈPb2kc?#Ef?1 'sf>\錉@YL1OdRNJT3V@}0OU| -d+R c)q$6'PWN +;Ab?cY`uSފ9®▖\nm(h\5*{.'UV6lقoF ʩ\f*1dZ._f 47i]-gr!לmjHmmbk ;;df^mZxڌ$.iwޮ/rQNmؖ}zrR֨=[ZeZZe7>6stͽ\Xϰq9|hcl6k{6^}Tu6wXw.-zb惻%Ĺ4W[JbzfΆ!# CJ7\N/%,M5]ݵYG&`+3%wG:`5l_s>7*kJR쥴-gx}Ou_5U![[j(Z&Rc/u::>mL]6etn̝^`ݓYcޗUZMѵ.D#f滯YªO^\uGz˸j$"Ja'nwhb>M NL3bgCnOT Tٖ(Z+{f؉j.{XD3Fb=^I!ι`-P4hi5}FYJ抝tGs}ƨ0!mVзgK6N4}nf;mmdcUfbKuz9kV{{N:kg^w>Dk8Y/ d˩s~ؘ^2yhm s,4H~, Y=6#FMè{XXc6G=<)!!n{b8J^NWқ{ OeM0G-u<~~K%VJ=%zA+XS\6>^(dv"{s+c4~T*'l.NxZ[+^J?r;YR%e0Wj☴YiIe b%Ӌ% I!MHr\ )>Co61XF5_zP? O#'3І~*B#L QV"HޠϚJ 1 gƣ }YLߙC,b|H?7Ÿd,-8od]O:H5m.2~ S.=7ߘV=q+j5Uh~7gb }Bo,aYJ-b}{+}:/'1>mpY sd#}6n~C_JaN9"-t@F4uSl -2n~D(# W7$n1ڀ_l!2%RцOӔʫhXS?;vA[Ϫ~F2|uZX5xRQgYc5MY&0>mGnqѧF/+߽h"=hݨð:/(mJ]P1V[x˧qnhb彟Co~hndz8$0՛5z O)uMk7wA yci͛<ВFdTErw 晠M)zs}-<=%d';pX~ =YV+^J/y鮳TL^kW_>sTdTD~-+eqNvf&er%rAUYJZwCQ؃91?oSA Tc<%Xjg|)ȳ/r$CA,qYIuۄ]Qx8>OxFYϹ=x&ZDEƃJUby&.0]$KpRf!w$ct{4Kx1}x%tfm)1JF5kuk0BknI]BlJpHE! G 5@*}rMҚa 8hpr4>|[mB5 @Id{Ax IoŲX;:!w9thDs!al$\A,iծEкeњViiY/VLX0#-ܙ:]Yj;a=F\\ ipDqhr/ڋ-$4k"=Ǚt=՗ASptgrXi6[&og0'W ~鋽cs}½wH"^w~qu~mKBFYx|||Wɽw4|-/NqUMUv2LRRWZ{N3Z2V~;U{lNYԜspn?wV+_ #7);߮,W fڻ=H@bWCQZ@tEA@HgEDXl"ET"P:R@$4C/KA@B(}3wq쾓7gʙs̻s̻woW-㷭9<;*,?^>ף;mi+;]ڙjk%7V8lko]~,[*MjvO:hhD˲9"Y-|Ί %v *V=VմVAjTZEeU+fݭX޶\ײY?3o~òkvuH{Xg+btgN{Jhct6;dUikc51:ƒ-[eGeUVAhuU٣j]ߢbPBeܿ$O =(D! ѯ*m>fh6LF˖ḣ,kx>^lX{JO=1*ˎtktyNל¯8'8ǸPXċ\*e 2fç̍ұ(˫>XWo *=88Ip6qr%v l^pq"VZJc#ʉ߭U_gWm!6M9Xi?Q;Q AdPTɝm#m5*rTO%-@G+KD{[e-^jb|=g7Z{YkxUǭV+7RB~!־(B%E?Uu*HKe #wdUwe-PҚŠ5uqVۚc̪C_+-,7f.qfKz[ϵʦql֏#-Y7ZwV`/=˒֎eIk1lfE{HPj3e.kt4TyD,J$3pz[%ۘL+Or[i #}']0пw+= M? o8 1Od?yXA-g㊟ p"p<5p?J鬞ʙ%+3A9$p=yL8#A 39yy4OK,57aVTVaAF#ss4rq.1Gcu~8>iau!7D_[#t>e1Q cj;~!{C(D!i >>r.L6]~|HNQިկ\ j39+ۅ'QB퍿D<zЛ`~r=օC~0O1bK$QzB#(D!UoŹwFE׭S|ޏX.N~,^]bim)?\n3%^o:^ev?D2"ߌ\o g?پ7!;EyOgWm^#7kD#D!wKLp·?ۼ.]}|xϿMq\lBl[l>>t=D! ѯ*$|\ :y qJ`ow| !ַo~y0S>o}_UÜ|yEE36SBwBv NpH;KWG,ȯ>|kL1&N}1Ȏf);=E! 0&W;[*LEe?xx 5yZӨ<;W݊} ~4a08& F ήxOQcl| t^^zqĪbl|C)5g֜1ǫ~"[adf1&.Y0cY\2y009pqxq OrOq0$s=3 Ĭ̍y HwzXX&ʶ |_0 g?8Xv էKc3Џ ͩ$̙. wGcG_Cտ*v. &a cSdٰ܃܏LOAx}i|;HgGyyyUg89r@{ȏ}("^D+_Uup M-:T69-7Z dbq +w]@*KYPthkPVd܍, lZ<ߋd;<'Է6ą.r@}wɏw4w':JFt+.yU5Wk@ kBB/лoh~&smn1S\2\p;ŏ&r 0C+\EtU1UB6HzXY䫫mUĻJse1݁.?Fo8g*Ow=:f&U\q.PpokC}}g\JIׄG\d+s+R_ q-"[\u++3Ҙs 4anך\'fq] ד>!&a#cd~9Fr5z&ξ8IdZ3,](5GÂv^绫_~5KIgᨹ3nE11Y4?Z,͞a ~da-0, ϰ,"?!@oalz迉@W2 xXyXVe?\ !  M4D\Pl%4BQ@EkVrFtr tjF\0@#yr{ϙs3~N13q={{tt;M.]Cj@gܠ*2 G竰c ߢ_Ar z͂WI!15~ZM.p+`bʹA5=? ` km ]izf@:$ hѳ~G]ui&t})um?^m(nR8a Vܬh7M--[)"V`@"ZUܮQqǞxީ覸K]q7{@ŽE/oV[ܹ{uqK0&+3;slNx SzfMHϚD<19NtSkE{ݚCsCX&ͻ@/c?{cΨ)46]3_f-ǝMIl#z92B=HdAII;)sFzVR9=9: ?e=>9;զ?}ΌKz¾}|ϟ|MrsP J4σǝݫ@jz[VmcQa.Ghg'ߚz\ :):ϓ >+ -+IlY `=XhG(ӊݪUZ*(T+LOIL0-g(y**z_PtT;"j>ȫVJURq(+alQ*'V6@,W̓.p4 @(P *ʹrvhvt FR!4D(]{Q!0(nلH%fG)fQ,um$#hM&M.*x՗6ɡyHe 5{$;z9e{O!=rg"1 1EXeR%VKb8mt:!Q 0z@: 4ΰ|`\3|"(Os-qy<*Y<-l>*kTϧIX&Amykm&U!RMi_"˹Vk59h0^@LQ K@{TOI1P%b{3a' R /s -UY`JW$U֗'!V[a_;3}˝-7|ocY2pAi֫50ŏL 2ِoF"2:q B|]QΨzF.xN3bhDjԺs=vDI,Gs53 e /IՅ0Z$4*zPvR_3W#x,Opmr,[JLYkHYgT~,\4iE<;y,i\ͳIfs?2D+~t҂ߖ~Y|9K֢L9W> >cpo՚Rjޯ'yہw<eoth) pvD;q5+|_t| u%oIe)/r{^pX:YX#{vETE{i; d6dK,,"9&_iMb0q9_;hհTϟzn;[_|V 1E,, ,|iHȶF0ChsًO8ޔ ҵ?h.ӤߗaZEZ-.f/ca/UkGp?q7 ΋Z!\Mn1Gg&C= Pb|џcwNty .xOb0j_7~~W|0b ,|c|7Gavb0~oЇo=an~g#NI txkWjߠ*~ypzsC?ՅNHOxzKŜcN/+z- + RѰAe!?YIM;J %hԳIH"19D~a.5tDVK2Jk9 㤑߆2-i"Ievt+V 5j:D;m#Qi]?BJ's&˪FufZ%Ї6ULKT*%_ъZkwgm~ky>gA{4K'G"&JO69bAe(KoDw>_Ì܏~akP0wO]V w8=Tj5z3N^{(J#[\tT[~:jC! 5?K1bؼ_&Դ3[a ԯ6ؼ_&5b_&\ |^lTexV{Q kc=v!o%!l䱡Z̰<`)Q Ebz?y}]ˎW}w=9~s;y@LEYCt抈\6eO!ɤpL>'*~<ưm).zqƸt=(⺡q^*fNNnM)fs+~ȶP~n3JEiR}^I]8Gr"XtQδrg]OSϿOg,.LL]990-y1z03 7 @_djQع͊,Uū‰@q4zr,FC &U8׮i/]73u֞rZ8BgX35[QMRu.o:љImglc"  [#}hkZ(Cyc$,Ǒ'%6<#jt(ej' U jx<ɾb+ElxG}H4pT!"zBnjMGnq.>7|꩎6'J穌4>,WOY݂ ȡبnѾ^5ajDF]}K^{t{47_MU`<\:%Y sȒPPe"=zMgi–C׻xޏ;*NY[ WcƇޅBJv,z~l2 *a:YɭVfV=OYR5frz-_}>jnq.YIsrdwX۴8|̟]Z1w|-ߺrYGpFC5'cxV{Q kX]$m[ "yl(i50̰<@?%JHBVQ,"Z66{{ˎW}w=9~s;M@LE rlJBI9y|NL5$@1ya}R]quzPuC㊽J TO]TJzksf'ؤnAdilP7 h_W5!nc].,ѿ=:zMB ]&⁚p`N0̈T/e,cp2T6=TjǍb?M\~4eG)k vP;˻DSB79M=^%cT/?܊"Ѯ'4I C5LV G-դ;G/OvM{Nây%%sj+xg?Ts3r vͮ-94 0>ǧCE&(i5D:xDNFHxJ pR"&Z6tdhpfr0tu.wj@~8f:0?P\nf6^ĸV* t2J3E_UpiXE2  ]`'MV`bdmhj '9Msp`- >}@@pK6 JBNqpQOh+'0 px ,8 X d p |Writing Exception Safe C++tAlan GriffithsiRC:\Program Files\Microsoft Office\Templates\Presentation Designs\Contemporary.potrAlan Griffithss23nMicrosoft PowerPointoso@F_@Q @@+ݾ@5vgGoM  t P& &&#TNPPp0D z & TNPP &&TNPP    f--- !---&H 3--- !pH---&------%----d]------------%----e]------&3--- !PpPP-----] U----,]%U----D]<U--&&G&U (!w*wgwU ( - &Gy& --y@H-- Times New Roman*wgwX  - .12 `Writing Exception Safe C++;!'!! +!".--yH-- "ArialU )!w*wgwU ) - .2 R. .2 vAlan Griffiths  ! . . 2 2v(. . 2 2alan . . 2 2. . .2 2 griffithsf . . 2 2j@+. .2 2experian . .2 29.com) $."ArialX !w*wgwX  - .2 t. .(2 tWork: Experian Limited#     ."ArialU *!w*wgwU * - .2 . .-2 Senior Systems Consultant     . .2 . .<2 #Mentoring & development OOA/OOD/C++     ."ArialX !w*wgwX  - .2 ). .2 )Play: WWW, Javae $## . .2 j. .2 j ACCU chairmanv  .&?.  --a '    & && TNPP~ & TNPP &&TNPP   -- & &-   '2$'Jg-'8aDm''3~"flsPrJ 8$8laO[7CC,J-,s=7.KQfQ23D P$&m=h`3y}(C?QWl\`tw }C  \7?Z4.."2C= sl. J$# & VEO}@)LoluifC ui[F5,/`/l [2@Eh <$&Zlw:lO.Ttwcr=l/O/f2=o= &: . H$"HeZ|C6kGZZp< Nf=6kYdv7qY & & 4$$)RwwlUZloL;;AL}A  ], & &&TNPP &----'&--"SystemwrfE  -&TNPP &՜.+,D՜.+,L    On-screen Show Experian Ltdw"&&j .Times New RomanArialSymbol WingdingsCourier Courier NewContemporary.potMicrosoft Clip GalleryWriting Exception Safe C++ Overview TimelineSome of the articlesWriting Exception Safe C++ Call stack: a() to x()f() is exception safe if...Divide and conquerOther definitionsRecap: exception safetyWriting Exception Safe C++ How do we write f()?No Slide TitleAssignment operatorThe nave approachnave approach - assessmentWriting Exception Safe C++The guidelinesThe revised examplerevised assignment operatorassignment operator - againRecap: the guidelinesWriting Exception Safe C++ A smart pointer Another version of WholeThe latest implementationSpecialising std::swap Base classesExtended WholeNo Slide TitleExtendedWhole::swap()ExtendedWhole::setParts()ExtendedWhole::setParts() Strong or Weak guarantee?Writing Exception Safe C++ No Slide TitleExample for discussionNo Slide Title  Fonts UsedDesign TemplateEmbedded OLE Servers Slide Titles&em  9 E M U]emu} _PID_GUID TemplateType GraphicType Compression ScreenSize ScreenUsage MailAddress HomePage Other DownloadOriginal DownloadIEButton UseBrowserColor BackColor TextColor LinkColor VisitedColorTransparentButton ButtonType ShowNotes NavBtnPos OutputDirAN{904B2430-6AAC-11D3-8DD1-0000F87721C6}<alan.griffiths@experian.com http://www.octopull.demon.co.ukttp  f3 &C:\WINNT\Profiles\local\Personal\html\&_SAlan Griffiths  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~     !#$%&'()0Root Entry --dO)$~Pictures--f-{h--Current User$xx-"SummaryInformation( PowerPoint Document(cSDocumentSummaryInformation8