From 6bba512271c0b76595680c0ade7f4f5d8dea6cd8 Mon Sep 17 00:00:00 2001 From: Eishun Kondoh Date: Wed, 2 May 2018 15:39:58 +0900 Subject: [PATCH] tres/secure_channel: Fix to avoid crash when receive malformed packet --- bin/enum_gen | Bin 1423294 -> 1423671 bytes lib/openflow.ex | 24 +++++++++++--------- lib/tres/secure_channel.ex | 43 +++++++++++++++++++++++------------- lib/tres/switch_registry.ex | 2 +- src/tres_xact_kv.erl | 26 +++++++++++++++++++--- 5 files changed, 66 insertions(+), 29 deletions(-) diff --git a/bin/enum_gen b/bin/enum_gen index a9661e71d37c8a3e9bdd802f5b7840e465cfd330..3a26013d5b90dccc232f172d8188283858f3babc 100755 GIT binary patch delta 30916 zcmdn@K5YA^unBHV2WvKZsIxO2tl3=1&dCCzYq}>zHQV{c z7+u&vj8GZIn_wve1;#kA)C5&VMX<JU54hfnoY|dl^>6=>-m= z0^85&FfIeRW_y_-<8ld*QSx4lF<^UZgBj0)jq-_PEM?&XnNX1&9hc0)z!1kW{op}C zvFWcJMTNKjh-J(L8E#A~Ms3H#3UWb5{t5-l|_Vd7HX3`(?ic zcet2WPFl#bWC?2&OIw>+uR;h{Q;g5$lv`|Mx&M3K%q5qDO1}TLub-E0rJjDS^8Wp5+xM0y1GX0g z?mTHyU+DXG&gbVU(|zjAXX-@zs9o+poPBuVxqzBWk9N$Oab*RY)uUCr&&qeMNPP6U zRY^B+{`pIn1UXflFM2fP@`pWRU-WikK*ZBOCsS;$+?g06T>185f_uc-?C;X7$rj6rKe? z{+Kbx|JYx{_yFHS%%&DA?#g%lc<~~EF@dM;>JEL0SaHD;Nh!vFC8a_S`qgz#uF!Y1 z|NQH6WtPm6Q~a(%h6?GK@4Qy+bII6yib>+LRlUt5Nela1w^kkV+-$$@*P)AH=h|DW zm^|m_2ef7Dh{)8s9W_;REK}U5H-)Eu%g?5TEqXJhOw_M<80ZV~t_hr+qatFaKIvja zoQhQb_jXH>sL8njJORI>{w#Q+F#n;)*Tmewzn%$GKBzjs&Dx?Id1qPM;XrvluPr~X zubBBy@K(+iv`dYy3P6%)Vj6xWLgcpVpGeZ6Oyro)_l zW%Z^LKWtxhNGi0qkHp4hy6%WeQIQH()_wS5m*B2Yu~+l!)vvPMS~OWqu`4jWg5`K^B>u{3ilLpj{iAnmJuzGpRO^{r(l=XUTz!Kl4*H@dM#Ca zTUIuj+Hgtcd}}Ov*r>X?nn~7CzC`rfR;~$Bcje>ezT>dk_bg!2ucEww+;R?m|Y6?V*P9fjz@f`DSm78K8d?j-eto4 z07auooezI4xx7^3qWUk5*{)gI5(@WRA8lE9Y^_QB7I)=^DO0kN>u30_tG_TsT-C4m z-Xa%wo`ql7F1|VVtHjpe%mk4Tu{-k?`*9~7-F@!W@^y~?B6yNlT1ve+^}3_+_=-wL zQyxy;#am{`Z$21#b3(h#4M9)7OE0guS>5{lSW7A3^DOJAD20MYtL!s!`CR{e)QdOb zisakmE|J2!-9d?Qhm`ACo{-!1mKRyRa%}Ld?%{XVX)~2i+y``)JwhL zSg|va$G4Hs`$7nBO6IzA+znQfwYV?b?AVp3!pE7o%KGlpwpJyB9kMAepKHnZPX8x1 zp)jJX&R$+S>wCE=bNGSfZKhwvBwC5x;^eOF_%v^7Mt50@qMOOb^yfjX6Ff>}b>`{np3(6uZYj{% zl(yqq&&rPhCK6mfswS^u-EyDLabn2XgB2#nN?nXH6Ec=Bv#h_79&`QJ9LvYSUn&DM zR!rcj=Pf-QaML5$R)=e|b z{Qqs1&l&y)ddAnLXfDr~GgWY|^9{*26CMQzYh`DN>t=>MmW|$acSCQXmYlG*L06En zhHK8LEe!pt|SuUUSto>%y1Ff(f6Pe7rbRV~K#&llITr14VZ+d9 zr=x8lhv&seXKRUBPL$3LT~q2;VRP>AP1}YZ-6F0tnn&g_uDjtK>|49RT=Cno_Xq2~ zHQey-oWuJ5Ohf*n2kp#19cnd2an7E7!zcqwfc%%R@^_c|GRNkV9cx)OOqJL$bxvEaNMOOC?@gP(vZgP7ki*=d zEiG_|<#@o+&5`Wsiyyc#@3_cTu-Kp7yroI{*WL$hA`wSD2n>rn$8_vdqHwLVDRL?oI3LW-FPRI*0^p z6Fz7ay!wZ$fOmI<;3Bz0o(&G0g8hnZnvVND*KD5JX0l(xWaACKUs5k0y<$DbeX?p} zx3=f!UWJK!)UTg4Ynb&y*jJD%`r_g93;9;ppL~>dVvb3C@vQTHi#AJS*DV;(#^Eg$4#kpR`)vrR~e;u!Dq^js=X0#H1*p& zxn6IzRKKI{)7nqYwrBZ2bFJ|^%6BrO>!!+i_DPzLjG|Nbb$xI8Htm9s%9M}ZEO{~( z8dnwDs_PfB`zSu?I=+_YISjGtOEZzhHsRbMYB-GV2s2 ziX7GYO$<^P%f4+_Bi#1%1h>_j z9qZfjoaXELO+VM^1AEOiPs}=RvC7#%{ zw?_TRky$=1%YTY-To%)var(zJw>-fLO}(xM74N!4W;$L!D#^U2dmH0**MlF8S0q;d z=+%oLsa$7{ysE=BE^92>rC zWz0GE_iNm<^_F&LLv}Ll*u}r-X;MlYe@nyRqc>6$;_jcm(_VP(^q!TIz8{{G*7n2r z%xw0Qf6wEd&9~lnWoEGIMuSf)7?dM-Pu+I5s=8V)Tgd#j&ziV7+2)LoPZif+>5Ghe zD8}47bIT+Sr*GT|i{hCoLfTk1oK`q2R5Bqlq;0_=-HSqhb*4DBT36(1u9FkZS$E=p zK%&R#go(4R@P4$JeXIBz!#5f81-8epMX!juePG$z8IEpDO9Y&wHlAk4R9VK~>Xda@ zE5u)(tBFfA>%2m>2D5=!m89^(I;XJt^_zdc48FY3ahAK8UUS7Fl>zcJ9FN>|gBF*7$&${`X z`{q4UPFPoFa@}>oYz^mI8&5Bo-F+b@Z`JIML$OO{p6;F18TQF=Mlq*zQVGkBJE|s$ z>J2INGM;+Zg~}!=7QQhJh`r}+y70jcovSIT_Zf??87)zEF4Z;JSIuvEO<~cDn@&+D zH>|PDVl!!9yWY~T(Q?f!%V&!$&*ZENmE&Z%me}TM>pW@g(yDc`4(A^=RLKSJclub9 zcm2e*Z;H1$J>NNPcpkE^d-6}cwvtq%4>J9CA1m%)TT|~p(dtCEwt{}#t0&i!<6`_j zKVm!4JzGIP?$`w0>Yu$)aYyFt5G;Ch%*XG}jT39HTr-K#mP8U)qyfeN2t7 zTI}TB{q?t*Bl30EkIKk+8Sa{OUK1-Hq>DGte_Qft`@;Em-TuDG`mj0sK>hi=loMC0 zf8M@uo-KM|(~i4+@2)YI-`Lla^W;_R28l~=f4}XG5L}kHaz4N4LI-W98jr*2b~#Us zcYUbbQCYRJnD@hxFJ;oYrR!RQo?B^@mKi>YYK^`Y{VHaWPevze9y|A8)-OA_-_#lF z7@9v6dVKXw9k+Adp?h{yo6Q&{?)qr6OB?KBkh~jo@;+B_5YNs~<&zUcO!hs$lhaVF z`Pob9s{F|xJ0t$v&4@W6GmkMfW_~q8WUqnz{;j=Qbm%?^^R&KG+$CszgU@;_)ff7PFFB9Tq3>Hb|Y9qwY)!6}*+ zd*r=(YE%C>PFua|5kJ>+u0IDKEo1w~H*x>vlkd|{$kqqs?0UF!cJ?|!mlG@4rFS0i z`IpyrXJ#$a?@!GU6U@FHklo(N>Bn#3jy18$UM_P!jV4Y)7-6m~W z`2**qk~0 z|13rJxqsq*^H}c}w@H(%=NFOxUiA5g^Bt#u>^wW&3vYg&^T)64&g!jtsV5ZIZk?iN ze<5nYm&2Mxf*QMhQ%>+-{*!ovNj5Fe!u%}HH=}j9qvrMweUdNx_f6TbMHt^i@sD{#`-fg@jd6k+S)P= z?UliI_`ejkGa2sV`q0XFznRrfkg07e;}nzs6D}}|i)}7D!EOB0UE))~ta^z{J8wjv z=h7@PRQ+zC#pf0EqbKn%$DNJy>U}@=A6iwgB*b2@qDRqv!|L<@L=}E&^t!+NCpw)) z{!&Fx+H`e=G59*|Ry|9eu(&_9=nFTG<+Nw>w|_l*-2Qu z-67RcUsI^1y>-f6?}R?#ZTFme<&B@Pe3QBny13plGW<$a0*tJ}@SqVcm7!9rsdByuNW;e!ANeUS>V7C%#8o7esY+k$}JQ^=*54W7(AZos_o+t$MF-DYmi5?mLdO8jV7EKO}F|eMJuez=0@*}Q^wkQ8Z&Z-wr`W?$?oTOZ? znewT8VV>k22JgFBt(kWw+%B2I>ryPueC^oVoxN(Qn{Qv4adTC@^SaWDmvt99B|cwv zLMp*{N!R}t+v!j3HN#x~J@@;k-1aBNTHu$J(uskp3B8F#AWm(G&5^ zf94yO^1na1R>0tx-rR2Wax?KKUl*EGnj1Wsp7}3a)b`Ksna-WTJeBghf604o3BLN5 z%e(u~&MzqoWT%#|n)II`t+xKe1b(jPmjV|Y;a~XiZnUe$_y1G>GWChvZdB1#x|MiV z_i_E{BGJr$$q%GXI1HiBS1`-=PO4nqEOrg|&%P-c zv;NBp^fCo{yyn{8y0m2NqOI3>TDCTy-6{EK|28XE+m9SqZYccEubM2VHSJsNo%-ea zPQUB87bU#Tag^X}(fJ@nYP?T_Kv z`Yf}EWbL}-Le8aMRx&+)z%2F1c*om=#oxf$7tXa95SOu94q^d_aY$q6U^oYpXN z_~z=SUeA84KK-S|s>$_6Pu^$#lXsh2qV$80>z_PVPc#3D$@Pb7lh;iZ+1#2l>%Y+P z1#TZ^?BD#q-q2p_as14EoLl%6f+od(yEyUKv(+Mz+`D!%m3%H0{V#g#S@_Ye$^Vx% z{x^5tcQD>*%E$PdmZEbwYA&^Y{{N^ju=bDj?=6z`x{Upb_BBtRF=hVKUdSfoz<;N( zn>Y1dIODn{?f=E>*EQ~Xb-U&CtDHp%Yv#Fmy^XH@!dLMp^!?*{r?(rKz21~EeDTtL zoUrV)+OBU0?%ExHS9JKU?eV)34b=&L3KwG)XYXRSo;}5Fci7^k9?NfP@?WmoHc=_I zMETCw`S~rk+a9__qy_68s^081SemtRiscOBj=}=TRm}@N{x9K3Q9Qim z?1`#fk}v&v{+)ZNy5P$EGw;^y{@3rmI3?nJ+V7yMSsO*TiqG^NUT9Sw+?=bxn_}S+ zK0!(PAp5#TwfWP!Z^-TVvOcn)J4{X7QD?rYQ|p;q7b;m|w9OB0GG64Rm$LeyP`z>d z9gC+<9ThtTl=k_^oe4dWZpe3IqxH)3y`OJnWk*gz26xxp06Bc#5O09qsLXv zxsm5ycW{ce!S1UkE!rGKSKfGeJ}u(IQf-C3w>D^;de^l<;HIGP=_d~lsJX6dQFS{q zso~j#EdFTiCmXihePno@Yt1z=TeA%A(nWU<-+iXJc5CvYom>}sSf?FsR9GZ2QOTOo zRmw$f<@0*SN|776BC~bpKDpSF91^8x_+4|Z!^7}k)oBSYS>!J~bieFp)F)2*zc@ooqFT4(LcF|yL_5rj2xOuzWlBFYjuiaPp!DaUG9M6SpmUMssgSC z^&Z!ndz@FQzwkrJ_wr8?*V~WhonpT8(e1%T{)#Dn6VJ0ftUsS9ldc`Zsw2`@%;hs- zS{@Ul_eOSq0h!0aPts--sQVP8INW7g5H+_*@{QONqdU4Mgv^8I9k5V&yTGgUpzs3E zz$phSz8vh-EYcRZrEkPnxyPoHk#(6^#L1gI$wE1~6aGFC*~#lB({S_L78}VPlbP!# zmF0=KTuZSIZ(6=+&CGf|jcSIcmZ6)tn@(Mo4hb#V$sl`c`{~q8r;pyv%{`R=>~5*w z^teMivSTfEj$HMr`yiZ|16dr$lzjy6j+YnKNsewquJ|?Lz(S(@##-TPJotK0{^6(@ZD+`j}gC4(pO+ zE?@doGCT2jRIlJo=a+uVt*>SM>B);={n!3`!QLJGPQ5p7g#DFCXJ4oDdqI88%$T*U zh7m_Nt=9TYv^G#mTXJGgDujQ#HpEq2Z{F<>}z4`cQ3!58P<pGq6<9{Q(xO_7V|o2xxT(|5*$+`oiucv#ezJaskr z^1*>c{HuD!451vKiSkSbe42UIl^C0e#nUIvf)^)#yGe8(kG)2J5rm<_*8f85bIcyn&-jB z%k|e!I7_R#_0cSA-?($zx_)uBs-AMb_3Mkk1v%qjK7+oeCA#%9=2bfVS=(|c-Bt5% z*L*$Z)e^_K-n{)>-K*5qSF(<9KCV7UVEM3 zr__E^jfKm+Zt@q;l5CGZe9U6jLPH1MRO`c)YYM8)W<>vVh<07JEh}sG+?6V8bGL4I z(PvU4`Ntr{rbl_f8PO?RzPbGZ>Jt?mnl+19dOjF11YIr?D2fd5KVJWILSOTQKKAVW z1}?Adyuw|j^-_oc+J{?Z4PF(->GL%x{n@sxtKQySHk@bV z7}M5f?&O`Z^{ZG|bVIzfNZ5z#=N?EkT)hyygO_#sLf2El0>>t^J)Lwi=jxxzu5CqI zHShSuggI$`GMP{(qm;CD(&JOX^-l~QM=UOHdXxCtj&&MK_}aTqSBXAIip|lTogBVH z`(^+3lg0w840hVO&TG~5Z#b(oE9QCnlPW*%XBk~Gt%ClC9z;a--Ku_Yi1`mg`27== zcVkR-JTEd-e;M`B zvBzA?w(7pJwUl6W-4JYTWwEUG@fPNvw)|zSrbg$A3~P59SLb|r-6sCvescP*nLZ}mOS@J( zZ9MOLT2|njY*U$p_WEQQ+04qdA04*Kh|hX#QorQdrB=4pTOLaUz0RLTqkCbk<*isv#MXJpvza7lRYOm4Gt2_@UE^)TLLWxN|X%hqDbb>lw2H*YtKIXLWh z*;#&ZD}(cM)hGMpm^1aRY;jt+b_3J-qPSDx9<1|j9*W}Obkifh4qXX39N z*~|D~?;O$cJo!TN!@J5O-&?M%v3$IPr~0>k?fQUcv%fCow^ROn`s0e_hgb!;yiE(^ z7e2bh^C*w8+Sx-r<1FvX-(J?n5rP-5>FDgft59JsI!Er_>Dvk0Yw z#`|4o#?LnW9DU-CRaRP7vP|QoTRf8(7#RNlXFSAV`~BUk{deXsa9Q`hIP1Iet#ar8 z3-vF*yIZ?&?hnqlyEp#75T5znw|2$9Dc|nisedth%kOD+A@>*5Zhw?*dnZspYw6xO z^~tKilE-tS^mQDn4PK|+yH&VkVN(P9afSZ7eSWL=Rw^?*-frA_B(7kgoU`J_{=zQ_ z`Tw0B<({g`-!`E_T6A~+x9rvX+6qq}@Gg z!6%Zn*kRW01t0%!o}sbveZi~c>iLhq?@_9lv+ryDZs{_m1-qU*ma>0#`5AMp(7!9E zd7k)!=l8UJ3g~dPM+8P+OpI*Mozpo_yCY@R#B+)^$5VWJPyR@n+!?zuY3hyNdGlt} ze$5R=uTOOZz@>2Tb|EoRRTg9tf4@ZAo^zG0et-$K(5oh*o)|a~XX`PsB zy?eTb%%Sjn=PTQo71+8PzeO)JHViycE*R*)=-(xUb01&5@8~MsT3j!t9~pA{hV{;> zsXIKTzI?suz^Cl-o|gv{Px$apP$90I1X=a%TN-`;yb+AlH2A{%-{M@fs1Q@ zov@h3=X-3CV8}HWL!nsptoLQ<@kU}>r}rE^Q+*`K+vXOZ&V|`kq3m^wRvSw(o?SIj zA!AWgNr{ql=F~J{25y^|-G?6e)L(p(+wa)(RK{SY&*g`Y9!Rl-^ToIpa26OA+jVonR{fW#)!TOZi=k@4&M)71cAUFM=F#Jhao_sSK3S_nSWb z^XbX#g6g>U_AAaOfBBbO_5ZDvuT@>0MrR@W$KWaNeExsB_Pp%Ysa$oT_xt7RH$DHk zy05>s{HuHO^{+X~_0ekcDn2~-{1M6 z@lbN|y}!>>S4Ov;uPJ!-@#ng=|93o;zn?Q}Q+2rGgZ`_H1=knG+w9q%{=EA7tara6 z_WX9|K+0d=C<0Z zm&(QJGCzJvx)vy2iOV07_$0>c2R=tz24FA|(9%u2WdA{iJ z*xABAaC z&9D39`25P17q^b@o11%2U{>XutK}`r7aR9K?XUimeERzQl5;c4uAj_)wdnlSIpsGW z%sGDFM0ZDh^>^26?$=J%|Ns7NxxVz5hvpyq_x&s`KRjc0-MiUhm0O-%;k$e*y!~3Q zXS|(@+?M*;`7g|ST@NOQc9!~I?bEsW>tNewndDu*^}nC=PVz6F-aGHxrTcdOALk!B zzWjcD?#8#0^WV?4kJ;6@(yH*u#L2p)$N$_8J>5B7%+F%aYnRLQ8^15BnxB7X*1Qdk z^Ns#Y`+QHUf8UFJwO=1h-)F1w&-(u+-|(6Df7|>hdcExQKbwrF>GQWQI_%2)K>3XF z1)aCg%iZFQe_c1OlKy;8xXLFXug2wjxytVi_rktb9Q!DK@UP?Edd)lUum8UI{{7|0 z&zN@n56IVV_?Z`we3)vxmA=B#NzWDdkAJ#3u_x{3TzS|m)Oq}JtD{njrief{wV`;KcbH~y203ACMO z_`K!o#}&^OyC_nrr=Z>GJ=T|DL}uvHf|Z>#D_pOKZ0Myxz7*w$Mr^!|2a+xz&c5 zSIf>Fony91+WmIOum74qs{Vghzkln~)nz{ya@?5ubEoF-{z}PzdwP47PJ6sJdaw7M z_uk!my7$)J%e}Yto?rg-^2Ozozk9v+dw=!bitj@CcW&1|i+vmWn75+&UiV(R_pbMz z-g~|G?!D4`tM?e@pZL@kqQN`W&2v$RQtz}k)9NGkO)FB_JVpDdC+jqG-TcUV8~>at zI`ygZ>35-I%Y@2XpL(8Zo(??SucNMWT(>-$FY4W zhUlK1AajXjrOzjiE|vPoIn!2Nx_e3SrQ^#DC5uZYmuxOsJ!Mi&(BvyRtV_f)drkaj z>6?0VFG;;rl-at)<=6BtOTSG0!u~S&<@&8vB0jw{uhOO}jTyZgRccbiL`j zmd*{@EiyIfl4_7kl=j-mR!e&?spa=x*PS~dZc^MtKd4ECT69+HW-qC)?%u1sM|tn!y=Ct$?|r<-d1?DS z8U5F1Kl6R!`!?^X?k7LPUXJ!z>W}L$n#k>ZU%$Y}^R3BW{WI^fuf_NHEYtroE&{K}FqmV@~)6UYUVxS2(TK#Y~L%wk|&2Nju5f}PT1&Fl#lxo*$= z4eWvQuFT4yg}~dt_%L4pyZcxG^A|8~?HmHU=BIcPsNw zu*DU7ndgIpNAf(gD%fuhH<>?yU1@TUc{SLahYy+8gBg>aGG7MAQu=%51h6?LzcAkg zo4n#T^DnTPCI6X4z$WivW3dM^WcdnGk?zHE6fC3X$MOx#Pzz$20#dSlPYTOfaEj}$V95eI_#(r5W3=FB$LCcr7=dEUG0W1Boo~0igSgpHQlt4b%zH$#sIao^RAj@|!L;4uY z2QY*8G|K^S`age$#Tjg+$R!ptu$0d=mPd*pe;WK?VF%l7`J3ehNNTGxs||?Wp2)(w z1GJ`lyR-jFi^*J9n ztwbp~8a`rSV7LoT^$ODyWLP<-YbA+Ju2kfvf?rd6M zlNG$#l)xe`0c_G>#ffojZp^}<#n|&-lxUQ)GB6adGBC(9Fig)+5ml&XEMV>bCEv}# z00zvlp|Lr)LqztS<@wrAH)oef(K99yyL9V6$&Wu4P^ z`o2l9&aH54&P~$q;pEJ8TOfL5N$2w3Mu*4wv$nCf2nZ+5YH3-~cIv%EXe$G!Vd0!R z>u&1I{c)%GyygA!b34z;R@WyL2`qfj>r(XPV_^Dyvz8f?ITp_AJ-H|D+S-4b-kX1a z*L&gj?7)&~mvfI-P4it^lDvPWSK)7Ow__K54Rev_;O$JOJh~{&CIOE z(WkN-ove~)n$5r3HEo)wb(GnH$e&v#u0EgXx9U}}=S_>r=ElXlCVJnTHPKhpr2e+w z^DR|gsl4_R%+Kx&+PLmo`}s__Q)LR}2j_b}|6I3rjkTk@en#5KmFH)btK4xAR_hH? zOvt<$NRbtq~EGF>CN|~?$wA|hF;lxw0zHL_3?4+$**tQ*8u+UIdtn;qxk8gZe z(yU)38n0Gtxon^=7%HEiX5e0;ue|Go_$?iyNtZgdKR)(s>Dt4cPoC_PJgc?0;K@|w zo<)7iJ`$n60;VmoTil(_v{>!jHzO?lnz-u)j^co?2j3Tle`(e8I+OHAOLC{z5-ZQ3 zjq);lE%)oomo8Ari$1n^#)*%qMw@(80w)TwJT&a=S>N~jDu<<(`HxuD6&_U z%wbnHJS@l*`H3wS&Q_#lzXj`X$qU6fb(Uev4SsO|~#ir+4QP7e0RXkwakj%~ag6`;-m84J zI3POzYe?5|$#45s2?l+=_~BG$>U;LC4HsDp3>{kk)|E5y+;zxQ(9>X8m9RnEi|KGr z=l&|IR13pPi!?et-yByIyde6*_TUG{x20<|-!oTl3HWl)-O;S!!2Hb>lxHp0m&YxPJeSF`O+UC-B`~`d+`@ zCh|vp{+CPZUix4DU8~WMckZdUT@L3zfq2=fkH>Cy{uEw*cz^A`TW8J7zP!6x{^RcJ zjk)rFKP`XpucR(>>d)^%HK)aQw;XAH7%cy0N9o&Z(fj9He_ver`1bRt^|H|&aesDY zYE=E5`)g(E#OaMk@{AvUyy=v^V(rpt^%c3#78g9M{MY`eKF*cBCbH#u?&3`bE?+Ku z@?PFPe_rjsd&24ef9?1=|9x8eB(7j1!8Zn@&4#{56<}e za@h=@j_#t^7<2Pesur!%Pqyu=oYq}@d#CK&<{0Vg=S-K)cU)Upn|7e_boGICG50jP z@6G!g^|OAO@gtru>e`e7nsGy4X)H=SF)W2D}J+z4N@hltYAVt zeFxhgu*qBZvn7Ko5vjv$d`ckOwVtxg1#3U~jExWMjGJ%S+F8MM_crb~d+)F?FkGMB zXv{4>y}?72Z+b(PDA)EmpV^*)ozwDzjT3Be|35ZJ`=g7AeZ4ZsU~4sYYp??=Oxer8 zp7>zP{s~;uKXG9H40hm6H}>CPk!zmp3-m#{Dk|BVz*2we*deXh_s#502_UKBC+r)+ ziq)R8Uj^I#_ci-Oa0NKw7kdU+;$V($>m@N zGjt0%g292&RKl?rY`fzUjw-P2dslKi1glxFjswyTTDyfK2DIU8JNF@uEkPgy4~lSZ zR{$}pOgaC9?W(rr{0KHM&yiCb+)kVA#aRe8htHq$0JynxA(E37Y{m6BPAg_`yMT{b z>JKX`0|Nsqs4=Yo+Tz8r-93p@5)un5UvO=XWo2N9m>%HDEk50>^HEkWJH9m2v(CxoUYi=U#C5r?qpoft9@L;rs(;yqU!51a^$UT+UBS;HX~w z#bWUb76yjLps1GH?z@1K8DjhD9P!PS%nS@A(=P@v%Wbb-$~g(_MgEnXEixc`rXJ;t z0w;lwr#X#4F4(SmfwKW@&+@CBTwuoLTb!@JYUV%WE|!<7k^ zvQ6Sz18$eUF6NR2_b|9xxO~A`F0!BN57^T1$y|{5IW?UtQ4^$H_aK)D*b3*PT(@jN zBJ#}KrC`O=*tlnd6QD6CH>9Pm&&v&I-`^47jsWX26Xm`Gwp~P;TStiLP|bEHUG77S zAO@R0cODCfQD)5D3udrdaNF^ML|k3D#n?cMSZ{7eW)Ne6AGax(aXpZmg%c!lH;Vfm zSmbOR_dc-p-ehh|FyllzH#dmUel?qW`_*io9s%A%HH&;0-|@EUvobJfK@tvsn<(%0 zNi{r{tRUmgHu7kIjr-ohBL&jDUAU9yjyOo_;{qNVCJ;k^G0!cq`?xpq6oD1jZ{g_x zYvvmETJO}lxf@q-k5o#u%LD_(trr%4ecqW_C060ErEKaZFsNMw-&FCW;hO)|Xe z!5&Ul=B)sW+*Rj20k(9x7VmYiNP|A_f3QfS5idJfq|1y~31r~(b=JIdLFW0|@SXv? zOWJ|g1|+jR(v|lB*edCG-h8m8o@Cx+VUXgFWxV|CAO=$%?<=t4cg?)^93T<>9^Qw{ ze4sEpe)z;SX=VlnG3MzT{xgeiH=e+&2eu)3GOsT$SV>E)$CRVY3=9V#J;uow4zO>( zy@2-)SlP}cyjQ>;>tD@#4=j?up7$dQSYv_i+0gB*3=ErCr#H@EQP|$Mh4(ht9of5h z?}FXxwI9mRJi^-mHfHrH-YT#$>gRYrgF{2+BCj-9m*q8HU9g&rJG@K5YWN@UE(WXF z@`$$)Y@qpb-fLhH{#U$n1wme2_nY?*So<1AK6xRRN6#^y*L6`S{Q&Evbi z)BJ4w<}Ay#dTZtDRJiHrN-mcJCZ$OWTAyuWUCFVf@QrWbhP}7H?kWw?QeEJ+V#Nxl z6}whTZ*>)Y)F>Wzq1O41$DbE=itF^ws|xM+XAJq+&|>j8$D=jk9Vd?7H#1g+MTypbS@QhK^VRQMuWr-+T6ulj)}Lv6 zMMCaWHD5W^F08u!S?H?1I3A|`M%Q`fxVfLzHDB%LzBc01-L|+goBNug%**dQ{Bbqu z@14G4zl8i(TYSsJY;P>iIluF%YtZ_T(%X3~^>v#?Zj>F5+4yJEW{L8e`(JxcEPmV< zU%u+3u6fS#r#tOt)Z5s_uQ8kBa&v3#@`$h$;o|sf&%~II=Y_--dTfk3dh_=k4W->r zrp*mHAOA>Z?ke-_UY7^AjviR6s%KHhY^J!@E7B@hyGqLEZ0IZ3`i;g>THz%>{B}kb zJ-X_poS{-*8eqs9sIzl^Qr_1IoR=o=`~2YH$(6z9&so-ezIr-8_SiHHg+m(zCi|#(cFcRo zalRw?c5|fRcH0jPhI@39F2r$X>g+uBac#5wBz;!qlkBl#@5Aa@yg4UD{%yJQqh-m@ zU79|hUYP%QeD#0&3Wv*Lntx&<^i!PXEfA?!ycT)Fw&i_C?XrmECXIztH~e5R%!sO~ z3{Nlr*mh#VlA{~ET9dj>ILtv^=uezTuYaxg(RRx{^&RFDJCTo)T3u>B1cob=J9J zMH~7`74^Qz1#g(6;Pb@8qW<;8*=||Uw|lmnRbl#jWz|LJgrr%Uo9;y`2t-HU6Fz6> zy5W{|)rM65qghoaUn~|&JbcV=ThrBj2VSU(Y+QEn^baoAWh!D5=BPL=7LlEtx1qH z9}n|Lc%xmpq9m{^MRKEAru5{S*MFx@S!5y?=lwy_BeGm;&(Z?rpBoOIRA#XA6qsBX z&6X~F=0WDd?^3%;R=Q**|V*fTJ@6bq7z9;z-%|A`9 zx8J&&#Z#YH8sPO`C!%%*Ls*1$6SI?il9K{i9zn|7#Yfrr0 zJbU}3dxu^z&vq)%)7Gwey=~RvhioU@AC&c!2I|ca%G0<~Z=kt6*hSIv)QOh|?3L>! z{IA*E+|T!d+-FHqs@0U=bNpXp z^^QB@{#$STo5N7T(6+erX2nY+~=U0S}b`pr?L%A8%1_QF5ajw@fh6OqC{ zQTx8Mx>nVt&3k{7gGt&+Oml zvlHuO_SJs6y}f>a)$6}UpWlo8{q=r)Ni5)OD)o;3cl6(*c&$hECl`N+ zJ0-IxY-->h5pCt7g@O6}uS9%n{@yO;o_>twcHz(c@(;z&>+ASz{WQ;J^7SQIr!x23 zeEW7gE8b#DgI~z24|NM3XZ)U=et5~nC1&enFUnn$yQsGHP-Sms=34*TOTT7o>MrKZ zV&C$6EBh9mTY+oO^ycoJu-K3LFC+62sXq$*9LOWuhibMTG2(j;u4~qs@+pApqw^Mg z;@}$Ug&kiAxIVIT=DP@H2zv0N1%K37@42~MUzaT5x*&Fz_vp4WNg@AN=U*TUP0Al=n!k-DQ(o$aWOM)5o@A(&i z?Nj{5FAc8q?f&tv0k;d@2nv{h)hLMz=c$Ffc2-eP zUA8>6;QySNPL7^h2}+z3+cFAxHeOY)HQXcMEeTuw|#b}@kT3ME)BS6qn7r@$#90@=4IJzYxgAI%CksM-5hqwFrDjXkFv;|(sPB! zO^ZFRpPCu8^4^)<-|7peY~OV7XA)b)(v(YuZ!0@gW*^^ltts`pzv$UNIok@>)SubL z{Vgs%Z!hy~hqhd?%`YW|&(6%-@P=!%M^BSvPLai%{P7*N25v92BRds*b*ko%kzw{KjoTP>G7eI#n*cFx${?@Z>My6Txbteb;S#JNCF#-o31@`E>c- zOvNIv$H9uemjk!gF}_^2;`G8&V#RkH=}2TnADw&7F4p&`g3Zj_N(9FSJa;NSKObv!^K(To6z3V zi^Setnz*L>#O@x^xu2$=7K~*R-Bj)za)_(@zQ)n~it?5Yk-#6;imRpw?+u;UmaLO4 zs$GA1O8nPrEgfq=WcN=pXkBAAtyMEDXv*;`hf5u zSuTQFpDi}&^88w|?2}hpPvMcrRs5$NuJP>QRqT5e#O?AbdrDIL4#AI0llU%4d$;bp z`s5*-Mn-GXGl8Z5cn|g}iT8ztm`x4cRv!+OZ?LEhr*|4&{pu{p~*uetEt z&}6^Rt6R2rxJtFI9R24%_uMNhn>%c!cME1amh7GsaHU>!)zU+oqV?umBukx}G|{MM zQKF983a%%s6x8cYw)(tVU-Qn7e>-z||FOsGCM?>xxjT7LQMtjIMTsh_PbY@@-IbYW zS?Y4_k=(lq{REwpRg?8{JG`Y|KMdRN`B0_gibnT>b(f~S$PdjteSfEtmFR!{(!vvg z!clj^)t&7N7uHyXT-e0z=f3@TDeZGYh- z$IA^OzdtYc`%>_&IFNr$T*be4OPAg{o9CE`LzuBt4_KNn!{&{=n%ew1z|KCl0ey*txqe++Why~&OMTg{U>An zr->s|G4PUK(vrzvCg^SI{4z;*$@~lzziks4jXc^;SOurF^h~;&GUttAaLTMV>gOjl zKVki(WO?MO^|v#RuipPx_rrzpAGp?d zzCgeXEG558pb=c!FIpjx&I77GxVH-EgKGqveFExMAd%D`&B`yeYhPtevC)ng7H9<)A`9Mo>5m<4Hfgq%+ zT4yQ;&sto-X)U1?0k>9zkKS$ij(&ZeVA; zoGPdVu3kmw3D$u}6Q*tzR0FHoyGzglZ1VTLf_uP>tp^1+ff<=c1-F7LZiQ=t517E6 zWya9Lj1p!BhI~jbd%D1CQLgQJHw8Pu8g|?fgtRpl-WOaC772PR7yuq`S@KnIGq|RY z{3B=w_P|UIp>U83+CT9MZU4k8+@KC}dx@!V6-adZ2PWQHqMjg{!&1~2M2B07+JopBQ2ujEQP6nlbZaY7&;Z@^S}Rd!ko+Ml zQEw2Uy>m(WgGH1RMMBjZUh`$t_A^OstA@*)|7Ig)Wxx!D* zn$GGXYOe^Izuh!7dlefi0|O%~1A`2Bx)w&Pz0Ej1^ERXGbnh-v(7K7~6I?`P7~f7` z>mmvo$De-DMO21q)~o67T|`0C*VFl3MP(TGOxJN0RR^0K(Hy&8goS~DpM`-z6=o=y zPT*jgesL9}^z?pLQP7%#=_^25w@*LnDyjkU&wE!<8Kxq>>AY?blXcxhWth&(Pfzp| zm7Jd9CJH)#Y^b~VPII!!oZ*jb_0y~X86C}?nbdM=3mXbKTLZpy^V7vRmvB*Fk&Ml<~& zNP)KX^!x6jIv^W)Jw#=gmpCv@PjFxon=V-Z39A5*=$Uw?>4{mQ^3(e~M5RG$SA#@< zq%ckY7%VD0{jLYZ%|Ah+rI}3A4KtZ!r(4&G^2meSoRhN8AdZ=VA(EMaK?UYqFnxb| zf~Tl4IFJkE}46qR9IHvPA! zC};`8bU80@lv;awhoy%KPhPn1GG-7PLML{Fs)BU_fWta>fP0#Tb)dB^@43H|5H%!w%yk=5{ zC$SeGRnvb=XY&!&1gSFg5tU(5;+*d9BdP`tlr1Z~UOf9!5N$KE(%; zeD?W>$}s+$e%nXX6zueL=S!#NNHQ=?mxOd`U^*BW#FVBR_(HrM=qoD2{Lq>i6k*cS zyL}-Mw!&9bhDpa^`Y~TfntugSrQ*gs{edg9^z<|HpvlXwAo|@5W(J1I%;=fO(|3A+ zAH>HsexfqW(t*s=9TgZQroRth=AX`84~dlvexfo=f}zvj`9Zub=`Sk7{3?oh`h}&U zBGY~RMMc1#zcXXi`#4DkhDb>UaC$^|E~xLOHAL>4N=ty5@lEg zcDEE{&DFh?%$(Ct2SDU+g5>XRfQDRx3@h7o$v{Y?YX^$TFbQp&{vlXYWO{5MBuuLU zMP(SzPM;nK3HTi#HF@W!Ukelk&23Hp5hyCdJoP5?^uU|UI@4FLgjf<7Br3zyd2f1t zkSJ(wZTgxZQ5j~lN6ga&jaek8b3bC{n*J^bqV!LYs0`!t>5{>aByJN7E|wyLMfE^_ z>1n{#kq~@0urzGhm78Ib` zJ^ew5s0_2X01KpSc*f5nGJRcyD33j;DCnNpeBiSf1H(Hp1_piR#ZgZdhOFZJyi`orF7jz)o;9nTnSr5+nSntG#YuanPY4q=1P4uGUTecrauf5H3hjyB3x94sXA!7SvVx9qCtGY)ajMskUTdxTvUenK?Te7g}>Nk zr~j`LWu1O6TvP~b!6y&NlP{SV7@jbp7Y9DI(*+_#K?iD1w~P>#VasV?VJIt}{=q_2 z46IYYV(U^z76t|z7W9I%vTgdr2uMEM6Co|>cO zcbY|N`l2*Z(9xCCBO^s+m|P}LcZ?C0nclaBS77>*G*J8Izg$V|W411(PYcVxE+b2BjTaieEpzXj8qqC`RS&C^#!iOMid zUkx%TBnL+UNRXi*u)Thp_nMRh@r zoE0r9!~Aa#H2Iy~!@@aTCKGDjn(u2^PqHvD9ARN#5JEAp{NQxP7*Pdqh~Df@%vi?4 zz_5^ofk6*NRlzZkE5S{s`WR6erlix;=f;R?gRDIjBPzqJa+YQKgEK60I;cr^kx#YG z%bHir3=B`185j&ujLf_QGE!r@&m|VF>3RXsDwFjW`@*e?3=GQ@(M$S;(9bMv9!_2@?&Wzr++dMr!QPe~ORBHWjnR{fvCJF8lznU8^? zjt@QSbm&f>ngq!@dy_yJ*oJNTUu!mT^!6QNvZxG`wexiOWJo^o1@S#Sre`NZ>Z=|Q zztnsBs$@t}c`8{{hJ9uL8$(fI-gLocQDJZZy;~5)#Kp|Oz{i0XqC zp{<=nQuc3pZVIHnnwugj!?YnC;@7;@EF9DCr-(u#A@aQ}X8|_@LpC=9gD{e228J8c zMN%P!r$wr$40B~U8>rDCHQlqEjeB}cDkK!UQbAd<9%Ay5R8d*5o91pv<$ zz`%uK=<8`|kOrP~ny3u(!gi>cA!(2{d@e||e*)X|##~W}>9G^oIKTxGD3k9>6O~~K znhLQA9A7`vAb}~BE-J&6J!`r}x~NPnD9wCabfjbvBLl-+M)aDlVkH~2@{CU`D8N$F zE%LekRA}8>W(I~A%nS^=C~kLOJ$++3q~-7~T~vm-emxr~>B~;n$`A#unVs&KAu7Y< zyA`BLZo0x&HWqkGz8@qbv~&8}3{gXnXC8p~0tcomq=<@67tVxe*UA)?VJba5-6Io{ zC^A6&)~D0kG9itSm6@Po?m0Bb9%Vur{{KL#Ox{hG$r4oo2R?lH6AJ@_28svvPLIzL zH3!*0BTH0<`Th^6QR{!O@lC&<1&PtOS)wvbul_+ivG*Sv7kb)u%odeld^$ZY8{*2k zY*87eX=>BwWJ40m0g&|N>36dsg~Xq1Q5j}$JND^}cI_E}!%O*qO!YWTx zhPm-M`}B$Wyu#CS@pVC&*hk|m?A1NJ*q%d3ar-9=5T`?GXsMp2%~tsqmW~|T_K0m^!3m_<=z5O8OFQQ zZxuk?_NPEphH1`{=~9KFnqZ^6j(5k*W?^8MhEZ!stm1&wK;X>xZY2lz^!`GKkLMPO z$}s<4$1#25It~eNeF2G&m{tK@UIqpYUi7ksW9zgcQAMyKIgc4<+kzMva)Z#@1!;$- zI~GCf+r)DpT3Qtt7|IkF7{pL~C?h((u}D+}?D*8R&%#c#GcX)uM=!XqnsQF>HszF@ ze!mFfem z&wFvQPd`-*G3iFJs0>r4|MYLgqVix@1f04(^Ee9w!yy**R;_jv=k$k>oRF?6SnXjO z$sf$j3=IF6&?_vXcuq(x|B2(|nErD*#Ig+~qB6{RNt}?FC~y$vn6454X$NwZipntV zovvOgsslFK{HRT+CMyGj3TQ1AN|1%-LcQHr3dy8vOGRavj}<{peO?L~9APXIm0@Bn zpDtepDV!}pe5Q)&VP%lCQ&A==!+3D|)G|nJJqVKa?45qU3>vfRuWUcU&&9yN#l^rN zj^Y6K$5g+bC8pPvLp)Z?crL}i$L&VU07JR-wBoxc*=8K@3CJI$Gufx(Uyz4U3gFx|CMR3Gewzb584 zPO&gB9A!ZtkYTz8_1J~0oV?R_RYLrHqEb}GmhUzvsAZ6x5nqywz1H%Kv|_u%#K3T! ziGe`?C9HoBde^uNBn>+?jeo28Jp@^!DkD zr0E-KAr;p}kS@29>F;ZyeOkB4N%im#i0+VN#tj-Mk)BDMy3&9S1?amYhDR9?}F` z3lf}nbo%LfNPd1>FDk=a#mo&EJdkgIlmeCw;J65DfOJOc8$@N8`Z%Z0ZGh(A*r_i# zV6Ax624oj6_jCtdZV~VZDmd|{+fSMy$il$D!@|IzjpB53L2k%su6-kDLlO1r$JPUr2~O)CP@2vY-zvB7p@+FFpNWlc+RE@E%Ao z!D9NKCQ%KrwFdX^yu8cGz;J_=fk76 zOz16kpM}#6+94kIZx@we?pn+<-C;40%=E5yhz&D9qG=m>rps*Pk(_=3DtZqjdTR^M z^a)#dWTx|0i}J*Q{HI|!wWXSofuW2My_ihd#e-ZFVRQ{Zx|cq3a7*B4V2I{N@2>Oi zncmz137xeaqB2%XPxCO8mS(14HAdNnpWjQ7fx%i4eV~`^CeQReH+W>HD|A9Ur`IVe z!_@U_x(|pxR5LxRQ&fie>3^Q-v;XtRf%6qO_=+zjZS9ZGf9EjeDJ)$zqWe!l^oazyk20QumyK2uyNd|@*Nd^XGl-#++b-LaZ zQHklYy^w5V(F-ylo_D%VJg*XXNC<4e#)2$0bzueuePQ&D`152?_zF*7pUle-uCu{T zKImUI{{kBW!)Z2j3w_F=j^pbS6$6`ng~RC7Mpg!fH5f%lY~6I1K1fg%_KC_cdA3aN z?}J3!&OT69=mDE0G5tdy#P!_$qB2am6Q*nSi>iSFIIv$-hH>BYynaaj>FpPlVdh=P z3mUbRnSOr(FX!|>UXXyh50VmD$_pv_?=Ioxo-Q*1BBeC}G>xztYL#e#sDL~uFND8& z`3f`=72kc3y z=~0tKCBQZ=nbG_$hlzn99iw%g^?(;LX9(^v9;%tX7i0qeW8Uc>H;T$m{|V|w9;%rx zFhx{`Y0`60A~OKln*icxy_#M(1rjB5r-;f}bN=CFNQDf)qmAf;0{SD9`271U3=Fq0 z8jS2re2|hI+#wU0Dk=zeblBI&n{!zi7&2JV`~Mp3Pz^uX`1q#hPlbe4?Nm@+<>8w? zk%v!Y`Ua@zzNz4b@9n9gN+5^-2XT*2mzgH254I!-d0{z^hn z!{l!~eJzMSR5ShbG*KC53p2jy`%L*XrmtNCag4%rQ5ohaOFl?K+&WWK0Bjvw;?s}Z zEDQ{w!BW&gnPPiBNSkxPbV!iy2bplv8EV4E>7pWF6E5osEih(dV9;Yj9|fM{0S%S+ zouWL`eP@V@>43sLW`Ba#eE|lBTLKJdiW?#)(z`8_Eyf5lzVqj=vLT|8o>r4-v3n?G#=Ypm{^{3CBE2;}J z0Wwf#D$^dZo-|Eiiq8m4L`}PtZIwC{WmshV4GW#lWzi z3tg?E*YwhPkP3XpJW&}YvC!$;=0WoRt$Cs{%(sbEW0muvsNb2EyQ5mKgnbZHzhqOr)7l_I*XOs&- z+8|L2M5V!g%DMJ^CFK4$^ysf>fZFJAiG_3et_9FkRq!f_X)+T7Lmv}*yGpGU6qF*< z_qPaeP3Kz(DQaXEipns4o^H8N)EpcW=*yN7rCM3f^a%?g-rBfORE9};()9BSMM2B4 zrvF$dD#P3`9U3k=i$q1iW-)({=TBs3V2EKy?-h2;nx42wR35B~=gKsp&nyfK?=U(b z5{srUSR`ty0gA6qlk0y&nHU%XFuL{u%LQOr>!Q7=7+7^qW?Y#$4+Db{4|-z0yix!< z_C38fQ&b8Z#vw}r-hSm^VEDj+p89OI2~3ySDj*LY!UnrGcAxjd50(rJ4=vFLPjdH9 zKe!mug?Y1BREBxlPXS2zEw=<3HH#Se|ABn@5~E0J|35us38YA>Tp}vNyn;n=`YlIM z8OX5Kp_=Juz@i+2py^Z5X-lDfx6p{Y2?n5EB*t2t58TrYmWrB#5?ba`Q5mLmf$8l_ zA+4s3ApUF7>F1YprUnW!Q-5V~?j?}N%! zLyQ@_#p=@+EQ8o{YMH1Ev!IUP^p9GC($nWeiSmH;Is|{c@_~hc;WZ0-`rK+b-C#My zO)<+wWti@pO|M!G$%u28i^?#su@r;^==tT4p4|(Os%qQmY%4@nK|ax4Au7Xs&r@*v zJ`X`jjAGDI;AoUPD+7ZQEBe@&Z}RksD@0AeY2o$OhQF&+7#L=&p!Z>KWC%{*kuE4V zoo5TwEB~K&egZW}uCk!3-P=3eU?rr{8oN?dhWXMYK}h|4exjfdWF^L-n&~@1Qc}|e zr|aj6icJ@oCdi5&@{FrQWtiONPnTZ>4S9*lwoK1i7#JRbmNO#qCIbV*v2D{gt`ZfU zzH6(X0Jzx-4(%l(cCY_3F);kVn4x{Q8>AjwkUjv}qOl(o2$Itk_6b5((}49m>|V8? zn3;hgj~Ts=dUgn+{@y`B9y8?GW>9VoulM=WA;7@UEP$T#XB`uStb~Y9NuA!fSyU7p z>Jo)nY0H@y7#1<1hh*S&!RdzA1m&jRwucm0{A)yIn2c{hEZ4p%h`OrmP|ftjHKH=i zFYiLr^SwKQ67Y7_Zjjzf4?udQr=PhG^(ZLm2(A^CVQPLdU4JdKM%sTxp)8+`fgy_x zz5RIg+w{V@TWMZv#f)3Omx

TplUh5z=Kn{q%)NFd!I!JQfxK31tSXw=f?fo&Q?qRm;x8z`(?Up5O`(Oy9T>TGd3HOuPykAwXSuxBSTT4;!IH0E5f= zZ);f@7*>GVW(W^4Ffgn?Aq=XX6{fF0F3dJPdlMu^DmRJBFwZ|HJiY#`uoQX@J^+%G zyCe+hC;eCr8T#SeEGol%>x%I7U6+NW;A30?n?+@q_CKGVw;57`&e$v}BfCyf1lBJC z?HWSOY11!)w7fH({(dv0=8@VWD#Pq&Co)~nRzzib>=uX%vq7RoE+W$tt3+j{=Q)dT zP2T{O+6R)F;4U(~z)eJI`tJ462v9g)_{xu&fx#0a##+2YKw%&?-EJ#1^Oh$~y=lS1 zz+jBgHxu#`fi#K=97NfsPu&Xb$8^8RK0AqxfuWZTeE_s42x|C)t>8}Zv~8j?%;}L} zL5b<{5h7gEC81q2|81f&Oir=WbGM1AgA>_F;r}l{tD{z8ETqUy5rHf)I=>ClVtWZP wHZDVCx?Q@6#B_!2kWkXwE-J%xt7y89gooJ;s?J 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 do - body_len = len - @ofp_header_size - <> = binary2 + try do + body_len = len - @ofp_header_size + <> = binary2 - result = - type - |> Openflow.Enums.to_atom(:openflow_codec) - |> do_read(body_bin) + result = type + |> Openflow.Enums.to_atom(:openflow_codec) + |> do_read(body_bin) - case result do - {:ok, struct} -> {:ok, %{struct | version: ver, xid: xid}, rest} - {:error, reason} -> {:error, reason} - end + case result do + {:ok, struct} -> {:ok, %{struct | version: ver, xid: xid}, rest} + {:error, reason} -> {:error, reason} + end + catch + _c, _e -> + {:error, :malformed_packet} + end end def to_binary(messages) when is_list(messages) do diff --git a/lib/tres/secure_channel.ex b/lib/tres/secure_channel.ex index f6671ba..91f11be 100644 --- a/lib/tres/secure_channel.ex +++ b/lib/tres/secure_channel.ex @@ -41,7 +41,7 @@ defmodule Tres.SecureChannel do " #{state_data.ip_addr}:#{state_data.port}" <> " on #{inspect(self())}" ) - :gen_statem.enter_loop(__MODULE__, [], :INIT, state_data, []) + :gen_statem.enter_loop(__MODULE__, [debug: []], :INIT, state_data, []) end # TCP handler @@ -50,7 +50,7 @@ defmodule Tres.SecureChannel do {:tcp, socket, packet}, state, %State{socket: socket, transport: transport} = state_data - ) do + ) do transport.setopts(socket, active: :once) handle_packet(packet, state_data, state, []) end @@ -208,6 +208,7 @@ defmodule Tres.SecureChannel do # CONNECTED state defp handle_CONNECTED(:enter, :CONNECTING, state_data) do + _tref = schedule_xactdb_ageout() case init_handler(state_data) do %State{} = new_state_data -> start_periodic_idle_check() @@ -228,6 +229,12 @@ defmodule Tres.SecureChannel do handle_ping_timeout(state_data, :CONNECTED) end + defp handle_CONNECTED(:info, :xactdb_ageout, state_data) do + _num_deleted = XACT_KV.aged_out(state_data.xact_kv_ref) + _tref = schedule_xactdb_ageout() + :keep_state_and_data + end + defp handle_CONNECTED( :internal, {:openflow, %Openflow.Echo.Reply{xid: xid}}, @@ -303,6 +310,12 @@ defmodule Tres.SecureChannel do handle_ping_timeout(state_data, :WAITING) end + defp handle_WATING(:info, :xactdb_ageout, state_data) do + _num_deleted = XACT_KV.aged_out(state_data.xact_kv_ref) + _tref = schedule_xactdb_ageout() + :keep_state_and_data + end + defp handle_WATING(:internal, {:openflow, message}, state_data) do %State{handler_pid: handler_pid, datapath_id: dpid, aux_id: aux_id} = state_data send(handler_pid, %{message | datapath_id: dpid, aux_id: aux_id}) @@ -324,26 +337,20 @@ defmodule Tres.SecureChannel do case Openflow.read(binary) do {:ok, message, leftovers} -> - debug( - "[#{__MODULE__}] Received: #{inspect(message.__struct__)}" <> - "(xid: #{message.xid}) in #{state}" - ) - action = {:next_event, :internal, {:openflow, message}} new_state_data = %{state_data | buffer: "", last_received: :os.timestamp()} handle_packet(leftovers, new_state_data, state, [action | actions]) - {:error, :binary_too_small} -> handle_packet("", %{state_data | buffer: binary}, state, actions) - - {:error, _reason} -> - handle_packet("", state_data, state, actions) + {:error, :malformed_packet} -> + :ok = warn("malformed packet received from #{state_data.datapath_id}") + handle_packet("", %{state_data | buffer: ""}, state, actions) end end defp handle_message(_in_xact = true, message, state_data) do case XACT_KV.get(state_data.xact_kv_ref, message.xid) do - [{:xact_entry, _xid, prev_message, _orig, _from} | _] -> + [{:xact_entry, _xid, prev_message, _orig, _from, _inserted_at} | _] -> new_message = Openflow.append_body(prev_message, message) XACT_KV.update(state_data.xact_kv_ref, message.xid, new_message) @@ -364,13 +371,14 @@ defmodule Tres.SecureChannel do pop_action_queue(state_data) end - defp process_xact_entry({:xact_entry, xid, message, _orig, nil}, state_data) do + defp process_xact_entry({:xact_entry, xid, message, _orig, nil, _inserted_at}, state_data) do unless is_nil(message), do: send(state_data.handler_pid, message) XACT_KV.delete(state_data.xact_kv_ref, xid) end - defp process_xact_entry({:xact_entry, xid, message, _orig, from}, state_data) when is_tuple(from) do + defp process_xact_entry({:xact_entry, xid, message, _orig, from, _inserted_at}, state_data) + when is_tuple(from) do reply = if is_nil(message), do: :noreply, else: message - _ = :gen_statem.reply(from, {:ok, reply}) + :ok = :gen_statem.reply(from, {:ok, reply}) XACT_KV.delete(state_data.xact_kv_ref, xid) end @@ -566,6 +574,11 @@ defmodule Tres.SecureChannel do :ok end + @spec schedule_xactdb_ageout() :: reference() + defp schedule_xactdb_ageout do + Process.send_after(self(), :xactdb_ageout, 1_000) + end + defp handle_signal( {:DOWN, mon_ref, :process, _main_pid, reason}, %State{main_monitor_ref: mon_ref} = state_data diff --git a/lib/tres/switch_registry.ex b/lib/tres/switch_registry.ex index 7849058..67be0f0 100644 --- a/lib/tres/switch_registry.ex +++ b/lib/tres/switch_registry.ex @@ -35,7 +35,7 @@ defmodule Tres.SwitchRegistry do def blocking_send_message(message, {_dpid, _aux_id} = datapath_id) do [{pid, _} | _] = Registry.lookup(__MODULE__, datapath_id) - :gen_statem.call(pid, {:send_message, message}, 500) + :gen_statem.call(pid, {:send_message, message}, 5000) catch :exit, {:timeout, _} -> {:error, :timeout} diff --git a/src/tres_xact_kv.erl b/src/tres_xact_kv.erl index 2924dfe..d4b6835 100644 --- a/src/tres_xact_kv.erl +++ b/src/tres_xact_kv.erl @@ -6,13 +6,20 @@ -export([insert/3, insert/4, update/3, get/2, delete/2, is_exists/2, - is_empty/1]). + is_empty/1, aged_out/1]). +-define(AGE_TIME_MS, 1000). -define(TABLE, xact_kv). -define(ENTRY, xact_entry). -define(TABLE_OPTS, [set, protected, {keypos, #?ENTRY.xid}]). --record(?ENTRY, {xid = 0, pending = nil, orig = nil, from = nil}). +-record(?ENTRY, { + xid = 0, + pending = nil, + orig = nil, + from = nil, + inserted_at = 0 + }). -spec create() -> reference(). create() -> @@ -24,7 +31,11 @@ drop(Tid) -> -spec insert(reference(), integer(), map()) -> true. insert(Tid, Xid, Orig) -> - ets:insert(Tid, #?ENTRY{xid = Xid, orig = Orig}). + ets:insert(Tid, #?ENTRY{ + xid = Xid, + orig = Orig, + inserted_at = os:system_time(milli_seconds) + }). -spec insert(reference(), integer(), map(), term()) -> true. insert(Tid, Xid, Orig, From) -> @@ -58,8 +69,17 @@ is_empty(Tid) -> _ -> false end. +-spec aged_out(reference()) -> integer(). +aged_out(Tid) -> + MatchSpec = ms_for_aged_entries(), + ets:select_delete(Tid, MatchSpec). + %% Private functions +ms_for_aged_entries() -> + Now = os:system_time(milli_seconds), + ets:fun2ms(fun(#?ENTRY{inserted_at = T1}) -> Now - T1 > ?AGE_TIME_MS end). + ms_for_exists(Xid) -> ets:fun2ms(fun(#?ENTRY{xid = TXid}) when TXid == Xid -> true end).