summaryrefslogtreecommitdiff
path: root/README
diff options
context:
space:
mode:
authorJonas Oberhauser <jonas.oberhauser@huaweicloud.com>2023-01-26 14:46:03 +0100
committerPaul E. McKenney <paulmck@kernel.org>2023-03-22 12:02:21 -0700
commitdd409de256333899b2632c769dc798b7db537397 (patch)
treea734a045cd273bf6342104c6f2493a57ec2d207d /README
parent627c9ad04f01221b4396f3df839c5dd994f327b4 (diff)
downloadlinux-dd409de256333899b2632c769dc798b7db537397.tar.gz
linux-dd409de256333899b2632c769dc798b7db537397.tar.bz2
linux-dd409de256333899b2632c769dc798b7db537397.zip
tools/memory-model: Unify UNLOCK+LOCK pairings to po-unlock-lock-po
LKMM uses two relations for talking about UNLOCK+LOCK pairings: 1) po-unlock-lock-po, which handles UNLOCK+LOCK pairings on the same CPU or immediate lock handovers on the same lock variable 2) po;[UL];(co|po);[LKW];po, which handles UNLOCK+LOCK pairs literally as described in rcupdate.h#L1002, i.e., even after a sequence of handovers on the same lock variable. The latter relation is used only once, to provide the guarantee defined in rcupdate.h#L1002 by smp_mb__after_unlock_lock(), which makes any UNLOCK+LOCK pair followed by the fence behave like a full barrier. This patch drops this use in favor of using po-unlock-lock-po everywhere, which unifies the way the model talks about UNLOCK+LOCK pairings. At first glance this seems to weaken the guarantee given by LKMM: When considering a long sequence of lock handovers such as below, where P0 hands the lock to P1, which hands it to P2, which finally executes such an after_unlock_lock fence, the mb relation currently links any stores in the critical section of P0 to instructions P2 executes after its fence, but not so after the patch. P0(int *x, int *y, spinlock_t *mylock) { spin_lock(mylock); WRITE_ONCE(*x, 2); spin_unlock(mylock); WRITE_ONCE(*y, 1); } P1(int *y, int *z, spinlock_t *mylock) { int r0 = READ_ONCE(*y); // reads 1 spin_lock(mylock); spin_unlock(mylock); WRITE_ONCE(*z,1); } P2(int *z, int *d, spinlock_t *mylock) { int r1 = READ_ONCE(*z); // reads 1 spin_lock(mylock); spin_unlock(mylock); smp_mb__after_unlock_lock(); WRITE_ONCE(*d,1); } P3(int *x, int *d) { WRITE_ONCE(*d,2); smp_mb(); WRITE_ONCE(*x,1); } exists (1:r0=1 /\ 2:r1=1 /\ x=2 /\ d=2) Nevertheless, the ordering guarantee given in rcupdate.h is actually not weakened. This is because the unlock operations along the sequence of handovers are A-cumulative fences. They ensure that any stores that propagate to the CPU performing the first unlock operation in the sequence must also propagate to every CPU that performs a subsequent lock operation in the sequence. Therefore any such stores will also be ordered correctly by the fence even if only the final handover is considered a full barrier. Indeed this patch does not affect the behaviors allowed by LKMM at all. The mb relation is used to define ordering through: 1) mb/.../ppo/hb, where the ordering is subsumed by hb+ where the lock-release, rfe, and unlock-acquire orderings each provide hb 2) mb/strong-fence/cumul-fence/prop, where the rfe and A-cumulative lock-release orderings simply add more fine-grained cumul-fence edges to substitute a single strong-fence edge provided by a long lock handover sequence 3) mb/strong-fence/pb and various similar uses in the definition of data races, where as discussed above any long handover sequence can be turned into a sequence of cumul-fence edges that provide the same ordering. Signed-off-by: Jonas Oberhauser <jonas.oberhauser@huaweicloud.com> Reviewed-by: Alan Stern <stern@rowland.harvard.edu> Acked-by: Andrea Parri <parri.andrea@gmail.com> Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
Diffstat (limited to 'README')
0 files changed, 0 insertions, 0 deletions
Uc!Aj WS,:Ivu#"WtVvʔ%`tek7ogeBsT<Ϋ&p bSs i9[ (")]>aD:̻MQ YxH{ ZQD‘a}\~ tseM.o &|!AKbKx约w喾ad7OV׭10mR/*-5?MZ')=9A Pй@s o3ŗF_[d6(+&j.9&Amd`/Ȏ+ùnX2f"TIcwqu7hr&)<Ó1sE3NJ"&N%xi4uF8U64ږk&gLט*%|d 5OQ*aOHsY[goc!{76}( R_t bĻ]Ԉrm%&( jƓX{zm gfE֍loS9f.W.!b"f6]yMWsb9/Jb" Da3$9_R6Ǥ#(g{ܡ3dNlg;!%G٢uj'o|&$I>|wwcԢytQ4H5[ aLzH4x6ɠ ]fT>M=xI5$J!8iGk fJ qe?נ<1fAikB-+[q GRE2=G|n>slXqz|{ȒU/|e6)+q `EFFpw\j*=w+!QUgjj}hc3 F0"X?N]D;t6^'UǓc V8N%&$ uӗ~-A}Iܛdou Pf=oF}Fs6qj;TBgz4= /ܲ(+!jbOf/8ՒS~Ɩr#c\zǩT@@"X k_#4uTRO"KJI:Jx&H6$Wd]~x.U<2h 5CyH3n ͎򐾋݈>$bReJ9t.T)֪kØ4-1o>+qPr{1IW7p:#xI0S[ed RvD.F\4_雯g:pL/+8j欋߰ʼ5?1#ÝP %>myUz{uo+ 5'i>{]#zVGcS2+eZ͞^%N5 0+ V<1]RKȟP& 6M1>^v Wy.?`Ou6s]91^֤~o dʅ ru  xऊJ*9O׭բ0X3UޑG}aXe~cO-x(u]';k?h7CP)xX걦V -zs6$."RKq ='4cĀy&IAIDӌhWD|bT%np|Ua05V5Qo"G=6qL@D׶?%>GF9"Rg .$\/O`z9ض>u7`jSLo4Tӥ5sc [H+hr2#%{ Y.rb1Yk-1lJCor8zoU:ԏ,-.nrw RvMT+1^EȪO H qr0t9zix=5(,^K5@_yϢUVd1& />!x=o4IjF,55~9۶]*EHa%T$tu&$1L1ݲW'U2eVouO-l1/({I*yB$LPy'/.2ǣaC^_2e 5ѯg^*_&MR #x W9i!"3F-d}GLo?}/ƙCdl!{T(ժq*c;e4> Bʮr@}3'($]φi8w8`In5Ϗf䅩Lml[xa`~T锔c25oD':tR@:ɛRb >]0$ ê)ن;ߤ8$qՏX1Zyף{q 'Rqϐ3%ߪѽ8'hӾ};cd×D0o"(p`؟Y"e)zOv}6\+>7<1s"pqqG"eSRuKn!uT)ѳ.:]5goS?><`Sw I".f 0@i͹soOiöJp`LΆ;IAWloﵴwz݁4dRبj[%KGXup}%BT3Y" {S ޔ' eY~],;">z-;c9&|9) +jr)ɞHؖ>6/ p}^ۭDOx1x܂ș;+'Kn*4!N*s$+t]Pc\#uޔ|M6#Y1N3ӣ FxQ6[TJRp4trg%GSk>5_d3.:g? |W8$bJ$"L{ Y ޚ7R'x H7˞ +ZoP4CgoEӀu\v xJ=F1Q5iPN?/d 2Y24Lkg)R &!~H h ~)fywڎ_StH8۾$vˆT0kZᙼ!s[GV.z}gQ)˨5iypYhn^x:uJEEx!?k}^R9SmA=Fƥdz-+̏YLzM :zH!^|iu >a4a~tc>;:‹ԟ֠C2AN+/|hY=:LGsx3;Ns^C-hdvGHc2[lhlvLF f%?2K[Hfikb=hΪ+v#Lo&/7у >V;:uo2㙯zOd.+ģ\maZRK',Kjp,BGO@T3XP. N=HX`''qq}'٦~o$ ZS~"T]Oyn}>+#<弶0HS@qrb!:?[ hG/H x'lg`v<N;a<1˪_x&?~1 H:DvgYYUX1k1f:XNCw*!*>e ad>#J%@ :0[<3.O'JgM*bb,Kiɉ`xwuU^W]X'.l3Vr9}lG l4,rl(A(ά:ߌ%%*j` gM|܊RMus H"ޑy~c.2L -'u~vH%bSXԿZ|kr eR9C,e5š51@ 82yolĎ8Xd-N} m_p{eƾ\Cg{x9^5 8!4\HV^tH)ԮL5[9<5輶 w/QG[yg6e7}F7<>h;vc 3:N4,狒{#ج K /ݣxAß?~rEUVl7͆4RVnUUZeaZf,Dw RQsTo(fZ  0G?l ǜv{W|\'QX 6(1! lj"[BkK*mb/p\m{LNQ+7{#"ݞgLڠU~bg)] 8[G8 ;A=xqp/B?"ǣG4αC˥R]hn.kђ< ?F2}mm7s/U˥?lEp[DE!'MlJ&{5 >K*m P1J0WbbX_*nE,±#Ei#ܐK |wQhЧqx;NPEX&:"3(iÕ:1bDzɌ _bw4OfFHt$bt4q)@\v`(* a8c9En*f%-2r.wU8tI*}A Fbγ,-B|+Ƴ\mk_jW3uIu0KGPXveܪܫE2#7 Ǩ= {]Wj2;i&SlAX4\AUd&n/DF}u:O ] qfؐy-!"4H 9 P J7 F>WYzj1Ћ^\ݾ!koS\$pr7u7+R?]kͽxmH'IQP\\Q,(2ȉDقgG:KD687}CWfI T6eYc`: U8K xXv΃hAՙѠ"ol,toЭZ54w TCwt];)3dcI+NDI⯺d]zv9LMc3.Kn?jq-(VKjToRׯQYZuCjWKeRUݣF:$ H^*Me w3RuQP&#ˬ;8"3SW(OY9@ktRcCd6f~ut+j12g]W@L>"zF0E@E,Ni_&O%.ǼYSʄJҫwli֑i\meϱ2M!+ jbn:@{POu[ѐmohvE,cǷw7CYę6;a ٿBazzԖ N~;ȇcԘXNMϊ TkIJ<#-1R^ ThuRv`X/iq̋2Q1Ik{*6:UZ*5,.Xj+.ˌVq%EJ>A-QL2jxnT'<=@j,֩ߢa8{Lz]mډ'RZc| Ä5y\I3u/b/'r7FY!&kT–o5 fH"Zy kR; ,z*qRIM7GÿFoajl -ck}Sg7f+?/.†܌gppw`B׶H%u&RAv/œb !n/H5lHqk%Jo+%M {2"mԊg:wnX5Y*1E?CⓥB1fpW0{ `8߲'f{s{P>ScZ,kիk/*fv(w~Rgh8Z~,LzL< JrdYHec+Zb;u'H˕<?\biڟiMzbUbiDLTT9Jq8m|'"v(|f$3.pڕ67la} V cj9X*Udג5Еj:<$*ړN>+8ēڞxBCVDWI_$X>w@Xr^C/Ϝ3ݚk RX'k*rhڨ6Mu+#IuG^/SD&+ V҆mbE|uݧQZ-bfSeO5Z#9ʄwb3YA'pOݪ6SMGo:iTչu,'2d/XTn~YzƓ>]mR{gm?HU2m\z n M{4\t z$mnc1ٞVJ-k# B tV/~q:c\ 1#5+R9;SFRGyrCe0N`K]6^V(!s1ڨX3C[i<5afr\p +vfzJc;{ma[&7"%O ;u΢NjZV;1)^y V|XBrxzO!HoaD$*yͣ!G%xe=ѬoLZBVteX,tn3;&#U`ܪQL,K6fI3zӕ8'l=gKAie[l21?G,n幻V\"|ßo;1ڞ}m쒂LR*3tdo_r/s?[rJ҄|3LbD`ط ᱐5%mqwWi)bfFFd./6c dBFlOI:IE=!,+w sA_1z{u>=P·9;O-܄߼@2{ ;rHb VP}teoң%tzAtf.fEﰜEŎ~X_0E"\&`e҂̈́ZE/Z:[׹ 7jTE,b°wVq4R\hyO2x"1Bi۬ӕ~'nR36ZՎj mWAjL~CG Mje2H׶H0m; ADX^a7W=jUZT{v޳4s(=rw+:JY%bE+s-zFG gq&"@q4FcYlbkί//߲ͻK>&-a҂`.mRv<㌱w0 }{p:y㓸sN;NjyWzaO;"C 2FqMjPߵӺ"uxiCoqc{{G__jc`>uD(*NO-lv(r/¾ΟÑCVzHѤ%C=aB[M[l zY Yw5Iܒ?%/uR_\+'sG:bx}x)k%`~I-QD}huf}sЖCBGҏ|VƴjE>MU#2Mzwa}NmUoX!a@+ ̳2,^j9anM;3h\dwpgs$0`Q79]G[&lurMV:AS6+_w& G,=e=dCKH ydpUA2is{[PecM@IY<[ߦޒ""p$:IÓ{Rztie{ts}.$.P> jV$X&E,E!3z [Rnx%ɪ3Kh GIF$?>wUd\> `U/HǑ?BSk˵,Z2.f 6(Od$&-3=_oɏtP,.-d;8ixK!= v 5M2T.b;>]ZҞҥ- 3e`&k+jQ>p>#I/c7uph!`يZ. L bbon.8Rzf&GΜ4O;H$~ %Tei@bA$͑0z]plUG *Cj+uU늤( itp%FB,;J8 ̦ѩSTy15Uk|j%t?Ͱѝ{1^|бsǴTZ@2Ryz3opsmj~u[y7AP`lf~u #jR&z9 5 +{>f34^[x2FN;;2-4 G%ڏ =y^>@~qWBRPv'Pڱy  'EPG9QZѠSy9IǪ?гOvIYw&hXQFO!*`Z`^^„B=]5/;|RHM$(t$3:33VѯMEC~m"i@oUD7in5ZmK> <^r<@>^ɴb d 9zL񃬩C#vzjVJ>񬰨m1SH`zP*lV >Z3+`հB1hڍ+.PA`H Pʦ,&dϺ7~k;(sW&]UQ@nW~ %na-H眜E7Xd0E;R?'!$ cVW[-٩ 37wXXKz'txrVɜ\@G{etZ(I0[DdP.SCݸ lPZMRUnU"xu(ܦcc=5_)†5Tv8u^:?ױ$m H9ɶ97Az3:ݐZt(kR%6jEjmم= $mRIRW},۪_% vD *j =a]u:c:.Q&(f,L;8T#apuwm5'.8 :O}ԯ"bԄ4Kij5B`{ɕ6jYK ~٭i*yp5JG|ыU\ِ(*ñ##qexwut4&Z(T- &oPoh!S2d @[lFkMc ˘L&ܓځ9D(I"5}/sO(䌲"t/ZyQOk09; é;Hwqb}'q/x ?Mtg{9ڈP]W97d:!.^G1OS*mu/(.Ҋ/bL!LuVڨ7wR "}-y^uիsZ3~qֻLlywﬥm;t_ cg9$ݼȌf u0A2vRSs쥼|EǏK`z7"xlIm,k?gB`ud5]P1Ύý6_ Jtz^[_ |k5Zs'Gf5d8FaȆlQlsL ժuGC?w([ňt)|o5'kw]|GH-h;,|i?u]9.+bHcd/S ~qA5E, H{xk{fn r%Og/ШגJݑHq׭81dY 3@K0a^CoFIyGCr :L//Jwd MF wwԬ2O{6K|igwG&Yo[ 2Gf ܈4$b 9Ј@~vJ ؘ7u5"JT*d>p9$Xt JH)?jGv7ꐾҩT5lʸJzxQ0cjX)7Uׯ)\p  R[ $s{Q iU,"P^YzNM(6тF!iǢo{K|57bz{s>yhu)^XxfFMhDK_ $4 [VGhQH,y$ LLh ;9xXV8g|79shʎϸ-XgkC񋲡;:zG鑨'cK|E7'%0#5`ba6ZC=Lj-)U I, ,1ʢXm7TQ}*&I>/JLTCd|In.Gu{!2FnҹĂי}HӥF9ʩPc4)4Y0X]dؕ{N $HzQa>wي"='?R F"8#&B,C~21B;wNѵ FyBi8ol5yCMqX`ߤKzFo8}mf9aʥ'lɾO$Į9]%ox{ܡ4U54rzAMV;C5lǪU9j\G=]pI20"|DJ{X}㟥AL V\3^ۨF-MK@O$5?F'! L!n v͞. :wsVQkn8DQ!0Q;&Q[cOh?"[71m=ǁ,/LߋiE&O'@M7 Y<ϛxSȘ5s<B2-u7SOĢ^nn|n䊔C%QlA]li9.P^w^}g[=E5L{4RJQC/t_UlU;/sۓ VPV!|!qR\Wp$:Y!3 R#_ux/%l2cץ=o$V;wuys5 K$9|8A:YvV{){ϏM^&M6:\UR{+hHXI؂$8 N-IDn󒏢 D$| 9R8]ْ +RVTmgX ܏$aH`YՁ_qW"]9 ƀ@p~pA'~GHхk!Hv3t,Ǭ{wwOȓFFI@8X%dq Pg]%BlVxt3AWUF'iJ<% Pĝ"vpuE=Oݭt(bkto ' (I,]fW\2DOBݒdG l";tqkekz !MefDOQF*Asֆwy@t܂7%>Qq pG}a ircPa GkxTոmQA),W6Mc _s olNWzAQ jxԈtv՘Fzq{R}.B%"U~={q2̤p619+Q7s&0$9K|@&'WTw?럓iojί݆WߩJ^!49XfE '1 x˓i`%UqigʊhYX 960X&H0zے}ڊǢ&A5U.̝t؆ LiaDݐ*S:]MR&>#m753݇KXUU`ab4, F!8_n!tDp%CۄXoJ6r#@oT5tq[5%\oJ"񮻧O[F1sAzE:~(e,,Y6YyrB!_s6|ihؿn]A@:`nh-&:UttEC23yi R&drS85-vٰ%6Ayb߻szD{GW;@cӜCSy J}a>( '! Ɨ,9BGLEy2]25BGwcnRrЪaϤz%Q9K7\Ǭ 1Ħ A\zBeq%B~>[;3]Np\zC|*2 DWmwQÇ%hZL_;K`x7ZjFw׎p"턛PbVCƳY΀l:Syɹt#u\TrSŕ <"#Z4bEoFp"ZuGNʳʽYp G[X؎ %_1f'{"|~ϛ/jg7g6^n[8MQ/̷qԤq`$Hi~i%r8u3!m=DQ U0G];uly,,ea+ P7xw|0OuMQ"#/:.i=v%$~(][Ϟ•gM>c>8].oR4{*7=Y @YTQd4;jXV*7ՃkgL79+z < ckNC}-qZӪx'6ӫT >370Efю+ֺKݹ{2CxHkr(7e}# zk-]5"h~-ޅEZ :5ZE#6-޻Xn|5rsz:iYr}KF<|mP̴̈́$WdNmK`v1KD"sS34iQΒzZ䢺 Haq1)]I3`3YUBP6[ɃAIō%F<#d pQA|%>͟&T)1/χP5x_ЛP28ߑ$rBϾ714dy7BqFvgOKR7Lx]dh*%4AQ8;*mWꨢo!=jmXW&4S5?FEPZ=|qx9c,+1]$H3Sqel)d`DҲPzҌ }R6Q+_=A2_;+1t= *cluqMZ7n5Av^@xw)/('rL3yEx˗q-߳iYq!Mni:>~$@Rf;_3{kqhⲠ0-X<=QXݗKlvvQ>oNiZcj}EfO3XD碑)c&K$hhlj `;32E<︇/}45FI~,9p*&6 Zih}/ J{? if9( C[Иﹻg3J#mؖQBM M8w9H|7TcM-_["!`):p%wC;ۭfE*LVFQԨ^O5H TIg#3)PupET-iA==Vʂ _M.]-VOl8<-&XR I;d^irm|G ZvTC{zqLn0d]T{N;h&Z<ߠ8ܻigф8N1\ZMޙp$j`a5G>cAߧ,*Y_M-࿱ԭt\!N2/+P"8;iT] $+{6伿l2b$w6kwiGz׍-c:U֪Ev@X2ߍy<$$u;sx=cXj:ծj@3LZH g[(LXW.glUk$M*2 Deg ?e&sO WdCj;y8J)s+_nֻofxg?dS.0YӸ~896y%jS Ф $5:k}*:w-ѓlv#F.mmK غ(r0OğA.02Қk7gj J$E $e3AgJY<6Q}\hnI};у(I0T zEW悱?ʨ/QDxV$f{إѴ^"{\g/}ݕٷ`Rb qsEΙ"ʳV='}_ۻ"Vd&=ūijJv+k`l1嗙Z3QZ0&CRa:-ªi[:KW>h=rV=mt yn t$ x@Ȗ`q#Kc"n )󈋀߃aƳq1֤ і1y]d4xͧsf*fպ@,W6)frrY:}ۋ0`"Q= 1epO>>o/ R4~1ٛZ ٢"͌JkX#-!t%GvqM  cHxh.UםItoK턞+X<3ة*slG<*!ְ?^ 77&Y1La!M)'VP)5-e 't׾vm$!P r7K{/|[R2BXn$q+"ҋiqJ&ְOHC~!L*1Kk4gTk`Ibe+ mj`HN+wwgCM-֪}vMH 1s$VоOJo]#6J1cV\eOǃ[$ u53bV-ЗAo~/(]]aDs+=7}&tir]+fνypEe. pЁ}AŬPzwzfvp+*"jE@kӒGFR,iRbmaSywt5EA*1טIҢ2ןϺ<ʬlJaS2`Ac/3NzNxkcoq#F+@%@?panl/Ly&iZ$fiaڳ;N;!Ob$ p̵Ho`(i v|z7{_ߨ\)L@15 YW&XY*LKJLtɰγVz@q>{C˫dosMɝS$jUW?Oy39 htov!Pwbʍf@Ĺ Gحս'!H-s&OlzJB (F۲o`,1n.G2[!N%GEE.aՄ u{ l9;e*7MO'vB8kle-v?'LJK?ulҤ1 * M-RjgϚ[VQCIh6 ;5{^]umS64`R50{L2SjK_TǖA_2♽Kt87^0ը,Ršk*sV1V6L,3\N|͸ Ɇpc?bj,ԡql (I" rsσpj ~_mHYܡ("ad O :PTڣlf[>/R0 OsA#u?mpH͇%IGQ7[j)˥ /dgQ*ZS8ܿYr[,HMtop̨AK$;C^N4ic:9]9Q&c+6IZ.$]"M捠Xs(g38mwhOrW+R.|ʧ8a?ƁhLtgg˃- gϻ{{ U`?gTllXY.A[ix]&ۇᩢ\,Ͼ[J^)rCm R"t1˖ֲ#ZHOR=΅_1; v]$K$dv1Gbs-wٱZ$$o0\l%8 jT33R >g$\9#"`{,/´a!$C8fӊv 3c._G 2T%.#Qj50=[%Ӣ[T]0+b̂xIܿ,JgΖ&N 6ks1ȔBE"g ::!.5\ؕf>P9pf;QGrI[)i dm]{ϜSLiIҝL%Y.LR-aԓy6Mf7Υ.U=ěBAx9~ڦ3 ~nC'p*iNЕˠ2pd*n =sX/׊j#~Eb1^iּ#6|UjazC+t-iNw椬ݞKQj GgR a7BmX49Sב&( u;}GM^LrN/Xy7 a3]kij6`dI=D!;5r@vDHx˥5wB|P4[Q_'2[|G5ƶr»0⺠󬵢N<Fᖺm!֪Njs5mI<. !6X4|s1:JrFWk F5U4Q U>jx0@d ʸBYc"4bH)9<.3gG^Q>?j)Y*a]^!1fvWdOFW$ȬkXZZb<9@Jf=jOV6)KV3IURվ4=4G`N%Q>Tcl/'3  $[ .bs1Ze>f-<PFTըԋv%O%$]pLͻ%>s^Qt smOY΂@32GՋ*(\g~{XEmed؂ȴ+]H*){7sx(öi]~>xBQ$6.kq'³b ?Zƭ޸~ Ze9]!|ɆٻRJHS{S4ڠC:5/JHg<J,,Hk %r?Ig1RU;$SP*2ֱHucZzF!Y~ P?o jh@@+x篸 ^tkG p_;Wf[ֆ7L(~e c ]{sYc2Ћs]0e,( ڕorC0wtn-=|+H٫F~lP֣'- R<{C ~5rO$8LSӐ`acDfRruC s ƿ-$1G@mAkTUH}w<5.F]zJ -6%\p 묓DzK2+^A^O=5\ߐ~}œXo( J#_,h[s srYLol,ֵI@fu6sq Gά@:Zf r9e1,LrB{[@vOʒ`tL|I!3K-Epc+8&bJE!NX~V@p-"I{=#O:'[ tqfz+Mo&d;9t4m ﭹqIr\6+Dv!vA(W&ZYE1㲰lHY>rR>;U<$A^pW4vR~KƈH~?їd53ꍭM&fmuL, ӡz\tpuƃU- Y!\YLMO݋`{ѝ1&jPP$u,<3'I] 꿝N^~ 7~BM;/@3·!Ib΄Z3Zp89T E`ۭaMWǝWid=6d{8ecvovQM+$y`8elDQ=4BN,ɏ}&QW!_0JǫFj74#Gfcu7BC2CU0fG #8 LiqҀ($ {2{Ox&i+P.)%++Gc^F#S3u&һw,;L`F 7wgԿ/px3߳9|G؃dmU[|96$x1'Rf 6*ln[ntm{ѣ@9gry>P/nnȧY|dT_/sI&ñnR$`T:`+公2=x\Ψ3' 6=CH.؈Lڋ=nXV ڳIv!-ati +|=#(K[6%ozcG *P5bWER䰃]kÿLࢨ f"^xAL!K1-#>ܥ3%)P3DDǷ`uU%:9Suy3G}Rg),wϼb?lu5h+٧$q%`TԌd_bS>?NѬȈu4&)Г %Zʪ n@9gЏ؂^s\·&*Znrj"-rb$l[r6eMi*ןI]kmLs{"g f, \4J _?qY]OR<ŤDyDGqzSʕvC[(jdհȼaUz}1n!ihBM:$}X3ّ+(ak֪#${fdD+v=ϳ<1CS8.}KJ҉dn|dŁ]!;Af(Σ6x{31LЮfQtOC mX5fH985}/vf: Ft f~n^$JSh LÊEg[Ym{qFrt-^RS!_ʂNr6d\z3S/5[-Y~!TuZ36܍voD2Ĺb8¹B2cBbMX)P3E{R 9׳Gj( In!5&3 ҭXRZS`O[h\ SD$(VY[FUR_) sd dAREFU'K:(:4l7]74Q>wVÏWN2h(I8cl; 5)I"ݟ"oX tLv]qrOg/zڃY79gC'~?IV. [+L-$|E(f ܌S]4;5q6pT05 dP|J>`J%o^Y!M=Uw&- {6uQp0gfKꥁb _Dg\I4h8\oG<"h$nyI B}B^Uσat>8\/s2׸d:XYplƏ^Vn4!A_d8}fNN`L"Iԋ˴YBǨ TF$'>Yo`<=$1UzdܘžG~^j^vYuJ&6".rTִF Ƹ'-N-^!z`!i6;EsB+G)]uYp/gF\9 M.8 U]W-Llr&x:OV(n[wiWja[{g0Z[ҷ?0#xZz\2ٴXUi Q r5cByMԵᆄG$f[\k+4՛xRjOΣ}n :5$s c;uuZhAFɕXiiJCNύϟ\Kr[;9Y% a9k)dԑ ]VoI)ϱ[%dp p5sqԹCfywd01n&CPSϒR0m4j e{McJƯK-绅`!&TA&o'74qQMT>qRjɔ'NFR{|d*A6fЇ'P'83@obi!%i4lD .AS϶B?rte!&>QO<:d=O0N͆ta)43s G^fg1Кk\́6%dZ9];Oe^㨜لx"%S&X&O S݄G9A ARTC5NHd?^8w(|"T'|aہО6a-94 >蔕LXAMmUtN~~E m('+܃Ž~w'ryL\6$بbE@q~`#V`3J :힦yɞn.u}IeZ] D;;Iv3NRԟU|st8Ml!86DygȘ!TFJ۪W5Ua@;]F'+r) L?HK-mh*arj cfuPQᕿ֦x3U- I;Cs!|O5JzlLhޅކ{ߋud4o!_ղP~(:|C/$opYj:jpӨ rR+m-HH(LwpܴtN x\n-P]Wn1{'iZBz:|$LZű9CRu+k:-+[DgOsgペ#1o  )HQ|TK;k5:E$dJS]ٗq@sz<&%8hl`e"nzۘ94(5E8y]s 5[k0ÄfDcCOXtG|FM7 j6&q^B9]]^(D>L%+#2JT˕k_62nmj vbGv2)%ʗ콗rVmLK9c^? n/fs?1U?Π菔vk^0 K.Y5+NM(j)VWFL/D:g`> &zDb@_q?F_vJ3 cҫ:u[Mξ!-p#,7=#}7$)OO|mtH[[f~s抳$퐥 .% 7#JAj7B+VMz4&.``49gSx4* J?CH^̸~3?N ir b%>}ao72$sޥ׽MՏm^S&9'{ttZ#iE &_CWeA\Qý. mo/DVȩXc&vQj),74h_qK1Q_1+&lCȗxnؠ8a BzQ<T؂gJ M?fo[62]F))!I5&A꘮8,ƅI hQ/ &ۗ4bũn`  jA Aog9Ip$ie(ve?FgCYM851@$y麟+Em>c~7ʹ Ep]P r$Ov%'Ӟ8}%߿5E?PFJR3t=}OreZg钇([z4VAoӬ|f~Ε]HWuO/l.KϜH&♍]\93וi޻Ð6.{(L,MB*5^MruWvћ.c0v^9sYIIz_]4YoU԰A2Ѩ:NGR j=!(\8^}=! ?7Zgs&{!aEY!xmoc`ݷre):>>ϙ R[S<8-#$LTL[b, .cr9WT\ bK'8({hڪIob!DG&z<*W PwUwSV7$qJ&]ZIA/ϊ{ʊybJHwoiGo[K8!Ew7?`8'Nu8:MUZ3x0ӰՠAf-5(74 I ei(>z}>1 z?m7(loZq+s{/N$W'q8޲`j` L*&+fl1򋴌e@O=.ȫU O^ a|> LIi%פ>?vnbM/hsuB0 /W=ӁLRa3uWj't#y?s .sUh+VtLlcعmz5ۏxI< + u9r;w8[*6I{v~>Ѥu wq2=Rќ_ZRcT ~ ,`Q^ת u6`Ѵ]#RtQHsG+r_{jFk:/vXnQ"Zz 0]z#>km!EFbb.d B X(~)~^DG,Rs% PX7&-3knkzv7(Q D;6F#XdiFrR燲Q|'|0#PIJ`'yzjPq"7K C+i 9<'SfR:Gn*U$?ƥznm^%4C G],Dz"Q7CPH U#ۿ]FX"Vnfx f͝vYk c4ѨI_LҸKUm ƗyZdZ#n$-e?Z nncMd&ILnnsRFiVlqn~ĺ/Z5j7*||ɒtr1 jԯUV2VB6 W U=uxFl ZfAzcK[ޒDN|drCRK*,3jsPEVDkƐr r 0#7qh i 3p ͑ULt\mHk쉷k8 #^iWj- 9&bwmňZ\ޮEיTjzѤO]C:S:- Z8Zh1#'1`򿔗F)%:pDꚩ *=ՙŠ<wNB&v1 MŴZiTg $J>%iSUi{=rFdp:蝢f$ _i%ߜk}.Ɉ8;M3u@5rX21Ðyqb \A\h$9#u7U4OTt,Tg֖~! K'Qlڅ ?{;`k Y<*:257ɿ4Ln2Qx9eZB;v%R Ok()hj}#! 4Pvo\f,1#ɖS31.[9Ae貏ƣ3[ֿQ|N#~VS(V+"A<8V2iW9 -owGgP٥\ESVs㬘!P/.;0.P)츸CA z_iVI:A}l˘>=~ ݝj*yhJ_%4iimM6X5R!ɲ}!)QJ`}?8p;k5GI[`B|;& [,: =@oz^H&ø%Bܬ6>h"$xvpY[0Llk%NdwNtYa`Plv`n$֝>4#seG̕O;m5""ˬdflȬ et1'n,1&-L Nܮ6 $Q犹b.5~"EX>]O-s~no 蓺F'C+t}A[Q-V:U#sdll~B.e2RDC6my뇋D]{YMؐ)*,4E8r- , I%R.c# Iy98+O8&9~vW)BCR߄| [.]ЫH)eB!fOL,=j{%󧲣m˛9w47.rٴb&VBQȀWq]bGGEa".7(4#s˛]`)ݣ!+Yfz>S >#y)'* " Z&BF+zKLdwU-OE{5Dj#ƚo뽧] 'E$Th!  [@,pɃe2' 5Z$nbJ ʅ`lr[zL6{}b_ NOSG4.%Skbz)k EwWDDtMPbw&Lƶt JߡW2=He>19n/I эwv\u.@ĆPoeSuV~}ZV-XL^KDv:yх-jn &>WЬ+|wq\Ԋ^`jyPjH`].m4e&uU{h''Y?ذ@l/Oص=M{[~1G9|^՘-9Lga4løqK/Oz)T5ChŮoX 1wOM IB5^٨B"J uq\χ@3yQW'HqQP-E) H3sPPng9= @V 19 ]%n:anXa0wuKg&؆ ?<~g{<^Ƞ)Uప6|;2 t^Uo.}\A>k#jҏw!)WUz:R}TSC@e[Bޤ/}yV֠]].!`vzQ]nq#Dux!梉9< ;횪C<郂wUUo*uZd`6Ǫҧ-\pInB vVYC/rGmę\Ѫ'yp= n&J?ʹiYS50h-+FOȰ)5nါjWj0qkuKv\8qW2# MŪY8s.‡}:݂ibʔhMpl6CАjEM$!`  d|V-WNz8h 1"@H{[P Ytր;G;3s$N5)d6K+ ֖[԰WJ@;9iq`}tհ%7N)QTא \)Ӓ|$lBJ >pNsx+! ,Pm4Ȃa̽G6il:h8N5 J^ɭGdj`Psv@h4gv $g${̒U꧃7-s:IcgcآW,n|On$aqxͿh \Wg:^ZFs[_#;uu>%8AqʶK$G\`gOE c'( O1$vZݮhG A4I_'ߌnF 5<i-N#)Әdea8Mށ`1#>6Œ,c$/G*6aRnӨXګJݬ$:T.=685CDl *^_%:OPg}2 q$5홊$%Qe^I;7&Ki"cGC7$]@o^h9|8*j<: -D (:";:*)x{>cbL}&xmZӍ<_`vJgѭ;"!8в1'5|O^57Bo֔Z3y(&++cf~%:bmw\V$~9%فJOT7&yfs ZIG<#Ҁ!=TD̻{]ZԑV,\Ie[BNsrRsp Lh#E0hŹ >Z MCRwhy|nZ[{9>q4bGҩu:xnQ]E9ߥ=Z\&$uխB>:3%Eʰ:l@=WTꤡU̐jUڤwՕ\-\u6!:Aq5ƷYL1w{3&'%veO9}6$ IjVRf9?|%޲,A7An$Tl& \XXƑff{n{uN~3I-5aƣWAFנ 4?F% !X]W6`$T NDiBC /OOȈQC}]dO{lt /_8n85z,l>Ldb$+?XitvȯnxP9COh!i0)Fv }նǓiv8 l fR:[wˋ׏ZzS04OnW6e{[z: H3\jgj;>y qn M ZO%g~%ދ~j-3`&CGDE[edl.E}fߥ Z4ex_&Y `YΉ*hUx=/ssơW:.l}w, N,d 2lD Q;&ERE%ҷl4IJ[T &CZUZ4d= ҞPM|]ɨ,u2Rl;A IGuڪBWnZl(ZG# qA=ZRÂ3o/1ݍIlGSnŽlOD|Z;;ϓ{@9[KgQ T5j5nf,d}(2y:(ayz ݉kΞ7x18 uAM$u{SF'SI,͚女\&B@{.읊ig؍$zҋJkPcPgګTLm\=(LCKУL/StKw&&'N{ O3$$#XFVmo~E֠Ac :EYj*/ ێg;=N<~RoVTQu վEvic:\!3"W(\¨g~5I=aH@+%=~啑 FrX$=$T>41Oy-8i\64 z52' b9 $ڙcRo:ipdfVz>N|c,ٝ)VNud7 F"s[]8d˜kӒ%CLj~bQF"/5aM:`C5G!W?HJ~Z,+7%vQΏAfgwC$.v9(NyJ0c 2n@ n>aɃ!o዁EgD!AiZl=DzP̘`7KfٔŋDC [Ac 8|vȿ# %҄@ݥї섣'3*]mQK*sJGMCȕJ 2}SAvfAAatmy"VQtꕜ*_64}wF@6Od\|#Vk?f|3r36x0jjG$kCjIumzYu@V{ W(\“~5P{_ۭ\h|PE_\W:J+SnpVj/~PQm!(I+]Y*f7^)yMq[(]KYldm<Н/NeoGsQ̒q:t!S@X~tLz{YOFY^a[(oh_'zoGsc@FӉaR! ^Y.I:> L3"/I1-`zC#l,z cҵdU[27LJNr˭ iޅŤJȑnhFt/ajIRw5IYW -@NxQSjw[p]oB=!n6 uo JigwIwpEoCQ}n mv K@C"K| .[$U{_KZN鈤]䊽#z/ˠ;w3ˎcPWu4^ R?=h DIDHFWS!ָO `;*NKQ!3ީoҹKz`ZdtrjGI2-P#RPj0v%5" u"\7>|QoWlw _Bpb|=hl`u!Ƀ;[eRbA>8&ߟ:$";-^JwJZfowvq 3AB VtQ.]p;/ ;n HIl[gn^P>o&˵"?hK+V dAMlB qx㞩|h ]mt/Xuj,*,H>x_vPhGnf\Uyk9w?Ѥ! F)x}ouz,`GS[!kYq{quNt~)Z8mYv\2 SL~V?tvC}zր{hO`oYSJ'f w`@ޥ~f0&gHyIopۘy~7*?Nس)pwIHg8ad 5t=1L+wwUԬ0I跘X\ob5h }@Nܩ@>yw usXhPOnr>_GI Yױon;PC(-1T#ldTMyFHNM!ڠ7-NL͵񊿸\tX#mj ɾd8XU!@RT֢oʔ@BҢݹO;>tldު:7^_0f t\ncBnJ3I-tĉ#\v'q9[i$ mqH W#}P_ϒ|dNU\L@?0/QRϺd[kه +%犯?͑l{(:O}5>$wIJfOMj} J&3*EP_pRN:)HoBtJ u=@)7Ez>aic_ڻ :ꋪ 61<|˦B麻,NfVSigckq< er$PVzT k^Pee1Ki&T6UU8P5ɰx"hg!-ёEțݽhH9p(+ 뛌ם,5OK~v;hsKehjL N'6xwb=@0r=*-^UT N4PDpvjb (}؍l쥧O[L+-*v3T@([˂:EƏc(o,Q$! wƿ/*|^6${R5((=RG Ib2$ Ov DWudRZoEdbF{OlTyU7r2DvA&8[0( 䣈B=z,{JSQT9GښF4huFCtŮr-G{z<;Kwmlme]~;n)GeX yr hMlaN`~lG} 4'xʼ].H\˙CYlc(5vˡޜ+x˄췘>j"Cܕx[X=hu&H :# ׎8Z:܅ 77)Xl:lI`S6k~y^P_'D7žl&}H^Ds;\51#+uX12=p.OG0'Bط]2 6p t~Xv1Q!lvjhGKDvAKփy~M 0W1GE]R⡏8ɢsÁ6(tn9i0*,HH{t Л S;*i@2[ D_cQoޚ*%%qn:zh7&ΐ-V<] ]*'8"6VwV)qz_s% j"e6c_kFH8\atYօN ^^E9(cBF B7LMP_Uًρ~XjN-[,my)Jy\Ō/wU /R3[d%;L}IHۥAc6< &"UmUr"EzOIt P n4(MVpjlOV}R@ ^;LDhBi=ԱM+9gLXb)C*P<}\RJs$'`}Y=ezUpanioJL< %|h="'ѽbKNc݊ lcʚٻOFO ~ʹr6ф24Hnn1Y \giMlGDE\1 zڍ~L'6{dC)8žj"Gohd% Ƽ*cR*FybQwwbT窓D2jf{.eQrDs]R{ Gd3M=> G٤~Sǎ"4{kW: %圼ŠW[Igvvl LmިQoޭuh"ӫ7jȚdj\#[W(\ehet*59p6b]J؟t`§-ADVHC ҏ|r-H2"oxJ+ΐvV>E`>×):(e@xFy4C{ `[ЎH&L:@#7[/$|t]Kx]5E:e& ~@jd"C -=ծHU%3D-^ەɘR{+y89t]Fu!4=HG!i$ od]Ǽ&sCdGfG%Yqǜ?hG $SDZ΋].ЃqRȮ\*-&S| f≠]E儮H+:qf?x] ߴъ 1WG! YH8S%;9g;( ? gEɡrW4x50+-Pzq_"gœk—Ϡz'ŧC6FGr~}ժ=sQwEdT4,s.]dvzvDjӓT|c\F dAkAx.2 $e/('tR-KV%v擭ֹvc2~^TЍ!$aCg# XdŁƠ*LY ؋vrf&;Kr01X#'y&}탵^s0(s5Bf+;M}$-F{XbjIFz_lTy4PDcd!LJ>ԧ .b=s8}2)8T0!(k ƛ$?OpyǽL/"IP>OAoHj/kT#´rT ѫН+BugXltyR%V/Da5쎗i=h3ԛ"!iI/ &enIT1fR,ևt[n%ot hG7/In'^_]N^$ކWdF  o )-]|eJUM5 hMϊѹʻꠊ f)z HS\. H dVI۵/l߆'턦=%OyKcR1j+{[ma-FOdKZ.x ldӪ$Z*;uR.WNϼ I"h.K7>4j8SoijpWzJ7T*^g0@Pm9eL!'|V^W*R0f(\$n|!<Ɣt@+8q̲& e,aJ)|cSȬO&\ga0s Ո$=ȵUj|vucO].٩+xqY~#;5EDf+k3HtF3ˆaƞ=sbSP񧓚0J൝׫l,$)bldLY:^ʱX@<`HjsTc1Z c&o4+h-I\%tD @Oagը?] -('a,vKi(2։Gwt&)=h(7 L;sJ__P ^ L~:@LD(Vk pN,eh[d-tIRMKo9:"d١O\p[pr[RϪ45,|F @Rm.m9ԉa?S_SY|}7S;4f#H4F0>ܣ+T(x g2JU lCs(;.f(w5sd\T>]h;D\ao73idw)q)Ur_jFc4 lBiVu.թ6 +\p%gz[w%&Aipv*b ȧø8?ny~'B'ؠ" ng†Rcۛ:啍G4ᰯsR`%B{ԌTktF϶0na %* ;vvc4a'N%po5Uн7{,Ļyf6 $wRLl' L4hɥ93MѵP(m"*G`}'JT ;{8s9:͹$gv*Oϝ#x&>C nplI+w$5Ld# P\ ) ښ!CMR̵u*c5 +>q?AhxPpORtŰ33l\jMN_RV(uu\( D8L~6}>EqR;;'xqkd,W!?nZvщ%dzrۮڹXf̭r 6)]Xm&wҴBO7EI#Z~v*]sg#flź/xRcm`/bwAغ6TIIVUd`dk:eQk5h?l*dd3PSm$8K&FŴz,lms޽ni:'MYMc[/=AA-(6^d "9S'l4x5_ܑw@R6 }>A_ø|l~(]Or \a cdcɢ9Qtiw o.\O:^;e[7é?x5v>;^.ϙU_AҠzpfs{#+Usĝh&A%UQC!\`ѨWCO!'#x+v ٍs8 8{{*SAT}=GȒ7r\8JCk۟H硽@va\GJ2]l5X\Y/C'@ c(FU$%>29@Xo85-7o-}I,vXuHe<4U=bGmJ]-پ~`ZSd7u `Ld$KZ\a Gg'2>HGU(δ֐&C~>-*פ~l#U6jUljDV#pj6P8~޾#==^hWRk\zLT9.'$"RdOr@{sy?1)!;,0WI.? DClC2 \DMWR0&2Tz;Kce⻚5}/Z8S{,yqBc[Ԝz,,=ikw.r߄A,9/Y$^Jԍ { g>ڤIm޿/ɮ5ɉ >hJ ;9=.]-flkE}>*N)b ³9gBR<Ɉmv*Unm5j0H^C d[ KSr>҈~0'yOOv5zVB֜9 jH֊Ft{{We7,cEp;ձ])[ΊԄI7J?sN c0Ү૥ŧ$Dh`rM=%\7u"kBlwEjVz7`6:ݿ19UTO7{S;g`,P cde}Ze?}VV%o8R=)FgX2\_84~2wxT1nr_$PZdVEv"d> zdԫy0Rj{7w8U5rج $Wc,aû3ǢnCq]Vu-ub&Z7޷+գl8<+Pqt;M0"6 /.Ȥz23.NSTV[/aԓkg/B)G72,G3Y;OAtɼ$i Br Z/A0ꚅAow6 CXnݭv uUI{˂j\ᚺmOCL'vZnhEag6ؕ,i܈ݝ bT]S>#+IG^ n2$6xsdg\w`~kTo.+LhSrJZZn4@aEñR @HK۝ bPΘq%N6u^zlG$q\ȏډ1-&62( EdACL)nq\Q`~_-y67}$qv iD[fdϐDL@~}c61j4"yD~Z%rݙ#[v98dY_))u5Mr6nSڍb0Z"MUbYRN[4. ૊@V6 fJp~[/~δ<~H%O#W[v؟༯p۲=\rF׮zV#gA&L {nփ±4:̹#~Cc<Gij}HyN\ء}^Lc "kNwӗvЪΣϗe{w^N4|:Tx 44^ܱOS,"}À#~Kb[e:%a]xMRҝ:*㹙H_^= tw~QE=M#ĺcEw dPaUkժjdr7>)߻,Ou 46EXVHgI# z,KjNRdz 0GW=ι,{ я