python3-pure-eval-0.2.2-1.oe24090>    f깤 ;G|`u`  07+=]Pa>saB'>a֬ 'V .\8xMJɉ@St2OzG݃lD]2i/$b;}DM Ȗnc6^hd㱢8(ɭQ@ Ap|(Mt+?V:cJWZ8w3"B=)?)d # Rx| T     tnPh( 8 $9 (: XF qG H I!XX!tY!\!]"^$Wb%Ud&We&\f&_l&at&|u&v'Dw'x(Ly(z() )))X)\Cpython3-pure-eval0.2.21.oe2409Safely evaluate AST nodes without side effects [![Build Status](https://travis-ci.org/alexmojaki/pure_eval.svg?branch=master)](https://travis-ci.org/alexmojaki/pure_eval) [![Coverage Status](https://coveralls.io/repos/github/alexmojaki/pure_eval/badge.svg?branch=master)](https://coveralls.io/github/alexmojaki/pure_eval?branch=master) [![Supports Python versions 3.5+](https://img.shields.io/pypi/pyversions/pure_eval.svg)](https://pypi.python.org/pypi/pure_eval) This is a Python package that lets you safely evaluate certain AST nodes without triggering arbitrary code that may have unwanted side effects. It can be installed from PyPI: pip install pure_eval To demonstrate usage, suppose we have an object defined as follows: ```python class Rectangle: def __init__(self, width, height): self.width = width self.height = height @property def area(self): print("Calculating area...") return self.width * self.height rect = Rectangle(3, 5) ``` Given the `rect` object, we want to evaluate whatever expressions we can in this source code: ```python source = "(rect.width, rect.height, rect.area)" ``` This library works with the AST, so let's parse the source code and peek inside: ```python import ast tree = ast.parse(source) the_tuple = tree.body[0].value for node in the_tuple.elts: print(ast.dump(node)) ``` Output: ```python Attribute(value=Name(id='rect', ctx=Load()), attr='width', ctx=Load()) Attribute(value=Name(id='rect', ctx=Load()), attr='height', ctx=Load()) Attribute(value=Name(id='rect', ctx=Load()), attr='area', ctx=Load()) ``` Now to actually use the library. First construct an Evaluator: ```python from pure_eval import Evaluator evaluator = Evaluator({"rect": rect}) ``` The argument to `Evaluator` should be a mapping from variable names to their values. Or if you have access to the stack frame where `rect` is defined, you can instead use: ```python evaluator = Evaluator.from_frame(frame) ``` Now to evaluate some nodes, using `evaluator[node]`: ```python print("rect.width:", evaluator[the_tuple.elts[0]]) print("rect:", evaluator[the_tuple.elts[0].value]) ``` Output: ``` rect.width: 3 rect: <__main__.Rectangle object at 0x105b0dd30> ``` OK, but you could have done the same thing with `eval`. The useful part is that it will refuse to evaluate the property `rect.area` because that would trigger unknown code. If we try, it'll raise a `CannotEval` exception. ```python from pure_eval import CannotEval try: print("rect.area:", evaluator[the_tuple.elts[2]]) # fails except CannotEval as e: print(e) # prints CannotEval ``` To find all the expressions that can be evaluated in a tree: ```python for node, value in evaluator.find_expressions(tree): print(ast.dump(node), value) ``` Output: ```python Attribute(value=Name(id='rect', ctx=Load()), attr='width', ctx=Load()) 3 Attribute(value=Name(id='rect', ctx=Load()), attr='height', ctx=Load()) 5 Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30> Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30> Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30> ``` Note that this includes `rect` three times, once for each appearance in the source code. Since all these nodes are equivalent, we can group them together: ```python from pure_eval import group_expressions for nodes, values in group_expressions(evaluator.find_expressions(tree)): print(len(nodes), "nodes with value:", values) ``` Output: ``` 1 nodes with value: 3 1 nodes with value: 5 3 nodes with value: <__main__.Rectangle object at 0x10d374d30> ``` If we want to list all the expressions in a tree, we may want to filter out certain expressions whose values are obvious. For example, suppose we have a function `foo`: ```python def foo(): pass ``` If we refer to `foo` by its name as usual, then that's not interesting: ```python from pure_eval import is_expression_interesting node = ast.parse('foo').body[0].value print(ast.dump(node)) print(is_expression_interesting(node, foo)) ``` Output: ```python Name(id='foo', ctx=Load()) False ``` But if we refer to it by a different name, then it's interesting: ```python node = ast.parse('bar').body[0].value print(ast.dump(node)) print(is_expression_interesting(node, foo)) ``` Output: ```python Name(id='bar', ctx=Load()) True ``` In general `is_expression_interesting` returns False for the following values: - Literals (e.g. `123`, `'abc'`, `[1, 2, 3]`, `{'a': (), 'b': ([1, 2], [3])}`) - Variables or attributes whose name is equal to the value's `__name__`, such as `foo` above or `self.foo` if it was a method. - Builtins (e.g. `len`) referred to by their usual name. To make things easier, you can combine finding expressions, grouping them, and filtering out the obvious ones with: ```python evaluator.interesting_expressions_grouped(root) ``` To get the source code of an AST node, I recommend [asttokens](https://github.com/gristlabs/asttokens). Here's a complete example that brings it all together: ```python from asttokens import ASTTokens from pure_eval import Evaluator source = """ x = 1 d = {x: 2} y = d[x] """ names = {} exec(source, names) atok = ASTTokens(source, parse=True) for nodes, value in Evaluator(names).interesting_expressions_grouped(atok.tree): print(atok.get_text(nodes[0]), "=", value) ``` Output: ```python x = 1 d = {1: 2} y = 2 d[x] = 2 ```f깞dc-64g.compass-ciMIThttp://openeuler.orgUnspecifiedhttp://github.com/alexmojaki/pure_evallinuxnoarchl;( ))[\kk##;D?AA큤f깡f깣f깠f깠f깠f깠f깠f깠f깠_f깠f깠f깠f깠f깠f깠f깠f깠f깠f깠a%n_a!a%nf깞e3a07830a215c547613b16a8bce6d7df01b6cbd6854cd8191a1c37af1264a6ce989e5ad475591fab5b433aa33e99e92b94da895601016c79d0c1a01e100c0d0c5aa2f4a240d2a1c123d48b7ad89409e2bf5fc8d2d5208e10d6113557951e5ed377bad3f8dbf3432661fb8fde64a9688fb3022814309b9666b08bb2fb57c1019a01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546bc6bc884df8f8627031df19665d7037d3e2e0ce4e078a59378ca59a8ddded08b56a3db8bf3c37c1cdd7b0bdd0d2c1e27485fa37b4da562103af547f47841b823a7a93f5696ef3da1601d05b42ff1df0d401659e14a09f85159116a616555f5ddeab130c1950af9772ad92b02586d5e3e93b6cd21e7bae37a935b7489ef7b0427aab130c1950af9772ad92b02586d5e3e93b6cd21e7bae37a935b7489ef7b0427a822e816e3e60732a8ab40fdf152d1c4fd31ad98c895e4f25a44d825fca42bd0386dba947781d909bac8fbed596a88c943af160d561e029080707b9823d623b9447a8fb44dff321945d3606e5982dd4ac457c49fdf99922ab81e2b429d5881d7e47a8fb44dff321945d3606e5982dd4ac457c49fdf99922ab81e2b429d5881d7e51311f0989bad1ce28b0b02f91e6353ad25814962af4c700b06d646678003abb6a9917aac988dff659d21259e3b72a35e19f988bbaaa0541e85e8fad894b5ea4b68b3572d44c82eaf9bcebf683f8967979bfba4634ab3d0396ff4ab447e8e147b68b3572d44c82eaf9bcebf683f8967979bfba4634ab3d0396ff4ab447e8e1476f1b215a0855c026b07557eb35d5cba878f950ea5a3f3d5a0240744f7c61ff7426f00cdf411071fed140a1b77d84894f5b62c0429b90f9e9a8f4565e322857cac37c58268ef5cc0ee90e717ae71afabbc14bf20bc9ec674028c2522eebf620f579223e955c81cd85b50f6bd140faef8573e1429440ae1bff1a8071d4021f5877a4a876fe1985354c06d09c5b2f5f2ac5d9a2fe7985a6045b47c5fa20f66bd3carootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootpython-pure-eval-0.2.2-1.oe2409.src.rpmpython-pure-evalpython3-pure-evalpython3.11dist(pure-eval)python3dist(pure-eval)@     python(abi)rpmlib(CompressedFileNames)rpmlib(FileDigests)rpmlib(PartialHardlinkSets)rpmlib(PayloadFilesHavePrefix)rpmlib(PayloadIsXz)3.113.0.4-14.6.0-14.0.4-14.0-15.2-14.18.2dgdPython_Bot - 0.2.2-1- Package Spec generateddc-64g.compass-ci 1726658974 0.2.2-1.oe24090.2.20.2.20-metadata_list-compact_tlv-python3-pure-eval-0.2.2-1.oe2409.noarch0-metadata_list-compact-python3-pure-eval-0.2.2-1.oe2409.noarchpure_evalpure_eval-0.2.2-py3.11.egg-infoPKG-INFOSOURCES.txtdependency_links.txtrequires.txttop_level.txt__init__.py__init__.cpython-311.opt-1.pyc__init__.cpython-311.pyccore.cpython-311.opt-1.pyccore.cpython-311.pycmy_getattr_static.cpython-311.opt-1.pycmy_getattr_static.cpython-311.pycutils.cpython-311.opt-1.pycutils.cpython-311.pycversion.cpython-311.opt-1.pycversion.cpython-311.pyccore.pymy_getattr_static.pypy.typedutils.pyversion.py/etc/ima/digest_lists.tlv//etc/ima/digest_lists//usr/lib/python3.11/site-packages//usr/lib/python3.11/site-packages/pure_eval-0.2.2-py3.11.egg-info//usr/lib/python3.11/site-packages/pure_eval//usr/lib/python3.11/site-packages/pure_eval/__pycache__/-O2 -g -grecord-gcc-switches -pipe -fstack-protector-strong -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/generic-hardened-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection cpioxz2noarch-openEuler-linux-gnudirectoryPython script, ASCII text executable, with very long lines (417)ASCII textPython script, ASCII text executableASCII text, with no line terminators PPRRRRRRRRRRRRRRRRRf 6-wutf-8b66ab0609ae42320518cb49c18a3203bba4bcc9184080075979d71f056ebcd854f56b8bffff188bd45cd19f5973f8071b2a741366a1b312a38c0e5360529997f?07zXZ !#,ȃfd] b2u Q{LY\.- xs=#Dݝb 1 5=>:n|(C+lhaPY>X'<*vєI7Ѽ~B}cT߹N|W**.m9-E"\_/H%>`jάOq9ސ(O8vv&ؠ2I#bFE\UsZ\>ұґ ~j@O "^WER$JPH`:Yqώ]_#┸N`s ENOz՛l 6!"(JiFͥޤ(SJJM" Zy%2Gy/?SDC8qBQ_WL/)? )j* |#@e͹8@˄U_1 (,01 m t<ءG&0oJ53pNM٢*1(RKMP3CY_tЋY.=GS0aAKbnX0NoRV+mh lPӡ pOŧ쏴U qs)980o͐ЩIk2dnǴ> 1H(Łhe>oٿVw,w9Q<]]aAƢ'],R:_iiĠJfhAt ƕaݎ{LOhv|*oT5gp%v钓V[6U3{&J1KA^%׸3Z]a]- SS2S xx>$ 鎹!be٪MG4BOγ6%rk٤*r Re'w-^W Tt.wŏ>"FԽe鯎($L|.ͤS{m@]rK(Қ##Z7un~(1ۋVhk?t,f5ȚùhT>y?bgRT.cD &V`^_ӊtx5R^"Cqۮwhza?kZ5皜'`$/iA+v%'oLfH?vaX/ͭye憽H.9 '*S;‡d#(D?0BKSk^XGM;ɛ!sUS`Z{ˣC#ϝq嵰V1]$#Ϭo N6$: &5bX;&n{w 7BQiuJKp{gHT+բ+`gGFwڿ/o"*+bW~!K8 pJ=%]g5Yڀ#X)y?o`/s>`BV!܎kT28\33O3$TgPa%$X& =.⇂OU`Tg&wI"뢄xezW&ÔoY(ieo .rʀKHܠ2r >ad+Mj\RTjO*r@(rDloq^LS}B];\MS)7BM:U$,E$ǻagOvNA߹xBȜ)Hrv &FO#h`\Ct?m ˲.x6HfKϹZ P1wQ/v8 1 nrfnL\#k@S%-* ;ɽ5VWT墜Uc~~RM6idίJjig+>Ⱥs0"",X v aoXSIhџ+ʬY Qn3L1 *0;I$f~j^&-\ڱІFHfuF-1Vp-zÔU  +G$d$s>jXΗahq3bp3C10!Ps:BK0$|wiGo%KEtvR'YaG881ݎLuHr9G x&1xB/k^\ѐd.Pâ[ %K&%srCyXRPNAzv潦$v5T)OԲ5.:}3C.he\\RmtRG E5|K%5"SwWv#ҸA|O-Ԯ\X1Gcz(]y32 ~.3U )9 l81vWC\t-OV3;XU4(_z[U,%#كşb;q6 M_Fw~"`)`QݢYvϕ+\oN Lmri^k'"?73"7N!7JIG;>gsIlQ6ld;waBIxb-edv$>"`>j[5O }͗cd lu8!62gfT  dB=26N i-J5{(<=qJ#'pbtgTHx󠿜uڸf`LBMmZ#n='Ǧ)$)G?ǙCy7c5\ lܝ::Zw!=/%8saB&=geS1yۖNIQ;zأyLߝuhUģ;m꣋-bĺe"_゗A[3k;ۺ Y-$En:m/XY׋XewR`U59fE/cg9s#-eLvGOBV Z"g7.J`A?c&ȁƮV3Sh]=J8$ۻjy֥+>KNj̧2y=FXDGm5lo5'ppN?+XeJp]WȾn1?BgP 8N9bsGHSnlK3]3M8&= &X(A18 F!` s~BME}C7 ]?jw,lanAAb!t7V'ϔDhnC_:,9-0)& F\0)L\g 2H>k?G)jEkZ.*ܗs sH6к/!s3C 0#o㣰$*hc>2u?֙?pdV M{uߠ=8?\8SB*dum^ws;EygHYn0QF3.AͦDe+(2/-A1aj/gAvaSb @)ՔL̪os}X|M S6 Sa>hdkтWK;!OuG7m#'|Yo5d/ -rnec.5jo$px`1=ozK?9Ԃ%_!򇆧L>FzŖzht) g.jExBۄ&]\TeR<)$۴)i#D_?$6JM֠Vl{Z69dJ$7( w#^;e`YxG;k5>l7 r?&Ugx okU>$Hˆ706aC%t8o*2sA~nkqV EA eHnyr1!`C+0WNЁnXwf`έ5[஀N_AR@/vPj2_Qթ @y*K9ttxʖסXUxQm}6L?vd@Y/=!WKy4`\HmE%=,"(& QvYu/HonA]%Npϝ1H^/=eQS@Ϧg59d)&{dӫ$pSb٪d^3sX"sgGuYۛt[*'3ވTgLc}i Bnl\q'!UdOڹ}*{Й1(e݈};(^Qtb҂8-8x֞p[A9vQG3܁4a^ U᧣ 4Zs`#\A%++cQ)%?u`]{,̂=%qp=ǖ&o 8v cmlX(Y{U09:@Z{w+'30 ?fdHnZmC`iE?RB jˡ|gO)=f~?H \`l/~2h=Yhf^ N .L(f_?Ӫ,}ve(9j_Ơ˜ ( Edg0Ke+kgye{{\[~)T躆 Ζ6gUfbpk!hcš?bcqaCl$8I10ThCR"X`-#9dEZ _C-PN?/=({s}kR6ڼĴZYZˢ4fv?;s\{aak18i"ӉPygj/~ghlϡ%g&Į6)My.#b 0X!G1i-՚)OgikG}?X'iD=f9M /yA[2Zi8*Y6 4%12 ÈV(+x%x4R8GwNgJy: P-Lb3lNKKbn}`CHNA[}!7..Ts6<d$:|?*n ^h 2~sOǷ؍x ,o[$Ö3QmSx޿ *sxR.̝nɼnI*5ia[&zŷd *"ʀc2;ˑЗTf[x>E7ªrO\逳ɃgmՑ%иnvs5p|ɆwmyƬ\\|cK7@GFP$vSw@9Npu&d.l1y^U(R}5pD7W^)ߡɊe9 N?pzf4>cA1wq$tU^[lGfV O9Cf| y,T(הk* U)%9J#VZ,)E wi+3 C6Dɐ(:fRw\B\$8 ˆ^߼sNˣp'Y%PO. $G(&dJY˰ l%gc9cb#C#_R3(ImP?UI"a -0 ά ?ET" ı}[3Hr ̙zyƉo&Dt@z%h \} ΄1=5Xt(z dAE1q6bfV̵f_AДGnzGV|Z; VgT-ۜXc p+&)Bp;56R.   oZ+&;59`%J/$Bu鍗J;/aCDKЯxz+p}A-"cDJFEg?~pS"qZm\yɣqianNՇ˿9IMLO97d. n# cljGW?d H"bkL9żcD08gqu€_:ȼ/[GyE1A]\,8bBCϫwS+Ը>s rY5,m~!,#ЉL9:3=OBuԈw#:{QNfv` ct6S T q x Hk1 DNG N8TT%vF)u7*BT|em5) PsoA&TQŻYĆX>jE|˱`eF'u%1^tS.#pkN%RKϖֻڢ `1Uh<Вh֒LW#$/;|?=?? at$쒧ZUCXb2zftA;!;V~Z(2j8-!^)1z?,O+ULy,Ji ȉ9 E}F!pXGf3{EϪQ;qfȪQYcy*l[+o'%xT-@VNO ;R |m'$Q0(H"WZc۶#lc6*NA4].Y'J*[.NJѵ س8Yg3]ZEгNJ(F&XOW bPգ곦6i]e3yoPR#_!5)gVg]P`HTE9.up.86 7I*,8Z6Bp$.1ݔ~?Y y.@rl=Qj\w\WY޼b۽fp\*hhV26>97M; Y#@bhhwØ EFHï5 `l .PDZ#'䣾3eaҗб?Y³P&эISB.,}`0죣5}=jWRRhl/B]-i%$OY.G&& qֺ=jL1)hF" Rpr0˨*$K92^J|]Tq5JNw=_f>ɼ|Px=o?Olބj?2yyHTkzl\Mb0O;"/0ϯC,ֳ)E!Bz;Fpqmly8brI:,0LZ!# \d{.~%HP. j=hkߜь;~mN!a#_}-H6@SSv(^1 U|]D ߳iװS.Gp@&v돸x!{4(y `sj,ߖF 룫ƨ|Lۗ.~ V0B*hj9K  :XukiQ B9 KɾSL VT# cJ*I}1u ][v|s4͜?JKvf6:9u퀩Ky|Euც JoU(JK ,fZzu"qWn@s`߬*:#H|AM%BZ\ `GGဤցJt,peVc$"bN~;KozaR r?-/4LnO%'e(κy?mp0lo&r8K؇'R̄`GsH@䍔23XjV'FLϭYONY>~m8R[GIGOfv6+_s% x+/)Jxܺv}(opgDRQŸ>.zM kKWEbv戒P<8r]Rq#jmӭ Y̋6~]b/X ڢ!J[PӔw uݿl~ I@>K:П$}(P+veʼCa׃֠WgWHz*e+6<ȗeaN^m7Nٲ}6m|:>oMѓ J;Ḿc Xrj 9;}Eubd4ZOo5wu{~0-w{pg3y_\vU{',:?!e6\ՙi[~_{}-ASp͐eD޷9]EKI[%gwdB%r'C{T9u2hD=Sy+],aO`Is s*5R2{|InJ8!v/s1T6B|7 Yڮ%Pۥ"|{:Csdg^2 kŧVF&MZ"vzx*WB9TK1_+nN%]\[ddadJM#E⬔Y3{!F̎6=F9֘ZJ晋pol BA1%Zt7x'?흼&&zY Kb@nq7]oCM6=BpD{(rr Q^{ǵNGڠ9<~ $"t,4'4lj}d;7M_{굒]u (B!$Ih,"Qenwz+tH.Tatˆ b1R^XW)`EHѩX6Ǣծ>5L!s&Yh+އ?bjoN4 m۹W@L]z)gbl}kXZ4݆Jld6To ^ÑWmf:^M3ݟ3 vڷXγ]?(ܩ["PM4&%ZII}f *Ý]Gl! KrAХ!)fE f8c30% {rȨNєj#}&ڥUhsPh21offĘܺzWkѺoE;{_S xtHFҺ?ty,> )@9@xGl (|Z$ORM2sX7S{; {2*Xė?mC A60tE(3wN{PStuKb8KL]% }&h~'3W&Y!w-^U3iT3U*g{&LJlmg y$sZ:Ion yn}l<0X< `iU5be"&ڰu)98Ƃ0#^hFt7P bmh XχtZ7zFzM+=/9(.e!|lַ,Ʉv`db9 ];w%~x!彞VɚK?vYv"E5KoiLQuM,V?)<?/pqv<0.o*/v|=$Xc?N.%= 3sh 0,VX8)K*e ,:ޮ_%j^ mvʮ)K/89U|^MN ɛ)i?ʋ @~r]A^PO.:ˢ!@(V!=P*u}<4iDYI.xנu¬(04Kf]ֿk}<4d˿*Mg@c;Hv9OzKjw 3 > ڨN[u]aZKMnƝ%4A7K]P giΨ.&%nUޒ-FyXhK=扦ݝiX})i(B®AE^=d$vnF]Ǘ8`pJD-l~I*z PlehYGI-:odIUk .> ׳rqF&05OS@қm(vGW$Td\ H߀yCryL1ydة l&KF tf*{Tgt,A,B붵`?nQP3$͔ ~NŨR y`] . Fۻp2à(d\pS  jZit*`>z› €vU_s>Yz,&26{䖰픃@SM@aU*D\署@f *9AERg'z]TV"oLbL,#qҹQ*j+"P B OrS8~H@Lm1.)ERpZ-è%`P WZPQ9Pmdֶۅ߈A.sv ~ϡIIo7!0czʩ އNe2_~Ѧ ^<`H8uy*Q"ߓseUYvSOڤ B~%pE /k'-BDI6rqYAx0|qw* iwd8m7f5Zkb/aԬ.dҜj']q VҠO%y`T ȧhh i'`'o q5xj;. 2VzM!BC2#$lnRij%(t#lYMjrn# R hﶎq_(>ckN$/^/ Q杩WBoSj3ZH*;{jRE3E0rFT`wL.-n2Xт{0ܢ~={NWϷT@*2l'hR5k@qOS7_vHujҿ+E7r7j'O?~TE<=)}=XpjFM̦3XmhyR?JA*\ja}RA5 kɠ#,q:WEN.8506 β:{+[Uyq}\9g3|/'wν~"騈ApzE-Z{'ۦpWx7A|#l0UW<#pDcvHZIәq/Gh*wQ5C" bwjEoBipYïj= ݎg:>a罃 )`^z~_Br6^aey!fg:td37`˖ -EZH0IJcds;`%,넋A$PMcA=^s]WI=lNTn/FBJ㿙ן 0i! aMuzjn{+'{XDrX;ǥ[??Bwe^8ێxZObɜ#7 g{.B&Ky=! l 2˜>NuG9)0i)v8|8!Lc'NpYS^zND vjN6mfu=#-`ېu$tA ])"1M8"Nywrň`൛ɠto/#fx P2_O Vw1 )BykQJj&aT(bvlrI#㖀Fg ;Jm5$єsF CQʼI䈎2U'kN"ӓ*gF>7xv,ٙ_#lfMcS 9&I G[pK `Ӷ הIeP{Rv77G>WMι$\-1a9Jvgclj6BUΜsuιGɚ+ VU(#bI} ` 3oDZ,*8l$%("ԯRScFgiA.ToGPtYVub >f5󃯥_H {T ֚UM]kNSrMEzX`ʎW)dN>oWٌDzՉ ZRx%wWgt.0\Vg%P{M2)1f^EIQ,rlHR!mѯ*VऒYEJTk<Ҽ&7?WzwZDL_y2ٵ),ߧ>ZK>hmȣmK|&Idzh$k2V?W4W̒Sĥ Xp%3hnDzb$!t?>!E@|FU^O}Y\,%u*Ŷ&AQFo `bzq sz(r|\}gEf3I+k|*x(H2wd^&<:5M;Fۄr{2pkR A3Zv'նZKΪenо=RN=e}=T;@AfPn+R[)~vP#5 53cD4 %1#tۣ$g. ~\ *>9$ugc Zo!y3W9m_`;z-vͱ6+y:#dL?3tF췐SZa:G*>‹cKCh.B`2u oA-| $oW1{#BUd,Ad͂Mn8;x -3GM~q.ڼb~`qőXr.1'zJyd4k!++YgH\ŢyGu`:m G9=0JxVO>kƯr&*!f6k6< 2´X7qwMc?6,tZeK2=?$7XCWaq{#ec&W2@H*ky 5L~ָtv{h!LG.pqx{eYVׇsv{Z̭-۵hՑ.pE3q*HݎUR* cHyFEL[!7lBLBx@@)V3i3 vY߽(uч|Ȳe.bXiܜ6sQ"DŽnA#۽Io"؆Dب?Ek#,(e'_xkł{D Je45M3vYuKHBt MGGÞf·EF,IKs\-;w(+m^߁2gPf ;s~XAWwѰNB@ HzfU4@)4qȲ{Qf>NH70iJ\Pቊz"^~<ύtAߜR6zw$DӺrU>-LrӢ/z&2 ֮q9T_'OO*Ѭhs鋾ITLZxo<ӂl8 ^mrIQ6a,Vx]I$9laL=B[c̰Yp I/TRSz9+Z)zp;]tn%AU܍ׄӰv_y:GgBohļ7K+GBK!;x$msJx\Ʌˡ8^1t>@sP‡eڝQ!Bo #GdLc ;}-S@zSsX*,+MUPM;=^_hx"+Ro\AuL,;p%[}s?!;w3yD) uL|! # YTP t$? KV:4ItrʳٖGGd&g,$hVYtMjSE\P8za+ۻ70YDasEm LӠ{N{fpׅ~kKYϏ=V簚o1V6q(2! @G1 ]=EN9f%ch?3ypN5C qhIE7*?;;Kn@>rSt׈{Hyo PJ~VYp-],~5x.^Hel JT"..>#w1ĩ&4ZWlp׍wR _+TU209Mvgu˸SV#y_E\eN۽`P;0_pG=g̱jff&<"<,T!ɘJj9yi-Qhr;92Bc`߷ܑhQ^>a|5 ׋VN-ηòVa{E"4yU~O/2^AAxhlzM)WE+ x>yԚ*==Ʋ ȐZo&;P`$Uk^X-B2D"UirEnpЎXgK]}[/T7DT,UCSKT2@n[)RT<~+=ޜv #|RT'K(sBW_() `X.3IQx;ᭀ RmefZ#LaF7 (0j_J0aqS G6[`+^yJ'K _gaN6-( Icj+͐磆5025L$| ,xzS2]SÅD ?=|A>q[$䬠t~ґT}8,*;(F^# ;=wR/bttb$SYs~B|9J@ PN9 jVX=45 >e24wO8DzLQ+zN(J@;Ն(?zՊ~ݳ/X4g:7Z`Pz`IÜ*:u_-F/@ehpLB%$p^R 鑮Tu3e⿱xV(gds,(0͹2=`VAleEkֺIe{;[UÂk(؀:eJZ0/0sHAdHg%*\Y(t(6KZv]oC}l@o>m,EF2/3BL+,n$ĥ. ,px!_bA%Q_8 :B>ǠD/@Ҙ끆#¸U<皣9ȴ?Y 8XMjjnaxR%EIEZƼq]؅t\@'/{9{oGFEw;g1R틿̝`/8E{}}B=L0Z2$;=6raSL.vzeP$s.i. K%Zpװ#\ {s">uK41$@+8$A#$&HuHI zϋL@z8kHde| ՎI;R=3w%#CbqTGU]ܾ0XC^eQ“$Gǂ=-8aɿaʽk<^:| J)(( PƋqk]Aҕ9RCՂ@3:luۿRc+kd[SQQiC< GTZWKy`b) 7_M,]l{YJJ71}:s~e#$# 0~2?3"qLoZZ^&OC -)+EАm}=h h^R~VwS4C'_%5joûQ717睠i<7';"^Dk1XTy 5o`,/^e>:yfc _hfQJܢsEb"EHE@w=b|Y|^OhՆ#nO5+ ]!$k 'y`r96~5a6 gOe foL O\?!߮A35E^d(A J0p'6a?<^BBݨuZ O?w)Bֈ=ֽpLZ4W?ÍTѩf$`gĺS_ۡpNDM/vFp:@3?n_Nu O r(Bi0G1v0,aؤ/67&{/3`fp^C'vyVU SXQFyltE²Vq._ksW~*zE{2j]o_BvL:oc}aǭ񊕥E=ha 75=ѩ:*!勑^ qSS4>yÒ #TY `R|*&-7wkz$"5jC0řz<.-/SUClV"ȣ?$[X׀ksHl/ : `< xY)%d:&!v&U.r9ڥ"EpFߖd/wՃ]$l1q!<&;s7`Wt@@;yٓ[+x>'=Ѹ(%&h9nǝSqe(r>jz+y *e~yfF'%<|C+ KX( hNug:ixTJD_.tyOH¢ b*+CUi:ۚ O<X9q}kr!.uBH* Q90flIU+-&,ѡh5*c) WDZ%ΩVє\sO&ʄ-W]IϘ9dh;RJ\*K)1{\s$)YcYrcܪȘS_+÷@ƨ! Ǟ 7"h^SLA|(4%0,0}j6ē:~i/yߢckwgcl̉8䒕){}_dѦjpDg/Mo>Qj3 3fۙE,d^RMPGI{LNXPD:g:e#E|)Q)tLyQ^M$޾7 XIiJz,\-\ԅ jjI}tWo>= W7+#t1Tl eG/NE|d͑Zg_bS֕3;|83 ܅cVe7Œ;b|ze2~֡α7t4*Va-WR/} 2aхEC VEm%x_M.Y[ݻYpX1+RA}\گܘ'k Gk2$'<<"WUv{@i0E3XC-B@/Nc Ɩ(wA~5CY>cnl567ANX'}3>v`.[Sr4V M!w>nN4<j}(/X#L.˳omiN46 \IBnosI ;J?Q,HY:0eiw%d..tƤ|**R` ʈ[@d$=&!B0V}cJ~G9؋!ήd,4bL0[r/*i2Z%ĒȽƃCNlE伉U-\${kve"ϐ³K|f F1k?Rd } ;ZY1hO($<{x:F\$Ѓ9=0"2ִ'5&=, h][X- Aa`/s .N]kK W/g N쮌$ fvENd.@c|FqtC Bp-,'͖rgmwO=qdXg m7f6@#[wwASLy!6W.e3XԘCc/|XY;>qKzToftPKeg2xCpypŽu$y-= ~Ά`L({aށ(I'YSmd9 5VPpv cp(B{?:o0"yCQj~xn[8׋݁l*>{7HђqP) Ei*ـ2̓.HB`E^ T1+ezc <2YO#ynXNJ: 9\R83= EkLV85p1ˁJB_xv"mœRz |%/ogl89Ds e*Z_ $G^sKT/$`;>:WӐe@G?VWVBAbPU >WjggLfZRDFJYFvmsB@_u¿/xR(\/{B⑂ΚQS&.<:ҩ9t~pBla-apk[~ <<é(k.Ћeh+iD~NkDd][vȫrb,Hs 2\xµaԚ7RHuF1Zq8%c E4ȸjǹl@ >##0qz^,ã·nMNJTۈ5)Q1ir