summaryrefslogtreecommitdiff
path: root/net/ipv4/tcp_input.c
diff options
context:
space:
mode:
authorYuchung Cheng <ycheng@google.com>2011-03-14 10:57:03 +0000
committerDavid S. Miller <davem@davemloft.net>2011-03-22 19:36:08 -0700
commit67d4120a1793138bc9f4a6eb61d0fc5298ed97e0 (patch)
tree24ffa212d26a6048675a2b7f2c1a4371e62c9f6d /net/ipv4/tcp_input.c
parenta7bff75b087e7a355838a32efe61707cfa73c194 (diff)
downloadlinux-67d4120a1793138bc9f4a6eb61d0fc5298ed97e0.tar.gz
linux-67d4120a1793138bc9f4a6eb61d0fc5298ed97e0.tar.bz2
linux-67d4120a1793138bc9f4a6eb61d0fc5298ed97e0.zip
tcp: avoid cwnd moderation in undo
In the current undo logic, cwnd is moderated after it was restored to the value prior entering fast-recovery. It was moderated first in tcp_try_undo_recovery then again in tcp_complete_cwr. Since the undo indicates recovery was false, these moderations are not necessary. If the undo is triggered when most of the outstanding data have been acknowledged, the (restored) cwnd is falsely pulled down to a small value. This patch removes these cwnd moderations if cwnd is undone a) during fast-recovery b) by receiving DSACKs past fast-recovery Signed-off-by: Yuchung Cheng <ycheng@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/tcp_input.c')
-rw-r--r--net/ipv4/tcp_input.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index da782e7ab16d..e72af7e31d1c 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -2659,7 +2659,7 @@ static void DBGUNDO(struct sock *sk, const char *msg)
#define DBGUNDO(x...) do { } while (0)
#endif
-static void tcp_undo_cwr(struct sock *sk, const int undo)
+static void tcp_undo_cwr(struct sock *sk, const int undo_ssthresh)
{
struct tcp_sock *tp = tcp_sk(sk);
@@ -2671,14 +2671,13 @@ static void tcp_undo_cwr(struct sock *sk, const int undo)
else
tp->snd_cwnd = max(tp->snd_cwnd, tp->snd_ssthresh << 1);
- if (undo && tp->prior_ssthresh > tp->snd_ssthresh) {
+ if (undo_ssthresh && tp->prior_ssthresh > tp->snd_ssthresh) {
tp->snd_ssthresh = tp->prior_ssthresh;
TCP_ECN_withdraw_cwr(tp);
}
} else {
tp->snd_cwnd = max(tp->snd_cwnd, tp->snd_ssthresh);
}
- tcp_moderate_cwnd(tp);
tp->snd_cwnd_stamp = tcp_time_stamp;
}
@@ -2822,8 +2821,11 @@ static int tcp_try_undo_loss(struct sock *sk)
static inline void tcp_complete_cwr(struct sock *sk)
{
struct tcp_sock *tp = tcp_sk(sk);
- tp->snd_cwnd = min(tp->snd_cwnd, tp->snd_ssthresh);
- tp->snd_cwnd_stamp = tcp_time_stamp;
+ /* Do not moderate cwnd if it's already undone in cwr or recovery */
+ if (tp->undo_marker && tp->snd_cwnd > tp->snd_ssthresh) {
+ tp->snd_cwnd = tp->snd_ssthresh;
+ tp->snd_cwnd_stamp = tcp_time_stamp;
+ }
tcp_ca_event(sk, CA_EVENT_COMPLETE_CWR);
}
9"FI*Hd ݱf1dFQŒ$~=͓ Wщ4Yt 'KDg"%T4D 44PS|Q-LLq1zcU4Q1%X Hd/^\U1E0A+tZOKtyѓ4Шb{3_y`p:*b4VhMI7>y:>K6:w\\sʹJKa(Խ0mVUь+jo-lgXP\n"5ugk.rs>&E&QmUQ_蓞kyrsׅI]a~]3&:1eRs&=ż\2\g;ZV3\+kjm~A3tgڎm{脋ү3Ky(Z9Z,-j ']{M]mQ*]cS}VYM}.L|lV-vWUv<7߉7wuq0 \ky氻&ﮡv]{?z5>1{ysMf y篴d</PB2-/ƐQ(ee1TSt^Wdelq9}}I:wOm{tz`5'02jP3ipdoqw,'ܐ9BK1 _ 6x aq5LBziH0t|F|f[t/-x@l>mw7Vc!:%]!qʩ5`p>Dw|f?\2ȶE80ij_"4fg[oD*Y;Duz*CC@e!-7q7s3ߦTqi7>&ODa5qd~ua.% $@@ HDPخ> *W)#U"-A#tiQfs,Vրc" DAk6xgZQ GNqWϟ]f%٦2avf`#뇯6>;>WfDDGۼڼi˺Crjt^X [cMv|>&eF uW}T.hL`v;]U]Ѫ|m-݈igUX|e<=Kz3ףC8z/ hL=? KW|_^ VrɊ;}UՄGf-~'Vy)^kyv,u g9N/v[ohxitA XOS/涼f,%w ~0l;4|hh G wcٓaZuY~l~>ο,*0m/­FU{V%[6f0%^X:n%||\#d7.]mz'T)7[a9Lp^ᒱʷW6Vp9 [m_׽[;Ywdҟnx|~>ۡVzWkmxSuJbbs=w|/ ֋f5S>k9l?BOgJuC.wZq}y߿+nnQr}O{ 4+HL5M:(l}h P(L^Wtw ˯ $LQKNLEY85 oZAL6`ioWeSD\2)=I*98*Vjr 3rb̊,񢒎D(ۈdzvI$I2;,JJ. R`U1TmƬEX#xpcDb}UmmU[mڪmwvmղP ݕJK"(m6gוv[jUVmH!$5 ĄmڴkmU6ȣ lzpW,9&I3 F8F3>Re]ۍ2qk7 |LF1Ʈv|hG|Jcf9죌 lh>f! 6@j)In͔JP9v̫ZQƜ VK̟ݒ}3g7Nm&Hnx*i=pjiUUU$I$,gV|']s6r@PMT "ߟ߆:e ~Xi1/27=h[IcZm(+@9g` ?۷p:/x`(2XDA I"D0 0K mQQt}M8?\bM|S_~_. 'Y0D]>|Xq@aLmi9 H@4hqDFJc\>S?>ڱ@5 c|{CZM[A@ @@=̡WWw~co#'QT\ #aǾnz p?j\VFN[V/oghg!T`tX[)._8W4;/SƦ4 8?ؼnA}=tylՋ_Yqa\ХY j$~ws:)R4mQ k)QB0o ?cP?tXaLY}6wP91¿~:`aɽ]tƎ(hALǎy;mq]/K>`4BBr-T2 Lm4ow0co|5rN GɾB'%(C3n "b u}E`}gN fDžԔڀku,U|nomuA>!Z %B+}=i0&(fcsY|ߋ7]D&ӟvթ7*?6t,Bc BBũO=Pӳ.9Rء WP$I#cݺLfIA,^l`E6=ow>F pOe߼{GH "+GN~yGH͹~`J33>nϞy~Vt/!T c2$ _v.lEA5 Aԭ3|}j:uT{8|/Ўv) 6xH RP*X`.K-a! |&.k89^[DjSoQ62Ki ti/{| H#47H R/"_ GØoW.Wtl!O˯ۍnF7؄R}U*{Ё*;z~~Y Fwv$z uˇ|3+2= 2OnА!e(gtA1ڸ5up d9*^d#k{߫a}i@Z&苁~":":rkkg`-#,_,vi޿eϙ2 vm:3 MXz(JOI.pO"TZy^a~O b&e=GCʫ>~T.2SaAW8]kvQ{x ZG6](vOIeeEo9d0ڒ ʈ1(Z)G57O0bZnwH_<[HO6։ͺ!^@"ٳn4H u0""G*D `QjӳkMoão?h3Ɖ?[ߓ&D@ tnk5}_R> ^yͤ}[FsQm27`:oEp0Ԩ!:x%-K zw-/Mv?Nr~ ͠?'Dlt*%/5HA[vvÆVr+LBdS.`a#lq! Ɂ6_6 +`sU!|nO1}>q3;■=R֎[ QN1曘l_\քǷ]9y:KIQB 5O`k T\> 4E,P@8 aagϗiPZZgtYyff`h@]"6=т6~wDۍ3Fe/8r65P:,,: ID%Ӻh:+<% 8&-&ϴވ0R1.FĚ پyJw&M/h}ф 5vfgbQ7K涚c]CK(x#,;3@S7 Z$8WkPL;㦑"-*)ׁ2vh\Q0dvO!.WbVQ3 4||Vs#l6:ym֟/_Ou݆nYy9C,~nUS[ |9 d&Eueap#,-sjӇi#29 #,87\,P\;2_ʮOQ9{%!zx3A]r!f T7YZu;Y(ܐa;lvt0yᷴX*qEǗ€ ʨ<&7aeC'6ߦ65mzs_1=Smo%]LvWJa:[+vc;Nrk3^=\^jv[F:uK(lA@I '>mk>(s\eE<ofh7'&;,_˷^eۭAYKkW~vݥX HB݃^J1;~wfFZIރ&we6Ξ pzs6c A 랉h<1:;2۔׃OÞ.v-4uFvŃ3A8ORƟ?G^G.6Ljuֶ髨5_V|a1W7kÛ(9_>XuJkFٝ:m%Є3;%KԷn"Ӣ>qC[|x`ho`Μ󉎗 39Q^rzyØd|qYHeه!'И3}ɞ,q㇌rcs ;[K['N{ {ql|Dz0qgPLϐ"{Ѭ8H4={\4Sr0h]؁w{bg:)~E,_P$ ޱ$9dKO+?kM5sȄjޔv^}:goZlF }ivhZoYWQ[ס8g.wJυ901N :4Qlxi2{ CH,b~;t?u\t7I!}^,)4m ^Bt")Q<F_sSq^ꪐH`%B Kbś5 317FI?*-_q+t9ytIJ( 6sXU PyyooD?g=n}W]yv v>7 ',.ma+z3OX;j2y Gbݥ>Ɂ}>FgOУ]p#^a[݃_@pùo;PnY a>bG!T>0:?T~gg X;7fƁ#B>r!dVpp%B{pCL6W(pUVϜH }B6TO⋄ty*ͯ BǦSd.ѷÅפQxEPCf,Ή7I%okTxkm,U }Nbe.•(((t]*%u3嫉XJ0!Uՠ)b f+ޭ}SnV(=JKf oEBE'L?x9d04=C-2/ Qt:1 pw^Ύ=s k^IWwv/2ґC˯zS #{Hü{*l0qy|ouJ㕮>^Y/7bpu߭|<ѻG^,#<k.U9ٞz/ǡ y΂nAi[)G'js9s"(1ה^Wx͙|E sBGa\ P$<-wh;f)(VI jo˙R['rD `ذh8G']!}oR{Ғ4_Qf?]u׫KwoH=Pv@ ׇ&4=.F趹KD#ե%BgD:X `:o %j*CC)_zZ=>-$<1eK◔y^Vz^B=R^+?c?Rq-7;df`hǺ.8q?(J;6H *:eͻf==ue~GGӌYGBǻA;\Bi F4YU't Η0NcSo@Rҵ6(; ѠHGX/V Q@KB9H>g;w>;ǚC jo-qG"f1g;HZO<# >o[?J>\jA2é3tڜ`=}є{j9w_)rlF(ogϹB 7m*3%L(@8:*efdR'QLF !I{t~jlvTĠ$&GiOYhktZnݡS/7aURerfaV^#7IO?^."OöOO7 ;lQTzt&Uގ Di5>b:*AvD ݏP;y9LJ[UchD PyܦQ@^B=_7U nzC\=,duXҡFtm + #ðڷ//h9~ZԔ/zz !Dё@,9sh^{icx(zAdDN#`dŔ5qgN9nh`?*c kg6@5mA5ύXimGtŧY \u_rK-ơ/LkNwBbQQUWn=Έf)ek㧞&>E`^Z/S 9}Kv葍4]ex/SJ,l)sibX@V@u.m%b}QXJ1;f㋙.(0P]G>luP5/.T[$F>o k wi>~zp^R/b w#`:EZϡƎAy?!R'ͩM9[ C{J"o j E"X95Nu@ܟ x/(*P/;Y}8[/P6T?MdLC CUpku#2;{ɯf38 ^HڕRVpzxjQoz.>J٨~&X2֍%hu*0%C-6F  dԵ:5:OvLns,S&AMdyvf [tçkyS6†y@+|G"V+`sV+0ZPmy ;QfNyL!7sq+URˈzjrNߙkL8D?aΟ/ZBe+) C;iXi|qz=PMߪxh'S^]<)v/:1rSwA-V` mz, +`̶k_EE=`V31F 8'guktx}Hf$ _UY(w0v @[&Buy< -cZP0jBsVu9TLi,W0 ^}'E8H;wF O}"<@ iGT~ClI5 4YSE;\2zQ%"Ҕ=M)釺΁9FJpA}0Tr Ej{=G'bK"v3Y*dE"klMLJ:dptq(GؚRIn}49$ z 8.K(8THPRk:cUМ|]){QأR@XgD;X\$!7[˒ %j(Tl!36L[ J-{ov#k&׻1ߠoWϠ5t ͷD? {v9r[%ηN+w\&zJ:(Dm!u]勾vt FA|`]Jݘ(fa=x0o}rjiھjr6n}'%ڷ UAzhQT=8YfzK8.KS .uy#8j8 9u d"Î#n W~ ü`؍@|5S\OӽYq̠zWQi3i:LmX fi٦X,~j=nyhώu%0鐪f\3(y^v)T\,P68&-T8[/H42F7U#vARn1ACbx\`AERz[+(&l"P/T`]uu5 e?yEs=+bOdaigw4U_=c)H%*uqNN'xk3:wH|spXؓc2G ߞ >;| cQ|Χt* ^Uڔ 2^vĺ+;ګM&71) H@^{;LEToQWr4_T t[QqITCkhz.4QiO哧y@ JwpzTt`nx Ȃo`Ғ`5z N iyKQRL T wp(7[?5#~;?_0mksLr Bo5];Zvqŷo1> q_Q {jm*`hDo._6o蔪/ۿ)(Vp # 9]7SէN(x-%Pєf!t3>գZb.>!1@e>&mjA\K&`_5 0%=/6eƪ x$fIw~!Ui7G`MV8F vuJ!<5L䧋2:,\]m]Ӝ/;~Rאkgq_7%Pzq=yW s8}'aQCӶxDzNᜠ9\w B"ovmnтACDQTvĎd2,ETHK^*[/hc1jz3ulȮ̿7q#ȝQFf\R"/ߠc6a" {Rqak7Tx,UkݴL?AGIJgN y?u=b;Fkk}VZ9{aw̱ :>)]YѓlP,\3@4M.{WlelJj\BP6"i4t.I!O)B%LU"BaJmtLZO}.-K ;UE-VwAmw|iH<+a~Rd:@/^-DMdԕB'i5b4U'Ԗt,Mn/zqS@'ck Z~OpA::&ԛv;m{]d?;:2MKb`Y]Wͪ c4U g'58 |3W}םQdi8UZlWXʕ>H;L:_|) }e0"xvzyH˘q mw`n]eq5tʄp6sRLFtBX*p*Y[E. 3YQa۶v췴wݯ5,@TI/RUUHskʚ4φD6?_0^?{7q%‹cV& S"Ax5 KF$  `BprN\XPqDbWyoŗNEzx a;l`t&_W$-APʄc}16yv+7'2RTw¹!xF&ct9I"t9UʘUw_= nyٜ+u}QqM4й9"sڅ] ,:R1| Rjj?9y(ȫRəC'j"[,L7( 908: ]"v?sqn92YL".ηUOM=ڑnp0F|irp-H7;^Gb!(;.pN3C.BÜ/x8J\|:ۼ[ݥ]OÖ,I #Dάxŷ#@>"|2)Kwpn4$:)f¢D\?+(o7MZ KyDia-\1+% ]IsU2:_9]CNͶ]uC\4 m׮CB4A`!Hfg Ѕ.'TUgBI)aЉj[ҥz$Ӛ0&d(Ta-֦nkW,#58 yxuc s5-j܏N#dyJhaї\fnһ 2vLkGX.GM1tA.S.2iG(faB;H"4M9[ C#YӶoIā$ RB6 .|'|y\# QA$ {D{BgBў?'Kcc )&Ԑ߶2ꕝ! mQPö;C/] ErQ7a~] }JA A]+r*C + Ŗ\ `-Tk#8oPL3v˪4VxӬa׏ըXD]# _Dn0E$̐(Sp"ޒ:O;8cbJlx _Us;-Y]7`XFLv[Wi>Iv8HV1T@V@ݿWj@(^a;Km@$n04 nDqSH)yG$sU_{sgKn0\6^#Fl*P>~W 9.6 > jrW`' icIpgh:@z=xw(P+*EFbB/7g# 6G<-:ɏh >~(%1{="f<̳|Rr"tJ6L=Q^0tz1DC9soқhL@yR"e H[-y!.݋Ga=9`Ɵ}2l׮šs췾"b i]zhm73l8m1t٩ H w;J1M6~w׌ Ʊ U~! |}.RTkHȿD_uލ&2ת_(U_љQHCһNb$=37($ys^R},>a[*9|S9Ǣ`@ O2z[U(6B} ]-uC&}H0Y\RAU wɬ0~=sg'1H⩰xD񇛺dV{oɨB^84ʲ&Mx1^pb_ \ܢ i!~G"oP~[0 `Q.j{h0DN `?Wfj~:*$;R!$! j *vBW'WZ#f!Q 2E G&X?/K6<4,;dVtP*M+rI# B_GZ> }_*aaore8.b1aęrCǗ4;Qi;9t Xڇ>N@0}nug|=_ptn4t`ȧ܃Z`Cu?خ[8 r$pa ;}^[dwsa yğkqda W7VvZP,-è JCk]>q7q{ut~G_Y66лNȭb@z^уS- 'wřGj̗Tm-Qv=PG_ n7v?Ň$083b*_ GoP9\TXp{jzxڱ /$d4q_+baړ ]Rr3k죷'nVϡ+pF_O_:H?C! v̸,'3X9QlQ,Y#뷅^[u\:t*H`x۽*im<@vS~*Vj{Fo>/^OBtytXK%P^џ"~6gBl>,H"+sq¨_kdؔ{QbL1 ]l=_V/IoVT px"O=q6Sq/Ƙ$(W  dn矛Z%aKuA[iX?qxicuiW=5Ϳ$?;ƦM;]Vmt_etɡDh>Mx'2]զmWyθ;l ŜNՐr ,?OS Bl]vlyH08to눁ArA$hd5YBWC͗Rx fu7R?'YfAmi90Dv\ W-:;IP,d$u36%玩 s`"(fO ( ) z.D,/V 櫔IѫMg}۳c9 jbY$>Z<:uT4z@ FUQiA|q(g)M &tzmLsFn', Ӏ> F-;\PHtXeϯ7!rc]69_Sf}#Άn@+M "]YE&wC;7Y!5 rJ|*(lnӉ]פQ*VQd?ۘ' Ҥ%`$>1Xe9w#w@y:kK<41 yBȭʁAt5j ,(`:a `O1KXZ7# "Ѣ ?PUinpV ;)7ؤ(^j17Iڵ-}Iu[uk Id)QE?⒌bUvOOo"|K>[}$%wf!7J)m?#iX5k Rێ'*t Kv8Ğan!K>CtÉg/R)ew=NJ~$w _][dВϰm4ye?sԦ8)4rb6F/DAsi o8*'#ˇř6kݸ!XD ÃkC 0\,=Oե˅xfAd@REE1Rg̢Y?ٰv6 ?>_G3 y+^H"o:pxg *Ӌ -D rGwvx3nKkiHt׺g$}OFclOý/Ugo7!wc =9{uINxծ>d͗_zagqrH=qG@p kx8ImE D{n.)x<<dkKb(C cqa}{~gk)m77IEgv]Bn:!4Dx@th=fR_#CD4G qsLUp* jIY(FH5aZY{V:7Ji4R@D!'lbKaX51EYC9k[#e<,Q.('屧pb^U"$^= 8SSH*2H,JN/q NKT>{m7*pyEڟi7Fa:q0Dht4y6lkŪ/(;+r - 8:d@@/u*XELbqr}?WםO (Mz^ΌX>CP#P ~nC_G|4َË:ƥ$3D9 Ks|T/qcj}ebwDGs{^{p -ڔ*fmujxf@EUث1:㖨ûFP^Q1ѓa+v` thS*0v$DF'K7ZlR&jEa&}O'woϽzr8ۡ /#i]uUz(< eR }3' 'RνyRzt(G\2S֪&l>c[)oLD1R_Et{0W]75S`<s"h& #̘ӎ3oB n㒉Y_`_s[&4=E4oυ8!0p_e6,Y6z\gkA+ =E/L7) JX,%${D D-Lk.?:ǒ"#5sX2)Ŭ.e9Ns } yu yd>Ǿ$uؿO:25eDKғ?繭_1ۭݘx 1ܸySAg%\ 4:~[]mAȼ%1J` ;!=bor0P4tZLa BA(G$AS 4ݟq۝> {Ig80=;cBT{T[tPP3iW,"PLEv'5<z=6Tþlv_'׷<>L!0Ʋܥ8iF{_sљ ݏ9FTxI_ڻUuBӑR+=JfMm`{B0%K%L3H# `4`]>=,Q"Od^ 䯫nG/ ,b8TfsÏ9u)_ֲUnhd<y]10NGk$ҲsF wFQ 讒uOJ\xs~~$+]$+m+3?*a߬mqE9?'U%i1Ѣg9Xrs9!/pCθ>zb\0e~c7p~Opx7 \8/ب f0 /OYw3`"~|5<5:E)jw {wgZVTOb鞕{'7m7ݾxBL:3)Dȣ<᫃㵒l٩9_gC@h%15ߎps7jPgßCe5# AES-DNWNvUIz5]8^\2qľ{|^+> cd ۦqTQj 6JZ@mh o~ݼazq|6PDppg t6A0QtDa6Zps~bTTrC=̱?s)F Bfq{*{).#EҢ<ڀ&RM\}9( PrӦ΃Cin8Q|j]gcN#@sc&Noǵ2iŹi'it,Lg,_6G}͒.YTzXrWkax2#/ɬhgZ2جS(7iN. WIAEI[(!<{N.|Cqk W|bތ^?QfFMeĂЇ'IKN'Zi]v1aool5G9;&)\.z ]|=n״3lb l ̘QHb؉%,mNDmWDD~צ9!U4y@IҰ̂AqGD7q\v;]?''F2Rȫ;1c@߈d1\%'jx__zgYEQ9rK|PMHHٲt?q;=b|죯ĠU&)GҌ'_$Rtv@0HBzaDDU٩PzLb2YGCl:ŃQ.#mlA z3wAR:6OU鍵>iksvXB9X+RqcRKXUv)'耖* \[gBa(RJs Nh!|郟wc㩙E-7t l"(PDԭ64b}@ $Sc[((#aNaCm7X"<|Ջ"1Q级Vϋ@EW[Mak⯊c+r9`H* v7WQz3βz6I%3b.kQ \58DPMmQش7t@wW"bi{!pu&FݴQSqn3yJu>a Ok%цoK.EPAC!7كz@i>-Eib"ߊmVkX$U!ex7%. OY%ь, zXKA(1IN`sK(y*?/[2rb8E#^v%Ҟ6z Y;9Rnҭ'xXaK;a$9s 78̞cbf>wF0 b} ־%jJϗs<\8{ŝ87y8Į2.73TtJ%F~m>ovP*{˸@Τ7ٞXIbkxbQzۺD>5BPOLA8#13yșb2(iKkeb}Iftw\ Nƹ:X?(Na&p/FZ}jЀ+0*&`تp)> *%(9:JD;Ȟ`k LƇXݪ"L;?U %jw8L/թC 44wשr)ii<2v0/T߃ĈdP#7,ĉ׮(pmb,UW090 R9{ ;=|!w3@9swm@G܏$sV2R".޲M}8{ E?dkKTB \ch~uQ4A^L^iX11xZ5벵R(gcLw _'o0mG%B/s9 -^BKX'͚m`/ƖEeݓ'&- el0yWZ V~EMtkyk4^X1\%zzAվ,ʌOy! [tuRB{ۓ1o˻8ٰv0 }݆7S;&FsK"x4XTxGr b^Q}$`ArSj׋/(*PᮌveaП>֩eRo*LM)&1n2gQ!o|V5h֩.|s(Pc{Hw5H.OTI|&9,Z?e{=<4;xC,F*`QdcDo/;.x_&R!썢j1M3=? 5!T..b !G2HC!3۫!#H\b,=~8hP^r\`>iUʲfPPڷJ"GC_tGkg~9q%LvxScjv7F5C- sHS獕nHl,HwDD,C-^L0wx?ηi^5kx5Ҵ琋rK@oرض2S?#cv *T9V#u| l9o| xڂůȺm.G,X\PӠcMm |*5}|wZyNv)ഖ0vPtJ7U@N`-{H]yP?#G)( rRxCdv(BB]ٻ(<ԓsI#Ma.y;?U1NsacEoYäp3=uapLFr~؜wnW3=:VƶHuДw-&q%(T2MηwzOQv"]! RF `Oy<>!DӫtC;D?g\r#gh|+ClE hXcU_c&}sDB3LB'(BuX#>!4ѹ*@= IUhdPr,dcuOJZO_wgp] ZV{md[3`[T#֯ǥEڵ(#hlA597\7՞pv I',k؎ciBL4͉O'%$,Z n߸Rfzh{ bI%8g m{"!z$`8#y2"l{j0߸y{~ïoFNG()/q)7 /FuomA1( GwG F/!D6ɧMQmf_2 9S~3# 8뉴Żqd#R𶴼`F&ܮ ^$G^&+Q lF蛎)R UYHeٷ/I|! 9;}f=0QBIcq BFhp*.W;Cө)hЎOݙi~;9k{p_ƚga;ölDc[3C]v11.^omBĢ B/aמ`ӽVu>Zu33jbg;IH+ތ؎F[<@&nѣ_G q!=OR5~@.ޢVAެBk@ :C%210rQiESL:pbchh1!ڰC.ԤX/^' ^dt# ݙ3._~yCJŸQGpxxUR+R8Iy\D˜mh'݄@#+TyǑk#Sl30>Ac8[V󷸅iM+@F^43,\AjF jh?ӆs/n++c R+k#'F]b ܨ^FO-l0)0P(d3G,rPD:BmuZ_D~"X7 NXA7G}0QGW3e=yKKv>J S!J +M&1Y:oTZts*Q:LWhޟ_Ƣo\7K;98!}SCd1-j!!AD{N Q@撈xnGGK[}࿙L_.d<2%{iPZ9\{㇦55u?Cs~Y%w$dɫLv)./>Sh>NM_&aKu@zuV=b--˩'~& q ֘JPɱp=!|\j[=l9)y֭bcy26b[R+d8x\+Q{6T7'{κpeP09}w\OsԹQAD.I}ˡΗ0׷1>%%FAb p<5a祑كfY`j~Z6ytoc[Q<4"eV T5"OslМM KV,jηhXT 9ޫø{x|)cp}L{Zt`rFƝ.3[|RD3|=uC b =- 3 dQ)qďI@0s@. csq}tn`,fܐ%AQ= U/=*5 vW<[y]\kPY禥dR;ӰDlB^<8IܠR\0;ڮ$m6\%v9u¨|O#Z=`zBZc,{G5yw`ɚ+e&ht\J6c:9Gq5Bq\:.$˂& TPgzf/zp&4G˂8 Ck_z-l+y#ъ AXS;j"Sdd_n mhj`.w s㧥{#L-{ vߛabJ‰ݿNk9~J+]C'F"ΥWp(DbBӬ`# rEi]ҿe]”44* !jO {>GhW0vGMӆ0e;Nq\i`բxOioHRq,6zk3ìvo}-.d܏nT_1ryg`YtjzD ϑ=3ZlAMC fA1vi+j&%>Uao^waqK'gp[yq輅s/Vf$kfyίu>vk4㧔&X"SU5ng[xEd$ٛcl;Wpw!MhVO=4jR#=o[ל78sbj '\k]?YQͻsjE23و- JQ}߿muo<  &:6^t]?x&&eM*~Ή]n)sKwN,%.-"P4J<;=ȲvL[i9Boclw_3xɶI\BuDgy:kEXv_x5fN #3h4D pOy݆4D 29Υ_:tgYgGK̃ɲwCъ-M}F̙h!*_ibw$V2,lK)kjbRhFb39/"1fM{<. )N;ws -bG;w[e,Mm^sMfӊo-(vfg4K\i.s۾v^N;׎IY"k?Qڣє2ǽ=n!*؍;}}3עsɓ11jVԟe jb]DȲմ 9CBKOd3®ħ@g:G}!c'>n/=cgTkeK˷P"=/ 2@4֪@/~ڳ+<`U *a6ސphS:1WcaDΈizC=>PplXWIvD'c1cq2h%HTR{˓8.;k.&+Kҋ\I"yye9UF9EmG FEFD _:`f WCE@.•"YZ%?k˝G }9̵[;r?7i.J'u/J m'$aDSzE(bN Fo!Օgp]چdO\ګ2Q>"#;ɸDRpmTۏc$Y-dW\ߞ>"^Et쪡c, =DuL3rvj'93F3GKiB?/7K7)W Sc6!c>Ik\',o^*bӀ`R֜rQ5H'OʙVEJ4u MH]K :/?r8jw廏gB+B ()C6_.}we|.H74aԷXt@)&i>i# A= ;"a;!:dX+gg됛2#vɥuQDZٜwgQMV\rQ*ѻ|ߢ"-^?:]p P\C=䣶]! e Uj=Qu[1(%'X;2->5=k:aUDIB|C@AqИ K; 54kPEcAycY,x>ӺoHtU>(m LucAIK.>$CW`G AyC/2`*vh|X;An>aFfeH<` [u.p#Ԙ RMqA kkҹ"vQDi8ʳ)&#EՎn;~Z/=W[͹j߱n+,60p(5_xn擃UC>mLHUa00ۚg!$ 1_9sm:d kuY(Ija&c-lh$]sFCCj"]ܷx%uUHs+@Q;P>74޾F0:3[|+鵲-H zF;u5 DY?7`G f *REciKmhIA\Mk#PrK~xn (U_`CE{N/AF4j: >Oso\kSdH ?_d v K2(96–1sy)\KL 06g g,*Jn'b2.z>>8^\˓|k.yug:ٴ9:5]NI@Q})\UPpвß:D>nݹ=2u^Z%Wy<l9&̗KR/C| M"" QB:?W,lpb_ Lf$'ώ1}_@ lCB9C8;/×hrAut^+.WEulQG^P]3C Vij?1'2 O(Y}?.ξ.?gO#qf%2p!]&"4BPL’H"N:4LF@Dbko~OE5TFmJB}L@(VgDlmӪC0{ Ӣm9y^+"TtU`T_ͳ=}%g#{﯇E *Է?6o6MW2FJo199sE"2άp L$u6V<]Ic>t;TV4ւlF$_8e|%R {Ot%%&j"xL{gz%˺u [XF -4+  sgs}j[MIz.+d Sb=gR{R{O<=25=#ݟkWzoF!ޡ=o^SkCpс@Kg;S?Up⩌H=0N?ŏwvI~Of5|9G]!fk&*7˹.~j(8E`QֿMw}>~؆WC9UB/Te5Kш?N0'}d??p"{ q43%fSs:q 6(K^QzzX+~8ܬG44@>zaY_B 0 Fӵ&/c<@?)#hAJPA;5C ^n~>mraI~R!y% NR)B)Q K`"i,k LOttp ` biH A EaORXMꆑ~@,0?D@_{ʪ5*zr':@_4X;hl7u0,suóݥP.P?GZ.9]xmƼ?cd퓣_ץ|/aX0uJN}Ϯ% N~[VÉgLgܖvQGȚLK0BCHatbnp+GOhDX&k7вjH9`u 1{[1<=޸* @{/<<: M?L'fۿ?? b}fsa? }?/.u\j- +x;en8;W=|[ǐ:ފ7X *9}E_Fߏ*;n/CaӶ~]>\g6]y(1kх#_l4q}2n;|?fA,5~&+ca;.HPClD b?m-mqF#f΢X+*}?zsD9K _[?]a%j,1o 94x-,Ez?/5LV@Z}& ~xQa_;ɥGه~z%=]M~4Kؘ~f }l/'YcDl9rZ!} b^ZF =p@xlwElvw% „j[OWxݻy=n(,ǐrL%K=ŏWs.Z|fsYGћ*oo<_Js{H6aGe."$ťID;R8C$CEAm T΄e> ֽ icᣊ\79(QFhnү\׹`tz0Kwn E &%uGd.wS%MIs^Kzs9H(p67=>h ߄DG0+ `ǎQ'SBTJx9s>SX̫֠Vd>UbN)? KB'omR}gt'Ict@I]gwh¢6Tg k]#Yr s-s|z {V:^-TC(jR%\"޽{5KO֥fFA/nlmXmf%;noȟ/ ;䨕αq_g+5(gQA:6:UƸ?9x31 e8'HIw53/Y2GԱ7Dr}ᴮ6-w2kGsEA>T.C"[}\_w7LcB1V{cJS)^ݼfS77R`5|h\eDQ?O3/$ VF.wEMYW`)>]zznFeL1"j`)Ұ@A4;N''«~<Oߣg /w$nO߾:_WB<]\ 0N; |4ӧI':7o^mǖqQ9uK'=#<zsO^ -3^:=bIʑ gɶuIef?^tv'#\0dBdd.b0GƂ&xASv)];Ԙݜ;̎86<kmn7#7Y2{-@>mz#3y7 8vb8#pT e_F3.Z%Զμl%N{%$`گ1yf!F=tmAdbn7ٶT'o= R+_h0-@_-.u@[!P- \ڃ҂; iT@翫:n/;xqU^?`D!D[Ddfo$"B}޺Q"wQ.S {$̆0:}@6cw= s:neIyx>M!h[yDoDAHNO0M;8v/@JPXz .0߄ԉƕ;# (&'[ 5%5( Yh>jg=XTBp@*(=^.—GT݀ї[\qu4=6/H%BٷtUeoByMv(pݣp6)=,+lљsߗcP1s#K% Vl/*G_Suo_e}%$!gLKwmګA>~}[-OgߙF6/ DWz?+-6`q-={lFqv7f·FѢ[iԾz㓿hK" -Q r}._sSu?CGw(ݶ̴ƽ> 9j9nO _ϧU0}zݘ?>X(n?J~-28\NBg) %cRWPPctNs asm!U<0*.0-~ q?:<yvHXA0Q:8TЃ`A6fھJcޔ8KƎ_cTx@* 2]L z: QGcd)Ih QChhmh놟uK+f8b;Wb?ƾ0wvIi\u^osaӟqm=P@!Avn,м.Q;%rEtBohVްЮsmpx:u8Do2ޗqqR$:eы/?J3SarcE3s]O^ve"5s˕\Dpm.ֲgMˮ5F -f Lˏ:J9U{71ku|Q5*jf Y9  5V]bib{u&AM.^ UJO[& ŝ ] .U$^ƾET⻛d~ R}ږD 2Ts-mscMvk =ҝfFzT[f{;zt˚6EcC`Ԣi3q/v.$AF iDUm͓o0{-HQClP&i"(R.bYWU=-!$u@,}_Mvy6׬zʙwg9TQR0j~vDqD$4h(K)CdEYt9xs abv*k/xUˑԁ#i'_9UN S/E8kdU=F{W"D%-rw❵cUcZ-c5:%A#4.8Bq¬J{>?P H6Mxoʈ mR#5GtPAn`֭ŠVD_V]@%9v |rQLʒL Pe0n.pݎNov^;ؤt]2,9McC4B˼jTKR>_2رNROiA?*'!*r"ۑڥ+7}:1!YfHeb#_%_̱BOڢx؈S6}z.NWm)AWX;벴W{X]v hйVg:-X+̅32aDI`"[㋈p@_f]s[^ =ʑl!! ,@´c_ :am`sX>}/RfIpW{ؙ3~+=ON'aSQq?m1ukb]~+"d,z蔾]o!4z9щO7|X<5 dKF .1*=7%Uw8lO6~G:e D] ^}Ydm7v1a_+Y(-ss?U];`@nZ'"!Kkxa #z: lYw^7W=ߖ(>iuE x%T1?ːoEL0 %w ُ(-lظD@ Ej6`>~zRra:rN Q/ 66|9&VJ( N9Ū4kvLr}g0F~n8Qvl_] .r Q[$\^_b"3,*>Gz3B^n7 "ID(cMpH8]ֻ Y$JHsb#yG Hۂ(Qɘz (<Ȥ޹1l ]> `ҕ\ |:5vzJU.I]-7I ̈%ήx<_f\Ux3 ЯcA°ǜwx8>cpD 6נArw;4yۿ݂ n'>K"D T=QC4GJ XkF1`@02L.T zL0 m&m_ٱyRpBlT:}fBE6OG ڔ=rI3 K#OiǯYޤQ!!Hn䊸XaŨs6d DȂ1烤LV >W'O}=Ntoq!SN%Gq%{I+:lm0R ߞEhgqBY>i 46Hl7\5 f>l9޲uޖ$mr@yx-N;:exA>OKpA @zeځh|߾޻0{b$:8#1uzmx+!1e$@lX~ 21 LAqQ>FnlKbz[Mz0~oLctm 7;]x;To}F?$ ":FI DEKv᪣Ec҃=v oҦUv&PC+3J); [Br3>Å֔/ry eXkw $#ܠKD#j6V l5 ٓ2Q, e߷+T(u. wyIxуkk)+NĤVS3ZI8S]dYy'xB2ޜ?iGKq諎8YYpKwBw:L݁gOmݔ$O}lRk@yDU[prmk K$z^c3PS PDsXtEMEL2Ur=ꗨVUJ.05ݜ]o#`\Q!t !0.>Z8ݻ.wϢ=0寷KϮK03&9;tAYIg5[} 3I-?G C{k'rSOb;L hu{4xK.wXɯ9iKxBB{!Ԑؒ;m6pmD3أf"/}"S^11,Upkю%NL!U,+j m#C589, &"LkW6*]%7y@wu'wi=r8P (gᰍ!ocR*JyÉA aWG4RK/'z͚ymzݽUK-o2ts"A zN@3m %}n*Yh~Tmm rN~_~ԡkǦ'lݧ\SҼa궒6KsWT{Pd!Jl?~d:Z2fS台g4>o4QmPL*_j !Ⱦ5orkr )'֏H+?=~oHm,Xmڱ2 rq(}J)wSa:w@O<7PnC  '_mo>qVfy4^ceid~7~"VSO޿9y<1C/ |zPsoCr" u(Dt7GɄX+ CpTCpo.^I.?YU=vd"2 -G1EcZ}5_rx6L[ gf oMzۀ4MC!T\7_P~n1.X/ Cr9Mj O3'V!KCl xoI @PN5֪8o^dD%$(BJ&J@*(j(j)((F(J켛}*}:zο/&÷@ײv2d$D,z{|~}o/pC0ܾV;Nen*z0 kgƺ x:hM2-)vz.ǚP!pxN?F( kWT~MSۯ+$Z+ٰRP'59 E邦TDAucu a|hTvlDHf>JHF"=@6xϫz6xVsgg[ބi3$"PYgj)kj.mrKC[وyW㎤ A.,G3 ]>kIK(3绢, U'>_1=_>2vz_}&*X{fF]>aëgRx͞aؔCo3F6$lᗱMXk3 w狱y<2}r IWW%h'^#€/DƼ$vAO>p Q HCE9ޯUhf@& q'lgէxfzn~z&S(ooWi4V9M3pvɠR.O[XSxJ$,dio!  -1wo|₇H}-+H!M( R"#EI 4!Pa"H B+0u]."%]!M^ԋҬ@@BXZ!r"k`f^`CA%I?]hKdR Q'pa=zimc>I3aewad$.zB=A*zmTշ 25ջgN9$@ ۯa_.z#9ZIBx#N=5LW*q}S~_A:]b0OрMǩ d{>!W?Ѥ;Hl!gSm^Ҥ8K?Nt` ՔC%-qQXWBI7oZ>{?џ$$ۺ/=dmIu7]gpq*8`s ioCԠ?.gdpGz?[|@ h&!4J@K@d8cގD+inY3h. $6<]SokbIXpZI4s6 ቶ~v(?sݍe 5Pn T+5~ ">䲏Z].t-T6['~:V`0Y#R# Wo7?yHwe[;3DnWAաCw>4+LQJit kYmtA((߽Gؖ-sYBREl e/i@.qأ(G@mUzH #nT+.jU) /tDžoBDr >E]evDpn ]'di +%,@aܜ{nFffDO Aqm{ѽ!(^:Vg 1G7 @"V.en0 ʰyB@'re(b-V*h;v72tm:+\V27Z&[chw2bZlg'1ֹ304b^J27IS=Nɩ;?GU5Qܿ!*|ׯ_s&xOF_s“0?{F|hsZcIm e;azof%`\FzKK7]X W^ywrmlAn {won;>e埐eçƽ<9/zv$(CUV!'5*䘷StrbuQlD:96$HLBB.?=D$;ҎGC3 /kC0gf\f8 !{ /tB|@BH r:dgw~[sI0Fk%{]w={}0zzG'gOU6%U.7E`L}aoz`di(z~u݇;_g0c?zTF{431UI69=v)?ׯabv{0yP5>Y}ETd۸[# adJr:ƾ|} =o_r70sqr'q "3@莳(iIF J*i/yP1sqWd&EIoAU{?ܫB* KEa _"#x\Acb /@ֹNĒIkOzEfB~1мT+@_1{#XʶT aiNo$6+~#.b*j02HMbEqEW~仟r&?bl;Y@ME J,H|ZW/Olu|0|'>'kȋcXqr|>b+U @S7ڣ ҷ;?3ctiLf7SP#Zd)N2RPMu EaxJ03l{+Zw5T@X#.a̷5u/a{3|u"5XrgBvP\Hn9%agȲ= PPW..!oی^!]2Q i^Mo(AB AGRrtBȿ&22G\Zh.?1ꃁ̠"P TP]J4њv'{vmtvH?=s<1")+e;HÚV[4܍5ed}?;phGF%eM/ts+lsIh@ ~-gȮGςÿ!ߧY9v6J[&_x쫄!!SXoim @ N 5565~͆Y?B<~w;msNǬlYLSÙ[G#% K8 =~vٌzđbARB|/u٦eZRLicF|xm)$au335<(đnδ}N-ovtAQbLM絮#+qG10'o)jt^H~w3X ^-pzQ]  & ~&:X2a7#Ml@'*?w/̺\vv"""$i*=U{7ߝuFJ6PBޣ C|CHCsį'D?[~"o =֋<뚯<$0aق<#{<Jh\S#in4^'?&b%!#)@oǿEm+} L |ϰAL4l~2TL HR]{3RD O5<FD\}> X?< }z >zG^ xF|Ha"kc5>vkiyPL!7snJ&ªW^ k~v1OHSJC` J!jE  ‰W2oj"J`mUT."=~Bg, %=vbۇJqhcFC&ghgDim"PKX P:yݤ@3Z*`s {+ӫ&QBlkǞFl:Vwn.33_{{J@c"?qRG:4 lxtxSwElz6A . T+Uq2!X8XāRc(G:2cuҿwnr lBiK X$ 7b>E0T"?>nG t- D].Ue\ yo@#0O<`4)rѿo=?L\93a)fffjwˬ]K"nbb"_^S~>춇 AN9|7ٿL!0p<-F'܏?iCJH(dމ(ɼ!(#g[c >VCM\#rx~6ٚ|gvBX0vɻ>sFϺR6VW+ Iba81PEg;O:X:r/x0əxt[kY''geZP"& VzFb+n߲= C&^\ "b2{gp ɶ% ~mXCL,LOwxY3%;A}s>`ïlĊɒ\ 0׋Lu&&IX5d?g`J,,A| {șA[/䀏4=e^Z<=IUMQ(b`Q媟šufHys,d q.$[E-[Fu=UW_ѓfyFl\1"k6H[8zx>sDDDE۔\ JTu)FM;^܈Ѓn&ÜRyϙ+GlTܾe-^UjGه _~Ŧ`:z$#)xE.`,Dķ#`3FXM4MЛ{{0&{?O:n6庳DMKY2]Zu; #`;@LbzljxB L < OΟwɥ7s-ԷmP$-3X*V/W2wCl?E8(l TuM^蟬0D@QlGEgw\\*o89Fu~]JUx{]-V҄\3nfѭ /wTNA? Ű+ѕЮ0VζYܷƱBJdXb\W/]cO05jgٳÛ~Zt,7kqse`q콚