summaryrefslogtreecommitdiff
path: root/meta
diff options
context:
space:
mode:
authorPaul Eggleton <paul.eggleton@linux.intel.com>2013-12-02 18:50:44 +0000
committerRichard Purdie <richard.purdie@linuxfoundation.org>2013-12-03 12:44:47 +0000
commitca86603607a69a17cc5540d69de0e242b33382d3 (patch)
treec1a2e0fa7d522098d677b164edaeae477f3d61e9 /meta
parentceba66859f87904066e67504a53fc8b07f4b1111 (diff)
downloadopenembedded-core-ca86603607a69a17cc5540d69de0e242b33382d3.tar.gz
openembedded-core-ca86603607a69a17cc5540d69de0e242b33382d3.tar.bz2
openembedded-core-ca86603607a69a17cc5540d69de0e242b33382d3.zip
classes/package: fix FILES_INFO serialisation in pkgdata
The FILES_INFO entry in each pkgdata file stores the list of files for each package. Make the following improvements to how this is stored: * Store paths as they would be seen on the target rather than erroneously including the full path to PKGDEST (which is specific to the build host the package was built on) * For simplicity when loading the data, store complete paths for each entry instead of trying to break off the first part and use it as the dict key * Record sizes for each file (as needed by Toaster) * Serialise the value explicitly using json rather than just passing it through str(). Fixes [YOCTO #5443]. Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta')
-rw-r--r--meta/classes/package.bbclass19
-rw-r--r--meta/classes/toaster.bbclass28
2 files changed, 14 insertions, 33 deletions
diff --git a/meta/classes/package.bbclass b/meta/classes/package.bbclass
index 48bb9828f5..cce2499122 100644
--- a/meta/classes/package.bbclass
+++ b/meta/classes/package.bbclass
@@ -1110,6 +1110,7 @@ PKGDESTWORK = "${WORKDIR}/pkgdata"
python emit_pkgdata() {
from glob import glob
+ import json
def write_if_exists(f, pkg, var):
def encode(str):
@@ -1173,22 +1174,20 @@ python emit_pkgdata() {
workdir = d.getVar('WORKDIR', True)
for pkg in packages.split():
- items = {}
- for files_list in pkgfiles[pkg]:
- item_name = os.path.basename(files_list)
- item_path = os.path.dirname(files_list)
- if item_path not in items:
- items[item_path] = []
- items[item_path].append(item_name)
- subdata_file = pkgdatadir + "/runtime/%s" % pkg
-
pkgval = d.getVar('PKG_%s' % pkg, True)
if pkgval is None:
pkgval = pkg
d.setVar('PKG_%s' % pkg, pkg)
- d.setVar('FILES_INFO', str(items))
+ pkgdestpkg = os.path.join(pkgdest, pkg)
+ files = {}
+ for f in pkgfiles[pkg]:
+ relpth = os.path.relpath(f, pkgdestpkg)
+ fstat = os.lstat(f)
+ files[os.sep + relpth] = fstat.st_size
+ d.setVar('FILES_INFO', json.dumps(files))
+ subdata_file = pkgdatadir + "/runtime/%s" % pkg
sf = open(subdata_file, 'w')
write_if_exists(sf, pkg, 'PN')
write_if_exists(sf, pkg, 'PV')
diff --git a/meta/classes/toaster.bbclass b/meta/classes/toaster.bbclass
index 7dbb3844d7..8dc1663165 100644
--- a/meta/classes/toaster.bbclass
+++ b/meta/classes/toaster.bbclass
@@ -39,8 +39,7 @@ python toaster_package_dumpdata() {
# scan and send data for each package
- import ast
- import fnmatch
+ import json
lpkgdata = {}
for pkg in packages.split():
@@ -54,28 +53,11 @@ python toaster_package_dumpdata() {
(n, v) = line.rstrip().split(":", 1)
if pkg in n:
n = n.replace("_" + pkg, "")
- lpkgdata[n] = v.strip()
- line = sf.readline()
- pkgsplitname = os.path.join(pkgdest, pkg)
- # replace FILES_INFO data with a dictionary of file name - file size
if n == 'FILES_INFO':
- filesizedata = {}
- val = v.strip().replace('\\\'', '\'')
- dictval = ast.literal_eval(val)
- for parent, dirlist in dictval.items():
- idx = parent.find(pkgsplitname)
- if idx > -1:
- parent = parent[idx+len(pkgsplitname):]
- else:
- bb.error("Invalid path while looking for file ", parent)
- for basename in dirlist:
- fullpath = os.path.join(parent, basename)
- try:
- filesizedata[fullpath] = os.stat(pkgsplitname + fullpath).st_size
- except OSError:
- # we may hit a symlink that is not pointing correctly over package-split
- filesizedata[fullpath] = 0
- lpkgdata[n] = filesizedata
+ lpkgdata[n] = json.loads(v)
+ else:
+ lpkgdata[n] = v.strip()
+ line = sf.readline()
# Fire an event containing the pkg data
bb.event.fire(bb.event.MetadataEvent("SinglePackageInfo", lpkgdata), d)
ޓ/t`И-(œT&3=ۡIUM^D9co_ Fzu PrAvoN"{p6B]m{/xcDV]Xݔ\]ƄZV3 qպs`TV1fwVƎ̷Yd ɀ^aԾNjh9p -.#:pqsTӆ/0mɁr0=WC}uG(ٯD$7D/r]+8tT `J޹_Ÿ6;2O[jy+['/EJ}i ̓J=h:,M; &}}O^ 7vy:1[z NA{+ hű4m "[L)*~kcSKٙsr fIً1 6VvhRܮ ;H-n}փK@F ĩz>j/tF ر]jnQ+ZTLF cU()݅\6 \~&Bd:8wT{2#j[+ؼM8x35RrHڒ"o@()5EG)I*zr;$Ql&Y/VW}}kQO=z'h')p"W2EfX34ӅYH@] |*0K  i~e>j`3q)YGV$2Οߚ) <2fiJ08=w3cNTƢ2hd;ϝOǔSUb6sq-qDn r?&íԁvT]=\%y3g^Qx 5c{bU7A{2/6&3`UdAuc顚w^6.މz=oZv@L+kqrƙ["8= KÍ|0 .BGkEadF-4-D$Dd(i)=8ū'OTSTۼ=cO7\ht}C6Bޚ/QiO /2?> 8?7RɡE<$N/XqGCoC3_ݵ(6W /EqP,,"D{" s\ `L\*7r/y?@Q))n Q@(P5E `cm9F9 R3ed/PcX̆8-6Z皙NvjZ{ ܞ(Ht'ShVǝ45hх97<ؾ@06:mj.N"#eLfJ@~OٱΙKe|%UįZjl+CaH&JvOͣɯ15/n<6m5(];5||Orm$1YqY(>H¦c>|`~tKP9 FhвNBz3P$PMݘqlEf(+傳, ?>ĥ YyDmÇ6erT6+ ~6Jz2E/3YvI ߟi,w0ݿ}3j#,+_*9Wv$E>Ba^p0_IE6RdLx P);J$ *4vQ;QW)aM7ECO0U@,\9P.n]lPb0NE2pXxx}>Wjz!WLmZRug[rBt4 ‡+4+.gJ[mmm#O|v5ZKpVqG\|JnU)>NMsM XW"{y|9QS 7%lNc7-C\Q}>yVx+4q_2pE "Hb륧{o}DӮ{ ;"<^p,|^L*š9OSl$O&7qJK{{ʇ 1lI:R"B2y({էHN*`:S,?UG0;TPr.ڈ.hl vV)0 z jeuO&".OЌ|c̴O"C"6S$[7I 4v4 `p>j{TXZĦ6ܣ4yi&ǿ7gbdp:4S.;?bͭ5mZFn V3T*;{_ |_+X[tD Ч; _ E\}i*P6 jSF ={/P6Qjdhx*#~+B3$.HRXN Nv0Ӝ:O`0H6k5`'gR%J Bwz{wJP{7gHXB*Y 7ké1ZTE)1u-KtL0^4e`a8Fl'bB,JOj^/NV-{\ :G%}PH}Nlhou+ gӲ%Q=wnO91ljPtV7@dH2O!۞VfHk(*LzVa$*8Uf$+i9v̽ˮNO#zX#V5=SjNf1ypX/y;Exƫpm30-1jv6>;\[q6(k6iq¨P'Uv; 4pXbR\>^Z;d;u "@[|66yi1tH%l1QO-=9Ard'{ٔjO=9E{Jα2QSr,A_?"[濪  6>}kc&W?ZRRew$>gH=Վ,/!YCyc6jW/lԒZ3T`fi}socv_~9g,wTtz~PM+f-RvCWۛ5)h[DЈ8U?5G/5l|y'sH1@_?U8!DD%2#DJStK\M gNB6/"BEHdӱn)*. TY=}+6Wy]e_H#I' pَj#$aH)VM^LY|b"4]ӣ{),f߼NQzg]S-΋)fѣ<A/NesC,U8K3[حṜ&xT>7 1ovo:k]h>Qnyޣ[ruϲ$'?q|dP|ߗ(kö́ %-Tah/ZH}feNPThSjᙩ5LH+@F y$B7B!<oa4/81}{#_Բ-xs}6__0ۆ6#L?C!|WetgARՕr|9p4;sl7cQMn|\*saNͮ%{ 1cF :¨ αg}r 9q L'_N=ad>sbxMȚk11b"s_'>JPɚveDɓpWF}ӛB/b(CPé1zR.zZblhz=8I^ t1?,[Gþ!{п`Mҷ{z]'FV2ܧU:bk2:JXy7~_iO7g St yOJ=&I}D7Y3+A 92=,n'߾D%,ѷ4kh/xK1OMU ꋺ@v.ZfIe; i"E#=A_(6OЌS;X5e,ܴ<?8 :jIvռ7 լP-ʓKF4p u\^jEff̄HbICu퟾Y/pKI|mT'T2*8(B's5s&L)nue.j #.DK*:8X!d@uwL0,@U\L04T?d7?t#1dtzBr| ڌ:me}()`:P٣#}cT8yvISG9r?)@M?|zfϵyTvf/ǼH% UvَgζȠJBؿ{NꃻXGC8ѳ5>Pӯ&T.ф?}#̓8|f8GuGӄuw@Ujo">:Aę%Lw;w*mF xDZp}!N~7WqB^5^~_oL(yI6R `(KK$r*iJ7S>^<m[@ H)ClʑR5TRK;sȊ`ȶy G fm죇gsQFuߺ4ɘuZ2$}E!&}$4^?2Z'DZPg$R5~ުPtc1FР⺹lu'375_#rC"r/H9L aA$I3ZӛIKK6¯E'Jtfʈ¥ό߇t(A!#L؄R,<_1}~>?v_#?odQ`Yk2(H2Hң>rP8۪W1+..A/f)zk:%Jy:~}28 8XOY@~~䪲7kJP$oNpa 6NPX ATiy{Zg.Qyf\ =?QI=RۙUv6T{:wL} S൛r~%Hz*xۑYEM]x"'WKYȆT^YK*4ܸ.P$WAVa.F9I:\U(dFsP2U]tob eхvXqaB5,Sa-L쟹%^M}T 9z_\b@T4:tOXnCAOWQgWäBc( gN ɘRs ͠0E"sd)zy9>3K&?.Jk>e}/y98W2ԩO>ɥ7BI ?tB5¶[>w덥~-i6cC@ )>|4iv,aBetSӀZH@y<0Ç/n 8.d'#qfY7|p}tQ3@\TOmR>7ńchQғ)%77,ݓUZ^_GtOrHy55X||)|Qphf,]~6 q,T_MY FH1p31@SnAŢ>M8^H| Rب_!!K7zM#e͕]4TA>$(:>ARJlc:cf*!@OShc(ygDǢ&8#&QQRG?w G#kAҀx `kmBcŕTP"jQ/"bH! _ۊmx1|PbuzdZήdT1["gpԋ:eBU0 [{钡<s$IUS[/jжj6i 9nfWYӂ+LEj:0cw'z|A :^d-'d:[A9p@rԓid4*~Mt᠊QcIZ#PV1bXPU`F@dae ㆻbqlS$8H>=5fҭ^,%ɡ#An11I8L{"0$x[P}y׬$hLRA'e L1{ ]/uH'^"A%Po%sUQ2 ϶ `0R* .cf^2{uw_Ӱ1z24陪-H4逌^.m\GKc7."!uJ-[L>k_ Ϣ}=VC :(pX~D3z4V+ Op4VOnEj$4Tvr;MWMNK#T PM;VbJ1ɜXȀYq:i!"x6sKSQ1Q^_ЗDݻJ'F֘8)}}ڀs4^½0Ĥ(L*Uq Ugۆݠ sxPBQx:A_|ޑ|xe_ WQbId iʛ,ˉSLr.e)lHe 4= KU~ cbAd΅|<=a|C/\6c%*W)n SKV <*مrfD6E'zNi.hz6cӤ]jӏeV̴>3 Ĺ^tǖfQJ0Vd*R,ñT2imӐy.El{(վ5TqUEyʍ<ĩ0R%oOws_CY4Rʆ_ (';H4LB904{߽ܚog ^$pry0RD9FZ4;}]\O^4i\x5KŖSm򚼪z }>6Zvt.aEJQ  c#5q a|b, PTؖJ#rNWZ胫 |HY_sBk0A樧U)%P6wWT@kNڭPxh\䴉AZ^}FVC@ {D4hBT<MF, h)k%۶ʼn!a}/񇹠#*Ĉ"+(DDbT"Lbe5P:(D"&WI8|#3H{*MOl 2AvtSy{[zT{_I% v v3 4tì|y<[#:SC.R ;l196n!Zbg0g cOe=X4bsAOC:^7g*ɂ,PAZ@̈ (䄄Y L3mɷ!2:t!}(vt>k/ O}˴*rh%OZȿ}yYPěZs:m_R_m{u3$솭K6LLKvv͖{j]rῶӉN-Q&QI9zh|_zm PHp?u;߇:lUjQI3]8p:V/C_&|߇=9ݾxD|)C;fڱNw;eB! >*F8-vm$b})93=Yk9&yPm)SQӋGҀ!h7}'sgrZz5,%@;Caz}Gd̡FH/6pDE߲EQA٨ҥ1ns37}“ &t В9F-aq $+'!t2Mj~YtF(xA仓4Z~n<*ڕwt^=BYTSei%b" ozasSG22 zcѮs$o݈3鲞i[,`Cɛ=`DFhp:r x~6R^}B\1Dз]TANP6S:H~ŐwpnMemG"Ea*gUr'gtȹ0g&%i;~W~$?]sbte3%DJ%S2G?{z~?,Qx[5:e܂qe%O(w) ԫՠ_%3ڑAŪ1ЪS&>xlH@le3NO+ƷTמt:!s2i|rh>OS/A'Nʙ-H5eݹM$_b3&\k@CVf..ʝ}x}#'vˤ:Oک>@D(8p1ކ{ S;Pjt8?j3 ^aPvp8+l+$TЇ350Fmq.oP;=!`~L _ll3nu5[;m;EV>T }絕C}/Șt`x `O / `z31yfRj阙 "@̠7D%?oЧB!#6"tRaק~L{oz}p><"e1 N^rQQ1DF]Pϋ" |.$%`&b'%b*GyWKrI{KPSx(H2jg#Mߙ2gs3>;(fZ*$#Y hӐzN[>{!%3ߎ9Nn?} G/SCG/-/`,>fAʩ/ <*0DmjO~-@|Bȭd{:9o=%p 8 0t)+|4wř( X#A?w>+:=? B`PP~P?P4Ψ.,izWa4ܒx/K>[gk(wȱMC rU06bf>'e0֙C^[OQk͗ 7zGB0mlikƳ@B:?W ?Bvd>A>L 0<}y$ PS4T=d<"?$沯e40Ai^A!ϯqv'_Lj'C"E ☄a(:6ķi6*.H/|=UІ xuޮwbRKz s.;o$$CAUA"" a{p? J[(A$`)'p>P>WB6ʵ[;D8-e~ȍ6 .0AFG!o&) V8z,ߗ+IJaq |t!Dt@vbӂ=-vO.!KN! #hmv#DA@A @1+f9߳wql9 2WǏHP@F2~wӞ? ٬Ƅc`>b_?ꯓ<x t\X2vQ kφjVOU4/1 uy~KkOyA,#̞e8j 3;g~O3PALtWBvX,M &(RJsB6uoD]tcʥѨ@rq"ݖ4(?ڸ͇ r!ڍ_eb"6ܨPE ZPGԚx=C\|7f<\p u$;Q?4r!LV7 c { ]>πg9Ǩ6'S8DK% MPL_+LB>7GqxQ훚6_Q.LL&I%>||zQ&#q`?ي/b\?t;N۵˒ q >~пm/oy$ʯDU!/iM_1F!(PPBJk/ҨJdMUɘs)=E`eGo"@^ʹy[avfV\@qQp=PWÐ*,0%hN_3+Mwgk<e@X*zϫPKjj6Yb}樞KV)5"IL {RK.(@Le;sRAw(dd߀iϟe I?pe| N}}T_3J6#BOO?mcqy߅p@"y ғC ? `vς HFĮCa"H띘n_Rh9gF*]JU׌ػ}GfX)[ Ù.owbaIU+)鴞Ǘo.axNc/TRM.p8R<ՠtMD@P^r_0^Zjd$&*Zd@xT_(_y L_z\r5Rkd &ig1H֕3vdb2iQ!x(ѦC'ɚy HTJwn&emi+*4BRm_ϧ ͟+(%U?᢮R`2d]jM{Wt9=]|W]E:$:ч>5E_{ULys/k/>[ҿY ׈.J`dO=s>=n(nO%"8tT8R/}TOkE1^ɺsܝӍ?uɋ^S'oG4˹@5*9S#651iJ*S\aQã3I‚Dӿr ?=c*㛺N,Ve:| C4,/[{sRcjQ=C?hnź# o/. )*+?wï'?mr  :^-%ҜgAQ?luaI3zD{ۓ>߄=K ”i1Q>ұ+hBd2J$4\"ě:X|"w/>|9H@BN@dn{j'ư_g"~^Wq WJMrJl2a|~M_5B9^/3>dIN9=0/罞v 2o߼cC_7YKm۷Nb` KAqnjjuq G7 b3oߓRt`OtGתHR^0ۤE˘zVm&zag-RM$Ii dqFαGɊ>db}A|+߲'`<)dw;vIOeRj؟9,%S͉m1I1{,BT#wu3g=8Bcqj-M㳏qSN5E6cnF٧~ߥB]i4MqI7Ckoy?)"P< )X!o3-KA10zP(!yHO yX!byM^re^/-,)),B pm03Y*y ڜ`ed Po*x6-~Ƃ?GWҳ#G=4~Wŏ4q?ʛ;lwy*,-8R [ujeOgLA;S?7l< GvÀI{;Wx#ms?hPNʴ$դvFqmr\1iT%m}ic;-l),_Ϋ7it/hG<'Je%-:i鎕kܾ _p@?@ns7~/m`U|MLݿ6eU̢ w X^)׎vgc >kAk8?:OICJň!' :MZ3^x/WS@]߷խ?-w;l(l@RoPD~ʋ{xqsF`VlԨLtO,,A#w2#&:&ݨyqy4u:\RPk:#mWwX^*rS1 qAA}awkS:Nv6WXTY+7אh*R\u?3x}v|[-Ãi{T^]zށ &EzCZ{m|GǾ2pgf,ԩMzQtj|J?1V[ClP]j ZB/"ħy| +i_$<)GR2.<'x€AHHx46W Ijyg_ib쟪IDzpVĘ%a(^dFq'4RIDZаZ"cxg̯"Я:1Woo(+~Swv[>(Mp)#R~'osRbj9P gd9 % 6XD6yzdj0byr::PvӖX׳{&Y$ fUReU ?ԥ{siaVܾiTjtyvWo6M@c%YSD>hI]]+%AX9RcaYX.PUD"E F>"n[:1[4)"73 ](19 %1@%yA ).C-<RB/)29fcpMHnO=µZՎC yܠX7G3o5N*Io15Kqx\\xWV:?'p@>ugJIɷ 0YLV\mj[v5Hdvˡ⬋6 #yR53 ʱjDEjTv,~[<+JgisFIUASL\ ::!K#$L46ܯO7w;'oӫN޿]>:~d2 BnԘ&[;klT@#)gqhU``b\@7MWXpuwt{`v2& p~|ߟ`vmu*+N8?he&絽*[L['g>NR5viIDYGOLDD_(WvKMlknӽ{MJvy }s"D[bA(9xJ gܰ&w!Dl i:j)1^Ԩ=OY*TQIVapiE`9JH_k'c{]T1Oa1J6@wܾfm yEp7{0 |W)F W?m"1Up4wff=yv]o9doȷ9;N rR9E-^ugkkm&M;=9}(ؤ=/去BkcːJ&PQi<Jmh-_0X#-#KH *yKy*#wRWZ2&U./I:9eoTq!H1-N`FFPAz%=IGI+ R{`QE2,?/@5NIT%ҁkixX\7ml")~= Qlqw=ry^ Ů=}F<SR<"* y]D_e 6kO}g:*ޅmyLi[wRX.gtekn˱Vم;!:~#{h_,q -KWc] >$V/Eg Q|;<961EQM 0DQdP̽Fe'uBmhi/Wt͵Rp_8IF Ɨҝ}1OHЃ 2/ 9oKXԠ~e=:YL.+ec >^ΥDe[vttgю& &bt9&_!2r|L\Qo|s)6Kͣxxs,D/71^`vÅq8|N=Sb rF2`Y9"! R]f;QT~8׌`R&B tB'~͓DR`f'5XKTx[}ݫxYo`!>|¶c2OX>3o"~m/kb0hLjM{[ߺV1no2+=oxnz07$$oqE|f8vէRk07W@x̫t ďԤn.]AUi7L:9Q~QNt{]S[^r $]0B0[+ f: ~ %6ꘜ?tAfm8fI}¯kƆڗ 7H"VB1a`@P~t¶):rBERK V&[b2#DN ̦ nSe[FK `x%.WO7="{ddYlo @/`E_cA"xO$)ck. E0JRd~qwg:o˦f9R[?ʪkFl]y 'taj`wn4Ļ=r2Gc AAHD`XB$DaH DdH b@a1X+AX EDBB+EAV  ,TEP EE@@$THDH1$ D;?@㠫?!袇WiPCAdX@ RYUA U=}JxMwSe+2%"U}]%I֯~JJ۴5Uo^4=-H˄e5"_ӞpDnuga&f +2i{譝J.urQ*CMzRJ}IK#?YVR =u޴D=>C02tV Jm'Iȣ ze"GIK>ǖ>^uwmǢ"A U˱ٺPez cYxefreLu /mGNpui'9mmfppQ.K\]Ey 94ȤDKk_Շqkwqq5uSPP^DTWp ޾7[m=#`d =utOkOviOtwQPx"%uQU^L<AR؝vLDQE⡬0I' qk#Q60 @ H(mA>B` CP"[B@ c Pm5PC¤>8(T4$","(HS>wSI?X?m|y9P\Qx P**TAQ* """ UUd@2j@@8D"\VCa rJ D ˭"&H98@AFDU*V9ΊAdQPJ"$"1 $J/Z~Ұ,M7#3PǸH?nΕ ܲY)q!C~Hʕ[1>B v`^~;a5<6J ‹Pd+I ғ'zoR"Cє$ hKHQhp$FTwY,JI%B}ܵvaL |qd(8*#;ugz ADO-!F̌'JX,T :q"A.Y?)fo'9xi~=l POZ1eW#}w;daN_>oCim0 N=JAkWO?4 4 V 쟫Bl2ބX#V-@PX +|F΄YY M+`3ɐ1$ ˠbtaho c=ud3az'•V ;`b`_0V#$) TAS+N D>;y PY鎁vˆ͒ͶzoS9&+bD;4Tjf k i:~@x}aO3$;Pu Ce˒ @}?|#M{_}: @QHxZ<瞆Og=qBJKrЅLUL^oz,rK҂Pv=*?<}!*5/9؉4:zI9"f' xcM6{E$BDATUE F0$X$XdR 0c ) )gq`vd*S!.$;a 5f,ܒ?|պW;j``v>r>frܴٓNiͯ(@ن |1%;{à!w_0p >lF'sü2 J!%Ҵ ZI;wwi 1|#j7}6ou\<h;dݰmӛ\2D|^g7o"L>O7I,1e[3W'bA&ٔ3r@zZa~.~՞„o'Z߰(^ޗ("ƞaDf;>Nn)ٽbhy>YXrH#/w'tj}!Af(^T xDIS ou1aa1?mS鐓?12O:qY+4qc/XK$e`ߣ{F?nh~0M/ۯ 9Apx"`ȢA4]C-9Mpp\[Y(ZQ2$q, Qp@tOY_ 8 DGRyP'[ 6v~ ֈ ! M׉Ub.uk'C iUY@uK!Dyz :οc4Wm9}rY@& \Fx"MX{{]2[a^ o d On9>z:Pt3v$4}2>ز=3as]jAEY"4pI٦6/nq}Q8sZђC_@hZ<_~+KnX:UXa|H|lp"ߩ67 ӛ+ZIDrz:[8UN u A*;_>!WwbVۅR9Gx@: :t/C)IJic{RO0lC$ +?G`3HFĮrnU?;GPࡿHYr(7A)j( PUpm]*XHpsȋYNƫs΋x߲͞tyhk%dG,UR/yZ FǛ(9ꂑdTRu-WnGG^vwos!dsM?qTJ$3DiKE2(%dgJn;xww 1H!FZbkHg<~ 9u?Qsk,$EpUrNš=QRPJU(8ßd:a4st;ŊcD@@_Sqw P D$R$2+ ANSÿ'Wͣ@N%r>;PEl1Œ/NC<92Yۗ9b |Ўèz9iP=.OѰ^koguMfRB %{ z֘T]C1_J0٨Z1ؑl}݅S_fHve iAqz'wWYrd<}:qYNaEN I*`)BMNg;QSdbMgI:6-:n`-|_aYIŠղ-)2eE#EnEwz`@ݖL KN~QMdaBS}MPw, XΫb+ SB',5١! :1tFH+wVq9Fs;n,>.<w*B8|+ 9%H_*Tn XqԚs;n07*(T"L ]@9YnciMLNYh1NB:A"kse}D0( JAbtFLH κ)fMǭA IЍ x n,@ 73P'VC= h` H҆i^/esU21`xp*GLNaJY;xInʳ wkhv/>oN+NKfh:g7=7ZR0XLK6ah `q r { X=t[z»Ά%$ƕ`M*<ѧ;2@ 6 C -h&ВԦ%>Ckutr]5p {崂)utY̘ p!K"zDVEDFx(YHGdW߽Ǡc `zbNب T4h<`k#뇞r⍽&5PwYtݑ>(Ln!@l3d $t rgˣ(y9=7椓Q"@*y8~)x{BLJ6mie܎©U<.#* r/B-(bH='6A#ʄ_.nL Ha!YD<}'gm;|Q^*g.cD,( &q֌%^cI;dI*g[KSYj&D]}J Qe :>JOxa&L6ݵn؝O" A7zY{cNdK}E8|.7GqOY93U7O8{|,x>g@p;xfFH*LHE-~}V93j&>>^Oe@DҵW=3 C)9 ~V#p,`j#LmDQ6e|n"ңPh+@#}qXW <]9M<}j;FC'awZ{jl=l {=Ǭ7(o2|ގ 650] @r̜P\t$2Pl}Ɗ8Ssv`c7 }ڧ$-%A QrxytP9Rooov*hG`, "i( Pqya<@ J O,~8Sx`ufӄ I:U d8qՖ0`0d@*D]Dt75HQ7p3 q(:zv88[ZCa=;ſuir.;ys"f+oM 75yûAFwYL*}YW D•B (AEa ׵ XIGeM v"\Sw'-AQ<+nBD"UlUC7~.pfk<*rx~vq@rnvUjBgpF $DJz}Z΃ |`Ozb}8ɐR67l[Nymu`^YU@d (b`,EdEFss1J ސޅ,J ,`,P2b΀ذl3fW^usЯ<~ =i%&d|}܎K~AFvPs=j4Z!ϡ^o@$Aގu3 ]m 3;|}d iǼyA.<8cB 4O MY}mok2{$%S>PxdקX'_.N1TWk~$(=eר׸uqHbI Ww0VI7YCszq#FƬ%ϯ[XA4ܒ]5^)3dv+B  0FB7/1sa47} \57[|7Faonx̘w.ٷ2$ Jnf Ի dL*|~XhAB*ow@Cl-9Z㗁 R7>SCWm}{t`( & {=} N5ȗu*T/:a}*iK)Tv~K46V[jT;YR%3YD+`m9* b P{8IvVDsxB|tMjB}, Y c4LCwfK> y SQ(QzPe+{Al?OurIśR4[~&̷2ɾĔ%+C‘S1<\λum.1U78qWǞRfH&Թ}JdbjZfiy!)e*.%Rꬪq;2[hi+64LJ%c~yz߹9׭ Bӹǚ+~ (4_Ӌ\%t44wL.bB6sϟFZz YҒU\gX X#4BY* W>ݞqgHws "k:㪆/i < PJGڍqP>s>HҴu!ΰ'Iy:+ZYC#j 6]nM-ƎR/ru3;Etsuo[N'g Y^a5g kHbL ,JP:5}MF}F<ԏzyT\sfOC5Z{JTIB$Ylޡ灓옊^rtqf<s<`+GI^HhTؔyVةb2zMW0E'8XOA8> ܃a{Ii&&|$/+]/:8-}GUl;/[hqN @Աں'ju^P+97| 3dse.{&7,% :C^O.bs<ΓVBtQw?Z 3k8baX:A!< jp_|BBJũbf"EVZYThŅG#u`XTٛQ~v|tN"rCx ܸr@f]"zY]s)3r褡@Ǭ.c 0p5 !+ 5BNr[5 0VwSr&wjGvW Zm/vC~saݣv$vaK?7'_X<Y,\R% J8a$|a55J\k^;PP8 B]/ԮE*~__83=K9i} 9&f@КAĪfKj@|5x=62SQK@*CWҙI^p ?ojL؏=F:|9IwjB.E8V;8j&DU^ϗTO^52 pN]1gN(t`r$"D(!} ,<3 o_#@4iz ,*=p"c}ͽTf[q@IJ$uh Q?=F}pJL9P9)Xу f1^5Y[ɜm6. ;Audn /! %xzbdl 0Le&SirpJu7{끻BC~U %F7*eXsW lJ.qFJ~'QadUsQB.9Vˏ*PVqFQj!eK+jg<ܘe}A~<PF@%N ?#%ص֤A\ eQbzf;8>-JtUVC]+Bʬ*J.B;f:9DzUBX5M~}pՖOmBQB?~ZGM!>)\0ͯ81+]PemӞ|B<(VT,LEF x?9ZZVE%?dH\ɿ,@4}_F޼%mF֙Vs8ll'Pj#4RmczV nX y=p{#R'Y{Ep~`pT% ZkNDiWݴHQ2 '^/@2)2^~GNt7M!@+>S@ёEkq `@"H?zT4=lyPqS͔o>ItO:e~{WP![xY`" 2 Lc -T3q}|jǤ{{o@h3ykK%kSGM r6o&efQCɲ.sx!f!Ʌnl*ⳁ6:-gU2X5^rlOS6 B&GhV1D@.HB &B h a2\<!QfS 6P1<=G#gg±HO83R"v1(-I=q8йXVDu" &F0)M!0NTTZ1$%:&Z{ 3udz=S Qe5NN"dc8PvZ@'r TFHwr{%c]:?sT`kBxO41N}ryoo*x^AYrO\W0cQrϪup^lvP˵c.\};?lC#(A>1"L?#%ppz,dmr90\zA>eDT#1H$(2"I;~C&UwC8pQϟ]ץ'4qi6j #(׳ ;r fn׶_;74$E}(b Ş̝H, *d= B_UT01sv׹#J-eCUM<6}QvUgþ#B{7SEԌTлw:"ONjXP2ظA6}r8GԐ_rǭLڹ12:jH/ ,ă )J5:kWAs 7ҵ zr1CJCQNizGbX TD:Hc$YNa&VX{4_WO3Iqy.3#ЮpF`1HOI}`p]?zEρd+r mت@!kc:%ao~V=jAY3;Ɔ7eXuHM .V(QDBً9hj1r\;"]'f MU~@ a$9D44z]]sg h+ady70 m*5E ^L{d:>yL&w&~1*(P 78ppK5j>=b{wd̥$3tFʙڈ;$su3.BI<ƀuӄN#Q6΂oMX|g(TItF~:ơ?vx>|eJe3h3^MJApok"+>8!z\JIB)L%ZSg74VKC`q(9KD:xK.[򲟊%\vp6Z~6{+(GRtM|]kc׻ɥsz{wnwu^|Fi}wu@|UOvJ7ɁjUO(zXXx72.zn8e7N{沺0)`FGژ^Gt/DE]7_,quh f4TBSλ%3wi#2^E*SG("9K)V_;W2/se#ptW L#>%۔f5xf@8,l=eI4R0؆ 3Y' =*qayQ*nS"ҴPU>s~o&/˨(Q1R )-J¨8T+4j2YrjDkq?@auwa"@]+e&PB<(aȅCBc~; uܣ$/Mjo6kv\^:np6~nοi|Sz ece{5#)(DJda S,0zVbc//30.j\Ą]aloʄ@p8"ѴIB޳?+$YyGFy4hDX̅>y}ë\赼$~9ʳYXeeW ${L2cRnXs}RI#BO҅"U3:P;j\[nMÐ+NpR}x&B*dr!G:sj?%{B??`h,G]ݫ+ cA.'r{g:}c#U;iIyYtG5] HPl{Ύ+N83# N9xXXa{݈tmpWVa8Ks}0P@K|Vik> ,^+#ŜBP(H:]G/oA.*2^m~I̺dͳ9"a`Sa:6Z$F^H(^S$ӑ#=}Ł+<3"P=D1`ILNIFZ^3GwwM;epOM!A@~Q#3gl]yF_c{^mn3Tȅi]꼺%LFZ&ZQ} 2~ Qr[G~<ݸPj>PR$a VO3A_afrZykBEi :aP9,@WfDH D(>5e rAYvp$PLR}K/]+{38"W<7X^5*'P@'_(M8|Q8qQa=,K"pjgR* 513agYZJ̀:_X6ͫ-]n=q*aqθ:uYS5e+f49zΒM.=csX{C 'rjY-fs%#u*R_;$e0kԇfg?sqBBۓ4U~3[]o{jcF# sz؃5L8,u`LGv]7u]AhWgj86hqv*حBaަ# JX3E|}q+%5{9yi@"RrCS6,]7e$LAp-8ZXuqZ0Rx; g;}zֲ©*p)[N)09qL2-3ohzB(RT)P=؈2Һ>$!)4TZ$`e)Rgt6z&/X;`Lj;rR-/QGkbX{nSQ`p3(7=`(nb$Hn ٌ|%Ta΃*/|g ս¨IFLZ4Wy2~!P#_?3EyZ_ṁû8Nd<]$dCcƴ7x"ZK4!$hW_D%"f)r)&R y8Qis0*B+` :d36;@wE$Xw]m$~[RQA@P`hWEtliT(IAg;́ S>Y&JPt;#P1 ,k\2OnokFS2NxBbwl)Kz5iQuĭ *qf޾._}w(erj8ӦFOH ! $95`hUqIv$۫1ç8'χBMqD &0~֌TSUNDN47Ww`<}DN?jOPJDlدzVۜ #! }l5O%~a3QnP3L%KCrGkaSLjS295\yr͙27qW_%m @  )KA!s3RѬip nHxe%*}uyzAfBʕ}˳sTRӉS᯼ãtwԪQt "D0eC 9yG؉lD([W}1܂$r倹N1I*Гfb3|H&vD>\l"D%JC_c hs-&P@hV11qi15DVL? XQz 4|]:H=TVGd@l&8V $9Xœ%eJ a~Ϋ`ةZfR\[Òn>ADbWJE3F򽏻"/.䂒>0Q P"h𤏄dfHJ_(4>ɋ`^<}Z╫ȋ{a@RafaNk$!Dg&(k8aME#'. di5b3C 0 hd*LԨ|IP[TK rz0F<nd}ܲ}KS%VZ3X7Ftʸf,lD$?*e }nA+=G.Y 0 r hL& B(Z^BGO{{iA [0"Vx8xHf,@w d޻hkGPߚaQdo绁08 w Q,)}> pq$ދ尌\̈}RFI 6| lZiH}4d];޾?YJZ]X$zNj4nUn6bME5^;>HFyד*K4yG+&: &;1Œ5u0 "U}bM<6'pVX0BB: P:e%$1`>'kFH"]sajeL(adt?W؁YZ熍$ ZnDfU rPDudP5Zo W,DQ5)6n)0Ц(>'4N2\qm=}yO9>o#+>m˱7cpϕߓRq֪|f4UR%ғDU)ypIKDTcf[[(G|:di% )EE1 r'r ^@@~ƆVTs 1(} UG!2ݬ< E_Iڧ?}a5ŬyTd2FM๔yUAFYhPLN+/W-tոݸ>ZF0")4Q 10?:*cgG5> xuS~Z렕]C0DQvȠC1[5SↅyHIQ d =t|rѯ,8k)hqv]jzuY|ɸp$N0n=Z6^TAZBX@S P`LfvLŹʄ<ø2!+B6þBu۽E*Wv£ά5FĮ}^(Oma}(iM4Y10aF6=֏ $\'څ2s%$֯:ބRM^ihI%8GmlFg4{DZwgZ(ܬDm<>P,P0[Z) sYՌmi0{,Ml\=Uh # zO}i8aĊxϤvE#*+ `|pf\h~%1EwJ}u$ XDczZ|bD0Jp Eg8=9gg1[,`1! 6 ]"r}K-Fv |ɍÀ x.l{FٵQyB´O ?#j& nZvy&AJQsM a>zN~d6yqQ^BNl cBz~$Ty`v1Lcs#f3WXTd._8 MV'y8nn!2(23|-fF@X$ K-a &`ũҧ>g=V]-m~qEGix-EHYM(Y}g ;Čާ2;y~nt3*}[!hj!H y ȁd*I 'J5ܦʩ=Nd :(c2pcr2+RT@i]B"" {5ʯrP FAD}EM 1Z)vjF//JZ:MIށtU>( F glCpWKm6TG>C ÁϺg2dP!Q&iVcXa'ĒhŤٚL2LQ##TdI3暰2õ#4mOp϶VRJ lC;pUtðɤ50d&jm^q 1Z# ?4MMKRc(a()GIP!H ܎"]95 -옊qtPN$ݹ:m$jȢ;/hnId-d'6K0Qw^ޡ*=պ Q@eg8Gۯg>] ɗ, V: !R#gHL[oTZNZ`nh&s߿,;$8 Qjt}nJ!PQb=ճa̓V7+~Vy0SS#)x k]IsovRrWލXK S)ii<ĺHlHUԩ*jU [ȳmOgGzw%GD#?7DOE P%#yOpYxҍܭW Q8AvIBV;g CT j.(^*==օ;((q99Yf+uR?8[H]v.n3z a=G%BDSy)G߿թsjAJ py@bY'au䇀0L<촤OOR5;ezVxtOVMP-&:j~૥'lyLjyl +vJe5๚N-၏uaSPVaŨcgP='Qs1j.5@%\X>, W0P )&%%.o@QZDk:"vx Id&f"H/ʧtYp  zdži1z)Bdc!m0aVȦm}5>fcDR<()yR eWQϳ挮=}Âq!?*$h=n( $ݜxo6*&'&7-A}R(4]m3 W:ekJrExD[a=S}Vh(0[bpYL-x'puPB@@*=do\ R|*e3t A$ca2L5 l:YEE})i2znu:Mzu{B6Psë(hUwy;\EG L%t@a @=_?~wAyss'VW\#uA?a0λW,4pU_+xCHD2o+) N"K 'o~=:l6=)e]S45$e:)RF{.vQ&*8e[vAe D9OMilBmPV.XGi8E 3YhЍ q?$r؂yu 6"R”}ܒꢂR@m,V =NSR]fCmXq>5paXH1yUB4(36o|dAx8Is+!&AU7:ӗ`*BlgJzx)'@tEkϫ(5!YŽ Ҫ,wVFdx4I p]exi@jQW3t1ɪjYm59:|;WJ4ƂWLwPE@ePFW -6-OIU(֌E J`|%I#ή$t ߮ĵ]Ir8h*1jr&\#JYgVQw,t{h3Q@d$%[fIo쵒,]QS\ .Nu,ȋLS2S uCRx- Ynht#F֫0l9M[[ڳIwxmByOv{=o;[M]_n^Xu^D6lǯ~Kn ,G\+d2XԴ(0{̜G/-Z. S{pm'bZ\$-AX4N9i ;޽sݚr I+^Ҕ ώ 1pkњ(