"""Utilities for handling IEEE 754 floating point special values This python module implements constants and functions for working with IEEE754 double-precision special values. It provides constants for Not-a-Number (NaN), Positive Infinity (PosInf), and Negative Infinity (NegInf), as well as functions to test for these values. The code is implemented in pure python by taking advantage of the 'struct' standard module. Care has been taken to generate proper results on both big-endian and little-endian machines. Some efficiency could be gained by translating the core routines into C. See for reference material on the IEEE 754 floating point standard. Further information on this package is available at . Author: Gregory R. Warnes Date:: 2003-04-08 Copyright: (c) 2003, Pfizer, Inc. """ __version__ = "0.6.0" ident = "$Id$" import struct # check endianess _big_endian = struct.pack('i',1)[0] != '\x01' # and define appropriate constants if(_big_endian): _HW = 0 _LW = 1 NaN = struct.unpack('d', '\x7F\xFF\xFF\xFF\xFF\xFF\xFF\xFF')[0] PosInf = struct.unpack('d', '\x7F\xF0\x00\x00\x00\x00\x00\x00')[0] NegInf = -PosInf else: _HW = 1 _LW = 0 NaN = struct.unpack('d', '\x00\x00\x00\x00\x00\x00\xf8\xff')[0] PosInf = struct.unpack('d', '\x00\x00\x00\x00\x00\x00\xf0\x7f')[0] NegInf = -PosInf def _double_as_longs(dval): "Use struct.unpack to decode a double precision float into two longs" tmp = struct.unpack('ll',struct.pack('d', dval)) return (tmp[_HW], tmp[_LW]) ## ## Functions to extract components of the IEEE 754 floating point format ## def _sign(dval): "Extract the sign bit from a double-precision floating point value" ll = _double_as_longs(dval) return ll[0] >> 31 & 0x01 def _exponent(dval): """Extract the exponentent bits from a double-precision floating point value. Note that for normalized values, the exponentdent bits have an offset of 1023. As a consequence, the actual exponentent is obtained by subtracting 1023 for the value returned by this function """ ll = _double_as_longs(dval) return (ll[0] >> 20) & 0x7ff def _mantissa(dval): """Extract the _mantissa bits from a double-precision floating point value.""" ll = _double_as_longs(dval) mantissa0 = (ll[0] & 0x000fffffL) << 32 mantissa1 = ll[1] return mantissa0 + mantissa1 ## ## Functions to test for IEEE 754 special values ## def isNaN(value): "Determine if the argument is a IEEE 754 NaN (Not a Number) value." return (_exponent(value)==0x7ff and _mantissa(value)!=0) def isInf(value): """Determine if the argument is an infinite IEEE 754 value (positive or negative inifinity)""" return (_exponent(value)==0x7ff and _mantissa(value)== 0) def isFinite(value): """Determine if the argument is an finite IEEE 754 value (i.e., is not NaN, positive or negative inifinity)""" return (_exponent(value)!=0x7ff) def isPosInf(value): "Determine if the argument is a IEEE 754 positive infinity value" return (_sign(value)==0 and _exponent(value)==0x7ff and \ _mantissa(value)== 0) def isNegInf(value): "Determine if the argument is a IEEE 754 negative infinity value" return (_sign(value)==1 and _exponent(value)==0x7ff and \ _mantissa(value)== 0) @pP f)#HD B0Q4V%JDPDɬLdBJ $&@Pr  KLBU$CMIDB}  @B$bWP  Mȁ!K`b J` РAAN^j7A5fN8_`iiIeQ5JQaˍ&J9$Joc#P#pDZB@@.(j~ކ$6IE= 3 L'L_7:ٻdTU8HEACQ(DQIAE0\Ur]^ o>C dݗ,$>ۛ:'-^x34DMPDBD{z196,ۦc{pD)QUfDdpBL4p3\/%ɑ>xQNNR+ ڣI$pڜILUQU)EO% H4DH1KD-1KeTB\ES:Hipb%d nwU1C)p9ՀdATIE5R jRa 2@HԽ$iN:#tC"TjWɮ^E>DK^Qh-[8|udܖbL5\qSp 5;"mUyD 6O8yopGoM,@ɾ^BҘ>1(G&+4/8!AwӃ^jr?\r ;LjwZeBu$NC&|7^hTB+sކ`u>y"BaJ6^`Q^p[n}݁"Aq<3R B|$z}Z.ݢ";૞\{z.a&=js 9֬ᅜ;0MX8݆aUI^ @mG yPa}AUDtiG&qnAcZЖv02d)9?STyZjyse{HD-yoϰsmcXrYw%F|b65 s U cDR |Q"7Y0([oTFϰlE3+@jVuaߕ)53*l P>ى]Rlr@TT○X˞q,q =i̍s5Qj99_YEcɄA!J>iW$GnldXfpBu[0uGԊw;N_z aD)KC-O7_ 5$dA*WOt"SAqF)bױ]iHSs3܎iAA^2sTW,#st!}ֱl-iXg_AkG(\ O!Qi~ Udu{9{p}~dI@(B%GvnV!_`j-o0Js3_Ƙ%{̲_CQUSz[ёPae3@\qB@e_p3 PcD V'{UiL.#,ɼG_ԯoaUu]}*}X9 Si3a$#uąZ|@%%!49dHo7xAK6gL܂gd3C}ݨ1J86BM嘒^U 3&(1!QeD`7y' )&^+pݬ :88 2M̝*_n@W8rcA`T6 x'[z rX J5 WGe]hc8|!yuCK11k*aј ~lbXQVu4 %esz^ h,7S*k#?Cz=?O3P G>D2 X`q~xo.G=Y]FJ]X )Az@+ȏUvn.jB56]pμyg3RSTz:`@!ZIHKÃWA/<YiEqӃ+/OA>Bu( F#ʪEAYh8`y>%񺞎3썇9$D=ݹs7>%* |f-Hc|˅ݨ::I'}W#[P}.{x.GzY_dwt†Ke^R bɤ+:F=#Ԏ$ܚ%?I=;R k\SKX g 5ڬ8 kD!AZb2v0ScSǶY|QvS6^p2;?a)$D9y Hp"ƙD#]㌳J+D jnvQG5v9$j(!#\bg5 ^;bRod֐{@VEA$JZ91y?$\D+|$F7*($S !ݺq4ZIQ+K]y5'?w- g_XCis倫i)l!Y);REJ$D%VC&,dJ @b7c/`d3Nb>DЉT 8 3u,j{qpEXHJswƯUϷ\Q FWo탬&R5S&]=sIOMqDsTR=W66$_[r‚v9# @"/T)t*#!f @>@eL K| yv0s)`8ā2 ޸>iy?a=!"Jo3.Ȃa2v &aRLEկIDOFF8j'G-: u*(؟;M }Rv%H%~&TZM*,CiM(^B yC51CUBeBs?/~OI~])ГÁYU*={_ ]ib8T<ͰP#MG7`a^!9MKYHz_j8@+S]~Lunj6 &Ca'1Fٔ[+*-E7!D p돒nt[I7T^1IxAf..~Y>HOv';]G"'Υ+gid![C}SŎ'>䊞={>?>g2 l/i5|v3ݿ]VGLHn *$idq\6S^WK̑vY/U6(Fȫ7^4pvu o4ϋ?뙬T$'@NJbP/&Hz ϕOK*)̵'V9RX(暑VωRr+{:z#%WDE w5uMIM"ʥ3RS7ߧS 8hrOhUXj*$ BGuf!D>M%لў OxR5KEñj d,GF We20 V𐖖R=+ jP5gRU!%OD~')Ʈ s7-O0Oy LסI`JJfd:yCg 4b%O^uN4"Ѭgɐ?: K}ᣯzO[|"z _~Ď MmŹE`8Q3QF?d4 ?[\jN'%*9+IPGXm3T}1ڡV Xzܭ}_I>{Ju2A=44DVb̾|eJ( C㗼}_}:8@*(.y9LBDN~C-}"3fK[̛_~ 1o.:v=\~p;AQz= Wjpқ>94h&pK%[}*>hBdWCǬGkiYn|.1Z#0W|z}~[:C wpySlBц9P}z0/|yV( vĆeCaY=O|qрےUdD@? =*y4;N[Q}-,)99rEe,NL>L)W O]XiNm[iBў%e䵝ULub*_r?p}!,ϧ_H[|dvb ]uT58Bg#UCaH# %]2@A%$1fm`beQq,>P~Xʈ)vk=gf'x:J^ l$赏|K#Ӷ>揷-U]=:PXnHCq.Y>pnsDC 5YWT7Ń}&觀Sxj7ڵfUnH`F#7jx fG*O~n6*C?0?#vu;Kjg#QN )ɷ./ei_jmH=!N[VZ UoĜ<%9FL<9|rn<3 e{/zO,ğ5<_Kq-LD8Ϲh+>3[xױ,סIDk]'͢43pkFYKYI-5vƔ pQ a^lVjMF^׃A T^_]Z>>7YfSSQ=Qi0[o Ӡ\b73ힰe,jr8Ftn(J`;wDWti?/[;^h+]:k5GՃ^_b>6X /Ġm-|Xp㴓Xtk7CmKǃU,H2 xVp?k?Qc9#r|g\0b `:6fA:.@QĐW$JT&q"HXsHt,aO<. oˣ| ˋx  ݧ$^hǟ4T?2Fvyg-x8;|fDHIwC)t@gsA^'>M__>SRQWhn?K3ϥ_npCOgǧ_s@~OAKt>w">Ш(3 SN Yt@$~Txc1iFBde9V;mKis}g 8n3D= tG><9d`v`a'o y=QRר8Ers߯JnSPBPH *Qɦ:#{iAD8ϼE *7TM5^Њ'@Iϭ #clOI|RułTHګ೏>?}zhk]>qb/yO[⨀O.D K| KE^L?Iɲ}l{5 /Z7rfۂp@坃bQm!JL+2^.pڝi_I+OI^_T';6392Y]?ٺa ^KGU㫿 #6##@9Na9[G7-N׋U{`ϨJMQF1/ i CltADQȡ<]&^ZJ1ٚb0dh䨹n]mM6i4>EDvʏmBumro05{z$@^Qqd_VȨ"h(h48 J e|$S msGDxꄑ;﹉C+G`DPUTPSY$맲rɂ~$d"EUI%DaʌX7 _wsq l>T?MAEH:Yg0 ɗ JJAL0(TQ^IX+BV ښ1tIP7HT-.cE6v9&"3TOa3D;+=y| JSP =5 \rTOlA#P?npjrdo2DCHEJ ^d="?ƈzuD0D_4l+-ٔC^ JhzHyίa$DI~ŅaD׃5~7ߥ@l.sE!~{EkZ0̩p%5O"FKjVnxD8 Ez43 )?.!oW>Ba@|tl~&zIW*5 {~ތW}A^K[`R/@ż  ޠrt66\]|}:N4.tщIwޙf ]`iRp sׁ葲$QO~a^9ߴԔM (ZE2:Lz;%xm'?[ 膅q($aDۢ*>3X F<*2$" P tWT膳W5 044aO˾R8 vR>Q0@zՂ7Ol!6\/ `;"S **O_u}gٲ=?Ft`b (mH>w'-1j((xr!BP ^BMDK9yG0 ]SPeD?/'?,ʮ¾^{Rvb1 #]qziR%uM@RҺ5B9fW % 2@20⻲tHУ'䨻Z4)$*4!HteEUDDZ+oAr8*+8λo5aJ`ǐS@rc/;2 peY);LDmPPy}K) @?]<,TZ- )6Z Z.YC$塥H p"r%y%w*D*M 5aPfJP5@LВN@9(FT@Pdޗֿ_ }PMÆDHE.\pKhl4ACz6Jl%Չ Aç "$(LH+$&)<$&gwC+Pb'/AND4U%N:5|y_"ǖFc K- 'RP- 3nd3غ }aY Ng;a}aL+*j$iZ H̳ 0h-(f~x+U 3I@$3B&р~~oB߽b\^mHXӳD͆\~?C u9J; 8ݤ`@oߙncݴ\V&0D؀i L>NL;%T31o?NKJ)S9FfP? "ũOw8!H /Y` pwuQ}Z=7wU(!(~cl@SʾWvMt u7m\3RIRH:%ԌΝpo &(]zfwl21r+8LE0qPT\8"nqTC8 =2?pR3$qi~XL(D lWy8WfOУL tѡҰ`ve0eCFͶm*؝8 @0, ,9QFA BRTQj@]iFPnE$OQ2EL'`5Uxq 1 94[0 iNnvl JufM=p(i< l82<CB"‚;QI@HsU k?\ <ҹ8\UV+fsbQHm%b@X~9so9Ǐ oWJr A}un .XdcQѩ 7Яny})kyWVaH(MlUqԣHMUב(ͬpᇊb. wh>٧mp.7xAz6wq,܁aѲ&LTҌqA,ހC`EyHGL 8ޖكwX,- SXb xP"Q5;J%H891!̄AWv $z^9Pa UUTfe~\0_Q<#IՆ` 95V;> Љcu寢Fsgriν֏6Ebn6>#9)bcל A@`ߒ&Yb!!,s;u}'=zkST:x)BšÈ$ǩ:y|Щ%|N(!;81Ϝ䶭$~[i׳tU&}Uau@_֊5#Zml#[ M*-W]''/"[P"Q@ 3;=].?  Ȃ N[nDAT7cZƬ5!V!` #T^>qsSs|([˯g*#@`}qVk$cψƖ:3oQ҃w~*ؒM$ٗ((_xe__6vd'i>@kW?+36X:Cy7~)<' ^x*`\mUTUf "WP=;mΞ*vT_UiNx9awX+7.Ys3 ꃣɖ(È*qv)$sd&P^o7_UK7*mHdg.+"_?@bt?^[-H{y,}zX37ߛ(9/<:}BZc[YgpI}QB:eْŖR2Z|9LYCGJv 3&vMዖFw[|/LygEQ3{t&; DԦlWib;~ZS:nˤy?b$># [0%wYd :LݗelɐVQ媚 DB:_} WR|ZCAOempڎե$EЅ HC }%[p70sa/FҢ?Dl< u #j@AȂ/[E*,aO\[h&wLqNO玘lGvT0}9gZ!adE4~:!A Ey@F(P1^REǞ5 8D5@-)߽tAgWG!M>C&B|_<ʚqa;7?][bՋ-@)UUfҹƱWX] ?kx~V @. -<'ܯP:3Bv)KNnqWۓ/`C5RZ hQj?W;Aل%N.^gǏ*<kYmbK ?`|N".Jhpx ڮ "Uy]N& z+ PkP(hkTe}NZ!Y um/?iORxm&oDnaC”!`v6֟L>'g!z _[,]L;&mA*N8 d<5\tZ:|חNx5B?Y t;||zo~|xr;V핎:}4N^6F&5qyYkzە#gIKi|RQMZoPFl^~MBO{~bDЧz)# )#\z'^ӄðaQ2oTBirddYG.GTDb;gb7 3N= s@^ U=޵u%N -A=?/].h:boeOϬy-O_誵S#xjԳS'0 #M:,#p`aҽ9R @73H c5?/f+J>ZȷXh>>I`|Pa%Bm ݋=&&`& )pJd44:" 7$'`Уony^.E;br}O2&6~Nk[(п(_ +씗4j?{Q@7'%UAt3u F;T(n`>o'C/ir#1K5 2xsCgr|_~0d2>(=WZNlO[(ckp\AnƚC?{-ЋEa OϷl|*)زգMB)*M~( |A!xJC`@wUȜ>[ژ1_7c O_t<!ǡp\]1S2S!ST0Q@% tF9AF(P+CT{ͻ_]aѡ>07(ZC(l=>fu`N޹(F@םJ{R" p_i$6oܳ{|v}g>ϲt ͅ2D>5U|+љpwV挈%ȉQ >az!0 j3B97ʞ8pzϐI(E z'R}}&$^-J("nr?m 6A/UH2Ʃ2XӞ{:3ݦ{`"HCHmXB dԊqt_䀀w9NxQAӔ`B: 3rDSSZ~V-DR ˭!آai]PKea B*]&NWo96g|j;b K10O$vm#Bi&){'1M|[XKDٽIóA5LZGKJ "d©@dq@CymK@wWsps3GD#Ky'޽68O%Z_-s#J<5o(YVrNKw ~e]Wۮݾtےی/V-mYV!fYct \/8r -]ifٮ, Ojk;:]:e z{ NE SvIpKbHR.og2wg9Wl+A˩< r㹘T* +.ѾW|qkp* R$G+i\D4uƷ߳w\.*hό0ZeQw>na-l9eeȫ٬sÇWxFS<'xjV8%^ ;5mOaM? G>mB7EhNI E9dƌ7N2gMYҧN}ϫaf+ogs,E1P:t1 :nkk-qQ#^qUyڱ[G=zSU^~@>F9a~n:(:rҺP,5M0XmV.P[\'_U8;, *O&}33c2⮢[U j薆­|􅖊6c'J"jB[&\Zv&fs=,/ݿJd&uW+[gSPDO&n傋38}ӧN_;(o9ӊgY`*u$}kl_/o|vN5dQU랭kirjpYv=PtryG62,.:V-嫖 8e eGIm!+Q6H+Q3{3VCh+mF acZ"ŵdܵFlg;|MGGJ:@k8>9oѡVŖ ^8i(iXϡ4a`x)`Ko}lݎ&cmݽ"]pzvf *yRB'Uߕw\-FVps8ԹƻmAqcj6֦{X{1p]Z BոMq0[+ix}zU V ! @TBAA–*9{|3jwoPRPb &e|5*Pռ=Bm 1CGdz6h=Nٞ[ՆjљuQla6Nzh/jKq|+>&zt 5fmz*}TPiDuӶ0EDΏg<tjE[|ѧ ֘!Xn>d:dw{%1{  R{`P3}ó8F1uMS:l.{;j R(}۔N;{WPM[avnTB\<nu+n&zyU"'vk*&@n!ii pDo>;Z/Ie":_ kirA neCJ`-F3ƚE{W |i&Tr=&v0KaF&sE(_aEMdzyQnPG%QFzR ׌HzeOo1GU4>9v1Al fv}ÝY6^%Q'^_ϣPp6@zvw f`rd r\~Ft-9NY3SԼ, 3 `CG~_C=>fϔd鉊u2\lͺR83{\pRM6 `T)|I FHbܡq`|wاlny)1E8Ry [Q˧:?- A9R!;{nJѦڬ}oq歳>\|=7)lv[v]WX*"hn^dBD]n3{LЪ倔2mZz1.L!߲:zZ4FT>KaDVp۵Xb+7 pȮ/XQVnb:QTi!hP4I;(){l) ?.wۆڍ{,,n}.1q۱% yD*4SG=y0ןGTɗ21<#P L1HzΓ\sVF2qϮNdAG^:;<1Ҍy]Q)Z<CU4yN^?t>9Z|]ӟۼ&u*J(!rAF"q F!G&{Gos$r8h9D-ܖ#r-SFI XaS0tœD AER-"d%/(dY۟뷪EL xv$'S!'2`bƸDK©J2aC1Gd8Yn$!d98刮^Wg3 ]/ԃ ѯ73!xP_Myv <  s٧'̣/ß0bHY0@I9]9Uk hgz?1L %[SPct+eENbdf/C^{R&>mT纔sxAΰROw"ܾǃ$',6Q{m8dW}%tNތ9 daޫRaf)|M0K. <#3N#"z e/xwSC)>?8c?Gx(qKH {_iǤ O{%fY{| P}xfQ;+z3xKtbV»LpWq }wr Xcvo5!og{1um0T};V:G!F!O0t ˯dTMS'Zyz'@_8Xx謴ϿF\tJ31"+Mm2+ʒܞf %4e};3l9<,wAu\.~Tv P`&% <2g-,(׍F́|Ów#/uTk,2i&, =[hsv.O `u< t^8OS{g` ^4P}F5rܐA (+skuP"5^f]HȎr X[{{ F, ReURo_OóRV{Mb*`m=&S3{.a٭*)'~Oo{M4FaEQE4SMMQW;4ןk;IKXp+qG@痩xbSoރ̏)laDDA_wMSIx:rn.)K7ޅt+1gsYPuuUZ/$=B;⽏=uR hA@.L zDx3If0cFZV7 kVyW>w)N~8ĢYf)W|w֣ǎ+ %QJ HAtK;O孇$Xo%B%B%UsTm #}Y¨.&?ЊbTҀ9C&|U'u>H9?pƺ*sHT}=:q}*#G{6CYsssGÛ:!ڧ-0E~4\yM=V>AU}h14f >!b:>R1 IL SEss=WT5_jEX,/5b{ pr F.)xIAM{]6-^ |ox^Bs7D<&b> q@r->.f{L3Gga}E B?٥5>A֙Һ(9TX=4z|}ww={#?";{MM짛E#UG{UZ@r+$tה$Hv@#(0]ZUe-WF}KK_EGAɍjz ೲZx1ӧn!aΑʙNN楟HO5!̡̾V+2ۃ[N'C蜐}`ti߶$IN߃/7l[-sM*Ƀ V4ys,{"u[9b6ٽﺏ{"zzߒ(c(>lt惜4ij"Īpeފ]`DSw]K_N~ж|_(m yosp0m %SPAYV.:ځ^a?8-*^T*}J橮hp{z/@ƔSLoRYO/63hogo" 8 s*}/n<}=~q}ow|zfMVE͹x& 44S\\4mcEI#h5VB Y$sN'cPL>4xPF"K^>а@ TD#SowUUUUUQOg^U.]%u,%_ư3SyA}&,H\VP\98eZ#ʵP/~򷃹 a>3(;sΫ6:wJ$~ա TG{8Jǭ?>3pd&5旐#1 Wlhhd#Qf$u(k Wy_.RPVm 7eڮˤ`+ Ew:ҺyKxj<sk2cN٦pOXO2H[ui0ZގnG^ذ*.f$=_|tGy*S|9xZsq~(F"b (CH %rSR{ѭ>Mzv*LT䊶.T>CU{T,/6[S5Wks$Js z7f 1*J>e)۷sElbooQ, 9ٺm_{g:Ϸ=9hGW+^ tZ01C_|0zQFͮ鹻7$y}>SFE"Y2hC R1 19 S]=#Hf?7jgw ڡlnY>oݵ9iv eƐ334^7W%Uq!7s?X~X䐈QU('){M6Q>1c<-"F<݀sj9M`ӑmulj 5o6Nan=xi!/ہ>u(% 'I!D?1>>_ʻIu%T]d㾯4E Gva[óNbGX-S{ L&buy LeQ;P]Kv/wfA yԽ;ߗ#8 |\CAɧm,VMH(H~Y$P/b $ *q4d"@묺BDt,8T%Nuӡˋϖ}4sWXT5^X{?ݾ+8@~)CLUqXӑ|<nPaٿ'\e0)0:lSlF>"7縺]U2yѢDH*<|,.*#AühՌoi85cyeqFS.dcPLBJYsyd4 O^D!~t'js<`9b5#PMLT#B4JO0l{Ľ7}1' "PSRCYW#G5c!ӫȕ%y.^̾j R @֊)3U*V}%M.YThaڂ k9<i!m@ ^" 裐/p #0uJmWaG(wRD$T#]": IJ;Z3~AOQK5k+d zCR@xABZg '!wJ%yuV-l搤cF,KtT&p]xUU=5qXvfWQ R4tVDqs$nLqs‰ٲĬϤ C۫-.o7hdO%V^[ېd#T}gf 1C3GD7# b(i40zXͥ MGrED$^8n %-'TC跻V̗:z+MM``CFHGLcUm~;-TsaPa8LD1ɩ H7"5~_> ;G0!˸s:4{kfՁdruR\<f {/`¼#dTSmÝ<8Zoyp߮ĉۈ>4jf;\Nu'}EUcˤܩ7D.~ݻ"U7DvS9}f˔]w+xʲ3TLke`}J2K@HZN%C h꓊ ՀPTq D7kth!QjP&_WK9lvԅrmHZaD]kDhmGAHڣԺ=: ?{JvӄwK0'Hep@0Xz&=_pVHDdplS<9 @TIݛf(/"vW[iW9/)]] p:m$oC0hsl #ÞV$^+4zYY^ Z$N=cvC6*W{uongI>oٿAUUV:8Rk=vѦi/wu/%l٫eRj ߞƜUj:k_S/QCZG~Ϧ7sh9tzW |ǧ=w[$F_Ή,5otZOR$7g]dKtw:wxiy0kûPRaap0m-蛚QSp.d-bibnzDu~Ԟ}8lf^= ɽ1(3Z=o!9gav{фM8<ٳAɈcˊ"KPdV9qgՖZơ@GdgGGVRܸI~]v;۹@~˭ w :ߝpaQ,nYqrٝ1778$K+sp f425۵6 3sF9r|ZM|5?I="Rǒj%r >78F֏Krf_RQx?qN]b1Y{z{Vb#FS&c9Pwzy"2Y.:G*pӑvy}5bo9u}ބ4KG +S ^É/~ɱ"WK\UWT1ښ@6!A@9oA1k2ܮ4)عj);m(qVQI31-F6DJ i'(%ؐEbJY>q&7l Eknxc:Ap-"EQ5Q9'&ݫo24rcC;hD{=t`~?s.{&$S!̧;( >M P*ܦH~gQ2 KÞ[jo$?WІ#~ע?yF:FVfD N2F`b?+ӉOHͮɣ>ȋS@\t/'c c;B#F{[ q:R(󻃭=⏎ CEʱB-t(( T&wWn$L9u zO^VNfl- E⫦2pjW Ez/y.M}][Kx> sd0GeR `DmB: Gy@"̰!$b tjGFg]̕l"7*UVTإsԋoה 74Bv @$܍1 E*B!,p\YwE-Ei%(T Gk,* >T N)33M qY^>g{!25-Z#;&RS@Ϭ.ؑ!BRX"sNJ%#D(%C~US\B-y{kU-G@Uc0v&CvEA>8v'nˎ;:Z^5Trr2xsl_p|U6߅ ETQQٵ@i0ܸD>guҖ;oՍs ㉇ۛ{ÿQæBg/ybCm5O.#v܎i{g9S;`!Lp<>l [!9>[J1>3hxh 4ؙzWXWTHFSaeuC,BZՁTGh8[b `G˧;!p:9-q"tC pK[4(^Yq1yIHHa oLRf?4&us䜄>Za< ǁX돣8Cnlc1ǪXG0-.NAe\^Pm_&|8{ NMӢ qoȋNF}G7܃ E#&`Unө6\ :GfzgY<712 c}ȇ~(ӉݎԘN홰ۜjBJ1~쓿\˯@kp#Ĝ4GB%%V΢o36)q˖ yH<>Dꮲ5{g笣g*@ʹOAx:.MmV0(O0wG4 -Jtu!9f+TTT-'zu7)<+(.! /MK~1z$Z_WKGnaPUI߰ c'G38T`ͣ*=Nr{LX"c}ҥIP?SV+ePpCB\;n.O8+i5F/uNS/GCp"%$hHJ5v;.Nhn[-BxX`ӂFxíS,cPfv atwn]﨓F{1L.wPhIp. wx~;=.\qjx|y'.ml/:vG绅G^m ߗ=0tv;N8%XQش뢈 MBx|\pt؅=A3 VH;Fbma&\]Jn ,u)&u眿J{곋e\ݫ/u<9xfw]'ۦzGkc RqG]_<-ӂui\ST'RS-{/7g;f5`ׇ(-P_qFY#77-dEѪ[9eu:UB9Q8>Uvp@ 8ѺW\p8ĀL+\^4o9y.m24o98~H(:_o)nƛcM b+ N[xq[m/YJ1{ws8>HOm$cT&,EQ9;X F.PZI$$Nuv_,'_GﵠLMUs׎TEVd{|NY-{pd7G}!.m ? ! AC]tz ] WTYd@/$^[4)gyOOO`~N/5 ;l>$ Mw{xY+#66YN*dCy7>~RDL}*Ilau8R=_eO/B4rӎ΄v]pq }z8;AyC:Щ3¨pDD m6WیemQ߅o ͤZnڴ_7ozko]U'pڭXLUER7tQXl5$)s^9_L~e@W%W8@ܷxU͜XN9i;--F(IK*@>ue$ar$8-SP#@EcP`36>aƵ`_ڦ||p:wOb Wk5oMǸsE%T1 >TޡSGΆdZ!*/3/实w>T%H5ݟU'qݢ1.HZ= ѥ+P`/^zi{bJL###"IҐscT;l@Ym 'j_ϗSE.8rr Tw <Ȃ .eB8%s;a JyL^?wX|EZ;?|>J_?$_^%WNpضo߯FE Nr{ͧ#^Tw9/X~3=ޮۜBV >MjXa}Sxن8X6^Ddk޿1}2|| ;:V/X9sB ku}7 !r `ŰK=Ɉ"kw]T_Oj}7wHG'ׇpՎl?]st3mQ(18^#zhSMKKL>%9=PVAo+2%=]ڞ_ ve'{5gOiO0}uK\7BN80 g7{>{tq *126uI*5TlW8BϲPrn")\8/<͛ od$rqA؇;jrχGJslH8L^Ӻ螔ssMƯŔ[v0kӮDQA_slHvSﰷd:fLLꈋ(/,^da }-|'k-cy׷J+q[׮M}$hk ^gp2ws9F c$8:(ڬZACݒrs!ֳ6^>3W*|;NVQVN.Z|8Tҁ~qQXMg7c_АطkLCXJbn-wzLQD-;J!(⨿R|/3G<=)?p[$,MEOEs[`qb2pԖ\ɂK’ҡX9ɲKRZB-&`#  >X5X#˸+'&GÒ&K:;:p%.kXO4KbT\:NR>Bops{p]J깾Ӥp +9 MqgO1Ԗܯfϫپ $gDy2v1UcM~Ȟ|^&j"OhxƺQd).3l.ԲZ4ռWM_kqNrZե[ 8Z#S3p.M! G\!H1nI};mr[ѴE”^H0q#Z r٩2@R+ @͟zj>GëfTx 0r?,^s !L(UFB(|',v>eP17̩YSQ"DA! K[Pgm5ls]D{\=At[UEhk<4N P RO8"AE{t8 '9AS[-&[Ÿd K_|Dq|:GgQO%z;kh q9ICKݤD$#Ep+yMv߉&oL hh`<>-E.wVGN Dug5~n; P7JgdX -N 8"JqI&fCY7ZC'Oa'~5{}67,vK 4_Jl!0bN*ɢgMZ&!ȝ3p'c]9|j"$5Cwf1<  (p{|R9r,˥܂T(BP(SԔrpOܹh LKlEk=Z.H~-gоS41mڭZt>PFN ߿sm,o DOW*]=]h:g l{ֺ82i*ewqK aT%C.l俛iԮ'F4F@8NP4pI0@^^S3^ݚpeQNlFZ!Yuw20Zk[ [HEá~䭓;ַ_m!b%VU Κ"֝~@{qGJs3g˨7i1yꢛkM['y+c6ʼ߻JC"j,<_%wv3pӶנ69OsSIKjČ(0 QL̀ hi*Z&(2>xAuk:Z͓n =3)8 EW{=6U(pO$oGAY>h cfB HbɁF1x%qp"K'9 QRDU( b"`I Di$G$ J&d 2-I 1*DU.CDP А@IC:ց0V$йVM !A@j³Ad5+!1Y Pa"̰DBK2d*[u*%+rd k^Ւa1p$1'$iyg?QTRP~9/lqQ뱼uz;LS~$5/ݣȦl~ ,5Hm/hѝdU` \+sa .bѕ@ z5 F!#vceg-/1Et]^qT4-6Ұ[\ϓ.xn^]gVvіS*0ep`:U0X7ipp ߲?g٣(`aT]T_ӼV:ƾ@)UcD |~WY$@Lū1\..@<<{*T:bFH_u"w>Fz]ݫX00Gy7rhؗг8gCU}2.[\c^,B}3@ĂXt(Ƭi:{C%  dEm\{2U\wsjΙ;ED7ա8kb͓t5#qĮzğ9Gm[D2x Ɋ^!$}Kշ& 1ﯷ¡ޞilqD>O7go.3׈8zs??ϮZ1;\"|7l_68yw>R $GW2A5s=4I&4TNPe$EFT?8&O?,J>܏䒃xf_H?OIIH/އ՟2ϫOM\QJ+6ޭm~?d@/)dFF  @TE4 VI)*YUB$baF%" )BZi Z h"*j"bJ iJ$)(&?x4\BEGùPb*nnpsA_֣ ?r@O5i[TAY-?MGx|>OC Y/ kejt?⦚) ^~?$I"QD"f DA1yf!.' -v97L0%D2~EJr` "(,,*02Œ2.sD106a1Fi5ɜHZD`a4PEsv)@y+I%%'_?Sb`~B}_ddQC!`^a@tu6jI"Y R?s $-=X6JP)NzbGKpLL1 TdsЦm_]MۨLmֈno$OG?y M3M̦^uϳOpԗ$y;'@ H4ăQ1TQE4UEQRČ, \| 2`_ Cw8j BVp̐熠a͓dm&U3`1`4£"EX  tcɊqYx rX!KDn 1H[PP/u[Y $LN'bE6ciq<7MNE#{E#[ѭ5ZEQh5̅*AGYFVoEǜON! =H`آr~$"DRgxώ|TE`h''Ɨ ټ}G )2SQ4EDRD!Hn@:hqSCpًprϵAM8q7f?Iȉd?KfgS#7k绾gIBt4#j")*xI\cy7qB㚨I:۬ti2&a5 {=' sxa>7v'Gl|̎Ǧw{s댌 f3g0I-*u7A_Ord+}dKHLqwчo;IÔּL .%Iq@{ r|%Nj@"K `@a,]巄ACs<&z>Cݤ½ӮEJIn0KaCc&9/:xkFfH(BJXJvArcq:(IͩHwEn¹ĥnݤ̑?P=ۗ;bz;Jm@7E0`z2 `8Z)ǟC*@>ӽNŶ!y'2ę0a%L)/h˼q"dt׫ϯa_%?dD1}w #IH&O78}N~c][~"d1#477 eCeY|>OY\FMGt.cuhaSRuPsSI  iȄ K u=3 B/'ibw*m]#HG4+kn >?9 ln.޴-xePdDw IBUUUUUUUUUm8ta g4I &)dG#]01,$]RdDg$pzLJz{Ѫ_c hϾRdzlR`Y ?0C !5~pBxmv$;G !"` @8 @ؑK?zR~]ap RiZMbaB\Ձ)pl'ō8`t'n tfu nt.x 7Nd?<~Іi%:C-acfU8UD@ z:G8sI?3e0 DDRw\ Mv a4wYE95V=ּMp"/(—DFbpCdjnQ0Rl;GaS(P;`B"F)_(r zɓ8 ^P"L/aqx߇`<}R#p'8e~?.'n2k3.<|<(6MZO M5`J*ɔ(k|r1DѹSq7?;~2 1 )w$s"wW }ƚt%kM,#}5$`a$0X$H#0Z 3Q 6#3&/\7TP(Eúu{=!ðp`Gn):d G~8idž җ͕@c1rqUF {m KI*GDWt?s"n'>oyNA㑎bFٷ6cbpwdu@s `&( băL!rKAѓ bbSD0\%"O 1X;2gX./mVqwwBT14&N`j$ݟۀ;AǸ5rcD218N - smyy@H.}"yy~ob]Rz$js;2^g# ʽgbo^(̩9m !C58YK^s?)/g&C O]*ŞZ6H6'8p  3ȉW^idCO<tS =^]!]-Oo8{/>PlM}#H==E^rJJתLZW'T]l0 2tȑA\B$횎( $5$ci -H1 Dņ[==>9`}޿sS-N]-žqMp6_`_WBpD Lnu]rRErn[DmTu|&Q$ U|EC(nPkO%[=?[ϐk%5bI VPhٶng{j 3_y/⡈ uG < b!Go~'﷊➿}^zwbBlkp(sr2:p=|-]#džmpv\GM ISb@tနV (M&29wp@1۵ki)EEJ+.a9.o6GЕ~,ɉRo6k~NSA)LB%y>fVnzȴ||c'wzB {#5 .kk3quшT@,Ɇo scXr&;$u PÒҺ+':9۶Ma;8LנT2NfT?SS L6m2^؋Hq3\] 5'OS-g3yXla}B 7κ 4Җ/ur+vdF!hTgrx 9ř8y[jQCF2U٩ω[(#$!Em|(T{ـgt=.xOfh}Ga&;_g^\ a֖(g~(?!D\ b #Q0N),U** n3ܟ|/N+ {/?αB3CuuUJ@$ApR L)s,0RϘtGn(K ii6aLHad +$aXaEДQJqj@ @Rd @DT3a1lzo^҄ߩr9C*+*>asИtEs:: 1N0xRȋQE3Uq#BpP)zN`m#%;<Ybg ~X~L9 3~ 2U6X;/T\ʖY@GVqऋ"XM&{٣йG`&B`u~CK_Z7G#_P)"|I S1\ E9IJe^JGhbjeZ!@@ԩ7$2&3qЄFfɧN ^JYu8ǎBM ٳUJVhC]zËܒv RI(rۻDlۈƽ eI1P Ó8&r99+pu*o"IBURs =nxcɖ&#M0P"xq840ɝa$)y;X%Ҡm&kURZ/^8! ח2GeӼۯ0\1&cgVlVSno7샺8F0dT:G\_WdL5R9VfF=h>W!'ֆfI?/ރ2cX?J  ݻ$~G'yy_ɶ?ԛk￀dŠOO_dHkh |ar1i7Ƶj y=mK=PTyfNPP-xø a(DJKo}V:~[--EquGShLX3CZbYw%TZo*Ap$ 3p9v㇕93jƀ%z !逝;>3c؏ls,8Ý [HChh2@U[c$ ]e?pK?( G ~($VU8EjE숁;gI>'.}@X! sov3T[-I,?SݯM0Ꮚ3e&:7/-GjNؿ{ʶi97$1%t0 Nula>mnxϯ@)}] uf8&J>Wȁ*deݟ08N=|8m]VC( ((bfMYU]f9qmF7ah5#iu;5<-p\Vdƚ4 Y<d~3{ 'p+şoʢE6u\T{es&$RUa+ʡ \): :]ְ@ЂwRB4;w!L>2E|wǷ- v޷P*lޛ[q|yY4Tz9 e$u\Jkw/ݩp-Gm~GYZ L=KVS'W*cw5Tj~G+NG;zQb -':VGYU3w-G*qIQUB뭗KbᆱᘣNgguM:#+ ieg(sM^zQe(|*l%s2qo7O2#]B-uDlrlYS+|Sb;Sc,EcS<޸)xW W)ִ:zXLpI",[3-B0WΪ QV+h29ռWV0'訌;;v;T86ܳ0!#dZGT9q`4yv?˩7yev0xfBO͞ſVĜ3RWn6"U9Rݤp,Ⱥ8ya}GG>ŋdtQޏ\ $ ;St3ofzZ;o*._U+˿_pP[y[ŷ]R=9#빝-#߼k߻"*%zLznʍ5yξ6|wϿUL㖯/~,Oo#ݲL|7)PǯMvWPm!GS5viGQn]iEuwUM#IEYgFwZ& ffBmˋ`^A$3woSiL#r,@+2hHA *I-4U#/9|?(aSH{'U:LxKdk洌L뒎."Z ax @Jp8;7q)bL aâgŶ^nVH~XO!/#$}r4͟ nM4M7L}ka?nѤ=J+bg-\5]?y<t2T!JF.zטV>a#v z |ެbB3$]uyL,z_j UKx[] WRG]asdskyDZ@;c`]q.HN8ߞ&L;ԓ[H|r7_M]:z~|C@"sGqRjuvLFaY&Ub{`A/G^YtF㔧+=bI(O.w=^cԛ:Nz|VU=k`3A':> O\_l/ E;up6;@e+b;hd(K2ʗNcU-g VQWa_VjTLN Qp[IÎU!k499lܶ;lr8Y[F`218(j/p7Y(τ+|jYoZ`ڮ-ZhPcQnSXOeFpإ:sh""hdGif$q6ڛe>S`sW}d`)0/7WnQnC#9sF(l(k#-V*)$QHA0|qR |=I =9#n@z{eѭl܁kWerp0RЋdvՊ>u:88(BVKg^ȯ# 7d0Չx!%\NǛHPBsʠrn}f bݽ]c@ ?'ͿR">pp-d B $no9?1Y>ILM*}HLsum/<}8j kĤ0g6 !PMʬn{s|[deĭK7YN󒌩}7<4XoT3zP( A2HsT3OBu= }l 8XrIŻ}߲AGQEqrnnQErUѝ0LXV-@%7HB6񓣇RvUY.v A\h,~Ft "!Eu#pxG/1흾o,:5X%pt@kEMUcGFCoyt'ؔVO 5fWJpS)qdݙZrw0R۷]u@E$a IrԚ_nxwdps&z8pg;f,Ċ Z\++ q6ꟶep*{C>Npx{H *[b:H*ۉ9,V'y?G>?QXSLУ̴@310IHJI>:ɿ!b SO՝ \5A'F?Uy}6iogڲЄ`{p`P@C2"YΓG!`ʩ̎N@A&PK:Co1œ3ۓnvf3R3UʁFs #!B s]7-,,"7N~ B=iKQsS&7pդD?;3&@"(<|; @@J?@*6!b2C C)T΂LѨOޝ[@!  ~B̐̚^ŗ 6p=kH~NN=lpBr`k"T$R!{=j#y4xauGQ?cn9(D DP;`b%l |Uӥ@Ke='F[#B5K~,+h71/d5xZ=e B%/uQ̠*ԡF3jed_cr lGúB5J~[@I <; \#C6`ۊ%2|~d "!Bv]9A! 40d];{sz1绌r#un$ZW7 m;$#$7*J-rO붠@0Q`ש) ș"y4418!h`(=VFK" zsS;щ+eo,d#` R xtAP-c[ݶc/E{9Q "wߠyi -KS鳺 z I^.~{q ܷv x'JK.1e ??}শ@oS kb/@A rYFW+;a!yIcPG&wH Y W/cvvq IhN~ 1DtYؼ-͈-r$$$&BEQES!Þ|Ès ^q}~H4m_~%@ə 01(ȇI"%;!`yy.!ơO3Ő?@m}z]~4T %"q~~~H3Ȃ>u GWp>*JX?`Tއ.svoVMky6RB*L0j* jJ+U2 L Rh{wb'y>QD3HQs<{L)q25Q5T" 1bakZˣPxѣĚ. b0$}=Da%&*VNֳYLc/ 5fc&g{S%N sIf 54@stVXg/4 mY;ǹهք\~o_c.mTxE9E@GY[}Dg>MJPEz C\.E.#3UǘH<<<>b&+&Q"Abn!bCȶ!ﳍ&=YU@¥߻~FI:!C v'(Ȱ$hA,I I.E2iXCTRAE;3D% #D *YhX*d# f:kMAj*I&_e]B:~p^==tds֠S蜼#m޲>ma(8jMM];h4¤B L`|fqQpMLT#k R,ߘk7k,E82AdE˟8:Øi1z(2BRڜ,eQɉH>c /2t/0q`$&#Cӹ$y?`&*VWGj?Kx@1Y>ؐ^_zMa+={9Sp#n[-Bs2R X~Qv8}:O9-Uk<:3efh3".* C.5{]I.&̹gn*0=Í}P&;cZ@ג7DFybi5vjQC# .J:̚ !4?5hG/y1h!,E!E#Q!=aIԉ".4ݔ#DjG3Ϸ ^!2޻d(}ٗ8aA(T*(acP%,{HQ Ah>L@P˴ fKs⍄ qWS Q?p!k۪udܚ4Z1Ns_Wfx:IspG1m4\36؝_Lg M4[7#^ylGc*ԶK%Y.)1bn49mV,MOf@Ho59mr#箸Wdg  }H᫒81N}[EM=YB3,C GcÌU;d |@! Ayo96ʓ%D-!PsD0reO%Gǟ?h8G͑gq>y Fz+h_~zֱ<|Yw;<[ބWabZR悈 ŲN%r땠BBn"7 j?& ps 򡎩RHd#&z,h2h1ʍ?d‚ 6_Z~.=[vcˤAm ݾ} 1 Tw hG =3(H^,gћ~vDa:5g2!ltXi蓫;@3MTa+v$8c{ Xvlpn{0o_}Fϩ}VOT+nRknM}R 4Dp)*RM*hy:`:֡Ԣ =g~3iQTW+i@"9y-M%`Q(ek_-o:_ʨ(taeQίZNfUF3X9*.+Tbr+Zݶ>|siyp'p'挌5uJ0D> k4fftb53gUXz8f*g'ygf҉>8qw{b9K+W^KN3*thO1zY\*ʗIR|F10MDԾ*ǚљfmY|D.-B>)i>aljŽ:#(z37XVnYN :3P*;{~a[r~ y-acRe)I b%B74=^WicзvF9q/|ʢ?k 1H2+Y}W`p0W< '6#':4)Njg\;{2(f5TlMPrxva4'Ӕio%xp~`p֣jDXn> )HHȇaC>DG6)` D zx4A&/|P˽m # 3ׁgFT)K1bI8j z#d# (.GI0@ M@5!MZk8aA WÂ=OG mP|&Oo}>ػ`˻Fƃl^r#93, $39ycX d'iCo1#~o'wvx%&hY < x8NmutMe]}UQ"NYX˗?E=//Vv{Ӛ)qIo9YΈj]ǒx8X %% >dBVpṕBh8`&,$ƛHg*A?} x|L%m7U$!8wYN=47ss꬐ݧji-`!Iu*%}Ʋar=㶌yƌ?%m>˓^41?KO nz.X?`qs+S>zC98OiA:oYs| .w>ty8 h̙~;İ ?%~y)7?.O1wLӂ(leb,Hu \VPU$0 ŕ*r(ve{z:h,ʧ1ii+Ve\LshzC[U\5i"{"`:p'.Gj7z7~vOelx.:f$=Xo:C2\ ewڡ,텮BIyyO=i B3S< ~3i$L`;~PڣaU5qAa[mwa Dܔߴ>>Ӏov@+WH@m~aPe1^1 W k^ e:jUU1_"dz "8k5 s)Q 4`䝀|" $$&ybCw>BxeXt'zpVd x4N 58 *dWn"d `>=^Ȁ{6cvs88 n/[٩ 2mP½.NÛ#s . g{UȪ*$A[S]_'' A8q55q>캒(:دߒl ĸ)QTr/Y3hH0}`-[qnuXFJU{bs߹fcՇӸazPo-ԆhjG'"!z ʙOQQ=evV Mb|&>(teJ*Jcn,N*`q5hA_ 43$hCZJP !ucj_w,(Da9ܖJދ$˪0ꪁ^MH\,h"L[uNKnd+icKS,!30u ^5q@;[mzug!fÎ! xun#ۑ}d,n` 3Xwjg7y<\L͝@Ԥ)xzY|NvhS$X!ivj3ֳsòⶋ!-ߞ5h)k^uwj{#,LRECyagFcFt; B,6'H67 M'pġ@=ԃ8Ҏk580Z]T<İ7;ї0!32bfbSB*љƆiM׬GI KKpvOd9iuUܻxS>ꮪqS01Us( | -!쬢pW]0hu|V - P0_6Ut4.+/q0XjKI*TX[Oq$,;0T@O+btk˝64Ͽ,&8Cq.UjN?>^Bߛ?`Q\_7:{'^[;PNj̉Y 5O|PP97ؠuuq'wܺOAwـt!S2IS$ˡ!UP| m@}O@w` y PԾÐ1Ƶv'}wCڕO,`=SGHTYshr/38շr/yv3]_JBvL+y !Esf$m3q睼L%i#:_ƈī{zf`NJEMr-6 w0=t Ŵ%y茹ry9kf6Cq"MoE]$FA)Xep<(]lҝh&Qi!@3lgs;!bkJ^! ù1IbΏ ۆ(Å3(ٓtX(M(NI,;6E8QoH-w:y(.!1( Ҵ4f >R[rZ\3&މҌB Տg9!<<(kC礳@3:,Iyv蟰/'nv1maՖ -=='gz<.e"ͨu#Š)Î`Q >7fݛrNFir: O^G\c% 3Q2W[3y~OnȄ(͞!1=*DI8B%Ӏ?)DI|*pjcg7g=9RFp9M]^֠ivDMUIK= P% UMQXCoVLN 1q! Un"#Z X^]==*`|<5w04v5JF8|?M{X.7I|$t=>?v㟑sQpP}'so~U[sjw.re6_z<8wg