From 2040e9b6c60e7add6efff556b7cda41dff17f7f1 Mon Sep 17 00:00:00 2001 From: Mohamed Mahmoud Date: Wed, 12 Jun 2024 06:53:08 -0400 Subject: [PATCH] add sampling check to align with all other ebpf hooks Signed-off-by: Mohamed Mahmoud --- bpf/ovs_monitoring.h | 13 +++++++------ pkg/ebpf/bpf_arm64_bpfel.o | Bin 136984 -> 137096 bytes pkg/ebpf/bpf_powerpc_bpfel.o | Bin 136168 -> 136280 bytes pkg/ebpf/bpf_s390_bpfeb.o | Bin 151792 -> 151904 bytes pkg/ebpf/bpf_x86_bpfel.o | Bin 136728 -> 136840 bytes pkg/ebpf/tracer.go | 2 +- pkg/pbflow/flow_grpc.pb.go | 25 ++++++++++++++++++------- pkg/pbpacket/packet_grpc.pb.go | 25 ++++++++++++++++++------- 8 files changed, 44 insertions(+), 21 deletions(-) diff --git a/bpf/ovs_monitoring.h b/bpf/ovs_monitoring.h index 25fcaf78d..656d088d2 100644 --- a/bpf/ovs_monitoring.h +++ b/bpf/ovs_monitoring.h @@ -7,19 +7,20 @@ #include "utils.h" -struct psample_metadata { +struct rh_psample_metadata { u32 trunc_size; int in_ifindex; int out_ifindex; u16 out_tc; u64 out_tc_occ; /* bytes */ u64 latency; /* nanoseconds */ - u8 out_tc_valid : 1, out_tc_occ_valid : 1, latency_valid : 1, unused : 5; + u8 out_tc_valid : 1, out_tc_occ_valid : 1, latency_valid : 1, rate_as_probability : 1, + unused : 4; const u8 *user_cookie; u32 user_cookie_len; }; -static inline int trace_ovs_dp(struct sk_buff *skb, struct psample_metadata *md) { +static inline int trace_ovs_dp(struct sk_buff *skb, struct rh_psample_metadata *md) { u8 dscp = 0, protocol = 0, md_len = 0; u16 family = 0, flags = 0; u8 *user_cookie = NULL; @@ -109,10 +110,10 @@ static inline int trace_ovs_dp(struct sk_buff *skb, struct psample_metadata *md) return ret; } -SEC("kprobe/psample_sample_packet") +SEC("kprobe/rh_psample_sample_packet") int BPF_KPROBE(ovs_dp_monitor, void *group, struct sk_buff *skb, u32 sample_rate, - struct psample_metadata *md) { - if (enable_ovs_monitoring == 0) { + struct rh_psample_metadata *md) { + if (enable_ovs_monitoring == 0 || do_sampling == 0) { return 0; } if (skb == NULL || md == NULL) { diff --git a/pkg/ebpf/bpf_arm64_bpfel.o b/pkg/ebpf/bpf_arm64_bpfel.o index 8dfefe2123264543ee611d6779932d3640fde898..74d866e1fcced18b8c6fdf4a2a85e0c7504a19fd 100644 GIT binary patch delta 21931 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 k6_lan1f^y4BtOB}i#ir{XOsd zp6kqzM>>q*gT`KD`ZIL@~6Z1=+MK*HIFOFi>)+9 zK5HI6KXLQ?<3Fr1rofm@e3|e)*VttXu@phn z;+(A7L7%HSguY017W!J%*^bFhplfMel+Ufnt9C7LUQ0f(t0HgiVkyw%FHJT*IyP_e znO+z2Px0ttrDa0S&y(|ampShy&)z+|sCBh5XHe2veCqjpGkNFkiuiMlepzQ?$!jv^ z7J8e?HKrJS4mL>>(3kR^INF$%bA8>8KH85rDfF@E3yDdim!j86#+k;PraFRNr8VH8vV5DKJLzMQFPV?eoPFVk8Yse1bVb;GuxO-jY*)ZRHx82s?+Gjs{7EVsW$N{ zhD9NQz8L)|6-3cjq2msfp|3+BPr*r)h4_HyBv-f z@sFVsQYQK-bXbk+UUCc9eod&C^4 z`hE1ts{aptn(7a#>EB9)0b10kdXPe!Rewx|b*lf3zCraT=-X9)ioRR*XXpo2e~x|v zExk8$jCo#l1l^0i&~W^tz}p@$Ea-ozPNSVQnwhgcPjv)cq&kY8s5*wOP@O=}MsH-O zQ|JXj%skG6AO?L#TpouML&ez zL?dG8T|vyT#yqJy9tHL*#L%y)PN4f$r_ldUokoW*@<*i)U8veDFlLhK2zr|8D7s2@ z41K)n1p1_l7=Jl7Dd2P*jJ!#sSF1M6yH{w2DEbD~G4$=K6KGd;3cX!*8vT&!KJ??N z4U_7Vsv`?I{x1TX8KNkT*8}|}h8w+-21SoI<}=j^bn(|XU!_+tM=i=oG>Za&F4)o3{xTd+sb($EBY zx#|?U5q-NuXV90R+tJa*#$1iwB6f5_mK!sOUWZPgbDNDho7gmZH2OKoIGGz*GvhB1 zox+)kV=Ovxlrbl(PNC0Kokm}%x(~e`eI*r`spLVgM@P}OqOV3L(BDHZBP5Of8M;;C zr_mYobrK&3o(77g;%O%Qit5eNjMK0BCiK5m-;5r<){k!^Z<*?L^i0(q=!L3N=u=g9 zqF13uP*)fF5_Eh6tw;mwf$OE!6C0{vI?x3H(tKj!er z2=$>q#xA-a9s0Vj2he${2hqiCROg~A&>`|h&{dv3gBAe`0cl+fU5h?X8i8Jk zK3{r+UWHzbHskpCDfBP65j!b&75bv&ztR;2mtc`WmUMY?*50x4by%o4y8}xC-6-Xd zHlv%+X+CY}0%B^g%NmV-cdLQ+z9SIWm&Asg_avvFbwf{i@~U+liKL zMEIP;3@n#>l+UATPoSSb%jJ;bvtM-=T2h!9UCMj~J0mf}Gxqu575cwu?RVKfR5#M8 z&ywGLdP>vq%e;}>BuyEMzR=6hXrY7AnyNa6Z?nFE`X(KMQ_&m_N@N0?aHcUgBcgm{mb*p1 z`J79TRF+1cueuw(Ms*MRQq{fa^=KK_2ziz!U+Z2ldXsO-k*jelTGCIGQ=csxw@YK? zBz+1kqbzCaWy#ggo?IH72x59_+TnxnQu5c&jxBw~%5bFj{b$D({ND1un=E?nOH&_h zk#bC~OCz5^%ZOBA2+`VMp39hLlk1)v8-E4wGAwC6F`_vsyfJzm`*36-wm++mpx;AJ zz#c_Q%Hm!?p=J>KR%{>5@yq)JzEfiSe&%;*JOfi8`M!LW7ndCJd{JHy+mI}OUas$@ z&sVJ2+A2|I_}%1_toLN_gBko-2EUNOZzg~Jd`0QUYWRjvBQk2}eZDg`=e}1Uo z+T^7D(?VmeO`goxq-&Fx^EK_-O47^8rk8GaUQK@Z(wWX5l1qD@ciu`C9T@AppPYVR%J4xydWb}R zdR_9t17ngc2TJ0TzbOXeng1qdfa+P6eV(OHu(T|XgZM97_6se2nWaluum$ng`SuxJ z#oxAqwpn_or5{T+y*#$5$FjU`>31#tk)^XY9IkS-r7JAG*wSY_eBa9jHCb0SH@drq zIuE&J+0F#_vSCiSXS!{evu@;-P3tdeZ2CrH%avDL&~(AtOV_Ty*8OalQ{l{Ur{z0y zva61(uHJoazVpke?orjw$lWvMIOz%Qd#5{ZR)27ke||`tmT=S-Fk$JzGj)g?EIt)Z z?{?~)#^Ldg$tMpprk8Vy6HEAOJb~x+ab8+H2JW?Z9NcH|9Jt?N@ef*D1J0@-M zD7Z(Nrg*70i-#m>zz7P=XX5J9fIlz-(@PxFulyi9b%J9CGYXJPPx7Be{=7=Zlw@#3 z`P=wQ7CEL;`SZoBMVJt);#NQr0rkp33mcTLn8^q%cTBVLb~vxzF|EoIm%ywS+cUTW zUWD%~KEvry%Hm=;o>qg`<57<3wgM^$=&^V%JYaDiJgEGmB@Fq!G@FS_DijXGh04#u z^L8)_%Gpa9fi8}JjT%nDFzQ#Fj24f88n?@dzE{MpU9e{ znH7yR;DKe-?-ihiAfW9~08iFb&~CBBcVxtOX87y#{R&2$%F}q8V;U@;0q3%!kp}d} zX;A?!DpbR%lA(inK=~H9EajLMi>JY@7K^__c{lM#-OF`u@g%rYxex!WPObvwxELxh zbgN<1mubKb&U%Yy!2QanOPKv*eAy@8!%id$el*gZje}Hq$ zV~+ocV)#2FpaHkT1*1Y{K=}Y%9toL2<-ft>D??0eeggx4u5$6|jOfgeDa`Okm6zZj zH!o!BgyZxuD4<>g)(}uy6EY1M1+*wj150RNBEz3nzLETs7lll>#U*fGM*acVyZ_%$ zhN)3{n3187rM(=2pn(zP-xFW4BxEWx{58tb0I9G))6e6#lozD>V!i(toWV&E3z=38 z@Xm=f^ibJ5<{Lt$BZE`QP2?|1&|~Fo@T6NqrpMw5aIf-j@JF_C2uE`KrA6cFDWD@{ za!2|+A0E9eWFi?{sr*&(r#M8)55ol}WSW)Vfyc3&YAEr`%UQum_(;gKMSMO6F4z+? zopCjM1w(mV$fRMJt2e=Um$FPN_qkiR1)hB5TwXHeNRBAyucQH+98;rQ4;L}<$lG8k ze;qviR__1xmZ1VegT<5KW{V|5i}H3Uu${|D`5-)D8#AS{Ig^u^iL4WTmrmuJWmvCe zn=a)ga9$!iZn`Z)B#~`;EuI1oSWE_{H^0F36i{$$wkfoD99#n5h3_Fg;pQw;qujvA z6|h2WusE+j9x^RzcwGt{dlJnbCb9Q7F!RgS_% zZ*mlrzYfRCSVnhPhH5ya9JILG@*jtP(Be|qRQe6xMS&APp~1?7aM_zo)fSh+mC6<8 za{bTkXBm9hU?##f%3nLzm?_NFb;`F2XNOF^#S`HM<=^06kQ*{Fi_76=)VmNT&_zv3~!=J^~qVhD4O?$Llj zxPa-iKZ6I9i@(a$dlok@Xu}tnG%bSg)5c42CU~Q@tEW9H2_1625hE) zf>u_s7LSEv7K^_*gIkqnW&@+bOxv%l9gdqp zH3U;_NwwcXVVPpWEJ!T^Drdo@=sa83d>8dQ2 ziLOSOi7oC=wTBJfOegz|WQc;9usMTUm46})kg3*UZ>m)e8qjI6H`6L_{wl{`rqc8w zgHE*;dsA%&55Vt6*u}w2R+Jw$x$}H}1&;8_E211ZAOEPZsZ#cyHA}*#Re5P#0wQ6P zP(uPPnHe_i7Egw|U>T7h?NJWq_QLtTKbYG~l!K`~VzEr^m9TW6b{`cU&09m+MI{E| zD!4;=%xXrclXbiDJa}|hw&_+r$GvL3Q&#PDyf51fs@d!Ko7pD!Sie}W+@^e@#J6zk zv$zoM$ly-p^CiBOLt=3uya$fUkV=3Ux;5Y$$&lcXSX>DAW^ljq7Kv};5LjFY4`y&~ zjeiKbB)*;Nw8rFk$F$46=o)8s^&8mDde(Wwyo7--y&=nOO9N=rSxyP^D)OC2S@P=I~JHVteI~aoWS3n z!KsY+PWAtV?{Sxg&7KTSD@VS>KDqT_(*x6tktS$Y@1X$q?N;aX6@k5Kk>8N3$T+Dp zZ0a(&0rvVse(7IK{a(X&Fw+I>Zobwjb9T8uk+1#kQ`b6;MQa$+;`Q9KPw)%5)17~v zQx=-G$UWye=Y;Y-xQB0I2~g{|K{y|-fu+tn-A4&8x{)d(yd-beup8aC#O$?TW{%mT z=EvR9-=yki-1+|3+23>?3Qa!V&Dr2gD*E(t`I(#L2`_`B=uh4G8=S^a!Sa-$o*-YKgM!a8wDDM47_(!*SUFQWV?#Z0SXI#Yhbz36&p zwzJT^^LnSzx!U~*is!F0yi(=8#3}wLG{U2+cmT3E4=$k~Ic3`M%iFhz^8Ii)%F8q5 zw}h9FU%C8B;_G-{xy;WmJO(cDd87#fDh~y?yKZnM#a9q0@1E<`egm9$FY6g)uOVH$ zLQ>w2Kg^?ItMco@zv5Xo!{3+TuR7Il*ywK%pLR^b=eW684EuN**MQ)3l6TrN5|7~@ z(ak|sJ_yh1;bB%f4+)&f7?>%iYR-;_(34Z^HxE0w(t8Ge@Z_)LaP1ENgW?^0n* zI6q{fyrC5iPT&TM_Yuv?&%09-oc}pjxhE%_Nlv?aQGyd-%~dQc(}pe8 zeyPF*aIW(A;R*XVt1KP|S6VFoDvQM*RenM8cXNxdcpMz_d5#GJnll1gl|Q3^$@{rF z0(O^fWNxdtnp;~o!>?xH0(d~V37(M40=nMsm+&~a&|>kISSraT&m}`YGrGm&;1-L;-)gb=+mz?H^KYbI7hXd#OZXvB&B6t6pYq-C z)H?cY@pyPZ`6cl$=d@el_xp2r{89AV;sUrtd0{IrJu5jaeJ(a)7>}V+11@miy3x5m zKAs!Xv3yK7v3vy_hO3nCz@Nt@P-pQ`a7=kW{?P}yMwNdMf!A=;Q(gy$aVBWKlpmxv z9wj})c5Zva6RgNIAYiWhBQkIud;BW#rJK0BXTO$? zBJcj&!P%_=0W+f=@)zN6R(?FfS(oDERrYRtJN(TMQeMDm_5YLx<#o|uSg!F4${CRu zOa6G4Z!nrO9MW7WMD?5^Z^e=O5+$@ZxL-iRP%ZP7Q4%SJD3~q;4%Mg`Gg^O}brv^Mj4^LXc!b&-4K-%($ z@yoC7l7ChO^W*XyGobu+xcICbGdR?}t&Md=$*?2iBFaHrmGV$2hvQbGyh+Nb&oTAN zK|30hPsbl_$T2O-laFWKJ}<|}kNeg@@)J}>0X@pzNbaEF87v$4-lbzf%2oD8vMa|# zGPp|lDQQqT$3&Hv)1al@aeAPJpg`F!AQebJxI4$RD*s%1a4^Rtlv^qpk)9mWq3n%V zZ;nYR-y#0}Ii^QBD8E

tOs+4ux%iWq*R*!$M`Rhb=j#GJ|WBcTr(DK@XLGOM_2p zql3yp0~#!UJWPP>XOIf3coLYfjUFnWJe?l2(?eyihg_>E<%`9CE9WLG$23SK!;kDh zMA_@{gdrw+nE87;80s@JG$?yLjtns^8JtkQ{AhYyImEOnuc8BWRYOdNa?qfZ4nvPltH>A&xjiBm5qFJ$x_6RAq2fIcQLw z^5b!CXrl&lOe`=cw2nlyv}2z4CjMKa4eM%V=G< zE;xqU?hYPCH9)uoPAMlTFt3XtR+fdfEUabUZAeT17@fbE4{JkC6>n#Wa2S^TxOQAE zod2H0Ata+1!Wd+ut{wOtv74+z1wOn0&doCEjJW3|j_nFw#k+Uj?tGBtEOxgiox7d) z-P*0riM8*q_S-3M=7u@^J+(%k<;9!u%Phqu$%{4NZOZcEO!)rYd$&4q#~IvRdzW*& z6ORyEhP@5HB<6mP<@XCoF?^hqhsx{5P`W8sVpS&t^BfZ5DxNp!FK+BWyvq~d-v(#b^#2v za8SS?Y!^_)T}(J=fZX*)Sn+a~6An5g+XU_Wkr9XTkCFPlyUJLrfNrd#o zGtmo?KZx+sJMMw+J7Y^LI8gHUCb*!FNDE!(2e^O1aq#|Hh4+0pqSCDv_igHyWtW{+ zx=rHVPoW|HYdzL?_Gl&lcDIOoTUgB5MwYpDDs%UW`+817akp|P?NsW1DDJyBg}mH) zP6r_?-12SC*m3{R+;Z!&Q%;_{a+`CEv)SFa%{ir%1q~_3`v)KFumbmuZM=Xib&Gz; z*MGUSKcvbty()Q2Wk;fSy6eR4Fx1lB-cx+PTqTl<-R-!Yx$a{>bgqfNO@63-#*Lqy+ZGN^L^59B2aqscTb`19pVzEhN z9EP{N5iIsLsM_)8X~l9)+UYZGXfJ1`oqp>LL$Q%dNG}%Oy-F*POT$j-1mB&VM|HI6;$PJ7xy2u@XpBLoT4h+1L9uejWw^V zb>aF4`@4D67Ic=A@O%kTG=;9gd({ge%Xb{ZOt-VEEyjaY{*mJvV3t-XiZl3JVW|FhEt?mBTV&{7kXwv!(& z-0k9?pl;cjW~V;)fViJjw`^py(?_mzFYfET^MF_98BM;=trqvI+H%=tW~Z0kCUKvw zEtgGXc3SRk5%<%YTXtaC=@NG@?q%=kF_Il%c5<}IvTw>xDYeUfEIUQr@}E%KdhJT{ zOxwvnq~Wd*_X2GUo12bEuDem(&+0L4n0>!bpxfLx#C?HwMYjFe zDeV^hRNUG$*;8Yu#cr**qguD@!LieE?mBTFqb*NV+fJTN-0k9iTcii16?xC7n_7m8t-+e>eA85;?y2K7bzT+0%hx-O~%fH29r#`n<++|vK$;q~p ze;&YHcb_*;ZkMm=?g0sw7pO8w^5dAD?sJ`=a2dyLy8 zZeFO8_&XJ+AL(B2ZV`8(x@%S(>E7<{75Cd(cX$1f?ke{~ai{e7wP(0Dy5;w?*7;v< zV8tw`f>fz1jS_d`{j5)Z=YH>gXLjkuUX(XrUSLeaBkmhSmEO!vvdH^u%)UJ+?rOJa z2kuk7+=rKg5zRf+t;M};zUMAfqyMBN@K{=fQ{smAvkjKZtuV zEbfTr58MyBE5se5-{P*ya9{3j6gMybJ$E$2eYCq1w^P3R*$187S#I^Q@$Y1ny45ngNg`Fq>D z?{Y#-Sy?rWbKSpYhi-Sj9S+Tcs(0@UhfZ+Zf98a)^qgykgl=*FIV5z9INeBY=xoG1 zwINy9?ZoP+M#VWAUC<>x?|P@)oIr7m~x zuuz55=DtHzXj7IuV|ZwiTbCb-I6rgO=3~1D+X!skVvD)&U@JY3Q~N)amU3$gDD571 zZ2?hte?b&=O4M@q9f{)A>whdO?bZ$_s@+{XoTyvBAgagRJ3MrX)9dDq2rbC#`vqa7 zl)G$1sI2sONDST`#B=z6^tl^HgepoGenFWDcQ5YAH-15GbAw+>#JEF;g(j8CzZ~_S z2BY1rEu;gp+;C2yU!L zrWSXjxOd`{xl^tkJ5iyy8?j67|KIHt<9-_7e{y%awYb9*q;5IwhPEX9!VkXaey51h zD8cieMkDR+E#_=meuf(w$;H7UWhB+yOXIVae|`mJXgPjq93kAHPqWQUcf~`LW>g6mUw0H8m*l^PW_sBL4lZM0ZZ|N0qPzc#kEe$PAe4jlHcr%vYgocBG~ zIdkUB?4i9KdHp}iYpeE}wjTcOMd|9MBetE}G_EZFwB^RgF?-vMshejde_v-zfiW96 zng7S1v79CR10CTUF=mF&aIdbBZI1v*<343gU}78_#%CReR{Usw3zx z1-irx@l13%FyAvK&T&rqfhXp8_ov@_qAK5{mt#uiWi<^%u*ar<7nWhPd~T4D!F-Okk_fiypb^GRvMkjGiERPE5u3o zpM)`&a!!50nB_A9-G=@T@%WnzI&YOR=b^jMrRX(iGnGcGj-jWjj-zJ=I%yKX@oGq+ z7pcymm#XeUH>&PKUx=2%%#jqNI*z_heNyOF)fse~>MnG<>OS-jRwcEjM;Y^w8e-^Q zsE(t5qdI~9Bf61tQ|Nb9n`y@UOMO!4$hkqD8T2sKUFb2Y`_L7tO|ph=QHY_BMn6sg zar7c|(xWi+67;1KUu(>%>eGNeS9N2piCm`ojM`uvNj_)Rn&>x(m&=jB|5kKL@*G2MtAD;r%AE3)r{|~xC z^@p{z?=Xb{YE-LwkW7zJ{Vx)nsQTaN2GyUSSE>FFdX4J;qEo6rMYo})^=7&;cdL$} ze~doQaQ)-J4j9YgIC{@)hV=hzA@|R>I^y`EtN>j zWE`kYp(~RL8K72m7dnoX>)nT5jFv7PK%c655PiP-n_0$uU3Cn-R&^Y`9=(A|B+#v) z&un8hsZPd$dlVAr2UVxgPpZzKyH$6gf2X<+{kCc|hYG5Wp$ApR(UA+Z_2`kRQ|Qqb z(Erjc86bv%-ZNe38r6o`cD^QvqZ?Ew(5qCZ&=;%Dpf6Y5gmE(E?U3DB3LzlKhsQ|PoLM&E*tF_@d9 z#(W>Wf_MoJpf44liN^d4-HeV`8uL7Q4LXJXJ^IV|cA?)zKQ9Rn&o z$%RfGMpvoMpeL*DLeEm&hdv2?83mZhvKmsR?@84+p)kr)cjX(whmdZpw;Sb<)J z?&3HjefQ4Nx#trjHHmRtj80&QqrZlxWhTXO6(l#o9_!tbKJr(S z3fqY%X-1?BwK_;y4z4zEp_gi|P|cC(xX7 z@-Tf3eS!E8u0Rv=Ch+H4bPoT;(QbpcjZa_p^w{~=W4?%FT^u(Bu2I}g8@fre`wseI z)tk|`VwZ3q`jYfpkB&;e`SfXp9Z)U>C9q`DbDx=%d{li?bXr(W2K`gwrI}smooK3` z(*VDQewed_KcZ#kjd2X1rcrGiI)o~VYO=M>nl_jp|4XdL-7W*G%UvP z6=q+#)#DsDYkUgbhL&3)!*P%5PPBw5v$^DXKk@X<5q{)P0`N2aIa+(7qFeP!n%R@y z`Rhrm`iP-=8>A|KMW5%Vr~eM5GXGSa!1k%?6nezhg8t5+$E)t3MpIRDUA#Hzh0ji! z94ChU%aKwRp>F^rEJjmle=x2{-~Q~hCqTzO4EhU%^CBRASPGt&|A5ylcPk59Sw6Vr2Ftn#L$FL<$P)=|VW9r#yz0b0U2oTVwv zoXNsm&v^*vO`K&!Jeb}|`fcgI^7m)y;+Lwtr_)EjG{bu#{k4~>B5z-l{?1ENykY5| zV>mqh4u6-V3tz7CR;6e0_p0>SFIN@czLtFGwKt?3!hPvYFW=!kke=Lgs`qI6nw}TR zx8s4)f0{q2UQ+lk(`WCQH17Ez{ZL8!vZLQ#oBr;eLn9xpP5)xg*b$#PmfUO8-`X>F zvMg)~e!>aY9?-KKeSCVtE2YULPRyB(UhU``9DS>!?{f6Lj(*tDPdWNoNB=g^qx>qq z>li-1HvPyeW4+34e|V*^&VDe=d(?Ig_YSvj4)@mBRR!J@uhzB}c+A@;w{Kt7;H?~ye3o>DCz7a_ z%3I+42G6u8zek4oEbrQ~xE;=4z$X!o5i}^{a0#63 z(g?rBqdn8@I8@=#({0l)nSde2899-UF9(a{cQx zV)Q~@eV$^AA*fJ=HPQ28!+nh z#WStSX}A|kAU+E1N#q?I22N&B8@2hA_>}= z2b3G(ii~HP9i9TWI4t&d9R0` z26d>#p}a0)8nZHJR+b8uQNdJ}y-Rs1=?^_FV!9nJgZr}555WHOzl8*o zxddSaW6D3mziL6mRA<@il%)bvV1Krq_h7y6{hPm`M4$h^C&B1M#I&e`KPJwnh06Xl zUl%d$S)5TmYAKg6MT?a$h9}+@F+C2ChkKQ8!ydbnOE`+_FEx5sGH8#Oyioy18kqYx zM@%e>tCg$8p5YQHr{F>pF-^)(z~fj>HI@bWy$V-67BQ`{fd4K2J0hkdsS#6_G05s8 zrVEz2c^RC4DX)2z0dEp+h7S$c??3*OO*)uk%CF-;Zi8p)lqW2wflNH|NmlZo2OoYL z&;JG|qKb${hYy9D9F_#l%Bv;AHf|&32jKCWnJJZDgv*)8I^g$c)T^gbTUINb%EhNq zkyK97bUP8TRF3I&coIC|FbSC6f(+-ALE&vVrpV!Oa2b3awsjoQrXi+IxsjeLWQE%3 zaDIO>VwyFgLo#H^+VArCA*OLkkYU*6OX&i5ruGGRZ!ra;_w>R*x^Drro0_{70dQ&hl}AF<-cPu?K38>T=*3(* z!7{qtiKvA$%3+JU9s4oZ2OTbl{V&?I{suCf@Cg;J4jQlvuGq^|?Ql6~cmmw0d>i&Tc@dLvxDswsei?gJ5x1f8$1Ax1 z)=yg~s(3iyn z%Hbs#RQ@Ry7?okcF*T@=a3S0PC#8meC8GL1ZXP8z;e4iE*>ED|%^-at9|P)+P8_VVP>%l*6f3cBhDcIMwzl z%Ty~ft*Hs@!ZOq5$xanX5Qb{UL8jVzhh?g5R1T-wCgpIdZFX3u+7@M|T7RaMT`y9e zu*|f{R*eX!+IHn|s?9hoQ*DQGIMsGKEK}_c<#4L)RsNW%S7zFNWo>ZM3~EF;)t1!; zH58VqHl`f*P~5T0RGV;ErrKuZaH?%pevbTPrfpXa^5gnvG$Nd8yBwCOw)>z2OiYel zrrNyeL4_r~Otodo;Z!TzVx-H%nO1hjgghb1RNJT#;Z)nC98R@u4*OHBa@ZrC%KN8U zWq+bs!c^<9KhrA9Oq=wlS|>tyKzaXE>##r7&d?S!Pxw=N3djqdmZ+t+AJP` z-;43XC^K1cLDb~U40sD11oD7#ujhZ%x z4~08n88l(op&ZWbMY95XIJcK6hf}-kV3PFV)Lsos1Lkj}z%TICP_{Bjgm4YquKZ`X zu!D8GvUd)T-_9J;9iFh zf%_bm4EmKfNdeqr0}dC#gASL$d2@n(5dR9e$Y(~ML>xjynd2ZCR4e~N3TWh-I9vqR zWpTZ7ulOhU=H_q_+?d5p!pWF1f0G1F{2-(b!bNaP7Pl%Fti->WN1ww*aC;VaC?6sI zEnE_Zi{Kq_QbwFONJO_fERX~#E{VfMaBmj(E1xI+ty}_!i{Qa5&Z`S9!S&+b#(i36 za{VEHz1?-SH?4LX@#YHFdH8)$!!IZaZcWN|FVRh9(e;geo z3%NaHdjW364Y&<|ih;mca&NGkh)&)Nj^-0~B8*nICeG41p}j4OGgKE25@{Gu0Sn!g}@Ycd#d2fk|=+-HH|-;6iLM<(tW7Nt741t z!@^JTE}LcV%d*#eF{s$P;@{<&RKQ7d^yNf6!`rwzgu|&%`Bv;BySb>!kHAOv@G`9I zH(N;e08S{c#eXEOnB@4?g!?vOzSK&f9Px(@K z{4sT1)M(*CxKDWvJh`5BJA4Q{ zpu9!wOBi;`f_ChI4>^o>J6s5tDGzVqqh~e4GT;&;5r+^_tqwEo!W+B?ld>?H!C{`E zPdSAww@8`t9oX}C^Fb<$C7Jj?&M~H!ds_K>F*w24P+kMe3c8W%i+>mryh{2Jm-E;g zv5u#tI)u!N(Lo8?mG8s9JjL=L%b$6|_kR=nm<_BBveHw>gY5pMZ>f?0{N*uS#wQ_{ zV-6Q%k1IbJW7KVC5GeZ(z78&W7Pl*3&Vw%hAu0^ZC_J~49!W&aAfJ-`h_Fk{kbuKS zxNK&S1R=+jL;rf^@DVPX9mGH6gmU-@Z_Y}el-&@LKpdhx<2#kNN)210{^kR*zbCvd zYFcvw|HBWZr&3XWZ-Cf^$HKA|KsXFN%HdLg<-TuMw#VM&l?MwNp8LGy_(u5_l)oYB z|Ew>Wh3kTPwco(HBKla=|CwLxcflt<6ZL=A7ygT+@1nBmA6BMKS^V?y?+iF;Mo%K5 zJL>~?J?E4}=@|6bU$57Ce;?mgH)Y5Fw6 z@7m5>GnmDB1wn?pq(Y3eGUf8QjGgXWQ?0ze0ggS2UG^8eM}@A&fBc)d{{8~t=4yJf zCz)%S)xq!T-dxk7{B3dAoohOj!vZ>${jqW>mnMt*vi$p%{RYadQy5gp=OhtD8u0`L zMpLv<`Ce*#LMts)4l7XO*rV7Rl>Z|w+)N9VPdc2k+GwD%-@tYnsC*IjWZ`X$RwCq@ zhG9S*LLOB1TReWKDI4KjW4Ky5^siC&TNoQ^>a(~}dG!}~5=NOF5*ks(%T0aFP}8g& zX4vA`quAS(Tk#)%+)$HIejGkz=1|k&@F-YzSjaVhL+o`!O`kID4~md27UJNy@cmqW z2ZhUJBLjO_A=yzOcE5!Kxu!0Q>y>Gti4Jm!l)dBG#BFG>a#+4;avY*K$d(H!U=<0* z7YsFR%G0LOf*g9l;Zbl#d8yd*=mFThq&t+iVjnv**uf!oZ9kt7)ZsP?tgd54rrZY? z9>!y}Q_4m|t8&=DjL)<`Y+;8wge~k;4qMo* z99F2uVQHc4$dCp|gQSJB<052fpzOGC8z?(0%911qGwfG~u!Uu#f&^g;Wru}iFz-mt zdI*;DYxL_z6d0*}3cbt&n&YmtlU}=D>MF%fat!}u-m|q#Ne2NoZ&Ei{vd}SML(<#eOX+T6WDhZ`Uy;97R!=Y(oa4#uy?>x zKuTGjbRLy_nMI-mStJU7;V_{jEgl*~-0Vk?5YENnXclo2^5`O$+m+kYE?X(Z9w(>R=J71rUr(wj54Vv{w(>9&4y)az{$V=@4^Cg=KRZgD z3^I1-cfA$m>lq=QnGkdifAR3cZ*A@OywY->>jZwy2;&2*nQd2z`B8dT%*H>fjnibi zQOvihxt%_7!&19b%+HZ&g#We74valo$bj7^=8aK_&M`51+zkb`ax>=3C|1lZTrf9` zu*<}pmU~N5>&OjVPOU#t0aj&x)B=Bxg#{vcsW2*ca{B`WcE)`oF%K1^F6 zccvSj59710_)^VBRzq%>rv*2;LqIAa@9jJ+P0W^OyyMH?*6WtxR*{fb8JxG-H5o2z zo?k2nLiHrWS&*!`|UpRR${*5=Z|OCXonLPFhvq8#rQC40HbwSfxnY)F zPj=-OYg3x0x<+IEZMTYfs#b<=$ z8?vf)l&ux>D($sQmiaEbO3WLy?4B(1Si4comuT6tpTP}x*qvgYt!2xO5jXtM?h~`8 zX4xI#h84E51M>%A)v{8rwadhu)?Smn7jF2TT`%Ud^pZ5`<2-cvqunazrCReIUAuEdNI+ZupJe zBIfa0cG*d;k$*jF_dMXwlirUxO|i8<#`#5Uru-=8hI{NPF<-7lHJ|Jn`9acd6!U}O z^^?V&6GqvcV%`f#qOKQxCOUFfX3&n~OA(ZxE_J`_>_*AtQ8Fpg!aBWacZ&HE zEhFraunNQMJ~3DN<_eS1?8DSg*vdyRpGkv@%|tc&OKD$!%Ptf1QW{pw>O8DcSV)gu zFXlKb=9s1r%|EbP#r#i(gP3cw%wM%{iTURYCName%rRU1D7`ar`{9pz+lM5})GQ6# z$x$~vh#1C6;^do=1kq1$$Ukb45OQl459nnK?cp#Bxn8fW@OJ+(Y}ah_mL}!bSqUT&of_)UkOf#qjl2~y!*@~-@m6Y(OE1r1^j{yF;3ILq(85*Sm`bLKFI ze+}0-yc<5w;iutxhhKnCb9iTrh=ddI5`3w{+w94YdzX8?+xI-~&04ZOKN49r#9kJS z+%lwYZY-l373eB%Xqkr_6V7iqAAd6C12nr=(;BQf7| zdVa*(J^7J^v+GvQtTjtcIH7i?ikg)(!iedEY2KgJ^ zGbFv{8>8|c;c+8jyFGe%5*TpOIIbJbaTZq@$_Vhx$TrjuZtI-=swendX2zq zu|0i67 z%8wxh{~7TWPcDzUzKW&m4=3e&2JFe`VfDT@x!jGzB3|tl;{@x z9eMkQ$=l{$l=%HVq5^1Zh*rOc<8U?w{sbQ;{=!6cUcpgd_Em_#IPeG@N8v9CQ=i}r z?!Nf}j2CCZ(XSIkH#&tKQR&~z~K9dg$>55e7 z)!~EaLN+G4XjJN0_nGGAywvmEV~ka)Q}{fX%71N)@j`0qYZb*`Mh}=8>u_98)D%x` zeQjdmzu^nbyqM^w_mKKQqCgk$$B>~1x0^Zctwd9CSbnx(qz*_{zfp-97uxUwP#BAdX za4RtEr{i$**9C`x9}*k|{+{4C@MDxv9g-kVi6RaBqTmd0kKiou2f+12Jcl>`Q*e@~ znHLNOj^NNdOmG-@wBRUkx!^dkR3(zc_{~z5NE&z*%8ra88Q?YOfU;L6fiWn(0E`Tq zuV!pgWgGC#j18*%nkv1kVG$O7MK(n*=WaMuv7@_}Fm-7}-}vfxjs@ z4*cK1ST|Kk;3sXIpsEbWua%-2haKJcKf6yb z3tXt=Gt$6c5}W}>_1OQ6EbuJMKa-g_+;R>+FyAx7z^j2#qM0bsEi(5rQK4I~8QAtw z;3mOwV8>4q7y+1HLEkj+-O6Sb+hC1w-&sjuIU{Bz(jXn8$N)bjI19{GL5JBm+;UQI z82D|$QQ(gR$ASMXI7xJCp5Qd_P{A4Ck%F_pSW^j}45k=-Eq4)(lU^AM} z_;-Rc!0!NOiLlP-)=%*Pn*~v#ok8?H1e^pe1x^8HfF~-vkTI7J_EE-5flZ=CIP8Rs zuE)GB3WHqE1UL$Ojo>)2WVR>?jD5lGoCfC1P_0E7;0J-xcQFn-zb`lp{3BolwKxj= ztl&8C%fJX?aS}Me^NNMGI1Tb4V}lmA6Yb)28jEo;*2b<8z&t<(xJ+;s7^kjzm}m(^ zyD++W1ULzN9`Jocob0ak_(0#KQQ#{C$ANh}e-ZP)Gzo&0Y+5kN0Pk0db8y&&)oWrm zJ0}YKRp1AJlfXQG{{@@@egt?s(Yb7o#cQG(=d%5C`|NAAkL~{e`DHLb+lABEL_lMr z!2iVjn>P}T%@EzjbBPUQ9E@%oiH{3_qrek@e+HZco~LkG2AEG#ROT!kZsRN&hk-W< zjshbwTOJ4A5C1pACJB5m@DAV%=KnTiW!_4}RckFw?q&I2C9m}nxVG=crZ#v$POzzJ4hkt9}#A`E4OpmAke4926F3R{25wcB0jGiAgdCkpu^1EY!#)n20q%nw1MqAm@kciRhjCtC z4vfS`BIx8`!8O1`1V@3tWa9*ltOY4!V$jGK@D#yofU5G3SI}iN-)+- zvR?3oz(~rr$J$6X2!=k1DYfMn0pA@Laxn;2x*auS$%h1^V-i{O`8qNQ{J7vW@H4=u z*2oO-FJXeLIjJP7XkGyv1%5RZ|8vDzJzm=bwL$VR;6|9CB|ine5_Qf1f0lam&*Q3g z^I5P7x+u}^0vt>6mjoV;BZ8nb@Ms))p=N-`rUGxyF?UZ+Eq${rQG;;|DB@5ofc;g# zcJpE80pgHHA-~!d(r%Q_yhboeZ*CL34t{tAWBzvYT=KwZySL(laTpk*0=?G#=&-rD)ycUCf~En3Tk2Q2aO}5XlmVG%0||K!NyF&M*N#;;EPhNe;JYB(&4n> zwr3MQ7>9tbh95*vG2mNp{67BB_UyyQ3-}8I--jd4X-?pbdK~xSFAn*)1t)=zVdU-L z8Q>=s=4$Qv4KPl{)P%Q-M|Mlh<&dMYwmsW?l#0DQ&fM!sHNE|Z#9p3ko-?$)L-D~F z5$;tdsU7v+GLd6N?wth8)eaM#S%V|aJ&ttmG#pu;1V%0GjMKnN1$W>`NE7AfO6*;Q zqe)X(N_#m?6MtdgjW}M9{VEE49b+Vh6MFAWsZV>#F25ZvxPTnWK^)l{ZLe0ey$?XZ z1&l-fEx}1(Y>IY~)4}HHo%I*5T75jq-w;|0EYSA84>`xl z1^RdD#5)y<&k#>BB(U7aE+N#OGY?*?8kcn|QG z1@8ssb9bu;0RL@M@&p|KxrvFF2x0Dn0~_B3j6XZER_75VkLX^=+gOf29QS>b?eUie z{+?jW)xICWAJU{KFt0EYTuoG-al|^u>^|!fZX<%;)4f~itih`=?|2sn2c%o@n&;$sy4qR0&wF#GLA5^^4XIsP(`$8juHxgX$FQ3#9> z4~V@H2Ie~|_%Wh5@+%V$Va;Hm1K85dG*RtI$l>q+P9T2qa$tKtTatN{KhXj4ak~>U z%XW@Ezl-3(oql)zGIi>2WyZf#q4y@7f6$Lm&`e$?n3{vba(Fn0Ps!m6bNGd+miHzW zZx!he#p?~J%zG1!M5+g$EveA^6OGnX4L;jaaeSszE%THf3Oe9sFtP zWypV?`t<#YGk=3M#M=y#JoqM#Xb1m;55(MxN^+rE$Ki;{Z=H!F>{?f*>U$>|Yg0*l zUXp6Z=f+eQKDVU$@VO@y{$Qf<-Bc|;pG!63^Hi$sg9+xnMk>RH;i;YvCY0PeO;Y&_ zoTA;kG!_2vps_sF@!?vdF6I6EuZ;DnuD_QRY`}Ra?cU}?r$>z3tqJbb@V%+X>59ZR zG|6Kc{)L8r>*A5`y7=DztKm}`{+Ejn4bt#X7mxa#!U+!b(0EsIXqtxSYdEIi%UnF> zb{8Motl=A7T>VQIA3EUT>Syv&U;b#&@{}vu^^}Vbr8V5C;b&YtbgYXHy^!koXhh;Q zO_J5{`x^d_i&Ob7o~n6H4RhrwZIqN&pwv9gW|_ivMN=2JiV5RfoQi9>QNuemtSyq1 zwmhbOU$Z%;VQtx*^-3OZL#m}-(2TUTlKR+{A2u{xeCXrh=HW9_tsf6hP5*fL@&&GL z+(8!~K2O6Jx_H7*U3~a*4PTS${dmOuy_)164IkF9mhR#2YVs#jvAz)({N9zEwaUeZ zwR2*EHamy4Jdb!?`y<+UaAZ`fqi;lIwWigwKB8rMq+YYRI+aDQJ2c6+HT;N%wH0;b zr5}bq`QSXy_J$3XvCQ~^H@tIa*oym&QtQXdjIp--^<~EOL$+VubmfN2Z`jbdecKh6 zU$J@X=B6Fi%35QhQDxmwYgBn7b1Ey3AFVZhJ>L4{T4VU}yRJ3P9c#UOkMVXTuEFZc zik)yJ(Pq9NVQb`O)`4#XaQGVVZyi5%(DnT_Kq86fF zT);dr#a9N1`fx4qG%7wTf;aojJH-A0GV&3yr&Hs&kMl@E7}su|E#^3%plx=}#WXXyptt%8`*br1br~RCps9^MJi!#V_i?RUY@` z-g0aj9KcF8K!)C0#hn4XF~t{8B4ZWnki2#%8VJHXSsw@2eVV6X54L`P9_Z=c37CBA_0M~IHi z01pZO8&L-WNcbX3aLH7nCoo688ja&cgfFV`BJh~-dr(63@zrbmY;aVF1HOdyScJYt z#Yvj4S@bWFQ9Bg#?`zittI(lS-orwLAaYjx6{)q6m$!Nd;{u;%0X<3RnOOpd-w_>+_{4v)s2e0-q6V8_9er1TQN1|9%s z#o(44dnX{rK0Q#MkBserPm|FS!Mm84!xIopR$q|X2J8SODhMcpcm)}4=ujXI;@BtB z$grS6^voxKH)@>qt-|johnjWWVq2pf?DC|`F#O2>1qZ8+Sp*Xw(m#HUEfx=#8 za78H@&tlOPibItn)yM8+vpsHoBA_V*Px^-< z%o8~0Cy_Y=J5{JA#~`ZsrsZVTU?&XK=IG*8KQS6d$dWy`Y$f!6cqvG(u0g8D5_AeQih#qe2R#GF^ z|4ko~8OItZiK`A+1Lh`_yre<+g=Fr;=q1S<-lF)G=aQLZy<~jlZoI(28Yz*CZH^nF zl8o3N#rG^>@E*DTU-=oCZS0^|8C>-xGVjM;KSVO@=ONKY$xO38D!h$MegGd56aE`A zJ20iCj{aRTAH|{zH!A(rL&)reeYh3#&n3Eg0hzT}RN;2DHD0|L?{Bcvjdl3VZ|F}VxK{RW#z(g*4#A-Jb^jj4h<~8oR&p3jzv?3 zjQaK5pCZcy2vtDk#DflrVQ@N2gTF{SV4(tis|-#!oa%}T%J8r83O`2l@(_GIgpoLdEzF_kS5h{A0k`c?P7G-rQ!=qs@vVb#8$SZP zTsWrrP1eVS*Aeycmst}f!mTW*1eXXguH7bfXdUK2pVc_#cw&$6uM>TWt0~5_1Kj!s z8E?XWc|hZ^FPDI?#pONGgPY27iI@dF>>#Ww zrlh=9<2b9zW5VAiGlYtjH!6NzF|Plk(78OR1SGAzRSedWv6M6D&^Rho-kD>c)%2*) zq>#pu@gzy`x(9L7iGU|b0@wWs*Z+nn1QM|mz@(URu&oTI83LHpsPXCG&5HNir!_q) zFsWPP96(n1X53%Q2k#Z0V8ME#$rAB4=7?}ICXpA}wqN0Tz5qO`c;hr&u4jTvKsIN6 zi_$v*O>PtWgJiBk0+ZW?KTc%x4#g9VEWmj>xl;_@!1pLv<&(Q|xMb9b%jr67y^|#) zn`2c^?osyFmyuatLH2hLoPf<|flGosUK0YEQfk{L$QB@gDPeJd^Ok>qG$o>OoJLb> zHO~524v!1JgUn_QpjqP_fK;eIfL7Kgu&;AO96(!+Ln+zy91sVP$=WqzTLF3rz zrZy_>Y_(JE3}x$OeY@DNBoALLr-iZq^Bir5U_1oVr2>)wO_vV+yhAx~w%X|@grh>d z)lTnHyx(3bvc=wN@iViC*fYm?6*27p_EySUD@s%m7X#*OAQ^6XL2b1ajiP6c3RN^K z?rgOcEy881t;h(k!_JCDSJ9(!>?0Mun12qyX_1g-fQ=*~5!+kyNbsoWzpl30NKCkF zwGo*jd+TNUxYFA@D|Xt5B;@S0k%VOAY_*Z3bdaq!A{kxF9Q#6~RrIpeMr6vaWsa>j zk`}#ewULbC*lO*aHqxayNlQesVjx>Bs$y5g?N+N6L$8_DqH(Z1k}$l-pr8rU-U3} zTc4A^?uKX(V|&hJkkopL^e<#+b^-$(s#Bnw4HY^75_bOsNa< z_V$3!ii&=+6+^egb+|ad`7Fu4iFpvbQJLACyGbxMF9mPW^muNZ)v9ss?*w}nQIz#* z(K8PLw=14#VgWns)C{mbf1k}0)Wi-j z0QM18UgmHxo1JjEU&r$y2AIuG9M1Z14vz@`2=92Mn&b%QG7^hqWJmaL-_qZ zwk3YWP*W?sis(RYz=>z82Pmc!GEuL+W`X)*MjIsG$AZ>|Yi zjh#l_8i`|GK>A%qzIMD%;g>)h#~O#15A-uHqVyd1F~mKu*5Ov@abt|}pcUc6kF40^ z#)jhMc$-|Je)nrv_!cYkxN)X=evy@Z+*mmF0ldK|#Oc|ieB8u5U;Wfq%%eX>CAW~j zJPdJ6nVrAIYGm<4`Z^R_rG*-bMytHWtH}UGLv! zC4XXUFurDGe`3^)eGx(6oLz$CZ0#pROGkq@3xCmyJzAJ;vF&ut?d?W;uSDEk(v6+5IiFCAbm>zmGkgM7kqh0xagP1bMzg;50H_8{R$+` zK_|ZQ8eRdjAf^O2$;w$F4(^zOpC(}+ThXBOci@|uu4&-SinkzvUL>$0DI5u$Mgl9+ zVvpO10Q<*O*;PUn2??!G0j;Gw#9(DcI=nr0OK8yP31Ur0B0F>S23Hs^o4Ku*0+%9JR6; zY>mIe;{e-ri)S>>M?Z~!q} zVUA(TH4)eVE&<05swa9A0rM$2do20lsE8+`xD%j<-(RzVbE)(+t-?O+G z^GQW&zD2$a_m_;F0DYaBeGv1{UwCswHNPd_3GN^jIlGvA&oh^d9KF9***kiFoACR{ z$7hY->Hi`5UIypyv)TWg734cv3Lca35MXbD4VsnU{37z5J_o!-Ghn@BWb2t{lzy%k zv4ID=g0e-}#YtLW zhvGbir^3*8f5B+Vqh;XbiaY*_ zBATA)5_W>koe+{wHf3!211U)Z-bw7*X0BuY38| zTE#VrI~f+&Do)ahV~RT&7B>i&42v5TcM>da7A^@Uid#h>85Xx`91)j9g-eF~n+CgL zl3|JTcQPzVYyFX7Nr&Q2f+bnuD!~N*h{1NaxQ~qHQgrB3dD;0`(*D*oQ?oR062SPY(H~LqofiKe$E1{124?mVBFxc3eq@ z1!O?{2H{u`yjzmA>f*qDR#R=zFFAPn4ct_}O}~pB)js_@5n9yu=w`cBA9KI{6Zw zCBJ<9)0d0~4da^Q_rGi$Hxk>FUkbwvC*tZG6*ssWwi+jHqg}YfVPb;#iEx%**_$nj zFWIHIC#3jnY(LyQh|9K@{`g5Pz9_=Fn7!536W>6wpr6+&UcipgysbGrBld6FYVyJ% z4^XpEalTtL5!~7L2=5X8SH<~m5&8tpIadVj5MWu(=~Fxq$>ABr=VB0UK@Jf1{k&W8 zk|&gYPyk2R&Ko2=s<=}TzV|XiI4_(G`DTl!)~UeY=7A0dcMNopAA>#iKBqt5dN6nT z=O+jD&+i=ApD*-g0;j#>pnx5KI}Qrk20AF{8t8zpnBDQQkYCSR&kb_i>!_x4ulI1$hn00QohJ6i*=MyYgVzl^f4v7mXhq zr}^%8<%4?Fvx2P)j&T)(+Z}WG;Im8|4XSnJK0LcS^1&^xJaC^Y&(FAWbB!A){{o9! zNf&0s`wt))fUm7i3;M0+e~-71`>juZZ!8-bhFmrPs&{OVdVzK6>#!PW-GxKq8FvuJ z#%#mm)LJm95;Zs)49i=a$c?BgHx1X%GAvbY{u8JwE>8XSdNHb%+?sRJXiVh20LGSR zd?j&Opb5y4#~mr6Yj@?om@Ch_S(9sie0X!=_{r0w2-tFaP1#R~j;mmy+hMRafcGs| zZl6KYA@5RGZtpE35B$fK7d49z2mkL}d45ujZ)?4Hi{wOVpW?O@&)?U(a(nL)xxd1d z^Uc1~g15VJzF~BlpSO6aXmLcO*q6w=+*OqHST%nz<|f{9=akn3w{Rck^rrx_20Z1q z*#7Wid+L{mHF?yP2kTwAx6_sL8x*JI-K*qwS%N%8(tJk&WZOfSAn!@yC!BWWd7E5$S(4`VYy8i5Ho6LLrBbkD0(X|?=gYPXJh|18Vr90t@`>7f1W^>nzT7n@U&@tFjB9(l_X<~0 zt_|Ryt;ri)Pu{<2@}w*G^Xy2VlVYwsFRRHTjvV>>f2Jw43<4jy^2uSR1C}yhY@AAz zx^n-+n!Lr8=e?@QqpsZh5^%zC#3!aS-vt1Uyxoyv4X<+LQ?jl+@8_C4?#ct&sWK(3 z$xi``|HPD#tMFr~I*KXXnmnz^+gy2GRFi8N2l*Nz15DMXz{^{+$oYp8XlftM)8=?u z*jCsdehUZbz&~MnP3Tj@Om0C&jrfc#B#~K6lY4W5i5B%7b zSJk-kAm0Ou|Eh>nf5`mWM$EsIa$4R|Ag6;~iG!M4%gi@clWP^tyVjM@NCT^upuDdE z$pF=H5#tchBCQT<@(y6fKBUR>UHObQSMJw#SpET%)BJrv{QolIR;^|1xDG2VYnzrP`MOjGHeIdN#jEXyu_$X*=ezS>yeNE5{eY{9K@#|1UU7q;)48DfYdHCJ$@!v?gzN<-Xn4{qGpdD&H-^V6K?a zP?#C~Te~qL=NP$_L;i|2^sktYtI;i>r2U@_c&8DDoY$D%!U*^P+&TA5jt;|mZqkNv z(ucig1^n>YthX@agCNIKf;}JoI>hCf3564B}_0o+8e$3kRt}#7f7@FSkia^beFc2>yy@erv1oBc{ z2n>JbA0hwJ|3`kU7Fa;^h|61G%cW3$S7DCV0!oV<1NffS963{nDeznd`I%zp958j> zuR=ar1kS)X1~1m+{4&RGPy}Ar6i$XLU!uvwu6^GB(d6ZtoZsj;14mrB|2j?XtfiS4 zz;{AZMBNU)DVn_2m3zk?U-~!WDG&co;|Qg+TNIy9<4^ct9+E_<^gwWoD2Dy#^b=h(D+thE|fDsGw>4{-v|7x z##@2^r=R0@pZA0Ox?ey|Tn&D{_TUe#DT5C#oWq|7=G$Y3bFeIP_?y5#(|9lNuQdKC z@Y4>*wA_e4`i-^e@5ZhCl?VOM(Lt3wp8dP=(-j{1-&G7h{^$a8rN>jVq1yWABJ-ei z?_zTrSmp7@7n=(V>$4^1c3Zi1sd=aM*-~>lE3NW#%nJZ!Sk32{ldOl&G0(7`KgT>| z>n=LiTrsM0#)cV{v}*BUIJS=wIo52bvW}l?joR zCIF)ae{6LxGjBFJtyryDW}LK|YR!eCxiHRF7-h5mX7rX@U2NH6ora~c&ziB)EVI@x zH%A%Yv6_}c^pG`U6-2MHC~lpGX!ND%|2h6XD79iM;O`-;X$34F`~pji%$BRH(`?DB z>+^ipSTRIpv|3FoVR_dVSk_uyE6rs_qgA@foVDnKdYE!c$AF0ozZ)~z)9E&A)>-2d@ zaMBl8mRen~EVw}*&q}T~hg-u}nxjW=`+~0JR%|um@M&G;b^{W-?QFGL+2jXcPKo4X z5)0auvAWn~0|ZXh{$G<&9ZdMt{5+ErRtzS-QEY-0JbdwOyc>Xo9B*Z;T9UMFW~{y)2a=A7?a zYwfkyT6>>;&YT%Ze?Qd!y--`Z(fDtX9tP&D8C$>$ z1V@3-1;$|0W57ts!71R&fnk3(PPbk!I1GG?U<-J=;3#k_*{VYfWS=OKz>f+}0Y4)+ z4g5>sdZKciZhcj7445Yy14mf?p5QR>M}jTjzYC5MHA__@F^u0_D2gQTnJ7DEA(8?v zfqXMjMGP2|N3R370rM2RZc+snVe?AH2334p*2wFAs(1+U3n5296-i)J#k>nR1$+bB zn^YMFz8%;`=gPA{Fpuo05`#8BEEv<${8PabfuCoL&RCeuZ!q>zWf|}v#0FE>{3pSf z%Vy4=ePTYEdD$~A2mS|RqDqv@zKvHuJH_>L8&`sj<^rEC7_0rZNrLAC!_Kk6dbkZ& zfrA$UV@W%B5%AT($iC77ZW0^?-T{0C1@c{`n1R!6PvC&gGc4er3626k zBRB^9vfw0ekKhz=FG{@|ebd1BV?Q&Kz$XQ#fCmJpv5y2X|7d}=t%?EPBG^uXvY@BZYiQq8s(}FGFUkQ!^BVflq2K=_*B=8BrDd4{dP6L0A`RDmSVsu9~ z4va0}Vqgqh9RudMXPg9PL&hm!OK=)^mBM^s+=1-bW=@CKlfK8&sIBmn#MK@vo7l%Q33j8=Q{49yFJU%_dj?YMN!14K(9+CCEa0pJ+$IA9F8jOCMYK;LB+@Jzu`U|hcRJIw#G7|1#3 zkbqGNc)e0A$7%aU$R8qFZUJ8h{2kyJFwfs3z$xHez*~smg0}Ai{w^@vKLkaX$R7hn z66U2aK->NdFajE90l$j*H*qP9Pl51UZY4U4jd+z_2y6il0RIv=Ms#PM!X+u-Fz{$1 zY>ad#XUQ0{JF5g+z#J9JqrmIo|5o4_Fs9DD4LD_k+z4_9Q7LTi+=jzSU<(+F(%cTr z9Z&@mwxucH9}-cKpC;jS=V8VMP4WZ(MsNW59l_baA2TMJgz2&|?+z{i&Ii7R6<8$p z8KMXS^L?1*Wxxx7VK^xQyaqw+0JeZRn-(INkbM~rC}~*?xJhslcsFczLY@MS$HVWA zUWo}bH)2&1#lAh=a6H>VoaL-66~YEDd1m24sT;{vfqfu-W_Gz z{{@Ud$5cb~XTcWmNx?P1ykJqGF?GQI6ug!whKf1z^MQF<+2#V^QG(Y2pD7qiAvQ(u zMZgsfwrLEi5SuHCdf-~Y7Xu?t$LZIB`C)_ujRIr6Ik*8B7352CObi&caBvd%05JHN z6!60kqr#^{6hqC-%YiN6AI1;-seIxyKBpJ8L-GnBRu;F|Yrt2cswv>##rytrR%MJA z_$KHqi2fVrV*JJMUmwm0f|9@=;rs;tQox_a=O3SI#=eL*A1|?oVH^XBDA5iq9`h<- zr=gBn08z-1p?S5E?m+3xYXzSLe52q}_{jmrdfLI89uJJRV<8TV!@#%z9Bcuj!h8kU z&Hz_{U=WUa#|?s8fpPUX@-|>_2csZ69sovX&TPl`aefbfDc~Q&Kg!Sf?060b*ccY@ z8JR7~wy%fQ#ate?DvBj#IF`P8EB{01Cot{Iwt<6PqZv z7Wg!I88GJc#?y_~GAdqh;=0_^VIBaDI!;?pl-T3JU}MH05&vcq_ERB8G-e8C9)yd= zV{tKY*>G#&Er>BDs$~w87@O*VSL2M_xwT*&^Ty8wZ$T~i0_K#yR*&;eqOWr(EzOEh z4ERorwFNu{yjNi^U`rDCW>r8H4Hg7uxaA29%qf)tKP`RP{#Wr`@113~{660C-aB^7 zI}q`dqP3jBfic2uIVqS^a4unREZCNR;LMW|COWekXIz>bcFUJIvpk0AIbBXa3Cx!> z<4*k1F5C}rg3p~;pC}y{6NImAu45Q@7S1<~bDZw97$eDzkk`Z`@0VOw4;Snnq3pa2 z=PU4swzB~Tso>5V1xF#jRd5V=H}LEDO9Jx+j%Ri106xeVqhMxs{xp8*{gR1YKD9V` zlot_ND=g4A~1`4HJ13@{z!s zF>VYP2|IWP@MOU)z~zFmB6iJToCSdY7Av_;dq8TKAT)%z3tOmz?*+aTm=kMrKb&L} z?Sq{61ujH8a1-0(FA2O|Fy?C49{59=WC8C*UUIqY;=*A%;FZp}mM$O@0~s)KHa`qx z#BguNPR9cnDRlmx;BMd!!9Bnj#IflG=6ZAG!oYju+x{~9v~H|imO!x!7Tk7y5byrW znWyjiyBH(7yF!q2nbCIMxc}seF%3W>n7>PK7=|O_(UYUcV3xi@+jeqvE-y*xd)L|V zLnj|B-TgNVf@VHSw8zA_Oe5eN+HlrDo*Qrc>u8%@^S+rv+EJVfamHy6Pb{_@qX4*6 za2Oa~2={z09Z{~@!{K$$e0Wb1)f|Hu{`OelDB+%EIS>FJu}r_--hEu@q;+N5P$XKQnT&N_$fa1#n1Spw5aV% zN$v!kqU{?MU-!vg<7@HbpIl&!k5_;C8)I_ZcdBGT1&^xQzEvKsywSt^F3|8L8onaF z=~VgkH*1ns4S!3+k9l~^Up&0;kcMB-@NYGIOv5Mk|L-V!-)EZSOAqhQ*YH^yj(B+7 zZV&IDr{NVIp7CoB@4wi?Gk)P<+o{(6D?P>beIDMwMZFyd7eBzM#GchvCl@^m6~LUhSz9VTNiO{ zMNIp#W^<>8wUsjQElsYKBQC3B3Fi@iMKgL+!+-K{xYon*ehvRUUjO+86AL`aS$jQv zV4Q}_;ys^_wr6OP`5IoX;R`h!)$mms)(UZ8n()Tl`OzQ(9LoU_t+b%HN4x1us(++d75 z{Mq%!!tsg9y~g_$k0Bhs8KIfy5;eRJ;PP602IYH^%h!T$IlQ{f_%he-#LHGZ$ngEw z>;MK|bskYV1m3N2JmZ1*~b{ z^%}?1vmX`WfE_&+p}$dalICv~{ddWz8HxG#cW8pu=+LEcJcRjE!apWs0~V=YDzf2g zWYi;Le~;2{SV~3|8TorP&i&KE8;BfzpYWYTo6ba8{Qa7s7<@o+H{t+fPDT{ZNZs6hB4q8?NrBm-W0C($uX89%df0+)UdmpK9s)p*=?1W~nW5sTA8C>387 zm%dF#GY=3`e92p6@T=YsGGP72Iru0t9y~34BN_ZDYgpq@{jgMqzDM}oWE%(YzF~ND zsKId8!QG_v62L|t09VEE)(rc$L5IpdIaHs6jGcgABBM2emos%Pw;{kMV^l>M@PHt> zLE&GJ(T)ze;vl+!j3hG5ZBTlL<0D6IqsCd^Cj1&Q4o(2a6mtMk=J*VhD*;CB{bY1Z zhoD0Ym?Oj7l<=3yc#;F?);I^8R{S#DRXVZIa{GiYB;ye42Q)n{(>&L|B#_so^!8;< zWOU)W&vPCAmW=06fxLck@MkiPVA18d4w)kZtScv@%S*^O27P{U1`i8gPDYybb;4W7 zIEf17H#*#=%P}C|T=HXLfXnO@^OWLOEGBa#0?L;Ruh>au7>h1n0=(ieGRwXOE&;mw z0txVnBV>0@fn#ju~QXPXBb$DZyH5rHFm;+nhbqZI0uOA3sgol z7(l1=pGoHYv!L(NINSGt^Znn+kOgTmxP(j#ce?_~coRE-9z}6VzUf{vmm#CVjEoAy zLkB420ocD}TqJt9aavKe-2XSdNM;mkpeU+3T=rYML`BJq8WhJIo7*sYQ7nVEDt_e% zGGnaAU_9WJYw*efYow@4SsvH;O(@W*6+kZJ2+K`0C+g)?iVE zJJi;Abrs&&V5b}J^4p0T!Os#-(n@gVt<`NM2$=cRFJPlW03~6?8%*poNU)?#IIfy| zCxhFV1Mbkk0?cWNrEx5p5@a-}=MMG4FCe3h9U>z~e?J)yqr@f6!heR13yZd-4PS=- z5YL-k>=%9;(a{n3DhMNS2G=o%p1)&q z_``T?hjLPZ#xW(6iiP*$F&?jL`70*J9@BiB^-;w)W4Z=xtjb9ep(CgOmk2Sg(rH0#iDK??t?pAwtkK%*&QjzPNtrkBii-TDs@m3qD6E0hAq+a7}9~I6!D|Xrl`tf+~P8+c$BX_Hf#FWAHveiaf zHO>RJ374%l(ynoAwUMN7*=i#x;qTxLiUoa-;v~(Eq?N$kYEcy@LWhG?1c!F0DAV+) zPzAE#j2wGpTp<;3x7rFx@P?nLowg!2#Gg$St>Qqo+KLX1W2>#`9MXX*B!e5+em3;| znmq!jlmy(Zwlb*n4qp#_na0Or{wpmJ$W~ifCtSAL%4UsYtF4rPF^NxNNmpSI!i;TkVVj;j-1v zDAqUvm=RW-cT$_T+8Gf~&^#KvM&qon%ivMrvenLL);PA>8B!s4tDVuN^zKeOqkYhy z?d1S*%Zro_PUqhvK$lzz(}K16(szDUIX9eO0%{*+GwR1hSe3=+!vu z(;8?0{TgTg0}i*Ti5*}7TnbKo9S#Sx*$L*O>BsnhhyiA^6PL3-oWUc)e}$JkY+tQ$ zwzo2P9dqnHP5*-rf83#74489=Xa;W-{trB{uzj<}**=!R+Z4YAi=~30)E)fRs2_$bWYM_gEo)isK5^${Hy1|D^JB6ZjpHy)yn5%}F}qY~G-yxHXs zb{XRe=imusIIQ|aIwui<*cS0zjLD(ZHIknvXD*x#;W4+Hax)jJ$kBg?{F_gQJz^ii zlfvI3f724^yE6Kxl-{g+E78+s)UK5{<_DF0?Nsu2oJquQf!OaLFB|G-eniGW+)pCz z`86(2G(K&NGd3sM_|%f%N>)>#EDUj-GCRLI(Zk|K3QR);i(_sC4?c^LwBng zoH1^(m@Tu0nl05Q}|K!rfvlW;d$Eg5t$b5xHX8KdFy1nxnnNVFJ@J1JW zWr6e;{mN*DzEk+cWTarf3W;;j_BVfoSH3K$Q-ZCsa8|hv{z*o6KJ*Pre>Xn0_e=+G zR=gDn^do^)G2uwy6cSjK6nlI|4YGesl~XlTk&w_T70?BAw-}t8k`4#S%t43M!kwjw zrMkLD>D{Hex>xK^;=Ka`T%A_@p8Q1Ti&%}T5W=#yO9E#qS?M#%k#6Ncd7R zCO}_TpmF%CD;B<;j554StP3k%bUzEYLzx&np6Gwcc)~vKOH}l9wLtmJm&2RMcohqb ztPEZw{1GyGaT!xo@v5%_GH(!$;`18;LpU@}Ga8k?b_3BitT&?#pI>>vK|xX(h&{f_ zkq-Ca-i28(QW*}qh5rY>DntMVs>}Y|X7ml!o2VA+`KERNH#w8PzaAn$NcW>F{@@w^mA~R91h-|!6o22WcVa1Xr@%PXOAa;6cxz|D((iDWg{ZKX5BkwmX*N~ z0PEeBRWEwEQ)V?}@J8Wsr_73F^l#Pl2*}P#DZy;q@|q#=RSW+i`L{7gh8)1`KJv$k z!IK)tR_p6l+zrszqquvE^`$d-{}6kd_#1b(0({T)V-V(e3*+anfBja5zDDu2o5_C& z0s8BOw~+q`E;~v>)9gc-e}AVERKH37Ztjp$d`={sHh{r|@r({|oSt%O9tJ4+Dm})FPetGG4f&Vp#l6LO9|2LmL)Ug7f8B zWSB%a$g8~$j=iNg7OnG;GORv>OThEqp}>3|Fed)DQ(zf(@nLO){+#h?Si5Gx9VCPK zCn>NRyV@{hz*DebG6mM*k!x6w;`3jjKn?4AMZc5+b*vvyoP*_tD^>N+r9eIW4=+~y z{9c;^8?Y@8j|?r*@Wu=W&C&rCdNK_A_6**UVJ``Ag*vgQhj%OeAn#RtfxU|Y{ID>* zPYEtCDbT$fd|;?UJUBWTIC|LUAPBC=1yKqdLjpNviZ3juKo2UCgM{3Q^`as3=Ebl84dF8j1FFg*qXLSnjA-#RT;fOoH#kSXu7I*5 z2rjQ+sK2~oaQ+187;uMb>2MQe&qv02mheX?dnRt(d6MBe=D2(1Awv#e-4V*JW_?U? zjO(<#R>gTrPlloI$lyrWW(RJ|ODO}M(|%-_*PFrn6i0@E0S>rd@pT_iHm$%<2;fNf zmmk#hu+J}3{K8d~%@0}m5$r$QVe$Kv%};IlQUQk}!+cA1SQ4V_AnR*}&S`$V;!E(9 zHxoCb{DusDqv99dLPj+P&u!G zuY2q9L{nIxxSL@i2H}9+R*0;e1SG>kOSoiMSR-5#EUZ)9P0%iE5P@Wf51x+0i;{&#fb1;|%y3o*$tf5gw`^DG97ULB_*abR#8z`Z9bB#5;hI9m<}ZhWQ^U z0W5tSp9^uP7?~D__#sV4h=?C-dBCO2G5Bc(ir25iPm5S@DegW+*FT01CjQX)w-NQf zAhVbEZ}c1F2+aA3>ouBT!>44P)C?UC!)qewtl3>NpRx#Y*Wr2JrY!#acg>azyX};9 z#-QEd&951Yd^W$RL#v9xB?4-?*rCoFM~A!mF46B4eUETg->-P>dZp+0eNKO|pB)h{ z{%6-IUeqKG@Vx1Cs9m3!|0X_5mLJ~mrtw|Fn1A?-qsC#w-mLsm7-qN-*KlrVMh!T& z8h2bHrueznIcj`R#u=Xos{)FfQN@>T7v87%Y-~T=vdVB^`)3_WSy&zXKhfB;B>?`( zEDK!j3oD-6syg@@GI+b#9~V6w@&MI~6z8W!6T!{7UwBIR2a5C4BJ?)RJx2sF2(T>Y z4k#WBW^f)5`gs_HTPU2tI~6Z_&QUu*HspZj^J5^|uwop*-HPzDmsx=8!p)E$ws>mY z3JkAP9b5;)TZcN}M-dbInA@KpJ(#=wbLxlo&uJUlpKtW0josgMz;|{N+;x!KIMhLI z$501(7VJlQ_I#gY?)uA%4(*?Z3hEWWZHe+sED(3Vd@C{kZDYN?!*KrZPFQ;lqU^Uo zu|&9yWM9&ql2yqJC;mPy4q|&na zjv)SX>ecv;%J;6Pa4vD_5SZY}oxR7E|JsxD!@k>my!vGTeqeN4wpNM4ph&SVk*@~_ z=}?qPw7+A_v)}dRl;81i3lCsUp8|l2n{(?>kOJ(_m4`)$Q(%@S57m2e-;X`Huiukr z?^bfBEFm{Y$o${(I)t=jgVQ~^Uy}#k@Z{k(U}+)jgKnVVq$@>YmwED%7|k2h1YYtK z`KduM`J$ejH)yv7?@r{TadDmFsYhtb*MEU0FKBc-VGcC=g0v?O-sagCb$aqpH8x(} zU%CB{IuSkr1b7d{L`-4P2(2K&r?n2BO9#wO_CVrz+SthdR)t%alC-FC^7VT1Ds2J- ze3i(APw4UN{onWGGj#c%J$b3+*$2hHGvU)3J%#UVtwX;j_kZchr?h$UY<|FzfF^14 z5z6x9WuCe7T5Qlhs_pGQtrBJ00D)Y|-S!o;>ilCU5oR*+(?F<;i`&0(Sn<6P%}T5Yqgs03?Gc z9j+AD;$lxeHSNi>`598|r$#+_utAfDH94Kp?1@c3?r4o?x>=*c6RBj3M!^752tAJP_YB<;!l)xhFE(&fp0 z3q;Q2^KZM{<}U}54*Ux%w`G@T@&;FmHSt$X9`ocu*^gLK$w5d9X_t3p#H~M+fy;1^ zf%%tGZp+qg0F`cXC{GFvnhKokPJK{Dq@_1{Iu%I!m+nGRtoA#{S=X^2M5ed?7k|(9!Zv&r#^{ z#OgjgFrSmyhLc_Dbzc+lto+)J&fi(P&G!h9gm<1R#5r)YCtuy?Da>gw7W*|)U;f~k z{Uc@X)QIQCZNU*h(m_j;{Qu#}*JyR|Y5QTF<$A%z>-X&Iw2AdS=*epv@DGW&E$~N8 z(d|mHG$(5EuqM|w?%EDd?%$gD;(cR9MPJe2ry5tuuc?gFa1R|P5){H|Wstv_X!-#2 zu?gLRB6d#=crYCc`7l=?=P)X@3+~)!CRgo){mt4iZu+p#S^+;fuA!V+o(*}Pwr4pi z#FbSEg&U{akK_Faa{Q;a(`pbl=`tDR%A&Q|G%M^06Xt2gW&6tI7Fgj?LzY{bJnY$LKdQ;gJbB=AO&-zY*J*NhE%C26{m*L(%j@9$eALaL#*_QbJbdu4 z#*10}&%5yya~lpn4wlN~H-i6MWH>o*1T@Ys$8~*C+fY6-mBG{Chw&%l@tfYnCm$Q< z*+(Eegg=y=+s!>V@Sn?%0sl_peZX&M{1ot;9_Jea9o0BrWxP3yKYkBRZ+YBqngH^j zo}eiL+^g~Vz;A1O9WX!Fx(=hjTp5>d27XTC&A>-Az6+RlQDu+cdA5P@KJPl{0DcyK z{P6;<=@1TFI+v$_U)K1m!2IXxIrv{{{5bG$G~N%)Q}5WL98F(Lp7mW(tVF?c5dSILB_? z3iAr5=g(G{{69BR)+c<3|8Dzf!_5U;ZM4wgL`{u(t5Kgw)tDv5+lk{f=AyAY*Y1XA zvDsiVKI%?bD`9z8V$(`k?ttbiEc=@iDYiVAIL?;Ie_`34uvWqHlEkJ}u)O$RSau~+ zY?(|PXUm8Gg(c!V7nUm%o6a>C8Osv~5liA%=bC32_a%-)H1?bSqH|xuT5YZ{Y7(uh z&8o!0Rc2@ouQ0xUVvBVePcXLvT#s{cmWy(58+DZUcT{^5F+@DJ3j8Yy^>J&$Iu9ni z4}O)G0p*3CoW9CSdm_bNrhK)RZN-TgYBH7|l)lPKN5WczvNa}-pNAUpb@)}5mk{B4YlgGsMS<+=6XW{^!DE+p^MRY15R#&X6IU&R>W9sL`H8Ms@!RT*DKKUOJF}TTqa_dN5wzrwuyv`9qMt_(V;^IC8C}jk!4@W1beio= z>_zOU*ZDxTgZ{hf5ZXD?i>WYKz$hO~wqvr((Tiztl&$*6WH8 z-f0vprN5jk*iqs9I(Zm>|CKzRzw?uq@OORkwjI-ohc7qgREju-?KHOH<;hoeOpc$m zLfU2WzlZ6kF=K9{>rDq4vju$?Hc5}hj9J4zI^USTPxo~L`WfuEV2`1@(dVKQ=(o|$ z=rsC0)qUtsRU4ZBxv%3U0{mMYQS^|Ne&!f@xatJDRCNkH87-Bi(Y310LSyD>OcY(O zI)-jgoj^CLPNC0T8P}EqtJKklUZ>hDGUmssBj}%@8>u*oen52^{glQ;k1^&s)iLzT zsuSopRj1JJsZPg%PZj#mU!pfS)NrgZ|3b^Kr_teajClgxgC426_gE7;SoI%{^-mg! zdFNOYuE8#cppW=@=o_WX#l|er_}F3-Iu#w44CgF1&IRf?7k!oL^Uyb|J|Eq#`T{a< zRo%4MWIv&L6*14Mz6AZU>PyjkRbPgFOLg;N6E`0!v{2}$s;?&K3)R=4L+ARvzZN}0 z^>yfps@I{XtB#`=pr!W-dVHel6#6VQ|2Jv$_dU(=H}%F`t&S-AMzoh1eVghO`p2r% z=*_D8&=0FNON@COeG@|+LH{O*LBABl9B0hysw3zR;|fvWZ)iE*G4wyta%h^-;q!dm zf*y_b8i%e_okCAlokq_<|A@jl>e1+$c^Ky?ItwdyGPN2+7! zyHqF8KUbYXKcqU1-mbb2y;HS0-k29vN6@dG$ML75CJKCjLv#ZDcMVFTL+ATF?n94I zZB8&|tm+7QlIkdWhUyslDAft{V$~`1N$8syq4WtH{}ll=F#PC~XhfPn*Q+)s8*?}M zAJS0tgKAHppG4m&1)+b7PNK~z#=H^eQ;qpZ;|=rlK6FURLH`@wEazVg7BcP8m?-)T)iLxr=u$!w=+&xI==EqRCykE(2#^!457?x- z|8(O#ftHhT0Q(DQIq78T>rov+e~7+|9!Jrip?@qRf&O3g-D3ZqG1(Vt$I!!7r_iP7 zzfiwP1C@X)LwANThoSG0%;+Q0KS3wZ$D%Jsr_m>)e=6~3a`K`hOq$iX_|a#JopddF zH9B#)F}I_y6g|_J`_Ml?r_oz4Wc)cq#vH*Mj^hu=D7r^=dNwB}xg?IUGGN2m|I3A=QrAN_#p0raD)2hm-s z%^}A5Kc43JJHSio2%&paXQ6vlXQTU6htZ#^&O!fO^$_$|s&mmr-}f7ohptpT6g^FK z;UUJ%o~uv_EJDk589^VfI*L9GEyEQ<;JkCPVRiJYSLAH z-t2bFH=)nNBk30O1?V)}?a6}YOXjs>k&+{9_o2_n6Gd-Em$FZ=J%pB4rP#KiA7Y|gWX+CYe=WJ^`I7h>Seh_N>O)_w`Xh9+>V9-SxoU{{0xh+8 z>0%uR;2_mebQxMM#2DKov>fdOTaD^g^gLh3O&f5WI%FVDM@!}u+j;1(*{9hqLti8f zVq2#%QS@DCcGu)E7e_Oj|uv?QjU4N~T7*lD|${^aZNUZEcY()*|}6`!kK!SVho zS=&8vW&R~z^EOCRMxoF33gBrDt+~uZ)iHdBs!pKipk<6xZ1t);Xi=l;t<-XE@`>(= zlU8A2%(A7HE6}Zgq$|-h+B@-XNPgWtEq)^wp6|T&{KWTqkq@DzJrTC;s-x&(PHyeLea^)f{){uc|k2aKG?%-24#7SL$e`X+tjc3%wOxjFt|!5hG8n zqBrssH(u>>?Nw`h3SFzZ6a5{uoTyRsLi8;<1odbR2PHBkl_#gXJamc7V{Kr9?Nr=S zO&Wcs>TdKos(aAiSKW)g94#XnAxm{!B^n4yI z<0~mR-jQVGu99SAS9Mu%Hi-A3$@`DQp5)41C1tN!c@Ok%+*MN0YkB*VPwZMz@VH-5 z?k3v%bh2`HN!d$S$|*a_CeQ4{*eBRtOD@Cvd%R*P#M7rbg8uL1dc6O@axZlEbbp!g zzwmwVzmnT_msBpf(zgcQGZ-9se-K2Smi&14MCV7zf<0Bs?rgz9RS%Gx|C`Mj{743O zW$>;H{vdhdo~oijwLYe${yX{1o~qD6Ym@)AXL4xd+T^fTCWp$`CTFobcx`eyyQyoF zH@!01nVH=BN=d;`fOYVK8$~h_d&bUcOP`{4KffwUYSPmL>lhu^Z1@Y3W%N`|Xo0dykw; z8eeDG7g}1D)j>>yWpDCzj#t^`$=hBpDOhj0?@Dfay=2K|%kqYQWANf1w(L(?dXJ?) zu=IZ?=f6=Bcdp&vlzdB%we)05&$jduOP_D))s|jw>5Y~)7hSr>tXT2*18>|rJL~eM z74E`(=OOpYuv6}Sk?&M`rqKn?>JgW(Tyy@4l~=52zWlOtR-SXws*BdFb#E$g4$iKb zQ#-xu!2;*gN$&O;&WNt9Gn|XZImRtn=KQ(#rUm}lD4jcw0O7N(EBc^i=c({hfc85%j@+|yC13V=vKSu+@gRJV6Pm93Wj@hC7UE)XQJ0@-M zNVrFtrg*70i&eTbppydgneqBGU>$r&sbl(;PlP9xJ7zGW0J+d5|Nr36t9DFj21k^q z9Ko`8u4Af|?_S7SCF+=(xD`-DK!bA7!bat@r!oRd9n++I2b{-oY*F4$fq5*)+cLNv zejVQ@Y{TeK%Hm=;o>qg`hnK z`3R$+{8PBNljC2fhCg8#`80PWi-*IF%F$zZ7sZgpEItx$vUm*Kq8yB1LV3e6lwa?d zPK%e;^F*As3m8;?680U<|1#o{x{DAWDUOZQYauYm0 zeje@2@rO(drEsot(1U8_pg~dPdx$S+a!kGQ>u_Fz)giN^9DJoGSnaIIt7mB%mPjZT6gR$c^G@KU>Fs9#{vn zKaTfG@-u`qV9^rl_XoLk`g zFN+gUK#L01@V;bdXC6?Va2yRxIi}g-$#9Fs;%`?zf%t>BaGhH`9_~=S3jbjpTm{N; zF;rpbR>Q+^%_E%k7EgiumH&)?dMERM^2F~NGi5tB6xNI~q~f27zf(ErKw9~G#E;xT zc|OO@uP_um%|xOBFT+JIP$17>QlRj7I9EA$DgJjI6UpFe-aK@J|BD>O!V5qkv{*X<#W0Ol0`e%4H`QGhuGXbX!~s_hsZC zfW75Cjd3D6b~IYEj5kXZY)sr2$f5f2NrZwX8 zZzX<5$aKWjFo2=5K4j9c%++I;G4rkBNwm`E6~fK%gahaD(uoIhMEQQ=$82y+o$_Dc zA|{@wa_&hiaBk)P-(VT4Ff>{`0dBHbGBhjKQ9w}}myz-naQVH=l*%q##zfWuze=a> zJK3;a%Ql_L@4$J9?6~Q+43R{(>9u$wJYX>ynBM#X4?2Y*yfxbtT090Wg%87bEL*rK z%hV~)W8?~0p*C8a*B=j=W;I+c1+rxAx4AsaG*0#lr2SrM%HU?@r^r9IgO>@)<)_la zPGj0L;#0~~@sEhJ!Wpy-1#oVaU*U2Ic!NvH;sQ9LydHlQ%l2xEi{KjNXYiNw85320 z8!q~YqoC~YYfrp_Wpuk`sD)F?+F{de`RCvtw73j5)qaDIr@(Pv(O~5};EIo!sx2;q ztCgQUjq86#Kg;0#1~U$>Q~sI)CNfvoD^ENf&JLLdi^su@%BSIL!aYD z3}J4;JsNNaT)=GDpTPsl58@wn3O6f@i(qr8-=jD2PiqXBQj2H7)yiH2)^L@0%<=ac zfT2zU%Fm<$Ev#ZKE`ehfi@zy@Ta@RLe_Bh(v{^h0PALZs=n#%`5(N$D)PSG?X^W)+ zy%tLY`Z9PxIXDD^$~VxU5h)fNQ~ePVE`S^0xSYk0W2oN3WuyVZMQ}{nn@ApErd0k5 z{=&PmOv2(kxK%lrYC9~>W9m&Se=QB*WkB6wT>sJl&v0;-={($TVbFtg26rn5Q*EDe zFxB>F#1ANYQ!O)V{WQOPVVP;0rg8kG0l`$;q5;A()h3jKskYT(nQGgVgQ+&9989&n z$}-i;OlxZV`h;bs&5f%e=yA0bAX9C<#WK}4DhE?-lX5WCHd`!HZHqEftvAyqES8xz z-l~RRs%=*errMOnGSzk{2UBgQ#WL0IP!6WrUghVRdS#~VSJn>4&7c~BskXG%A0lCy zY9q?Q2t_TwOtmqKWvXpf4yM{xsUetZ(-zBA+kHR=CML@-Q*G{a zzrm7UrrJ{FV5*H+EHiD?;&E{djcN#{+9u^-s%^8_n`)JV5$RO^W~x>8CYq&8wHA9b zt+LFtac`=%48jA--%Pa@dsFQU?Qt;GTI@}=%E3%mV{v#5Gp#ZcUEH5)_Zy5i)mrRL zwHe%^{LNHru{YH!2My@3SQ^l&Tz)3UUn)p{V_?Yy_gd^twHZ7BzZx;-n6sEE^TQ^0 zrq36{5ng#kl)J<~GHhy;y=TqRuxU|#H!cB@u=o9l6j*XL%crSf)20E!6JU8kX)ic- zCv%3I-r4%Y3;yWmls*`{0h zukPj_I2E;C$NRF)pqjmof0S)7s6?u<3<8XG4xmg6>zV`W8prFrGS3r6;c7$*nq`_ z@Sw$|aPDk>93;L1F7%kQPYh!*lv)8&K(%tKRM5yVvA7Vf%iwzDpG$mj%1@6YR&a~Pqu*)yn zG2-5-;bRK8hwhi&ux_Axu@}vAhs$xtF?=tkT6tatF`8?jM?@)fmU4N}}bo@BN zhHYTUFy9Xo&WGz@X-iN{O#MbvlX4ktitx6*ErU}T@g2%uU#8}m9X^N5GI#!U^kTWY z(%-GW&UwuFwOhN+sVMsArJMkU1<(S&G5>T|u5(s|CST@0x6V1C^6bl)7@}N83w`&E z@VG@xJj!RgwQ;9neh}7yOS%+<6&|yn3-CphAE%hf^-P$`@3|Y}&NOGXyEE>raMrlI zO`jGYx|)HQ%A1eH{^d=afGbUPON7ipznGylWbk_MIj61|;L%J(VV2X?%3hBQzldh|queSae!0ZwhrI8d zg^!E*mqH`&iUXEQA*TFG;)nAlL|*NNCE$1Nvg?`6vae($d05?Xf}hX(CAN)6H|5*i zjn{L=oI_Yy+VBm$A0}J?=PI|uwpjc%7K=Zsyi4+TbJwzX3>@=$x(NcB zG6GtZzoLK%ySbbKc30oPEIjE4+-jE~@O)R^B!*GrA;oML2xHjr7J{XQE%l&uMyIj1=i3ofi zHv{F<;4sbv&6o0n)XLMXXPC#Gcvyl(q6P%agm6Fxu5XVoCBAF}3yzHVKILEHAJxi& zBO^bTr-|SM>AMUMB-V#!Dy22D6SIan(sGPqSaSUa?5>}6mO0_=Jf|t23om?u=QL$+MUtii%6@$u{~cC_ zJTmkue@Tz>y2IYr0#f1ZiSX{Q_jQ19;FllwZGXG+(-Pl9er5UDBkzr{sT<7UgH?!7-nQO>2g~&GP5rPb*KEL8XsaIT2lzw6oUa_Lwi+@xmJ#2i9IUny8Qi9v&Ce*|xjCjodHGzk*eqDY@=Ogu z1Je5gSf=C{`8q&`xVVZ*b7_tlP(BeZJ|)Kt4t1Zp*%==%J?Ox=h;k5Dqx=~SDd4!( zDPJVzG~}2D<)9sn$}{kX8*@yv@~>HjmYzpaAOYd-9Mhsae;z$}H^(HD zPpxJ|dU8y=vNvMAIVPoimH2n(m>%Vz{9a|RgYi`y3flnZ797~aLS?Uq%{itzgX@%k zN`>JBJyc#rgBP^YLFJ$Ujg~(iCP2QskRHDzJ-nA5Dj#|XJ!qqc%3cq-R#VDL#eXX& zCv4xON{1cTfrzr#$ZM@2e1*uTk>*1$4 zrY3`<8S(YX%i`SSMh@hdSYS|YR`z;0$RSeRMFSQadaN8Ypw04!@pmd8dNdu(A7XYW zkDE#dvKay8xEMxYkPk(qNAn~gml1&NW7?;@3IFIi7Fij7`H)27Pou)>xh%2@eSQco zh_c91?tv$>h>Q3fH$$TGFvsdr1CE7fvTBQ3JRR;=z72n*feMQJ3WSSb`A$O`@DV)y z6jol!L3xeJGv@O`vXS5VJdPW42L|~hu3ZCy9(E`jO`Xa?54)9v9`+~)J?vEuIyj&l zG-yybPK(7LJ(LeWqz6F{<-?DFrH2E`K@ZIc-yalMs2ub#svLB%UU}+a+|*ilu!OzE z?CBVauVrzn0aw7|5`5;M{1_ut%sc(g48IxWH{d1w;S|SMId1{4PquJKl!Fm$Q2qnu zAH>47d6X_@Cmqgh_YodlH9)u&PAN~Jz`RbLOqFHzEvxODu!ppC`Qqh%wtNPLL9P6;oR+blp!iUuPet7{XTz6#GpYC>UcbtE8 zUDEE{;lv~Or&)na_8yOz?q`hQJJ!qSbGvd-FwfocU~8sEe1D7bHV%fDSjCEeL8XsT z<@X~V^Dj>^45!dLH6So9`Ep$Y5CpOa7q~e18ut6`rrmjl~q<-_9aXQopi% z3&V-ZkPPtyR(S>&9)u#yh=H7@2Sal4D$|R zu}NechCh2FSnPd1Ysa6Z70ZQbr+;ZfdpR5J^rklq#YV0py<&X#8Cro{A9h-;J&+66 zPSdm?S=id?ChdSMj_mXsjc>D00cpe%t+?L(c(ZeK*`M_^O>z7rP^PEl2^b3g9$ zys_qWx6Zyn&~CR@+!t%z@+@Je+uW7+bJ{L(H%ioUZ9+osgH~GR?iBa6-f{E4Xtlg% zp}SAqztR@U_ojAw!L8ill!UT!-8oyF*Y$;vNV_ zX|nC)Y0oYCg;TPmR{JTRE81yjFnUvLE3Yhd*kT#+qutdMSC-V;Y*_w(wO&+P2%8-Tx9b^Ae$ZVh?zgq&@(rAw zUUN5!`&4bYeBx%OrS48~zo@z8`!G9Q?C!(8C|___5PMceS{qTDN>5WT!dqW^o^`El-v?&ozR|6G2>0DOYVuzgvD44oW#Yb24@r~W&V!JB?s{>bq%H3` zB5?ToN$xgre>Z4aM(()#zPN{KZu#25PW^7t!?-`wmPd6#9)#TN&KLJOb<3}|cItCi zi@QSWE}xxd@$Oe?$4i}D7{3yf)a#4UQ1I)2DavdH^4 z-M&32?g#FCaUbX9-oG4-XzrozYTQeX@Z5!JWF4tW{=*B!{4Yqo+O+RzZC=N4>H?CV z5cf)L{95QW#v60XJaG`eh<=N^Cc}NHyG`7@^7q`)4ELe#`?#ITt}i>Ct}M5C zyOYbmP2>@eEhtKOCtK_w{*Z>UiA`Q8NfP}eTTIth0e5C_sjeCVe}f*_fSY|D>J`{U zfho843FpMP{CX%!#!K4uxy3!=&@(&C+k7$TP86?a^hb45|YGCfX6d)LM;=ZK~9 z56Zh<%nGf{%Bov2!<{fBbcg%vA)&*d+OGG9gpP9Ds=UzUp7XA}&@FD&(9q%HbQ^|- zPDRXgQ$s_CxO<0&#=4&m4c+Pa)*lo)uDo{UikY=$>4F6m?CooGU$~1zpKXE?YMu?}RL_O43vAm-(TqoMv}*L8!`k*S)78baa{gFevj$R3fa@ z=kAlJR<~?e=;+XfEccAU(0I3HSSaE=;NBy)`>_>a8x&j2EgMd0yrTS%rS-V0hf~`9 z?mZH<>06?xQ=*o-WralXzV$zrHQ=r;B&yB5N1|^1mMG)yD+-Npvx`DAonH6IqR{NT z!Y7C&rQEeep^CD3kQltXi0APC^t;=NLRDo)eoMifQgGFT>%S#;?mEAeh;io>gvOVx z`<7zT?&@NCahO{+f?gc*Em1x0KBDsEzs$q`O^&;HM5x5wQ5=etUG^>j>P>UzW?OzbXVgJmrLDp>J4p4 z_=Sh|x=)Q@G)nROr?YLq-8V9Hv~#UnJBl-_aEE*OsLQ4$1<7IabMVyOlZi4|q3)<&cn#7k6k7mFG% zZKJE6*kWB3ZB*1ywP0)QQg88shI(nVwqNkWHrCe0T5H<(ZTtP6nP=p%pB|l^|L=L8 zbDfzpXJ;q0K3v$ot+1^o(q6oM+DG3?*EUUiY;99jMN$1J#>m$4*mqMq=FGdK-k4%z zHnTI=@iB_Mq+8Gt_A$0QRmaf}pog+guyv+4?HGOZ&#{z2#xq`*Y7hOk>InLes`ES( z{Rq9tGbYaVuln?RJLY)v(v>@_J)54tbAoqmdJUg1r#JCAG<`RpC#HApoKgPn8OE$2 z%PDN9vi+Yk(vc^pPC0C~RBeh+!}RThG2f*xO+$>i1icEIq*VHAPmWH0KVi&`P-4C@ zKR}-)9`pm~W^@+4U3D+|Y1QUfW1d$XL+?=?N58E)f!?b+h5nQ340-@fT}hJ#^40_u zo8ycbhL(!s=ql9-^d!|O^fc8O^la5x^wFw&(G9B20%N|VI)-jWH%j^F%hn_V$O1QM zQ2cmfZdIK?Z&95>|5$YfyBV`U!M5`VXpmk_%1b z9}4d*3{D9N`t3p!jeH{*iC!`cLto?JSY*r?w8SJ9nMk$jZ!9uiz3Q{jOH`kYUZwh* z=(VcPA#W0$l!BTTnf&Y2v5ufN)!#;MQGGu8Uey<%J5)E*peIzfQ0UXDFDK>&)mNb3 zP`wfTzUnI%nWXor!c{o(&kA~$M2|qrd61%liK;W`!_fS1vgo<0&0=Ggs*a;qqW!$+ z)v7b-Z>i3rH~5<4-wRx+4zq+|MqkTN$I#zZdoTKqFy;hf?o%B@KcPB~eikjqJAvMf zmeFlS|3-BSx=-U%=ueUg8Q?#vv*_sA##~P$deOyb=}qRV##E}#q9>{DMbA)emU0!S zj-i*Tj-yXkoj{+XI++44Qplh;s?MUXRo#nDt2SRVrd@Rmy%kNnO&tBW>J<7pjme_l zP~D4uU$r^Wn7^FO^)Ee(0iUTOj*fma=y3vFsycyJIpg&WcMdzIp_XorBY}PeeY@CCGv+PL zkV5ZOok9Nz{YT2oqCY`f8M&_;^I!BGk{3PXTijRBDRc$;LUa~A1^q*h<8Myq>;+=X znl**SEI^+@kfamQ>m~DH3^Dp*(X))X0DTEMi%z0BLfi?=pP?^9o3C*EnmBpTadat~X~Cq>I!my-RfydJlRS zl{KT^LvNxHDfEZvtEJKNjQJET=Rp=-crFbU=mn~P??|hUHl`Xqp2N`{g@-Z^u#;4W z{Y;6eVX=gkbweC|9C|hO1o{ND-w5;y^cw6b^qJ@jiO-_X)tK%Yj{kL&gCXk0u^xvE zS0DN^)&1y{>H+lis?EX1yIHk|zC(2ceUIuq^nis^jPyw2W2)U5oyPj0(Cwz2{e>OXguA z6(+DAm;Uru)l-%PdGp&bH=@tRBk2tEIp{1~B0c|^(eu_~k&H z+lZD{W!S!hevo~Z?Yi`B&wRyeOYeDRa>Yt*U zRsRfKOs-mDUO-DNl76i^hW?%EIQm1hTyF`s&(LzPQ*4p*0^N!p7U-mD1IDUD2I63} zWX`b7LI0b5mTf-zTxk$ngT}l$6R6$?%AQ>W?}^mDXKLUFE`=T)!fz`dIO zX4m93zsEw&o28aNqR(P4>7)I*%%`do*#E6Mg)aVfFjyIMmFf-_7t>TTsNU@K2VIk= z9F2wH$d_7NvVhbprhZ zwA_zVRCb^0P3T8eUyXi3HAmF@rRvQbw-*A znk@QI)m`XWs=Lv1RrjD5pk+j3jRpmbncr z<16XYb?KvD9F<=Ba&6?Jb?K{K9#wT0UO6-3;wEvL=a;hIdcL@)O`+|8a;oY8oOr$h{6F81TndArMs!q}ShxZRVz z)6?^JS1&ueMWW2mACphAZph)Qa`^fjzB7j(Pd~Z4y6h#jKB}eeNq@Y%I`X@gbk(a< zBY$W~AIt8emh@V7|7c0y!tOsU>7Tti)hkHveRXunh|9PFX^fl=W7E;ss=b5KhrU)l zdphB*}Z%=RM^U3tveC|qn-PPWU>4Uqg zi+YJ74Sg$J*F7dW30auF3~zP%Zaz;)zsTq6^v8T&l&;)UU3TN;LHv7CCF!2@vOVAT zew^OBXSw%qdiJkh_MS+4ua7?U7eU-0iFwx1TPnn2eEVyT{r8Uk#L;sm?2jL~JbnJ_ zqvj31V!vsmqh*Cm@{6A2*pG7bg7mJ}M^9PqSk7_ufXv%k!iMy}Umu;k((&Hp=(`;K zxTBwP^h=I@-O;~y^j{o3;OL@_eoG4c&WuTKdSi6uae>LVEO+!-kG=TDBS+ZFi@gVJ zeTjFlJ-ftPZ$BvUChsU4>U}sRzxJrQnRf5t-iRH;W_jn0vm2Lr`|6e-8=N&#%?TXK zAD+CQPlVrdxB)(B$IT~utA{4fB;Qsx)5E$t!ZH;-h;J1|y_~HMkAiy~u7Z0Vo(cCk zEdBw9YhgK!-SP|bSpJIPPi!Oiu}ai{hiYkjSH#pR=N-rV($7jz`ByYBI>5t9ma{3%?X;GA)|1nyG~ z< zpYUdwo49b8G7fY88`GhNnnj#s&5TG6cPsNa)RbMsSzZ(r_)~b+E5^i>KZeV@sZhCg zF>By=`A(v|94^_%mnvAU8j@eXX;#CH1k7sjOsn$XL+Qar&$KIlh<{>=AyzJ1!kU>! z%`Jn20z-e7a_H|-o=f~V9`?vD0n&i7CDiX1poTD@_45E$cvR5lu*A3L#CPQQ8;XMp zHc(-0t7jS=o(31Pl#vF^O%hN-i%Qk-h-7GI9#H-(JR#$mW{0Q3Ee?ynU3tt2Ozm5_ z&K({PcPKBwe`p6+fpSs|)fl?eAP;D3w{g}xJPqzs{t5n>oy-Hu{qVHMxuLM;lOBnG zI{r@Oumf4;sbA$X+(~%>CruJV$x}=u8erkFXDN_xPg0=pc(_pcP4U0$nOF|jD1RpY zUWQzG)>20B&y1LI5-#iK9P^puf3Fz+&IoA0CveG#i0N0J{WVUySi}q{uY||cM3~xw z28RAZP0q=#Vv4I0ozKxKWzH0Bi0tSk+zpn<6ze^&Vq zi|`5tD^wuI_`2*75CXV!+dv!Oifb1LyLJ z$p>;wxtaK?&7P@OejF}i;)yH22_JkD_x}dRP>rF{;Yo0l!;+y{IeIb$ws9FL$KkPC zm?@RdhAWxKI^fsn)Y|2S^;*8^RPKO_Qu#^K831 zo0YF4|J)9q3@Cp97j^PuQBHhD`JecQCt2YPIEE6qusW#lkQD^H!KLJI2^>>C5q~wy z_8N!F;9BJy@Q>~_Ca$~{F5AaZP<|CoPGA|`?ilLejIwsvbUFT`@DDg#37eXr!BzaI zGwy$Bu<|N+!ak;Ihb!S4f(9nVuo6R!8iZwu6jwgsG=33zoOwZc8$6r)cdNrk!x`nU1D(o4 zzfK31GO;Pw`^;mXfLZ@zh;m2k)__%T3A0~c4)-fxf`8;G+^iffgUum9kM6-gqcLJC z9G(N$DEke#h^xeBj=$dk4D}lDfi$3nRjk9K;e^BDZ_42o<)YJRKug55IXnl>D2EN` z5KeNIh7IV{fUp5shou2M4od@ibGTnQJOl&E4K!$Yh6Ts;V1$HA;08D;mq`jk%~mcW z4G=Da6UzQXvW=Ni`EmTEx8|9Y!$okbayZp?I9$Zkn^k^E8oP8} zVVP=Ml$mP%nKtFH%(Tf?HH1@byK*?yW*nBOwnI6bYC9d4sdlGwIMwzjw=omSOxvfd z9Zs47HH1@bMO`pN!ZOvyl*18pF6#vGQJHtz7aB!)&cgi~#kayZqtIqXlh%HfD~ zDt|uJD*F@7Ql?sm{h3x-X4<4b)j9^@e&x@nT8I6q_HgZSIMq7rPqoV7Ojql0RAyRb zCc0!W)$TVKf2wuZpK5csMfvlo)?t6DRSp}_;jlEIQ~86hbNr=(?B@oSOmL6G{#2X8 z{qSoso_4HarYw${!dU^=!!aIt#gsRTe?-*OD*N9xE25@F`GKSa#G?L79a7*vxMF(L zv}u6wBv>9$%0v~Woyy_dUOGGQhjV*{ayYfe9G0oQ2A2Bf*POxZ$5X?E8iZ@%cIC_A zk`C7G%I)yT&V19Q{4*Q9)SFP}cf2>>45-=f_`ZBoI47vb?|5InX;gl|t{_|T11Y_p zc~;HBMR2RbWpKO06>!Gk5pajYlD|`V(3yO(jPv-@;ZisoaMDOX1%_@XU;^CZ@EEw) zVJV zl`oL^1kc0r(8Q068Xzoh_O#@1tMa`P-^{Jg;ZnFghdY#aNqh^3 z#NkqSC!Ca1Py)ozr2)T{3@HwY!=-Rf4)-blOX6EO1P+(N136q+9~^=atBG&pI;}Sa z{xvYdetMZVqwaX@^7C|pxZl?DgCtx=y-mv7;la0Zu7+$^T<%SnxbsL>R~?K8d&w4Z zd&u@S!pi>$4ta_b;iw?&k4M_)FZaeL$HOCdhAnSnN%kJ(OvonX~MJ_3CGy7vNikfcr7PX>5YWikn#i%n!;GE{5x2sgv-9S9;^i|L_%#CQr%RH0}>yv6o;k^T%#_f!V3{ z@%Fwesr(T8T(EopO7BtcT6^17-h{H<=gSY=tWS7aBW3Tl&t2uMjtrb{rzX7o(3=eq7*Q36ERAyr4Y8-j?(x%n!pla7ig)Sn2WmxddNK`5KCux|sP)dAt2I>CNzp z?39$Z+FNL^NqIAp?=~Ce2_8%=3Wj0EdZyr7z5zL01Xoay41EH>JbsHQUjawsJUvr> zLU;lBl|PpF#XPWF666;i1y=+-+=Kx&p9k25n>cqTUdW(i_%^Hd6XBw*ENGPdhIH}_ zNqIf~DBl%Zlphj)iZ8P{etFqgIuiP8PYC#ZiO+f_6>!oVu>r%gd>z+-@O+Y&hNXb( z@ek|bpek>J5AEjLu(IEQe$SY%2JwCe{>}-f+$ZI;sI5`(&y#e1~eefj4c(` zGJiyiBmT?4!r>X*$P>|!1m!X?@YJ)0(=y<4BZe^;YBXS` zz4#jMq2!ZC@TxhRd6qF{7qVO;70QQj_bPgYCsH|#*^gg_7}>)$t(=O%3C<1WQ(;*` zH`075KTHXEm01jfxzP>X$Zb*sLgt&%0U6qrze0RviuFNGJoAJfzXAWq%`6Xc^3%ox z{QNmbVDN9i+@~veCL|3CIp%N~{r3hq*W*uZY(@ZQgQ->*;Ep4aMC z1`8T){Cvyto$@fKXmiy6UH|jm<6o@)DsJA<$D{u5{Nk^Lk9#)i|E@3mvgFUwSd9-G z)21x(MZ|XooHYNG3|&$GcYP_~h{^CPtavm-=#Lcy4GjIw%1=o=!C7VbL80i4s3{#3 z#LMpm74I^d%6@VphAWA@|29#GbK`t#Y^1HnB@FckWlmgSO{8uU{;WdUn<#WZ~ zP+Ihp_t9&>GM;i;wV&!XT=-5>SCIP!co5{&9 zzwb-K{gK>8M{>C5!1%c7Rf9jYodsqfhYO2?0w0tHai&!$chaEay9(@>)3}rbqFn_> z-X@URht8w5?-uxP69})UVc5D0Otbp^VeKg}Ey|aQ|CIvMp&X7zr?TIhbsUBq?hV)u z|GHNeT+ecClmw0Ndjyv%|ByZ-os{vsJ@(#soF+D5)T;RVV;c~^Wz#qoTD-+`PJJerb>T`Ipvfsf04iW5M z&+Rl|k)g*L5Ej^^EdD5dd8a}u7=XtX4>E1a zU@D9^L26B^A?#sBIqYGFa@fO8<*7l%GAsq-iD6dq6EFDbBI~8sZ zy94XOvg8 zjTZzv)F4Z1SxU>Rwh=A;Oms6_aSz|0v4tFk$qqwsq{ z|CHrfoAA{7z%S3zgg-rV$FbJ?p67M#*wgNP-%GM2F*BS%sY-bG%pfDzoLT7jo0X@` z4*b3FNyzE3fEySP;q4p@Neq+E$4(5mf+ef?_r`oqnsyAsDC8Cm=*{6$)}Z3QjC+=( z#vGP4uJ{K}3j7_gRPaq@xwDnwf1FjHBw6(d%WEafeuzPVVV!T_dks8_fbp!tBo#75 zF1IURtbTbpQv4yys!sS`E<{Paur#QaHISqV);Plch)}=3h>~Ly_D~j0!r_RdSX#IR z>{JeiRNg%t>*SZ!fpD0=6?XGyl_kH_@86lny9Jccd#8YI*e#%NsM7=T%YANw6EF8Q z;jlwljSoj)V1NEmQony2sdfs;*pIjH6tDJ9ufUGK)0ncr9DB34ALR&$yU^dOkKGizOWZfAJHxoR=_LEHxL>5u2>-Rr37p+p zNxz-=BiuJf#hhYBz~HE!UsqW{BN%qTPJ!b~pyyH; z@;`<4y&rjpc~{%AySzn}BmMrf#0veoA8gm(#nZ;2_HNnz((bv7DjWPNc_ft+e82TF zxc{Tw?O7D~`?y{t4YGB(y&AhD<6W9u?-x?;Po053`23UFGfb&&8t0F3xvB9-YrkiR z#>aE)NBgywo0#9T{qg7fapg(>yV8C$e;}w8H0B(JbAk*;&OtZz`30BzSEp;gLd)qK z=30$8P2=Ta(#s|Yc+WpX<^KD$ZkB_z2Xghg>7~$~bHq>5a%73*rlYmuCifJOM#z_S z?w}@Sm)zqWQ~91Aw+xqxq{4~8{xN&^Jsj3TzgnJjGQGNKw%sG{hyB8MWbE(v2V85t zdvV|4k0LLS_@lGmeWXz z-OFja(0(jY%e4t9xkEW=p`ExD_htTx6ucqocul=sChkYIh4TKUo1V0ra7P9P*&l56 z&a7Oir3~b>w8xg+M=9UYQsfOnH{E0Bi~Id>l%~2)?tyka?j?t5Kjrm5H~m+$bxd=u z{JFgjTOubu&+d`hLI%Z(q4-w%snZovU4Gn(jJ{`5(Ji+|#u&yvlSy zy499-;C@<anlUzJ%D?%wmenmI{7zAY@N6t)w&yUns%67BknaiYMC7O9rk8%Z`QiI zbKIlsE^)8by5%hfH+|oJEbcj4x4b9fru*!~2XTAqmUklDw9+mU_g})M<>bEHZW4D| zM@{}24LAMJZWs3|JtR$fI}byCZ}*D(ByD-Ou5Uwkl`VS+xBRJ%98h`xz)cs~`QrYs zHcj3haMSPXdU5YlcU)KHVMx;6E$%DSo#NZIo8Gj0#64E)u2|?g`J;R5ZS&{JI@wLN zYqk-*Te~U0gt_TQ_GWQ!(5jlh<~mu%+g;**C_H|$>~qp^`?0v63oo@39Ut;sJMm%M zQFYfZJJ5Z*T_*0|YTaE82fC-&P2#>&k6&Ak`x3kTVb(f*+`!6NF@>pCR~jR2*(0n^ zUbhE7;?1Z$+mG@G%nwXx_&B?ssLIXUB+LB2Ru1f8aU1O2;$GzE-oG4-Y3@OG5AG#1 zeRruEc`%{suiS#m`7cbJ+O&GD&F>ga!u<5St$UQ(zN>D3%pLa-y9T%Sn7!;#dh{PW zWoAN>E&;A9eaJjWfg^KpCQcbvA}+mV;7P`7k!7hC<1z%ZDd*yKTyB+)-*lRssV6mn}0 z_v>K{{qm5(jhBZEA@A^S!}jhcypxjeHUxGVqQ}|fCqhZW-E4n%c#k;r8WI1m*@_*0 z9hRR6C5itHwu2mg6RvgmEm@e(bqv2DV6nqJ@F@R7qzQ{eO)M|s*S~wv-~38DUO^k7s%h}PF{NbRl|#ZFaIu(a^{-m2VOz(@I<-oRqR_h7xs+yI{3m zM9Dw6_(e4~+r1K%u|=gs@!0MQqi9ztQA_OgL`9DG>`Ox<<85DQB<6kB7L}1x{!O?q zDnBFT54RVUMP_-O_JOj<5jHU_Qs}kW56U7FDvu%?{~Q0_;tWLAPArd9SI+s8QsZ`w zxOoWpg}Hl!+*f=_?gqP8a!>n`+{R8Ej(h5tguG@O2~`;sWem8hZ!695q= zVs9QE8EtDuL}HbXV32c#<90w|kVjDOD(sTw|99Ul?q~3Qk-OFI#T~7b3grYG+>i=N z@9MVGMnuL}j>PjtM~G@iMvn0+?A`1lnH~1Mk&&sB?&j>xTl(J%C_~E$O3UbJeYCM_ ZOCsYV|H`u`WxSDjCbPwUV^n17{{zL6+^qlr diff --git a/pkg/ebpf/tracer.go b/pkg/ebpf/tracer.go index 2d68544ec..59f626334 100644 --- a/pkg/ebpf/tracer.go +++ b/pkg/ebpf/tracer.go @@ -46,7 +46,7 @@ const ( pcaRecordsMap = "packet_record" tcEgressFilterName = "tc/tc_egress_flow_parse" tcIngressFilterName = "tc/tc_ingress_flow_parse" - ovsMonitoringHook = "psample_sample_packet" + ovsMonitoringHook = "rh_psample_sample_packet" ) var log = logrus.WithField("component", "ebpf.FlowFetcher") diff --git a/pkg/pbflow/flow_grpc.pb.go b/pkg/pbflow/flow_grpc.pb.go index f9a4eb466..ac00dda6d 100644 --- a/pkg/pbflow/flow_grpc.pb.go +++ b/pkg/pbflow/flow_grpc.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.4.0 +// - protoc-gen-go-grpc v1.5.1 // - protoc v3.19.4 // source: proto/flow.proto @@ -15,8 +15,8 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.62.0 or later. -const _ = grpc.SupportPackageIsVersion8 +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 const ( Collector_Send_FullMethodName = "/pbflow.Collector/Send" @@ -49,20 +49,24 @@ func (c *collectorClient) Send(ctx context.Context, in *Records, opts ...grpc.Ca // CollectorServer is the server API for Collector service. // All implementations must embed UnimplementedCollectorServer -// for forward compatibility +// for forward compatibility. type CollectorServer interface { Send(context.Context, *Records) (*CollectorReply, error) mustEmbedUnimplementedCollectorServer() } -// UnimplementedCollectorServer must be embedded to have forward compatible implementations. -type UnimplementedCollectorServer struct { -} +// UnimplementedCollectorServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedCollectorServer struct{} func (UnimplementedCollectorServer) Send(context.Context, *Records) (*CollectorReply, error) { return nil, status.Errorf(codes.Unimplemented, "method Send not implemented") } func (UnimplementedCollectorServer) mustEmbedUnimplementedCollectorServer() {} +func (UnimplementedCollectorServer) testEmbeddedByValue() {} // UnsafeCollectorServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to CollectorServer will @@ -72,6 +76,13 @@ type UnsafeCollectorServer interface { } func RegisterCollectorServer(s grpc.ServiceRegistrar, srv CollectorServer) { + // If the following call pancis, it indicates UnimplementedCollectorServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } s.RegisterService(&Collector_ServiceDesc, srv) } diff --git a/pkg/pbpacket/packet_grpc.pb.go b/pkg/pbpacket/packet_grpc.pb.go index 5aa9685d9..fce168986 100644 --- a/pkg/pbpacket/packet_grpc.pb.go +++ b/pkg/pbpacket/packet_grpc.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.4.0 +// - protoc-gen-go-grpc v1.5.1 // - protoc v3.19.4 // source: proto/packet.proto @@ -15,8 +15,8 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.62.0 or later. -const _ = grpc.SupportPackageIsVersion8 +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 const ( Collector_Send_FullMethodName = "/pbpacket.Collector/Send" @@ -49,20 +49,24 @@ func (c *collectorClient) Send(ctx context.Context, in *Packet, opts ...grpc.Cal // CollectorServer is the server API for Collector service. // All implementations must embed UnimplementedCollectorServer -// for forward compatibility +// for forward compatibility. type CollectorServer interface { Send(context.Context, *Packet) (*CollectorReply, error) mustEmbedUnimplementedCollectorServer() } -// UnimplementedCollectorServer must be embedded to have forward compatible implementations. -type UnimplementedCollectorServer struct { -} +// UnimplementedCollectorServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedCollectorServer struct{} func (UnimplementedCollectorServer) Send(context.Context, *Packet) (*CollectorReply, error) { return nil, status.Errorf(codes.Unimplemented, "method Send not implemented") } func (UnimplementedCollectorServer) mustEmbedUnimplementedCollectorServer() {} +func (UnimplementedCollectorServer) testEmbeddedByValue() {} // UnsafeCollectorServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to CollectorServer will @@ -72,6 +76,13 @@ type UnsafeCollectorServer interface { } func RegisterCollectorServer(s grpc.ServiceRegistrar, srv CollectorServer) { + // If the following call pancis, it indicates UnimplementedCollectorServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } s.RegisterService(&Collector_ServiceDesc, srv) }