From b82b9577505987b36dcba5d36d090846ee2b1991 Mon Sep 17 00:00:00 2001 From: logicog Date: Sun, 30 Nov 2025 22:24:09 +0100 Subject: [PATCH] Add LAG documentation --- doc/images/LAG_config.png | Bin 0 -> 74167 bytes doc/link_aggregation.md | 225 +++++++++++++++++++++++++++++++++++--- 2 files changed, 212 insertions(+), 13 deletions(-) create mode 100644 doc/images/LAG_config.png diff --git a/doc/images/LAG_config.png b/doc/images/LAG_config.png new file mode 100644 index 0000000000000000000000000000000000000000..c02dac7e62e799d160bddec44d4903d7a502b8d6 GIT binary patch literal 74167 zcmce;1yoi0*EYHl1!?IL5LCLmLApb_1qA8t2I&+DX{4k}K)Or1ySq!ezu)%!&-=dj zj`7`b$GGFWYYdO>z1Cjq7jr)Ina`Z-geb^~qaYF>LLd+nNePkn5XjSh@Q3I*9QY=4 za(oB;gRYHoxR|*1Fkbup-@ey?urRXq zN&JZf-y=bPviGO~h*D9|xs(!xqYAg>^jBJY%4boUpW)v?s(;Evs$HQZvTU&)qz zMk!LyBzN+pD^Jd2B8cc>Wt%VwSIla<5XtIFN|-kEJisO-Bl}K?^OWY*C{Lf4_kMQ` zOZ_WK#O?cf`jRl$!Ni%=nTLM+!QbO%RRkjc9#0`(q+$R4AY#o--XHw$QOT$;_V1bO z00b7Ye-ApiStPArCJg8!dnI}TrvCr=f%^aMa+w75e-Bgrw(x)NFM)(<{O|omG!qzK z|9k(@Hh=toe-MrH|7t}450B7{r*%bB`tekv{ojY3!7+V->-E#r@evO4>K@7Re)aY( zF>@j^Dr(yH;yu#U?PaV}DWjb|OLS@~DGKI)hB88!-H&Mu)(!~=xg~;d>v-nV<9F3! zNZy2*c3mY}7!Hb9sjgm@^O1FSp~`bTuUZtdDoq0N|4b^ALn0Bahu3jeK82?mo5ZUI zxysBmkfZk_Gpp4+%KhzQux#>=SLB;NKNg1ylgCI3|My_2PW@-1Ul)EbHje0usFz9} zE|_?Qg_UQs{+qg^bD@hO-6g}@8y^mpwZ*zQ0s=`9Xhz8rvt&OsyQtwDv<*yvLPA~T`i=rnmiNIcj5z+Dnp^I?<= zc=d1pov?CwtZAD}vFdB;U0Q7&&sQ-!Rn-NfRhuUJEDPBvDLWcWxH*S8S+6ny3&wb_;$u zw6uWR%ToQ*&HSso(}CmDJ>TQw_U)xdafgE&D#(Y`j)OeKEH220-q>~0w5FhX#ucjQ)X#-G4SnolcfJ;rI*EstoE+J@nNLc6vDupnEW+9DIon5O{M`xj zpxudk+vD%#`f!l=c&Fb(LjghJ!Zr0%-99h^`jbUSUwYO}#y0sNf(~bIGrUz*sUfn= zg!QjY~7+BL@v7#N4k3(np?85sx#%C=&AlfpI^`#9OT0x%HL9;YoiO2{h#0o-b9 z_$<}pcusGx`m$p2D634-Ft0Y|f1OoD#wdxArsqyCsbhM~t5_37==~_Hc0CSdB|Q9* z(COw8qNmkT({tQ!+>ETO=msi68g0Y14(oc2t9pOKq!OrC7g|I{%4j?>DJ(9kmECpHytmD8o#UJK5u8(n=psZ8GWv=9|SQ8jGQc-LLEpt@63_D z{qpS_3Z%xtl;rNt?fD$(zYZ9hFH`!})XWS8{3t&^Do57u>`X*Cf0dT@_WInXyqs$= zWyYV|Q4`o5^8CDqzJUSNS+g@u9w(xFr19zL@JdQF>swn-AmQOMin(%x z+D#rWgo6fKYwfj0>dqB7Ib96yZy0Q^|Gc}pX^H^L+Pcu#R7M0w?q<*DcJ^FRQStY{ zKtNCsd_!Ynj*iIa*qH6fs_4g$A6t5Q5cv7|6{wd|sEAz}0JLta(2V&f%8(0#HAN>P z%8dE_#Akh7TtYHLT(IR8sWF%Wx$MJdV3(_((QsZf+GH{M|5S*h9xVG+5=!FDOBK5J zx^X}V2Ig~_=@=TPvlU?y+urA*BITNz@n|Q^@^afi8S?JcPL9x2=OX>~!Ra!6ve8it z+xr`QkFyaeN-Q`V`_s+B%l7M}m*6i}k!hd@D`TF|D(AC+~G(PExg2m%M zf5a7rou0y3i4>}S&e3sjabXpD=PQMmq#@x}A3@;gt6ALja4)S;?*zd@lqLRYI=1*6 zWg)8X8(PayX}!tconQgukq~~4hW0J+DH9Wu(4SldA)zO$YipwAQ`k|sV3u(~%<>7( zo+1l{;oO&-O?20I-6KO}{dQJ6`KEsw5x}7&A*iX5jBo=S@DB)}W4A~MzByk)$B+wf zJ4*<@yL(Bi_drU_-{1@Oi_^h`>*3*6D??r?bW>VEOzi867{upz{=a`KaoQR*=JggU zxZPlWG|Cam>4k-WkmaBI>2;Ah6C8&%94Xxa6TQxCkn8D9@T9$MKCHXD^ZwE!4cJJU zj%3!Ifb4Ae=ctP)BhFS76(Zs>l?25Q7NImW;&rKmpkjsO`jAo z*@ki0VTOT}>9@bRyT5dX_(0=C55|HeM6fR&_WS#d_O31s)+r4sDc+{rl4tbVSGXD) zrdRtFvtaen5@iBQn-^gLj9%^JIx`x}uvsi{>m2d3T1?|#UvnLwduj!{y0QB;Ho^mc z%}^#VKL^n^lOrxF>Z*g(hb##9iBEk!4=r8#-~l4U$;qj#yd1q#SB+N}7?v{eN3-IS z06=3n{+q_=2IS>Y`uqF8;^4pqUS%?0Q(hS+p{YqABqU^Ww8%F-JDVw+%+AQh7U$${ zdEx?=ZltiwAAf`}{J-dt4ug>dIXLn6P&9g*rjs5VOdUHtt^O1q{xuhu#;o$;{QUg! z#hm<>r3dkR^B*OgTi_J@GKtL3rb={T*yHL;bm|R|q_;w#?##smXqB>WfWLnWa5Fm1 z$}jA3g$)h7DZH-l3Fz4l^{y!k@00mGxf>c97`-1n0PL9B*GkIEcW;km<>*7vFB8KM zu&%r(?tj)12v|)Z6ciK?L3MRJFsl!ShM)WUW$*|Ih3UV&77!pwOiTpR3-I-Q7c%#= zqC)@U$ER^pZ!7Wf@!w@AyyD>@3=9lZD4bBB#44+-6cH4J#7ez|w6w15Oa!LmULMWd zDrjrD9_hKbaFWZXh5xdgdji=UNDjhhF>aZf!UZ(Ir?HU_{Dzr@CSDU|cR zb$S|aadA<-!G(#ImKFl>^75K>j)T(6JY^`IELcXQakg5h3phJ-aM&J(0S^ie4;S(B z;s@x1j*A;~b>#x?)V8odq*kgMAeG}+TFP*^)Et$a{YG6wqjh2eTdhPJ1~Oi#hE`r) zE+H!$P+Uxxl9KX*m>4xc$hXdMkBpogE8p_w-{rwOmC-MG#(DWy&~!>WB~@p$wn*`TjEGpS9^3eirAQ zuiJ5bWKIP10S^yPFkiW?wG{>!y#n}`n^DNETJ7c0NS3&by}fV*0UN~RFh-j`C?MdO zjEoEfA|@tQR#xWY>kFeyjScqhgM|gHnGz+|m!6NA?3kFC8L}A)Ep2U2fU#x%G9F0M zAITK`-P7X>=Gxmnn939V^(z^Q8Xg)6f5-XW)JUVdGbay^bg~{7F$1vog5Uon6K?N% zdU_-zC4IqTZ!QjK-kec?{r>%xe_$XPJNvJBOu>JUUF|2p;SD6Q!9u_{N+#yxdFWui%ST6OkUXVa)ZOuXSV5&km3k-3tE(#r zWOt%4$nAU=1_G>TWo_-Xc3jL~zoY$&R+6=~wFr-dgoN#5V@lS^PzM=USkSp@)~qsX zdlWpeEG4*<&-!_&cX_xF@OZGlFJfl86WK5ms<0jW6Ia$MWyA zjY9rHZ03}L>p-fihUri$yE2U&IAu*f_`gd$Uw)MY7n~9F_V>pI=HUsuLU%y|3A%j$ zIsW%K?*GgvSF#_WV<;t6Qc^Mv4n4`8JRvB+rho<;OlS@p=MNxDE|oigki$wMSwTSo z0#??=)m1WC>MelG*4EbFy}e)AVIW1t#iTJk*(=Pg_l5JfQ#H1RfHR3-0cgmP{oU8s zzTEnm=|c;|R4E_29ZElB-U$i$RU$wDF|hIol=&X_8{S6HWFH@>eu8C`Sz}aH-s$v^pDcoOU0vQD0tR zySj1#MD>f3cSj~^f{>HPkCqq-71IkkIle0Ver7eYE?%5paz6nH5q_f0$$#(-kS#pmo@aTbKWz{4h z5!|}og91WmC>p;y*%=|nASM#7m{30Jq~`6+*#gL>@cOkeDhq)@_ElSy|z*Tc?Hk`}1g;$H~}U zX0S?@{N2tO8Ch9f7`ue0O-)b=O zS%LHF%~)cuKE$Q|nQrE;+HEmxhJQt6Wj^0f&Zz*`P~hHbSOIS%{nC2AXx|zN3&D#r zrL_7#BxCUf>8G?0J$FVgZMO#B_NTa_{`yr?<8ci!9y&y=)sFmS8AST(!wYTg-4B1( z#nhYbgdGlfQTh3aK$akqkff>K9_WDl(!}R*p_$T2;zzSLT9L*n)x(t`FEDBpLqmJT zTUSnhExQEA48XV_gL21Ey$1O-edCo4Q&7aU$bLTpzO z9QuaHk*q?*K1dn3vZkJ+WjMqBOKNJQJpYN9#BbtCE51tQxsXWIR)*%Yjv8BYXktEJ zV~e`vIrStmQg?ga)uX&xSR^jFx|#!;h3gYZVc!9XY^hS*`r#p}v$M0} zzR}u)sq*AK;rOQ)aOe1MQ1$@ZX_+WgD>oS-GmX&=Phcy4D_b_7@Qxq^xW>1>sxY22}4# zV#8cHSisWNm1QNQ_l+bH5VNr0gd!%8_aaJk1VpQ?()sM$yg>>km)e!#b?*#;s1$Iv zFEsL7Eg;69jpyLUQ!;g*sYC~+QBhEc6Hv1qrkC_qdK()X z3t{}o=62eDE-c*sexWHUDvI??CZMN4EvGD#fu0_9?w93fKuK$Buim8c1K1u)otKf6 zYz6!~`|sX-8cGxO@Zg2WRvEg+5HpwuJSln0t82wz)37RK)9^l4inrjyUwqYV{FcVp z*VEIn(mLF9=5^xFirqA&ICut4Aw2LJ%%n*f);S``k?FF=c`UN9g8 zv;ifv5~ElPtuvl(tjzUP849~iH)go=3xpE&VGWND-lBaV_WbUb!ReGL0Mf$M<F% z`Z?R|yyS@+Lm}S<;zy3`1~nfaQAS3_=&`gBKw}>tND9AaopQG-AkaNMk_7b8AXm)J z&6RHNw6nE+*XVYhy`m=P)_{@0(x%El6YvCX$hE=X^v?@b$$z+}8v~s_4iS-`b(3kR zpPvU%O4|Apw^ml)!$W|(z(E+PTrmHQ~Su#29GWq-OcV>!y zF8|O9q1ASgot0fb+wle}qA^gbq0(7GLSI?6cT+`Ddk_Oi@(3U9opI#S=6!s8-r@1x zIH!_k4t-5bd}3~X!YFHLeUYW0rkB9f&ac?xWWjN?ojlb9I z(d+hr<7|5bmXwrq^oN}h;5|#;k2(ZiJ5YWKER2+i2_2g4(1QDh0LvhI`}Udp#eOvV zH>va82}KazP1S?q;;;dg%3iT+|0{oB&qzxr09~Q0(zH8AACe?RCm3@#qFO^sM6bbl zG;<0RkEdF5W+45Ahd{OaRGz5zNTLd$L&4L~i1!c>h({K+g<@x&oKLy?uS5zw&R^Hk z^nYaLayz@iAmWK^eSD~Xn#?ZiTU=~jep zQC_Zpe17n%!_csOdG)=xvX1J@0HF{+zttg$!Gsa?*J89nKm`j($jRYbw|f>I&iV-j z1vwVNic3z3g>L(Fa#AJWBR&L3&;A)1E~_hF=iwnxm=1q=O#?#4aN*PxlzbT&w)LGux{QRUIRTk#2{t4{x@Mt2UsR2@P z43-!`h3o>@|0OOC5h5Yw=F=Xewpv^rh}4dCaKHzFsFkMCYNG(W2FZHM`Q9h6D^aOD z-o7A!tHv91nv!~6W_%Y604Z1Y53|5!P`gRtzefYgFUXPy283k#ja=M0Fej;coFLz& zzadakD(Lro&8V@bz&be@fr@yjL^q8hAP)TJ=#0sqFmqgKi>I5F&B4WSdJd#WQSB7t z*-0SB9}n`7WC#Z-eoadX&5IyxzJFYg1OyXjd-hz(VfTy)vfQ62d$ksIA|dUL{Q9-h zc+t$0wXWjN5fNc!5n;HO9|n>TpreW*Z)7wZXU-@Ff+O-|>En};k#C?Hgpw!|38c60 z_FE?kl&o<^*Vnb`l_oFR+M`+~C$ZPMOND{-d38{Y4x;a?qN0~f4%-X>c3>up5`C%{ z2_mBebYTTA`72FE(7>oW+k+G#5C#TsnWQs@5?wxD%Q@rc6Bg%t&K=9GECII)qX*N| zHOspbnA0^Ugd*a4ei<1|1RRHvXaaZG0N$P>&#UhryfEFHk|+3&=AOwcn}Dvk@n6-v z=n`g!y`Hc30%;XepI%d@8!Zk zKncZg{dbPZ@OMn04wl=j2#Scj3;@=Cd+~Z@c{xO*F8=}>1gJ-< z!PpdRY%suak1vlxDn3;U=JbAZ@)gpDC@D#Ea!s^s4vc+Ca8Vn#($}Y%r~j{6DJN3& zgVK>;KC2ig8Yte)RtZke)wd50%3?7@fVxzM?V6RzY$eBgCCnG-wj#5lj0PPBpuF?p zd>3K#-+C`uCRvnSebqvP(l9)P}JP|$4y*ZBH+ zOV>XK)z0C@TihC(&S$lk|Mmi`=xI09XwAy}YckntV0e)4uBTprP`q=g`SAo=E2T7n zPvY=a8?9IeNdYMf3qGJ_@A6p#n;*SjU{%5bTplg)b6!eC1f>ALnGx*lm~#gHy`>1Z zu2ft9QZqa#D5eOM;>Wv!sxPRFA%lx0hraSS?lJ&st*&l0V+Z;9^F2DoPx-=c3DMD1 z{8t~SFfa_t9QPbdS^jJNP+?8K()APof)qGNX^p*;wCD3JsCQIy=i!uLXV$i#WG{hpZKukt5N#4I-wLRT@ z_7whz+Of@|FW$86r3nb)K8cBJIJChX^R*cXJRDf3n*kZJ$(J@KtHhu{A~}ge$Yj6- z=2oQ1h66a=f3M{m7gGcl@5eMoM#c`19DFb{Lx6{uH~nUCf8;IwD#rA15hPTJ*#KPDkRB-S37c6HL- zny0&TfXiQTpUI<3m&;B7}>Ev!PN$yN(q zZB^!%BIRu6YND zx@db-B<=IHJYNzMUw6pJMtu1A(I-0_xj2mg4i1r4`--&A!IaiA^BXM_6AGP{oS2uF z?+X@IRzZbfUUl^Zlk+!Z)PzN#E<*k3VAeBgditrUdg(%av-mel;0+{PXQL&ul~CMJeQHl>j_ z6rYxlSNb?TxiL7bcw4f>CBdqKqH17yImX3>s*Qa`P?8fz$HXpX%UGoGO!Nb$s zT{e?^7Y)+{rGn=OwE>`eNBI5wx?u_dy@2Ki?pA*dE|;t05K0X=NNw$PaG10)kmhv} zp-n`+8ep5ts;fnSp^V^LS)T9Kw$0B!H8vI-{bBIz>3C~~a7NqDj0~70w!-|0wT<1m zYS946gq$D7tG}Ze6=ia$TNWE}89iL!6;pH>Y;Ai?X5K52UJUY}07;?yE3rJAwJs)N zz)R|hF%qLAB0IkR`#Kl9vN>K z5fp9w-}jWp$4%r&S2KCukoyNLL<7BeboA$!`1pWi4ibZU1=97Z zh|rbJ6s;F6&sT!aH0qmevs>%Zy*jM-O5n7OP-XZohC(sI+?a52ko$_9oEQg({5gsa zr6rDwD;IQ?!T5#xCnivdiDjlSNBUZ=*+8}3qSY@N0s<*Xmgnt}qQa~2Sa^uXxe7@* z@x8}sf@8{zUVJss5@T1EMoj1XkKZd zL5PZ~`g=%?^vybZJpDr0?Ik7*1PHT_clL;oJ^*MjR$6_--H@5%hUCZj0zfSrB;rb2gM?v)SJ&jW}P<@I^Ki^WOAND2Yw6cKq)pyi*TKwV|XzsB22{dU{_gmMimt+Eeq+|EqMLa%S?+IxGkn(uz<1m|Rb zB;&jy=XS{Rh$(@GU&5jzB&5+dE70n+w6qKaejZd?%cQMsk)iNAM`!yPt#*wx0d+i> z#}Anu2GHf!h~?2uK~^Ammim^Bb-gwM7n?BI=gSu@h!2Su9;NAoa$;OnULJe`_qlaA z!8r}+%TbF}r;J$Zeto?0tq{mR%y-vYwx;$uX9X8jR8&NUU9@A8LNU`Z6sCAQPPLR8 zo9oKYnjdbW<$e}@$;x62M6+fHjWhNVEx-fy?%WvKy@|p^a1Jy(9q1by)6({RWUi^7 zGe6JcB^L0~lth5oxsC{g?M^xdBqw_&lJ_YWJh?lcLI@|Se~C$6)RD+Cm93*|etk{d zpH!vtso*JDW~hI2TX3*0%gPGV_JsKlR$BEY586f7+>Eljl^|)`ef1jEsNBKybR;b; zB#R|49Iam|?_^|nzkX#_04Sftn(xbG$lW{~wJsj@^~Hn2e+fc~$i&UBY;&lCks9MAsoR@biA>9XhBCr?T z`r!3EPDs?Xk|ot{AFt>AY?oW!0$^zcI|9(NtfE5X{)Tvarh*FC4CuBX*HJkpyB)78 zOrMPR3B$G4KU(|%E`MiX@dV%ykikI#hiQI+Xt>f;7J!!2(L9^4Z}ipDBRv$HBxDD$ zs))E9@O5=b5c*IE-3;b_m4NGAgvgNf_p8fHF8ja?>!tV_*HhAX+L+H8&pTaM-e1?~Vu3cgxdVy*&=#nz~u2yO+ zI#{@I^cb*6L-J%btf12Lw3u;S*=)1_62KLWzUyRBv3k|+7ge-~*{VYQBi(`1&GGy~ z^~M`UVAMhD>&T$-10V#FaA2jUG22>Cj9QudUcI_W0bfyViaR6g0v^Fx}hdv>rWlpFJ}JMi43-B!o^t5Yf@W z`q6l^1>gXXp8-q8fkU-G`Sgi!rvL)cTS9Q#IzRhU5c(P3Tg2EHRkegS7|3sHEA14& zfB$|5Dt^Nm!k*#yWB5)^b-4CBOWvsTy5lLl(V%9E-pIilc2=RR<>tl?tQk;b{Tkaf znDX0J0p4gI*|kz4%FX0%OJD%Bsld0{*&Zv$M!xtAzoe4wvfrEF!kAE_TDAS$$6TBJcyzCifAIXf-KdG3-wXu&en_s92ae0-)1RPnPHn&<1Xe30V9-2se$8hPQx{r z1(5kA7AsIv@DP%H}{&jl0?c4(DK78@u4(XQ6^77;6jLantVZU14ISXv*+jW0NW#D z{*yL19}Z~8NKH8|9BK-U)Q8UQ+~whnz8VKA0t)#-ES&%*K0d-2iqcNNPW{z0Vq;~p zvp=rhoZo^X{o3|;KKf=qKC1m`?t}tld2i2mc{$k)lWBH$%30ja4d?y)4g@t%0Fld^ z#<}(Z6M(ltvAPT6}r)bFut!iTZyQ`)1rrbB=KY+xI z0%lZZ(D^Q$XbvA-IVIV}VX_=jR>s3UQOm@H0Q|h`_J~2m#H2Ehj-4IGeDY;$lPB)U z<&s`}pTaFP!D&bPwz|@udt?seV^`Pf=V(#yTwIWG7#3lblwKnf&%*(p(h)(329n?? z3i;6$;QLNa@!Z%p?{#%mR`xAE!=t51Bs;`zeCoP6?*=SQ%K@XA)*LsHeVWI@9UEEI72T^i=l`Z4jDX*OXrASTbc)n6#L-HnUtx zaLd=X?u_mijHyQ~fLH7|jL-&#a190}w`my258 zm8zaKT=8Rb+pYf`G#n{OWq1PnX>B}TBl9*Uy|isSpAg6x@`W6XcI!OTm8KY*1B9fZ zu!1qKCW72izOT+sBE zJD~?Qd${_@V!q*8As8mIhIUSGeko9%y1x~6 z!0>EpA{HeVs!U8K%<}R?YwTebJk_l^NwuxM@N0P@F@n|H^Pq!l}m_;|`~ zuCMDKFF%HUHL|jDQZF}nDVLHEQe`e6TC7PgGzYww@k5LDN23iyCWv~4@smiR?|?IaV}jN)tAG` z%R~ZR0bgkCoqn~J=q#FT6|42V^FA7U;cjP) z`%y-86%43o)c9lnfNrG8vxnRuzRzfT_+7Qs{&0purKu9yr@=eFM)%z1-_biZHf0#+ zlG1$`1qErKT$^Ts8iUUg2wvlO;Ep35Dm?BhZEmh+JnQc6CZebRHM>yuN!}(}01q+{ zm8|EzKoJ^2H1`ag0PTM*Tj`fr3tL1ygDbOD?m!Rs++PyFZfZJ&u zgoGzi=RGk~A%o$!S2cz`Uq=AL69+_G{pZKZyxy&g15R3vpK9uGy-w+8D%_x}?1h}1 z%JRO&Ybo9*NuiZM*a_7#hCS9+NAeO z(o|hSuPx`zVA@0~$Bt{zC3cRLj+%=bcc=k}HNVJ*4{x9b1q=UUhgTdDj3JGLv)>j+ zQ~p;Q>Wy0)0bEkK&^T)qdj{ zwe)A>b|hO8Wqjg0mLl zfvaoX1pg3O>KQRaTSw1>|L2gvBfyYOkpF`^mN*bWY#ghEL8isze0ZEo1DS5Pu3Q{K zx3@QJ9J&OY8ETO!T&GCT-2xKa_M7*JLE`3xDt)3Z2huSlcD34Pi{J0JmOs$#YQ+|7 z4Fyv-fn{Ve5P_$}vU73g3E8{{-2zZSYGv0fNctPjhuO+p;iNbz*hP9VHp z{YvMR6joPfRV{sZ8iXbfG`fnDlkU}+Pc5g-0+@=|(5BOEHe&+=N)+s#-xAI>J~HI( zLjq{nUjB78(+0z@PL4Ss-0cQZQpKu&*S1gRZ_6;s1}Z&dUy z>lHmc{=0XgYCGDEZfc)`Wn#$XOFtAS{C3=wovl^6Gfdv`av(Y(2+}j|(_zpn zO{Ey{PUBGN@=$g-vvZ8(H#h-y6*Jy^e7Kl=L@v7_FEcWqAE5IKy5uB+9c8oL4Q6Db zSyilhkfERwj}xipr6!DDY1s!EU*mVXAa; zi}fAf>I#4h3&S|@m64y#k7Gl~5Kg-{$U8fAQFPxQ*|MU}rg3ufwmc;TSQ;8rL7IFZ zf=fxwi~rQ*Ff2KlbI0xe#xpe|oFOy2+i0x|le;uILwE^;4z}g?s2Y>*lhKC3`EGlr zI;rPSC%>mA5T$c_25i^rc3y6Qv_Nr!6kUZF3d4%gpbz-RX_na1%)_X5fI>au@;AL- zNGi`fZz@~FNkW3`8}fjI0fhr0XB47S7aTM$F_a10iPqQPEbsip#@+oSN*ZV_BY&#Q zS2O&4jCJuWM=gJEFso~Y6}Dsxqo#|xKjfQDuuiDn-#lAh@@^JgYLYK}f3aWt>P}B$ z=>@ClS85g(_>~oT@8NG7{2CgGs~~KGcYAojTUhwb_v~Wh^h9m2CYz;h6JNiMItIR* zEIrD&gpX^=PzeZ`|7x5mz!RWgGw0#0io{nO=9AX{9SAnF<%nm#A^UG zmb2r+Qzc&Nb!V^d{`B1nH7n(o?A{$u$f=sgkUO9L`D45N<#4!NO*EfXaO}rwHUgwE z&U|)=Vux`Cn+BDP@pwnu*oR!Q^3xDjihzLHSsi_ThsZ*AQ+7{qrUZ>F%tE#z>5icz zbW>J(MNOv$)p9dsmOjNaecb7LbDvUHjjQJ(c!M9EUOJjw=`|sBlL%u%?Zu#@=>xKw zR?xiVuo)85BwjdS*4Tcf$G&5)2nO;QjyMzVd%jPsoL)xhY&qrVu7{yv&R`GAcZa2z z;Jj7JYbpfrLfM)`v&fS=y(<{mCpp=O-rJ8rLepPe0S}E| z0sEPMj1u;U#?t*QgZ|A~D>rofTSo6G)6yJ4D6twMTY&qX=%Aw|`Ag~d@US53w-``) z0dJ6IPpnaSPT)pH)(J1HmHJQJMRk0~w=Slmj|E~&SSD>!Q((T!~?kn&X9 zf69vO3^XA{6+A1wsE6J6!?KRrUfq24V)z^t zuzuV1WYoiX0V<+WnNZUAErg1QVqZ$ZH)ZYv?XpLzA5}NVyz15TF?NY(_pH{zqM#sb6zDx0;gFYJs9Vb+ZLFk$)9vE#>>^+82%&+> zV!%V9_dL3@O-oPYnC4o)KYg=Av&&GILlWh-&!_2`!AG3=O%t?+- z$?2C%=A94%LcYmj!xhP>&*u3{{Ody2B4KWaLdqPjNhhb(P-4OA-7S^TOJc6GbHO)(p43O)5W8$XM=c{ZF4lT0hTy`2FRVTeS*?m>3*)l&4&z)sre#sZ;fx zuy1GOqnCA*g{};GP<=DABloOP;RYXu_qOrah-ToESOyT+0NL^V{kuLmO8%X(aU|pZ z`=mT-G&BVJO z{Va6S`^$5cVP|j1{Yig+Zudfq zpzlUsx50Fos9TU7pI1s~XV~S3jo!~!7js^CyftU`0<+WV+q{#b8>3(ORpH=5$zqsp zBHu|a#Q>F}PwV#L9IBC*d91XJ(ZItBN(9$DDOIJzO~phl)dYS3RH**cdRX%*;t9!L zs&7WONEPnv#g^>LvxV=&=IGH?yr8Q+LX%^iX$nc;bElcDzMOFXap@|-fTH(aJSy-t zAD>pPW-AybL(>%+5D95Ipi(VRdY89NB2)@dLrd6a@)R8%_VbcmPC-Ttx**O>d~wTmCgm6BCdp8wVSRju0cNs@}$?rUtcs z-dX|Vnw0!oA9!`2Z=~89iIYLqP(lN&;j7%Ullf zV30-{Y!6>^BNzZd;3e0eF_st~ql~8R{iQIWPx;vZbAc^4m0q?1Yx+gMrgnN~kBq|@=T6%`;Jz4s&n!U(jghFwr(wczG2 z@W2^PDm=To*w_th1Gcb%tMo1H`y}|!R!X;+nw)@1{c_%wo=YrP#wU+XWcjzx)E#tg+ z`mFhtu%dQw<|{;Mr57(01wVe?Z@i3eG^eU`h|2Ccin>cO#zu-)5h&eTB^&aT8|B59 z|1;0E#os-y?%PWca||-r%amlso{^=rJRh zhum~4iN}WnqINEFM#dNE_TN7%1nwSWqa{byY2%wZ^^OW0*o>{`fnlJGq;<@F144P^03^QZl}_U@UH; zQc;a$=F_5%Tlv%A`NAH@ZbsHwgry zrMDli*ze!Cy4A5bm{25fl$zl_Qj}ouJYKLR>4-;a+epP@)8O=OkLc*|H#;lYl%3lC zp4g-NTzI+G%w-iUaTuK?UJVPcI+`o*%I)NkWhl<^a5v_7A8I+bsd?LQuF7?BpoJ>v zRu^4a`6j%p2+hQKw$UXWG=-e+b46Yp1o2FS)Zt5h$KBX=Rx}h z)vK3F)lcH{F(L@n>`bb*YTU@@U8?$Vbxq{92IF_+TU))bC|`(V2)X7fWKe=$!*3&5 z^~~0bAHK0UF}t|A0g_5oM039}L?ZHV_YS-d{XRzuf!oonw@BmYctWjoeiAbp<88`b zMGBW;dRcEt%5<)5awKP9k&-S89SNSxA`y{?Y0X-Vex zYZ5O53cI@|&W|_(5I2lEg1_~o3xHRsoDs2mrG1~gi>1`p@cbzrrCOwY-6KFRva-vz zYu0PwP-(AIIj4VWe5<0_`g68&&9>jkHl{vDBKk#cfU$-7Q*OI^O$UCf;NRZzk*LC; z{pM|!I7yCHwI5hG07$f&Rl5h%5p-H!udNr`@Q|rIP6wEHd1;-qv}2%v3)>HqrFAUxo++UqBVooeZ zDE%Qz^SEY`4^NyYC?Vma!?anf^|-n_!I`_00aoVhkk1!|5Ou7^_AR;0_IXtGQE#oi zn#)FzMy{gJTs29q-NvdDlNQ|PkqyeOlxYez3c3KKxl+N4 z%ca3A^Pj7`SvMN4K4#aZ+;pNj5^IZOP{P>n~r31)2JCo zGP5KP^rtn3a4dPu|JYhks&~TgR)~+PD)hIGAQ%LHuZ0zMM6NkZBs(6?W6O|NDE(=l z7(cVyK-6ML=d?{sN*D`cung0I7y`8!0V%edhfzkF5SVv8&Q}F7KPD#_=Zf%{~BJN{X z5*z&X*e47sD!3mqu6;N23$$to+j*2*A{R3igHdY-UsBgtT9&+drsn&S?r+$zKRJvUC1V1S=pOV~@yuJUzSi$CU%p#{`L$BM= zwLOA#V8CIxH)%LYHZzc{W^dxSxw0bH7k{C|J~k!`G^aj#IN*5R>bZ=3r!wtYQt^oc z#%||HE!U^<*wlJ18MU54Jb6I!izM~BcQlNrpfj#W4d(kt2kh!MZbubq- zXSozyD0Ex$m8_bKkr54z-$WpF7rboqhJq(bVyS8`+c22jGDVzyk?u3Rz@Ec?0ibhH+;1I|#ojZWR;qS( z1hvyWdKicUJ`kUap~#>~!gNQTo`A=}tm;pl1*u67F@@OoRIt4J8O7zY`3iJZ?Y zDyj!1q0R=tm!nM<1K4uI!LnQgeF>qJI?i20DvtJ?+ZrP0aW?#~BY`?98{KJGW_Hxc zRA)N$%w))eh@1OFsMdLhp~|6Ct|iC<^cF^F9o9xg1utqaHLDJP)q8U4>XFBA<&ky^ zCHbITHUZM<`|_#V3r7p?_&jVSZ|8q_<>0fWJ({SxpJqCA3Aj2$tgKOaYXHjo1`$t0 z^OiF6Ih;NPvaQon`V(A6f|w@vFo#9HpFqNvWeV4FWb zm7+LJ*(ze6%}480g+Q>uOX)6~81Q>0*wbDzmXa#tSN(`N|M&w5< zvys8p%QULR4}%4i$C$3Eo|!MaQnr|{EJw9n17t~A-6-Ma##T_rOQrrPZ1wqbt35S) z_i-yAJ&6wGGp_1FdDKdhqN$MrIASE#uc{p|HG(X%HLG*=e6ONAyz-wU#1IoaUQ~(N z&{HWQJUTx~cObvZtW`75vBrlwJp$n|zsnO0xy?rjqPp{D?0UdHkC__*U_7@pkW;G3 zKua3|fPU|Pr1UB-YAdMfIgzMiq%4M>{1g@CYK-&?lEH+UGySidzJb{X1I_~IsiRahJS{7J`Z zr88gfwybDtrh02wuQp3<@2+8olTVIH_s%v_J50#)rePORUU}B=}-*obK7nshwxJnYBZo3g|6*BkXU~{Dy=boU+~Nh zyTPY?e)Eq#21(6ull!trk!}PYOEMKURZW)^bKrE-gL+-S^*drYKWxttz9?O8Kr}XM zy`F8&{HlH+q2=jLW;!T6zmRmDP3Jo)RO35b;>gH!cy3yAPLR=CTT67rl}EtlKtwV- zmr>V*gbb~z=ZzIa%}&>)>fNr>UW|9aBj$`)P%azs^e+b zbqyTXgTxGFMyb%{^e7VD^V2m41!@NJ$mX2}EP;!nYcY9%f0mdi&9^mH+P+jQ(4s35 z#%0p1n#Y@N{DhQFtO>Q4P*c+b`51Na0+2Kaa-57YF}KCJ^IOX2cHq)bLBa&{&W|7G z6_u5$a&*OXK}nAo7{b>lNasF2Ah9F38TvA(a}Yk6NXUa{jGPm7Oh(H|Ehd=X0!ORF z{luEYIgQtO+sXFNPfq3hadC}!gZ3!B;zybLOG}xAEU?w%5?Ks8$RKpt+Sz&C72gTH z^guk2s2)N>u>mrOrul#8Nf{#cO?qM zq&{m~bg3R99-Bw%ZBzCuwrH?p#3J;}3-~Mr(IB%?sfb&+S)7Gg&>SDgO+-#4y&=-x$pQmSz z7_6+HINrPnF&|qM_c9-`31HHU<*6mr%+jvshdlC&u+LpoR1=PKxx~oQhWEz?L@yI> z;+g{+@>1u3ShhG~OGN51{7F9jR%on=PG3fFCW& zPF(D;*6;874i9IhAO^)rNqL8dAqK%jdkFc1yp6pw^Ocvy`cGH(5J1FG8ZABPaFMQb zCtNz_ zIQUg0YIg0g>(9zQF=;Yz(y@z(G!_~Lo_$p-bc-xAR%lr-Gk;La64L>6zu~Gi$v}d1 zr-g*fH~lo@MK?V?wMjf{^82h)jJmDE=~X^}+lKutwl->j3avD^E^1xn)Pv*7&H*J2`l(mOOIUx{h23@Tna;aCYPqjo3oV=P%8z26N~@$IQ+xR zp!Ut{w+?b)ZOpQ~^t`ad0LhxU6s9BL0`enWOt^T_K9Jrv=M)5$Qh7u%P00LsU*f!! zJ`el0*lA0aO18so;xYz)?>jbwTO&<~{Z*c(O4}}lZz{RNNF=j**O`U>*>MBY$~C{% z+Rje19ro`;Cs#ErR5vEm4`;(<%%;xygwA%k^qS+7t^U|hP&To>c|qJ9!1JSg%3;3o zleyc)nd-_OFwR;DEpal%gC+R4pL18g%2Ug8KA1>vY|);XZX#FA?#Fo>Na$&}I{d)- z{OImCQ|`}FQ9*y^=f!%y+{fq6r>}Nk)agxoK0YCU0Ffy^VQ-G#o)>X44c^2EJfS*5 z)4|i$%|BzbD*1vfLFQx(x%b|^OX04O3+C@lAQ7Otq{EW7-7AI0f3|yv*Y5Df+qE%I zqyDc(_?*jkn*3EB@gCn3aK%lvoYDqiC3Z4L_3KFWC+o#vT-qVpA`)~H9IKD5z6WdR zep2_RBj!2qJAP_=YT8t8W525F2PvL-eD-tkB*C!ZZ%fZ3_bgA(+_RMPDAv+PR9P4WlHykI@+>yD3*lXEobr;)KL6bhr_8R~aiD=pHfPt@T~Z-wn5 zx;S1*TTruoBS(2H({W=9FEC&HQH6YtGQP*z9x=ZFW0Eien3sHERC$FsJ_6u@}E=bEY@2ar( zV^aR}H9>Y(AA@$C58!1J`HXTTmZq9K>ep|_r`s-ssMb9|?5`7d z0=f%*fB*~eQp^32PfT$;A_GvO*?4pWa+#xP|EYw~he49zt=-YA1qyj;64g!)iQSSB ze(WawIfH3B$VlOYWhYQ@xl2OQ?0c7a%4U0Zb%Y)Si!_uA1b^G4`O=e+tOJcL0<2l8 zY(j_r@_eT_K9?C+OR$l^mjdaSXE<~?0M*F>oH8FSqJnXaoYeD_u>QPii*!RhRqT)3 zi8=T7TnXuGUDJgw?3&|cyeRV5KWx}8z&&MYUl3;sLLv`kHzmQ7)vKnfhg-;R7H35= z%!`v}FP{lt#%I;liae;4iZXQDmUvKoMZ+ZfUA|_0iPZjk%0J78Y8E5K*HXnDZDS`L zN(Kvr8jX@VtyQ%kE7svDW}1eXC%y4nGY1(K+@lrN{s3k<}3^FDt@fURL7^&F28bf>c3UA&rk5R?bT zRQ}r=!Q%tVZtA4d_9DHg_)t@PGa;!Tp>`|%#%Y?Nr%4sn)vOldgiI>7bqG>93SVDII;2ymt3s|xn*P%aC zt~qc;0uYmLmX<;*&7GZr?GgU$#`2cccatD=_-1+G9C>n`#p9F^4`a#gVB%g7X?^_M z$=5eMZv0y!0@pCx9sgIVGx^Y3zy0l?u zF=^$s$k-4_>Vb3H93(?#6Kr$-0r?af+Vn@id6-R}(s%Rk2=Y00Wm-&7m+bk+r{22H zaJ}IB_ZOzc9m-;^uU^eFa~O54K4QoXZWD~kDqjx04x@GA1+V8nVx$6P#3P-Xh zxnAR|XV2O(v7hMRON4CYtOK}PEFJmI;MOyTy3@=Ig5l}|4v1<6TxAVn7%sCAfUbyr zs1HfD7&0<43&eparkW%&;I*qoSjW1cwDN z2dx?hX{kxX{D=|Z7^R5W*_eAf(9{UCRhXNCh4S^M>ewl$GhY_!uwV%&2G+Tc-6J4a zwCR6sV-t(ak{HN|f>7@O8bH#`AT$KxpOdSre4&n3wjynp7nX9<)KrvS3zH$N2l8vn zObc`M>dxs7R&Rz3G34{)aa_c6vu!sZ)@U3X3xi@F>Z%P`Dw*bEE==N)1`9|0;7XB8 zie(*!?Bc;%v&Vbt+KlCjS?{HzfB6Ia3k*a-hc(_dXgX8Z#!5^ixpHkD;zH8<^xhy> zb`{{uWko#_UH7TV%=x;~rG}uA(hOhs z{nZ`$Oj*^@vOICGYxju@*3-0Vw=XV6U;P9W!1~Mu`X)UTbMeFgCs^!F$A@b|JUD3_ z-Z$mhVzu~Uu%!Y6&IAU@DF%Qn(Ol-3kn53CQH9hvpJl0*aA;O>*v8^wM$R1VE?Ji7 zw=n@DwG&{3N*B(c@Nf=5#UO-X<}{7Wa6h>wOHOJz0Lz$e+(&0N=@t$VjP2qtXNcU$ z1O@TK+CC&DVZDBx0_s_@MoH%S#FVR&fPEhA4LJfm>W2S=4Sm>9BBD*9p}G%gT7&OV zZtr}*e1CDc=w`YkPcXlv45!ua@2V|@3G^zu2^n)$_prmh_oPO4`)F3njs|Af&w&k& z7jXTkq8(VD)h%C0k?3)ph2?%CYq&P*#U)T;$QFaoyZeB|G=pY&0)IwbXcu{Yk%m{C@{sMcdM3^MB zk_if(7KVe}xr43e+})q29wg|Vm<(86w6x)Sud~%U6+kg=lL~Gq?l8d3z@>K14y05| zO-Q4dTYj&vi#>mifal&*_*!&%fWAAPC+=davd)cXG@s*%Hw54S?qzl))h7((V4YsL zvY?fWgl^^nObl4^7rhp$E7$o7&f_L#qH{u)gP1fb+M#YGX8!zcTjCh+PX>-}c;HW1 ztgTh>AhLi|EJN5Qm`3{?4Om%yGJz~BlkWVC>idQJou65MuEtpgz5Mp|EGo5pl1}{9 ztH)l~$FO|Xdz*ZGNL(V;Ct5B?-ZgaHXLvm=f~2!8v#?7t(?d*DKgjSn+aDYY3=Ev@ zNn303V>_(H1mYchWpKjnCJV9;Eqw)lL|#GKI&XTIMJxX!e-EJ z0tKzt<#a|4n6LpSs>dE2*NxfC2!0yBr9$3;@*#T7cIEyO>vnr4M5*G;v%x}T20UbI zV)Nae-Nw6FzP{s{<@O)&UzvD7Q=S*O_#igEvmeL|TdjsNmZdgoSP!f(JP?r&br*Q( z_2_CUE2fapNyG;Y&5Nm9x0yr=v=pKr7hPW&Jo}KO&2ssAmrAj;$gJQ_3&7UP5v69T zUgc9Bp`bA_GVoqXjvJaZ8=_hL*Zk^@atZd&PuOGlxY;Mc`0zTIJqsaw6trFxuY62)2O6dSAn6ZURzAA5an zJf9KmsA@(>-u7|27pM`bj&gbCe0rh+M&aq;Fi6#3|(lxTW)An#9J`B_pujU6^T8z5Z zg8WNx-bqUb6g8VQH5*P$R_&>S)MVkCp66gwuL<9>UGR98^2`8*5}4Kx57Sdnw~SE^ zvW+ha8my+~eYkRRa`&!v{2a1g@BEY*x&g0%*h2Ya2J944GBUQ{12~8Js@RNPdN0>w zIi;}g-}i3|civvD`0|xLXip0QTJv)E^0{UJi7Qn-FU&8_gj`#Gc68sgw3MS$I$nsd z5*3;4YVY|l^6oM{r1@;0KCuFm(=UwL5%DWc!sylmCL_jdAs0LG+eELP%F8oY)@y!p zKZz`H+8TntyZ4sIR?rXv{^8;|Zg0$z(|ZC&UE*%X#^_&C+0g~NqFLXnmUtsJn;yuq zIGD{#iXtE@m;;kq?0P_^k`q}*9X)jm6EK$i0eaupm-9cl4&IMf$dQ%PvGzDW`uyPoVL?1yrEmz@{!O;Aj|h!Qr!4|hnqeWd zr|89?l7VwKqBKz%Iw+|n13>LbM20z4%m>CXae{ym?k+0sLxjl3TZf_*{sa#)? zo*oLgu69hC2GrO$Pp zkm@#R-IFZ&k3?}44^UNAdSy2dopXgg)rT!XniOPY-f3w#-vi-N+jHp2koUpoL_*0* z;fn}bOB^)nyZVYnPly?Huj|csJZ)?eh1@@=Ct7T4TFH66QjSKWB3{oigin^d<6qT* zcz8lJnG^r1qY)^O+} z^!hyC|M>jO#Dt7Wp-S&x=>!m!Yas8)R=EBOz)Er2%ErKBNs<$qkoLJv3e1;U z)oO?A8Kv_G(1BsKo!4oxij++lZQEP%v_0J9&DXvdE8-binyBWuChVt~D-%~I9dl3S z{FHKa`oDG74M_!^?|*8GtGZbHn;fEkiaLLOGOtZvG(!d+!*_t)vWaOvyvc4pw%?*J zX|ysp64Y5Krl!UQ=J&Z`ziJB=0<^4&g#Y`?NQ|#i$+{(YT~|>^dwx~R*?>da zV5o+27I7sb4@DB1F0ZaD_-qzxzc71BaHfB`fw}n%GLYH21pXKk!`}E0&zA7=Aae1 zb8AN3c%lkRDVxLS=Z7IyJo&|6e}qTN+^@f-l&X6TpG!fdMXg=OqUH4Z3TS5(P5Quh z-P!5B4C+dc!I42}uL}a_`v&d(uYVr^grFO-iU*1HE#9QA?1}<_`LN zQH#q?zrx0UBMm~;XAf_bs|2=i@o zAfNh5Kp^Q)-`IYPtI~@F|`(&p&~TuN!kYUN}SL3Zidsm#C&U6ww)6lt!Kk_vfajyo0erBQtYlVO; zY1AHW%3;zU!d!3G0(%eP8(90ZHAL=Z?kfYq<2S^R6HY_Hq!)NcbSfTq-YVr#73;OQ zp)Lr_h!mH-$N>Bu{+l;@5W6efK1PX0h_|!~`D}V(myUL#e$PeKXGleLTkm#vi&A^v zF6Dm!r5f43jBa*^Rf$+m*LM(?SS|h{7>oPQ@KhE|grH3S^y!h8V%{+eN>~h@f;0dA zu=)pY-0R6=fy#KhS8TZaQ zBM3NMZWji`7neG2$iIJo>sOh%XM03Ww_b2qee1%&q%#jn3U z<1%Vx0@@1&qJV|OlPg$Q%-?P5<&q{lXM!(+zlhRr&&TyGO^k)QsTJ#UDCG!>1QG;K z1DG4fkdPR6edP~u6U|BxX(V=N;vlbDFFKk8wWqUH3uWva=3|P`G#dz|~SdN?rvKcII z!W!j`;d9P}hRx&^tyYaJ{47g~io!xeJF4&y=*{r?*BP~*t(6V1@Yxz-ZPclghP6G< zk}rjm#P|Aj1md|w5rqSs7V`q#30c{o5-E+VSMPt*s=E(x`FEY?b7u#Hs(RMeFB=;* z=6`-{z+u+9`qpJ{w8*eC7><9ie7Z@oQMWwYr7)arv>P{RB}a=qAy?nU< z1_aN1^zqO$^c$@{K0ap+aiO6Ii1xzPaEVz6`anEomMKTc^$IDer^A}s^OZsO;c7=( z5)!S!9%mi=`(_+!u~t!)lzHswB1j-bXz}P!ytM^Xlbddno~v==GG{aJm3E|4R(0FSM(G$Xp+^9J~{@*u=zq-0cE+ZNM?3Iq?^ z11fT$6sN*r+F{DPRm973D54Lk$G^S0yKr(L>86Yj+ z;%iSm8U3~-m7`pXK&6x(r&}@*D!{}QaWE!J6RreD+aFae^<{kX#Jb{Nl+>C zcX%MGkcWqaWZt-OBV8hlsb=%%jTPU@EQOQJg(RV2O=^m?8>wQ%WDg&b!nFrm}an?bDyY> zQQrT2#ufypDLjtm1XgT&z*p3qZoff*6t6VwZqy1~oZFhO7mZ`_+F7Bd5};nsgQz;z zjf#p?@E#Z9GS{%YM?o)0Qy-5CIBReZ%FJJnqLGX;0pTA~dQULS8qh z$)`LcpLCiL_ffBP25pB>@I1X>6i&}}blK8vm;0H#Z=1IhTAn^HF=Xb|5}l2NoZ+7% zJKa&tk!rO%EG931@6G7$RoJL#aK9P4P0fRX>Sd>5Ue~%`g&81HQkqbyhyBTvZ*YAx z>@ugrKlz6z3s)KZuR}F=s%bg=KO11fNAr6B!tZ{LG{nn3xATgcA#93dB$O&OVZ4FK zDEsN&z;KBX?b6aU(?-HQ`j(e7L$k0&pZb5U z%;LIC+qWY76(U@w(|cA8`jQavWIktngEMR!I7P>5x%u zDD8ju_5VCeN(@2`>!@T84GRMiYXI+bI0#rlP*hW7mdV!9v8AsMo0*vz=A^(7fnYt9 z;B?!^zj;}umoydj*47p%RntACvLR)Okp{{PC_9Pi>XLy}@8QV_HXfdDbv2bK-1e;U z-;8hk5lqEsY;IP=Hn@3HP(=LX^XK1E@}bn%ykzS{*EzMcs7_ADiMqMdhebL>_V@3sj+F-=@2&7TpdQRg04i;Fe5s>D;&GHN)Do;c4-C8}GcNV9 z<6UPkGIa78(vRXy^}F|0K7laE_bOu2q>kl*>oBDzNQQZ6dM3^o$JZdXP zN81XqePDNBd;NG0^_ousHMhV2{5W>O`WpBCeQ}@Ld&^S+`O?_x{u(i6)-|B_4y`V2amps-rwimApkDJLSrmcWny0{|)K{Sh(#-4~qRm~ohIf9U9s6i+y`F{y(N zA`l2V?oVpDEd60HO$4Dcm|TSef-FDDgB2ak9I{jj1_3L3p1^D1ywlk-g5m>5X*B4t zAU=QANixF;8Sg~q+yK##m$w=J9+bA852}01j7RfvdUk7SZ>O7b;Jdh)j>U2c6@y4! zc{+^O(my^s$V2d-J88mno99ctA0OLN-FthqQ*IQ)5(fp^iG4tsOUKG0SOa$rKlnV* zgYk{T4V9riZ?ZZg!^2ZaOJMPLHVYZvhZa4{N1gq88#l=eAD;&R+!8nRXAi`F{`_Td zEq)zlzC^x1M#nXyrl5ednjY;}wi2W132fC|`(Cs3%sAMw;r3%lWEc>+hIc>5y=IF+ zu;AI8>M4t?gN9S&%XFBA^Y5)y>P^iGKl6jyzJ5z#80y2fwTqp1UXqa)>@;HAZ*3M5 zO_RFjmX%JJah2%&xV_@w4J^Mk$+udQTtdfYoBK8`lg}dm`t{piPL}olMN*LA9!`CcXojK`TEyZ*s*@MRpYhw6%KvfRrMFQ9UYHP;CLvA+!%N+w&agK@$Z|2^3CDx7%q8W%_l*TwXB5l~tOh8(cWU!5ps$-jqK57>&j`|AScfj-{XwxKcU z1#p2(rDtWK^lRj>uJI&NwYc?shv?A5yfmhwon?4o#`HoCyZ1A78 zHUHq?`aLcbLPE%YYNf(!e~iP;J><22u&Vk#NxRTK-BR84fJqO)>;MA$UrbMx>(3Pik(RYe zLFH44P0aN*Ek$~SsH8BQRv~JnL`Z+4DhoXNi@Z^CyA8p_?@y4=d&g>_m4uA!;%Ye~ z%Dv)7o~rf1KW1Pp>*jP>=%9xkX< z^cQF+GO9Bu{0>KuB9CqBQ5W?E1sA^4iJaHIj$5V%dE(FBn;^a|AG4lx5Y4d^KpP$EV} z+dy=C0|^T%@fs;P`Q*oo9J9PIS%a2mVwzWl9N5%iu*MC)QaT~mVaZdkH(1j%-CIVH z=NwyDbR;sA@=t#Y1yP;sk1^Hk_R^sAhJu5IcIGiblPev?4u&9@&0!TCoB;3HiMldY z{lp2N@NkT+#65XA2>MuJ7*ZctP-LEb@|~rEKFKuTC&D~b%fJMvfqsCvc6hx-vne<)r)AT40db#_S)`1 znG)*Bed)*r*u~gH8ou+L+ONmBkW;oe#O|LOe1^7vdolBHq1}1l`0>}Tj*vuEX9&sr z^G+x{JbpMiIYIp%XS9@1#LDU^zd)_?>DC1*BMcBjDlU&z{)YE5#TUkJbEOGhT7F|=eh1^)6-uz_e!Nzq34o< zkgMbO*@4QPd-CA`uWPxn+VYmnTtai+!Mz48ru#F{PBb*%3LXcZF-#~~9oAO@Q;@64 z7Xegy6pg;ckY42=)%Cy{_CuN`kJLj%QHYc4Lfe)HgtYXjtO-C3wmv;H07i1Iby!;m6vm*$cTckZqHaLVr=z6> z1OtQFp?wlm@vi=cUPBm@C;{pCGhud>y7Br82H+rp9LWfQl%!<3}#+1YW|EZ={0P1+*g)CBNwnvsOu>YZ~>PzORF zZ+!dt5vhu8mZLI8T@Gg&qIF$3pm3aMXiWgp_mhdLGvbC3AbvU# zaNxBLPU2}kQ;_&cupje`~0#Lt8M7un%P+`Rb zpb`vgAqM>;Qh?E=0YCZV@2}e&;0RE{&1=GRaF$^F(_>5mepA;2e1R(Rbjg9)tW1j< zU2~{y0cqoBnYnGH!`dZq!O%L2!bWf0W@=QojF?G}5|alOY_Rvzk{BrF29%m+-XZn8 zFH~Q{VR?QFCX+aTT`pc2E!{%wu8#Dj{LKcaA!k1I0T{)`Rin-gxMhv`nxd?D>x;*{ z7qo=j=N(@}Qx98IBcA=o1=vQ`0zK35<4F87yInc3SDT=6$IAtCxmw*trl#RTZK5+X z)2H7hCH16;+QfElc#t`2x>OmMxLaB6XJ(`RuvX%4l1&7JysJ;1Jn<9u_nkGo=4J44 z@Y2;)70dgmbT9aCm6oRiCb_qoC$AKfa{xUfRvdU^A4Ko^Uz&73%;q4l1Si z3j>8VY|plN!4zJ|>aSeS4N1Kc zQ~>Yu4_JW-mA5?lxd=vAO$ByQ8`@OX_l=F12pA!J2SzmhlZ*fN!CMCh<+7c2j#J(} zZ&aVkiP&6+zpkj5duu>v=;Tx(jD^aSwEy0g4IyMTcL)iQZDHcRftpVw+wZn80nbEI zqNpabb6&AMidn7?h?T%mf=AHN$NCVW0-hYW7Z`?!%1`fMbAOI>z!jc`xp?VPQ4XtcIkHONfWZG8CEy|3Z=-TKG8?R3x){_y z{=WX-m-$EB_2=4e?yjl^Ktu@#=HFMSFhB9-3uUNkgRN}rNOqzAs7JA+!5nN+yD_gf!CuZrojvu?F{KpRG#Pe9IRn`{e89Z@Wi6R zi(&(00c_NFz(#=)#6v+qB*39l985XL`vk?&V4?kM9YHdV(z0s{P%u3b+F$46Z8vd0 zIpm~Fu)BB9h52TP)|I6uZ{LSxG$4c9cxj(WSM*LenJCT*`eKT&)r&%_@SxpEDVld5 zcDZ7lFIt(g*s&faKcqPF7;IN#Kd4Otr%d!vWxwPgo~OXIA4Z12=Af5+{`mJxW}Tu} z9h8W_FO8=vyOGj419Uk98Bk$&?br5nucR=ZYv+mOSbAh&n9<(N{Jg>2J>?qa`mg>h ztd-29j8>D~SL>za&Glb?NH_wRMxq!O3~>J5E?`2#uiVGSWU z?Gc1uJuhzh1?A_Tom})Inaf{*E^^(4M*t*c&l%Mx3;O%})T$loD3(%uBqc+egC;UQ zq6_^Br3?dY+Vrg%M|!&KY}5x*N>R00fJC2VUQgpEER(4^dq3Z=$%5{aDrd*#)wNM} zo$)-+Ob0t6kaPVq+!LAXMnT36-c2scS(SdDjMLMlGMA#X1tXetU&{Bg?k#RrSyW|3 zZ4vyl=1uRK=4|k#N)5XmEYAd>*SsB5TtV>0Vx-BsOj z@+jb?=UQnQ^qmG)*}FTzlp~{qci{@#b&i(6kWpF&Hc?lPZ?S zkuT(A6_)5;ma<;8!ehU2o()2(qA-$O_UuGX(dV`orG!6j;7|a5aMn{V*{X~40}2Vf z=JCATTn*(`d=Lz--H|nF zYT5X8opcrCWeX^lCSBL6W`gckZPb+quGF3FW1iJt9E8@Lvi0FnOQ1jSNCxiL&l?>S zOFpE{OMP;rFn+H5tK&w`_8#W1*|xJ%qizD3c&8U=XpchEnCsodq#~tz3twxuTO9Np zZXIOFCIn^6r-u-5ET)BrUkM}{(ZZ%CQPk0qV0^`*27f!~L%PmdC*+s7KGAvq?{ZsN zwC`YH;;~3Xz-WgSQmp=&;Gy1v`mWvKv^uzR)N>VZRVL(&LS`Kv5}QmMKb7e1NgXpN z9SyvbtzQ0MpmYVj`EWq0Uzx>nd| z=H-|Q&wf5NA1)kTi(t}x@#5T%-SOSKKcU+~3Y9iR@Fl-8X(lQd8v5NP8rBI=uRp&& zkY!s!z)>M=zig*C)2#W;aYJpw<7CFqFFPBAL!^pZO**yhhI3W1F!8sutYNwuyq;KF zH(f6I{ac=ZXWLO=yA`8SLl$-1P}^c@$%sM%*I#LE6!RB|6oiL{K9m?On(;(^;O1s= zXj*gNMsHU_{Yr$2n#oM_MYdXLhF?IgzFY9lNV#P~dw3QlG_|DS-dCEtc>hq&0NIQe zEd1;Xg+xe5M0ZwtT0Dn|;e(U-lY;^nV<|t^z87eEYoD9XW_J8wS1y8?)QJB!Iz6L= zq^#iUexe|=qr)qB-R^Fe!b3tXv?ytr@@sRIa}u31>LQsEGLn;@59B(B^<4jZS2Rrd zPC8T)$~iK5>O#pydgVDr-Q1<-V+F^{IVIFj%ZztEQ$#_RL`K?aEey%79$MtKaEnTG zHhd>9FKgWYReg8dHqd@`*do;vMCr14-JJZrF|yvcnU54pPfmJ}(AQHqkI%m<{8ZQJ z;J{b@K6Y#(dtpx{sYJ(q6t-;O0rZ^{&ux%0L?M^X*;GEbzMx4sIVa?*Q5Y+~$Os6~ zpPSV;Ss6@H%IxYCtJiPaCg3zl|B{-sG826L&El_iwR(?~|9dNo85g17tY_{GWc9t2 z_qbs{q}dJBrmLf6YbtuupaM<6wVJE#aio~QE09%cy0DU0uElmNf1Ve&w=$J6kaLl0 z+(*(QPP(^0T+#t-`)|*lec2r~t&dSxX=)NQdh_O-u0Wjh>{+R4IcI*g@_MafTA7(@ z#zK-MnNa;h)T+AdyY=Zw182(R&&Q_GYR9|`8CMaYS;{D6CVsB>ENprFch%p1S@p|j z;d67!5euwRm5|sX*-K9LwS5)^b+x6=wOS)T^&77`5xvT5y09C??N7sSs zsspnGZ|1q289bDpo`KyT*ZFn_)pNjXUJ1USg6U!Xo)>&iLlx5{g#+=n5^QWs?vvK{ z;a&dwU0)Ds^n7RFugP_Dms$iD#A(4dUb%y1KDwJ~QRnR2GE8W(m@J=8x3W^8{bFZc zK)}Uxi0N0cL0{kke6oD0iA=x(xH0%dg|;@M1H5Xma5j&NIh}1hiTTRZjk<`2f`w!U zhqQ$(10-YwU>D2Dv6)!E+!e9-fJCu6?L zT^(h-_t%ht=kT9W{Wg7atMOXb^wTphr3`5qJ&eD%{lr?wx{}d3R$#1l?*Q70a_Y{H zozv4OTEV9a3ZgBKJAVKR(!j51yHJ-mQlc%eP*#s}oV!cH;gOLvKv@A-pfpvdcOO?- zEY$AwkR*_BNQzo^RVhneX?H%39xP$0>Ci3rt)@QMD1qR>2l6NWIvCif8M5xLK-5tI z#*yE;9i+H1nL1ExV40`EBMz+-DqynrRt`d9Iag93BmCt<3WJ8MXi*LyAV983^>W=0`8MV(p!bzni`|`fZ&RH4gjO@+1>Ib!k9e5e>@zR_o{i2tzNryIsq*~9o znC#4_-@;QOP|cGK_XCHB7`&}A=b*;YfOs%m_Ew196i<&j+Zk=|?| zdjsHVccq*`5qNj#>;`GBWW;iu*rmVk`5k-3Fe@vQ(_vMBP9Y=Gx|bq9aeHnCG%QVm zg>OOVpAU=tB905IGVsdZH@uzDs2H7e+fgPKtWnxqp2&9HaBmoIR{E7cfk@!7)v&Cw zE~%+Ko3-QBFLBNS2ev%Cb$7?=pZDsn#jd};_Ip$p>%VU-W6}1{=OXe|t{DFPE5uvE ze{Tr!9rGRjKR^5J{r#V)JgFH-AG6-OM#WrRz6wvM^E6J%c3DFJhr$Q z;BDvf@5!ImXEJgpwk#06ETdOfa?7p?U@SPwu|0gpzx==Sng~M6q~V_wvR|^rDY6t+=x<>ARv85Qu!s zzjt{kMY(o2dt>Sa+91MNy+#SiJ^$X-Tq1NrSEb}$=Y2!;DEJp`0SzbS8!CT>`IIKy zznAWu2G!%Ma;R_;jb^#Zky{0|P6!13|JKmK77g*D;&ihC%VjA&>YHB6ZQGUD>b0^l zjuY)ybsa>{eQp!?0w81$bxrsUy>?v<=$=_JXi>(L7q z$Vl=ymKZCyRDrd$Lo${xrUna!HtF_!ekAd&*av2r=?aVsyFqnvI%)7;k5A`WvN zP@GpV3M8dwBl55)z+@e>yEr>Aovd*VrO4Tv8lwy2dCYg+^>*)`&iTqi~$q$vjzIX~lycGbDot~by+g*G~Nl8fynv6g@=mQ1>r9@Ft z5wG3iXL)&f91@azAX=DD)~IsD$*{7r@;YrMqkew>e!8#k4S1vRNU=c`REa01ChOnx zRPd{+s*V;L_@k}`kJI)f7X8*O`9K0rc!z<7W;yE2_<7S4M58=7Dm-Zk-T)p$g~?!z zL}++eSXQ38=S#@cOdEYS&I=+_a&zqtkp8t(9w!>wo@X_(NrGhlO<%H=2v@Q)=jkXY zBjrkl=GJzZ&BQR}c1va02t-PB2na|_20sx`{*j^H$ zumvD0g)KI>us|&Vdl0@v@~T7i_VzXoj2zR})(%eWGz@Ff-CBgLiZ2k?neqMm6K81C z*^T8e{sPa1mXA*zHdYmG^krIda$!oz@E0J2pH}iHG%5bvB+2 zspcuGGT_b>QH-oPz`mnpW0O}eGkXb-!Fr-Tkf(xUXTDRx#-_N^ZQ`-RYP7@pIOI&c zS$0dk^ZWLnc&;Ln-&A~gH-gD+_iMOlY@psV4M6C;%*0sJU5Ko+2XeXvNd-^UA$OnQ zNdsnO&g+IQm*4O13>0`)qeA8$(}`oWfgH!UYqtY>7klF77NR_Jx~Jym=IA{yPD#m_ zh9F_iRxKgPRzJYCMMofT?iqE(zl3iD%QTRu&P{$=o0zLrt47FW2E&VdZi!Yj#9ue0;1`_lFLNOfR_?7`U6B-5uU|)wjj2Pm9`{krrzdc&H!w7e z71K!iyM==2Nuo7@EgZ3TIHN5Us^wM`10>y)!a}xK{v%)UwLx_sTCTEE!E>i%2q^n& zPw45?xs@ugO6uUZ@TH5&RFN;-(Ieq?k?{kE`0+zmC1CYPk1;^!L9oi zzs4*Jl*Gh}QM((^kk11qQ3ECewFh-Dq@wD1sK>>bsrz{qmaVI!+?AW1H(VM}8GExa$w{XzC<~Cv z0HiSx+zLZrJy5=Z*VL3CQ0KAGCB&iE%mM*|D5X^75Fi2&ke?6s&DkvF6eRX74@|*> zcquFE4SI$-)f*nFp}SN6hrRa^m0w``&YJ)v5F2*7gI zd9=JE%vW*PjGBRIL#67|H^BQ|&?ogNeS?(r*)wKlw9Tg_zbpJ@9mxhN{iQ1|goiif z0fSJ!bLT8XSC?Q%W`k;l1>N46`2vDavLKpbkQEX;0kg9B{nMi}wV~jOpfw(Hjl4JK z8PoxmLASr44A$x|+C`zE9Y_J>DvW4MseLd!=|b<_yJ*!|VZpgkzx3?8zQXQ{6+!vE zpH@4R)gXq~6(j9j3!*Dm6dY*1GhREKURZb!tqOTV&<2tcIQ{C zHnGRRh6ffU>^faHoEaDe_*gM+z<~4)AQR~zOrrDr76;>K0ut9t`FW>73X1?yFzc=W z&MpcK4>`4Xs7w)((JNx^VXr7jnk$nP*^Q0rAw2^`3*X5m4;j7k%8ZTS;T&}Km_=^(ral9N zJXPn;uaLZ$(3O>yJ--^fs*2~>Ot;FB<3gT?<+{PkalECGh$JxU{qZWG#^Q6FRse`0 zGG(X#Z0gSGx$&_+HqM+t1a%UMbz|4cEi&&iPXq)3VrXgzye)<+i8XT8)Uwi!V+Z;%|?N{#aQ+mA5z*o z!W{dps?`(k(%qNVRE4xA96ZG^mL!cUH1Be$uanhW99m=(E-S0Yhp4s0CBKV{`?Z7t zAR_}EmYby`NV=EjzGfYcnjiFV=H_`a`t>6M$<21ou!1w`xAsur#>>m&m3S#35rDk5 z%U!XO+ok;V*Ka%8Btl-2C=yUAYRyM9R(SNxW~R?xX|ehAvAoRL>xk>~2m`&UVdNjh6uw3eZAi&C2tN-bRiBRHpkH4Ko@Lr7VqXUz8aDnz$6mAE?Kn zUg+9B^c7pfuXXpkzsZy^>yM)H#lq$8T} zlWox31Nr}wa1YZY1ZQOU@vI|HL0aFLowxUx+d%!zIm4;LLJJ^p4yrv;b+Z67SUc4- zpggj=w4?>zp9o;gAeK~)*ap~A27qTF2gqum+4GXoE^P$XOlGTjE{_Dhb_Vq-$+W7!_fxoA`We|&W>iYWpm4&{_x1ur4+zj z(W;u7QJ$U$MJKx+f2?b1S+RZf`}Zj>?OP9YiubNXH_1bb75m%vVl^?!UpBPM9HU@l zq{oLB)o+;sCZf0=AHE8Ku~N-A*i!f32IE5k{{G9;gLbuaHRHi_B3D9~GaaUyYm6Kg zVI5^B8t{Vj+Yly0=7!c@3$fBdaAS8ev15kMX~_k# z$U9<}l+tp~X0QDgKdGe($nEq>iwrCOS|K39Qs76zo1SWIF56)Wp2mUg9~#bWPKVL8a?twz_ zfDLLB1P1LJR1n;~^fbf-Xb8!EukT>z&MfFsH?l!Kr~FZSPc3hV0ErXk(_g8soZf+l zR$V1adVL=ZKMGjyl;>d z#fsckR3XT@`86MW2TW>V2+>ct`qx2tWx#y%%Xpkvb`a*kiV3n?A$Jk;~+F$eY>61;1;V6Eyc8$HgFIzh+XAwhAK|hcJsFQ}Pt59lMoETT8 zdL}#K48Z55z!Yn<_1{`lS1=fDZ4(I_2+ASswHn@weh`+jFu0=J5hFnogK)hICY-JH znkbvE&5~RL{{a$U!P-7scBC<^{R+DYP+a?$7c^^)ylXH&Og-f0j~^^+Ur!2}H$|1! zH!5@i9nksebimqj16QH-;6b3grhl*)5g&aq9gi|@NSg~1TvoP@5!=@A+L{@cR>py| z)q?(Dg)&xfe+Z{WPb_n?d0YLKP*Sok4ZWn?5wsq_7twW@m6em7AYRD@cWGW1>K`Sz zsJAvRq6ubrYqg`c&|^am^1FsX*_Hp+0+3c*4VYw#v>uN=80Y7_7!c>R?g4y&6qAf| z>&O>lev{_8*?~*&I~n*A%?ghY&1_AtrfR_Ex(cRP z5qKXYVMx}wy4taFfnHxpbq^iYB37&t8JP)$RoNAhb^1Z~xf`IQglZkH>`VG358T{J zuiSWqlY4i(1G?~%a%t@?nc@~1AY^TTMbm=EmYJvk`9yT!{3N80Q+z%#EP7a3U;BE5Qu z?LZt_iCuZ4G3A#pZvh?mEzN;7y@@{sSf3h1XpP24jz)k0E3SCQ*AFk2t_g#Pe!vap zm*$)}zaA}*OG#5))a*!e@#submM|90)g)vBvN+l;re$hsCbsmA#Ea*dO^bG)f&U^K zro!>~Y{>pB8sG19+-OOc4w`g_mLc@SpFg|lTN>~oAYqh&Ye5g z$c0t~x+8A}ZQ1xtJ^u+Bdfn)jyDSP61FEM%G}izu=lehzC*;~dClcV%G{JAk%GU7@ zK8g{7JNqng2Qa$(vXGne161Rn-PYDtUsu?82Ed32BPaQ4N6M;HyVlbM>%ZNo%Qf0G`Ch#{)Hx`R&_12OTI9$;adk zHd8i!k-&$A8FA~`IhR+cw6sk;2I!7eGU*OTCh;eqS9n!z0A2M zB}1{O)i*;VXB*WXF5s245*ZlR-nn%1nC}a4aZ1}o7=pcUEc~f)&=p4zJPriG^S?aT zMA1v*dh~WPgDw;UAxSIWle#m2DnoX_pb1Yxv_?KOUxauU(dLU>}yw^Ge>AQ)Q?}d8#X18h~n9A;g_J(jBI&sg3 zEXr}8etlqt?F6L;=7VKK)Q_GXEe~fK7+8D!9}Mp@0s~4XB_*LI{KNnw;&&p!#7%sC zIEM-MCE><9dqWsi@1J4NBx`n$Kf5dI9J9g({l&Zc7~&o|V89m``Llb}>weyv%)i2y zX~Vs16wa>E_6}{#XZ*~h!YoW)=c5zx#xYe{+t;52r;goSxOR=limGb@R736SR(pNk ztp)UMRFypwk0|!2{i^L0mHu-6w8&=N-z~Zb!g#!NV?C}6{+nDD0>A-SK!G3{!R7(s zyyqQcgT%$3+VdjL>lu2K?+<0lZDwVuR%VrYQb4g30zx%Ja7}i*3DE{SD3LhTik{cM zBaA#Kr@wLRlGcZK4OmnZ8z-kix^jHP>SD~K>rKENYi5#tjTgC)-I7#2Zs0jsUM_Kn z?84Cl2M*LwO5(GOYJ=e*Yr^g*b-Dvwi2$BEYvkDX>>!~!N^gi^8z-vNfqxsnP$5rs z<%&7CUgt#PlEfEU-8c}pGTl>-xt(ZJwW}!*J&&{IUt3$#@FmCcTvbp~>RuYJZJKa^ z9;IgA{i%fAZjpYy3=KWg@p|q&fWne(U&s;27P290vE9{ZF*OnhG+7)04{@ zUub1v>Dy6yx&e=ZodGpj zlgkFcFa$m}GHRNbJGXx+Lpwl=9L@s545c`-fT#-M^VlRLB!E&~vLV!OiM&4qgkZHW zG~O@uR0P~AoJ~#I(9m$Q8*W2a91vG9B^*3FEd$G;Z{H>wH$+4>VC4Zvq&k1zh&!GM zKt)*2$z`Vy1it#igwO?_?*lMw@Xkee z{?}_*jx@wP>D-U&m;s$gRSv*;Y}c<#gFo*SS^ShdR%js!?&=jKLoOf&tdNU99@C?y zES8#+!@1J>coeJv`SIf_+w1d9glkrVWls4IIj1~9pvoUg_z!5_-+1uh8s@kUgMoI%xt{ zeWshs6Xw17!0GL-0k|9GcL@!0fg8ss#!J}q|h;P-2eyXDp_bh=G zG3LJHb^?Z@&E=MNrYkd`aSapg@O$sT^>he`MQLsto>fSPK{Vr%(g)xiKI^Ut(9f@XnGVCYn{R0C**h9Ap z`}w`!=s7r)K$-xJVFBGN5f7uQ8xx1!b6fX?^Mic@uFX~tvdGNImiRmv!l`>P;QIjg zGV(8gAjP((lfgLPK|E+eulnRPgSajLEl~##9&98$Hv0Q#6jSM0x<22Zews#r_3Bkg zI$=lF2#;PpHXsT_oPVpti+dG2|hTPN%0h^KQ+ux>5GcAP>SDB^5|50HI!`}h?WxCxvq zkO^M19qA!}h;b+H0fcA)yUUs>AeT|51^je}JYAY!Llgk}0sY!Z4B%d4Eqh zr!ria!d5W$0g4X=;J}1TA#l2?DlSVaZ{b00YWYNj4&*Ju5RT9glVw8K`S{))x(Jr$ z$l3P?K0AG#ab&-F^8xrQfnxtpcmr>3nGkwV&{6TbEa)QV0JtU?;u_}PB>r@JW3dOA zs7$DOM7JwT?54oSw`fhcL!X`N9|mE?bYmp%r2X4)94_h0i(?kBP(X$OLgdE};Si7- zb02Hzc`0j|uLwJ4Kzzgh_}lS`U%yPjMn;LaaC8vzXy_K^W(KG+uM zdJSobGPDwo?fYothsuQE83={gqHU$B&TrKR0}u$e@XY9A6tpV7Uz3m4>9G z54c!kqJ04znEO=7J}2Q;R~?yQy5${hOjO9Z^Iq>FCbI)imD@XPj?$D2xw;8WEH0|N zIj0Tqt>&9^y}0EUpjUi!QmbAqi+}s|tLXOywt7LNeQMp#Ir`V#O7@*t}MX<21Z-AmPKCKn1mMb`U=P z`0>L(D2P7@uHj1^y?2PrmI^Wggp#H3(yd};`PC-FE z;38LJHRviCzdwceQDrgqJVPaVdyZsSTz}I}5Az;Tjl|5q4YQ zSO7yJ-eGC38&a$A_0G4EA2($~V?I9ig$PA~3Et4~8&@Qm?P+G_Q~=^eC-ePE9pbfg zb&oh~CP97p!+=Y9c+`=jThNhi1E$p&UvV;o4*0D*o7oTq(L*{XXJ!_ek0FqgFKhXd zp9PB=HQQU@o0P=uRWO&5!q*hDS>U~C96&)Ynz_2l3FLIfW$xo?b@p!W<-fd;NgEItrBdPf?KkT)1VqMM>5ZTKzU1U=q-= zxmK+A3EGpG+3x0x2IM+?zrN-_uLBF+n1I7RyH=;R%b%8?8bL=aC`NYUM!%> zGKFcJvN#Mei{QS-K2yseXgb$jjZ4YMQ1M!6Iv&oU)xO()7tx0(r2~j`Kfml0>rvWZ zBRQow7H}M5&b2Aq+cIU*CS2^G z!ax1;oWH)w3A%lqiM{<6>)#KH&3)xP+(U-PhKu9hKWu1KKME&6N?x!(7_)rj0$&+) zn_^{VF=1t5(osv>*}xqv_-HgmZKw^sQrCX4gvj9_yh@1RidR!rEemE)Zr8DC0=@Z* zK^`tgfMXy|5099XdU*80d1sHp-|MRN&Eko>+Z(`$$?YG$Gln3*DpC6TH)faaRnybm ze#1zV*Tx{Z@2jJxpM8R*=V89{Y-8lk>FJi*8ONC)Ea^0c+MCPF{MNeIkPiwtNZd2y z#8x)u-U5DRQR2kIdGltID~zLC3#{GS6Za3uHWf7>n&X#BK7gk;c!qyJZ8S^9TK}nH z#U@??@~BL3jpT^Ti}f)~#ej^80!EApn|EAq&X}4MhCwEKRuNOY*gbQAIeX6!0mJL@ zMXUu=6xg-9QQZBGO{%jBd(2_`Q<+nFo2zb`LWxc-FX!qy_f9}OG-F{#o0;KVIJkVi zHZ^cya1aPSngzD_YuX=@`a!Zkf98uhQ0U^}Ar&ePY2Yzb`>IGUQDzGR8uZ!K15I(e z<+UrC1al8j7cEFFRGqC z8~gUOLE>=g$V*+Y9Ii+Z=O6k>6!2@E)YjH>(tmz|#u`-kL0;_xfV#tJ(;qLz^2pv7>EJ; z0ku@lEg#%gG^s;Q!eCTaQHkLpW2JQY-rmwnJNCkQlk(i=Q_aay!cK2cW_6+cofRGq z9mg-ofEuxEiasEiUaUM_|Ji{PV_wedIy}at;3f^Sgx4?{xidtDf z!xJq)NEC9|3w?)W{aj?_M|EDUdD_qS$d!;(heLd5$nlCnc{!{r(D?qQ0+&urRKulr z@7|?-dBMWQQk&?#+c)=vWf5Ff?(KkycI9|I;Ozu#^s@jW7AWS{){m2_+S`hZbA239 z%8Uj9MqFQk36b9QQ4WyMxt~7iLar_cg}22rBdKNQ;!l9tz71K6&$Y*+Uy1e2&0Rmj zewcU7x;ga2_|j~JXWA!v=LLjl-Ehm*Kw2p~mp5HLPotyH`}9=D-=*O>7&%A1_UDge z&=sdDNT@73xvz6^$y18n(D$QYHXZpK4a9_Alax;YrgG;bL7P_@5jTU(;0du00B=f! zcwAntAC@;C{Ytr7O*sz2+zf0QqV2tMD<$diV+=ga7DRgtoQ)}HWI@dUz=Xu0$D*t@=afNV6-XX{mIVGax{(Wb zY&MS@z<|%m)8z5$u!>**fIF< zC_BJK?Cv*2JEllgHyJ*p(x}gOquL1sl0c>fM`k0fp19lqu*-HD7G<> zp%d=pk26s4ekh=%Q$*VtraY9%C}qt{d4Rh&OJjI8(NDbd9b4_Y_pa*6(t}ApJ}QF_ zEf$z!>t|1!-0uTao{WeGnxe5_d@nV{TAT~_v;b;a5Pqrh?~0RkTTz+`^P&JC{X zX|#P9jH7?-)WOJT=goPOLi-7& z@lsSsC5lV0?8mqpl%MT{iyYb6X@2E=N$pGo6qp#~RramKeBc!9Nu;sy#2D2yu4Ej# zbne21#Aq9Ogk=VyJJcS8K{Qf?0&KAt5yE9@T5;|JJktq%#C}&@gMvv#a>^FUS2R$K zFfd@r%>3OWkj-}Nn>a8w*@!OMxxD!K3;9f^xnqU)#(NvQ@(Q9^pvptIDTJ7it4I6# z#p}(uF(MRC^{ZHUl*SJBv4fNN^BO|h)h$!1#XDM`^_Y|VtELJsW+TT&SAHXJ) zL&@@nJPxLA1ogQLPuQGU@V=JTOXtD|`pAI5DHv#>TJV%VXbOfzfb4~oL(rj=$BA!S zMlO`+h2Oo~JXE=^eBq^Wv>-$4`t8vEAUAI+2EICF)*1t|oYY-Cvj(^pVhHOyDsnlC2cP&PJu?(EH;o;#qYO#~`7Qy~%~Ehe@b2)*Dyy;YNe zNW{5&de6**aE$yk7Z;lR#2Zy0Esb(eNPR(%ASq(v$VutB;$iWg03PlKz`_}uq-VP< z78LVFQyxEl;tdW}u`whK7RO_?5i*DfuI+oU#d(Wi=EwZ%N(-;!Y$szlr}of*K+K{S zG*3oDS-^URJb1!IUE=;mi1~B=1evZBg-l#Gp&wwgF{j@TaSvRC^+589@0SH-rPi=_ z`PZLFI|3j!=i3`2CFXwp0Boapc#qM>rrf-nGyBh<0u}?9@GS}BZZ+lP(jGL_)pdt5 zGFXg!4mKb96!F_R8YFwE(2pJ+A|bA4(fzx-Cg@n_$8ipbjuMt9n0`$d_w4Pm1onJ* z$mt*WsgNOmjf*94F?B>R*W73bsxPdv_Mw>_*f5wxVkig+z+674>ge| z8Q`B~e%MkT@BT^$RB+Hn*#qQN4b~f~j*k3Y8Ev}Yg496eq>*&*Jq|YpD6xAp`v=eu zy@S+jzRyZ*cHxR(rMyPAKzqgm!EBr1j}Sz?1>Ht4U4Lr6u~FcomK>{oKR%Cj3#6t1 zq=js}ywG-kUUQ=U^ndM7C1ihIkyC7fIfRSR4feN}n{`~K=B;`@7^*qVs{23CDKxFP z$c4$X8{f)SOP7}R`u1A6&}O(dA^UTExCjx<6+v&i@~+eh_I8Lrc~_4CWzX_NKj>(L z5mV){LEkgkbPT#?q<;7y36?(_;?(H~o!QL0zOo(Jdk*^gJ8S9#h|pta=ipkKjMuwR zTgkmWMu3FEV3g+A&0GxeIwIkCb|~4npckA7CB)>sxD@H2h0dk%mYG49MRibF&Vtq~ zRwP8_>C?SEENqXLH6c~X)vq+vpiG5mY8MYuhP z0AoBZw*Jrw7N3KU484Zy95^44Pm3{BdJCKvv*WPdA152#^g7ZhyTAb(LrsN3 zWR&|tsqdvzjX=^+X%n20V#Z^}tH1wS3jp;TQ00--O<+*@zb!Z?H-65O<|PDBRsWUR zSoB0_T60g$>2g8)&%`4qhoE$H&&>Kj&&!7J)NkLEVfB)aF?hBPKoU-huMnXODf_e` zz8C5B{x@(0R~e5UKHvJ2{Q2=C?;a})X(l)&r*@}qy~c3Jcu>TRXV#h%37Y15^=--Y zTR-(-EM=xXdC9$oYuS>YeK;98(T%ql8&E6Jky9a}r>ZvDj=v9W{Iy%goog|z;oJUZE~1FtV`$P2G|o1JpH))Y9Ri^puA1{S!U_ z;Q4TezI%s4*Efhb2eA2k>uPVe+q`GD^ichY7jrN%CB(#Bx1f+8-)O$C$%1ROOX8}q9je_&_#QBF?o_6P%+&tYlg;|TT^n1rx%aA>HhF;xvK`y5@B zqz{n+Vi7{??$6H-X{e|?(u3IN+!Fj5a^T)SJY&Ud?KWCbA0itW1wh-NyUL?_rXOjxw*V zrzzYb%nrT>{7j5S=N9Z^+q>oc;>3tTjt>nO|EyaSwTDG;ooBMNyfV1cx}$G`64_l~ zAH|G0>nxPR?0LTt*!NsSt3u{;o_+NKM*hm!?ik?(uCpaFTin?|fot$>uDXo50zuFy zjf`y7G6n!2G9Mm|HvL59gZ)&2hc%|DlMIJOyP0nWzYH-oS~<%9YPa5gz3Yfq<@LNl z3%%~_{i|~S2RnWFpDp>O14Bmk4e#$y4nUvM>C>mXHH&HZOhdWLf8Vkw?YMd9>D8Nn zl8`yl!!N&ffT{--z}3JYSXen_Ke_>$ZR{{+;asB+wd{VmR;(Y`kuhC8z1U_6k|!`+ zXdJ@9f;YSq85wDAX7;vcE_~1$Z+IE`d&^W<$BgKV{?#*~aM)Nc_^*r7hk!2R;4_~A z>*8x~U&G&3)zkp3yS;B#fz#eB?lXRWfH!o%)J~WZP85nPy6HL^6luy`ot-K2JQeEV z@yft0!!-~(Ix8znT~Chy&@NQDWas24B&x^)58MfrU+M-1d7xB@b?SyOZ(waQOG+LB zTV`%)sjjIR0i122al=K>Fu~VAa_ohC9aI$g1qB-LivZA>10gdxJVgEF)ca@OPAO?z zJ<|%MLmF^371k$KF6D4d;1?BOoMpFW$ajSUWU{B=kcUcQFqn5SF^EV8UHkPAzJb}V znh^~=AILd@X9j~`J5RUh06JiSXs#^`5?MotiLk{^bDF+)6Q`$|`JR40g?eh6f00L@ zvufCeYvVFf0>={XnFQ@xGO?t+Zs(A1|9wF+vI-R`sTVumRZz49+FymzLF+l3burY6 zAodPEo!!}m8?Z0W9YYM1Bu{5|_jR8FhVqYwa#EkbCgC{u!C>wIL7) z5maL5d5@4?wcEE}k~S4<5#|;agb8b2qnc9|Z2NCFc4^<gU_Zn z`2nA9(}zcMsv0_DI2YpIzGciD@2&z&9?D{*v2n>_#r=f9z`*I2j`RQ7x-nN^>&iX? zp_6~*x_bpXE9>8{aV=8;Gq4|I3@B-D-`K(k+vTx5KH4bx_~_DC>*9t{TUp%K(GRHs z9baG(ZzH-j@JeUlLBuo%OT?X9aHIf3@p)z@uKEIe2VOq({&2(luN#K)*WoYjFTtPq z-epAl$Cdl$y^1_YX6p{&COCH^ur6p^)6)V++cM;{rU(D$IR4K}zwIl;leix)?&pF( z=v$|x=tFAr52pM7_gh|lwmRRhg}BU8hje19?d=?(W-~r~XzdebekLgi>IgLpi)og1v=CwZiJb8*EY&xVr)?FRFL@REg>0DuKb@7GT~IW!viYRg zWjGkSzwuhB`}+F{sY+9h!sG7J`*(6i0zTZ;XTJxuVDd$PCELd}@p4tZ+-cm;F)j5{ zY)F)O51W`!QRQ41N-@q}!*c1=f35d5S_+PHZ)9;Ga)u@UI%>NrrbGu@E5QN5UY>tE z9atAfrxT!l@7J0;a=>A5f#j&|!~6H|&%z=9{dN4f?_H$WE-EVO0)-#cL@=SRgwj2T zo9M~P2=*GL+cy?pw47E4vU%AqkpH-G3jGFDXRzJJknO&D4mMTPZM!76`1;~--t6pb z7{!U_UlOj+(D2)h-9zJg=DKoY`;9JrKd}GV;aT|b$iSYhcn#*Ob4k(L$S670<1rl9 zA3q|*Ozd7$-#GLJd1NEs_Ln3jJ++}CmFf76hGwDCbQ7ifa&lQk_{~Bu152^=limci zf6PZEd-aX7iB~PjCRWVX5I5urp^eXB)!U}8$&a1>7$H$RVV?=Z=5&g!iA9y6hL`Py zjY#;Lj~-PXJ=GYJxpsKp29G?U6>DL?d`b=n2)u@l4#!O6z~o?dx zhBzC$<_UYYGshn`u<*g~$LV=97Kjh4FJD}v|I*aLgV7BwcB_RhqG@^zLh?Ieh`G) znjqaQDk{^saXC<2yRGY=r;@qsUIBWV7;&iWRomJHQwttLyMcxI@~N!M%pVx>!~=(p zW|Wlt#4Nl;PRg6={|XVWR{kEYGC(AO!~p^vOAweOG&U+&WXs<`Jl2a2!^^M09#N6| z<`6D(adAQMLn_e|(+n62m^W&o0!t3+P|9lO3M)XPf`Kq91{Rj$5BP-@lZ~(U#s|=+4C^Q~Cc#DXz zVDgQ6#Z0FUSOi40;Opzl&duE|G!>H!(h!+vlAp^8wK9PC0bRtt4D`uGf@b736luJ%kG;KctmQI1-k^ST|PJ3 z75cZv(0l&5L(nZ%4ZE(WYG#&sUE%%J_?C2$g_7zrQO4c%;;OEl%@t6Ou!HtV4$)+x z(Qhz1I&0g*q@gm=QRId}XH^h!USCl$C`~y&7eZip95`o0YXiwlgIr7wd}MGu0GuQG zJp1xN;|e)=>bwDLFaL59`=efY)r}s2-o4H4mZ}!)QUT z-9iBnR_jyKJ4Xl(d#Zs_0@0#!=Jjx(5dk3_Xf6(j&w@uI6v(Cz+)WIH=t4U1av}&u zKx*1ohDszB7b8**csRk`;BWch{8zv*qqOihT$fMPPuSl#*jOAk04+&pL5sMBc4P^d zK~S=>g2qL*N7o?;{A;1-ru|(0%e9|IA#9+d6C895Bl>ngCE_XM5QK+^cO&W+J3BDy zt7H^@)tFh00c#h9hecSDH<-6+km(2zs^`$e&(6lyHVzbncKA(A-+w;Xbc*wHu?O!zzqSry&>eKGKYds*1H?i8d z;q|x#z6X83w>ZN6*^2Q&EZ}a*iXnIi=366n_uJ}J~s9k;s&5GHx~2Y{62ul zP+4s4oiVc#(2;5o=W>_+I)`j7oVu!N5(wmg#qhm#s(SeZ_yCFl+zE&Y!0k9rglo;d zVTpS^bfLE&%nKR^F(=d&s>lm|gn9HGh?d9R!6BL0*M|WK0*L#}p)nzHS{37`>DoIw z;G?A?mQ?398V)y9mp@YA0=ep!M=C@jaX=D;XO(A^VSUT=ZqtHpr~p|G#dvWsOclrg zHNanEB1nEzjcCe(73oCG)JNRMMAmNGvIffoSd=< z1Y*&-ArRQ+9Xdu~`e)<|ptdlo5t9OMIUQ*dH^V>m9@?rQEkHj&)QK_!DX2S0*_@!x z|C^{&S2Q0VUq)i$7mU(F7;;;-)~&M!(L2YPQ0Lw}1UVLOI?!K;Fj9Q;*ZKLMAEj`7py7fn zf89Yj8kKd^s0M15`MdK`W{X1=^(`&M5$Bs12FsnMVqIpD?gNm5K!RaiI&pE(bv!7) z-=k;P2B`g&C<$yObjZ4f-s z-rUQ%56KZf#NolTLP?X8PY>R@N&)r~5i&6|-**;?<|iYQRYy)p3}aJM)AIIiTS5-N zsAa+-QBj}F&Ft7O|BALrNVhBfy1aRcndR8K$lkPHzXZ^9U$mhe2q@J#<6&Lj?4zc< z2@oa0yO2mkm`jyfzv!Z)d0={`y}d6S-;)s-=z~CE{W-R$U zBUedNCtAmO+kC!HBdx4VIEX=Fs0_@(H#Q3S17rySe1d{9#fIl14!o&dbjeP8nt?I{ zI1-VT8Uv2?dcQf5<1^dako5Cp8X@|t(DyOTqRh;Sp(p}|C^tVp9|3&>uhM^n#y@2b zyu4s2lx;4N)~GGX?TXN?Va%SY!{p8#o66EVxOcdA8H?^641GvL{_J0fl(L!SyUlmE z^gxKh%g;}&2gI1aD}86j5=^LWkG_b0X(5zq=ILB+)-8pj*4g`?D?O=F5L0yI%c_TxR{4q*; z_1m?{Fx1bDsaXR0y=2 zan}#+l0SO8J5yNID({)Btl5(9R`u^z)_xZhYirhIWtw$vRBmLfFOn2+e8zHbyjP+b z*n~D8J}SnNOtzX`=yAitc5~w?Xr{FRhhmv+7?d^J0u?xn=yo_XtI@-bo>IN7tx!NX znOR!O^pb;(t<@rL*J9OSDT7GVfWX1reA%=i!V=*A=gZq9_Ua7iEup5Na)$H;>h>zA zO(46b99^RAXI`}ZsVu@7meONj0PTxV5F8376J3S}(_Xy_J_IA8Z_~C7x=1jbZa8{+ zHhXi$#{WbEY9^;(Yqrlqq#49lH;rCJmep$Min4BP(F|Wc>lGUpmvWXVcrEyq`4Z=u z>Eoo?S(eE|&3mIXQ)nkP&7u6QNWU}ua9t$M?B zI!Lg)_NCra`G}k@i9NgDuZnvMSQs`M3r?K(@9MnJ`trp0veovLoOzzr27^6G=n2(P zWJM*sG4SkWMOs?-^xW64x@s)qM_$}PtEzQmTBRO2GYpgfS{0I*REUwskfvU!_dWX1 zAYf~~n5T2(ix4~Obh?;F77AL65`?TDt>ddaFRu*kTzKDg|59vn0Jm^0Mw~IEHg(a< zCZ=+u!tUmpUOB}~m@TNa}ViZPhJ zLK_2OkxgFbTwY%LT2Bk!@FoA_dzJbg^9IU7ujk&t2}7}6{)H`&w0T_MB&yNZ-Tib1 zqEpxE_+JOEK7)EzXAKR0)4sx!6Sj^!EPKlhRTt-FuASx5|0J-rm+|7*++*v`#yVMl z@5%y#?&inq%6pWG(d!A2ZrulNCNEKH+oCzf#_Z>Z1Kksn>F(>j(W_$tF4{;Lsbpa8 zruA{MR<2;{+MQ+>ZvSrS;KrWM&$Qb%K;ZeNQk?yaX^0!?z6sv9`Ye%nBxIY3R=iXm z59jN(H)&gEwT`L4X{Bjc-8@TK#D%_-v?gGVr~%|pXaf_)<)?anlqQD+~c(o z1eL(GRSmI(f=YnoeD2l4IHl05!L(*w{WdnLN=i}r1s&?zZkBTs?{8MG&SsNBJMEr6 z)b91BqKc)OH+hrq==|NQ4CPNGTubfguxU?${vX5Q|0sepy@Rp(I2t!Q7yaZiqfl({bkx|`9msq{*2;%>6=?()g1Zay zRaaZ3hI@`&ilHOK`d50Xt#!ofCweTnJ;14hA+OrCip?!!U$+Okq;NF^DrmmfH_&8F zG+e5)c9|Xv$m`yyB5{=J(wU&4YWn5g-o_@RNNQ-v`pYYpU2#bgwZnVsB}3lZl;+mC z_@3yT>^yIk@!FPlKZZRtc4xfh$z>~u?mzhZSAsrHU)9Jc2#DoiNcI{1s#AZ2*>v*v zh_Xh{2Qc&ve=v;ntmHe*;QfY}8bmYPD#O6lZWLnm=0u%zNF2SFS1p~CV~-vdR7))# z!E~uxn=Qj#y(R`3TKb#Hph!AtZbNDMt4{? ziQQC22FVd>&4IU6%ZJm<8dlN5=#JIIUBCEr$$<0u*rs=*svD427Al>QNn9Q(^Gz@ zs0km9@>DguB?z zU_C%!lv;LN>%yDXzr(fcmW=tgwXJDrJYD;t4<4QjeeaI?X-vgd*t7@wrWdHh$Hw1p z$S^ZIiIzI3$BVNRJK2Bt4{`cVMVU$9GPTMi%>VQ~)INnhJ>sgWR>1ExODjanZEQl> zU1;WF(Unyti_;`*1#nmXH9t*#3j+<=reX!}Gf6A>Z|?jV#j|o`GhMFy^OfVmsiMrv zy+@5v$yr&>**U+(^jrpcCLGJcBf6E(v*?2f5%CtwE-O0(ooVU3#%T%&AnP(RBIf5m zt{&sL<+dCISscf&mDC@jw$SaE)aFvT!kd~pQ8(i_*FU_M2}IAe>gk_ygW(3}!4%qj zIsX)*0f?fQ(97FxUg-EfZlWQGmgChkK=DLSkE zA_LrNyF3R}8w$RQ^S0dXn<4l83WbkT5ND?4=kLb%SGuiQ2+ux0N&a{!*+r;`>Q4YS z?)A4ADVTh0HH(Js5}ApK<72P4wxr@u)-@i`xJ}#Mo?6wmwT2BdER?|x*_IetnTSRvvx^gc&&uJ0m}xpUxdQ06z|QKyoketSo#VrvazDKAe=S zW8>A_=MNpIRbdHFLU|TB^u(y^3*Jf^u5A*ONIuE)=~@~$I^dE-pYcCi<12zUO20bW z9>qTaPhAiEDg(i<`Yb_Pjecbuq~sv_zLYc->L$t!U&<|CaM$nZ@~=rav@;{It;K64nv_Y+>zxU2 zqqH%wl0@&8G9H7<9FJa%iQyq#@1Jp;W|7!5LHgNyz!cu9xvjY=i}l|ut4%h0=~-D< zQ0S?c4g+N|CyP}}{#E@jmf;N2HWr(vSKbZ0LPnW;2yEt~r>X7VHVa$aa~yojM1(3d z7AkUTb6D?Gd2Dh3PbCHi(Ywpqs2{d_s3IDL?k~neXWQbWctV~;%D@0)n~&9Z|DU!T z@Z`2PY}9W2Op`_BeEO6Km2okMhvnz*LYx^TIMko>O}N#iS{tMi^xNwn-I|@#Z5;q_ zv4R~{hX#si!L*qg@YI3L%$7{}Q6>uD8qF%cN;E;r&sh$K(V-!FY`CNKw)p|aTD@K* zi(0E^Bi3ruxLlh~c{ z^4eK~2g(oR6EwHK4^UjE#BN8A(?s~C?*on0d7vg?MrUi%mGd1)zkY$-{0Gipu3}?P z3(Wh(O6uI4L3|qYBYb0R$H}#u3_Wi*kVP8uSj0})-ga90u4U1kBQs&|6hkO>oUvK0 zp;69C{hqhd5}&oV+w#C-?yMem_k31nZ~E}Ab;QmdJDm5fze@$H>-{aWaUK`h1YKUk z3L@HQWhh2&e|a)(SwSBs@-{wE21U$ zI@06+*7Ow>U98xe#hR_n0@PS;K;b8U=;*1Qs@?uusi|unbS|gbKg3o<(KCg$^Bi@;6a9&BtYQ6xM0?>X}J3Ol;gk|wja)xS0-)cjG zPLIKttCS8d;qC1b<}>ZJtJwxtg+)HrXWtxF*V;$|;ehvQGJ|$M_?+NB>8@mC!jT=l zc9k(Lmpryvgc-1lesQP^vp+HM5$h8=U7(F>*%$P%IF#z*QhxpNNj-G+?U5IBf`v~_ zYKMjZa~-2ZUod;g!c7s z{I~%r86@4%KERj;Vv!RF)$YTaQBk1>$Z9)WIOz+u&)?A{S9M+8931W(#ouER-3GaX#UI7@{-*Gze52{I(;Kpb&nDhw$d`e=20(+wRl%5G+3W|1A9W zKa&yspDZ-{SEco@O6y;h*1syPe^pxls&gaxtLSJ9sDX5Bpc}q%G1Q1;%RGoufd=^hY+HD4c zuA|0tJ%Yw-vuQa7!!bcLa~*A?el|b5`1l+_!;8D~qL26Sx5-mi3Wd{c{Bw&Ajwn!in`JsyJFNs0Wq&J@t-jI`U(Ai1K&-%yDj~2Y1t{%82BcGp9i+j47 zQIWOwz!`XSOsB%#35dq`D7UdUhT0z=tC$^W?Fpo>5I=uC2aPKv5{*Gnn@U9{Y4EfI zOZM{_$kz*CI*~d%QTxLqO0Doa5+5IbPp}*sc;DCOk#9R%4K0kEg2lI{mv50Jgyd_J zll{I5H6cs6f^``e)ZEJ_S&qLOLqP43lyr`%MC01-m-jIOJ z%43Lrb|?gm8vyG7eWvBjj*zupDrG+Zh{fDWFJ6iw@&Wh8Er-cXp}!+`6Uz-z;=3}X zo0G?IC|KOO-@OLPYHCtuUGg5&iRt#$r#HZI`D*9?Qr52WR)g{d-Y2s1H9<7tOu@HV z7d?jCsCg&5Y@93X#wT~y46uw15yb20V4xg}$t+OsNQ&Zg7M?5v!HMS)mDLcE1_ z+&eCvxcbSa0A81c0b1vuh7-(Wk_^y*_UD_Ul=Pu62IuXOlW|R#s{VFdXfYI8{1kS} zs_$7ZmLzsE@27x8w`ConcrS6wbFfUYbgf(B7k00uiap2OZm!#^esjto++fdM2?s*s z2wJbzl;6aj*Pf>`cNx=&0$jXEy%AUbiFrAg?@jC)4}OyE_zN~>iUpV)$7hN znQts5N0%UBZsz9D*LTrmZ)X$E=kzhKS|XrZ(*rxXCbaXXXDYwJJJuvlI~O+kV~_~2l<^#O;6|5tlo+SO#XtsAA3Tf0>5-d2?x6)4Lf79dejkSP;ERPYK7e z&|FHdF}Z&}Nj-|ApKe=Yd5-6vkdT1YX>=`jE>&aojh`m)dxxO%*$n5+jWUl*)fPW~ zJfzmZtn(}f5O_GvVG?lIX1OeUEZRt0$W^L&CVnLe=e(3`qDmU7IT`izW8Z>yM#7qm ze`Q!F8f22{Hrm*m%+@^SPrv=FnY@JG$|H7Eyw_rpBa@`4GvH#cwNjZG85!Z|s!__N zYkPDZt=nyJPk^QMh(2mK97^9?B?}8f31&F0JbFz-%KWvK*)J4%gBimN2SVICI#PO< zwK&EJko2o7e-X{kj^qEc7J#`fQgm&){a9J(UZ|I@%8T#zwIM63KMz05U`&%U4@xNA zPv6kWN*#;XqxRo~jDE{U?dg~O#U?f7ep#6X%qVq)3|iyi10rad{B${*qaJD|->t$Q zKTIMKK<@6&3Gdv&g6%dh?o6pxSBygcXgZ!Y=Zs6zj%nc#hMeQh%|`ziZ?dA)d;QE>a5wg4jjXj5jM9s`uCw|Ia{j zQ!_Hkd!TRPml4k4TfnRSVrUx?NWXt(`_{2Da1@uO(xDmCZzU= zZLG54Kt|7@_P%QD1LpB`5|f;Q7nQVNDQ@x>5#O(GlWoMQ*UmG3zE>vVx-X zvNFR}2?WX}VgMaaOA6C|G0~S@Fxi+Tp++75(Q;TL5Q-wXGvAD2yf>vIZRSz=X8ce!5dc!e1MHg;=GtpTRtK90*)AGrE=KWd(E`yN+1%=mUv z&~$c9vPTx2-53xpz8|Mb+1R6;9gxUDwIuUbaI>LS!G)@3QaG=LWL{`@xfsK%^dXT< z6QpNDv@#;+7akqGj<`^5>6aLdoqZNPRHK)6kVHCQOiPY`b)6bV`KCH={0kF>iq~Hb zlJKc8cS0h6ZRGR#?zU)3k46@cLH6?dTdNO(>M+l2LF2+l=e*4Gi@01iC)G`9PTxrwOx07H^FAKU-Zd(Y>8HLY zjdkk9G;L!PR#sXaFeV?zPM+r$+_^)-6y-)$?G`V{OhH-4!LV4;`VF~l@7~2ao}n*% zTG!tgoicSVqO&zeF8|ejyc{DNzK56iCoHlS-qRMt%`;zTW2s`doast8R!T?*$3Gk9 z`ZCE=QSSc!d#^iA6bolWL?9-)LM+$S=-Cw%gq&LAFkB+@hWaD|Us0W{k=qTa{!+ij zv6w^?qwQy;mo+cUw0KVS+=A2GaPfjdx7af#)@|a;b1;KEvFK;t%JQKP7t$nMBpsOc z89!Xrz5cbRnh9_sTkFazBAZ1sR`tlWg07|ZxekkZE8(OGnDX0UR5phCIcMae&aN+! zs8td1xX4IJyX~%ByFjn&Dd+oVq{|6K=R!U{53wJ&cc7o1sSH#_A2-v0WkJmJr5bm6TI8)uPGX{&6#oo^2zMJkw9JC`s)Lm1xP} z3=2RcjS5mzvE;VL1Y|4BO z*GsPqt}-Hz8JE}A$;;aU5=~v{PSdTPnr8+nnfHhOgknarCCJ>N3LPiG$a{4&eXzq< z*J`o7C+tHF(;}gA{q_%<)`^0R=UTCv5Bg~sMmidfC>n?`80apF;%56~WSaBE?-|do zthWyK@^CtvL=S%Va53gBj@9gL=bz_^Upxt2dL(;geVg^!PbYA6yXr50xMeHVpPDHC znz;H+ih~DWX_eUAH}~q+d8>|9Cm%LWnZ2I;X|0Ppl^S$$O|MOz@%%GstV9y9(+{e= zvYS~nN+Di{<7c9M1o8X!Ur*K^lrUnXXGyXfd;5-3Q+gs@TJ*7#6|0OK9B@iI+7w3f zeBE_i!4p%J>YC%U^D@+!6*vLZ=Dh~a*=UIEiaR(04(Y<=r^~lOX!E>F-g;%|Z2Q=F zZp~P)0_#NZkE6&XMEZS_K`2)jge>fH`s~Ep|8^V%Vvuz*-&G)&Uhv{a;z^W=eTun{Xs2 zGuYzDZPd*X#o+HyLZ;-aHFdOPZMf}<1l+(Ue^M47dy|FMXe2ZiltA52 zdfDM^;5_XGm9{>xde4eVaG%{++I!NobtdfGMPSZnYF=WnED*Qbb5&yPC}walUAGO? z18uO4rNvdxwKJ)7I@6^3Kw65-CD;XgT;##k3$pN}e7SveUmJh+(}pQQzw?n}uP26| z4zx7VbTi`6kIyM>Z{9F}uwXVDq?`%e;^E{3&R)hy6|gwSdFC5ziyNN*bEZ(VsQHOM28(Y75Ada>uR4()+*VlOQ+~>WZZyAi7)Zc~ zi5KgkxaT`MQ~+QY%9OUyUJH1Tx61)4iOPoFl- z63?;IW9B{+OZqTP4aA~P(fX{|16QL5p>W%u>JA>$d;ghC zDd?QCs9x6Fx7L=3`i1W&cHL22jw}mnH%LdDEDj%VHA3CSKm|-qyc!7P!R@t}=@%0m z9Q>L^_nLE5L`1vE!-F@b>1p;R_L5FsCch|ID!g@vNp{W0^__Qq0kB-qOPK9lf-MD&sxULkWHaOeul{q%k-o?01D|ZghCq{!ZMxhkXxt%Td%c zD4+^->?uF(2_`91HJWQ3%{0k7k?^KNt-F83hq)H-v}2%7JY57Z9Y^v*D5^9c=6e1F zy(@-0PsM_9ITEF}c&OlsWoDxiWaQf>)NK<4L|C&O7z@yV7hs%Tem_jJjT*C0K8YXz zYasew0u27{lz0XSpaD+UpB6xbulbEKU;BCZSRO!lZut%sz$P~L6D)rW1y5^FS8j1T zHqhZV{J=ajq^tB}3%cR22R7aWoDm8AF-xJpH9T{qB)g(w=Khh-_P-hoo4{v%1Zp{e z0Vj>mwf?$G?km9+ZsFmGfNu0+vtzIzH}9gBxo%l&ZI;9^glR z1co{BUoZ?6no}*Nh9r3U&YfeqSy^@us#79P|4_vaJE<>;G`Kyh&Ng}=4*t#ryi z7(%AsFDm*4yrVyQwlBNQT0(Z9O=w%TV?q>Qk;K(4snz%36EJe51^R^|Ck;@Gw*XO$ zrz3%{E5qtF&@Q(DLCl^D{)aq0Jz+FP&f$CeLx78+0V>0qTv4ehzkS6eJsN;R^?#tp z|1Uy2(gaO?TYZoEWWMxedK@tCVy8r?Pbd46ahUPmai4O{5rQxwiX&bHM?rVI8t50Wjso$gH0b~xLG#wr8;M>;CuOdVyEPZe-v^!4bJaqTx zzaZATEeoteu;odT`>C8mRv{;+uJk+HLQ^`@8dAHn0xC|#)mq<=`iF;ee4$8BbandIQ#l>Pf3vbvupn z;k-V$H8%jx|EsLSqy5dBo6vk+2ElQ2&8ok_ngZuRAx@uV6Syt8eba?kjT~)p%1bT_ zo1p1%4-i4zgi%|Ce7-$sgd#6<0EmKse&`61D1I$ctJR=@3d+jLy2Hc54*L811M@>$ zXXhd?h&5AM#=ve>oiyVTtMbJOP#Oz!_l&k}%4X@5i#pTMZ!kpZBD`NvQNcyfn(x6)uT)akG=^O9kNM`z9o$*G7UoL_vXs8rqf zrxtF??Px^Cf}l>eg!#AK$+MH?JRV_&3*gYP3OiVamwD#Z^}8N*!=$T3I@42k5elsT zx_Q5si=-nUC@2WXVgeSO1V1lr6AG0W0&86C1d;cpN~O{~;71Xk;sVT0h=v(4?RE2G zWq8$D2x zZG;kR{hAtj3O&QA{?B247l=bPx}D0KZGz1ZIv|@7ZwTHWjt+DeM=lYX+?IXFTv8_g zZ!!u-O`!rAt#CKMe4=p$M{r;zPOso*WG}B_BWUFTIPJ7%uytuJ+C+XPhr@Bp+r48g zG*a;bZh}lg#I^_?m?uP#ux*_ly~ny&H7~KyX{{0P2T2cP+eRMe=fM?%{e-OEZE4a= zxR5qL|FSW*8G@ChIDS6-_Fcz>&{6vux&EETK;dx2Dl!2wA=IS($a41dgVYQI#+3A{ zF{jz}^@l#yvhVbV9^#_M{TII5=C2Iy;8wZRu2gX_$q|9q9Y4P7d-?u`;jLd!uB7fG z5D4JSrlUbwAecM+sIuqg!8@vvFC~SkKYNTn?5mh~*^8tnVNe1D2#Z#rII?%1K7#B( z-*?1+z@?DG5L;l}cmN(6j6d?Ak2ybb405G)eELDeQmhIMTzT1Wp`dbtqB=e@Hs%Jq z`PQWt=&@3(_Xe&k&HX#b)pdxVkPHs+u0U$!rR}9}0Jw!vCldJu8V4z#AFB_o^ByHn7&S`3>@msV;cr>aW`1V0mpS z>G#yThwt&mN3sbgCqHZ=4}JvYbxtuiY&1y{{q5^2%`+Q4>_5hi2KX-CM0OWS)Q1mj z8FSpRR-J#$O1x+9-o2oSrs`a@kEKb6GY>+*FVZ!2QdnoZ;GZZ=u>4=z;bq5Sv4evH z9St-a5XrLXLfZ%S)p@`~=Z!ZRx1dC4!woe7QNVKU+}Q+qVVROu0TGWE9^c~)!7+vr z&;i@pRABTR5u6Kzu*nb1&Hu*05Sc8P)B$;foH9XX)EN{nNi{m*Ig|X(lX+LSzR+Q_OkskFH<8K9c!^W6sj1a=l=i zuRDx9ltM=ycX*V|W;b;{4r-D`z6CP`=gVk@t|8;T4LA?uu}5Mo+t|jF%!(93+Q`u z1~CwKofqY?;4d}LcM7Ifxq5Ud?cZLKcZav>mOeX-Vm|#g~!L8kGtdCs&|07G> zxep1g0B;J0M7Vd9iUPvQ|M2^FF*VEdgMpq2u)Pa0Z}zPVN$B1ch)T1@r!9N<-;7l*x@^u;gGYU!H|@96AiTjEv5`VI^=&cy`PkT8U?h>3;^FHCjls= zV#glW$|YJ~P47qDahgd9yM>^*tDr=N+o zhlX0@J>>9-?#Sh3ph<;au0=QBxn!J!Cf9E0yK!NS!&dQpui~J^ycl7XK?HSM?EtX) z43^feX#)K*5f%wu!+qOoYsVq1jczeYklutrbX$SP0%&jXF3!khF8KzP$n>;c7QZY% zKOerM2}qoPD*ZOdxU=dZV0h&M(Dd{c!EThdD$Qf+dz^ zczQG#0A1JHMr}Bpw>@+Z+r-M70hw03{_yNVEU@`xFjT(%5E9#f%}oYkFDqVRrU%gP zNa3QuaK6+06{t!2*ol>;-#r8c$B4H8z8}%^C#J4h!7v~baPhXku;;`jC%S;3OW8M5 zZ3iRZU-O`=`t2j_xNrZQw}->$`&Ug|u<$Cf_@%Rg{Wq3b)6Royv^_epc0*$bs4CaM zl{HpFY~o_rb(rp)m#l1%d5dQ_2_lPo`>!?D8o1;EVV5KHC2hrg=4Dy==U8xs) z3csS~*yEG?urqu~h;DI4g6zlhZ_NNPUyLLh_B<2_96_^0jEs&#p~=wFH2`ld7RZcx z)~!L!mccz6I|4HkI;22A#UFXZhIEr>)C|Q=dS)-6`nj;@c90&KkA-rPOvbdYO=xpH zBt>2#NpWd+BsgfB5fQ$-?}|0#XpuW(mUrfP6ra(nK2qeR1U5JMRhyQ2lbp|492u0 zuNRtvIDXkM2(&`lUE;=cvIi9l)Qc7G12hfz6bSEIAam4jQ4;J6UL5$+o5-WS{W-O3 z94&FyFbWd!!IoaK$m<{%8kIg~xS`^|MLb$WIQ^2pylhYZIUxa5(m^_)i%$9*&+IAc z5hv^B`y~KnWq@Dl6%Hfu4g$v@kdmbjTz9l05UFt=e-KK|)m&IlhI*EN%{>A*kry|#c{fR~v-@t1E$l@)7i_cCGes+&;geW|Jh)Id!ecJ@d;I{#i z_r*Tx9UUD)sMt{)CH07=@)eM6h+frF4&V951>7A2}Itt%am&4%{S?eO+Ex^EQU6b2fSvC5li z(^Vs32~R>_=K#4^q2B}#ksPF*O{1L=v%n>?^m&4Ym%@XGh}C|9vn;!YFm?f3%#bH* z4kqw+(Lryck!RLn)sK6%f1E^pC}=+iuq)#VN*Mp6<*^%*WVsC)E)OD8TX2PL*>or? z__TtMJ57M1k*2Y(vL+e20YoDcDkn0V7F$3jWBSNLGVnfKL8zevK0hsaaI^hraoG`H z0c9~|R0-Yph_ZyuF~#*Mvv`Az7Tjh~H=w~-O;!R+M2k%UwbuiPsxFzNBtlB*`No*~ zO|k;vazHvHFxQ6xRB(mhiXbu!$rq$dX_AguFPOekN?H6DGgiRG|EX#E>ZJd-Fa0Vr o5F(yOCBh2;am9bDx;32%ZU0eDiTb7#SvYQ=$G>s@5%~Lm0KK2M761SM literal 0 HcmV?d00001 diff --git a/doc/link_aggregation.md b/doc/link_aggregation.md index 948f533..bb63cb4 100644 --- a/doc/link_aggregation.md +++ b/doc/link_aggregation.md @@ -1,25 +1,224 @@ -# Trunking +# Link Aggregation (aka Trunking) -The RTL827x allows to combine multiple ports to a single logical port -(trunking). Up to 2 trunk groups can be defined. +The RTL827x allows to combine multiple ports to a single logical link +(Link Aggregation / Trunking) according to IEEE 802.3ad. LAGs allow to +combine the individual physical links into a single link with the combined +throughput and automatic redundancy when one of the link fails. +Up to 4 Link Aggregation Groups (LAGs) can be defined on the switch devices. -## Trunking control -Two registers RTL837x_TRUNK_CTRL_A (0x4f38) and RTL837x_TRUNK_CTRL_B (0x4f3c) -define the trunk groups. Each holds a bitmap of ports making up the trunk -group. +## LAG control +Four registers `RTL837X_TRK_MBR_CTRL_BASE(lag) (0x4f38-0x4f44)` define the LAG membership +via a port mask of the logical port numbers. + +A hash algorithm applied to L2, L3 and L4 properties of a packet are used to decide which +of the links (ports) is being used to transfer the packet. The possible properties used in the +hash are: +``` +#define LAG_HASH_SOURCE_PORT_NUMBER 0x01 +#define LAG_HASH_L2_SMAC 0x02 +#define LAG_HASH_L2_DMAC 0x04 +#define LAG_HASH_L3_SIP 0x08 +#define LAG_HASH_L3_DIP 0x10 +#define LAG_HASH_L4_SPORT 0x20 +#define LAG_HASH_L4_DPORT 0x40 +#define LAG_HASH_DEFAULT (LAG_HASH_L2_SMAC | LAG_HASH_L2_DMAC | LAG_HASH_L3_SIP | LAG_HASH_L3_DIP | LAG_HASH_L4_SPORT | LAG_HASH_L4_DPORT) +``` +The hash algorithm used to select links (exit ports) is defined for each LAG individually in +`RTL837X_TRK_HASH_CTRL_BASE (0x4f48-0x4f54)`. ## Trunking API The code currently provides the following functions: ``` -void trunk_set(uint8_t group, uint16_t mask) __banked +/* + * Configure LAGs + * Sets the members via port bitmask of a given Link Aggregation Group + * The groups have numbers 0-3 + * The bitmask represents up to 10 ports + * If currently no LAG has algorithm used, a default is applied + */ +void port_lag_members_set(__xdata uint8_t lag, __xdata uint16_t members) __banked; + +/* + * Configures the hash algorithm used for a LAG + * lag is the Group to configure and hash is a bitmask + */ +void port_lag_hash_set(__xdata uint8_t lag, __xdata uint8_t hash_bits) __banked; ``` -# VLAN configuration on the Serial Console +## LAG configuration on the Serial Console For testing the following commands are provided on the serial console: ``` -trunk [p1] [p2]... - create or set a trunk group. Trunk-ID is 1 or 2. ports a physical ports +> lag [p1] [p2]... + Create or set a LAG. Trunk-ID is 1 or 2. Ports are physical ports + If only the LAG-ID is given but no members, the LAG is deleted -trunk d - deletes the trunk group +> laghash 0 [hash1] [hash2]... + Uses the given packet properties when hashing the packet to select the link + Names for the hashes are spa, smac, dmac, sip, dip, sport, dport ``` +When a lag is creates, by default the hash is based on smac, dmac, sip, dip, sport, dport. When you +use your own hash settings, make sure that the hash always uses both the source and destination +property of the packet, as otherwise pakets will not be routed symmetrically. + +## LAG configuration via the Web Interface +In the web-interface select Link Aggregation in the left navigation panel. The page will look like this: +![Alt text](images/LAG_config.png?raw=true "Link Aggregation Web-Page") +Each of th 4 LAGs is configured separately. After the web-page has loaded, the current configuration +can be edited by clicking on the port-images to include that port or exclude it from a LAG. +When pressing on the Create/Update button, the LAG will be automatically created if not yet done, or +updated. If a lage is updated to not having any members, then it is effectively deleted. + +All LAGs are created with the default hash-function (see above). This currently cannot be changed +from the Web. + +## A Test using a single Linux Desktop +The following is a simple test using 2 RTL 2.5 GBit switches with at least 1 SFP+-port each. You +will also need 4 10GBit SFP+ modules (DAC or Fiber) and 2 SFP+ ports on your desktop. + +The following shows the network configuration +``` + ----------------- ----------------- + Linux Comuter | | 2.5 GBit | | same Linux Computer + ---------- 10G | P1 |------------| P1 | 10G ---------- +192.168.9.1 | SFP+ |==========| Switch 1 | 2.5 GBit | Switch 2 |==========| SFP+ | 192.168.9.2 + enp1s0f0 ---------- | P2 |------------| P2 | ---------- enp1s0f1 + | | | | + ------------------ ----------------- +``` + +On _both_ switches create a LAG with ports 1 and 2 inside and the default hash algorithm which takes +source and destination ports into account, e.g. just use the default: +``` +> lag 0 1 2 +``` + + +The following shows the configuration on the desktop using a dual 10GBit card with 2 SFP+ modules: +``` +[234690.755634] ixgbe: Intel(R) 10 Gigabit PCI Express Network Driver +[234690.755637] ixgbe: Copyright (c) 1999-2016 Intel Corporation. +[234690.921614] ixgbe 0000:01:00.0: Multiqueue Enabled: Rx Queue count = 12, Tx Queue count = 12 XDP Queue count = 0 +[234690.921914] ixgbe 0000:01:00.0: 32.000 Gb/s available PCIe bandwidth (5.0 GT/s PCIe x8 link) +[234690.921999] ixgbe 0000:01:00.0: MAC: 2, PHY: 19, SFP+: 5, PBA No: FFFFFF-0FF +[234690.922002] ixgbe 0000:01:00.0: 28:41:c6:xx:xx:aa +[234690.924946] ixgbe 0000:01:00.0: Intel(R) 10 Gigabit Network Connection +[234690.990024] ixgbe 0000:01:00.0 enp1s0f0: renamed from eth0 +[234691.056447] ixgbe 0000:01:00.0: registered PHC device on enp1s0f0 +[234691.089417] ixgbe 0000:01:00.1: Multiqueue Enabled: Rx Queue count = 12, Tx Queue count = 12 XDP Queue count = 0 +[234691.089706] ixgbe 0000:01:00.1: 32.000 Gb/s available PCIe bandwidth (5.0 GT/s PCIe x8 link) +[234691.089788] ixgbe 0000:01:00.1: MAC: 2, PHY: 19, SFP+: 18, PBA No: FFFFFF-0FF +[234691.089790] ixgbe 0000:01:00.1: 28:41:c6:xx:xx:ab +[234691.160997] ixgbe 0000:01:00.1: Intel(R) 10 Gigabit Network Connection +[234691.166102] ixgbe 0000:01:00.1 enp1s0f1: renamed from eth0 +[234691.231579] ixgbe 0000:01:00.1: registered PHC device on enp1s0f1 +[234691.236965] ixgbe 0000:01:00.0 enp1s0f0: detected SFP+: 5 +[234691.485031] ixgbe 0000:01:00.0 enp1s0f0: NIC Link is Up 10 Gbps, Flow Control: RX/TX +[234691.557003] ixgbe 0000:01:00.1 enp1s0f1: detected SFP+: 18 +[234691.753061] ixgbe 0000:01:00.1 enp1s0f1: NIC Link is Up 10 Gbps, Flow Control: RX/TX +``` + +Now set up 2 network namespaces and put each interface inside one: +``` +sudo ip netns add netns_eth0 +sudo ip netns add netns_eth1 +sudo ip link set enp1s0f0 netns netns_eth0 +sudo ip link set enp1s0f1 netns netns_eth1 +``` + +Configure network interface addresses 192.168.9.2 and 192.168.9.1 in each namespace: +``` +sudo ip netns exec netns_eth0 ifconfig enp1s0f0 192.168.9.1 netmask 255.255.255.0 + +sudo ip netns exec netns_eth0 ip a +1: lo: mtu 65536 qdisc noop state DOWN group default qlen 1000 + link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 +24: enp1s0f0: mtu 1500 qdisc mq state UP group default qlen 1000 + link/ether 28:41:c6:xx:xx:aa brd ff:ff:ff:ff:ff:ff + altname enx2841c6xxxxaa + inet 192.168.9.1/24 scope global enp1s0f0 + valid_lft forever preferred_lft forever + inet6 fe80::2a41:c6ff:fexx:xxaa/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever + +sudo ip netns exec netns_eth1 ifconfig enp1s0f1 192.168.9.2 netmask 255.255.255.0 + +sudo ip netns exec netns_eth1 ip a +1: lo: mtu 65536 qdisc noop state DOWN group default qlen 1000 + link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 +25: enp1s0f1: mtu 1500 qdisc mq state UP group default qlen 1000 + link/ether 28:41:c6:xx:xx:ab brd ff:ff:ff:ff:ff:ff + altname enx2841c6xxxxab + inet 192.168.9.2/24 scope global enp1s0f1 + valid_lft forever preferred_lft forever + inet6 fe80::2a41:c6ff:fexx:xxab/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +``` +Test is using ping. On both switches one of the 2.5Gbit links and all 10GBit links should show activity: +``` +$ sudo ip netns exec netns_eth1 ping 192.168.9.1 +PING 192.168.9.1 (192.168.9.1) 56(84) bytes of data. +64 bytes from 192.168.9.1: icmp_seq=1 ttl=64 time=0.082 ms +64 bytes from 192.168.9.1: icmp_seq=2 ttl=64 time=0.130 ms +^C +--- 192.168.9.1 ping statistics --- +2 packets transmitted, 2 received, 0% packet loss, time 1030ms +rtt min/avg/max/mdev = 0.082/0.106/0.130/0.024 ms +``` +You can also verify that the redundancy works by unplugging the active link, the ping should continue +undisturbed with the other link now tranporting the pakets. + +In 2 shells, start 2 instances of iperf, listening on 2 different ports. You will need to make sure that +the hash algorithm assigns different switch ports for the different port numbers. You can check this by +running the iperf3 client against each server instance and verify that different links show activity: +``` +sudo ip netns exec netns_eth0 iperf3 -s + +sudo ip netns exec netns_eth0 iperf3 -s -p 5333 +``` + +Now you can run the clients in parallel: +``` +$ sudo ip netns exec netns_eth1 iperf3 -c 192.168.9.1 & sudo ip netns exec netns_eth1 iperf3 -p 5333 -c 192.168.9.1 +[1] 295484 +Connecting to host 192.168.9.1, port 5201 +[ 5] local 192.168.9.2 port 60996 connected to 192.168.9.1 port 5201 +Connecting to host 192.168.9.1, port 5333 +[ 5] local 192.168.9.2 port 39660 connected to 192.168.9.1 port 5333 +[ ID] Interval Transfer Bitrate Retr Cwnd +[ 5] 0.00-1.00 sec 283 MBytes 2.37 Gbits/sec 485 272 KBytes +[ ID] Interval Transfer Bitrate Retr Cwnd +[ 5] 0.00-1.00 sec 283 MBytes 2.37 Gbits/sec 479 379 KBytes +[ 5] 1.00-2.00 sec 280 MBytes 2.35 Gbits/sec 444 260 KBytes +[ 5] 1.00-2.00 sec 280 MBytes 2.35 Gbits/sec 578 267 KBytes +[ 5] 2.00-3.00 sec 281 MBytes 2.36 Gbits/sec 385 263 KBytes +[ 5] 2.00-3.00 sec 280 MBytes 2.35 Gbits/sec 373 375 KBytes +[ 5] 3.00-4.00 sec 280 MBytes 2.35 Gbits/sec 430 385 KBytes +[ 5] 3.00-4.00 sec 280 MBytes 2.35 Gbits/sec 452 273 KBytes +[ 5] 4.00-5.00 sec 281 MBytes 2.36 Gbits/sec 319 256 KBytes +[ 5] 4.00-5.00 sec 281 MBytes 2.36 Gbits/sec 425 269 KBytes +[ 5] 5.00-6.00 sec 280 MBytes 2.35 Gbits/sec 364 264 KBytes +[ 5] 5.00-6.00 sec 281 MBytes 2.36 Gbits/sec 561 264 KBytes +[ 5] 6.00-7.00 sec 281 MBytes 2.35 Gbits/sec 446 255 KBytes +[ 5] 6.00-7.00 sec 280 MBytes 2.35 Gbits/sec 582 263 KBytes +[ 5] 7.00-8.00 sec 281 MBytes 2.35 Gbits/sec 494 263 KBytes +[ 5] 7.00-8.00 sec 280 MBytes 2.35 Gbits/sec 539 181 KBytes +[ 5] 8.00-9.00 sec 281 MBytes 2.36 Gbits/sec 617 389 KBytes +[ 5] 8.00-9.00 sec 280 MBytes 2.35 Gbits/sec 490 232 KBytes +[ 5] 9.00-10.00 sec 281 MBytes 2.35 Gbits/sec 363 215 KBytes +- - - - - - - - - - - - - - - - - - - - - - - - - +[ ID] Interval Transfer Bitrate Retr +[ 5] 0.00-10.00 sec 2.74 GBytes 2.36 Gbits/sec 4347 sender +[ 5] 0.00-10.00 sec 2.74 GBytes 2.35 Gbits/sec receiver + +iperf Done. +[ 5] 9.00-10.00 sec 282 MBytes 2.36 Gbits/sec 536 380 KBytes +- - - - - - - - - - - - - - - - - - - - - - - - - +[ ID] Interval Transfer Bitrate Retr +[ 5] 0.00-10.00 sec 2.74 GBytes 2.36 Gbits/sec 5015 sender +[ 5] 0.00-10.00 sec 2.74 GBytes 2.35 Gbits/sec receiver + +iperf Done. +[1]+ Done sudo ip netns exec netns_eth1 iperf3 -c 192.168.9.1 +``` +As you can see, the total throughput was 4.71 GBit/sec which is close to the +maximum possible with a single 5GBit link.