From 169ca5cdc54c7fcdc333f2d4f7a3c624e329c067 Mon Sep 17 00:00:00 2001 From: Yu-Ju Hong Date: Sat, 15 Aug 2015 17:36:04 -0700 Subject: [PATCH] Proposal: add a runtime pod cache in kubelet --- docs/proposals/pod-cache.png | Bin 0 -> 51394 bytes docs/proposals/runtime-pod-cache.md | 202 ++++++++++++++++++++++++++++ 2 files changed, 202 insertions(+) create mode 100644 docs/proposals/pod-cache.png create mode 100644 docs/proposals/runtime-pod-cache.md diff --git a/docs/proposals/pod-cache.png b/docs/proposals/pod-cache.png new file mode 100644 index 0000000000000000000000000000000000000000..dee86c40cb037f6517376d03f67be978bee93975 GIT binary patch literal 51394 zcmdqJg?~nGjzkyD2+%c-AH$LORA)_AfO;1Al)D!UDDm%((&7P z&Uv2meE);@^|Spj?0xV1-h16EuC=Z;M5rjq;$V?uAt52*Je8ADLqbC3Kte(u1%rSy zSpIp*zz<|6HCYLy;(p3a;Ip=+x|Xw+qJp5YoejI8iJg%tySt4&FbWAt*j*6#Xk+SZ zNb7E6ZR;fHE<*ojgdp(w{xpo9_RkP!D-n7vMHN~}J4aJm9(HbaIK3zqEiJ9EqluZI znv~4nw*$Y4&|5e=+Y7>AZfGpR7zak9eJk#&pF|R?^&H{g~OwMis@2vp>NSVt`d=M_8=AwX2WK5lKKS{ zY@O2fKvZ0gEqu@9Gw) zhCe{<9h>I+%JBv~935|0(%z?u%{Pp}yu`fjPMZdf)6#B)t_F;w(!k;V|NlQs@B-dV z+co)!tcY;e(5jVto$d%Uk7Vm5&$v$8{0gTC@D{o8Am9tB4KF8eC1s03|Qzj`@F=u*0SXYXrCzufEFYWlkn(zS+IVjA%m zs`Rud|2^U!B17!g4HjnBepbuMT6NVa6M-UoybRy)lXqtI|Y;-l1VaSrcJof3@6Lh zjdSK=*dfvgG%4VqO#;s(%BQR9JHBgHKiNXOdNs{>&Xw~UUyw)N=l6?P|Cuo1RL_%* zAq>=+PeVuR&&joLLMX$B*VW)GlAdhtxWU56ld;t;Cpjzf+?LFoqv9`#`pCrnxR)eC zpNtHR5m-3s^;b$S--z>GqX^RgA5rl@$okSM~o{GJXta7tY<6rco&3@1dddW%&pWh675bA zV?14?_*?tZ0jswXHB#8EjE+LIn)rEpdL5E53+vJ*JBDa4&9s)~Q}DNpNc^#KoK4@L zy!chRjGiW3arWiQk1RBch6_W^HzZn4{M6w zHK*KK5UKDn5_YK`0Ete!LR%fDXJKmzM1MqoFMVM^`keb21=4(&g9~JMpM$s^o1+7E zputSyggi2D1df{ngpMAqz)NQXAPjHakh>QMi)!MqAaBGZ>bV55;ACq^9#5RdJTFJL zw|^wj^$X@E(ZNYMk;>4=xr@g*scTyTM6a|%DnRF&bkc*1qKSvhUg+MHg&<$XrPwyN z-OZmzai@a8@}Dc0FNLqoz&P(0<4_^8j&eeQN0nZd`3vJqmrMuPZ#86S2#3V&2%I$} z$+MfU_^1sX=L0L?sKi_*l7pg^k%YgpqkgC?6wO$7DRjMPZwR^KdINQ6pjztwEIlfk zOA|0~T0U@9upDwB955ku1|(lF7pH^rkpf%)iScGJfjSoMx2X-CAvM;F*81SorOHK_;Uk61E$*CG4va+z|xdl;Rpz4zOD}I-ID6@u=Xlx*h7x^;B1`N~}|^ z1j?UXg^OXQ0oLbKEl-DmZ2o?wnkhPXZf|1P+k}gSde=qxDv2qBJEU1MEyEIm7 zus(R*UiL{De?5`>;+-+*Rdp}ev?y@xQAG$ehR&8R@x4Q=5(C2mKN)-b!dY4a)}5qr zK&Tcpmq22?n2p&EwL3GC^AUYLzTl_0XC-?Sy}|Hp%aDF_y(_9={$;g=SVr%vJS5x z%mMWsi$=|V_H9@Za8$LJh1bED21wR^o3b4gWG5OREQ=OIIXK8+uY`Y1ImkBM9O*pg zJyuRV53>Q@6gTKMu55Csv>&9kMt1G#enm0Ls1K&)_c(Z%yBn1izAxwvH~S-Tl8>T$ zv5RwwI0urrt2~Pzd5IU%y?>v-w>UtjIvd)7$mDI*`mbi~zH0ue>o+Nr>l4NOAQRRwV4!n&6g1SgZhBYltXVHugS>_eD zP*5LbL}|_O7T8{kS;dO=&@Sd&<7T zdA36P73GFm+ApUe|B;py{rD}7xnSBRa!KiWn2m9r3c-H_6-xtjhtal4 zJlsJ`|4%a>Uhx(NF*0>?Oe}KxrCKr7PvcPGS-2k?7zV@St3^?trbyoH7GZ7a;eG=# zF1hPlX!S`na9tXQ#wk}Poul9cAC%aEIxOuM+30k>{t#ymq-m?^JC-}3+I;}l5Q3?}{Rm8peJ}<9N z(?wBxa@khDt3;AR7>$w}@*TsbCY=9{RRvlcB<$XM_&`p}OX5KlUIh!P2UEGur8<+) z-FHp2q^rYR9%?p4T`Xlf<4o+&L2!YP7@5-}>60u{jeLDfOV+D6STWw#ZQ$Vn%>D2O zIP=tb8h>5y!_#!>@O6ig;&j%+R?UpS{~|U3y~X`Pdj_|l@uxlsIEfm5zr_FhBQb#{ z;q-INK6i{+^bB8Boli_9>WHAoat`JvMM|)kp331xce`#{Lzkrwza9LDq6>a=>)^8n z5$Dy26iEDUgaYE!J6e3W(L3g++W&D5wUPd(?arhgzgYh9f`6gN!N)*|7YtEM0q!bG zK;qr!%i48`8?)XGnqvFkk^e@W{~!7s7ma2+&>>UU2kgL4f{n>?bH-=M-dDR-XZL7s zGFiv6`(H1rE5A@#{8j0Dgg@8>1(}RJ2mrIHl43+tIlTYPV-WOcChZR;i4^HIKsc4|MzsF-Xx805T@bX4L%~)cyr+@dIp`0CzZT7eM}h#2E)hhH^v4#{MDM|Dn{N;?_|1pi3B=C%#b3Yf+Q&G{&&m-5XzdfI zd7hlHMkrg0p5Gla-=1Aty`k2AzyN4s7#cUx`!GITT@qlnfEchnQcR1fOT`)Zhvz`t za86U$Q}3Ot&y@?Nb<2XDxDWos&~IRiM~_J8K1CvM2?rGvaOXxxT`V~>VxJIex=q_u z*);ptacFUaGDQqFxan_7hkr0dtS{>`h={cuIsZ%6iAbQ#Uu5BxL!^WR2Sf`BkW6g5 zr}1J>4gbOZWGEtBd5o{a|A+y2`)Y?}87gwsF#WE&2DaD#I0Yif zIQ(L|p9`vhK<$Mz3J45yQ<8HqPkDtq=B93ig2NFXFuTH^avA(3rb#Jan04)|$w`ey zeegc?OLk_uh)N+~lAHnlFbyx7bpM#c z{xc@T4QaqAJ|Hdfm?xjSFo{22F7ba*L8Iy~YIhus%&(VQEoC!(OGw}Tjcqh`^;tH4 ztX}<18LVXw;+88e)gvWDjvA&*@wB5nAJ6gDlwb(?o)H^wGQ3V8fbDfo8}Cv^_Rp@9BB5 zAE|=~Q$fBJL3kMOc!w(QlsM52?w;;PJOyPPz4@bNCQQhbrHmTpkv8X|>{h1CN5&f1|6nDDfCsuu5qLl! zoN`wET*h4_xT7mcPQTmN-R0X{r$x&LEBxdHwI z;g)GVs9ab<%Hd#`)4WH&$_+f$zWo;Vz5rszf zQJh&cnN)CMa*b5(x7(ch)6Ik$=k*+sp11wC33Z;9an;V5`T_8>VJT-|Ripo|ib%u< zPZPy4+Gub|Hxo7^u8GI?!-kqwyKqE2PZr)K6Xw2vLmDzczl-&od{H`(jvY&ta{|j5 z*Xay#?O=DG^GQken-02PhE%7-r4QPL_@UWMMtkzndOt9tTKa&Wg{F%-++8oXoiiI2 z_-yc7x!{KWBSW1XS=7Z8^zD!TF%7^V9RvNNlGCcAJ*Fc{)JBhU#V~-9$gfC? z9&$2jV*_=FboD#Y;`NpZceL@O`pV(vh|XDmH5(NInW$(9pJ;fZFH3T<)qj0h7Y52x zytyOfcbCa2Xz(mQB(}oiD%?<1a}9`@3cF$4d>8zL9_Ms+jN)?@ zUKvqxHoDFhvMG|+e8nEL2m)s}&u7*>TJb^{znjRr-JKZj=;Eg_F7~B$JL8f--R@nS zas__iflt)lR>CbwL;=-clO?40nNV(D?2OIoOWIE>nEo|SljtN-L1$$kU!0dOlf127 z1OonB^gaf}x{0`5>O{b%qRDoeP*E4Q<9=+s#B8K2JXr10(=(zhCPmm`TtA4ri>{7{ zOOY#SOFChH(&~pJ*rqzBx6vDN_q^R#^bB{L!fmL^ zYP)3%s>n)%%8~n5cpSX?%*2FpNZ5S*-T_rXxX0CRx;X$<(bUwmUiYmY6L|F3uawJ6 z&s)2v(?z7WB~%?w8p{{y7N5%g#xMvH!Ufn5vWjVj@I%HfxAKD%xSoD6ji+qXHu=&z z?JcK^@CD(mmmFRyUCS^>qtu8#wZ4qyd>e{i84K)PEHBRSx~WLDD289~i0nj$Qs}uQ zxE!Zg#4G#x+KF&xr=(r5&e`Un59je)>eFS^B{T8Pd9i#_=A$vjBXs~;R~bDZL>AWJ zo7az5-H&h>uu@dS=@@g|e2D0{oX@&L1LD~vg4P-ykAtH@A>B;ST!cDqbJoG*$FWjQ z`4Y6|ys=Cw#{PY24xd_H$A6@q9N(5tGT_`e+}y)-kfoKUXPJW7b4eqex^mX_h9gNadMudy`48nYhOe#o2(= zZsv9l@hdiPN-6aj&E?t{D_gM}zpjzsZwCjufzl@t5rOH&(>DQmI{@5IGxpe;R{0| z5)N5!?)V^p#DJ&SUEKOJdgtmk*}ib&#a1miH_qS8NDcg4+LQzt(vc`}p6De2 z+{}+@?~ln~md!U9#g#Og$f|9m=XKCze zv<{=$-v`bbS!MT|;g5E@J8fQRH$V3Y{^7%i-e63k-i~OBx(dA)kM3bw3If1Ek7m%n zi~k)d32E)udZAqI2L?`iGc{DW#CZK|vC8_W@y*phZ|V#4C(t5?Q}y(##tb&;RP-%8N`KJRhg{XX8y z5G!m{tk>|G+H-@>?_KL38S(+}ai#BTe@zUD<3P`D)x0khs1oC-`E^pconW65dydfR zpP#rQ!a}9H7PThndhu#-YmjO}h0PaZu^zYBBPd56NzQ%3ZQo=M(VGy5jt1RIpBG(W znNXMz_aKC>uDaP|u07=ngoDrM8)ov22RjVAyoN{WHZHcapYM!6*Frl=Xa-zFACa;! z!PpIu;XB>koTcVxcs^mho%m+VdmDr&T6);m*SB`Dp2_Dn?^E>{2IC6}38^e1Vp0lT zHP&X)EUxIOekL!kSfbaUpwelYMg9B6%Tx>RthCy*@i5vhnJLqII8DrN&Xg;OUAOF_ z(suUsh}J;E*_@Td$)Lks-}&Kk-{wfZ;(VizjSlb45Xao4bJeKEAFBw6Cu~N##m~h# z;x$17o%O5K1imQ>kT6EJk%HDcmMtz_BR{ zk>5MQ64sxDKgQEH8t>Rov{3$Yz4a{0)hl!M_~rBGLGL|; zT)E8qSJtz4BVmo;$6sH5@9tO(3#zmlFAiBEW!1tTHuaX4mZoqq8_1Zg^g7$CteW#I z{FqD`&uS;!#I=1~MurxVwdrQ&W+mC*Sr9CA7TW`PR<< zj4R#6`AV`7^pAs&LuxdT_0TV~yBy))I9ej*pw^Egb&n2sI-#5po?|G!+}@u?TTgn# zSlnjDjn7BW3Oo79iq}uh!Afd)=U7g^7Upg8y_6DSNUoIcu&Yll6ZE62tzJkvg(uYzbA$X*!$J3KD|2Agn_&ws0C`Ga2x2R-P z4BUhAQH@uxD9A@*DFuefQKIsP7AT|f$U)8}O}DjuRi3|JCt2T=n-5ezASTw5{J~gC ziDf3P6aV{0CW_0z0{Wa_Hht{t+{T$Z&n!(Dp=>^lx=bJ-FJ+MopeY4&S@Fb|M)yd03Up@^{PMSFra=w2JCR-Z z;PTDZ3h815f2|jPTIJ}Mrv7frf+cqA_2)#?dXnH+L?wd_*R@7?8u+0i?JSJGyT?tH()ON^P6-;;GPB%}9DP&q#y5aV-N>-{!9 z6G`M;w7xEOS2Md$sIaUDtxUKwOk36?17gX2<)RC1>aH`UC|`@9OB;nuT~TIzOu`ls zqYAfp87WRw0-e_;9at|!a&Z_{qbNcQq+S4brUvF&ITg^i! zkGhsRf1TH|^R%v>9i^P3GJ5Z2<6or?6O=63rT{A9SEz{)xE+%OyqbKsNg=c_r-5vc(%K?uMW+~XLg-g=9PlYwqs?U?dCxXGw+{;U3|9=b zN9b-DEsG)@=)y#IBxf1nGPcE5n4h#zS6PP#II%YO#m_bBj$S>L}9)^Mg?}43{%geOh7O zl#XA*8c`K)3$y-rbRz`C{$d~xQihp8{mQCVAosDRMOZcaoCVvFOQK|KD)lv=3yFH3 zSU4T6JnawtKqu*r8!BSoW{^|glIL;NpKyC~6;@V%)Xj401Jhai;Z|p_5en*CXbHlJ zk>;H!q8X0nYhJbT-dFJPY0%Z^@ScISopqOHnD!)2dYVKGjr^d5w zzAM`k6s9kn{Cs#1g8*2s>|ahgO)DHak-;4d`%w-@kzgRw(ML>W8)y<#Wq9E0cW`@W zJR>^mP=disWaY6hNm|xiI0$0*#_D;!i~=XBC+pd3Az(jy&&nS@$2hL_ zyoMDkRQ9T`>|-%JiViIkZ3Cq4Aw@f6%IOg-quWP_q8ZfrglTB+ScfGOr87xaPf8%Q zv|?9V-$UmaFG*_yYjj+emCTJopG#TMGmx691KWSk4JhL%NQS|pAd2;CShsn=vXsvy6V1AuDu#cIXb*6#J$+6 zo>Bh8R0zrgz})=j<4mx#!orhxm6DGP<2rb5W%1VvEQHT~HfLhJB?8E|xE-VsF1;@t z2&!F|(g(LM$zVMTuaV;7cEL>b?KCe`JDiX<$xPiD#q%O8CvqI|7iw zep(hB(p$n=6oJqK9SC7tjP9P)VK+SrRF?MLVc@zCPlg+H1;G%arFZ#pt_aHFy5v7J z%F=xa!&Y65I3O5&&|VtSB@R4K8si{znGs16q<|F8{@1n|-P?BRTW-LO0S5|NwE%@Y z<9eGG%@*UK#bE&#EP&qmF$(>lG+Jqe2c>Aq16}p>FHilEZtafHXFU}qPP%;kHqLEcU<$FI^d;m8)XU}oR%?sBKBX&$h%A^y91-ZKiS7ES>2=%_FWnhnp z%3p-jo-37*pIjK8r0nyu$egdn90d*_Z78=iC(3hB%V0yPxM88J@`kPTeVaqk5Q#7-(4I5alk1yAnqc0HG##?pr{?XC!f z4w^-?0isXb2ZwX?N5W^X_;b;+X!o_)tgk;=aj2tjc|T(FE#S#|n1bCb+G%f)b2S&a zs*q*mgX%){!`#U^LKHe(7_O6LASX{On!V5J=6Pa8FPY1_OtAuD#cn6OkA5-HNvc z-lNSR5vA7!96W_IUY6w?)TEj5fHFUL(Bao85gjDP{qR(Vm{TwhB|1EC7wjV-fBuHQ zAHPG8|07s1UOtW@PKs*V@J9GqeR^99>CHjP;?XxLrBBuX&cE0_SAzT>70e9ZcWM1Wo`AQ znnbesXtJN=CQK%$f_jnTkLimCjG>ccqcvEYpw`PT_9FO}+^$#+o_So5Y$5+@%^;Y* zj7M9X>m1S6cPG796KlH#%cf&}qHUS}M={@fvcP~+$Y3b73%6zpTy5-0%*QfQ!slW2 ztJ-660dv#gskqs5qFp%PV@27iE4VOqz%`o77=6sewhC!a9o8mhdc(n$qy~d8-xjl} zh{Xt9Z$0E>&M(+R5;c64x|EdQHY-MZ(1WTBB{XrG>3R4zXS_B(UF1hV%kEp8PME_H z8TidfMvrT2k@Takja(Ws-oRD}+j*Mrw3;pjSUr}V5WECue(atzVFT!`ieU3Mhemd2 zpfD@=gmHDd%!YC;Cih#9S{BU2So3|hcAlKQ&V>-y&9O+)UNJ3IKxi>I`^tV`~%Cy030)>v_((|^plB!?YYHWy_z`+GcQRV4-V zn*-3khzL0>`Zz8$*Bqu7alFd5ZAnZ`75Q!JhcP7#-VpkvE3~x3G9+EL^_$MDs3u=0 zq-v za`&J*%jm$yc;iSPr-7n1^&(=OZAXM7d^rjp9TW;q$i(Yt0iQ$eMy`jrRjSR`3dDx7 zM+)EtIh3F_MzmLlcedcD)a-(CN;MhOH%~?**Rtd#BY&sGWNG&Dvp!}yPK?LtT;-6% zUQU+@U%^g~dbb`7JF$n;4hV8dpF3#6N|vVw|0^Jh9)Su%y&ym5vCv9yatLo)Y}#Xvy3>4X_Uv4&m^T?? zpdmVNXrv2C6nlChTKYz@AXcVB6f8#Zo(wNyjo;R2_PaQvW~>!OahQa;iwfSj$lH!j zPC6ufq@W>41tWhs5nbxN244fkrE^PWRulmxB>lAM!%y1K?9^8PIq~EQ^PnQna-&07 z4s%Z=DVnF*t*2uOhb#vNUQQF{8Hb5>pit?h49R$EJGg#4X={cO`Ws(3DXk%bcQD^j zbz_qo<5GJ?S3d-q3&oK9$@f7YYTpem|BAy5y)f#j$?*2uuAUqCSL7c?u$T^FbL(yc z{$0$C(%9&(JI*DK?ny0QYJxmH1}Pw}(kh|2=9{F|ssX))U5+T{OV(#0-Rz4!S3#`% zA3o41`FHfNcA-P!svVN$U6jO4xibRh$g~{ZJ6as94Rj+va^8&u-yC8^BEEnPo@!EM zw1u4LrX)A;2dx)lj_1&!vuB7dnJ+^#A`J#D4hnbI&@=SOcYQmTUS><>U*WQYU+w=-SE6iIp8=sDIc}~|A5CeXbfx-iHAMr27 zu84>MVmw?C!Nu_n`cx9lF#^HRsCD;1zrSf+FvN|VQ$!z$1fC95k)ANK@>?;x#T((pUkpkMfbQP*9^anH!Hj70VIn{qY+D#&pk9Bg)^ z9i|`5SxK)<4sR^-B}RAP3_IV8_sFe~?Te;ii(2oAo- zEB%t1^l^A-=jN%vdugs zlc*7K%)gz3Yl5B&DkItqiW~DkVC;Idp%gfeQJX*5p({rbbx;>>Uc)1ovn(&LzVx9J zF#`S)tS)XO7=J;yMHzE6u^(Q(%7Ohh5WGSM#BC4vkzcFVkNjcsjaU9nA&5^UqfOu2T8iibY?5R8dP?7)D=hS_1N*OBIDekNfOd9$je2N z>GTM;G|>uM_oPFKmn(+aWcUZKzpbM5ctv1#OW|u8e~4Sm=bS}!8kb#fo_$3h9Qu?f zxES+Lxea#IZE$t{`=q`6@}Ze_jOyfmoL%YN6t=!}>YmHtprw?1(Ef+TL7vv=!Og|t z)ks9+J)uxTH;a}LhVoaHywTPVnPPqqXI z!k0}Wt5~@t-raixwR<4^MeYkFK^Hqp-O$XFuEd?!u5(qqB~eKWvw6tRb#9SCNUP`yVug}gx zmy0*0+h1DL_sVuZ1mD4qnw9%_SmdkPSNg&4Xzt#8$}P)ugr9|}>#e-9rvP>M4|}2y zIN^0n{$+I3sv$k|R}Qr8Paq44i;A=lmoDCeh7pUjR{e&*HJ3kRsxD!=G-ccbz8#fnlRg@D!deyaQ22t2w8F)}%9 zqO=J$sPer984ejajHPsZ)fXbF-|8X*g$J)w7;H%gqY>s$SJ`DwHu`v_O{HsESzB}C ziJZix@Y;M3aM_Aq{Qc$uOYi>e-u?$13SQ^N1@_*bP_nc}P01$g!WS>@#V7-~V*yvm zUsQlP>@oRIMj?~s_F?wc7lkgCp?$U5x+QU)LBVAmvK49$p8xhytu~|?C?wj6UhQx> zEi@yyJtx?_CyegP8Y3Vaa+B`vZfozn+m`h#T$>RuBhKHT&${$+jQ6ckjC{}fh=FbN zM$vf_l9D6|H`p3_*qW8H!{>yG29Z`Jr`wS3Z2 zYIvRJ?=N3NZ?h%CdXqVfB|s3OXV0GXZkIImYjXp&?hKO;x%GecpXXk|`o5}30+}Ue zg8zWKKrpX{ghl=6AmAg8Om)ob4+D8!Bia-OSh36tRSXTEuuuWM!ec3dsr8Mp-)()( z-R)K1h_V=bt!Ik8jcozz~v-j|#CWx9|%yI!t=WPra(e)9$^b?r_PHM9d1ozFM#J@V+AZ{pcV=Iv7Wtu93|)FmeNvIR8%aW-t$@PxRG=DcJSS5d`fVF=8u5`O&Wk@ zF0vQK0=xK_(ZA)4nYbDWbw8D1I+Y8?skf8`F~fnsl=uKXYmufoe;-FOR2rb_Zq6(j z-we=hUkS?n?tHyolD?=}yv^|1x{01n+CWq1ZPV^5_iuuk+r(%<`PbmK8{y;Ba-duma6nR>~Nmi#3y_zZFHCFVh zihWdctcBNSU1**I7|FdoUV``FXeNY@*|4ad=ycQoWpa2}jt5fU(6d&)4$XI4YFuf=|MSjrfYrp@+0CxC)#G?#(aS|ZykYY}1G$$c#nbCtmSR2(um zZ60zPqj}Lbpyu2Ze6}Z~soxCy4VHY>M+PQj%q-fPZOA9HJ^1p;xhm3MCxV^Pk^9=6 z(M^Bdhk##b7WD>j-5{ltAI%@+v#L8yIUq?q2e0S^mibGin%;R37!t%Jvdcp8{GSWB zCm<_@kSduhNEg3?8@$3~c*~{F6IT#(B_R_-3FS08r%r%1T@Tw=26aSn8Sy`tWl3s<-i ziBjm)dOnh$DmHtAcy`}<_*m%yu!nJyXr7)OJt!xS*P}_@=9ef95}Q>XA43wbAYZ!Q zHbEqs$PN#7qTc-WS=1ooiXObPX?LlRDuN0Ys&)tsTDHItG%PVtkZIkkNfO= zN7P@us3~w2J=-ab9-^G?2|}OqyYulnN4nZRy_D)ndTd#pDcB)&k=pW}GH=OmRQ>$w zAmwGi`cj@thWF$XakR4gj;f++#n(Wa8G@8B>yVQG)sh^R_H?0Fo}qQ-_?;6MOuX3E zKf?Ep0<ntqaSz)F@IIPAJTz68%HPE`%ya5TG-rltv{XONoEIxZ$s8`CP{+S zN+VcMSUjpj-pZ;_mz>vbPFM(g#mtG?eF51j%l`D?hIvLC`Bo;u*QhKuFKP-JL01of>i1&4E-VgVk!f;UqAO z1&3pCsp0R}4n`puf3ME4S~c5ugxU0KU}(5b8dX*{ z)lEeYXq#s34Tcd~3R@bn`95?f%ItAFNLh+y-xZAwxUMA*C}IT4u2y#G^db2YCd()5l*Zk8aavIFKUm-jOK#P$nBrzSFh^zt2}l|cj>?^(IvaFk>a-~@Lq#HVPh{j zt`TE=fV)~GDX^{fLa$VDrfUG_v;|7sA2k^6kpHg6JFVe!Nl8^t`S~r$`d-tWuaMQS zc83UZ*o@MN7RJvP^FsHeZ@gQ+yld zmR>41Kl_pU`8D8$UF zxX1#i@)5FmeQ#TmH|BSaWU&x&i#Vn4xS`$^KIxI+_;M%EFV>$7d?CrO*OKa=&7 zymSJ4+5&&8gvkojeX{6PmVBrtlJ+xuB~bEiYY^{^4hot<+<|QPGZTk$c5WSu=3oeE zsYulJDGicTcLaj{egov)p8F60sk}@U!}6yNF1?SdyKgGgASOKq7T(xPX6oH49MK8% zx0gy`$Wgz2{Hov1^%o4viPuld-9g(#MbMXNo3){LYUTW8&d)v-Zf&YB52yXy4O_I1 zGVjf;=}2SE=!k?QrPY7mQm+TVT)X@;Pr!O7pJm|(eR^!+ZNK(OC@RSjvaloLS&ES>fZL z?dFKRcI3bvNniC$;71kT`_wY?Ot*m~z?)VDZP}Ehai?beQ`hzZ=DF>pmLQougHMVb zgGe+H`I9jN@oJ`4Lzy>RTKEIeC((n8GM*WyKcEk)#6nP$*d2go4$QUs;$SYgd;e=; zu@dcvQy%uqSMOJV3T2+mufr7#SWW6vTO~$`C3$CVJeF(yq$mA9(^)sX!R=F zE}BS(uQkhoVskb^fAsBtzEms60HmOn!G#~CX`h4bHS#JdxOd3L4WwS=EViQ*> zI*A-~o{UXRy^j5)_)z~{Ew_YTfH()$YBlJ17ThzK#Gp56+8BLu+78QXQ4249aU4bD z=TuDJ*I&@=2I|RYPU2!sx_$$x`(P#7^v~Y{NJ%lM|A&o4pbbklH;_FR`BVsW?gc0j zO*Hv6E%uydcy2vzTh-}|p(-B-+P$nb*X~=!fVR4+A0@A<`cJlg^)&7;0imE0c5JNe z+j+z8eatspUE=QYz6B=tMQo{ zC!4E_yrYM@bddL}6T*JTAQ0c~h(Ey4sr5%S`=N7jnZNa&9TD(9{}op=NP*J?yOsd+ z_0R-aOJs~MDoZqWmev=Nu27Rb!fW#b-4-5)B%uz984+T z*d9eCGjH0MWVaJ=ke6f4v&ES9cBH`S@0ADl`F#k(1d0v_&C}pCeaxd0A-wBE|z~SCpW*ys=pr=IAd1dO7T#pH6q~B6jyB!GV`>o%fSeJxXjFLeAK+0U5n{prUJFW*souv_@8I2pJ~GLkb`JQ z0jTP4q-*<5y#(+c|9mOcn?TOLIo9`t0qARTey*zeHXga{NljEQ6kd#(CXgNQ&1qf9 zs@;0NaTdr+Md(mFHh*u9bP8W?0c5E}{2HFFawk$Z$|=;_zjAP^j~ zf!Ly4t^4XqxHu5VAc$uq0mToS8y=rKR>?Q=PZMzC6Ix>9WM?@!*fwD+<1Q0E*=xWQ z+)KDP>VfS#mKu;B4>?Ru0(FYkcOD3&^bt&Xg%)%(y~Jkw3qE2VOip6X4}mwZnVoVf z%hbWpHt@VP7{&3BsH+|MktmVXAiL|whqoDWT$m_|CK*z<1=_WO#N=fh9%ofSANPSsb3wN7IV6}ba9&ZIZOHSmHJY%;x6Ro+izLDLa%oeqW>8Z~r=d@P3~T5b#8tk`^f7%5YL z0+m6YlL{3R`DdVu?7n`354a|%GuJ3F!2&0%ZSJ}wj2td}V+9m1I9lwFg^w?&mIM3y znh%IMYcXiN2luoW<#~f*QjcpeGt0$W+R$`veQz#Ppj>9brk?`Zv?((*#?XtQL9eLC zWgh2?qxum>kv86$@}fK7gioW1kc&j)3lPY$APYN{EI^Bzk2}|oS1UB~TJPy~T4l^& zo4CH`psh-<2_^F0t3|yBd$HN#h|aUBLG)PWwK<~x0yHYVolJfQde#q2Z-yK|A+|t@ zvIeA$V_Ibdb2MWYgOYgKhn;nBzT4&KQ?uV&zdG1xoGj%NS-*i23VVKF;Lwp~O56#9 zqOj@kjPNhWKyP){$9h{HuDDQFK|afpe=S}j9xMDPMH_{bQMDLe5Ez9cKN#{?lU6rC zTRnw7d+-qD|FQR$QB`(r+bFR}=?;;SM!Fm64h5v7yF)sq8>AbgM39mO0YSP!M7lw` zyS}-+@8^Bq@$Iqy?q7S1H5{m{YhBlz=RD&$kK`QP6c~aP`f9N+yOnuaG$7r&V9&sp?Qjgv$E~xvoK9GUGA|dNAvaR)*L)cV^*}; z#Gjcun^a-47}ConuiY<()fXB2x>bgO{N5MkP^f1pN7&nTG2{th2JfOrSB}o6vY<U;^a>7iP84mftUSoBpXTkyU9u#AQ z!i)siW6m|q&Dz%1e%N`~9hVh*zpJTh%Wc2}4Ob78%Yy|uaWO9QF! zuV(~e1))etNB1vA#ygfHRObD=IP{x*tY~72EEQ%x4c>D^5wh|WNXIx!>2yUL78sF` z#jv&=eK>64_r0mLn*^}N%Nr|zip80utlHxF8#02xrxfww z3F2KeIfcU%cSCEhOJka5WcuZoj-OVqmFO+ z&a_ymhN1))e6xRSDIG>^i`;$IhB$`;74Q1cm)A1DwF<}uAi=f5t^~rwb;N6bCnhH0 z!g_}6h|viTYo33XC5jaQulVp%xjj)RSqbtHr=v!xjoO^@{!^qp05q`z=|Ng08CdWf z{CG#zL1Rkv=36lAFJCsp_egN%0qkAyuoo{qD8!6dCdOen2@gNt{DrEUpwmze7G9mp zf+Ok)M>M#^7mhwV`qC?(?;v|-8-Gv&md6uuSbC3gg#ke)WA}T41)6#F+wZ5<&mPo| zp;S$v6u<;-W_#r`XjK6Ay%-Z(`j_|;%1h(YDOcBhiIxFmyzC0lhOrX!V!xY_ z6^t}k8WsPHt#vS1lJ`G$j|xRfC>8O6E;L>XLSj^VBo?s9rt_?)@=yqC8OP@tvTD!_ z@iSzx0$NrKNMD&CdBImUMl5-YJ=uai-l{rG>MOwC^F!sD%1dwG zfi`Jg6iOpJY)%*Ju@F{(Hx+m$bmSOPu&Kl~*c@=v!j!}tK#cKeE+H}IJ99J;WA+P{ zDMyG+a;#T)0y zkkZ&p_q>gl-Mzhk2Fz0jSbW3yw%TIsTVHqeQr=4(oU`}0)HBSst+=o9Pn zT?~Y==qMoKz@7FA@~G!^IOau#!4lu}E-drx=h%c*kNKXnFq~3Ymg8S&E3z$#Pqzk-I zu*V3EUN#nj$^$4p=sMtG-SP?Kv7=Mik36x&XiS9=oP@9p11z}3B> zdJ{HS*6Ew(7!~}PYB(QMiiizhVsdve_^3>#0SfXY>?9j54$O@ zoR1GKC(sG@doTs8hZLhu$>opdD%h9S@QB+_D47yjUtG%P!NSA0hWZ_xD+_}j*dIo) zJk61{JD{G$3S379_Dd5V_ScTP;}wX|QpCYSYX8U$2LGY#Ko6W(Q)c0OHOeyal((_5 z$p@%X84XTHnE*ci!{4Qv1ebuRjW}VnP&OP=l=NVZPH#KX>d5na;zwrs#2lf%bIS(M1%%9`=ISt6+Nu0EMR0 z2{9CL2$U^QF`Q;Czb>gZpqc|ZQjGbxnsbcL3smu<&~kG0o2CkQ^ph~LCw@`}VF&8+ z)soSi#EFK;j!iSK(Ns&Q4sbf_(wtVDzjDS$yK@EOo)81Wnnx zfHc!CX5`0(m$z|jp51|1fE;pMFj`SZ-ZkajBa%AlXduj3BJ{FA47!N>DhTbJlNt2l z0mu-L<)FZf7a>2Frfz zAu+6NMQkD;9Tuan4CSJpC#)eF9hd5(?8Ey(*v+W84YdrYaXvXHE_Tu8U#Hlu*vh zUsfp&7yv*^si#g5SWdfaAa5@C-eCOJkd2?Y%)6+^oiLD;&D2etR?I6OTWBGgZn0_0 zRxmngF#giA3PQR~{By1P>HZm+`}}udUhRG5Yyq=aGQpG!5zyo!YU39CG_TZU9aG1o+)hgbQ2^<5F;fcNo zlhKe6oF~>O88{4>CLu_0LsBG|@O(%=<};@@^V@K(%IaE~ACMdX7;WAaihgX-N1-GH ze;~|0U+`~n1)Znx>UWYHq$XDEPwJuA;Qk{F+A|A;)pzM75Otvrp|}&^JcHQO!JmxC zm=O9PmFcx&!kfVjvl3?`Pwh`KR;U4q>B8RiO|IMO8P>7})t0wLMD^TflUh;o&?k8Z zUBi2fGJh%6zLs-N901AfNe75BdXNQz@1S6swePUutdVWW3j=h zsZPXG&F^+QBilgFSi8~Ds73n;OPz76Klvcg%?ts}nPra0DoP8NEzl1k?qe{;c{b9S zjphh%mX_qy+>jCD%xAv52Ow{7^7p%Pi=*Z5n==-<+`0|+=nC$3nq5xg9ZmcJEG^njulOY?JMyEvMM~;8MLOv19XnWxdK~3x*IFiI*BwnaL3^`t7r+0c z8u-n;*3`_{pKHkc_>l@Id5AeZPfTqrYinzRYii1qnY1zhyfW)3H{EjBHa9Ys&jDBi z3}srCJVA&HI^5k}jU{GVBiY4;g+F$bviQb@0KS*+Y+2sum3A>ML!OS$q!~P+Eixy) zMw^+MTuuJhH;-w9Ef7#pzLunjLhcCX@7^HA<7yeP@yd=mUFCEkteSq~*(44#I(r52 z>fA7+GaCEBt-$BJE(@)yPYcNJ>0fsT!V9qt|JHsoV$0XyeQ6JEduM>!c1AmSV=#3t zJsGr8q4jwBWQj^9P(P#>$i$J@&tA4*ir$UA*3!~7+5QoMTU=f~l>3y!&=M_M$aCWL z>({?sM;5D|k%*OV-Cr*8_QsL(W{J;Mn}mHCH5dcZ)qQ4+82TN2!Z|IWkk^)C3%-{N z+AZbGKd}*@&L9sL?2Id1MoqX_J$A=QmOI501|rE{)%R!mSzBS1p8fU8pTB8?=hE-X zlm1QeYuv}x8n;j=XC#J*z4J4FR|w(l#r~6Q61S_P;TJ?%rTHU&#(jp-d3MTm%nX^q zlf8crN7^g;)qI#EPWU2CKXNlSW_zkEb;X%wWc6&H)K8!`6A-Um{)|xy&aI-lp0@(| z3r}TKE?@#c=?DAeF;N9eE$$ASW&?O#JOICW*o&E%P#2U){4zLj=d1As>eFy&99^CX zkLyi9QzK~pqKp;r{Z9GgjG^Ic6CQKRav!}Mse+)d%nohW#r#lagU9j5bS|q8E72&I zAII48*}I5IEq*wLZeIEwUUs5kXc4BSIq`%Fz$2nnjoX`dZ}a62b~Fa>0T=*^1n&=+ z5F0$+Oz%5$rS@KPh4TrnEnVVp#b;G4ZPjqFD6Q>bsW7e8{iB(N2Y&n7F?CAjZx)IR z2VkcLg>Q{cxwl4qT_;y-aik>FnLKtixAJ^{wm6s@v_hn1WI`k6IC1Bf$x-MmBrRo~ zLW32403re|&nqB>Imsyf@+Br|VID|odqmgPc49y6MXe8ESlD^!%*0dfFEZ^+4nmpxp(yfU__oQ!XznPs}d75W-e5qeYR2-R<5 z$XO%`s(%ot#s(v*evI`t^9T^DXJ#sZ4N9*gxrw;YxPb<+Wf1k9p0EEih%3#O+;Bp6 z`2pv^bLE6R2O_;?PVZ6ko6x`qTSva97D$FN0heWV!=m*<@St>MPp(jy!B04}2{V+F z-L|XM^K@?o#-a6CS~lkVr~`(@p&^aVxo8Uj zG_+_$i;3l=7fO!qL65V$aJXtfWq)v7dz8QwHnsfG_-g#_{A%e%mwW$_Bo{9yUcn!X zL{FU=;mdiG3caR@d}Z3_jwr;@8zDOKDJbp|c36RX(1xVGUju4-0MaV)`OAi_wD{-&dn|8&{po}I7PmixXfC( zH1@9hxzN>e(63L%!p#259f22D8;s{*-$rHOyVqV~B0^q`z1!Nh!c zxBF}6^7EAiZ?RIQd8(K1?c9>R43y^*D#PUuV0O1ALJJpw)6f|D^*T41GXH7x8QRZv zvKktE)y3B$u>#ly!b0Hz`{$!*<3vWnm_kPZOpNQNeP$#Q-`#uo5LlSjnDOQ&5@IKl z|5Dv%6hRKevm{)n|2O~0BZDPjNr)xcRA2~VEk3g_Cs~@o83t{+8$aqFxuWVm1m`I-Vke-Uiee7Ml3%-iNxTlQ&i6dY0v#_SO?2A@Ng{a`4SE2b3i=z5pD&QSO z9;~_F{MNyq8OzhPh3vc64anggN^rBkE9w3b{ZmK+5QK>1LMm9O_>D3|U8%!c6m1DV zap$8(4zR3e(8@xFS63f8SOMgBTpiI;vj1jrV0^$}KgSBoC-i@_x_@#z3OFYyjh2^@ z;h)h!|DtJs=Y;|4(|?9Kfn4vos+JbvD;d;&Y^=5QD+X|DV$sJVu`OgS zc3q&POCG_`*F(Xn8p0jIO%;ec-em9)lI)xd!q*aE_>0Wu21FByqW@zhqbOjS2`>C1 zH__3_NYeWC{`ThsUZ6c-EP$PaMxiV2PX+(iFqTTMzd0@ncHd7}a{;6&6xa{W6A;&E z_X%VTaKK=|X&*QF=kc(pz>*?|z*$k{nY2zqG`mBQ@2+}9dAhs1HyiwK8zh`i*Pp>= zE2ns0zJ}JK(Du`1#&`LI(t1hNAGjehs`Tm9iq*GN4# zvkB*#y=DVzJ38bJ4+bkh!+8Ib@-{&kFM&ZD)hK#jOf>c=^+eGsY4$I30&H8lq#-~v z(|o-(4NMVMc3olK+~7##7TiEYfr6>er7P`fLe?8vPpN!FVRb zSGaaEVL|$PtGKw>ZQtZ()bD~*7h}-D(y~gXJ+U|UVLLa&;5ykLKT?kn3xpGvfO5uF zs%1o?>ZGVVtWjsi9jA^7Z9)g(;}io_sSEaJy${`GyR327AGW`?GlxilY0pW^9q-qO z6!imqf@9xpo+c{@HP^8U^^jf`WcW4kNGA6_KU#XcUkbfd0Bji>Xn}Fw060U?o)@@5 zqJehX8IIFl|GVB_;VUqYi7F!1o@uFOe3xD14`a}F)aDWZy!BZwF8v=b>oG{UUAa&n zu5%w}LbWj_xBVVYb9KLgI5VE|Xz+M$u(>z$HPkGYgnNMGjV87~kqmra)9kE{1TnvJ z;fuJzpHKnnn_nQ2-2GYpIPHHwU7sTnhM^4~i}(uv=DWvMg?@|q?wcm(qI6OJwi!S{ z-A`3WU4l|CUC}M3z;qDkG>+a>A|$*53UA73id1ZOf`_yK0snsDts;H#t0%z>r}>0D znc>d2l-WV}JNltdyC=#V5C(VukldKSo$LKLM=Oat>u)q~k!j@HqPC}+^f4F`cDkos zor#UYx;SoRT`-r@6Fy7nw3s1W@rTVncuW5#2;Hc@EQk2WFJuPUKrB8qLEIyjm7KU{ zc>lMmmNLW`yYD+JEqa>7)% z+a=z|GnGeEK)8Jv*#p!rpZi?{UWfMkdb{)7yZ+oXXu^BMRM~2L?jcScwlQvL`0Q5~ zPqiJFJl_+%VRlyZ7g~oh8e>^6C99PWX>hJLf zZBj~o#4ET(X!jzE&#ANAp#AMvHY3*we@bfF`)Cab2;A>!wE%G`;t$r8S?5G3#4(Ko zS99!rLk`sbKEc=Hp;ANPrF+7S#mB1My8)T8wJ)=FOjEt{TkRTikg^xBF5+&TQ7Oo; z(TVE`t;!t`3JKH^W+23|9E)M2UjA@#+ph2E8xS8f3RNVpULfzfqKz)!ysPyjSzVW; zpoHV+=|Cf9yUOBTc3~$HNlomJm-|yH`-S6ym#oM4Q-1F32MwLiD2@c{?tWYDXy{M2 zJY3n)QAYe6rQZkn`P2_}hCJy)Jl4}WhqkKLIz>resjD03_&<1RW$EYi(3q#P8enuw zp*lAGsV`XdV3k32OR@YE6{x8CL4z%jKrPLi&Djb4A$ zg!LWb@FR4UcbJbW`RH8Izr;x>N9Y+|rXgbL6Pv=ESz6AEJsbHME!{#`AY4hcH;?pZ ziT}qbT}hbU^AkY0sRooY^3zqGJTwyC)!#j@kR8OHF1(R_5}k!|v9n2D ze~mT36qduPBM#I!Fr&jpLcDGP=^LXeX|O?UXrYctoJ79sL($x(M>C!{PA{taWvMkF zt!piwN$#H`U-Mg0brcy)x~6!mb!{Yjqc^FvB;9x9wqm(7tlQ z-M-dF+H^n-z=hl2Wt*80&8|~SiV9=LYBDEIN+FVK!0woYSzJ_GFss(c>pC>iHMRb)7!Tb>bjcEOgR( zGb&#n{y7^+?+M9`&7WJnC$0^7tux_FVObU=6`4MWXaz*QGsW@{D?@IHS^h%amvJR2 z-=dtS^P_Q9n*-g(u>i^!jI!Pb^OYzUsUua=CSUPyC*l51xA37wTPsQUDE($kI`hG8*9_!f__-JDLK@1S3)CqDqk0 z(<&2+&Q|<*9OM`*8@vuoezXC$cE$C%KiO1>lARNH*wLGi8dB_qDdVov zijNY%&_JFHa727f+-ZABdE*z>{9E~=63_1IzLfUiR}EDzL$ zcu;ANjXSOkAz5hfRUKLq{CGjV#w=YEi-^WMrjpLlontNyA1aNL`rawguV#dp-lum6 zz$%F^l&@O?K&}goxF2z@7_F`EBKk!JSsv|Q&k&WTw2yRTpR77`EJ5&2}@%+_pI*;{iWZPUZFP}$1`;d0Db#VkG&u5@9Su1EafJmSB`YgWsA^BAN9pLi%-fPMQ)J4fDb0|GtoP8 z5R`ZpUN9-(Az!vR@_?8owz}#6ID|F0bv#n)tf8UdR`6I>*=CJSoHE#)3Ycyx8j~m0 zuM?D&_z$MHekK*GOHw$&WpO(y)TFgwJ)-q?Is|0(ipFUU(K`mP3Y0ts$hC zifk+rmXYcgCJF8sJN{Erom19<{^>KYkruU|Nm zVKW%Y^Ae^#OLH}yBzS9=%}?>ulg;52S09Xl_jX%#QSN@Kbh=zwBC%Ww0mJXo+p zn1?y@&@KOneuMmO8R_E97Ifwpz_o}DzOFD20mN&6kR6QEAW)%(a>=}rVPk3y4Lm*& zd-j=Oz_#R5xMUQhtUrPE@l4LI)QIN@9%Q#%_BLn>5$~q$JERao3Hqdx@W83JgpwZI zc-S#^We{&5ab;F`Ph5!6)8TW~{v+?6YxNPYnd{jDuGwPXm3CwCGYc~Jms@m4)cjhb zk0Gu80Rj)WC!%?L@Yj!U*AH~Fr#KZ7q#jsHxF_&Ge9<5DD! zr@w4)y60KPOnC5@5GmxSu#l)&^$Hr^yBF7^K{(E;YeHoZBX(IyrD!8M&h313=p(0o zcoZXhWSvzFKbjoNA3qn(KSjJ_>*ZhwUsor2QGilV@FcFoREV0}Lxe=oL%N2F%y(t0 z7!Bv5e2tT1F3RDuNkT|p^Ne-w5OdZa?WA96{U(zI?!aHfLdm09iwYwb-&=rq$#pd5 z7|dV0kV>AKnksI+`z86<(0*@sOVw|1KV`t(SQ2_G|8O_@IIoy3FvUXW^6sI>;V$$V z6ebdy$|cY3YX_@b1|od9=dl4Jf5&VPSgWZ z?P+1PgYT|xz0fa-wMY@NxObcHs@@(<83ESD8T*?$qjy&2K8M~*ob4Aj?LCJUEqbx6 z-C67=h?h+|WWPpl`VvF+Ef(VZ?@V0ouAIy|~lZ9>XJU?sY!xZq*G(P1?_bJC5+%n?rb zg!(}HR?_9I@QY6t6=g_9Dc^9dSUcU%e;Z>p;D^Gih}cMHBf*<3iQVAJ8pNKZV_{_c z(ZPBfP)ozhihDB$*{`$2wJ5Syy&(SCg5$e6`#3|NN>|(j=T5!v=}u_?!J!PWVBBFJ zocRztDy5BdZ-2I$Ol8Ic&Un=4w&XF#=$PvWsjB&692gPo0T-6oA&?P$Y6QZZb>Jgts=JlR* zM#sf+T&?O0hxGYBJHF%QCDsbBPby%pPu-xI%`se%3SZ`6C*dAB&hU+$F-LR!%-&cA z`$&RDMbHel9wk zB#4_IyAJ}#C2!1+@jz;b_G7}t%OuMyVL-kxNA^0%>4oKBsi7&(bV4*EiR^KW+(&D( z|22{FfDU|JLi6LZPYC}PV1fdj6%E5&S{w_L!s*15kJ08Y_j-p>RqlWP9=`%qc69N} z+^rWn&XThw**g1Ql;|&8i55C)oOThv?thP{hN9w7aioA`0qFnz11Li=3B~6}Uvuw= zj)a+phvmL;3gEUB^K{DrXe%qP@UO_}-%lPBhQvPQHwN`M_UG38{O>@q0tTnvsAj=k zLuIsn3l8U+|3$EBB0IKn{q5Tx?+;0DMxf~Y1w#5auXAU$lhfz`o{Oy+bS-yiL;ar@ zK*7!q7Upc{8`0>o;m4)LnGQMqsoTfiphzjH2)W26 z0$KuET1JA+jEp3YDamf8w`|->4D4!L$EXpdArW#So$s2AjjhG4Um7zL$}1^0pQtDf zy=V%Nla7dJ?tDBI86x)Q91wqV$2y_Y$>&aSg+-M;m>$Fw^VzrWJ&ylgB2%+(a!2HMhaIx2&R($Z2C zd4<<6k^R@H$>jiknsRr4=&y3|+a%7h#|$*U#8(>kY6d@u-fye)gECCwzP3N51^~)5 zpz~mEi9~};1MQZfuYjAr6mOaZ+bxj}goSjV#pCD<*m$(ldM-*FmScH&^UON6^x_N| z{4VBwVS9vcJ&bA$zrQc^e|!*U8CV2Z@ygz?6rn!e$#sDZ<4e^B}Zi`N%?- z^Dg~>9a~UkecVIpu%4xBr7WWwpvtED27Cblw&rW7*i2I$KBgqkk4dWx&PG+I%InU!XEiEX@rh+q!B zo2#F<{d!oH`<10HjTk?p7ZpM2fLvf&*}CSju4n>`Cr(!1lD0ASm6 zdN^!Ot3R;FPbo>~CO3!D6Jr`mIFLPPivOP`snfXu-fTvE#EL6MTm#c0d&KK0&vk>rvAUmKT5udD-iR0ymOHceZg7kPG#Jv zqc+v-X=&%{d!It6)|%KW0-iw=%TQx&(BQ$D1LSz?r@4w%=bEWfGuv z0D;1XZ1+WeVh&T;lNC&VKCT$&&L}1%G@^KFR8&-XmF9zjI1zyv;GbU3izAUGIhGM` zh@6+I(17d)Wtzf;llag@d?g|@vwPy&*oX2OlYc#aoiq1ZQML6<^m*V6FBosTUOTC* zfJ``7<+~q2my@UCPu>7$-=LY~gbkJuLs9H8oOL>N)>LVc*2cMaeYgiAKnDAz;%Tvk zPoO|gY|yy+>x1a*pGzG@H>7Ewj}W`bpSznWezk$ijuE@d^&jEiGBv=PnYsC`cFPG4 z_BwC^ig&*A&DhLsIx_W+O27ocL}2kz~IP5Yn5 z;iP2CzkE?jVbLELh|^k+?3mPm`YN%EfaEkT^jq+eih1D>RYR8c)^)*@Nc!qBMjqHC zBGSJnHgFa9==;Me=ewBydfvaWgyy*+O>wZJe%*f@-#;Eu>=*^a9FbSkmj8`8(08i7 zgwr&ZN1oQm{2x#G_XoUOa2Nmo<^R8195ER>$6@a2=g@H5{mujg^nR<7>=dAQuUIwx zD)!GV7tw*uJ&Rs=58YhXH*ik~m}L*ZNb1N$e`wkOm{AF!4Uzx<@`nEv46#wpn2q%- z1|ZGP1D^?dWz~9~ZU&MSoh~%LE0floKUlaIlxFC8!NDT65VBKVR;F-sd6;{)H*?f} z1`jm?#-{i%Nep(#~D? zZ3oDP+gj4@o%H`&9SVfxp{ES8%^ZaCnhzF_D1uK5Hv~1cHqT>fUwDRvK7?9Vad|li z6JtOYsO+7Oy9wz)7t6Y4m}l-e=n5(WHGXp;&}7XBs5$aYo`AUh+~M1~=KEEzpK3BR z(6lZQ%$7Di&8OFMn=$JjO6N?RHt-kr1nq%bP+@XsE+)~nldXeRi)nm`!%|y5pZw1x zhF2e&T(&}a!lBq1mp30uOL*!s#LlkZSo!T@*7W9VyWim9Bo%AXBu@C{V=NdYkmW;z znsn}<^jPwtqOk7|v8c-9+^@3HuL@i_6~Dldhl8e60peB2WT`MrY{Uq~nh&$FbGQm` z72$|Cs+!Z@74NW(k9uDwer9afF70F^@ zP=`PUT!n~AEQ~_dfV;6UTm4Kc@fn%UoiH)B5hijBM?*GOjg?bfd2g!7&^R5Je_g)9i;Q|FNmx`cCIv%JSxcUbF|sr7xs~0o)qXRz z9!?!A%h%pHfKtXc-g-8n@Ll(l{!QxA2usTzP85Ob%t)wF%RJC-=9sLd=l*_tkIz@r zpy}GibelEu%QofqW6!C8QU79eUL#Xd{hMRmlv|D=Jb!}YnwcP(6Y|7}+m`v^8rH$Z zd@7A}VBv_&JL+Ghr2bH46&IMpVuGdXb&`+8kktTu@qNYI5-#u=*y?EfAN2z zl=tS-h%IVjJSkLE=@(YJu-b?^StvexC>6TM2taua1M5In20gz}M>nPpmyyJ+6a2+2 zt@wmnCjw_O6~dL$Q0k_N_vYS6fw)Y9o_DP`4s*-G!^(`S9L*@>GwY^9g^wOb{M(s` z4JZCrrmy0GwHM50gt!UHxP9&nsuMo2ZR#q599A}>J6l+FioQKi47p6vXALo`>f~HE zs7OwzdRolEjE~cx_)amUMeUu|Ala8%%7OOOyNC(Z*Nwv1MP@OblgSPNcLh@;DtOZQ zZ&)sO6tAlzm-5`&iaiD}lV63A7qD??F&q-3io`SY29_pRo2c4qt>kFw(V z$nyaW+J~N%o_DgSFt?pX%eknNwNF$Cm*vl=3dXvakMDek@@@`P?<_SfU0s%(LsZmf zWj8W2wzY=5awl@)?<>~%DWzw*VR7kMfekRR`Zw4^ldUgQM`x2Nbc3m^qYQ&eZ;9;p zI?>2Qgt936M|+!a@!&M2`Np1M9`>H(SBa=T_XC`$9>bu6l`!%gybobfNR6J+FO1a~ z`rB{P;IC}Gqb%O2e&qW(>Y3A+fk(QjDq7!E#+nqhukY{cc0f|5pe%B|p4Z_tnW-cW zSHP8TP!Msu=gPRHgcs))y^5_!i&;ik9y!mt5iphc)oj-^D8bmVYHu7>vWWIaS%rX* zI_*tpxVwn;`tYVkwo%@C@kXhZN1bi*36J&9ixkm#MV7i2w95I#bo!fDl|Iv^o#WaJ zqf|54HQ$U2^}*Rc!8wvw^t^6)2hCC~xdWl4O6#rZsPLsC;Da1EKAFxBdzRtINxT`! zR3Xdfs?t{49GNb0NKezMi`ex=pU9q(8k09M|EDAJBfxObwJ5{Tlzfg32$EvyN9jb4 zBTNAUJ3kxbJc9H%^r(8r5g$Na`rpoxo)F9Dn6YVuvag|1#^s~!vhrTPH z%_?Fyo7Yq5*{dD&P{kJX-inbo(d>geL7isbsubZKUtmdO?uL;v{g#9?QnH@u7x^bK zHi^omSW_zW^ZZI=ZmHvg0*@9`o4lt-+#t-IItAk3Qm&W!07P8V;({y+I>Z09Vlq%IRiKE##6N=c^&?y zlaI_PRY(@mcA`gM+K?$tXHi(>G-diu;h^6}!GOpgsp=;Z2FjM% zI8ZxWnCz$gMFuP(s%Rc`Xo+5L9s7s%Loh174s;CCs$uo@?!P@oQ`8~S5P1G?!rV&&?TsADQKr^sv6!m*o2SA75(e#KeGUe z&RX>TxKoCNx}7%Ut6`XhBs1(#lf8YRJuWx+E99=+r+g}MzzX3es~|7F0v`=AVJe-t zX05PRFMc+oTfXOYx64?r3(L$D-bRbORU~7Jc(KUvzQasW9SrSQH^@1*S1|)xz&?#t zqvTm~$;`--FFTa?(!bos&*(WJkhl4qy*Z$;KyOXY+RZ`FiLTGDU(O?-EgbbTH{p2M z`?G^@VU=T=UlHvc5-zJ$aAvQxWr$e~UMf?v2&72LjL`aa8Z`v-dG5s4KtChf2`45o zi!O?JU~uD`nrD@M3#mBaHmSL4jj1>FEqaBKP*o${rVnp5oE zy`&kE14_!}s~Uq!k@94``5GQ+`()2DJZ;Du@$vO+(k4D64wb}fLauTDmk;6@d$}*VgM)5cbwg4$EmXkv})Z zzj3ufQ|IA}nHkRHFo>;U9drG6PyZIlNYq%ECGKq1FYJ+?=bcK#$?gfi2^^QqDGSHf zXn$!hw7mFg0PRrOs5?|6x_rDa*Za%Yxf(q4Wb>4I6pZJIJL1}Jf($~FN$@fx&sEJM zZ1Zo-nM6_&c-Ob|xxT#=BexEFVXv0{u`TN?tuoL}v-GZQfK%4_g2th^efx!DHEIiR z>}JqXJNjs$_TN(56$00aRs+kgCbUB$E0NHrqRUi7A;aIFq_ia=9x1O*%g;xT6Ot5h zcjKJ&G`U|T?j6rhjBO?wiy@0?XyT9JA*hXj5h?Xw?Cvk{Wtj$!Q|Js|_rJRhJylR_ z01lcDcZgTZLKBVu^+Lz3!kJ_vE%|S`_cwEVO#wyh_~;4x|F7#9fg+d0d=2k^A%W0M zMuk2d98x#cKZz%}TJ3?p+d_-GD5i}c_`K{)a9bn7Z3o%^d3-LoZ)YF-cMHQ6ZHt!I zG%%o9!B_D0106v}|*Y1!@KG|{C z{O_$;^1=b`)`jo>uQXDyF7%|Zl|Pcuzmf9%T^hE)NV+k)uXVd2poq2oMNmm-*3MMw zT|%QZ-z4w<^5Vsemf7Kwd8S=x;i;-h55}t-b?uV}{R@nZU75E<CPq_2IXFe z7M;G9x);RV4k^A04<%NDiO-%6n3(9Xf22<)Ep+xCG*I#D4?N*icgxvx-Po^e zT}wK2+z^y?dRLQXU39KNa>AVY<%52~$tAsC+8ys;MUuZ^u}|H=VNoM`4G*vbDGFdG z$XNOz|1kp|xQxc!%=Epueb7m4x%>g;`6>Wv*A9@{mAC2oWLpTw1#&HzsiB=`S$fU zYCH^iMMc>b`AYSfD2hpnuV3!O)>gM+~;?pOMXf!}N%@v0KuAOIdmqGvIB(I5g025}aJg zNS1q1Hsr$~bt})GmK>YvuTMKK$m&;?H?YaXUuUX*TfIl$IgqO1iVTLm=u<>}{Hef0 zl&qVqF292x@iA0T-Irh8{wn`X&8T`dx%`I4hZt}+bWuQ);R{6nugfQ)P}S9)6N@Zp zfeVZkc_`1xbL?wL(Jw!Q%Gn}&1e%!4$P=?^1-0sl5c$>mc21aHWwNu#9QTiw z;HM7O3fr|M5!4r>Yw>G-mX^OX1o{>;!4(Zmk*PHy1so@mV9UH>9A4x1zy*u9E1;^;WzHB zrfq^6bki&@A9!l{`tCYP}Kiuy0PZ_LZc=qDb6Of ziPkf8p1bA+yVHhw@D6do`*KS}8hN{_j6ml}1*_h&d;XK@!HX2TL^b{CGFBUne#I%@ z=6Oc#8|S#2KpgH@Df{LKF(WAV>L}&XN}A~=>ze%-Nsow4wq==Ne~ZJXzz;HD$V?l< zWv9bD(%lT6Y((4j#fSAn5@FDE71Q4Q>^DcBPPeY9ilaq%it+YiFd`ko%*&1A*QGP) zHBK)zo-xdSMoEh6kiXB49b5M*G=?TK$5YV<+_P?cTTn-sR7EOAet7MJ=P1K?N!Ovkjq4}_OCxlO61aL#jJ~d!P#I6RJ2X! z*IMi1$@mnWl9!I5u|dIp9i8Sn(_i9e`Q{V$oW7_C+W3+!>wS!i!taw-wRIBnhXW+b z?oe`0oMdXu0oh;ln31EJrx?fI-X4E7`#P#mdx%#zC$s-Web#GZj+a`-p}(5lMfRCg zqy+&2Eu#j~U@muhvzHk)$Fpu1lixTqwk;=>>UR&$NS|5n*C$f(ot=}YH)iym@`X<% z3t9))m!imRew6VZhYa-Ixq)w=c+U^nqRZn2DSH zX=Uv+7xr&!ocI9;2SJ>%G{v83iW-ThbJa8Q_NW{83@Cgu^@EJ;>9C(uJCELQBHGl^ z?v;`Dr)m;R%&1~HCj~36GS+2|q|#?qiY4S2_$evp>(S6;2Y*N|uq?vyL>l`1nr}%r zl{^8pt1LdNlo^V%)Fy-NsK;^j1orE%_6c&v@T%#{HQcp{DbB10U^}8{7lZf?H_CcW67$;H^pRhwtJOZ*TDL zpWjC=YCUX3w!AvfWO_O<8aQvgu{&%X-gfp|zIuwaVD=@uqE#=w0c#Pfx^H{(oUw$k z^;Q9+sNk!uz}FwW_~}W_;tZNKcDjz`Nk4JeY#7i>S!f4JcNx9iFtK^^*#7L*{h0~% zoZ|CKIz01R1;2K_c%Sfz-va7%Q7b!>uQJ9rQ|8l0;hwJO|Iu2{a!!Y_Fb7FY836}zts28-}x;5W;ZXPA2lqRD$C|G&&T8v zyKSuMV_Tk?Nn3d(8+-Qq`|0_Z5VVbS&&v6zavG^Qhz_MS7HrXUKq+BFO zmUOJ? zrvW*;LmzYD(H@<9eXaHBgZFuscD@z965);|#79tDhLnBK2JR5+(>UR@Mvbi}zh;Wu zA4R1Kr_d&1Kk`@tcopJ$c)a-pV}6KVQC0zOR_zpK}hS3LRK16MCv{SFI*o zQl^TIa9lQGb!8ThKO-t3c5qxXO7HvmeUNEW{kzgtKE0@qIKyK7m(g(lr@60ii>mA1 zRzzV?K^;I45D^%L4ke{iVCe4dl8};+mad@$q!B4$z@e0`p+NyDkq$uw0cpNH>hu2I z_xTGxuerPs&zybs-fOS3>b{rjF1?VxSMfIUcSxNt$rmxl=+@~tq?!8o<%m>93fKTa z7TdA7z1sJQYT0vF0#KJ(f>`8Jm8Ik&q~w;RN=|?JEv{!|a7FzJVHAm3dzDGvPWze71bv{E@}wT#szRJ znUiNlE^)BI(>`*U1YVBr`H~|TnUqqQyX8t8=EF_!;QKI#^<+r_-eHwiTb->nA9nCs#%1>3OXM@6-172A;%tV80D9~pb8n#|9p(a6Ztb#Ye9{oPK^5F+k_mW5JM zgGw@FwylT3>09*rBZY$3MbWqEWR3!#i$z#*VF*T?UB-L%)zjyELZ_EhER!q}CbdwM z55bf3v`26h7x)E2s@qXZU`$9rfJ&5#rEG z+DYv&ZzD?v5HD}5FQB<}6t4W!h0wo4$3Mbr*2>uK)9I=^Zn9F}>NFbmvoxd(EGhxf^um6e3o_5?Z{!7p`w*HN9S>K0m;ViH5k{ z!4Z0-pfr6Gy805=mfPkk!L^z3_NO_G)v1e|n9_ufC}ieq9|UfmPMK^!pKl#&!n5QN zHucsC6b1LN0F*Z|zU}a2#NP>~uP%dn^_t*WasS7~PC{qlp zxfZjNvN5s~UGhi+k6==um5V#UBLUXaHcw}`Cd1gsZi7Pbb#;rW9KGzZnnIrYEN#B2 z*9L__rz9=Gp5;57Ezy?Tn~WS<7G7dsN>k(9O-ecRQWZ5s0&yhjPY~rY#e|=g#4MK# z=+Ct$N^jAMu#lx^2X_zlwA@KLFFx5rrCyg4QQM1FzO%`CwNg)bxu9p{I}virmY$Q* z>5a)~1Ue5#;xK9bQiSS0zshMBvwp#QE1AooQR}pNowkbwgVjyCJY<;1{`09{2auVC z+mzWZcIs@W@ALUPS1yx}$n^<~k}o1DCgTNrlU4$%5d?WY_mA(ro@j&XC=W+FU&sU?nPaFOy^|m(&g)C76Db6I$!3xxnkdm58~1 z6iD$hocg{;2n)2nba*jR)`~|T5xZz=Hx(LHdZ_0x_NFWVbxPOf*As>lIFd{&Zka$f zkL1yNs-XITfzeb4wqRZNEy+oE4>(qF^dptoCZR=Yn&K`C^+9yNI0fSP`pc7=GK^ z>|2R8(4{#j(_n^eNeNH#r<$l78&5m&)=sG^Z5lo6HV%6x)h;w zOwRl&pftxQV(Kx!6wmJaU9HKN2%1+bl>FRR;N+=aOa(>fX4JRtg~)__j?=WWI!)V-B#FQWuxtl;m{IBcGV>t2RatXSs7%(y%8AUxTid z!5Si%KV3PDH1RIEWv@V+G)!dP_P(;i=7;M$)np78jgV1ty-fF5_mwN_4^ACyvWoB? z2$)GcC#sA-W7#6RX)xKhSQ74hSgv{D$i}5_&POxlGfv?B{nV4%_gS<|kHtts@R%E= z(Qy;Xa1_3?GbMqL(jg)*BayD8OBn-SWCC_^y$f5pUl!eEtjS`r;`Hjy&Zp#$5BvE zzNPeo>5hYYug%TvwYs`_>IK>DEvDWj?LCp8urfU=dL`>EooxNiE~)h!iGSU+SoCN~ z)9uc}9Kr1^I;IEF8cPqMaFT$#-e|AF*Wb3x(bLgsRt@T#b%r1y6;S(0o9E(m1@MW# zL9A7|OGVdm+HH0YYBv(ocGsiQpH?SXz5vW#T9)@ydMyG&RpYpIY4GS6PH16d?(Q85^TY4wRrussp)DB6u07?P8*r+M zT|aEt*wjOP`1wY_KOLgc1Wn(&u9`O0zE)w6copWyRO}S$rC5B_d0lfivGPTs^sC0= zlugr76gO(PR3&SyhigA)kW-9p#nDmCccpMXVr?edeNFzIeN1bKd#oHU64UkNSYl-R zfTZiXS!w9CJ|#Pr3@^hYW+l*FeUw9(o!_P4n*{0Tuo0?%sLD-YxlUW@Zim(!kI8}F znwm8wiIIYi5c4_FcqeX;sB!!xWscP|_6fbkS?w$2)A^8U3J{6h44u55CMt^`HL_SI zFqW|$tKk`7pSfW>p*x}SvblgE&3Bi+i!K2}ZRDOxj+%b*G;^Ad|9csP8oH4{ra)<> zS~)4{+^slIB5Y`*W}#AC-COJzzWDXVsb@$P)M(EmwYANH`d$``Wzfb4RC}T!Z94Zl zdz0b_?6gnOlcZ73}f##BJw&cj$W`pj5{?aVH}$47x?X>i6CA zUwF}X90t_?;00MXl8dl?rh^KYGvd`}TQ!9Yn9l1Cg1rKFRO8p$ z;$%AqYBfPb2ssw$Eevm!~*`|q=* zSMd@%O>7$!Px&5vYql$ zu4_waCi$vAZT0&lF4ZxoSnyLg0+L`7JZbRu{VB1up=RU!qW_2a)X#0-Aazl!rvmzD z!{q8cP)Ou$Xgj)3H%jp(Bq#82P=3FTU7fL~!rWv-x_6VkMiDK?MU)hIlD9M~#TKgZ zTHqbGxR;TZXKClQ<2w;C=QZc3L1urC!v!*?oiGS8;`yt(Clpy{Z1SVQ-?#%J=!f!5 z>8p%kLl^O_x!TN|baTgSTdVSgq{hr`QIqL8`%MhL+NxQ}9Y<5{jDKnr=QB%<>Q`;# zMxA)~EuOC|CO-4;3ohY9MlALGV!J%cd`#Q1O&G;X(j<8%&_VLBr!6_7OWo?Tcfm<_ zl^jp6)Y``2z#Eyh$O6I2o#$%|$66izlENpFro@&MqxPdM(YA}nT1-auO^an}k8U#$ zvLjbuJ+GtZ{oe50W^&Yv-=rqK zyQEX>Nvv>`dH%jsL!Tq2OXz>leQUU=E_eb=3i<8M{%qD+Q+mPEA~ul$($ zV8ZA|1U5vIeG0ku=`iZcOJjd6BLcf6(&;;6XQoeIkrq^Iz2UWzx6w&dy@40bYxT@? zZkaaobUgl`JHzJhwq9jl>bbmWMjLSQ*JetS`$N(QeyYucS^__cG1z}chT^l z4AGyzLG3(9V1|)1UA6t6Tp0{ot@G3MclJ!-#t?aWqT6!NFW*m?9lx9QG-_J+P$~1C zS&$Ve)YeVLxLEj3d=q1pG7jr@ zjt2)}qtoD{><98|Jt9|avecwZX29z@WdqhI7WgUh1;*c;+U)!^ zOeyO7s>vMvYn77f=M*SE`JJPU5eE~NA!qEh0gph4QyPUxbm1`k-YIy|HlOlS!2&Y& zTV`xh>+=y*(?+qIx9e$f7;p1iCpv$DvKnN37}6tkgKHv<>0G8qt}(VJM(en^8q+V~iCVctS@fTjgE3B$JV=5wd)Tw20mI7+vO9` zFbY=P)U)sklY66(bcd`2t@${ht|Fk5N3OD7(uSfyeKTbs??6Y@@5*Bgzc7_k)8E9E zx&X*6svqI&U||HP8$-C~#N5;J&=b6Z)N0AlFXqWE$~(73&^4+z7<%f`$jJJGnq@Q;!mP)l?+=s9_5Te0uk6mh(eF&Y+Zz)r=$=2%ZySIj7n&) z>MFA_F!zK{vU}R4&S#Am_i_<*Q)@o^w9KBKW4#3Ds1zF&GsrVnX_PDX>~P0MpnoU6 z^+0*3%~hcku+OV~xXL#)c|M6TGC~Ukqht$yVeDzXv3n#TBdGI7bQhCMIm>cziW{VD z#KPmJVtrJrNAOO=32KTkYfzjmpC^rBKY4WWjx>vf$}R6Abt*B16aQIVIUqd+F;Pp{ zoGWiY5;QWGOTi#~w4L(ngs&8A(h35u0GTt(qgK8!{*A_t5!i!O*#j zBYjB(xih_9W(Fm_w3oPV!eO4=GXyYRuzBldT&7o|IqZ!Qw_3?#-j%o>E1tWL1}n)`|1&$z1fqOvC1^e!YABD*v1? z6>O+b>UvlRSo|UmoFw5&qqsS4)P)-Eh!XjUDGkvo|CAYuj(1O%GRWdp|!s zbc%0MB>k9@KCo!WLSK+Itvf-PchC}{?7GM7a*GmsaKR^l00s_IAYK=?<`WtFToZm5 z2;&o34&~(081&0{RXzfTV^b2k6`$xy!{YbX(XV$gs+xsyV!RQo~P`FVJ9B) zG^w3((%w67f7}XTkhdwai?P<7D^g3tL@z0fYS0$sqATC$TbOrS_P+16G%EW_S=fEE z*z7qm6dl{2Xi$E%mDt;(5EH-iK->3?>f&MsF5aJ=M`X8Rixz%dM0tYsw4iM!eanx^ zv#4SwQEs#zB&&j70#hJ~Lvc2|5zH@X44j~wqLpjr=`H%8hIB4lZ)niDobgWu z15@yGqJ6DyQSEDB(RygJWzUjyhsm-@(#)8Y>Urcp$@o5!c!x-y`Mf--AMp2-SJPsh z5Bw zL#z}0K_ySA`ff@Yv-hQ?H*x2u6xAbc#naMn#h7C~9Y_Dl_#JGezO%3*Rvia;Gjff) zab3%-RLZn}F%2@!*k5+ygK`fuH!Mc#&x_*k>%tjm4)y6c?R&p3`y&y5t_KG{D(2(g zmHd5@u!kuIO?FjP z5y#Hv1Rx@>p)&$&H?Kf~Ic+&cA(z3PGrs7EhYi`|Y*Q<}W4P9Dxf}&%y(xe1EX#IQ zb4FL{#!#=f6Xv9Q?CpJA)Qv;jF)r!DctT!<8DNxbPMjkbKKZpX7wc;YA3>kH z2ISnJ1AqjoxL)PUf;<#!hUUXA@K5|*e(dD3uj6{}Z+L0P-W4*`BGHVPY95yQYgLF` zbei8fG26Hc6p-5u9NhqNdX;Aun!f~Id?Nk$U$?;CrR3J?8x6qn#M|3QhyS6T3IEsB zzpl7+quZWdA|QN!m+&51>JM7&?@*?Rpm49}&$OmVw z%-osYvP#n`rqpMcHRm5m6}d>g;pD&UIE)?71^=-QzvN9{3*G{#+mOGHfc-!3t<+{x zU}2ol{g&4>h`A%ZM8wHCrj3NRsBgXwCX?{G|Eqyb=H0Q9Qf;~{`G$x0WP;5 z&&Z(}3u?^=JK&Cai$8nWd-)$b{+V+2JpQ7SK@s0Y);R1lx>@49DKnqBv%2E$cW80R zoYLX92o70*I3r5PqwBXVii7_+T!)4eCZhuAU^Q7q(3&>yTsZA&_|E>dP(ba`W^bCk zwn8V(7@FkjQ2u@JA~KvWikh4fCSur4y>~-9Yi_7Z@ITT^0IHqTQX|cN55|I9ow?zZ z7FyPhw7{J%`g4S3umvi#Q3)1cz*R0>z@9xmq>~x;W}Pe3UFMHKAhJWisjI$`T7`u{ ziH1XhH_dh9x8)GwVh!H^yMO`rZ+25|%w_`~a5Y#50g&8YbCXyn#Of3`oJl!S zH1Z9#2Gs}lK1Mdd8Iym{Fa0q*uNfRtaX3p0s*)klNkU%L}Wv71dg91z=|)WcP}rpNsA7)<;Qd z>fis*L#B#0V23TQok{)I@AZIUv|$!Y!3J%(1DekE-eLy*&wgsAc(i!npBxVQEBXQQ zvL@&-&TP}^R1-ZGesWb#U3yH*$d?On?O+wW@V?^&ZvDf6 zrqfL)Om{qOB49MDmUo3quh8~_U8^pxCjx*L4B?}Vp<>h$%WqtY$nnIWE`4hPy?g@j zH5mdj|H!v!7wu5hLb!c6SOkGf0f6j`wq>$9^8)285C~1JhkylHGlkVkOw&}?Zc-Kf z&Y?cz_cTSfu_*Vu^5f<>R0$WR;s6S&iSF6f2M-j$K3g6)(`^APvhPj~kuQ7#z&;W| z^V$bqpzUoU=m8WLW`r6q(@XII$Yv!%fz|AMnb^A%D9?kCXQ2BQMxOlxa(C?`1OM0O zmrxe6dUY-q-LY8?Le$5fyTns@wyXNXG+qMIQufbrMMP+X5MWuRsU0_b7UFHDJ6Uj7 z6NbfMzF!gAk_Bz8h>ysAwx11?`bM4xTsm#Rww$H8dwEVR>quSkP+N(Hcjgy>aWj(h z*nie!rmBWyVewI0-s278rxgeaPufR)YrK7Euo#PR5`+*l@h=bMJ2_GLl%Z#8q@cmg z{o5h5bMf=8L zHud440t;xZ3GiLeSKK2DRWGu9K3&hNeYyMA|CAZqJ0}59Hwc4HiA1P-j|OS3kZNBW zgoLiJyj+el>azpYq(Dxy1wnU#*E%)8;~fGzp||1bH=f^h@z|q@yxv__^W`OI63l#v zQSwX3B%{3sl|WBP9xA(kZgd4C2v&oY95*dnyW00dDIB{M?_>G0=n`QHay$-`$O;XJ z1)kJbEU`i&=;X`p^)&!5fw{c){_8;?AZGXpY_^{{ljau|!mKn_ z0ndQ~q2Q0^MF1wVjH4ltJ2pBRNinU+KE^U!rwRLdqqpGBaQxjA*+*BFBI-@L@~PA2 zTmi==-r*{BXcZIO2!6ktBKlSOVs0cG0qS9Uf~*%Zq+X?Po{wX~YVYzAvBV=dS_T_FhEZ&mKdGd@=yx`pxkOc8qE_$ z0r8l2meF+Xu|(ntgU#_Pg4VrB9EBa|yY_R7aW3m1D9p(?O(m5D7?fURB(3a?8xi?+ zegzy7epqmwIcOWK=OD4*)q>?GB^*>U@2q1zErS8tL2H+dk2}a#>T}IK4^Ew^*T~%K zY!Smv%ra}Tlkbk?91qF@%$lX&M?Uop<9|9R=ownZ6K@NGz@rhWjb&rV`HhnBHB@cJiTZxW0D(`1@c#zBJiA6v04>`X#}N6S)U8}*;GToxNPE}(ZH zqd;EkBq_+F`Pn6M#<@1zWTWY@k6J&gqR1H--McD~sgUF_qf$ZWujZoxHRo>C2(&4(J* zEJzAA`S_)}GTQvaf=O{zu8m9;zle&s<&a05U&FE8D+twEv|eRe0R*-WX4KKb15^3e z^-5lHl^QA=AsLrtZnl|fGnziqR*y5iJH5WXUcvNSJk;ey&Y%hn!ObIM`YUbuA7~0Q zE{0n@)5eGe=vG-OxYI|}c3$IJ&hp1tRrnn4RA|Jo>K!h$?mwK@eiv?~VjPk15gBm3 zgpDE7P1RUj#1p1$O7WmO5{LXc0RzF!5>;nCBLwqeE7dC%S@{){J%%PgzWE#04-dbDvd>E*hH|PlG^FLW5Dm!DtB!q^$r(DxE#V&bFL_iBpYkqz+Sm%t>_~aDfS3UaV;-yfHilVPK z9j*0c?cRvVeig@cJnNa=>CEwSB(}4?s_mEF-F5jwMY!Jl6EDBo_|nRiFqe!8lZ^$h zJZ%wXmhG_`vXm`UPj_v$C&+vF=<|qCfApt4T%!8pXIhKk%uKyytO4Nx<#62j{HR~~ zl5GTX5@D&Blvj_r_|04Uf|FgZBEIT4n~bFJAQWXI6KD7;3(E?x5!`G-x+-Vv=jLpD zdZX4Bt+OU;<(HX3HRoQYN`Zcq!?ILG8-;lPjqa{B$cB4Qks9%O%yq z6cL?O>#;!D#f(Fu>hp5gr|~=2Wxe%Hz0KId&Q;!jzLmTzF>6ewg(wQLg3mN*JJnM< z3r1$d_V}|sHj~$X7)5>fnIMe^E@N+j5c&0gXD92qmg!_xo!-NMi2Kb<5Unq{_bN=A z>EbsZog`!m%ij!HF2&b-s=a9(*z>NH49#Xz>{gWZD}aM$#h3@`0;{F`w0!&7K)Z43 z^ASx42M13jh+Y_QqPeOu@A}`D1nISXhDjTg)@M^XOSuS^v}rQVV@>lgkJ9Ysilpn8 zBi{$hThuZ}pS9aPJCvdhr6d;F`=l0>D>KC*I!pl=1!{F)Vz_;bTl=+HxvSflF7?o{ zXD$+$IGUMRggK~hCtR2`X6Yu1MBjNu)tTyGxEo>x+YfP7?H*Q@5UIU#Cp4buX~ld{ zYy6jp?$n=sxjsWm#O9KxJfE5fh*U;Jlwj@`Eh4C%QsXj}j6|k9P2}MqRWb*-5Dt`ip2RA?b zXuVpM=(h8qvQXHuK-`a*_9$?^x%Y0G{(}iiE_pqD%oHH`vsY_x31mgA8J(tyI#u=a zi(hHo);s)gv{I2GW4R)fX;i{z!ryxoH|cIL7L2OZZ2Tb%Ej=_zxctHQOyF^ z-;JM|8G-fOvdA}BH$NV00K5>*37p3Aq)$(PNo53_Qd zIN5iqZUu2Ee1MM$J}RC35%oh*EoLP#Nqm4sLl$$^j3*qo0brYRUJLxs`F*7V#AyJH z70wkto!(&F0Vngtg%t@t-2P`;Sk&R)Pj&|Q9x}0U ziYI_j^0~y|w)a;;IqH#v2f<|DOIoPOux6e@0*~ zyI%f(qM$=*SlC!!-nT~J@gtGV*xs~LU*#ts;}vJ5s0!~6Nl-mDjr^0#8&bhuTSRMB z2RzgsIb#42#^_jOCY@|L`7@VLCVk=)1l^3aWbf;c{_&9iC(u%jtNpYBLl0VchEC&$ z{WD2PT%Qh?@aB455U52%Jpq;$>p?#}1e9x8_P~?FV3{{I019~`B3vfzGk~a}oQHp| zh@A5u0`94V4RAal;}T}T&!k>|2G~oWU!FYxgcIf~nI17x3IFZtE(&dVDXHq|QJ^E^ zSFj$Wvw3+*Nv|WV#1#Y$xw!c9C9h;wJyP>*B0MTLWotVyxV-RwWo$te%w7%a`NrWL z5`oP0Zx30pTB+$x*uFoA8ZcBGeR?gN)W$%XZM10fg7$Eg*Eh5mkbK-Y$vU21LHQQ4 zxU|Ii09w=@G)dhDz|$sH4(Lz0IHm!yR3QGEb3S#Yl8W$jcl@s#!@|peMnm3|il&wN z?>5DOd|ziQK>CYH-7?M<2FLxN-m;q=~_ncfsQ zIVPs>0UgFrlhMiiZ4BTYfx;#qZC0zH03+Mtv)NuS z$X8fL8L{tFx0I|Ld^T)_ygWpP9Nk}t; zbnEsvqjPU@BV}bn|I@wZ=RTnMlb0rcJ>a4UG7Ur^Td;&(V#5s}TmU@^YaMOy*xDc! zKt?(FA5R6)PjkTe54<>;wn%cz`C@j%oz1T)H<#BfzqHT#8ksY=dtJi7=&(mCaP~jz z3H!QfZgXcJ1isX9FZxZ00B)H?>}v-i*P1I88F;$P+myy)Q2!9izZR6Sy_9|!hGFa~ zZozV?R0RG6x{WP|rKcH)WcmqU6jM-k)HX2L=_8Px%%-c5lV|{>8gE;JDK9T9r#lf& zq@FyG?aCJAE^Mx7{gJul!vGfn^kn|Zety7f3~l6;RiYpcpFLUT#Zui=`4*l7GBt?c zh}YTzHb7;6{3$w6s!3a;CHq2-a`wY}3^u@BBy>Ko0`xcKTw=o#Cix2HMdjs+XWyF6 zn0L285h}ig%9o1jy>8mrV6^s|z>7U|Ut5BLvMNm|RkGvuic87~mTa;rjSIqgMy}Lh zuCfyk@HMUpV%Gy}p1z1*3=}#6p*G|pGYk=a_%5888K8-gGOFSVO6+o;HL68 z&tP5bqNzqsf#pC3{{$Ku=_GLh_|92Xwts&-JhtSXCciM z0i8H{%SBaw0i}H>;T$;aSAGG`2Er29lc=eg)xlIwvjnVXh5`N8sWfXwo}y6V>D|qw z!W*}n4mv7yrF5>9$aYct`~2uai{IM{ayGw=e>m|nG<@OlDV!CaK3pLegbH>E$9ef> z{r1n#|L9kcG)l|51hi5F?F|OBy;X!>WNw`A@&0wWi%pAFx-PrJGGT(Hh3(;7%$GCl zOx|5+W4fsK<{*hWodg;o=Yw+ z!mv971^NBJ5pQ(k&}sDX!dDY+Qk)dCF)ny93cc1Nt6nW0EIcw*r#&&3ag$P+GM&qr zlKiz#8@l=UdjtC+P`c?3S%NAPJ%d|+a%j&X`9ML-eyjko@a+5e94eg^1w}N_8dGPs zpiLP#8=TXgYJswUym9}X{ctMptEp~SJ}7pVgeHZOIY#!%wTB7s<^*cAU&VX8C`cIk zfbDQaUp!EFgsZc*bK3LNb!?@r?!tvDKV>Dw)TfU$;q0Y(w?0;_j2S_kDX69f@5>xy zBX}(4*U1Ph8YdiTX2gm0W=2AjsQ)Qfv5sgSo7GlGdQy)SHDv0A5?nIaPf9v=bJM%9 z50p=0_4+_mF3#=S80(7Q<;3rRSc(n=V4vm`i&L)fkKi3r^nGr{T{OR(7bmOqmH%O^ znDYWDS{zokODs1S8~N0Qu!yFE#ifs(qHSAQl}J4KENy4tI48bb8*%fS*ef^v_m*|aS(q+>s#iQQ z%e2qw-TDRG`rCY+qX}@W$pT8fZESSy$*UJhZ0o@qy8CWv)zlVviA@HveCT)+g0hid zT>rnJcTrk!8Xw|x$%1#m5>0cCqo!J|3bT-o<*mWD=alU$?-38-1c*@J=aXv+@i8Rw z1nca5qcC>LF zNSN5X?sE0U8tVF?PEH_gOD4!)z9ps6{q&1J!SF^9 zY^j=DhWVTJm06a;`_g&Yr$akhe37(<`Qh`;4W_!b!aMP?!S_J~lwd{TGfHDs5U&Tb z_B!h>GH$Ld4A0^!{r&QUc6Y|!eq(*vK2|eIpVzUJ-B#%oPZv|dEht));SN*ZzL=6i^1+?*MiE zK&QdoVQ13rZOEn7_jwk8Ok}3G8Sp42UiuUeRK#8g&3UGYBeA z-I=@v*a}}ZJUQ4t4X$6+J6N3p;m^CB&Y(-C*c=U2oyu7p>z&%yhn=1cTQ@{=eAnN+ zeo-{KkD=en|7?Ygof^c7)|8K1{Q8W`6!aW6mSTqzNW&N(-I?l%8&D;Vyr4Ixy@$0z zT#L;wF95sXDl>7J4y5NzUjUofS1dOzv$v`-OdgUoLNBnX_}fyygf)CGa>QW$?f}yp z+8~7F(#u*yH%;7$=DEhqf(>p4iZo8aa8FGB$<+_B0Q2`{2nJhBg2;Y~`&j^OJ)HaG zEa=krj25vTJ|2I-uSMqt#cYBJTW0j;Pu9kmqXC3!^7W(nt9frTB`=9ih z`h9FjgpVotpK6PLY-2I-$af?caQ}Y)ujddThvkd7CDXz6uN>XO#~>*dWS#NP6a9TO z5R3qI4)aCYuz%g>3gjSS>B=x)3+`lCGib4thRq#reoWN^#XYMPxCcfie~OeULY^m) zi9le=!l3BD8_*xNBr9F30hG!^E%?FbR8$DdKV+d&^h0Gu@9Ma~rjXuT{qo^hhiT}o zR7eIW7070WYBvB=QLmos!mpWsJe>cyI{$zF;DUeR@4G5}qRIO(=>qs8E2St|E^Zw7 F{{T0^1PK5D literal 0 HcmV?d00001 diff --git a/docs/proposals/runtime-pod-cache.md b/docs/proposals/runtime-pod-cache.md new file mode 100644 index 00000000000..02d43ba0d90 --- /dev/null +++ b/docs/proposals/runtime-pod-cache.md @@ -0,0 +1,202 @@ + + + + +WARNING +WARNING +WARNING +WARNING +WARNING + +

PLEASE NOTE: This document applies to the HEAD of the source tree

+ +If you are using a released version of Kubernetes, you should +refer to the docs that go with that version. + +Documentation for other releases can be found at +[releases.k8s.io](http://releases.k8s.io). + +-- + + + + + +# Kubelet: Runtime Pod Cache + +This proposal builds on top of the Pod Lifecycle Event Generator (PLEG) proposed +in [#12802](https://issues.k8s.io/12802). It assumes that Kubelet subscribes to +the pod lifecycle event stream to eliminate periodic polling of pod +states. Please see [#12802](https://issues.k8s.io/12802). for the motivation and +design concept for PLEG. + +Runtime pod cache is an in-memory cache which stores the *status* of +all pods, and is maintained by PLEG. It serves as a single source of +truth for internal pod status, freeing Kubelet from querying the +container runtime. + +## Motivation + +With PLEG, Kubelet no longer needs to perform comprehensive state +checking for all pods periodically. It only instructs a pod worker to +start syncing when there is a change of its pod status. Nevertheless, +during each sync, a pod worker still needs to construct the pod status +by examining all containers (whether dead or alive) in the pod, due to +the lack of the caching of previous states. With the integration of +pod cache, we can further improve Kubelet's CPU usage by + + 1. Lowering the number of concurrent requests to the container + runtime since pod workers no longer have to query the runtime + individually. + 2. Lowering the total number of inspect requests because there is no + need to inspect containers with no state changes. + +***Don't we already have a [container runtime cache] +(https://github.com/kubernetes/kubernetes/blob/master/pkg/kubelet/container/runtime_cache.go)?*** + +The runtime cache is an optimization that reduces the number of `GetPods()` +calls from the workers. However, + + * The cache does not store all information necessary for a worker to + complete a sync (e.g., `docker inspect`); workers still need to inspect + containers individually to generate `api.PodStatus`. + * Workers sometimes need to bypass the cache in order to retrieve the + latest pod state. + +This proposal generalizes the cache and instructs PLEG to populate the cache, so +that the content is always up-to-date. + +**Why can't each worker cache its own pod status?** + +The short answer is yes, they can. The longer answer is that localized +caching limits the use of the cache content -- other components cannot +access it. This often leads to caching at multiple places and/or passing +objects around, complicating the control flow. + +## Runtime Pod Cache + +![pod cache](pod-cache.png) + +Pod cache stores the `PodStatus` for all pods on the node. `PodStatus` encompasses +all the information required from the container runtime to generate +`api.PodStatus` for a pod. + +```go +// PodStatus represents the status of the pod and its containers. +// api.PodStatus can be derived from examining PodStatus and api.Pod. +type PodStatus struct { + ID types.UID + Name string + Namespace string + IP string + ContainerStatuses []*ContainerStatus +} + +// ContainerStatus represents the status of a container. +type ContainerStatus struct { + ID ContainerID + Name string + State ContainerState + CreatedAt time.Time + StartedAt time.Time + FinishedAt time.Time + ExitCode int + Image string + ImageID string + Hash uint64 + RestartCount int + Reason string + Message string +} +``` + +`PodStatus` is defined in the container runtime interface, hence is +runtime-agnostic. + +PLEG is responsible for updating the entries pod cache, hence always keeping +the cache up-to-date. + +1. Detect change of container state +2. Inspect the pod for details +3. Update the pod cache with the new PodStatus + - If there is no real change of the pod entry, do nothing + - Otherwise, generate and send out the corresponding pod lifecycle event + +Note that in (3), PLEG can check if there is any disparity between the old +and the new pod entry to filter out duplicated events if needed. + +### Evict cache entries + +Note that the cache represents all the pods/containers known by the container +runtime. A cache entry should only be evicted if the pod is no longer visible +by the container runtime. PLEG is responsible for deleting entries in the +cache. + +### Generate `api.PodStatus` + +Because pod cache stores the up-to-date `PodStatus` of the pods, Kubelet can +generate the `api.PodStatus` by interpreting the cache entry at any +time. To avoid sending intermediate status (e.g., while a pod worker +is restarting a container), we will instruct the pod worker to generate a new +status at the beginning of each sync. + +### Cache contention + +Cache contention should not be a problem when the number of pods is +small. When Kubelet scales, we can always shard the pods by ID to +reduce contention. + +### Disk management + +The pod cache is not capable to fulfill the needs of container/image garbage +collectors as they may demand more than pod-level information. These components +will still need to query the container runtime directly at times. We may +consider extending the cache for these use cases, but they are beyond the scope +of this proposal. + + +## Impact on Pod Worker Control Flow + +A pod worker may perform various operations (e.g., start/kill a container) +during a sync. They will expect to see the results of such operations reflected +in the cache in the next sync. Alternately, they can bypass the cache and +query the container runtime directly to get the latest status. However, this +is not desirable since the cache is introduced exactly to eliminate unnecessary, +concurrent queries. Therefore, a pod worker should be blocked until all expected +results have been updated to the cache by PLEG. + +Depending on the type of PLEG (see [#12802](https://issues.k8s.io/12802)) in +use, the methods to check whether a requirement is met can differ. For a +PLEG that solely relies on relisting, a pod worker can simply wait until the +relist timestamp is newer than the end of the worker's last sync. On the other +hand, if pod worker knows what events to expect, they can also block until the +events are observed. + +It should be noted that `api.PodStatus` will only be generated by the pod +worker *after* the cache has been updated. This means that the perceived +responsiveness of Kubelet (from querying the API server) will be affected by +how soon the cache can be populated. For the pure-relisting PLEG, the relist +period can become the bottleneck. On the other hand, A PLEG which watches the +upstream event stream (and knows how what events to expect) is not restricted +by such periods and should improve Kubelet's perceived responsiveness. + +## TODOs for v1.2 + + - Redefine container runtime types ([#12619](https://issues.k8s.io/12619)): + and introduce `PodStatus`. Refactor dockertools and rkt to use the new type. + + - Add cache and instruct PLEG to populate it. + + - Refactor Kubelet to use the cache. + + - Deprecate the old runtime cache. + + + +[![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/docs/proposals/runtime-pod-cache.md?pixel)]() +