r`EU[R}b1r#AA"@ BAD᭘pzi1|(4޼J2Q@ޭ^ӡ뽚<|]k;m :{q@k{(zC-H7e(knntz} C @ }*05XWڙ]Qz]N:J@ЗݕGUPRQ$4*bk hM;zҢ@UE$U*D^U"m7ATtRQ킖)K5k9O AѣpNJx!1{|^7-!}WnmuMN/s}ZϾR(>wwxw}zk+owwK}PC֏Z@ǧ[|:k|={l|}x{%;`DWG:| _{Mݺ㹤Ģ$(HSB&}B}cC=z3{/[%qInvWLny|OsoW}{/gz=>_{>}]ʌQ}vMq޴PV{C5@nbk@U31Bkrmw3/iyvNs;vlݶ睹Nkzǻu<p{;ZTf }s{dnZͽAMպ}7rܱl^゚Jnv]/^χڔPݙem{o,d>nm*zz^w[ yz+AR>\sws뱔z*QC}z2v||kow+uR;w[\6mrz]ާh}u9ٴg.Xo;Ɵn;anvh`v=j N^g0`]}}}{ X{On{lvJ6[]{ݱ]v}]5D)Ѣ kv2/w+^c{> {g.ٽ4J[4R)B h4hIE#l@hQJL]8ֆE[YGx9{qӢ}[X*t&nkE(<i{/f/6 7Ju]bz Ϻw݃wGg >4=v3P+m+6k=l+5'v /3g}sT'mZ{վޜAҵ;><'{7hg==sjFڮx: wO^pdˏ=au@:5v4f%y^}ozlb]۷_ N`({ݻ6@k"7 }(q};EطDY}glGCn=owz=ۣdGe.}P)QzeQfRnjN;gM1HjJW3t>OEH^]}_G}}_|>}}s[7i_JTGzz|v{ 'Mֹ0}=j|=qc *@@ZªQ*Y*SmT<[Sw[{ӻCIR0HR_}wmkM];uٺK1m{(z ;'vv-9r]y}C1|٠-pyXZ*.κ M @@L@4LM@2i M2hLh M14SyM4 LS@hD)~6M4j=M1d@&M4iA=50zj4$D ))d)jzjI1F?He=M4  24ibhiT zj=S56%=MCjji#C [AcԿ%o+EK?MoGo[3*~CzL=hIފSLd$DU~i=K{5x@%@P5 .IHP@ p$?&Ba(&UvD)i{]ߝCsc޷8k7zoЂw-44+aa֙_vYEj-HdaFAjP)P%iShDRw"^T(U]B*"JAd$8XgnfB@"@H t!Cp$ SFy!j!h "Nߗx6G)䨁JXS JeGv%1pQtIkADAIAQTUQbPETI8HW^pmbk ) "4I2 IB(A$T!Q(%5d#IHD L4BUS$'HhS%Ld %iRfZ%%P!(,C$1D0 % ( R"A*B 0G$P0 Q)(* ( "F80(*`8) :54--0eT`)0h)r9 pH%u 0҄,$0v@i$7JRI!  Ly8ch|o)F%:Hf>"pyV[S[3t>U~oE9md@ HLXl3Y{mI$oϖa$#zZ9(lϦ XI>OE[TtVMpzdy&M%G;tɉQSH_+'NH^/OLHJynGM9TӖ4z:m}=+gԢ_C@jWWx5ʼn#~2H8%/vt$Vѻ{c҉z;oի˝A5yVoEOy6~~|ʝɳ7[pu˜6a%൐!stń Yĝ7l,]$fw|ëQI\iɑcX1)qOG"j{Qk;-6~OZ~<㵫h4w.>cF[di;3x,OdxxR;0oe6 8$(ƈB JqO'ns%^[#Rg^ZdB͢ B2L9"꯲bVgۅt sߨ훫5g3/jEz GQ 6DVyMb1k|g~GM &R{\2C[̻3Hiѧ ̳Ë rވ(Wب4ovMPٺ-,TA\LdɻGFoW;[<)!Ӛ5'TV15ҔzEy=GC(ۢ mS]~=GB$)]lϺcyc"4ROȇ`p0=g>%*+V[$e~ MçK:-QJ 7!5TN-^;;b乺/4նBQ{ԹŽ,m;ڗo ٝH9?GfTPzUf0a}NZ o ڙC*tbObP-UQsd:p9%C\#4EiZ/_Yb9{YG۹ozCj!Mee8|inTU+1j+Ȣ(/ur8&`B%qf<4a{;mnGވKwy9URYmVj1ᘌfY+%sYn] L8Rᣆ!}Hyv5{ϚgD|8&d9P=L 1 MIT{-Ӷ}5>Uv'0nx"ϯ^{)J\sof㷖qHDj ~'zNK7{kyJL͚ ܚ:!39Td-0w&%sA ۺ/4Xn4<e}7gmy6ߵr$pA&LNnm+(>ToLOKS`G&Y햄QbB-ԲBl}սȄf 8߷Sy,>mj^N|6+3o./(Ԏ:kӼyo8F(*wV J5.#fuRۿw-Bs$F2A=]35Օ^hJd0I qM镛t{z.vCeVk 䌇OcIdt߿$w3Zj5 c79W$jHr22ٜst9{GIUU=a0Oݍ|<}bD#@Cݗ+/Wn۟\s>3S\oWԻ\BKzi(ʦcԤ>st>/d@/I۶akjFIϓJg΋{E%hHϤWJY:[mj==|mW-1|C};kWlF_yݻYLEi/MJ/ѝ6gٳ+}9h<' 6[ǔD~_F/:Ke>U9`.ihq}/Oq;lF_׿sXn <_U NJ3͒ )PrƜKVmƤlm{A}m.=lQX$\!şRrchq[|-"= >-4sپwEHY9%"3GbyD$甸r6׬NQ|-zq8,g-u%撼C]z۠ tonˁJ<볿ikl˜+p3bC !+۰pyCzȑ|l0V/TxS*wkF1&1ᢣRHKSǦ\b!,#րmr\1RWUU?PLH4"k\!rgEŶ"֩g{"$%gt\T`MfGq1 Zh`-aVN'w !L?F 6 THĒ{tFBBsYd$F1y@ô)yP# 4U[`S]g%3er_8T!yN]`373ϢPf,Sېw~sɦ9~'=Kx; Ճkߧ+Uo7YRBܺLp^;4[4;k.4$Y6 ER⹍KӺW׶t,#(E.o3~ׇ2mwjl׀+/7Cxg@S[ĦZ!\i % 6}w65ӳYA͇}t&sB&Ժ(2l6! ؘ׵ nXYNˉE.͌,L9(+ Lu}R-\ dK1't;z|f]kۄ\I[nlwQnLc˯9jutN쮶)uE;w[ܫös+a ivw5gr*a+CTգbvRS`B* 9)$?_\Գ9A+;sdȞ_d ǂGuYc.mzp{zK|hWk~,֛A.DC31\z< pU {$™s|x1D!=ɍ 6N$/j;ڊl(ykUH췬Yow؊7/k Տ<+,?7F,Cq&8dN.ݡM6ULrM̢yf*f1v19!ՍptIES&7灚vouuYXVKY _(Wr1T#IGl"ٌ^ɺ}wG ^yVe.u}{j4\sW'fGHۺ/fsnbSpvjf6͜q|}Hδ&&cUzGqT"CS_R®6t!U}!<5cU;\0ȾO,5h+4h?ע$+x߆E&/ξt@ BcB]q:0?ꎾan/ /RSyW8:b F\П|Ċ\xgY X۔XRXUW̦{(tgQ[N*ԚnaMЦlj:[^|矕TnfwJҞ')'*)} )BdwtGHV\x_O9 Qg ̃9pV\tt1qWE uox~zɭLMr*b!۳7 I ۥ eyZl%u/R$e!>.dm3 k%wUutQ~1l{wܥ :g3eWLi3nyX[[j#ǜ# 4U:Mg_Z]J n352_F\%"uC*)zI+{wHg5Y0ldu$:juNRkNO 9Um[ O ѣݝ龼khcWVTj.?|GP77s;u+{h\7&(2#1ޞJd{ߧFXw?\xQ$ 7W kRvZ\ه.`~*/t \~F7Ǐıͼ2ֱ$H$ړvzxW57DFkӓUS M,oxJ;S Oㅀ9d.UB/Βa"n߫]鉜|~cMi%?W)6׿38ouwЎ> x.4]YvCm.4ŹWw"܊QnZ!دeԠz<:4=?Mqc8wcZs8vwFS)3E,3ގjt=g2^m5~ϏLcO$5=1l4YO׬o]Z_~ETj)Z}עumM]'$[rT4}e'ZOAY؉G$`]Gl)х Fz)/U4gjyXq/LQ 쮺"[IuO|NG((Cm \-4&~ $r'#n46̤+O>TqxD`?tSHj0wE58j$*ͬM@nj6X"m&RSz[b՜J~8}-} ^~1na@[lbv(qh\>Ȟ*kw>eKhiM1Ft0R 8|NA?ܒd #XDg*B20$V)" C HcA"A|O,Au,?W`5m͉PDMTWRrG磮y*")ZiMUzɏL}̖5CWgw@gg:M4<+s1 Y_vޟ0}l9C2NlUU;RFP-#?8@3dRpl-l!26,6qD2?t=ez@٫%w}BջsY':]~{o:eEz0w;P.҅W=3ީ#_8|zIL֋BN+Hjj{6P6E[sgSg+Бn8"<ӑLdSK.1_f,6y}|i Kzњ GPTfhQ^ӻ΁+UoN84{AzBXSoEy޳HX>*Δym oOYh\~ˌrPM ۢ 6Ds>띹>w8\-s{" PoX,cæ"C?(Ua"{}dY a*)}ٺMjO#8,gQY^>wU/"7K*z"VJM\kǞQvHpT7SjS!k#n_I2ѕv7+jgwzHAz\$,фJQC#m:pU̞թ,ec9]s$`u&9@⑙}w66)6;}83gU2uW&ߩJ%2JWx5 D'e3[Zja _|qy #.G lv#} Tݰg7msm`IKP6 ~ZRJ$XӚ8f:g~OQ-"76׽rq4XU,Ntlv cd.zkGjO0sf.V_ơ"u4՗2H&Zd$@Sr[>fc90<kh5J-+8e=s,)J ʌ6T«d gnhUI]ϼp_r1HHNG M/hÝ5>huXFY |32J"hz`\g21wE RH!Yv+acb*%w~a+ucL3]QŷZ ,L[m*G*q.6lɊP[e6۶Sv.}7qSA>$LvgJ_470Xř%v-GXʥ߽_8oQY79HYtşe' .)c 6L*Q!ON UpBQ '~l-𽻭-<\ҚI;9 5룁ދr;r+`!qq@Nnp S=&S}9]3ܥO+g4Qj?;]gƏU<'nS0E/՚Xǚ) Aon GeFEx)Olp.pF\cQ'ֈ<~ٽgokQм|Y%bhB$-D|Bj; Wۊ]ZƤq|Δ1>мvu}$"1u6_2oW_4Vsݯ/}>7;e痛Upi$9MδQ'1VDMa9{=rr;.暱ZTUח(We8,t Ш4GܨcਪQ迏j2iiex'y%]yhwƲYSV\+=R~ĈrvW X1_,N?3\8OC*UJ$j"hH+_OL]A37[W ~;la3JRgSi\i!GC~4d2LUL̬3\ 5*6Q4*{$^^f0Cܼew3YvUj8 M8Z!$ܐLgmyoFMϟǭgs,Dzfk 7af\Y=\&ȷ>ʋY)ehoxsP!0+D-î0&EpC2usiH*) yL# ΛUl-J*dД4t]~AYyk|ZOZ|{yC\P{4;vOEZ(أ NP|]p^g/.t nQ;}` Obx[!͎e9WY9]ٱTţtjؑz,ٮ;viYMvcB'v&I3j |]uKN QrtF Gw HpYZn;&9ʿxX6dEO{/f&y҄&~+mie)^nj7ի_UTr3?r4Ӻ)=_[K{L[MyH' ߫ N;LưT߆u%[} Y Mv޸Or`2d1@$Â?N']B%(uJۣ=J|*ψæ]!(rQI|EMa#V{fdͰ_?e{Qƿ x[)&9)iH(.ur4? 2&񯴳cXuyj11躒/Q/ykEKw&`C׷FM^phji! m7)G×fnURqqX6;nFf6 `s(u}f|,xkxu,>cEH]ɠGO4\S jYK}mlFCr7~Z}ݬGe=gg*}ӯUm RZ~G.Cx!s/F7lĮvl`=D<)x( J{KbQUQͅZ y΄RzkTTrNxRX]C4S"P[g1+ pv46T1wv[X8Ly42I 4ksۍ#ݘ\ K91Ͼ)N$ fVn&g֒<>qsO\ӷo{qG߆F,wZSF`I΍yb5Z<$M9I%PpBq)L/ًghqwH^nKǶ.#|f" h Ο+GH9 PcҳSNiэr,@:3rJpcȞָ'wp@ZAp2gASd$XK\B񪾿K٨0 F&_;d{ieӑPH,hz?㟶҄~ GFj_g3G 1.hq|YtvYb5BvJ^[AOy}?cU4<=8hȼBQ5C\sx&B ?G\z e3=GƗ x߿Q*E'V04=A!*_L7}??H8D[\"! aIE,*4$>OnfBW<be_zwi7NmL/6 zyoԒRb,flϤ*1蓧?k4D_l98,U)*yryc5ۊS)i~Xјrnc킷|s}PnO6]ONj2~'yɶuSucF&V;[r!IάSCX1aE)%p,HE9JEE?.2 X? "mymB-DI//ztW>;Wa7ߴ| lDGag*.[F=n -K-3tǝ)ʟ~ \oۓӏ\r`ZFr2*?jFT$Lm[bS2N M$jF:C+1wE4Y \?.nve'jg.$"ߺʢaE&_7OX#Lˉ _Rܱ?/9 9?!Lxٕ ;)6fNܹSk=} D-hl8.?f4/PD,,ӱ UP wˆv?]!.2reL%'Z}T4AI"uz% 6J4Zq <Շ$*!/RR`מ鋨I$I$I$Rw*//Adz+ɍenR>%ޣ}3NInY#HHJq?MY'|r] ."/{R3:I!$s>çzbHf8TLU$UUTULB,f.15LMQDQ4!1TS"TEUcv\xQmŒNj1(uDEn:IL$:siaUUO{txcp5#d#v{DZ5wm|Ķv|sƯhָu-fw 4g[0}vE2*Ɋr#(2C*,ȋ2\ q2 YN6fYEEwPЇ>º o5uv=7]-5C?Wz†%%-DmNW-G{VQQI.O0Od^ѵqp9~Cďyz< 9E3N.ՖbVԈ3M']Z}w\,!`|s5=xI>RIn!GC>z({ZW'hC_Z0~^l&jTNC?\hP';M %JSRIglٮ:O{+E+7qS@G4j< (C72TSܛ:$^ 1ʇ[VVsu?Vd!&j廬'0q+Kfz%e W Î?|%@eL#h&'.|X"]&AQK>smE4</OEmZ]=$e@z,+BdtoH?WZ3Ob3=<}P?S\)tyo8?>Ei[-VDIuHr*rC WgqA^bY<%jhU ʈWżYklj!5İӆQ1v(5^Sm%UgtH{?G;zɷ7&8Drqj%m;9P8%_#Ͷ _~Ձg~YŁr[ cȚ[hE!Sj] -<C|RZyT{a);ݙ`EjZ8'' z; >n|am% MꟚwCR@XN8eVw8 oq cj|D>|afudTuIXNԠHN>+$I >4zfؘfSN(c,!?ԫ=3`RΪ?(Ctg7uBFѽc}A8!FS|9# {_AÚL>c6htq{Y fId% tNn.jFzؗE4M녃#ǞM5,|)R\8SoF,BJ(hb`3) ,H(̧ 02jb,2,2h3,h\Q05h"eINMDRU9D5ca݁$YLe5G:NǴ6, j=1q0Cy#-))@"$-JA2ôFq<ŏ1jp8LMF@5Hȥ7AROU&:xE}Ǻ֟fR 2 r &B=eIHkj+b&ʏ7$Z٩5cNd) N0.GߝM2ԫl@ {30|CQ1Zjli460'b˟]uJ@"H1P1+@]]{vQmZ"~'HUuujzS?H1Wl i!谇 c3\Bog D3$t!9\S>?g$8#6XVZHl7aZiaodž}74Wя˜~)1&#LpaoӶĩ"SĢFQ-=&rm>UѲm2ܤ̝C2Kr2G;CnW3O(1|»cQ_n5 ˦cpA+-Vu6@tBdb0;E>>+K61ETP|>WyR6|с87.o'2YXJo"HyWWNoV VPG:l,%!tSZc{.ðoLA~ׅ۶m):LfD4LfwƱ AgdFq俛f%~Xw,JF5}MeHY6QK&p#'-5'_h U 9z`cFQ`kuE 4yEЀu;U}fgYYpY+$$Jn! "*aѭ> yg' Y9@跦Hbaj6s>^)ղySMsz8\I`֙ uu6JnyE b薌'+ cKg`5c3,;*& 4I;d *s؛ APYg~ ?[pƒm`V).D RlӇ9{#tFQ/\8<=CUɂ.~u`uQMWyf2E8f+]i%yixUbDL\~UoxHqlFƛKWXH|t?xI'ٟ;c2 [8(c990bS ~cC+ 112;$B23`pq5vچ^>(Vm|6]sSRF@NZ?aܴyJط EMTPg"Ya3*bS=`fmޭeGr҆nsK86}I0*Em J1D=lP #1ȝ ϖw/8.gqޭ<vw>=<ʓbkR99G`$P)hy o4eL#ї9VuWś3NљDYu"pNi.486ai1xSHsɣ4rS ^IEM `s2 r A>v@%z>ݔ]R}oj&ff6YV[[16*uܬf^JFjOmh;jvՏ jjh1(5rܥito;S2&} >`& @=yV:w q}3\gwMt[؏a0Qa* xFZ3Z/)v2L <$Ӳ O\ϙ L $F1: Wv2~]X WD|Ҝ J 8  ="1˴ݹxFwјl 1:=31ZmIe|D۳{%8Lk @͈3 [Mxu0=GK hQ b .b#HC > 5&'Z ??v W|ɻf"b&7[x6`S8L4=y/hxׂ&bv,"lC58D Y3:tVhoqQS$D^+Ii~Fp6k뿔<Ӕ-v5A{&Ip bfE9i %-eX&kl -A*F-ƀ4@~v9 /$[kl(}/N,cK2 m;1E_d?]Q#΂kNGG.zϗo=_SU4Qќ_91 ص^uW ?-7ۊؚc~l> ~~j9nwHZE5>$XFi5aHkJ<]"t3)zZ{ΏV&6n%;mS8^,axXBGkY N{nY[l!ko#IIfχK߅{OKsG?u0\Ks<5QvL찚epg;,/) F.zô8c6"5Q5sxbtWQd2՝Gϲ!2'N6ӇN2}VkhϳWc b~B^ 0qtg!!v59 BHI+i$?@1z0(ȡ7B"2Cu&/~KBbH p*'y2H'o?V cN4a{aJj60;!i#! m)qM LL#O=p0%Wvv$7AK@oq&Nxᄏ ¶c6dE M7 ;hC\8NS/=cژfc YD o8HTAIc1"LrXaf=mI/.p4 }Am򨓚vm8PU2c1W_}mM/Ƈ|!O6 9pk. a?:Жp<O5pX0WVDblIH{%T~;6\wKB9MJ|]95Ĉ@%|eY.tY 1=ұv|#]Άe‹.1ՖE¨rY[5op9Hs,וfF#3DY>V:́=cH5|!5{_@̃<^~ #ͺzw:t8Oc&)4"JA) 1Ad.cL9!q 9 3rE+_VQa$AQ(@  t$:.anޛ\N~%l8r|o^˿Q/=i蠽Q$"4DC*&Z|;Q?3^b圕 ;CYO JHܑ5;PQ^V^ғÂc`}[?^I 21rTG9A4b4L^i藙``o[^fELF-]l{1 ƃKxCBq]x7O~b:Ha>DaMsD+me4BbUHWg4"bЇySфPo$4j٘٪w1sf4M!< %6#ICѣ!u{A1ʃYNFo#׍t.ĉ\<6H F;upI'bnlwEtב#?XG1#&̷N^"ox㞌:mO-4=uem,xe/NN&{& l^>9Ο=`Z÷{m4i1꿪 >ړfGW{MC(O\{+Z[]Y]?Csj%;}9Dngrׄp\;.w-׽~g3$q(݇eߧME|aWCt>2]Ws u&`:Gϥ]_H.F87U_R⏪M ntm3[ȬӚ_|Rbx&Oڂ3bzϡM9vv|U| O֍=]J'q  -R(~_D 2a&{$'&"sC5Lza!MzX3dl=* *C^ Mk\!#D%Xq'~/Tam~Ae!!FG$DK}$&T~HQI!9VPF-E;g koܛ(ugGunq˲)j4pU٘ې~ۋ+f-$TdHPL7Jf@bY I$_b&i&9QԙRyChcɽ3rG@'͖6Sz'yfHԼEw¿7_%ÊNīO6gi4$֬(i16a#sq3uiM0Zr)O&p̯,ad]\X( mDSPwrSRy(h3]?D t8!nTAl4:v)A%}4Z0\U^!Z˖Ij}hU >\5 2.UgG<HCuRq\X`*ݭu#D?$izr6NW0z:*Ax˨ƿȎ,D,!!L;zdyTt~L^ɳL 7S6u/쾲;Nvnޓn$k;6~Hqp+p[6kKc8#v ?#?!@&&6=,nKcup63Vϛt(iX>S.@!]GDHn/C?~ַXo6sxk[Eؘ;q“|zhGq\[D 39 ;2C[Sp=kcxFD/prqEFM &6l.Ƞ~'EMC q嵱FSSxH?nӶ9S^&`x5q"aŰBRx9F9I}XYd`"K1P TGOj9̲l 3nV)<MI1#Y-BBn:D Cqj(NGHbz{ ]K^XÇK}-']WPVfvѾ*34ՋZf붊GGm޷H}L&WGKZK&wj*$C|%jɟ%ŜUB:Dh:moAl` hz-=9hGa-T)1Zl@W6>AcBX| P[]fCTTE $kIk Ͻ}ŷ|`bذ14crB)I! >kJ ,`f/ "9_5Z "@cɁ憭(zda$PI~_03 $n/s401M`M0ZYjmUҠj,*zo}a]}0n~=Ϳ2OS%9pԨzsC˂iފKȡ Ccf.m)s.vk@wuPYKC^Yq E4!?lzQ kVlL0dc:9fź:K c_=SdBtz,n3*v<_p{UbE|uGbhoƨ`.P&J [M >w3S Tl>r/z3.{/I{ȿYӪ.X"lj| L2(vt1]RW g<c=m;7 תɏ R b|~>!01sV/S{t\_wF!N,K%5~l{u8Ҟݿi՚I@rBvgY5251{aܙKl s$&V0yID|g2gj*l?b{ "jbC 05+ȤLG4M f]jGrDS feL2ˉlf^\l0,*??a񝣙-żsfvA qUfu4HuJH5SPe"TY}Cf}w?ĉԤ7NRI0|| mF?Z!9\CS(@ͣ8k{<,.eއ/A$U3#i(pDUd!+aĿkv4yW{md~b\Ys .SQȯYm{-Ӻܖ&T'7-V<ksE”Y8%Bxa_)'<7Q}[6c ģ٘ :`K{̆|rn < gAk,c2dȻOU-UT:c4|ՁU* kZa;C 6מ&$;got[ᐘ0몜A*OY!_* Cˌ(I9 :Z g@(kԒk[nlx9K#Mc Qzakk9tF3_GTn6Nؾ俖C)nt~yюxS!$SL UgOa y jgvxa" nA 9BCŷ[wkC~둺ב#c(=#=Y9p낕&jǯGh@@W14ڇVQ Ma,2i#cΘ1`nSݺ3s7H-:mܸ]CU)\5b(Pqu0>sÅ !"QeV6E15眂{ B,$kt9w+_aJsh v~6j+kDjxO8&T=_=%`4_">m?'nMI׷IÎtA' 6$t>߇55Rlfc:go #vUmUl^Pή26>U&N;3t0!({MڐVB(&*.˚YN0֌ʤwLNǪ@3et!A˕htޯXƪ/Vq5>5PlTUI~,8\C i;+P3qeC'7:&h?y|8iy}3ud٠ hKM4=n|ÖgſͦJ?=6+O ňK!.nvmpzψ MQ},0 dD?+oޢ[X9I<`PxG%)=.hO07@onwHU rVRay } S~ݨA_'-EDHM='[NvJ܅BkAqxl6-ǗX+>΋. #SdjU;FϬ4B=xmHvhgFX8KDV L}&kuDuo#ָ% ǰ6m0L$gi-)T]ǣV*fHL!D'6J71OʃiO:O՜(!uvA5!1CaG3'ʣ'!aG]լt$|Bn.p, ;z,[mglJCl̽rmy܈ѳw"겼Q7i ԚVd뻍JvOqvW!G1EZsZs8NuvC߭LGeNKŜo)C?o?}0!˵kϖ*k(5Pm F)1\ fI.MٜWXyljt3ύ[ R욱}b;[qo|>g{i3<'b. 'ff69v+6ɏĜ­0װjz c$n;muc/ڭ7mw941.j |c7>y#lU00m4;͵:3tG<烱QՖf Oڋm 4]nix5:EQlEod;;ioeSVZצM쉟)˸`tyzD|ޠUyZg o +!"Y6%jRRM̌pXgEoCr)~!-0yt{(,b{} !brM-[hE4Z|_fՑJ-ݓ5 :)KIvۀLЍ05~r88ɇj5}7?lہ6YcBahpy?LNӨ秏EuTWL!>`u9$_agsY}vW P?m)2(݁eC!(⊉ 50CxitBo]f+3b2]:{xeCIKS"-#tdZĕvh6%+ra"Hh,j k ŷ-W( om7ONmn+kfqBlȭ}}[ڭLCb9Yeӭ̖DCX;ۤ7ؐ9ʛl-q 6LJoo}lCK+7M,<7߮)+ELFV@[:ʠSf>DDK)d}tMN=A 8:ǩ7N7]dMJLʝ†ES@D;^G>[q F{v蠾EYY=`D/ќYPGey3@WN'=m6#8KL4#iZ \z?8_ =hA73؅ЭƝ;f)bTEVzijddؔT~*Hh+jI_KDaS>5odYQCd9$[kyo R%7}F֙i̛c+pں|\ 7fL!ڼDw:Ǧ~0bvɁͥhNh3 ^;}^M[W՟_Tg2eE)u4) )8*~='|TG$ƅzht]Gf8sUu^Z#~\nO1Eb{3_7| jy]X exvT=a"pd ĵ4FB߆し[τis-La@'9'%!)F.)Ckqm;BɫeRF3ki|?^7182xKJN|~~nyYONn9u}gCWkKl 8خkS}rR#upY__ |\(pyb}F|~sԭue }Ѫ '"\/rUW1:Uh;E8SP(;-.1B*@"+9CMƜ^#fΎZի[LŠ(Kd(MOE IHB&rSUcq_&Ce2K<|`,Ӟ){;e+x, +> P{tǟ-4n\D|]7ƬUyO/&H!ؑ<2g]<7Ju?STy ]o:o%/Yr]otJ7aXYŌ׻:3u;|v-?ORD|pRҢuS#D#斤zoՙ[g ggvUS~Z*hq3|1 W`5:tLbqBjU7BT#IsSIcQm̢S!57+)I6"/wI"gnʊK3HDrIznwšݟ̄Oeymw;(%eX4xF!CxHײַy%/!:=h'3qfωcg7ҳ{]!犬t*F6/ =>of2e5WGF@U?b9?Q6/+ro*%B{x_|#۔i7WkJPC:(ǎkI-mg\au ~b3Uq>e !&Bsq4Ϊ9;pbe ?6OB900X"g6I.rnxH|d(Sζ @L>-re6[l㋿/dUkyA,9k0}H䓕l[Ʋ֒kw]{_D丅#ϕrf 7!/7g)# e*C,O*&T$U4+ɚlDͅ1D:әwNj:Idi; beK;oE"q 5ANK7=1p 'U%@ !TɅ\o3SsC!"Ds_嗡O.WH=Zq؞ɽTǁ4!^Cګ#0"sͶ~E|7Ӎ HFcʨĵN*ح8)sIZa c900R$'°a7'ܮldGY l7Q֘9<8Xr#<~)goڤk}511i3ۡg\~Z9 i*Qy(#-_h҄n a%#N[nֶVΟ;ݥ6s糱'WTm*΄NkH5\[3=?&m1n?`o> Fiw`Wwh2ZH`<- ޚJzai0SUo\ 4 $J5']ȣȍ2r3;Z&xƵeJ[ 6B W  ͺ=6/bI_noKFeQ3oO郖1ӆ$ 7殉Y[;WzHWmpBQX}n Ӏ vnDz"M6Du2LP5[[&:Xp%1G.'4&]M_pG,lgfi]VK3>|Gנ΍$3%5k'j}U)ַ$5NJ_;{oUeG6F\0pbj/߶?5)x+.cp?2xpv{5ͣ VoGZ#54 _^- 6n2ʸ, p ԆC2GNY|_}8[R\%}ma5n 9OPX?)XjTzE&؛~؃̖07௜vԭfm^=)<Z~T"Go\Yϔc^WQ:rPL%\ st-He0aCX@fFCjB`* P2[|7`x냍FuZ38:՞O8`-ZT-)ocHM$hy O f~(c=ȇRʸǎikYwUeT-wn)̗\IqׁtJ*ne#Ag<P뉌ix}]{g)抬"$dowsBoӾ̧)rC<隧O0Zφ%$nh.kRwjPP;HHg%{(SLS~rCbvr݄t?szb$NO?l-1`=kʗk6~8!CǺ"CzU d砦TBUJxib/il۟N0#>"+| 1[Yʲ Q[߬j!M܂,~Mb[1q5Q}YN|,کNDLO̹?I}J^D3-]I}4׶3Rjt*a$"G1.OVz!8&8i%r 5O#B/YͩVʪX-6Xݢܺl1vkCh e8h#|uWG,C(DSmW$<7e(IIl'D^F6EPR4-[H8,wDN*08yE<nCiX/}joM A|9cm)=ػ&aݸgm z)I{ZaaaOUM4wjYDȟ%[X=TG %Rjp,DF;LE;n8QN[rZ+ɲ4]CzL.d/3LsaF񵂎Fz$f~*Lf_ Ыʽhju@bqٽbLò`?wd 洟;=*sYMy *q|4n\d")}b& oq>s-*>7 &!Tܘa3cʼ4W&Ӣ,#D#Tp)|:-%sM8E/g$L.~iL=a,p*?%]ON[(?=#tt)f0s5R!R4Dp{jvI:+}iAZfnIpYJ#P)Ftʊӛ06[d-a|&XavRS tFA1}w>Z5sIqv!4h,Yt폔\Sf n-"# {i+Ȱ:_=Z޶:{噏nզYg >Vp]:v?Ρބ4?aM2)J_RߵAtgYK{nIیqwaŗu=r9Tm9k?ێsz L3+q,1$ \#yM:++oظvx˳&VDk ۙ/|LSWLE("Ȼ*uTQV<א}uK7g>(Vk.jN}r\';=TY(Д R*Y7Њ_˿FH2x01kXFԺmOl0 Ys&"FU. < LhVeJ|{܀a);>Y#E4zk7vhK0/(`{^/Q5 䋞4YZ|ۂq>]8wR{*z7's !AK=7(Ľ T͸3*ds4Y(wGsNgv~teײoyyW۔YV=Fb$~珬+&ktyϯMn;~ںqg*L&TIn$5uJ3LTFU"`ilh % AHQ[Ĉp$}gyX{9dZ^BߧU1XMPmCc? ȉ^ >far,Ϭ3*KbP!BVM:g횴J/-ʱ$ 7j9elBש qjOz$*~gL$&"͘R4v7 'ctJBtKJ[ +)4Z TKZL-Xpooe4 vW,5-%2QF`"z>|)8qt_0薔ɉl!Z1skiA=yh;5iFz˄!d4S~~Yw2gi==^hЈkWtէYRf+/'_sYvU|u<#rEv?n>k67!?c}늇s!aV0sf/Zػ~F5Y}wƖqWqۺmny>=>A 4<$k" Zdc|%!%'Q}Țs#o1 a u.CV)03Zg (tI@i ۢ\.f@RYWnR,|1{;3*wdIlv1W!>}߾w%|kDV8)lz ).󤬾be8jQXM,L!ՕG-fhgks<Ǯؼ?Y:E2_s5_b.| tN_?T3cc5Dh=?"9v1^Q!S1x%_0gfJg]LM#4a1u홵L;_ϻ{%+7dQkVՒ-7_$:!T%tOG|׈CcsnH]D=+ЕI׳C:NihT3oxv5 '~[Q>c 99v'?^JݻMfuuCh!ID$C U19R(&7oE yPЬF_vgf\Na6"vTn욆j=FQf.ŸI5gc':S|R`Eɠc ,(^M3=6-$zm~_e4v+3` xϺ;\R uV1J,Wfcm7xeLac"Js)ƛvўF-(JԺ-AIBZ*Kk: b1qmӲa jyy,(k.3SZ&8jjqSQʰLSÞ^zxK6ݕw!˙,I00MD 0V1n x(1QihaKi!L(o(EMG.^D:)Ԣq?ȚCcۙZt>ݤ.Om_FǓ` RZ g{1yABEY[3Nv7^^g./ޒ<4#moiǏjJ/84> J L''Hְz Yp F2cd̐!Z֊YFY=Qę?}jW08$DžXm)PV vAKMՖc[o31^91m1TU 7]U:ak/㳽y1tij!cJę7*d6AMSJK8N00UBpT7 # /{]O$g󇥱aE;>rMM8 6;gCy̱>ؿ H {N\7r7_gmq띉na[A>xh,^XKC6m~uQMHӘV6Hx,aOb 0{~LiCiFz|x'#=^3wtrY]q{n7/heDL%Y'fj/ު))ѥexA;]9 e3K5#"M!3cf4 wp0YMa6o|>Bt\PJMUZ!YսX󏘫{J#qkYvg^h1q 5@/0YCk~FTwx 85a9!+2XtOV?m4ZHn=xgrwPyX.b,n(by!;nDQƮV\:A:ƾx]X ƍO'%b0?I(҄ Å ?&d6 Tȫ-XhfBse+;Ul/ś[ ;Ym?Zvͧ{rкnw2W2:Y`ߘkm73_O.Dxuq3ݒ{Z/7X4 UFxl7!mWn-' J !M|;Ӛ"'$) jw@W&Q !^}ĝ,#^s10Evnj(2DHk'WزA/Ih} hL]zK%3 SLM=msS2$LZ&rc/iRaf OGLdmd^Nl(ddV!_Oǝ OF=w{ S|c&}U15}ԟ35 ]ftyu!kU5RZjcv<#}瘬54V**Zd-s\abTSkyy>y_9F-M9% OAQ]R'ž y_qW7NQݢiu$J5Ny8s@~@|V5F(D6l^EA.U / n^Y*9-sVyQ5y|8eN28Oo [-X~+N^`Y Y?[߭ &O7WH:JfE&ٗx3~X!sa*WAɗ 8y0dp?r,K6 ѓ5%N:eKz9즡7=M2z[bIgn(6:-t#v>V"Lx?bBױt$24~zpxA##R ֩LwB}DO3kKjvyLMLܻ8D|@q5$-5{xyckG6ƃDuVt$:RHe<1 .;[dQ VD3:iuF໰.`vha9;(\0o9sBbo]?b1OI["N`m:O.k(H+g/;\6+|}0@$2Dbu¸_T֕ma#4/pU◠%G[P>ͅML&cAA# Ab0tJ#P/bH{ ˕H@bx{)l+YT&@,c[ @3]000M'm !~]X\pAaBkС>*L0ۆ?‰axD[a n'g o?gjAMox6^a]d/=jNm$&'{at%chvIث}Ag? ~v+24]<۷3gEtB+s'h4}s[i=A{Xhk IY!.J &ZfE`ʘڊ+W'i*Cfӕ0[7Bft/S1mDEgO9[QQ3l3qA Q,0}ѠnE$̣=jsV6jQ4^E-0Xb*Vp N29ƍ*,znb q5DUju\g "Nf{f$s*,`#/]&;!en՟2rmNZ1$:cGywxּ Oe<.9dtXٯ-ώjlN%?|c:h?)5!|} r$%v|l~atg=44dG9uœ}?P_IQg6"vk-7$Zp.V8!^Ec~ ?{?wdvdGѩdv估xc0msR}PNEfIkl&(Mll)#}zC16Mا9&$2Sa6p4H}!)* @x[Y?E\Uv{sM!0!#Tc塟Ѵ^fdsyޓeƆ,.(=QKMx5uVˁ(DoWf ~f:?$[T*7"h5 VGaVZaj'8Y gdl# 0]ɐixx4Mؤ ۵ !Lh2":bO熇Z fѕP$8'd-0;C3x TeُRn5`CR!=̎($&Jt' x֭qfdj3Q.AtIsSgM &:XKZ1v:'Lw R}ЃUjF~o imd8x$vx&H՜k0+38x%&ٸĴMI%Efy&/MN&zztVgHIw0J'׵1I&oƆ2 ix[lcJOd\6 4lI*~0c1e&r876 } Řq=%o2d^G̽K #aaokr*b^vK0OLyjmkUU+k9 RΈJv)pyN;eDŽL&'}]g#9of6jn2sq 9 ~ڜhdw7p;NŸpM&%㣵0]B7몥\VT|᪩wx"isg39&s7\+ {O[j/LQGR^CAgiE¢] rCLS)Dߧլʤ#{۔mqE&zylkXPIbRLs{Dݰ4?( m[WYӷ^(+Iy|\.˨!y׭xRhvƲJm`l*Z _'8ny_ 1cNÜCyn'ݬqZ#|gkX6۾8h|Zڗ3Qv ULJL e֜hZɵ[0N>wه=bקU%Gn7Ek|_dTHHv㚶kj%[{߸3_zw'߉`/Kz͔$m# #{;.hJ,SǬJ#9d5k*ktL(zOp!q=/F +coib[dvm[V\ﭬo6jOϻOkиW;#> Ke`-jxN' vhK^貟/?s~O27JA~ɮ@%F1ҖW꫏z@,A ژ_D+rUfnJAyw"=׍^*6믍uQxGe1$| zrUIl;n.ef"C8[jhؖ0P_h)['\A>~]ADmg;X/Rpjq Wڶ$f dY|N2|hGRZiviGEX|Sm-uZLqO6ݾEErs1;}C0{EO<{׏,5OoJ*@V@kԇ{Vzs;ѻCa{oo IZ>[ 8=u8+7Qei4y.#{ zlX#|!{X#>Kq|):cm9?˟|E|>K<N>o*Մ6V)el; FE]u2.u// `?'i[/7c  z"lwa|pfL; 8Qso=ܭ}mV%mx~?|\3tZ!^F6oUC:8(.<4rfm.#}hc/ݓ"]w@&gj{vy6GFmĵWü{%2q;l*]yI%>YI[[[9lmԹWoměXR9 -Ky.;=bШ]y|q8uUɛQ4/XdEqln:_΂0iMn9>VM]xط_wgLZ^j߫վ޶-OPAL~!>_wv٩_|O'嵻A.=ȟ)GE. OA JN%C=S44x K) Ү+ɯµ=WN-e)RHH:]o:Im+੾%6vQ.1k!dCL/q~[{[պF|Iv{$k\= m Z/3\={ ޣ=OiEիPȳ<DkUm_|Ӯn [ם7sd{ajmi3!\Y]@1ue,*T6F5}{ޱFlաu.*ΊnYJ{l+׍\7ynhЙ MqdD.eB5挃 j%uL8)(a1b|;{K9 |0.7[&L` _/tf]Y gJ (,`#G" HUyV^Jo1XS #H!Mz93JA"{Qu >rϽwAA:fgI$7εx$\{ykO, BNҸI%ZJ%RurpiQM0q"iNk^EIAϦdmH5 'җMM:lgT5!n[)~]-,ij8x,i^/靌Q9K2#q .ޝgJ&u$呝3QCⴭK:I3SQT (CCnDu36ur=.=@4Mf~ _?vs`;a=4+fCe *Spo,{9;;zEPWgV-{0xmiFLWWv?&N[mwh;,^2ۓ'Ҭ7n-Fz9EJf͕B8/૟QtTOGc }TK5mL]Q#鼪vXK.4k\`^3ExGwk(jWMiC<_L몾ݮ{?j*όOTj֘s;r;;ϻbjff:̷)LoGKVa]L$5F}8G=-*'nLJ hqW9׻j6k=kY [Y|g?f8Uj Xʙk yjk- f}\5^Z!:43iN4l R@oo_o w.J -R V?L5~SϴxǶXS3:M:.:ɰzU]:z{e¢M[&LR٫ QN ;37#t"KVoQZ:M~:z_q3yyIyTp9gT駳2w%=]cer.EUjwj}:y=r>MFJy; (;lT}q@2fk4\e'n5v|%X\Vvoz99R63R|Or]ڬ-PIwՌN*znk dg!гbAd_nbφ"`y9=}#i0n |u G4-1Garbgrˤz_op|_{ZKL 4 |!H 0 oLuq~)'!kѱk/awB-km> W"E\3yX*|]7ކF.x )κNE=؜)W]ڠDU>@Pr 1J@v]T~}{ LfC<K`z9Q&< I}**)ɥzj4ore8GpGWBƂvdB"K^{Sy\[sW}_*UZ(.($!\cQuu꫟a)[utx7wOW#`G|`~o⤆_& }@,>yfb9a?m%ךh :3Z\gXqgI gcal!nOB*R 1de@И'lj?}n:M'^6E;S(׷qkh58A:L54_QJ lSɞ6Bh!9h۪̝rԘGI{~BmxteU/XAnIәbaiqPׅܫ=6.W,Pt*j2J1/ns;f8q~͜io[WmE|ߗjm {_Š}jZ3 +z$U:*'Dt})>0yxrt&2aWݿ<9gܧ/חlCn}n$*M.30 z\XщB%]+r(ce&ػJ 'f6Fݎ-gxW &$d}wIq-1*%?GwZO>I3tjEbk h$h(%H8Yn0KQ.2R8@IH`R$NQbrf@Ej) mmB08;"~h EJ`-c8D$_=8ɆLdNFKBUz3=78"$"zfHI "^9lWdt/,r *jKc{b?PSӾFG__n#p1{TyWr$:ߵȲoY7ʯO&ۃ$iAD=}_jJ~.}r>$8 ~y@A$|?DM/d4W=<5"HٟY[7|jOAM4wwQFwЈ3DX ,yeE Ovh bOOw\*k&kO*sJd(#r?Sg\_z^O4+`0N7>'d# .YuYf 4jF!L3IG1Or_^j-$go\'\/kE}6%tUk.*_,,Jj׎osoO/2:dwk{pOu!o95UEGXP1e5Ds=_8\N8bamTpo',skP$Gz?P4o?vv\?ΐ~w4OHݲhֳQOK=AG5ztCU)!Al'@?i WϝbM$]80}ػcBHL3GEϳl&x_<, 1nZk49h:D+ŷ)qK&0CzHB? ր]͋X ͳ4Hم8DI2X&#h?٘KFh3=BGd`3#[c'2b,DN hXɨuvd1ށ0@zܿH},Ay<^5_D9ر]2f%tz(<@qMJ선SH ?"H -:A!P' v!iGƧ#DE5{!Eqe6H8=3M'K5pC$!#3sLo@&l&P8,< ][Q]4Q.ǣZU%bA^e Tțj͖Aay货S07P71&dKB8Ymt:^do!¹665u==1R3W0f_4yCdS .ah,t)h-f\&20dF0k4F&dQƔ<]=˸aqkC Bnu!qV䭱5$@ɂlX ] ̌hasE#o&d+ 9&nkL&R:!maw4,8!0փ5@͔m`(Ԇmdm:Dd77FpFi2SYm풲 21N3VH뎅>>f3q|4>:[B*e@4 b#G#f&V$ n?։~4,۬9KxL+Ϧ+eTOA/Y":a &Yzļ8q0߶cc v9q"I~OgNmApp6|.p8?28AK8Ou<=d(dI$$3<黦 >y,PMq3be1/'xk TyZ"\_)T1@zaHF-* !\h&L/#m Y xt{ɐӞ:Y1ֹW(X3'xK%xuh.4hO7Y!Q)2l#XpT;hz)H' "HҠdI%@Z]n}ު[_MWY k{)Xb LpX^⾿#y/Itu8>%f&:Cz7tSG=0DT{ ;QaxgAt6m~he8PrV 1"=ǜ_5qK46w}-CS=i!LIօD,f/-cSAy/wLωaBrh7P-RNNknq9$_-Hq! q5)׋ g_ xgBDkeBD, $/&xhR!2s.o`5dKhA!<:!bȡ#40tjbf?:Wt*r:'x{ӐOIרؘ|a썢l+0aSB ':?KWa>cQT4~MёIl/rƤJ+ɚ&}5)1D` F- EQc0(=ׯVq<#g˜:ϭ*v{mZ zbz01Վcoٹ:Xy('D=( ABB8sNa1 H Zu !ߕ@VpS u@#@j&04yw0[wFd_GR/EJT4J&Zq&9H 8>2I"W8c@S1a}I1b.J|{Ț-"Q>yȉ[oAOR:lfBڑFލ_Nbo 4eg>b&װ@]T~|4i0haWH$ <4='j 9R!^&ΞCa~{skѨ=Ii;:~E.쥂C*Be<=Od]e>7'0=S_/X~v1hꈝIhz˵:bs>hALF.$:L̊$ ;j CGm.l6>OqB*;rt%ĉ 0~R!u0F>4ҘIAWdGןh ap.W"A~&%SZϤǸXS]7d!!r袇!,5/E nC51;u a8 p$$6t1tU1'kgDDYXmafy\{%((/тt {C\czgb680da#=am{ yه#Q!HᛉĉRS_5tB3܅Y,FT2,pF Qk ]A?x L=u7Fay.ʲ͒uY[rc8ٳFȉ',BW@57lAlM%{ a )Bؖ-,"1H@ `Vw~  ]g.4@9n}cD"#lA>\[! ? ccO4s!9L =5 _zOʴ & YG fiT?]H)WRG $T8X^P{i6Ћy>dΠtŴFF=}{m/S~o{4a$" @l*)Mc\&y@bR? >ޓ!!T?}%5["LA-WdEEM/n4P a $H`d !`C\PpeBA! Dj_?OPu? Zfpv>5dh:q GN|#$$%s.7bE ±0 K1j%ĜO2f]eEC KGPsZց7n<~Ln) !EZ1 ˑ$* OqJR( % A,R,ȈPQ?l@BPN>(H6S=&ue{ DhDg]S Y(HB$3HwuE,hETDO$M}zwj1Z-] ->HA7"~l'q'SFlTl֣RQ]S>7n^mѴ.hdb?;ijJז*cH'[ `E5}5?#"U ΋dt9,_1G3觇ߟ8~OFT'~ʿVvoO$;>ú޻=Oi? USSCP-M&-UwC6C1̛mcm!/%$f2cǯwr#7὏5geL3q6aOJ4DOW7dy $3=.slC|1<:H%~%jWſB5OSOLe41NRqxwYNOW7FT*qN~݊Z᠀9== *-e^>?͛ewCN._ߗ>ϻ{Sֲ\^q1۹l>|>j"aO4ibTCd# go|1҈GM2LgWͪ )>/YyTB at*BW#XDE[be8g(+UwtcA <{_::_A?,<Щ"čD |Ҁ삃0uƵ[4Q'o@‰~L_A䱫hHrB, |Tvi0-"uL!DPM4{˜}}{hE$m肇8+zGo?OsA>f,韮=#׆$eK  ~3p̘cMn4S CWTiB0c! (&=0/_CQvba|[7fI{#l>P^G\4YmS0}3:% ۏ/ٶO^Gh점/:p<&I$kiNV?v->~P\NlF,b0LA-Tf̃r:q#Wֆc?(0@ș:&Q1BMuxiGtQDZe3o&f7}7GdzI|O Aa}'{Y#P xǏQK%9}̎NͰCXmww韷qܖ'#R\s5a8!E=«8?LE+0&h#;5tE]U @\D02 Љ*CPx76շ;qk j^}p18qsɴN]Ti9vN2V*.|D$K3yEzY`)cG-! az[#n$X 1Ro:ܴN oCU4;sv , *̮| ^pɒG,vkF7%Rjh>?M@GZ*tמN_kUCG22YI$nCٖvuV&̥wu6E 8hGNa_| b|;o|=1mUUUUUUUUU|5QQUNYchO1}3G 4Aa4 ^fPaJL(w!xD]y!7 TꨝE v2Qa@ 10iPzߚL-K)6S}q  se `>\%e?iE?pwhj70Q#+Ѩ>3$*d-{1C㰡6@ ; ӫcG?-³}?Oii&!&>,a}GEs]6 zEs1ld>Eyz jc:5w Wږզf|jqBYu~5^HQз4d~B)˙oOUy^]tW}pUO}tя.u8[PxT0֜!W\KsG'fZ>k5amnZ$lU,gE\y#*ލ}<.iCO p'|P>T3<,w,Fv=|/v44tiϒ}8>N^}cQ; yyt4$+!5{R,!'M~(t%\$6IۮKєڮ 5&V&0LZ3 [|/w@WO6WdkRD!8f'>I1cwu#ވJ&by 9Q/ɟslJ"XK8M];z{"X{HT0vq`L~4uqE‰{Sf(k-zROQB~CGM]~rål1{ay 6ZLz{`D~QcB]MkCQ6nDW-~qá?c&c]jь|7{;_ӕEckrLg0*+\3bQLGh4"Q#ǥfn^N3JNQKڋ:|񦐲&myk#UrFޥ3| ?VMzmLbBAj!K֩emKޙw|? (fCHbj#Ua/~̪rm {l usCKD5Ɋ 5FsJ!z]י:1F.q֠,6as q?,M_p^C1Tz.1x‡PP;aOɾhUh]"n 4IfEtqvF`HfM_9M3~[@G]fl2(?"c)_95f˶uc*w[*CpTr]ޘC3}G Q+pkLc-B^)unj·C[J (sA:C{'WҶN֥% FF:u?xAqúp|&|Bۗ_So#ƅGz+I($oqʅHL|k}۬B1[!ޏVazՏ1q月 cN7& M Qu,_woe7[rc;xg`THo\yHnImE>-GN ~X/';jeC+hD#Eݾy~v /ӕZ_~})@H>4@PElkTN -d'9i' Mڤ |ge|=N9 Sao3Qگfh_eѡ1SB*%|?j4pUq44/!{}^; os#g4|ZwsCtmwwGGN]΃NbasQj[-~)tD}PIogK8@[] 1O?f^1|2k] {4 & әDp~Uy wt[aDǮ[@D;]Tad2X RP5CTDQ1~.8.^}M~0ͧKb`o G$4*_7^yT"8.TܾG`~$8}p+AN o<X(yNCEs h6F489wvuM}p4>.d(?.,'4. | o* 4DxJ0X5zwb{@3qs.!h݌%:DL]@Rn$pzʽ2C!JUqIVލ{g TnEm VH$gxauXFF3q}~n_Vm پc3`f\Txuz‹qX8Wl)N  Uk:VCtGjP⺏/O}]`qOIBRJH:j捞'7NuӾNcÇn#;מuB8g;KsNeL YfAeOu*q&2}y-! E-7psݕ.}Kq3]Yͳfk]jt¶_\ݥ5>oPݷV+[z)PVQ\#QЮE5H:s{%= E2m~aoϪ'T.ڠWrza[qeGYvYP? K!_v}PA S6OM7.= R=dЗI"t}_bnX-,0LP )D$CK$DPD4JG!cuy9O}W#gNަ꿓Zy9n˺=i&hCJ?yk%詇 :cl OTÓHaa#|z^IaZFtyh́iSXl#Y n|́ek<&ӭ Ļ4FʟyE9c. nQPCJz6BoJIxlgQkQ֔3#Â_'71DEn^`Ⱙ _~V$!$jpO{+Nw;< >ϸ_kcQf5T#IG*OSy9l mXWW._,aS MhE0Q`NYn-$7vvԉ>W5}>.}֓!\8yJ bb K1`&&l"T|k7~sd: 1Î7A˂H0q8r)Y3GB<(W  210A5{1R툟De"}P=}'hm1~ SH%V˪wQ[yE~n6-Fq5LX)Ruc3amf-- ֿEԪ/kA048[9fcu2'rsL6k9#ݶҹՉr3B!/oD>9;X\==xif0u=)l7ϓA F5H,8&ƗiջHŜ7B)f̕!8@1Bdhc8ͭ;\]?wg(-ΛȮ~ciqnLFu7 ֲ-s탱$S!:w8X| a٥Ds[~y@Xp|cHfJ܌p '7)*NC44'sO㨂)~_( Y'Oo<4ţ63_?_ai˳a_5ۗ_8eP4',=:|ڽ0>p֏3ns,NP|h戴ެaC-lt|̊Ǡ J_D'nTP+Lo}f?l}Ma sP{}q\cYa QpUEQKeԭR} ??a:`gq* PB/?A0>G`t?>6#ăl%S _꿜ߟZ{v˒*gk) 5SڵW rq9C/8EOAƤRMbaY~nb>y)_}\9gAC]Kl\l˶ޟ-tRV!O5_ϬmC? gH'hϏ)|d fWQ@[ni. yÑs@` DEh~^s0ț@G$ ;0E1O CNYqu{.oGbv`Ń=EC Gf͍CWZK=~r>µP# a#\JR/6!95hZgv iqI3L<#pNv"0*OAm6aAy$ ͸iKL4a\P-cқJf&5'zuR[n}<]tG's 6:Ixv\v'e=H=?Հ߭-7M8qG&A$$ΒG[|)18mUp8F= tp/Б$} .o y56}?KC#y_ UZ&zX{> ?<5t "j3C9Ǎ0iJvz 9D}9G8Qy:dsa @@~#U_d:`#L%Ntu?\'P>OdL8P KNdޞxA:yOF(0gyz;arՇ˨m<2f|u3ou<_Ko@:(HfMBO?iNGF:1xM\._E"=4I|8 Q{޾%QC BFDԓnͿ]zkDK'jJ检09];̷fζ;&"KǶmUwcS=*W NFl,_X{UY01{Z bY+Tc0e L&`<9PX)@vbވk -lkkne*Q sbM,*"̡ IGkIMm>ctU ]y4 6ër|/>ʁjSTBi TSY!`x[:a|c--o;pBJ*aʛ3WH=В=X'۪+?z`udm]w1z^.GfS3bEx;k VZnR+A5$bn*_S;O|*SVv3YFݢ_$՝,sF1Rzz tյj/wh} l}9rEվhurg{羋%AmE59e˺;qe N4Bδ{K,#FϲO4}0Zq)MRf(Zǂq42ʨt?fU7)[cQΩE/{ɪatiǮ#GU3ݖqw{>ϯz9^:CӋ2yZuăl+\gvhm:)Y[1@Cgit$*i䌊zvQDogӲ39m xέ/ռyW=r%֪ -ϪoޡB|fC̫^[!7Cmύ]"s Η_[E-klLŦw,k{0J_[]9K]Z&V0*`߆{ϓYPx;%X">&'S[gVH^~5/.8o Kvs2hɛ߿7enk[.cBx.JnI+꿱+|70D1|qڌ~KOW=ldRmRU꺸g.jMe/ԟiʱmwE=EĢpR:$:\‡.g<+jP(G)qࣳC~l:"w4U]OXс֚+=NX4=%8UG*~/vh^s7\$~ʧ+45o,1:qCW3[^xsûYbQ4qqcSM zQ?wx2b+gYz7W=7o(>Ǡ+ w/(W4[ QUVκ |8ҧㅘ4jm~;E?6l.(z+EBx^Zt=h 1϶7yjgfq*r7l/)5[Z]W1^[c,JsYz kjzv#7y ۛ?O`o0( @b}98A>C&UTsg>K?f9J<ΈvEڃ~#yj* Uv:~z/uJ%꯳sdB;lG6S]f0hf3*b]_Z1l9ibl\а 7{"-L +n]Xm l$+9Mtt*͇],Da$oc?/1? 88S\LJT}DVwsB;2]Α#9D"A!2 Ye07GK&V;9OWf=V?3`R=eW7@b4m]rC kBIg qm4gn4)]*@ٟ*ej,UtYRfKğÿ<*|Ә^3'ϵGSC[S_?/O|h*!R,ܪoW|h&iUs699m/mOjw~nZ5hY=LnJqhI{.LE06~GF}wǞњ (95ZWq?l|51gV[nߑ58g9[ˬ9f㿜޺]&?<"TߑEB￧o|"4O $xx|3ʊ>^zL NgU+VEpi$Ə9{or$.P|]|2BOz6c]Wo<}u1ߣws=Q]﫶(^O }5VĕQF1 =yK ]b~ϟ?%r^zE/іgۖY tODRQaD&~|gU~o#ő,F BCW 1k1sqDŗUq<vl1~t$svw~/);N$i͸<[ĔI$$q#ϲ8mj'߲U/V^GYApc袣nv vI2|f J[3(RsV8m]n\иj]KvnYsk<úGxtX8Nmx_[kE: S";St:vQ cCò<3n|] W΅++@#g֥ n6yi~5$iUYΤ@ 8jɞWAHW>Z {f"Rq!AQ|Xh<͂%I7>T$CN:`Œhu:Z^+|a3(a6)GD&tulzP萇Y ۺ jI 2a֏WkF'whX?i>@b8r&DBsĈvѼvXw<vU$qQGVS=/:8 Da_J8Abjݚ̿+7$ܮyJvl3tw  G|Fl(C#c>R{( t>]Qws'+-̵30Rۢy>W~|~8_Ϟ݆ӽN}mS:%Ϻzgq{G  rLr/o/yuR^wYY:v>3TJ_錃+΃m\?<ΕE}A{qѿBpNRB >m2SѲm?쏧XwzUzߛL{O\g~:Udm^gO ,wG=79ِpBN Dr?hݷĺHQGF?KL+$#b'8F9D\DX46$QgOJ}ҚӁV@A IzX2EF~[]p{j0u78&fټ 1@X b5ͽNPx^Ec}a<[!H X DX~KL5҇"x$D<쭽3Uta$ۿOiT$I%TUUUWgA>SZ|Wˎ3f_o'~xNi$I]Z%jd$Cq.v&-QPGG9 }(pzh}aǥUW=*ՕefeZ5 +JLpcpYĵ hE:ɛH_TG4XfH`gTdQFNΉ!?ocOcL=?>h6\0 Kf7ݷ{C"Qvw 2`WTEKVDγ>*fZ(J/aEU#k0UPTS4ED!E*l$._xߺ'(C?Et'&I6"(Þo Ak3FFa0l#b!z8#qCq ; I|SRY,[th諮] bI`pYHA"-yԘ4fR6̸jDfcF3cgZ1%93xB"5x5j nUUDeEQEEf#L$HOf+ Ay8-W7bByRzHg#yH!͆v;.~f G}|р_!h\FFU /f"_ 8 z\!͔gyHA$r! L!פ9ldCI" g` #צRPQ&'$2HCA0IA96d\K@8n1 I$3[.9\'Yq% !uIa/FC͸7$nL̬̬̬̪̬̫ b9j! 0#ȎTC<@DS#f4Ql*AԏtߌRtGُ,aiGrIrȉ} IϨ0#M{џo {sb aflȜ`9Gz0>!B~ǕH5ECV ̝'8YAApuKMHCa*d t»$.q˟MWgJ!<;fJӞ3.~}z`#x9wjCbdPbPR#_oc7F,V[@eC(wlzS+v"#}1j*)+Z@*83Wu|"!nYrR(P^2\{pp>=[qsƏ }[YJ1fhQN!8" KkY C=@-;oL'ENbt@8FD. )USD"V E Z 1'[[`J".J1 {g`i8|cj7s `$- FUhj3M7$7 5#zjFے7$nHܯY$-nHV#rF$nII,  `P.R7dn[wx\nH$nHܑݵ-嵸HބiQbXP[&d6ZޭDƓgpD AOy }qF8wPXX@c!91I#yqT,T09zʪ?pEV"0 BEmF9#l9!b2ʰʋ++=zmVf`eU`X"dR9*% #`Mw<j%j^I9H9t@{lCI^Z՟ zѭ\]u}l¢dgj٥\v`@}|` =u y1b4pvff`(B$#*;> ~GDoKj?DSqn8ݛ1_˶W?IۮV%'Tě;/,|kUO X-a4F|]@\?n֜;fٜG..aC frM7d eЗ"=;hHl fC1/9o(L <>r?dYHҭ-3Zua4ϖ)6[/2@q yN)|4-5|4hjlyهN!NH0 $'e[UJ|.T q4)|fNy>qۧn5MTY6eŅ@-^u4)I${'^nȄ[˃LV㓲}_~l~?A)~_뮾9MtP'(ItJ V퓍WS""E Q!Ja߳L쌡mJ% P<z6CTJys GF{,R:]0_.aJ0NCי󋐁٨.r}(ᴈz$T@:‰ Xs؆G "iloj)6wn&^i*p0`I4nǁھd)4k}TL1ӮQ '|GtS|Z8qP;(&x"qlMܸ͋L9(Y* RɢOhi&TKov8Nn5 )L+- 0HLȂ~}zu!vP>\DuuQ px"8^a.=V9b')#^"__okr,A| {d*ـt~ \Gu\t7cDM91y1Dn6 lp0G[<=X˜-iԁ|:sJ}SAlAOӞ;ٷsh3!7&W?so!{Z7$Y:u~7tHa""[̤Id^?>uj@8k)S>r}=?oQ{$Ę%*|p7b4R(<I׷dmH5ImcI ZFrh| с_.>˶xE1h!>|>˷jʈI ]x]}ͤ9fs \+prEIGe^K$ In8Y ѴɺIent۬nzy_w$SCף r0bLjӉ}VH,38lAOvoB;?YM:x:S\ȅQ1gs3,x/]'Lnn'G1&d )yG2"baW^uz:3C7d$oifdHzŸ9wA&a|f0Ewm|&u\-7pq {~tt@cU-J7lCyׂ%Ukis5rba''bjQ:-`n~ғꒋ3q)Gl{֋!^f +"7 m dh}jޅZ]`b~XF?V~#ah'8uZ@4"Mq~-\+%-Rd! v^O128>,NJ ~v?buM f0o"ѮrJ]I%2hv,f;o^wȼH=+w1,asKr^agY"6Ğ?: \ƪjD`vGTƊy?ڳtV߮#1RGzZa+ӥ٠sǧiS=Pg J"d?װ{ c~T fyY~.gBdPb65KS.1346E5#|qm۲E,a*c|q`ǥnym)F_ɉ0̐=Ʈ6:c ߑ?'?m-|J``vlcJa2PPH 1,f=Y/-~ JG:dWv!Mn1}Ԣ}׋  ^^W2CwL ĉ!<63tL&|'z0F+99}4PƾƎRs@Ҟ1`FˢY~`gMl:4U^\y>VuyK`[e I(ȒfSrH"EmY;_n3t=|A*1roP/$b`!=j=m'Ec|I v_*Ͻ3s<~:=>@L@pT U{5bwN{&̽'E_cbY ^UӸѣRHGN)b%9݆v P\q?˥M?wg\VZ( >!'X=V#0G\ 76ozCqB`zzHs@8t#_I!1!v%Q(PZM&AH/Ja A2V8<VAoVمxpj;և}Poqh@؄ JY'?0:nۻvaAfIZC!L$N`‘L71YF 2>4[_1ϳynP|ϿN,C=?%l6q^sLɇWM)"dpߎ6t n7#gwQ\p(:ٌ te/CDc?[H^a7LZCآ3y*Q⢪wa[fi| kج(} UwFhO(,goBI$tf`Kx] 4e5%`ޛw ^I%e4o/5}N:M`9{[|}o֡wymy_b#M_g/#fL~ E 7r@E7~܃<B!NWt!!beU"{e;Z!Ny.֛ 2Gn-{GStC؛XׁMCʶ;z h*B4J#; Giwޥn8a7f3ʀ&p|Ȝ;;*­`wjM"HXXGQ&ȶ E/ )Ѹ5֊dZqSnymVT'%5WgrI& .Z*[ONN4q@d7I2O 3 P9{]+;!e^㨒$* 8Z2(0=dS]@İ ?BaX`&3)S3)NIU} 9OJ0h3 Kqb g2+-lɗQx;`3 JRUݡ\% ,2mn* P~_Ut5ΞIkE"=,! g~wPѫ! '\^rĩPdE5*O=Nj^;:__=g貓gz.[*2*Q΂LlN)KB0jfKt9]f^}?'5{R4Pn"&u3>^%3[!z&Mɸu)Iٶ[3o'~*%DgN?vm}Cqkv5<ܿݜ'G<C7)MR}%?"Tvc^5Y1DMq]ʹi0(F/Մ{jTK`xʼn&GStփ uh~G4tux*>@Z[n~ 3\/s 3AMt1:,4!lB-ZeϢ7`g36v5b鼢vtmdUm;\GRP@8ßkVeTlm3 E1lTȼPe:: r{1ʄҧ@TQA)`mq{[ڼ~/oVpᲁM"_}r܌aSv)$uJ+;ig-2¯Z<6=UL&lS&5'#O((p\fԝG$纇:\vDvu/+y)JDW8z[<V˞QDXڡW- B$&T[P$x> GJB LUkgm:j,"A~6v=2%(E((rz}+Ͽxq6$aIC#" B9qJD$9v8g7T0K(?o%~FNOiyf޻Ɂ~Vgug8V_ $fFpf0T*&VDvchjFHx'6 M=4ofz@.qTuBQYC় vĝexƌ*PDߚ>6k*ٸ|(8ρ_f$>ia!&%Ji5-ㄳqh:gSN3W${uS>l5+}إOk^ÜN\5ly; ] E͜lƇɶL"&ZAEn8S*4U„#YQ :J>cr\nkUV~N­,gSx.&VmSqkf̡"j7wQ4=軵l%E{^Zw,C[zpԒJ)6Z?c4+SG@ʹi)]n)<E\:m($wIԋ:A&^^gk=!7O^,ǸF0`ڃuN,3գ[KI0'r[ h#gFbXg L RLF!pVi܂pYfs-M:sNn:ӍS؊`D/%Jox̥=3 XַmZP 1|=56_lOD /5bkغyӶ .v 읉о:?<HH< Ҭ?gzYґ'`!;*Ў%4S~M84l76L@FW;")Agcݫ,s?uwSG;o/G~:NSQٸ$lnA2.qqAj~uּ ,? Py΃ʅ#H9A! #+\3eVKV1$pAd1dd``P y ^!ILaFƒ[7Y1R8]83Hc\Q &m]Dz12' aXsu*!ˢkb?"?ƢP0Ο| GC[2?@-3-S #S;_N|kgpmC)$_҈Re\ab5sK,*~#fÇկ5hqhD+g/ ݞV&GclU@aVfav"XzuK.ɘE6-Qq<ڂ`Oc?7|pH_u`QX $DՆ4u#C p~HDa(~C'RU1GH&pu\LA_5/+|$Y#T0AUf8^!@P3P`nh/cE4 TELKHDR0 dd ! bJRB(C$Aumߛr*YnDב: "$J;phj.s[@@|%oE.:YӉ))d}gic~tfg$.ͤa'Mro:ӄ?@\1Q#8H L؎T̮l BvP<5 <d,)4t0pIҪA]1G_# mŷQ8X43U#\5eEtװO -$Na4IO>cUE}24@H:fb(0ġ\:js)&ZX<`"xl.g {0@,TkJi26v7.ݛͫ-|F0Y<ۨu~4+u"c ۾5hnv5hswk4ɷfM_S7NAFfdtTNpQ{qa3sBz2&R3͗!@sr#1@A+zf,FL'*YS~8(xE+I(pqf!=$! m?#>ck~'͊ꤡ|tc"ͤk,63 "z-=OPA u2 ;<;z*BV Vbmd^W^KdK"dP͇hklʃd0x_~.+\o^0D/)h&0DlPKv f^oV<_3ⲟ獫ۄR5M;8PK3| TkFFjmdbdChvJJzN_2頾I3=6WN 8vo#5$>gr_o>AvflN?;5/)>6T*' DաF@dнfLz~ 0}^2q{ /MBF t}g4>jU y 3-G*,sVxS{ȋa4ѽV5%c̰g P6[ VD<;ZhQڅQGjJg{w?g=j>/BZhJXhaXHaTALBGÇ@ ! !"Oӕa0=.^~}6,$@i DQLJL8ـdYgH~; ߉*jjJf G[_?ЃM8 Wá\ ¢T?QS0MpHE1LßS/U1NavLt (v ">665~-Lz?O8A1n_wK,2os@'j䫼ռ]qEO;#$2Abylq_U4W/܊A,Uޭ@;RUXNmМtZ]zTbqP>:kr8s3JjB*Ddp d?ƶh hP}UoߑȆ ] F_f=xA0ʶ{Rk&'Ot A#:HERRQTzЉ(1J>>J5xʬxv[o̊NيZ4uff&Xad0TD`IV%F9/6@kXZl^S\Xtٱl22K cf2Ɍd# J+H|dc Ӷ"  Vtjp)"*LF*[C?@y͏!`EA":Ct3t`,)ʠJ}IFEF"Z(a`EM1L{A@ħ`'uǷn}F좤 NࣆpjPHR<&݌.Q-؀nfQMٟ~{L b\=E-C a#6Դ"066BOrRDBϡ4P=7 D^22Z$f@q k8o7jE{cn8j X$+&Ʃ{0jEf)ɪ9<>d@5zhAꭠl<9xeyfH ab w!ҫί=~'X}=.;Qnv@ ?#LvKu&0tZg3NT, p $n+If u{O$W{ݫ0 L"U%A$u&hx A7}4W~N@XKmBѢTaVcɌ.0tH/Qi5CDIl5Ppd9K@jdڧz5~SCdsTY=0h-p9d !.&hif 0P0`L bveQʡ :LP} DWY $<}~aP]^*]c?۳hp!V/ǹaٝ-4RJF`i>Sh6ù;G]wo 8K9R$$sCk<ƒ$~t'D"wƶ%!֜cόn_ gZii> %:Ug77S4 ^S0qVnUbEJȓL_ױ&ĜЊZ9 ϓޗ}߉f5fĨ1 9׿⮳|w(3f~XcE+kx){O4<]ӣ3Mg2#˧'WP]$~g}O}nnq\ .qBBpQa !-q #&FlXTߊ?up8ŨόiDur B@=hQuf HdCb5MR :h|h1GS 06QF{Of0sצP{ GAH > "\+Bh=i#KĺKFB8`qņeQ:LܛsaэѴFnYd/O1.iB%@R! 9mtV v`xx3amEn _xGeRRPbjN;Ķ޽Ltnr( A, v;_*6:h nԺT "8A2HCB@%=D'VrϚ_V.5ozz4D+u@HR5(HUeNG3[QA )@A"9(>KDMB08xwEԇoi9U>S[NXܻV'<1#JI_݂8j5ACJB$xBiBXRN:H $ZCdCTvSqi3, {q$q򁉰qϢ*Of 9^rZ( Si$UqB<^0V)KwikF ޓiص|Kj,3d@ } f|Re`%WlvX;0Ca su oga?yMM@)wOW?}[!hH&j)&&"&o I)ލ"Fuر]RtSvV;rGdm>ovop.f$^ ILRbُ\8 Q~ Zꔅ:72ZĉNpnI 89Uw~Ϟ݉oʆӌ@pO%ղ! v88&f#LHJ]0*uWf9PN;xyßfYqEt,ߌ@pt1(ň$|6Lpz+ڟ$s)";$~'dRΰǁk+"R-pXe)3Jl]+g۸].)ߕU㢋"8,*.*u;Za"({1&~O5_zuJ6"ًkZCjE>˱Sh6|0 r^Gopr~e]j=B1zfAH:"wˈ8M+$JvO(4cBF!tZ{#l,7z=JaW&aB-z$h!! rTN~~W FpfqPix$mk6 ,fU8 o9l Z@؈hTCXjbHvi0 tl D:™&7>J $1ۤ`#)u"K=tNj.%6%\ qUChm{& 'bd$awRSPj581g1yPCM>NFJ׆+v +_M2R_Ps0}̼GݎϤ7kb`b ٠ 5΅5/1l 0%2; F0wLi:xPܻNJFRU #^LG{ 5ΆlɢGLzFDň =|b7ywFʨؒaW{TrH)"B #&B^{qz|DXbm9l$ro-"iQz >Sϟ217b*fџb-;5ux :愐`XW@2Ph ӻu킘uQuԮg2N-y@>OLwKLD""*=__F;QQep^s&1$6 t~'!^4Jʧ\Wqi "3=.,@4%vѸ3VI#sh /ɏ  HE LL<$l$yd Zs(|@= :`@%eiJ٬4dQАMԃBm66B k=RlH 6S=xm︩%q㢠#˞T]Gq̡t 6t8 hgLCښ&$L ڙLpݒ5J[3x>05,>mP pLd |BM-Ofm4}wI5]g x4ne5`{|y EB)ѼڊnRpQECxZY\jD ST_F6Qj*Ҁ#3J/=1ns{/Sv.\(k5>=b)D|:/sy ECU"2|"J=-04EzmYN?áWg{3AJ%R @r\zڝ@s=qE~t6v5HǬ6i,xp-ykRx\W:63==eg`)I *" ZIVQD& *ZbBhV >ɓITV%j[^򀏊#`'WvxTDOaơ<@"*hPH{P_&ZSzh_a}BT';HN@@J2 6yF@:bVڔ *`3Hf4b:U0&AX l*8$6 s_ѦDc <J.@~'@/"H@9K'm<7B?À< Gʞ?7"\r GW/unޭ\gOIDQ'IܸQ(#{8vz<T>H!Ȏ=DyGމ1QWkr~ÝY] 𬟱wTd| >nE;4LqH8H t)`I&~h5xIp{:qAjXFq&ۃ%Y/t>Dɰd-Q%MU蕒Hw&෉IA>Fg|ؘUP9zx(&/t{BqjZ!^6?A`SG(}f(H|?J$W L(7 _:' 2y`7"R Ek4~C-!xۧ#U$ yǨ'vC'[z_1)NIdls[HV'$ Î .϶ -np7#F< II~[ϟ F6#NK$ 7H1rwANqJT {ϔ Vևݙh F Eջ0p ^ >z~_(ux=A@@3E&ƃ0b@tiWD &J' (+3 S 0D<>N6wg& TAAI H4c1 yݿ#zD`;yFC-gl0^DWQV:keYbS::`khNE (:(@V.QHcRBK|Bl?Al^,s@BE&NIJd>|WBuq3dBѓi AGp'`&7<ǔ+gH?>9L)?&$KлCz{tsTBqY<NMpwx%ϸ__$Ɖxp)=CLАi5QHjf d$;BcsiA%~v}B,V1ePDNs{ym9<Δ$X4ځ #in9b"Q_DKz6vOMdX,t"'P` ?lO:mzkv@l"@z,Bi9 aIR(SW" 1J"L2HN!^{yAdϲ /avXL+@EҦ "!}4զiC6!H&$^f㶃Û"& 2V$.j5\S "j1>,BbнHHe0YGMg+.$m56KTFw RD.o48&`+:p+P'#rW~#]7 iOpʘjj3^4qsk?j-B@gڧB 0B=aXt=%$0 0x#)|N;9W;I("# 4D'<تQ*pWeBYB,8!J6愝 B#⣉! Gu0w[70RQqW, y6' [|s%"sB7mӉ(Am24U}S=7}^%왉aI)- x`ԎFa`\؅o ém|U>QJ| l(u<'W=}pxC>>C*1! )GnaғY 6ąѩ[ѫ+;2E@G0TD.pn؍|ױ_*ָ 8:2s1| ^{OZ3V7ȱ!dbn91aW' ^>/*JVM.W' }¬5^_JE^mpз]w6;-wDw:@ֆ2s7&0GOlf ,~LGRj'j< Q0>'ʖs kp{.i$!b̟y|h)fhb')&AfTJ;[ q9峨&Se6t#.>4>TL@A#hoR̵ gue=OP'D qU\đ=f+9r0~ȉ4EUpT5=qؾ35BHW!R (#c'%p9hQ _.˹C uҰ6V[A $ƈ ݜƑ݌+5^AnCm{ħjATaQݕ0܂P|Oڝ"7kCU4E{ .fӷ߬OV!Cp0rl*-gQ>Q~#ҀxtL'Gb cGiq am*HlEily`+h6 3H-tz PYݞCC|JSLƅB=@wzM$h7 2g5G z <cŊґNi]13{M`]0N7DFCq#`|4)u71@rwtf&|x}]Tyon^ QB"=9AldevUCBv$w}`<! XBYi#ɶ})bA=] ߉A)_$L,lHh=z9+W 2Mݹ.1+Yla< .}C d DЍOnM2hrNL/n/s{( C!_j6/(.l{2Wb]]bB`w&a 8)w#r``놐̉ WEԄv? qK( -.(w(A"&zs$Xլx{ o䰟ln4~iF0X| SSD$ 0BDCG۞5^NJ3b^8'*KX7 p {TϛhHԣ%"w(g}TxX 4Sp EfKCtK Z' !bK@ݻm ICclq <<{HChn<rZ 9l;9 $dUsmBޖM% `j;e+ҠTT0R`)%ٗM06H\ ~@:?b%?`~s] Eo;CbDH@1@!r!kbu߉[7!  XDT4U׽O9>x?/o rH _6W_zKSF>~ts %Σ E_7."2/P>a‖DO$칞}ICu%`'$@,$Cd@>vUNDRKAH>sf);v]i{&  MܓdًbQVH /9s]{>DtQk/VPq*Iw@ܩo{ʂ9x2w{rs D`S߸]jr WS5\mTfDl4u]TD=l2qi\ĈAģBp2~eTVx 낄T;N(hCO$@dd_S~*h2O#oa9t|`D50)iA4 YfS3L< \0a'P-pVӋZ@ 4A-s0b8S?=CbP9FK.08Z)kmߒ!RJ5,m?ǍOڹzPכ!CUن=;Mz i2DDGeg!'E*!CZ(M|4U}oOO2֡y/THB#pDhw.5ԩHDN!_kb?)M<|/ܒ _@ H_6O]˒?])hlT?)bg|)'̅V_t&tvn *: CcBU BqQ'0 B2H&?,1FM w8r2}-c{Rpp3{0Dx?7CyIJ ^G!"hz7Ƥj&9N+bR7* v &c)ʥqf2Fd4,{s("0$A 5)=6j .$pƂ  ޜm$ *cj6NvÄޜ^>]n?,%H7N$ӎ8&}E58eG*J1 (H$#S5؞ma8 ~u/䈂$`ip28jA$ȂӺ E?5(韹U3ϖGğ 6|{Xp|z*;۩IWo<,PGyd|%[ 8}AO&&^S4 )(# >pyt$ 8yw:ܴ2<_;˄:"g)3B ?DMQ<XRKړ#",T5?7~7}wS' l Z)(L QNI69,̕gنj @d)0LL.{>X(s0#'끱੣ " \kQ"p>X(euWR 1x*M$9v&*>pTFCu? 4>c1xSL`oλCYg7Qă,*~f֫6<]X,`èٶAaT@r]hD SEwlX G;5 "B0(#^*|qx2DGqOG>9D?D0}('(T9' /XBH()0Q-O̎/DQ]^??b'@}Py3[Y?CwGj?A?}B*^V"T-˟5E#XM+ +4$Cfq&aFL2ޚ4!FU$H~N'`{4x_8c[| PB\B.Dĩ0tOE@$}N6AA$^4 fO;ɞߚ4dB,`I|9`48ȉSPȌx#OzLwq1b8zSe} b..%`y!'C@,z ry`U01!G"1*" =6kpf_Bi& rD6`;s=:F,*@9ŅEiL!+X67E\faXB>^[4B͜G͋i |$`kQHMfiK*o-޳$mc>AOl39am{u zX $PJ"Dr[ Ts%7,.,90"GpFo An"$!XIݘ0LFcz,g.Gt4cv>Ic'tF pfqn "֡ȣ7 I<gPcDPҰJTL~"jH(~xOsTpaqq#3+&{pqQSECF(|>fДb”! o&Shx DJ{-O59QK{Gt9ʣmӇxqԸr^Kzv?2n$bY@'{ED?{ uFY_jv[ўǣj:o4jwp7$6ʊ969|߉#lePk.N>9s}fN=)^~8pr`TJOVk^hnkU[3 _lds?tcªmW2sѵ̫ltuXnS/)iIDIxFq)#¶Ry>lwL񄢲$ ! if ݆UGT E/t M/G/W)QVl  d xl5<= V~ooެM=thX XmWscDO*I>.8Q4gQgISM5R~s1cqmѠCwFL.qv^<߲W]bnI%J 6|]-ْ9LhTəoNѽûW{Br} F0fJ\/Ls^kf(1g̃[ů?1acK-uo`=Zɓ9"'s~GqƔ }[8CoOɢ!񐆞K.w̆xCA89}EڳK6wնL=-W[6} h!35ۿ-og<ػh|8Q٧~eu5n'voSr.T)]>hQ\̓AtTݤ[e~RЉ㗇\17gqAy}>zOhdr?AôsKȩE$_kF]_Hݙ7g"bg[$iF?k>*3\%ъHr%4 &~P1Bw"EJkN!% ?I'i:u Mupx?~t|!~&1??ƲcͯqӍH!}>s9ű7_+3J(  Wrh}D#b?Y@ԿHwBB/=r~oe>@XAC _Ӧ0)eg0(IᇓX`j !I6/Cf jH9s9LzΡ@phwͅt~-%昰0$ƓJҹ?f0SX/xЍ#sv;0'0MFoy I%X[kZd̙u9A, 13U˽vI/UM kXZJ7CS6j=aX)'.񁹕nO>;R })m#W#>@j1:BhQ ԩa>cKzE2HIPVJzی,y|% >FQa?J')_;=ҩOUN2 d:҃|DPt_H~2:;vi @ Wo|tl:ԣң欏D5DKT:Y&r3[ ph(<r0sɋpLtw_P6A; Kl&TLykNNu Nq07K**WA~VYY`aeGz448NrNC@lN7'x-m@4EX EadA>|I`bLHvܐ&8ȩ3B˸#K,0:D#%L#b  G,z|g r","&""i1>i,g% be#pmO方##w-H M%"XDAZ"j_bj,#3 ( 3'33+' 3a*j>--4F2IrVDQefE 1`ֿg2 ڏJڥιݸmE 5ޜҒTu\.01MYÔp W $OMof܋楝/̚!,$쮃b3&̰Y3r"m{ hHd}a!I3N҃8! ʅ֚ʫy%_FkX&AYj !L׊ć~=~Tz(z`u_9S]S)"j(6ff`F4E81B`[|J^m!jmwS4keD`O"b*X/Gr4$ETZ:1zHC aک!$\Pɬn:0$i:䠓 Xbo1Hhr5f[mkYm)ABEEpӒQ $ N#$``H26}an Mq2M\[07ؒ2Ⱥ1 BHL?a8o# m?pJCfR#*"^T0h?zf?,<ƨ##Mơ6t "o!iښ. BGCIWA="Iyq6GE%.Z:s SA!H)F CF6q'/K"SUXг39\/s" $X & "!_ ׹M$B, KqiC13ͱښ׭!{_)z[*}@~]!H7lFB! 5Š:O@ Rb@x㌠ t zL&hӀW'S| v$m:K ԌnI-3! AXdcόk p+jS;d wuC`r됣e&)"Yslz5(LŢc(#W$Bo|WnR(%h)"0 (?yN:qވ҄{0":*$#_it& YԽ}}{ `pc[ TM @A%t$73ci H]_9c$4;}Yl(^nn(G.0Bzl<A+$1y9T0KPihi%QP;̺0nA;c'q\@!@V\OM$CMƦqD@0#xc8csPh'ܾRGr@uc J@=iuF2s6; z=q1^eO?AC&Dhhб˹ǐw:>@bP%@cN40wc;׭\//wzxb)~-ŤAf^_s;8FࢇVT[vea8km b%N#VQG 2vnXl Ǡ,=iIrHJBaE0@EӁOx (($!{ fBq9+@賉5Eu{QHtf%DxUH fޮzP; G`¨c&ba(9^Lɪ!(@p M[Fխ[^ 8cd5vyp R109fwb|.̂tJTgIp̠/}Uto[$.PJ>U gvUDF].$騝Qf]5ݮ.!{yMz,uCWoUM)3 |=A8uJA 3@]*Z?岺<\ЇA,P8ë>Q?pg\&5{alt (^:i-V"  2 -6~ka@@Abe7&Џ6mM `*ČZl &%醫ޓCIy6Octv<ӑ$Q[)@lq, d"n,/D?h:wmFx8 /YJc\#Wx9CKwu6=ΚA8#&"SFG=14IS02"0i׷\&Ülr5rD!ߣ Q&g,;Etd9}I:pLڔ52}UrZ.]zUjGJ2dj%mDŽ 2[aA* 18DJ(o V45MbDNYBBnWQY93 #Á_=ix:q^JMS ]viBuZLëBWm1ml\~UP S Й"7Dek`b 2<Ǝ:z]irڄt$d ך։͸s%+O!kFO+Fx~ǐl|EQ-flmBy'n$;>dY~,3"Zzl *jj#UHUjĔb4k bHtm~uApHNT( &UvvA@R4,4KV> dR~c㤧E? j ٘ ^U']L&;/} k8_OY (jMZS1$Е{v:c(@Չdj't*/}t_h-T`X T1:GOG !/ pffW\)B:ÍsxF`݋E(e} `p}ҥQxY>Z"<`&'MuE1,jJJ!'Ц3db/bfUC$KfUCB@}{`Rzص #E} !_fT2Be g.LB zȷK,9,9#Kd IŃ1θ|Ń y=#dn; 1Nd0Q7ZҒ%@Zpq:Peu".O{`.Rfd'- hD'11S BhF$-:B"=`J wxoa~Y( )H_8H^  ѠʦԺ㿙c $B($iVQĆ%rQቄM9tIֽ5A=bC  M <CQ靬H}^xi8 ɼqa$4Q_]U-?U>3ضȉ|Z,.+ب x|l{<; S^oî$4JE0=&Ho=D}]fY ړ~٬+`pa6M~gC3g3[6'U0`&IyO) (yh)V3if70TF$!Z[  Aq,t]7BlCJ0T2VTL0WN -Ü+N֩` 0CGYLTl5f2a6`d`_T7TNP@WO>bx+Z"@( (&(0 8N-wNL58s3SV|(ŚiY,Iә:Bd!a8G qw{",  %|9s9r ԇHf*7_ `pX0b1özVz Y0dE#WY6c @"qK (ؿ& q K;Dz2v;I@?/e*%IiT R %XV"H~9f dQ"bpr'j1'r* _ , M~ 28wM"':0'V2q[!7$4.~Z=*r6T*SCm]!̇Iፇ⼉-,13:(t12$M9Y:<0wcks6Visdsg.5:= hѡ$ .:^&F׸gHʃ/AÆɩi|Xbbw::L\9f1CCA"ŃJL0bX*uubؒdZ۠]&;_k^5abq;$ 8WEvhDjToLmt\ ]W~ ;Er<=\J8Q>׼=\t1<.!K"|ٍ @$@@!Lfz58ԙ8Fȩ-p h#RA]p=s m8ce{&q8VKaGбhPmR6/qϑTjE^0 K0$0H\ KY1!Wֿ{^1s >$y 70m-ŷ!b{"FL888~i_ݻ܈'?=S69&;{4:ڋbRPdcNtgv!UCUHXH 駔¨BZ^WX^8 tp1. :At0^PڜH W3t  (aHѐ 2TLPcBA*P`(P' Q}]I!DP+7C>9DٰSҨ7B!"S &{nPP!Cݽx#wxH_?ǃP: f`h"4\c(ZyV?z<f/tfd CH]۩PvDbI6j$Y[(TҚJqCPQ]6 9ǭ(ƣڥdZ0TdrfS"~- m $t,cƤqas<;fX>$@p"n7Qڱ{(5`.쭹b^2ϕFXzޟ0: B<_/j?"Q%9ԹV49kuX alJXm$c"RHm0tA GL]ř< c>qmS&q;oJ)9Z${T"HR]B$x;} h)0mC`icH4v+pzxGSj'@å5L%M.L2)\.A!%ZI&nN^4|Ablzz; 0'/g %}F؟{N'Z# x焪.s"`+:gCCЩ9rsh Mh`%0*-*R_h]i*! ->p.Jj>Iz1VZ6'5hYav&\hb3ïA:U&S&J~S`JQ퉾;ج=A4V"204:"5̫X:P1a {,s?0{LE,P}ks.'dJ9AD|nHg̰m#3ܔНпL;_8$}cFb'{C!Dv, h+20h ˑ/FpWcdto]J~Ju*'Ii~A̍Ois8=wNI Lh1Dũ#ΊLz HzYlur 3dpmǗ޳S LG&F!@JJJ\(({I4rB UC ! P VvO!ФHL $D330̜hr\`tБdn&A|^14(qf`&@+J9 tj@Nj?%9/8wm3{E>1+i HB)RJz.^5GHyW-M7aȪ2!zi J1Oy;9] }avNs?O3z1XgU9A.CGn y`)Bknshmk$pc3c+_Ycj4s4Q9"NPZ̃<1An|Hp!s5yuO SwF0#Ogu&6aClmV%|[r FFZ:iSAKB~N [x\,w<zupEPQKNi 5H6ځPMdiޖ6I&0|ȋě!-BcqUMFɸl, *)l @he/R"!"˶PKM0F9&;C&bs#$(] PcbfxJmVALRjM P@$%AV*6 fHCJIx)q@BX.S8|.t2ܠ"`j㋉`8c,3Sk,.m8#Z72GbkYh$r}Д6Æ@ #V% cdS@f-AfW_"w\wsdjpg  m.!F, Dey:4MvJ"m@dX q1 X.4}6+Kʊ=@sLRu\Ԣz:3C[,j iц]aMeQ6 kO2 $gT f(" CcCҚ2W%daG9A];X0Hƈ$+yc M3N:As4ьaMjh0ݰV{{i"5CLPv |=6jhPcӆHǧ+dH' NG5zٛ'5rIb%hj.uOYUנZԄIKT-in#B3%DB0$Ab"F!oǬ\+ 67Olу#}k±ܴ򵘫L 2l461CZ ͫTekZ)?`Iר`M( K C>1(_;)k0/xG\U{|Tǭ`4ш[{UJ"s8+ qYfC i"]kvQpTO 4|A)\[4mU4פMԴ4e@uV)M7[jGg,.} 5#N<ޏ-T!beI \n]{X- ?)R:(y9^p/_yG tME?ezu!DQE6JC\= )IqlܡPX1Rw2*I6ރGznɴ;#msG<51(dD((4T =00!0I%.&!ӑIJ% *ݙ!̰'GHMLcEFl A1t1˧D( KQs70. o4ӯe08d3 ?̉"R6{`ᡚT'Z+Lӱvf4^o-zZ0ĐFl  Pd&`l˽%{~#z>sܹMӷ12ѡRӷRDQ8`M<TE%O2c?dA0|b(cm_OO+a%=g>.ґC" {68*طG"Pl#r4s/PTv7IL%/z< ^4CHY.2FT@"E|yH?K:' EUBP$4S,q9H͉T?/zE1plfH; J49(8&&pAeP`wCzØ>`h {=ROJ@D~ $ph5Ted22(I" t~ߞHE'hY@*|-* t+S# ~AVJQNK;8uOhaz 7<E [=~ząFiB/yr PIԪ9xr>`w"޼ iRI檝swL4Cnn,&ݗq Z-kSKc>ϧ}XgB> :QLS=F&+QD% Cy-qߗLuǂyxa7Z$x3dPBgpsMʈ}8ncjn9˪BuLLw|d[δ&3{٬[t|r ϱF.-]2z%މ|4ec1K0- &f̘ω8GAxDMB ƒcD0UѪG#b98bj$.:^ !,HO iP eqBmB0  3 ŕ1e pm#Tw0|fg6ŅO W;Yoޛcfeǩ}^v5W+ =€)&&l;sߢRYIb}/a?3:,n&K;_1鬵8Nڡ,TsC;i^: ]²"oP0NK'HU:ϊ/b8 7O>ksm"\Pc+FRAh@ǻQ衬=!dKOO5U^EY*Lh^Nuj=(?Z9S~[9fB3> ow}o߿~cY`iE[ߪ1~YjڣǪ>֧NT,[Ms|]CǤids5Lԅfs9B,0 @f7yQQaCb3 f$CAp3Hr ,$LК>'hƁ %a#iqIHWr49::;I M_?4u.W b?}l03:=Ha5 C1. j3Xb'[fq7,q^ $X-"爭C0|Fz8 $I$h@sHV62{y(>ìPQCC2:+D . ^sP-lPAj_0wɱH08햾H++;;z`2W(0 H`Yʞ7|қ I-0-Ap y~#k:~6i5҅(ԑk5w?7CGFVhusR 8-QV JTƩ (f%(t X'Ɨ,hh ;bC=8T-./gA Evs^C(>S9_Xs]^u9 .l-\X&G9 }bXAX&5WØmdvlQ☺L3:a,rE#ؼ'*4>T1{;*m{œ]7ff7@9kC梒mמ[\D[Z<^c7ҝ;5˂^”*D9ք) ihV0mB8Dp&L+iB; ]-ÂɆ+.^ fR̂0fj4HNݻi EwN$N Q &W"n- k0LG,6vR9h9!i@c@w;kaɑƒQ$N)2@Jcp(C&r`0M`l:zFd .6&9 55ia aϴ1@.Ô\ Fq46GZU 5iHy,t' ֚h[gN`S*1"*|w:$"ˎ]-&Z N h PؑcWb\9^M`r#CR c@lY k> +1(d8kȌe -`1/^M4ܳAt1A('x21)m"|:E3o91iObO2 MҦ T^3X kb@Bݪq,>1dvK{ºGf>^4R9iuKiCԐ`%NNko|;DjB78nf"SyÁ4pb/,HL6.ɢ$BjpI6e;&A"+$'zzuYUtٵ/hZ/&ovQ.,Ho^#١m׳.t6"E\br2Idb }W3p89k\YsS,Gmzk=*ۺC(I2~%^[}-wE{@ n y"Tg~֮iG.g'fv$$i5FW t̄;FyQ[K&ӱ-gjcp˔# $LXMY8;FPklf0=T`D P1ӵ9HE$afYq/0B<&tɦMJ9Q.ߖ.飜\Mڌ݋KH0vH88D&%V-vwf>PYv`Ys =6y^+ hRfӎTm5l%@vJVy:m5ye7|-4([C:/-]9-Ẓd!. yC SG;iQdȬ-&ֹ&[4"Wk8U[(X7v;֬B;<9axZI%Gb2|;(jo ;'hPaN6IF哤:Ci3&[^k Avse ֈany\ `rn*0]1( H;)6F TK%6ɳ B7Oz seI" {]mC0$Æۻ8]L΃XreOT#쉱b{Z;sz5d-]\Ӗ[x9كdVû&":0$olY0>ڕy抨Xj+>h J: ]!"o (.5iX҅;0ܭ*б 3>FWv$@bf6A+2_ok:6-g|h1h78-# eh}C"X @J1m$'.@a$'| \/l|/ŝ֯u01 $, lsX10w 6bxr;DMaݎflKjU[DK/D:fL{׻֝^[yOʺ..iomVln]k3W͵1iDHAV5O szc/n-n.i JC-ݘLS3oS֧3k=Cs.C-d, zbGAbe #qu}$^^ 1DD4o&Gg|1V헵mgaq{` ͈$̓bj l8S,mC)}"`4QdL%?R)uyᄑ!^;΢23@[53k-Ń`[6THhT)(f%Äzط0Cv)1j 3Z;Jp(SBcyk&t̹,53!Imbrw 2ͭ^a$m S N~mrdtq  B1c qƥֱ"Ts3^)!S@ڐt*r @& /\mW$F F)575wƎQ}mGhk.tHu`c1!h%3h(J(/g@]n*[0՛N4 d|GQK6PMS4|s]#B;DaQIH&!4v|6"<@&ABНQ]IqCQ8K"|7 %"5|AK:UJ|}@E((QORKH.'e8d^h2dDV:to0]Hoz>\K爥+(iRaʝ쑎!lz`2FFĥDE}{ڸ_q[q _O]. #>O.ܽ*UBBSADDІ@D~$+.@D"8c i P'o,3i2T}ADI1\%0X}=A$~֗F|{-50h&\JN 褉WJU"Eb]y"n0dI%b)J]"KrمriCQXNMXZhH Jh- Biӧ<89 \\H~(a;˿OOpuC}Ց< $I}'*I'!& ÿFi(6ZkXt`Hh@u 39S>pj^mc7SC \wU3QPSDCPBeN`ɥן k t.#IGD, $?y!dvTd@ O@R2*nndHFj1"4c>VVDeZ(֑L,`e( GXU^m je 5.`ficc$cqA:QmD3rTi;yNv>6(;>:Wn qh@b&edvX)#~3=Jb`͙ⓩ?;i| h M7$&AB ~t8WF ߼S ~cSUK {Še|2p~'֝ D;;f(c NÉ@~Hz=17KtqPƘwk";N̈zo!v$+D2 }Hv,KhZm"/ !% L0 H) 23+]`)ᜐ rd솲r;E;B!~Ӵ^4?'\Q")0;ߛi oe, 9Éu9:ӭ #@gy8kD>m8&'CRb9)۬F9AzC!z[ܔLXvX&uߍG`1!уh@<|fZ'ঢ়Cv(R Pd8@"mڦ7ɦ ɑ^};xd ~GX10 -tREei"z_`@d]HăH Ø1D-JO?p0j%k)Q(%ۣ[PxYd0K](4HXɼc7&WL}יC,,{NhkClU{Kz=u"#KfE(%~ j(.%0MzZH2Gy-i a۶, E vMara!! C嘆Xlk\yb&6ieV,;dsűDD&>&MW.^KZIspVxݢc2r]~l;! u3jbK35jZe0,<tf&C a@ ә'ifQ 35gOSdMm5Mħ f % 2)fYbeT IVnlY|܏680Ip32͝,Xd)af%C%4LR٬ثen;!>uGY'g:ۊl ֲve֛}òb9TLO/p'msn[8KƃģrH g]Q6ŰڸEhDA)L$20үvSt86f$Sh%}ދVG٣G1S `C@G>Ca-DMJTȂdmu`@Jb1iHd ͧi5.T;1oͶH9 y U$H(D\bzn"8ĥ)4|KzYiGDŽVjKl]Gڨy ,Y4"E~ygA곻R:w{aog]HxɊ ̫1ĩ>otGy3j3.&2LK,jGKmg}L zR` UYR-y>Qh*J+C@5TLWH1W TL&I+t-|*j߼j葮U>ֈLi vr\M>C1IxfNEL"cz!@waWY|SݡxrbM".B*cI{5'#n.ޞ.Rߨr4٨/l~n' ߼-ۢsEІJt!|{1aZm9-jihpF/͘ k]lTb- ؄q~ mHkr8P68sHP{q,nE xKVJ^;&Atmw D9*#)[j[ .CO24v )1˽`?va($GsNJO٤AnxUIOar+oňŘ~#]BЮ uU#X=V^*dV%d⮃8ԇHb=:`D sۚqbX8,8C f:" gkV+D*)1a6@RZ ͩ@\CE8NMoN)!S4)tH1ƒ ]+ L&l̋/Qb!>`<()S<@N9:4:0>3 aSIIG%eeHCX41Ĝ6љc=o8EW"Ag=8DS8 6 񘄤AĢMulxT to6Z,6(=Gq`X")4ARTđ::a:6BKԗppRZ(28J `0#67-PJF Wb*ui( GR2pTEYyLf+?&$sHm! DO.M䟴tԼ" ;  RhC~pA |$=@D$ HGGX1ʇz9'3ۍIJܔ@oa> {J&aiB͗; r2clS/eBIHØA:tR=g"hP{aL:+}* ;!挾I<$cf1pk2pP4y?wK" UOB!%7, h9O *$9@Oa4P&sXz>~"c(4%ƀu. ;Na[jM bgfǝK]0A"$8 W~%OJ*zUOISҪ}nSL00h$Y $ ;{hΗFhY%/vS @|kiÌR<_z,WKzwL"(l!Ǩ/T: ЩkȲ]pf7jTP a3@POoZ#l*Id= 0 rB&P)P'ao]R\J53"[S1iC > ! i4 KQ*8H? p&-"CYsz !H̵QH\Mf7ȗZA4O'p' a=@E9@ A3$O:lf-lA`Q,&FbGG7I&Mif 6; OejGoa6Ze"/yLĚ4~ >DEO|&OWȩ~TI4 }U $iҺq~B׻浔ջT;6gs۠rH!(dCqǛ4$qA؃~{edi[@N/pB8άH"6#듹ȮHm= ٠Q@ F‚I|9.ְ:Zҥ1ѐ͗FÎh /h" h}G=OvxC^|=&1mxj\L#CCB6!8c38* ޼4FcZc:TaA_daF#m]L} 2ΐ,:q`dQrg;8w r`R"f%)u\4$Nf{pE9HE18šZ0#ir dCKY8&'uyMD:Ef'qGH jQMId1$T(f0P8F5% Dadfa94#(0p"LC #D :2%as MTD>^ 2AHLۛmyHӁ ~+^, QrRkbg@HRF` kO~fΟRt+,dٸu|+hahBYʏ?'.̍m+W"qо,~̺Vmp.PSOcM8;tC ,3d!~_>@gbnYhq:<DZH?G}`$ hBiET 6 !n I9_.i=CX~>>]>N_\@$ :IΆX"OP]c/_5>$xUal4]B*o U=r 34.l(_QPRK&!Dh$~o|{_; q0gpahBBm^Q3 +="#~/_/N21MH?S`U(&2 R6lB4ʎ+΂DWEMI1XBs  {%?+ف4 B*HGMőj](hL(PVM\5X<ƈy%DP[> *>:?F|>ᙦRTtVsj?KFƱd$8vB\܍16K$k&дME 21 `죮&+AߣQ.N\́k2MRqg:Ƹգ$\s88ʎ.A68 b eshjz88nAuzːٗӷ+ޭ;XF4؄{Qp<LO\P?S4cu}I 2깕25B}%]6(. PpmXZ;HF[pG5u#rn:ty̒CCZ9S-۹ Ck 陑Z)ލiY?&R9*eNP'ŗmv&x~Asl>QKM.LB@D"5Mv kUU(kWy#x́SiYY6R(WXbd OcbBBQt0Sr!TH91k!XR).WC6JRbrTI^Qܞٵ8^o>{=@Hh9ը++ d bTїXM9}םol;􂒀;ˆm6?Y@}O°d(8,HGªB pRaɔjTj 0ؙ2o.u/KyR5T"Z7QY&)K|)zMM&`$r7a!q-ևp?Nc-s`&uW܉+a\lƐ]ɠT=c&2#uۺa, `,h2 ]5YpǕ Hm"6EUʲP[pa'A.O /< @R>~>DbPm0PB|'Q!Ty71;!S1!AЌ-paDo 76q88b2ɺmz40 h~=0y#j"1# v65E^`޲][M7I\6jSy[Ժ$ƵKqa!Y]UG0 Z8jc3|mj#$li.qiǃcfV1!b ($š@ȉ5v92H\ټMC-6Zz0@F. {G4 uڧz;`ȫ c8p x8}_!"gLv3BDQ %˘DZƵ$C@Ăs^G!$j 0Q8NY1!ALWh$#xqyAb<H&V2V Z9K12 8*!2Jj0SPn*"#9we<@c-)J}SPt$H5(d%"RDSC1';R%ShW][,8DfKm&tk @JR%P ZP0TY ̜~T?r ;He6aR$ i)ǶfmrDO?'7I VUQ1{|)H&b7 Bay(a#V 8e YQIM 6nZbyhB7N`GF@#QEFuhĒ*R^&0Oz:Lσ^["= @KiТi6953CXɆ 0$L1cw jA+- p BlHi`௏c qK KO]]T!쇾P|"4;X'GWM5I$|66>k/uD{S?s&G!G$ J(ZQE4B%A<]Hs"fHwb 6rGj<H(ҝ>'MZg˵^AN ܠQIC @AQ|3S~ 1*lCYM8B@HNPT_j{Ey9q ?,AhJ:耖qs_y$Di82s׏CS: qǽYb)аbP#P<<_ ݰQenĝ/Ź3lp.Nv Q yNtR2ayW}D&q=HQE/$8Cp۬bb9$7~!Ew2DHPT2)ZqmӢSYlxʞ8eM a ;+BFQPTP@؞aKuifo|D H\4b.8uVM!~DusoF"?3R$n|My&\`Ԋ<2$tdB T%: QQYI8 v[ ͼIW AZ;1ê:qk'"NC(ܜl]C1Lxk7"10K#3q2͘KEkLjpb8P#DmEHcBM41j3WA (T0if8F-%D1aaIDiM(3٬-3f5&H8'Q,h$6hʤ3O2= #Ztca;f$ 7WCP6z|5og4lv~&`N /b.s҃E7|JbE[T%Ci*I^#`Tx)ETK&۰Ԣfr }PH9 9vj!!܂:4jb|ь0yI\|.O0CQQ6sujWUYiSDj\ic9g׭lכ9ء+N3ϳ8$L3K4BuuⓏ>**ۗEΉ F{'qeЋIA wE/-b l鉮rF>>@cC:v}$ݯ~bA\|!мB$y_/y ,#,ef&~Cct@3q]mDU3+Ѣh a}Ro;TQ@h@TSXM"BI0 BBR+H RJ E*  'z(=ͿhWdZ_>$%ɼ dJf%kL` ! aנoaJs5@jQ8IلlQ6񁹡e$ e!2+85 Du5MXDUTEҔS! Ye :]ag AkYB%)${{==_JK@dl)킃?h38 8>G#a7%U6SnECa 9൲D~aw &4 ReQ149Jy{0'?dcN@OЃkLX9j%Ϙl}/ʢs@})a%PtHN?~v(g]A^Rē085<2$7#d0AHdTB ¨KD>n 9Vfvg,+>#o[Ngo(H6f1AeFأ-4v\sC7`Isl'10̪',X(܂8e`D l Ν 8*鹓q{""eyhzޚǶ!@,1.[3E[V`KapӐ-,LzӺ{S؈HXY$qdž 5Gi RXL `Qplj[﹙GK$` ttL1<{#&%a^,mŧu0Z ?do+]LEWqBڊk8d ތ 6U3w-e,C 2MVl 5TnX7-oR#m Zf ? <–VG2YadJ#IqI_L,@> x+MFSWN|z5YIѯ}!AzA:c<<}T9r9MdTFU.ΑI$!_V;Ӕ x 7wA] U6@()v_rL횫N}|h$O>`D Demv ;G399EzzUfl\%JZ&e=#ҔzLP/v↮0g*T L׹zpww>$4ER6'?Kj</DI$̐L(J~x;iV/N3n_"!aA $)ɤ|f_]|$=~ާ%L DP$)_[ar> (K Lc(tF0TQˆ&ⵎ+dPIeO&~&"%Ap# ňjG.t4E (]8Pm h+xatGBWܼ-tB4f!9jǖazce MKw?J 44(׼Zc35371 0zf/zpIvӴYUMWia/Dc*]5ԕ6""FįV(ţ͸9f,MF 9Gb_{;C]gHVC,U{oZ%0iS21RT 4A@^fl_q7;[5nuwnf}BճUU-%'STrkOr1!2;Z-lɝuj҆GWYtD;mE>D&X Ϙlk)ZFh6wCW!~[b46k~iQ8sr(B"1v@t,I) ,'M۬0#<]%UX<9zL=Q]CY9Aa3EU]ƿfY($U]2FF~ł8#ˠft t"YI?k>_c qBJX?d15[82hxͦF|ᅐ.&~-vĖ f E$A$R!&JdVRN1ZJdh$hQ$`X%J"B*HB \W F3O[ l2Gɜ9X@h7h`B62"IXGֆ;Z|Oh$"\5O jxXwtiy+/Zd!pĀ I7q˖ m4 ,[ԡ>P3KZ F 3z< _̈́\m&[ZFyN;{Iu1*@=10FX0[ž}lP8>x{֚ fwII5pjI4qJ@"fH y BtD[7`[}@~#U}֍Ct(@<# /lЁxAT@gD $%"ThT<׉  $!A~ ?r AH/hT_`(Vci<@N{{o&d.Rd  "x.|12rdcE` 81ctMK '#&a@h CM jܢehC!\sm)(xnhLCa<[gğpi3vf^\0L,b6 "kQvU#!!@\d:8Y+eE]]P$H]F@ R.A E{˸xOrcrDHD]fE'Q %?ʼnkbrC%"&i2Qh7npNH0A㛋ѡR,.z^f~/Ƽ!8$*wAK_QIxC$!zj%ܐP8yZء/W` *XtnQn fݘ$pm?Y&*W|O 9B& Q%3&hE@/fI&Gi`G8B5&cƟXʁ2@dNN 1SkZ )0w1y@F9)4 ?)gFyƅmۚ88qUs{ާSTRPBQR4DEURLPQQCUUAqyv+W SKhi%Y c XgW[ӎşS92((p7p N f%j4 i*AVEA+R*蝬 c^15Mhu*RI蕶գHa^[@E L lCl, $ ',0Ix^]-nìpT+2P9.LlX#ֲEMt0NG\,#R+n1R Ȥ6 d&c01d4 Gsv"4c $} j{G[Љby(5$=t XQ@u1vkp;FX'f!' {$ I}w@+˻_HZ8`|,Y޽}FBSw\b_Yh…(GcCJ!Z?RV9]~{6Ma!W@*MNK٬{T SX 㰕vĢM\O, e(?)E64Igv5ذ&4NbYDy]5HLK53H_ٽʬ"pf4.>7t2gbON(X0:(5 t-|]EU.tGʹ/IP2pP7Q\BA'|ghhJB!Ս\ې!.T֟2%1Hc\6&UD$[jlcZAw&:QjH!krtoǎWO;% R.zt̞8a̹eT*BđG 7i[Y1ôlފ $mYjR P40 I9԰RTL+X3&`O# WmOH)A]JI@Ĉ]ChLDi:xAi=B @H^47n7p H-R5E(aF͞h2 Z#I0jOaK++mO-kwiUCU@! -вܙcHĩȶ&M4ҤwL=P-IdX‹ !AN@$D>BA**Пq@;Gϛ9 |"=L}y V 1rwFXF1+20wN(k%%_9|JV`BHd˛ =:C' J*x0% Eg<*F DiB&|5'f4bp 2Da@ȍI5 pG$U\zev5Z'lL5)hN۲-J]ixֵ*t1<=מaǟi -liؚ[١H<" pP~`MR@*c4/zQSJ :]@gb4Y;BC|7/_Riqqq&ª rd:>M'6kZ̈Ȥ*n1r"BihB0ö=`PDMƺ7Ay:\fbi>B 0#BQ{I4 )L2R} 4!2ټzaCwP:tH;@~=`D OQi\Ugu`E"oOޝa\Uc0K/I&Q):?bďgbA(;Ul [:]C8BI 誇9؏*1!(u ޹ yh`ELc9(wГݠ}/2VV@l:΀*ZRv""}8"ys+5eJ[$ke Jęɇ›/w<;t\ mLEIFv LU2@"F*JAӘq}6Nbl2+/ʔMOemt%h}P>/Q˔P;8  ~¥uwn͌MFfvӈ$kXA%2" 13$29+PCQɽE\ 8#PEusc i 0(f DcҊZZ(<wXarIWP:GfIC pCB!>B*l Ձ"IL arK <;ѕPH!Qw-Ƈ"QPxАs* ȎERD ,@@GS<)Y"SE"eh zӞPy L pz>gџ^uMHQ-%u$$? "JOrb?W11 z1@!!#Oo!Ngҝ/m I04PAWSuG-/Oy hwh.!I' oEg+䏠J2 ]; /O=j&*ȅ3 ,1wB'I Y>0|HvnT |0Cꢈ,'Krj-A5CQE:>D$FD^ɠ9P6M~pQc\0k5l~֫7EM z"P-Q Z8)E]$QD9Cv"LBPФġBRN`+R:H/IOwU~)Fً0bfr ; - i\ha G7 ?ρgT$/ro 𬨴$&L)i1AvuxUnpFh$"nuy# GLjjkM]Dm׽ ֦ pۦ[tAGLQ,\(ldcZ@rV1QA:ӝtn6BG)02# L'A-F]8Ōl3*(^cfp'4Z(Z JŔl[,{cfګXX<{aZf:QDXښ=MLH/DΨa= /[OI}A־}@hn!H'#CGܯq_&HTEU+@HA8,LEMQ`%xº2n^0,$65ZL0D/z(Q93L\ZQ*p"N'ZK. 7&Afd>YSl0+lM$47(^7*hhj!p0JT VOeQW%P.&kUic9cxf ='#V'^Xy \!4vxTE?VHB%D՗{ɘeZ-107D-4rf6օ\:Tk:G36A6b8̵)\4SHXN+$hX֊7wƊsByǀ2?ye6Nb#4d!#@M8.`Φhzru D"]_Dapf(|"hl9{jEkK85XvO}v&~^Ё3-=Z*L#rCۉ{H&CTPh !/?;-/;# j'Og}i6D5T *cqoj&ѸÄ~{Y}g׻ywkTT-y٧*:GĪ:a糎;ZZzTL~)vMɩ#mQ ge՟FBdc1}tTuNvt ੴg <w <и@j?mxIs*dU ! `Ѱ2bF/kgdzlUۀF!"H;?OuN_F'2 ~Z"Nb!\!dw@IbKMro^j? d=.өmTN56& F?dInHqz͚ 0`CZT$nM="D97Dcִ3eeZ,fȣk1Pc@6F 7JN(}\bԈg. l h|VQC1P;K:2uL)=B DP'q;`'XnCӓ&'-""Ȩ` OTS/c[j.nTFP|9&If!䀏 zBp\f a"Y.7ˆ0bYhU5. 0 ( 2r  !Rl`L-&dCJB$B:@jS)# % :`I-tՐhD)Oxl2qJ:f &[H5aSFӢޥRpOݫ 3$lcQp@g\X L 12 (]D~}yWX!|~^/T%ר*tv%׳&d`fGu!ɩ4H8Լ$A*Oq ˝ y?ѻ\cc}S`aePÓR%nwtt𐪫% Qmp*18&N<.O:8uCI$: S}*o3>U Bi*TP&}C1Ŏ\&b s~|I@K~0iM<omZ=7Qr8o(F7< d^7_VQtip1NdpƉuHI;JQ**&q Їjh,k݀{Rx:;M_}l~ǰH #Z#ZtT#=~ 6ZvBxQ^7׬~cp~ 5mYHG0`+\#Lr@3@4@ Sj`JJK0gfE ݔ).P&I]SD6",rCdJUyX5`@샰]#ƢC P$lL'aDWH(ʖUȁԜ0 u7tݬ,kU4cJ7YY266!B&uˉi6FԎAH8 3C$1$a4Wo"rDI|4 {NYuAfǽa[!撜eu \ +1F4k\REӿx QPIaYJ00/榡CO50+AX1x ,QL6A"9%' 22=%6DY "ɇ+#`6Y aD(3 hj41 > κ0t$vjVq&5o E vMxU*!ʺ= <ʱ1؅pQ,&04ZMN)M4 sGD´F5`dt+Ohμ3ކ81& QW2AΥ271#!ecE8$E$DSb桦vq4"Bd R L5j 9K bق1Ԉ˱S(P𡔡 XXph-/Hn1v<^-=>*m(M$))cImzQQ]n(O,PDAq9$F(= Z'RVOӓHTįWlff+1p7E6kV4Gpoww*k+ySķ#Ґ"a ӐlyP rأKA #0x6 Vc*2G 8n\bʇ"G:3 GKM鑢#&BAccVc ^s uZ·5QM)Rq0qIg8cJZ,m=(ĸxJ03g%^[ GMܝv.ᑤ$4Iu/7JqM2ƷJw ME2D6Dm R5&2Gm 6ʪer1QNY TG(oƣђv<>0!JwQ 9O~I*xg &kƠx 4fV>4iF$UfcmH Fq l4c_٩Y0K'vBرDD3@3 nH$6fȵbbj& IhiVD93" l#Jq#KMbiBGNy Hp_;p8¡ F OD[#B,bI11L!5("13:Wƈ`d}\#wox k_DV"Ѭ63d.eW,&h:\>po#KmiTwfPфm=ms/ IąNؘc=8C*R!Ŭ-h mMC D |k\xZpp FqAbJ `C8c׊_В|8bs!"gC$z6-ep  .;c{ c9UC,R>6˯V։tV*~S LExX`1`7 8zh90VS ,"D 6ͰM6KOWC7cgvm $B)/ܦ 0Oȫ9K1KJiHRwpMXpω)x.Qb顑sд]=O܇˒C izFL3pG Lh?sޛPii z0[GGхEЍ"c}Yqf걿Uq{|v{>ޤ&X/$mU7"h( '<1US j&"53hF0ǯK(uT(-l>)Ag$z?4\m Yڅ&{~y4s OHe)ϞlqSD"f!pQfN$k ~yAqNԃPbBi`/TC*_b`𱨲O.tdgST6-2@Ca cµ  7F j@dur]3ދ !4REm %v@sYCPH;ӒiICIMjdF-: 'ރYl,2,ݥ!XD1bPELEaPPe*G0uP0\@baZMBDܣM2\Ă EWHlYj5@*N62<*[PMȑ SKC$6(KA!b #k&֣[Dԅ%"PB 5RPI31ȵ)Bc#5rF BU'ɨ&h",PKS2\IV?#$(1*`E))C!b'Ofxst1Tv10HamR!a5d1E>Ay>_B֌-aHˈ#r>>f@Sn3)x׎!@+oUsἠHd!$Tw¸(/_4ӴKLm$.W$P*柁d,Dw(Bo2ٳti񡸸 zaVxNۥXRa 7ʟE'>iו{1y `(Q-$bFٶw4)Ӝf ADRiP/ ܋ET0!`@X|:jG+pZr_ݚNx~ $!X$4sLIW43i( ͭn 0;vO[\zjݔs% #;h@KQ.6j0,jۚ$',%)M]@]@Dj1 WHL$B>L+IXJ*RNA|mšXс7n ajF3$43: nGD6 n#68m\4)CJC9cb ƴrԽua3 Po{Q6 @@ c4Θ8=21 EK͔0!:Pԅ,S'4uB0 4'mֆYSԫ{ kY^C{.&A0AjZPnY-]qx54XEMX΀u `jaLIa;v7zvl2kuߙF/5O0zʞ""*ȱR_ý_:/A3: TDaN@B=+9(ob_ ` oDdMqE"(pS.жv}UW5_~z^Cў۵av!M G_ka&{1 DfbFOZG&TCT4.C,!Il*BTĴ?2tu,1TH` 3=Xu_IqXqR5&I$Ҡ%GzQL"6CY>ӴGŇ$Ն:(uDҿx%bfZ3"PP t2S:!AT_ @adQf` Eu]/x"(&*j"bbQ"a*j$)"(OEER ,2T@1MsaKDL-E ŒL1)$SI/ptN S F" N+yÏQ"A K>w]5B.(qAmٍ΍֟jP '?3+UDTGAH2BL+J&$"x #0 # ]]w>OڏzJ*O|/( AƋ5)!%%R@bHi0qX( d O FA?z(wzBt#L2E>r ':M;by?RóMv=I@ѱC`5&q܎ CwNZ? ? |VR*X)Q!(I6x)?) 6*P ii>hm8DTd 1b , *("b*3XҐ' JEFe)a)$"heR RHD @QPDH@4 B%DP38luʪ@bh %ibgC&@aŒ 3 $й{# H=2Uh^ QG%(u*d2Ҕ r2P 2hBcG8#}y~U9IQ$V@K":A :fUH"Mއ&lx, ǤJH@y1/2`H@с^$$ KɈ$((C8c:bna P\?ԉhdɡaL%0rΓr{FTT)A;=1'BJhZR)"_Z N!Wj x07ܨZ7@ .dAwy|/ z<03e:T"xȞy" q ^=O4H=+䠥=wfXn u' B1#a͞ܦ&溡vuETC8#qUTQ@*i |-^j_9ԀiRD|l^ύi{&AxvDb*J^V$%-02HLѳ|ȇ!*71|N=¿Y J D PLBJ+-R8$}ꗹ93Lwؔk1^ p0vdCɪs(.$:u9 ,F#RKX"42cmۆv2ą9" %1-)M=ep58t샰4RIIJi:@8HVJ)r* C YPDLXIRنGk9pS1P7=Pݏ%Aל TTg0cӵ10V F4h,]vh;bEBb5%waJ Lꡇc,׭lg8L]ضo>8$`oxp AS>ҹ/hH_YA!I2%LEx@ꤢP(ःmcmEC Sir$pzp5kl0Dm4E/_q78r`ELSuRPsaŤ P>vPI,FAA(h}\E0E// _ :\֗7+x&pPR(p@(nR$M)P(E"SA)>Y@Surtp@ |>s*܅Ӟk#]&;xY*_˼͸9;ǒ~{5KC}?ӧJRRTVoӖb2? #4xmK3M4lAr./Et-#a:- ]liWKSxj&l!hxL.3ᘼZ%>&a PRNt6d q ;h0 2E+V6<'>D񈦊^M|.\r M2j(E0 +s`&p.席<󚉣3̺DmXd;3ܛ(LfPvC̞C^$)2b&O#n0J/ HR#Xj̉^fgYZ~pD hZYJQ$b{*eٔa&gSlii r(k#ja4ePٖ`k[y V ?EքmD N=EPKp> `=MDْD3+V d{Gucdf7Eaj SE4Q {SgC+3 &`}'ǺΉH@F!e|ՊfKa|0}97Y4YDkRkd?`}a( &f//PRQd+; |ֆ<>gz CH H; yо.5q4djSFǂi Zs #qmdAb*Z)敾4f-7ms*dB|5RF4Ѐ dBΰpVT "cc{^3kYO F oD¨(6տg2ONf,E͢G]AϨ9d&\EL)L M( 豭qФMt*ǦAȻ ʍC D )΢8x+2փ w v?ߖR>/%.KݑҎ暮>`.LV`tS eBU)YRWJϓݺSY ! Ѯ΢E٣M0٫wG`1^,{'K/1);UmMW M&m^jW2AP?:bܠ={Ǔ%Hzͦxx[׊9-;l!\Uވu``@uܑ VZ5{ngRJ[JiT@DeDӷȐv[ia>VVb4Aᱺuf@\u=g>Ca¼5I(pzC$Q Z^ҕ)2PqHg>z:! A,uӯ"te넦I!6 r7^\T7z `W) \9!h~>RL`cYqi  G#wڂ*4I\ >Ә{BhLB#$%[/7ЦaZd9F^~xQ QFa .kZG]xQ ?Xx{i&`nAF٦HnIRo}u-?O3ϹGZ $r14\@HcC*lB-_tXܸ-, It! de9"1"DkP`EGaGqh;uhs5D9%e;κ`M]8OnG$%8E=ec8&A|ċ2f'yZM&b TSq fArk85d@aY!V\)w[f,CςW{s?!cpgI Y$AT1]mfM`Am,oU( QFD̦#0•Of1Ɖ IۃbF'RqiXLEN@(!MCƂc()ď:ffS-wD}HF厫wr{\hoE)U{ay{k7+Fmk1G@J/ q¸fRȨLP$4H0@( H8_H V$H`b$OwQ!^W="DN8xwFq=I%H&`j-GsKZT: B 6pA`8:*"g! 30ʀ2C Զ>g%{E?Xmf{@_@$ S3ʆJW2K1] dRA* ayf(8n|TU@D~0xHiJV&QQ:cx,pg s9,HAN\U(ٶeb( W÷a\h=Wr:1(jRGJ_! 4@ p@2@1RL҉ȉR(!V+1"D@/Td]0'fH´T1hٴ4ruJCH E_I1= fMAQIAN0tptE \Ib *B VDO}1v.lZug 1X  '00 "!;DfalMFmڥb-t * r 6$BR4Q *Vk0slPh2 l$Lecu*tۄ4΂'v7hӏ +NZQvDQk5ZsVH:aw;0kN0cXX9cCdmfV ޤ2[hMYyTE*!B,(J7QO8dv` GJ=SF8?Zʈ[I ءCq BSH?+'NZ(`$b0pϔ$Sp<=XS-BI@E Qvu[cӦZ-bIFOɧ^=Kvk!fFY&(Y !8(#a#acuՁ @Oh ҃|%|ܺ4 K-0a;xDh! )p!aHsGAKf~>Cf=07ǭUϱ)t0(DB ډa6n9.CT"sVN6YqҴCab{Hf%.iv֟츝R/5% =" H 3+}B!DJaHv9] ОG$S` E(53?fQ`na"!R !s(r9 ]p,B.nTz P&J" ֔ovC>06 5'cYq` iGl y# );4 أBΔ| C%A"%Bb1  l?fE"PSm ؈wF9aC #tT3/TN3S!K,,(*ΚL)52S%uJ@PF !Nmv!RB"Y(!l N;tu# "#c q25 V *"bU P9 FKy*@mKT(+$ㅠ hyp"bn1ޚ@GG !5*U Tl 规P~LJHB)tg+ЀfAzpkC9ʛCga.扦4xЫm~CbLe~HA@k7 g£iC`4NA$I (!^ 0K'3GC ya&fCHh'5ABh\K\A (Q_t61;:0twiHi@.*Dh"7n!ثEPx%/LH12Mx*gDotS(gy.ERJ.EoP G3!PbyF !WmfWDԝϕ!4P ;>-lhdr&WRh6+k_i5I.Jv$JGoLlE CҊ`oJ4@LW]eՁ9AE99Kla J6(,c,FɄ8Z C:LD y^vw[eЃm!7lJ[IBRjHJT# H|1.dy0c Er2 )XEeB%,pp (j!"D/0$>A6@|t!:5gph #TR>u ^! ybAȈDo]f{}Db#_$\vl ?nQw}JH|ᇚ ej0Nʉ|f8 !ȑ30љi"5&0).g31*DGZ%F+E xD(1ԑvLaO$&lq6ZR%#IT1ZC,%nW5jJ̩JhBJJl@4s& 6n a:eF'g-FS?Nu6}U~֑חaR*m<g\¶.# Q-%'1ˊ#CK~?m7IŦvJE#=0A!sԉy24w0]p̶ꋌ3ӬP]qdc^HCl5HELۂeQgf3w̌W#"`nmr3Q>srDa2E…%Zfw{MHO)sW.?V{y:aNrb;b߇{cLNPm 3: *------------------------------------------------------------------------- */ static void * H5FD_mpio_fapl_copy(const void *_old_fa) { void *ret_value = NULL; const H5FD_mpio_fapl_t *old_fa = (const H5FD_mpio_fapl_t*)_old_fa; H5FD_mpio_fapl_t *new_fa = NULL; FUNC_ENTER_NOAPI_NOINIT #ifdef H5FDmpio_DEBUG if (H5FD_mpio_Debug[(int)'t']) fprintf(stderr, "enter H5FD_mpio_fapl_copy\n"); #endif if(NULL == (new_fa = (H5FD_mpio_fapl_t *)H5MM_malloc(sizeof(H5FD_mpio_fapl_t)))) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed") /* Copy the general information */ HDmemcpy(new_fa, old_fa, sizeof(H5FD_mpio_fapl_t)); /* Duplicate communicator and Info object. */ if(FAIL == H5FD_mpi_comm_info_dup(old_fa->comm, old_fa->info, &new_fa->comm, &new_fa->info)) HGOTO_ERROR(H5E_INTERNAL, H5E_CANTCOPY, NULL, "Communicator/Info duplicate failed") ret_value = new_fa; done: if (NULL == ret_value){ /* cleanup */ if (new_fa) H5MM_xfree(new_fa); } #ifdef H5FDmpio_DEBUG if (H5FD_mpio_Debug[(int)'t']) fprintf(stderr, "leaving H5FD_mpio_fapl_copy\n"); #endif FUNC_LEAVE_NOAPI(ret_value) } /* end H5FD_mpio_fapl_copy() */ /*------------------------------------------------------------------------- * Function: H5FD_mpio_fapl_free * * Purpose: Frees the mpio-specific file access properties. * * Return: Success: 0 * * Failure: -1 * * Programmer: Albert Cheng * Jan 8, 2003 * * Modifications: * *------------------------------------------------------------------------- */ static herr_t H5FD_mpio_fapl_free(void *_fa) { herr_t ret_value = SUCCEED; H5FD_mpio_fapl_t *fa = (H5FD_mpio_fapl_t*)_fa; FUNC_ENTER_NOAPI_NOINIT_NOERR #ifdef H5FDmpio_DEBUG if (H5FD_mpio_Debug[(int)'t']) fprintf(stderr, "in H5FD_mpio_fapl_free\n"); #endif assert(fa); /* Free the internal communicator and INFO object */ assert(MPI_COMM_NULL!=fa->comm); H5FD_mpi_comm_info_free(&fa->comm, &fa->info); H5MM_xfree(fa); #ifdef H5FDmpio_DEBUG if (H5FD_mpio_Debug[(int)'t']) fprintf(stderr, "leaving H5FD_mpio_fapl_free\n"); #endif FUNC_LEAVE_NOAPI(ret_value) } /* end H5FD_mpio_fapl_free() */ /*------------------------------------------------------------------------- * Function: H5FD_set_mpio_atomicity * * Purpose: Sets the atomicity mode * * Return: Success: Non-negative * * Failure: Negative * * Programmer: Mohamad Chaarawi * Feb 14, 2012 * *------------------------------------------------------------------------- */ herr_t H5FD_set_mpio_atomicity(H5FD_t *_file, hbool_t flag) { H5FD_mpio_t *file = (H5FD_mpio_t*)_file; int mpi_code; /* MPI return code */ int temp_flag; herr_t ret_value = SUCCEED; FUNC_ENTER_NOAPI_NOINIT #ifdef H5FDmpio_DEBUG if (H5FD_mpio_Debug[(int)'t']) fprintf(stdout, "Entering H5FD_set_mpio_atomicity\n"); #endif if (FALSE == flag) temp_flag = 0; else temp_flag = 1; /* set atomicity value */ if (MPI_SUCCESS != (mpi_code=MPI_File_set_atomicity(file->f, temp_flag))) HMPI_GOTO_ERROR(FAIL, "MPI_File_set_atomicity", mpi_code) done: #ifdef H5FDmpio_DEBUG if (H5FD_mpio_Debug[(int)'t']) fprintf(stdout, "Leaving H5FD_set_mpio_atomicity\n"); #endif FUNC_LEAVE_NOAPI(ret_value) } /*------------------------------------------------------------------------- * Function: H5FD_get_mpio_atomicity * * Purpose: Returns the atomicity mode * * Return: Success: Non-negative * * Failure: Negative * * Programmer: Mohamad Chaarawi * Feb 14, 2012 * *------------------------------------------------------------------------- */ herr_t H5FD_get_mpio_atomicity(H5FD_t *_file, hbool_t *flag) { H5FD_mpio_t *file = (H5FD_mpio_t*)_file; int mpi_code; /* MPI return code */ int temp_flag; herr_t ret_value = SUCCEED; FUNC_ENTER_NOAPI_NOINIT #ifdef H5FDmpio_DEBUG if (H5FD_mpio_Debug[(int)'t']) fprintf(stdout, "Entering H5FD_get_mpio_atomicity\n"); #endif /* get atomicity value */ if (MPI_SUCCESS != (mpi_code=MPI_File_get_atomicity(file->f, &temp_flag))) HMPI_GOTO_ERROR(FAIL, "MPI_File_get_atomicity", mpi_code) if (0 != temp_flag) *flag = TRUE; else *flag = FALSE; done: #ifdef H5FDmpio_DEBUG if (H5FD_mpio_Debug[(int)'t']) fprintf(stdout, "Leaving H5FD_get_mpio_atomicity\n"); #endif FUNC_LEAVE_NOAPI(ret_value) } /*------------------------------------------------------------------------- * Function: H5FD_mpio_open * * Purpose: Opens a file with name NAME. The FLAGS are a bit field with * purpose similar to the second argument of open(2) and which * are defined in H5Fpublic.h. The file access property list * FAPL_ID contains the properties driver properties and MAXADDR * is the largest address which this file will be expected to * access. This is collective. * * Return: Success: A new file pointer. * * Failure: NULL * * Programmer: * January 30, 1998 * * Modifications: * Robb Matzke, 1998-02-18 * Added the ACCESS_PARMS argument. Moved some error checking * here from elsewhere. * * rky, 1998-01-11 * Added H5FD_mpio_Debug debug flags controlled by MPI_Info. * * rky, 1998-08-28 * Init flag controlling redundant metadata writes to disk. * * rky, 1998-12-07 * Added barrier after MPI_File_set_size to prevent race * condition -- subsequent writes were being truncated, causing * holes in file. * * Robb Matzke, 1999-08-06 * Modified to work with the virtual file layer. * * rky & ppw, 1999-11-07 * Modified "H5FD_mpio_open" so that file-truncation is * avoided for brand-new files (with zero filesize). * * Albert Cheng, 2003-04-17 * Duplicate the communicator and Info object so that file is * insulated from the old one. *------------------------------------------------------------------------- */ static H5FD_t * H5FD_mpio_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t UNUSED maxaddr) { H5FD_mpio_t *file=NULL; MPI_File fh; unsigned file_opened=0; /* Flag to indicate that the file was successfully opened */ int mpi_amode; int mpi_rank; /* MPI rank of this process */ int mpi_size; /* Total number of MPI processes */ int mpi_code; /* mpi return code */ MPI_Offset size; const H5FD_mpio_fapl_t *fa=NULL; H5FD_mpio_fapl_t _fa; H5P_genplist_t *plist; /* Property list pointer */ MPI_Comm comm_dup=MPI_COMM_NULL; MPI_Info info_dup=MPI_INFO_NULL; H5FD_t *ret_value; /* Return value */ #ifndef H5_HAVE_MPI_GET_SIZE h5_stat_t stat_buf; #endif FUNC_ENTER_NOAPI_NOINIT #ifdef H5FDmpio_DEBUG if (H5FD_mpio_Debug[(int)'t']) { fprintf(stdout, "Entering H5FD_mpio_open(name=\"%s\", flags=0x%x, " "fapl_id=%d, maxaddr=%lu)\n", name, flags, (int)fapl_id, (unsigned long)maxaddr); } #endif /* Obtain a pointer to mpio-specific file access properties */ if(NULL == (plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS))) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a file access property list") if(H5P_FILE_ACCESS_DEFAULT == fapl_id || H5FD_MPIO != H5P_get_driver(plist)) { _fa.comm = MPI_COMM_SELF; /*default*/ _fa.info = MPI_INFO_NULL; /*default*/ fa = &_fa; } else { if(NULL == (fa = (const H5FD_mpio_fapl_t *)H5P_get_driver_info(plist))) HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, NULL, "bad VFL driver info") } /* Duplicate communicator and Info object for use by this file. */ if (FAIL==H5FD_mpi_comm_info_dup(fa->comm, fa->info, &comm_dup, &info_dup)) HGOTO_ERROR(H5E_INTERNAL, H5E_CANTCOPY, NULL, "Communicator/Info duplicate failed") /* convert HDF5 flags to MPI-IO flags */ /* some combinations are illegal; let MPI-IO figure it out */ mpi_amode = (flags&H5F_ACC_RDWR) ? MPI_MODE_RDWR : MPI_MODE_RDONLY; if (flags&H5F_ACC_CREAT) mpi_amode |= MPI_MODE_CREATE; if (flags&H5F_ACC_EXCL) mpi_amode |= MPI_MODE_EXCL; #ifdef H5FDmpio_DEBUG /* Check for debug commands in the info parameter */ { char debug_str[128]; int flag, i; if (MPI_INFO_NULL != info_dup) { /*OKAY: CAST DISCARDS CONST*/ MPI_Info_get(fa->info, (char *)H5F_MPIO_DEBUG_KEY, 127, debug_str, &flag); if (flag) { fprintf(stdout, "H5FD_mpio debug flags=%s\n", debug_str ); for (i=0; debug_str[i]/*end of string*/ && i<128/*just in case*/; ++i) { H5FD_mpio_Debug[(int)debug_str[i]] = 1; } } } } #endif /*OKAY: CAST DISCARDS CONST*/ if(MPI_SUCCESS != (mpi_code = MPI_File_open(comm_dup, (char*)name, mpi_amode, info_dup, &fh))) HMPI_GOTO_ERROR(NULL, "MPI_File_open failed", mpi_code) file_opened=1; /* Get the MPI rank of this process and the total number of processes */ if (MPI_SUCCESS != (mpi_code=MPI_Comm_rank (comm_dup, &mpi_rank))) HMPI_GOTO_ERROR(NULL, "MPI_Comm_rank failed", mpi_code) if (MPI_SUCCESS != (mpi_code=MPI_Comm_size (comm_dup, &mpi_size))) HMPI_GOTO_ERROR(NULL, "MPI_Comm_size failed", mpi_code) /* Build the return value and initialize it */ if(NULL == (file = (H5FD_mpio_t *)H5MM_calloc(sizeof(H5FD_mpio_t)))) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed") file->f = fh; file->comm = comm_dup; file->info = info_dup; file->mpi_rank = mpi_rank; file->mpi_size = mpi_size; /* Only processor p0 will get the filesize and broadcast it. */ if (mpi_rank == 0) { /* Get current file size. If MPI_File_get_size is disabled in configuration * because it doesn't return correct value (SGI Altix Propack 4), * use stat to get the file size. */ #ifdef H5_HAVE_MPI_GET_SIZE if (MPI_SUCCESS != (mpi_code=MPI_File_get_size(fh, &size))) HMPI_GOTO_ERROR(NULL, "MPI_File_get_size failed", mpi_code) #else if((mpi_code=HDstat(name, &stat_buf))<0) HMPI_GOTO_ERROR(NULL, "stat failed", mpi_code) /* Hopefully this casting is safe */ size = (MPI_Offset)(stat_buf.st_size); #endif } /* end if */ /* Broadcast file size */ if(MPI_SUCCESS != (mpi_code = MPI_Bcast(&size, (int)sizeof(MPI_Offset), MPI_BYTE, 0, comm_dup))) HMPI_GOTO_ERROR(NULL, "MPI_Bcast failed", mpi_code) /* Determine if the file should be truncated */ if(size && (flags & H5F_ACC_TRUNC)) { if (MPI_SUCCESS != (mpi_code=MPI_File_set_size(fh, (MPI_Offset)0))) HMPI_GOTO_ERROR(NULL, "MPI_File_set_size failed", mpi_code) /* Don't let any proc return until all have truncated the file. */ if (MPI_SUCCESS!= (mpi_code=MPI_Barrier(comm_dup))) HMPI_GOTO_ERROR(NULL, "MPI_Barrier failed", mpi_code) /* File is zero size now */ size = 0; } /* end if */ /* Set the size of the file (from library's perspective) */ file->eof = H5FD_mpi_MPIOff_to_haddr(size); /* Set return value */ ret_value=(H5FD_t*)file; done: if(ret_value==NULL) { if(file_opened) MPI_File_close(&fh); if (MPI_COMM_NULL != comm_dup) MPI_Comm_free(&comm_dup); if (MPI_INFO_NULL != info_dup) MPI_Info_free(&info_dup); if (file) H5MM_xfree(file); } /* end if */ #ifdef H5FDmpio_DEBUG if (H5FD_mpio_Debug[(int)'t']) fprintf(stdout, "Leaving H5FD_mpio_open\n" ); #endif FUNC_LEAVE_NOAPI(ret_value) } /*------------------------------------------------------------------------- * Function: H5FD_mpio_close * * Purpose: Closes a file. This is collective. * * Return: Success: Non-negative * * Failure: Negative * * Programmer: Unknown * January 30, 1998 * * Modifications: * Robb Matzke, 1998-02-18 * Added the ACCESS_PARMS argument. * * Robb Matzke, 1999-08-06 * Modified to work with the virtual file layer. * * Albert Cheng, 2003-04-17 * Free the communicator stored. *------------------------------------------------------------------------- */ static herr_t H5FD_mpio_close(H5FD_t *_file) { H5FD_mpio_t *file = (H5FD_mpio_t*)_file; int mpi_code; /* MPI return code */ herr_t ret_value=SUCCEED; /* Return value */ FUNC_ENTER_NOAPI_NOINIT #ifdef H5FDmpio_DEBUG if (H5FD_mpio_Debug[(int)'t']) fprintf(stdout, "Entering H5FD_mpio_close\n"); #endif assert(file); assert(H5FD_MPIO==file->pub.driver_id); /* MPI_File_close sets argument to MPI_FILE_NULL */ if (MPI_SUCCESS != (mpi_code=MPI_File_close(&(file->f)/*in,out*/))) HMPI_GOTO_ERROR(FAIL, "MPI_File_close failed", mpi_code) /* Clean up other stuff */ H5FD_mpi_comm_info_free(&file->comm, &file->info); H5MM_xfree(file); done: #ifdef H5FDmpio_DEBUG if (H5FD_mpio_Debug[(int)'t']) fprintf(stdout, "Leaving H5FD_mpio_close\n"); #endif FUNC_LEAVE_NOAPI(ret_value) } /*------------------------------------------------------------------------- * Function: H5FD_mpio_query * * Purpose: Set the flags that this VFL driver is capable of supporting. * (listed in H5FDpublic.h) * * Return: Success: non-negative * * Failure: negative * * Programmer: Quincey Koziol * Friday, August 25, 2000 * * Modifications: * * John Mainzer -- 9/21/05 * Modified code to turn off the * H5FD_FEAT_ACCUMULATE_METADATA_WRITE flag. * With the movement of * all cache writes to process 0, this flag has become * problematic in PHDF5. * *------------------------------------------------------------------------- */ static herr_t H5FD_mpio_query(const H5FD_t UNUSED *_file, unsigned long *flags /* out */) { FUNC_ENTER_NOAPI_NOINIT_NOERR /* Set the VFL feature flags that this driver supports */ if(flags) { *flags=0; *flags|=H5FD_FEAT_AGGREGATE_METADATA; /* OK to aggregate metadata allocations */ *flags|=H5FD_FEAT_AGGREGATE_SMALLDATA; /* OK to aggregate "small" raw data allocations */ *flags|=H5FD_FEAT_HAS_MPI; /* This driver uses MPI */ *flags|=H5FD_FEAT_ALLOCATE_EARLY; /* Allocate space early instead of late */ } /* end if */ FUNC_LEAVE_NOAPI(SUCCEED) } /*------------------------------------------------------------------------- * Function: H5FD_mpio_get_eoa * * Purpose: Gets the end-of-address marker for the file. The EOA marker * is the first address past the last byte allocated in the * format address space. * * Return: Success: The end-of-address marker. * * Failure: HADDR_UNDEF * * Programmer: Robb Matzke * Friday, August 6, 1999 * * Modifications: * Raymond Lu * 21 Dec. 2006 * Added the parameter TYPE. It's only used for MULTI driver. * *------------------------------------------------------------------------- */ static haddr_t H5FD_mpio_get_eoa(const H5FD_t *_file, H5FD_mem_t UNUSED type) { const H5FD_mpio_t *file = (const H5FD_mpio_t*)_file; FUNC_ENTER_NOAPI_NOINIT_NOERR assert(file); assert(H5FD_MPIO==file->pub.driver_id); FUNC_LEAVE_NOAPI(file->eoa) } /*------------------------------------------------------------------------- * Function: H5FD_mpio_set_eoa * * Purpose: Set the end-of-address marker for the file. This function is * called shortly after an existing HDF5 file is opened in order * to tell the driver where the end of the HDF5 data is located. * * Return: Success: 0 * * Failure: -1 * * Programmer: Robb Matzke * Friday, August 6, 1999 * * Modifications: * Raymond Lu * 21 Dec. 2006 * Added the parameter TYPE. It's only used for MULTI driver. * *------------------------------------------------------------------------- */ static herr_t H5FD_mpio_set_eoa(H5FD_t *_file, H5FD_mem_t UNUSED type, haddr_t addr) { H5FD_mpio_t *file = (H5FD_mpio_t*)_file; FUNC_ENTER_NOAPI_NOINIT_NOERR assert(file); assert(H5FD_MPIO==file->pub.driver_id); file->eoa = addr; FUNC_LEAVE_NOAPI(SUCCEED) } /*------------------------------------------------------------------------- * Function: H5FD_mpio_get_eof * * Purpose: Gets the end-of-file marker for the file. The EOF marker * is the real size of the file. * * The MPIO driver doesn't bother keeping this field updated * since that's a relatively expensive operation. Fortunately * the library only needs the EOF just after the file is opened * in order to determine whether the file is empty, truncated, * or okay. Therefore, any MPIO I/O function will set its value * to HADDR_UNDEF which is the error return value of this * function. * * Keeping the EOF updated (during write calls) is expensive * because any process may extend the physical end of the * file. -QAK * * Return: Success: The end-of-address marker. * * Failure: HADDR_UNDEF * * Programmer: Robb Matzke * Friday, August 6, 1999 * * Modifications: * *------------------------------------------------------------------------- */ static haddr_t H5FD_mpio_get_eof(const H5FD_t *_file) { const H5FD_mpio_t *file = (const H5FD_mpio_t*)_file; FUNC_ENTER_NOAPI_NOINIT_NOERR assert(file); assert(H5FD_MPIO==file->pub.driver_id); FUNC_LEAVE_NOAPI(file->eof) } /*------------------------------------------------------------------------- * Function: H5FD_mpio_get_handle * * Purpose: Returns the file handle of MPIO file driver. * * Returns: Non-negative if succeed or negative if fails. * * Programmer: Raymond Lu * Sept. 16, 2002 * * Modifications: * *------------------------------------------------------------------------- */ static herr_t H5FD_mpio_get_handle(H5FD_t *_file, hid_t UNUSED fapl, void** file_handle) { H5FD_mpio_t *file = (H5FD_mpio_t *)_file; herr_t ret_value = SUCCEED; FUNC_ENTER_NOAPI_NOINIT if(!file_handle) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "file handle not valid") *file_handle = &(file->f); done: FUNC_LEAVE_NOAPI(ret_value) } /*------------------------------------------------------------------------- * Function: H5FD_mpio_read * * Purpose: Reads SIZE bytes of data from FILE beginning at address ADDR * into buffer BUF according to data transfer properties in * DXPL_ID using potentially complex file and buffer types to * effect the transfer. * * Reading past the end of the MPI file returns zeros instead of * failing. MPI is able to coalesce requests from different * processes (collective or independent). * * Return: Success: Zero. Result is stored in caller-supplied * buffer BUF. * * Failure: -1, Contents of buffer BUF are undefined. * * Programmer: rky, 1998-01-30 * * Modifications: * Robb Matzke, 1998-02-18 * Added the ACCESS_PARMS argument. * * rky, 1998-04-10 * Call independent or collective MPI read, based on * ACCESS_PARMS. * * Albert Cheng, 1998-06-01 * Added XFER_MODE to control independent or collective MPI * read. * * rky, 1998-08-16 * Use BTYPE, FTYPE, and DISP from access parms. The guts of * H5FD_mpio_read and H5FD_mpio_write should be replaced by a * single dual-purpose routine. * * Robb Matzke, 1999-04-21 * Changed XFER_MODE to XFER_PARMS for all H5F_*_read() * callbacks. * * Robb Matzke, 1999-07-28 * The ADDR argument is passed by value. * * Robb Matzke, 1999-08-06 * Modified to work with the virtual file layer. * * Quincey Koziol, 2002-05-14 * Only call MPI_Get_count if we can use MPI_BYTE for the MPI type * for the I/O transfer. Someday we might include code to decode * the MPI type used for more complicated transfers and call * MPI_Get_count all the time. * * Quincey Koziol - 2002/06/17 * Removed 'disp' parameter from H5FD_mpio_setup routine and use * the address of the dataset in MPI_File_set_view() calls, as * necessary. * * Quincey Koziol - 2002/06/24 * Removed "lazy" MPI_File_set_view() calls, since they would fail * if the first I/O was a collective I/O using MPI derived types * and the next I/O was an independent I/O. * * Quincey Koziol - 2003/10/22-31 * Restructured code massively, straightening out logic and finally * getting the bytes_read stuff working. * *------------------------------------------------------------------------- */ static herr_t H5FD_mpio_read(H5FD_t *_file, H5FD_mem_t UNUSED type, hid_t dxpl_id, haddr_t addr, size_t size, void *buf/*out*/) { H5FD_mpio_t *file = (H5FD_mpio_t*)_file; MPI_Offset mpi_off; MPI_Status mpi_stat; /* Status from I/O operation */ int mpi_code; /* mpi return code */ MPI_Datatype buf_type = MPI_BYTE; /* MPI description of the selection in memory */ int size_i; /* Integer copy of 'size' to read */ int bytes_read; /* Number of bytes read in */ int n; int type_size; /* MPI datatype used for I/O's size */ int io_size; /* Actual number of bytes requested */ H5P_genplist_t *plist = NULL; /* Property list pointer */ hbool_t use_view_this_time = FALSE; herr_t ret_value = SUCCEED; FUNC_ENTER_NOAPI_NOINIT #ifdef H5FDmpio_DEBUG if (H5FD_mpio_Debug[(int)'t']) fprintf(stdout, "Entering H5FD_mpio_read\n" ); #endif assert(file); assert(H5FD_MPIO==file->pub.driver_id); /* Make certain we have the correct type of property list */ assert(H5I_GENPROP_LST==H5I_get_type(dxpl_id)); assert(TRUE==H5P_isa_class(dxpl_id,H5P_DATASET_XFER)); assert(buf); /* Portably initialize MPI status variable */ HDmemset(&mpi_stat,0,sizeof(MPI_Status)); /* some numeric conversions */ if (H5FD_mpi_haddr_to_MPIOff(addr, &mpi_off/*out*/)<0) HGOTO_ERROR(H5E_INTERNAL, H5E_BADRANGE, FAIL, "can't convert from haddr to MPI off") size_i = (int)size; if ((hsize_t)size_i != size) HGOTO_ERROR(H5E_INTERNAL, H5E_BADRANGE, FAIL, "can't convert from size to size_i") #ifdef H5FDmpio_DEBUG if (H5FD_mpio_Debug[(int)'r']) fprintf(stdout, "in H5FD_mpio_read mpi_off=%ld size_i=%d\n", (long)mpi_off, size_i ); #endif /* Only look for MPI views for raw data transfers */ if(type==H5FD_MEM_DRAW) { H5FD_mpio_xfer_t xfer_mode; /* I/O tranfer mode */ /* Obtain the data transfer properties */ if(NULL == (plist = (H5P_genplist_t *)H5I_object(dxpl_id))) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list") xfer_mode = (H5FD_mpio_xfer_t)H5P_peek_unsigned(plist, H5D_XFER_IO_XFER_MODE_NAME); /* * Set up for a fancy xfer using complex types, or single byte block. We * wouldn't need to rely on the use_view field if MPI semantics allowed * us to test that btype=ftype=MPI_BYTE (or even MPI_TYPE_NULL, which * could mean "use MPI_BYTE" by convention). */ if(xfer_mode==H5FD_MPIO_COLLECTIVE) { MPI_Datatype file_type; /* Remember that views are used */ use_view_this_time = TRUE; /* prepare for a full-blown xfer using btype, ftype, and disp */ if(H5P_get(plist,H5FD_MPI_XFER_MEM_MPI_TYPE_NAME,&buf_type)<0) HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get MPI-I/O type property") if(H5P_get(plist,H5FD_MPI_XFER_FILE_MPI_TYPE_NAME,&file_type)<0) HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get MPI-I/O type property") /* * Set the file view when we are using MPI derived types */ /*OKAY: CAST DISCARDS CONST QUALIFIER*/ if (MPI_SUCCESS != (mpi_code=MPI_File_set_view(file->f, mpi_off, MPI_BYTE, file_type, H5FD_mpi_native_g, file->info))) HMPI_GOTO_ERROR(FAIL, "MPI_File_set_view failed", mpi_code) /* When using types, use the address as the displacement for * MPI_File_set_view and reset the address for the read to zero */ mpi_off=0; } /* end if */ } /* end if */ /* Read the data. */ if(use_view_this_time) { H5FD_mpio_collective_opt_t coll_opt_mode; #ifdef H5FDmpio_DEBUG if (H5FD_mpio_Debug[(int)'t']) fprintf(stdout, "H5FD_mpio_read: using MPIO collective mode\n"); #endif /* Peek the collective_opt property to check whether the application wants to do IO individually. */ HDassert(plist); coll_opt_mode = (H5FD_mpio_collective_opt_t)H5P_peek_unsigned(plist, H5D_XFER_MPIO_COLLECTIVE_OPT_NAME); if(coll_opt_mode == H5FD_MPIO_COLLECTIVE_IO) { #ifdef H5FDmpio_DEBUG if(H5FD_mpio_Debug[(int)'t']) fprintf(stdout, "H5FD_mpio_read: doing MPI collective IO\n"); #endif if(MPI_SUCCESS != (mpi_code = MPI_File_read_at_all(file->f, mpi_off, buf, size_i, buf_type, &mpi_stat))) HMPI_GOTO_ERROR(FAIL, "MPI_File_read_at_all failed", mpi_code) } /* end if */ else { #ifdef H5FDmpio_DEBUG if(H5FD_mpio_Debug[(int)'t']) fprintf(stdout, "H5FD_mpio_read: doing MPI independent IO\n"); #endif if(MPI_SUCCESS != (mpi_code = MPI_File_read_at(file->f, mpi_off, buf, size_i, buf_type, &mpi_stat))) HMPI_GOTO_ERROR(FAIL, "MPI_File_read_at failed", mpi_code) } /* end else */ /* * Reset the file view when we used MPI derived types */ /*OKAY: CAST DISCARDS CONST QUALIFIER*/ if(MPI_SUCCESS != (mpi_code = MPI_File_set_view(file->f, (MPI_Offset)0, MPI_BYTE, MPI_BYTE, H5FD_mpi_native_g, file->info))) HMPI_GOTO_ERROR(FAIL, "MPI_File_set_view failed", mpi_code) } else { if(MPI_SUCCESS != (mpi_code = MPI_File_read_at(file->f, mpi_off, buf, size_i, buf_type, &mpi_stat))) HMPI_GOTO_ERROR(FAIL, "MPI_File_read_at failed", mpi_code) } /* How many bytes were actually read? */ /* [This works because the "basic elements" we use for all our MPI derived * types are MPI_BYTE. We should be using the 'buf_type' for the MPI * datatype in this call though... (We aren't because using it causes * the LANL "qsc" machine to dump core - 12/19/03) - QAK] */ if (MPI_SUCCESS != (mpi_code=MPI_Get_elements(&mpi_stat, MPI_BYTE, &bytes_read))) HMPI_GOTO_ERROR(FAIL, "MPI_Get_elements failed", mpi_code) /* Get the type's size */ if (MPI_SUCCESS != (mpi_code=MPI_Type_size(buf_type,&type_size))) HMPI_GOTO_ERROR(FAIL, "MPI_Type_size failed", mpi_code) /* Compute the actual number of bytes requested */ io_size=type_size*size_i; /* Check for read failure */ if (bytes_read<0 || bytes_read>io_size) HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "file read failed") /* * This gives us zeroes beyond end of physical MPI file. */ if ((n=(io_size-bytes_read)) > 0) HDmemset((char*)buf+bytes_read, 0, (size_t)n); done: #ifdef H5FDmpio_DEBUG if (H5FD_mpio_Debug[(int)'t']) fprintf(stdout, "Leaving H5FD_mpio_read\n" ); #endif FUNC_LEAVE_NOAPI(ret_value) } /*------------------------------------------------------------------------- * Function: H5FD_mpio_write * * Purpose: Writes SIZE bytes of data to FILE beginning at address ADDR * from buffer BUF according to data transfer properties in * DXPL_ID using potentially complex file and buffer types to * effect the transfer. * * MPI is able to coalesce requests from different processes * (collective and independent). * * Return: Success: Zero. USE_TYPES and OLD_USE_TYPES in the * access params are altered. * * Failure: -1, USE_TYPES and OLD_USE_TYPES in the * access params may be altered. * * Programmer: Unknown * January 30, 1998 * * Modifications: * rky, 1998-08-28 * If the file->allsame flag is set, we assume that all the * procs in the relevant MPI communicator will write identical * data at identical offsets in the file, so only proc 0 will * write, and all other procs will wait for p0 to finish. This * is useful for writing metadata, for example. Note that we * don't _check_ that the data is identical. Also, the mechanism * we use to eliminate the redundant writes is by requiring a * call to H5FD_mpio_tas_allsame before the write, which is * rather klugey. Would it be better to pass a parameter to * low-level writes like H5F_block_write and H5F_low_write, * instead? Or...??? Also, when I created this mechanism I * wanted to minimize the difference in behavior between the old * way of doing things (i.e., all procs write) and the new way, * so the writes are eliminated at the very lowest level, here * in H5FD_mpio_write. It may be better to rethink that, and * short-circuit the writes at a higher level (e.g., at the * points in the code where H5FD_mpio_tas_allsame is called). * * * Robb Matzke, 1998-02-18 * Added the ACCESS_PARMS argument. * * rky, 1998-04-10 * Call independent or collective MPI write, based on * ACCESS_PARMS. * * rky, 1998-04-24 * Removed redundant write from H5FD_mpio_write. * * Albert Cheng, 1998-06-01 * Added XFER_MODE to control independent or collective MPI * write. * * rky, 1998-08-16 * Use BTYPE, FTYPE, and DISP from access parms. The guts of * H5FD_mpio_read and H5FD_mpio_write should be replaced by a * single dual-purpose routine. * * rky, 1998-08-28 * Added ALLSAME parameter to make all but proc 0 skip the * actual write. * * Robb Matzke, 1999-04-21 * Changed XFER_MODE to XFER_PARMS for all H5FD_*_write() * callbacks. * * Robb Matzke, 1999-07-28 * The ADDR argument is passed by value. * * Robb Matzke, 1999-08-06 * Modified to work with the virtual file layer. * * Albert Cheng, 1999-12-19 * When only-p0-write-allsame-data, p0 Bcasts the * ret_value to other processes. This prevents * a racing condition (that other processes try to * read the file before p0 finishes writing) and also * allows all processes to report the same ret_value. * * Kim Yates, Pat Weidhaas, 2000-09-26 * Move block of coding where only p0 writes after the * MPI_File_set_view call. * * Quincey Koziol, 2002-05-10 * Instead of always writing metadata from process 0, spread the * burden among all the processes by using a round-robin rotation * scheme. * * Quincey Koziol, 2002-05-10 * Removed allsame code, keying off the type parameter instead. * * Quincey Koziol, 2002-05-14 * Only call MPI_Get_count if we can use MPI_BYTE for the MPI type * for the I/O transfer. Someday we might include code to decode * the MPI type used for more complicated transfers and call * MPI_Get_count all the time. * * Quincey Koziol - 2002/06/17 * Removed 'disp' parameter from H5FD_mpio_setup routine and use * the address of the dataset in MPI_File_set_view() calls, as * necessary. * * Quincey Koziol - 2002/06/24 * Removed "lazy" MPI_File_set_view() calls, since they would fail * if the first I/O was a collective I/O using MPI derived types * and the next I/O was an independent I/O. * * Quincey Koziol - 2002/07/18 * Added "block_before_meta_write" dataset transfer flag, which * is set during writes from a metadata cache flush and indicates * that all the processes must sync up before (one of them) * writing metadata. * * Quincey Koziol - 2003/10/22-31 * Restructured code massively, straightening out logic and finally * getting the bytes_written stuff working. * *------------------------------------------------------------------------- */ static herr_t H5FD_mpio_write(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, size_t size, const void *buf) { H5FD_mpio_t *file = (H5FD_mpio_t*)_file; MPI_Offset mpi_off; MPI_Status mpi_stat; /* Status from I/O operation */ MPI_Datatype buf_type = MPI_BYTE; /* MPI description of the selection in memory */ int mpi_code; /* MPI return code */ int size_i, bytes_written; int type_size; /* MPI datatype used for I/O's size */ int io_size; /* Actual number of bytes requested */ hbool_t use_view_this_time = FALSE; H5P_genplist_t *plist = NULL; /* Property list pointer */ herr_t ret_value = SUCCEED; FUNC_ENTER_NOAPI_NOINIT #ifdef H5FDmpio_DEBUG if (H5FD_mpio_Debug[(int)'t']) fprintf(stdout, "Entering H5FD_mpio_write\n" ); #endif assert(file); assert(H5FD_MPIO==file->pub.driver_id); /* Make certain we have the correct type of property list */ assert(H5I_GENPROP_LST==H5I_get_type(dxpl_id)); assert(TRUE==H5P_isa_class(dxpl_id,H5P_DATASET_XFER)); assert(buf); /* Portably initialize MPI status variable */ HDmemset(&mpi_stat, 0, sizeof(MPI_Status)); /* some numeric conversions */ if(H5FD_mpi_haddr_to_MPIOff(addr, &mpi_off) < 0) HGOTO_ERROR(H5E_INTERNAL, H5E_BADRANGE, FAIL, "can't convert from haddr to MPI off") size_i = (int)size; if((hsize_t)size_i != size) HGOTO_ERROR(H5E_INTERNAL, H5E_BADRANGE, FAIL, "can't convert from size to size_i") #ifdef H5FDmpio_DEBUG if(H5FD_mpio_Debug[(int)'w']) fprintf(stdout, "in H5FD_mpio_write mpi_off=%ld size_i=%d\n", (long)mpi_off, size_i); #endif if(type == H5FD_MEM_DRAW) { H5FD_mpio_xfer_t xfer_mode; /* I/O tranfer mode */ /* Obtain the data transfer properties */ if(NULL == (plist = (H5P_genplist_t *)H5I_object(dxpl_id))) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list") /* Obtain the data transfer properties */ xfer_mode = (H5FD_mpio_xfer_t)H5P_peek_unsigned(plist, H5D_XFER_IO_XFER_MODE_NAME); /* * Set up for a fancy xfer using complex types, or single byte block. We * wouldn't need to rely on the use_view field if MPI semantics allowed * us to test that btype=ftype=MPI_BYTE (or even MPI_TYPE_NULL, which * could mean "use MPI_BYTE" by convention). */ if(xfer_mode == H5FD_MPIO_COLLECTIVE) { MPI_Datatype file_type; /* Remember that views are used */ use_view_this_time = TRUE; /* prepare for a full-blown xfer using btype, ftype, and disp */ if(H5P_get(plist, H5FD_MPI_XFER_MEM_MPI_TYPE_NAME, &buf_type) < 0) HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get MPI-I/O type property") if(H5P_get(plist, H5FD_MPI_XFER_FILE_MPI_TYPE_NAME, &file_type) < 0) HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get MPI-I/O type property") /* * Set the file view when we are using MPI derived types */ /*OKAY: CAST DISCARDS CONST QUALIFIER*/ if(MPI_SUCCESS != (mpi_code = MPI_File_set_view(file->f, mpi_off, MPI_BYTE, file_type, H5FD_mpi_native_g, file->info))) HMPI_GOTO_ERROR(FAIL, "MPI_File_set_view failed", mpi_code) /* When using types, use the address as the displacement for * MPI_File_set_view and reset the address for the read to zero */ mpi_off = 0; } /* end if */ } /* end if */ else { #if 0 /* JRM -- 3/23/10 */ /* this is no longer always the case */ /* Only one process can do the actual metadata write */ if(file->mpi_rank != H5_PAR_META_WRITE) #ifdef LATER HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "can't write metadata from non-zero rank") #else /* LATER */ HGOTO_DONE(SUCCEED) /* skip the actual write */ #endif /* LATER */ #endif /* JRM */ } /* end if */ /* Write the data. */ if(use_view_this_time) { H5FD_mpio_collective_opt_t coll_opt_mode; #ifdef H5FDmpio_DEBUG if(H5FD_mpio_Debug[(int)'t']) fprintf(stdout, "H5FD_mpio_write: using MPIO collective mode\n"); #endif /* Peek the collective_opt property to check whether the application wants to do IO individually. */ HDassert(plist); coll_opt_mode = (H5FD_mpio_collective_opt_t)H5P_peek_unsigned(plist, H5D_XFER_MPIO_COLLECTIVE_OPT_NAME); /*OKAY: CAST DISCARDS CONST QUALIFIER*/ if(coll_opt_mode == H5FD_MPIO_COLLECTIVE_IO) { #ifdef H5FDmpio_DEBUG if(H5FD_mpio_Debug[(int)'t']) fprintf(stdout, "H5FD_mpio_write: doing MPI collective IO\n"); #endif if(MPI_SUCCESS != (mpi_code = MPI_File_write_at_all(file->f, mpi_off, (void*)buf, size_i, buf_type, &mpi_stat))) HMPI_GOTO_ERROR(FAIL, "MPI_File_write_at_all failed", mpi_code) } /* end if */ else { #ifdef H5FDmpio_DEBUG if(H5FD_mpio_Debug[(int)'t']) fprintf(stdout, "H5FD_mpio_write: doing MPI independent IO\n"); #endif if(MPI_SUCCESS != (mpi_code = MPI_File_write_at(file->f, mpi_off, (void*)buf, size_i, buf_type, &mpi_stat))) HMPI_GOTO_ERROR(FAIL, "MPI_File_write_at failed", mpi_code) } /* end else */ /* Reset the file view when we used MPI derived types */ /*OKAY: CAST DISCARDS CONST QUALIFIER*/ if(MPI_SUCCESS != (mpi_code = MPI_File_set_view(file->f, (MPI_Offset)0, MPI_BYTE, MPI_BYTE, H5FD_mpi_native_g, file->info))) HMPI_GOTO_ERROR(FAIL, "MPI_File_set_view failed", mpi_code) } else { /*OKAY: CAST DISCARDS CONST QUALIFIER*/ if(MPI_SUCCESS != (mpi_code = MPI_File_write_at(file->f, mpi_off, (void*)buf, size_i, buf_type, &mpi_stat))) HMPI_GOTO_ERROR(FAIL, "MPI_File_write_at failed", mpi_code) } /* How many bytes were actually written? */ /* [This works because the "basic elements" we use for all our MPI derived * types are MPI_BYTE. We should be using the 'buf_type' for the MPI * datatype in this call though... (We aren't because using it causes * the LANL "qsc" machine to dump core - 12/19/03) - QAK] */ if(MPI_SUCCESS != (mpi_code = MPI_Get_elements(&mpi_stat, MPI_BYTE, &bytes_written))) HMPI_GOTO_ERROR(FAIL, "MPI_Get_elements failed", mpi_code) /* Get the type's size */ if(MPI_SUCCESS != (mpi_code = MPI_Type_size(buf_type, &type_size))) HMPI_GOTO_ERROR(FAIL, "MPI_Type_size failed", mpi_code) /* Compute the actual number of bytes requested */ io_size = type_size * size_i; /* Check for write failure */ if(bytes_written != io_size) HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "file write failed") /* Forget the EOF value (see H5FD_mpio_get_eof()) --rpm 1999-08-06 */ file->eof = HADDR_UNDEF; done: #ifdef H5FDmpio_DEBUG if(H5FD_mpio_Debug[(int)'t']) fprintf(stdout, "proc %d: Leaving H5FD_mpio_write with ret_value=%d\n", file->mpi_rank, ret_value ); #endif FUNC_LEAVE_NOAPI(ret_value) } /* end H5FD_mpio_write() */ /*------------------------------------------------------------------------- * Function: H5FD_mpio_flush * * Purpose: Makes sure that all data is on disk. This is collective. * * Return: Success: Non-negative * * Failure: Negative * * Programmer: Robb Matzke * January 30, 1998 * *------------------------------------------------------------------------- */ static herr_t H5FD_mpio_flush(H5FD_t *_file, hid_t UNUSED dxpl_id, unsigned closing) { H5FD_mpio_t *file = (H5FD_mpio_t*)_file; int mpi_code; /* mpi return code */ herr_t ret_value = SUCCEED; FUNC_ENTER_NOAPI_NOINIT #ifdef H5FDmpio_DEBUG if(H5FD_mpio_Debug[(int)'t']) HDfprintf(stdout, "Entering %s\n", FUNC); #endif HDassert(file); HDassert(H5FD_MPIO == file->pub.driver_id); /* Only sync the file if we are not going to immediately close it */ if(!closing) { if(MPI_SUCCESS != (mpi_code = MPI_File_sync(file->f))) HMPI_GOTO_ERROR(FAIL, "MPI_File_sync failed", mpi_code) } /* end if */ done: #ifdef H5FDmpio_DEBUG if(H5FD_mpio_Debug[(int)'t']) HDfprintf(stdout, "Leaving %s\n", FUNC); #endif FUNC_LEAVE_NOAPI(ret_value) } /* end H5FD_mpio_flush() */ /*------------------------------------------------------------------------- * Function: H5FD_mpio_truncate * * Purpose: Make certain the file's size matches it's allocated size * * Return: Success: Non-negative * Failure: Negative * * Programmer: Quincey Koziol * January 31, 2008 * *------------------------------------------------------------------------- */ static herr_t H5FD_mpio_truncate(H5FD_t *_file, hid_t UNUSED dxpl_id, hbool_t UNUSED closing) { H5FD_mpio_t *file = (H5FD_mpio_t*)_file; herr_t ret_value = SUCCEED; FUNC_ENTER_NOAPI_NOINIT #ifdef H5FDmpio_DEBUG if(H5FD_mpio_Debug[(int)'t']) HDfprintf(stdout, "Entering %s\n", FUNC); #endif HDassert(file); HDassert(H5FD_MPIO == file->pub.driver_id); /* Extend the file to make sure it's large enough, then sync. * Unfortunately, keeping track of EOF is an expensive operation, so * we can't just check whether EOF<EOA like with other drivers. * Therefore we'll just read the byte at EOA-1 and then write it back. */ if(file->eoa > file->last_eoa) { int mpi_code; /* mpi return code */ MPI_Offset mpi_off; #ifdef H5_MPI_FILE_SET_SIZE_BIG if(H5FD_mpi_haddr_to_MPIOff(file->eoa, &mpi_off) < 0) HGOTO_ERROR(H5E_INTERNAL, H5E_BADRANGE, FAIL, "cannot convert from haddr_t to MPI_Offset") /* Extend the file's size */ if(MPI_SUCCESS != (mpi_code = MPI_File_set_size(file->f, mpi_off))) HMPI_GOTO_ERROR(FAIL, "MPI_File_set_size failed", mpi_code) #else /* H5_MPI_FILE_SET_SIZE_BIG */ /* Wait until all processes are here before reading/writing the byte at * process 0's end of address space. The window for corruption is * probably tiny, but does exist... */ if(MPI_SUCCESS != (mpi_code = MPI_Barrier(file->comm))) HMPI_GOTO_ERROR(FAIL, "MPI_Barrier failed", mpi_code) if(0 == file->mpi_rank) { uint8_t byte = 0; MPI_Status mpi_stat; /* Portably initialize MPI status variable */ HDmemset(&mpi_stat, 0, sizeof(MPI_Status)); if(H5FD_mpi_haddr_to_MPIOff(file->eoa-1, &mpi_off) < 0) HGOTO_ERROR(H5E_INTERNAL, H5E_BADRANGE, FAIL, "cannot convert from haddr_t to MPI_Offset") if(MPI_SUCCESS != (mpi_code = MPI_File_read_at(file->f, mpi_off, &byte, 1, MPI_BYTE, &mpi_stat))) HMPI_GOTO_ERROR(FAIL, "MPI_File_read_at failed", mpi_code) if(MPI_SUCCESS != (mpi_code = MPI_File_write_at(file->f, mpi_off, &byte, 1, MPI_BYTE, &mpi_stat))) HMPI_GOTO_ERROR(FAIL, "MPI_File_write_at failed", mpi_code) } /* end if */ #endif /* H5_MPI_FILE_SET_SIZE_BIG */ /* Don't let any proc return until all have extended the file. * (Prevents race condition where some processes go ahead and write * more data to the file before all the processes have finished making * it the shorter length, potentially truncating the file and dropping * the new data written) */ if(MPI_SUCCESS != (mpi_code = MPI_Barrier(file->comm))) HMPI_GOTO_ERROR(FAIL, "MPI_Barrier failed", mpi_code) /* Update the 'last' eoa value */ file->last_eoa = file->eoa; } /* end if */ done: #ifdef H5FDmpio_DEBUG if(H5FD_mpio_Debug[(int)'t']) HDfprintf(stdout, "Leaving %s\n", FUNC); #endif FUNC_LEAVE_NOAPI(ret_value) } /* end H5FD_mpio_truncate() */ /*------------------------------------------------------------------------- * Function: H5FD_mpio_mpi_rank * * Purpose: Returns the MPI rank for a process * * Return: Success: non-negative * Failure: negative * * Programmer: Quincey Koziol * Thursday, May 16, 2002 * * Modifications: * *------------------------------------------------------------------------- */ static int H5FD_mpio_mpi_rank(const H5FD_t *_file) { const H5FD_mpio_t *file = (const H5FD_mpio_t*)_file; FUNC_ENTER_NOAPI_NOINIT_NOERR assert(file); assert(H5FD_MPIO==file->pub.driver_id); FUNC_LEAVE_NOAPI(file->mpi_rank) } /* end H5FD_mpio_mpi_rank() */ /*------------------------------------------------------------------------- * Function: H5FD_mpio_mpi_size * * Purpose: Returns the number of MPI processes * * Return: Success: non-negative * Failure: negative * * Programmer: Quincey Koziol * Thursday, May 16, 2002 * * Modifications: * *------------------------------------------------------------------------- */ static int H5FD_mpio_mpi_size(const H5FD_t *_file) { const H5FD_mpio_t *file = (const H5FD_mpio_t*)_file; FUNC_ENTER_NOAPI_NOINIT_NOERR assert(file); assert(H5FD_MPIO==file->pub.driver_id); FUNC_LEAVE_NOAPI(file->mpi_size) } /* end H5FD_mpio_mpi_size() */ /*------------------------------------------------------------------------- * Function: H5FD_mpio_communicator * * Purpose: Returns the MPI communicator for the file. * * Return: Success: The communicator * * Failure: NULL * * Programmer: Robb Matzke * Monday, August 9, 1999 * * Modifications: * *------------------------------------------------------------------------- */ static MPI_Comm H5FD_mpio_communicator(const H5FD_t *_file) { const H5FD_mpio_t *file = (const H5FD_mpio_t*)_file; FUNC_ENTER_NOAPI_NOINIT_NOERR assert(file); assert(H5FD_MPIO==file->pub.driver_id); FUNC_LEAVE_NOAPI(file->comm) } #endif /* H5_HAVE_PARALLEL */