From f97641c84ac24438f8b5d509597ab4d905888123 Mon Sep 17 00:00:00 2001 From: EamonnTP Date: Wed, 5 Aug 2020 09:28:20 +0100 Subject: [PATCH 01/33] [DOCS] Add Observability topic (#73041) * Add observability content * Remove xpack from file name * Updates following review * Review edits Co-authored-by: Elastic Machine --- .../images/observability-overview.png | Bin 0 -> 470892 bytes docs/observability/index.asciidoc | 24 ++++++++++++++++++ docs/user/index.asciidoc | 2 ++ 3 files changed, 26 insertions(+) create mode 100644 docs/observability/images/observability-overview.png create mode 100644 docs/observability/index.asciidoc diff --git a/docs/observability/images/observability-overview.png b/docs/observability/images/observability-overview.png new file mode 100644 index 0000000000000000000000000000000000000000..b7d3d09139a891db9a3bccccf8fcf4869e21bc6e GIT binary patch literal 470892 zcmd42XH=8jwkV8rP(VdNI*Njb^xgu9G^x@%N{0ZU2M9$#K|uti_aeP_#1MkgdneQY z(g`8-(DUWp=Y03>areGwzdvur$TOa-wdN|bt=aNPM@xl@l97^tfPhL(^`$NW0ogVI z0XZKzDZWKU5=l-#K-uS{sHmf+sK~D439@%`u_GW*{gjwYW~^sI_YMQ$&wNk!@m<15 zI=d44yM)`OPs6;c?|hSg@#!JSeW;K`7)R7c@}xT~w_jJk?uan1riy}T$0@vIA-gFy zu|t$3PAU{I^qjhx#O)*fQz6!KqGIX_WQvJs)|= zroJ?^{Hk+cbCdjC-{~p%%$-c0V?{Iat1<5SBIG_Vt5qKfL6ov&4A{uvF+52LZC2T&EsYtjc2&TNw{_%jWFM!~75A&DDLB}@Gy?#hc zS@6eYC=Yk&bqVV2O^V&9ev$Y*?tNDdhbg@`KQQ=5l#-KhUYAJ^(=nS}sEkN(MzgMA zpTwa==yGZEjPRo_Ns9*qhMiw)R=QI8siIgMdM_UsRC-fHOAayjzO?i=Z0X}$sx#O> zB=PvPlEI~sA~-ZwKD|f5mej}hwYzwGBl-m)=K*QiR2Iiof4~QqN%K^8KK%yYp_f;I zcf1}Iil`Yd#j-sRS*EQzpzkNtZ|;~GeHIez`>~I2Fxp@+F_+2H+O2+@$=>sKUN^(b zcemxq_Su{ zzPNq@*N@hbkMe0x8zOEjd1;jBvu0O+upnE~c}9?5NRd9sOdxV`p%cT#f#qc$IRCK+PN5i-j#g}ocM6mP$ee0ux-SfmEKdJn5-=z}=^ zd&Elef;vJ8ly>ruRH=DG4HY|exb-Q}VcR*1BZ8Z^yeYOLb`@nu2#)B^2{{B9rb1)h z@c2C&c$exf!Av$BD!gPa!N&Iv(SF}uw1v$rVz|v{X|9?un1bdZ!D~gwkKBLW3EZZ; z`yrow>m#vA#Jz`Ws-k1>>K|tIXub?>c>%C-fAB2gi$|NE%?rW(2Yj6Lb+_uM^*+r+ zJ9TBW&vzWXAr)M#xmW&hiWT+2&L+N^VVY$6g^Oe(>D+tSSXd0YJ-BVzT_i(vh=@K) zz02+o-OAK*;|ik(`iGl2zZ-dMH);jF4>)})L&o1u|EK8>c13#yv~;nTP3}xg8+P+y zO5BUvcMR|JQCyH0k&BaGy?>j>Ir?o=>GPw5kI^5WbjWsy{Smch^GL~8s^vV3`=gqg zpO{anOSC1kb!RIxEiElIt!P$5GuXErFJ_`;sa^S`DIOEQ z`1AlfJT z#nF7+uRv|0e$3X%QzY5R(1~@trA#tkY0`5lYOHV6w5UNF^=-<_wWTr9H%?3&Di3Ko zF+p2Cdm&m>TWr4Vyv@4p@0?Ao)omJC5nrNL?j>KO?x16222OJe+kLU{Y$5(9CF6^_ zyc(yO`n$7lXIW;G)s*8?;!oqJw477CZN^k!y#dz&fv`s~W!PMR)zQ|u!nw&g)3MnR z8`GOxJGbl^p9@UCbw@5u+Gh45txauUj1|q{ndlD3vQ4F>PD|R+G&Fsi@Hek0{X+r92#2m zrpQn0j%G=gCn9vG&AZ2|7`*9`FR3h1>FMGTC_8EG+&2-UCtVZ__VnuWon1K^F`1Jb z@K5wgKQyD4rms{_?B_L#0#>6u5rzoy@tvamB6N!HaLhK{R%2I1J31X23GIOW3TkWr z%`s_{-fa;<&5>5~#bcBf#jw;ofB1gGfgjADig;Tk2V-feYr*=&Ib6T&e=+axRl1rZ#5U+?NF+Fu>vBG~Mj( z>F45ScREfEC0BcC_L!N0u9^E_^j1GZ9s}=d_9&JH?ro2HA8)s#{nQ_+qrzqOfM|~| zCU?gf)MGN~q5LO`=JMuh^X-1=e*S?fVamUE-v4|b`ziEO!KbMF5;gVs%EwHPZ^oPH z?Qv6Zi*hU0h1t7iO^VOC`Y!KCdzEiI&+u}p{58MR%(dY(ureV1ElN{UVKEcw+&Tr^!6;e6mc4B?IUkrk#HcTXd11TqrlZ*E^jc$i7FLaMO~)F_P~yCNgXuxxP-?oDW<%ySV|5Mt6R&R;o1GU7uG_`;o6qskWhN zW+&z7gP#jp)OxB7 z>#mPk^yk<)^-CqC^Ya@cn;zMAA`|lyO?W~q*6K^WCod*HmCaFprZl{Fbbb3kF(@}6 zH-B%J5hE%c(sB9pvIbaznymoB>Gz}f=%w!`(}!4eTY%5FHnN`u>sD%8EgJl>thFI> z3wLbKj0tAKCOIdrC!e@Q%}TBbDV7G^^UqP?+U+UMpHBA3}i$c6o zSVNb-EA4WPn45CD_>tLk)kTeCp^}dArNdkv)a`9Rpf7wyjm!*^FSOtxODHn)Acptdy-0%=TwA^*2!EoL%Iwhbd5L;7i!{Ul`)$C@8MPv!c zzV^|@+V*mfm4xZ_jh_`o&UT`!hHNvo&?$)hJ(sZ=vkm(!loVU=^`8$*Hyxx?GmH4o z&1F1#QDZgzpYh^0UnOGY1D!o8o2$~a*tHl$$W%61Vq1_?vapK@Dmasa8!58IJvs>0 zhh}JkVmcO^!Qc~%PFW;u16zlI`^RD5oGwSHOsgoxin1lk2?pw3rK3SHl;F#6A0`FfeeYTt^d zbtV{i!Fql5RY;}ep4a1yQ9}ZS`&!y$ORl^G3AO~qjx-8sqEmXYlp?+~51#C0`;}u@ z?}G^#N8aX(S~n26-!>?_PvCe;BrrzTc}6rnX;6T>=k&9z-}t%EtcA54cOvF9L0i*} zJbsm{!zSfOX03+ z;zd9}_vEkd4K>}zdjtf8q)z(A-o~05QZ^u0zPGj@YdbzaS9knqyfN%2g@1Lm^M1?j z=j!6-CFLjk=pQ4b@b7;$^FLz$#}IFz>?31M9d<>KryaW}p9r78BLF2kJG+dht-X}) zOXdFt$N!Rj=mLjUXYU;DK4bNb&axq1EfvG51v|Eq^z zkWYaB-+_5M+5ca_{_6QJuz#HEzm}8vYceSvCqFwElb24ec5YtytpS7tB}8QYvChAA z{qLRr6R7b&feMHU{4?l3b^R0QUwe_#_H?qtqvxF4f9ZGw2kNCDc!Hxg)P^AwY*z&wb9Y#P%&i?K{J(37Q16Yaw)0}@TJNEjW ze2|p2*VDfEGfj6+Ei8J`U#oox$un!@_@qqVMFTC~p^QtGG~q z_&Wy+4aoXC6#ajIRpX9daGbtb7wdINa9ub!&xq`k{6Qst_yi%hkbW-pK6O`&sE?48z>2#Adfpo7BsE2 zQJgtWiEW+!(LFnF%B&RCc=R`@bek1Vc>uGGcIMY*TJhdE5aPnP|Iy!31G;>8Mtrxh z+6l28p$8JV{Cf6xpkC18#rHE}0FLeFk#o_o=P~5?JG;!l%O`tAt3|bXA>RU1N0Q6m z(SY)A@MjAR%4h&-%{}5;8Im~E_*;7GE*?yw6deQL&c@Yp^i<5;`Ws}pv541pLC{lk zspVK%KyuyRBHbIjh9KjyYn%((eE<9st3wW{=Kec!orPaZR`y%wMbN^sZPQz#zk~Tp zird9lt`&!~K38Yx(um8>G`G3&ROXlS7j$KeR%VNl^(3Dl^!ANFqCosYViYJ z+1QUqC^E&{_F6M0q|lK3PwXj?On8T(*eH$$a4BNI$1>ZbHhCTD3vdmy+OQdYx1l$D z>nq+~A@wM^nkUiWC>Q28Qp*!_jor_kpQ=rChWAt00Oa#eWjJ4C!Uktcb`e%iComO&zL z^~cNZj=ufrQx`IZ6Kg%cw~WQZ@zO=B{qcGSX&}n~i5=sRgm;*VwLu?02e+uj7xgS) zWtI+w8k#&4`x2G(ma7)46;9A|n3~L!77)CpE^vRQTer+mGuCH-J2#!>`tbe> z?$n_CUkJ-Jq}}nhs3))rFlDV-BWE-F7^689eHLHz$96IFf#idr0jWjv*E0pi%Pn^k zg`ulGNt3tK<7PHS2sS!9KP*4i&IWMIetdY+!7UkZna?cA$P@Y5;LDClf$A?AU3RN3 zx3)W^FG~Lh_6rrj--|RH_W6d#yAZaXL;jXcj{tfL{nxv2jN6u<1zB(Ec%8~tC=uCO zbd6Q783@iHD7X(x5cOLuv`{(o+$kDcO)Hb#wk8d&zr8tI5T7`O)C$6FauB_c(iluj z?x|=(KFBfI)vOHU6)5oUMMS66&OP=&IZH zBJ`BnovQ5KSKSYuY9+tDclwI4GGmp|s#^IAUj?#gFi7!4- z_7PzhIj#mzkA|uJe^JiP%`JF)@ta(35CR9>AqLGe4Q%H7!Lr0&{w9%% z$1MCj$@PRu?6;Ni7t7m@&-JBvO~^?jdmtA(&UiQq8T)CV9&2}PpO=@nT0n0VclSwD z{~khFGM$R?G9gfCoyZ}Jf_O}q9fWKtDFtwlZr*=6{sT1Q(e`T1veftncS<&0Fn5rS z2s$XsT+;R;tKATDE)maZHNLF(@9eoT!<>t1$pg$uyBc*K%tU2j)L6uruJT|wN%3Hz zD*YwAX(#6EqchJ}MB|V~!w+Ge1~Gqh%ilSyn_T=r`My+d%B`!Ic?;WCk5slp8w5g$ zgH3;0uwFTS1%6UJv-W=^q=Or5i4h8!bo0X9RL9U6WO!w@`lV}F)NAr_8_DmwSq+-7 zs?nA;v3_eREEjCgh-&db*nRbO-so&@k#YO*IkV2PG-(L5uu{4%t{mcUkQVX8bjn5g zIb#nZ>qI-aRUavKUb)@fOQ~@)T zZVo6$j+KAAf3L1-ls$E~%;&jSXstW(wswXTuVU+^df_Dl8+l!pOWV z)-kfkd?iw5F?L=N&_|pCX^~LLf;VJ!gN!7q4!>tleG+RM(QOyG+su_1^YTQg+jRKj zb>#=sOBhq`)C%(2cAjA)RW>-U5MmHjD7q&%bm<1%@*haIy-i{seB`WKp-rQYZcbcFVsP z?NnYUenM${kJy>1GlTM4w&<@9X7i_ugTA(}1Gdh@T&CrpCGc}G4er^I951M6o)2= zTIMGB;I169aEViVjO4qs1$s}R(sRx~FQ#dW$j77~EvJu6U>%0D5-lJ!>b}CC<&pEP zX1bA>j}!0z)ey904*diNeJ#@9*AMBG*1=HE0^_c4j*pARZp|>-ggL8d{5+eW8_e+A zNWb|KlH$yrARaj%h*r|Ad1)ybd{AF55{j(~o?%z9Sy}xe9vt5dwR$F=dc2#bumPwj zP4S9~x8!{WH4@BZe{-?D(-bS7=xnEmYYG;)qpBVX;0S5x%EkG{`2#fB0V#QNG5(v+ zMlDazp@pzr(RXY^wZR*AxKyi-gQY{h&rdd%egdW@P~6KVj2z6S`p$K2Q!##v3va#) z)$Ezybd(>ph@c7@+J3lgN!M3j$i{YldAs>=_o95ku*#AHg#g99N|eEk{izx%8Mp6Y z0V7vH4Grdy-NjLO>}r29|B~-XpCDVvGi_Pfj;!OeAdkdnLXIQ2e1m>E00K(yym#JT z)%ta`@J`qQ`!5(WtJ0vXQ08DHe5}^a3-WasgM!SjK1Z-0;%|vHmrcGBUH z9h+EI+43Uz$~ClMGcWpC-=&rPOj-E(_1izT{?>crLyel60xdeZr(HKreoMsj1zo^sn`G#w}gZ1xBW&x8-d8SRbqqnTF=kTirlarL^Ob%ti*nP zxJFmdMS+vCr!uL`QSnNl*svV-b9ZC!pkva_LFL?nfMaKF$_b401DhDNs;ym73+X49 zgm$m)CB$=@{nCo3lmnkJUlu&Q?3noYFTBN|zm!=5EccjKSzs`o4WJqWf)I6Gb_4Iq z%2~^o+0R!ua2f1ZYm-sE>0m3)nOb|_($*nj{{Ydd=L->ojbX?9LD(j9h!aI@&8An% z5Hpb!3Btd>m7k=`f0+aDj_psGjRW(o~ElDZXXf9fvIItCnBy1ZE^ z4zoWSc@xwiq^T6SPHr^1Ojo}N{Z17@odS01J--?oxz(@GEI_>ZI$HsAxZ1n_OCBbJ z*0e$%O=-D0E&MESBrt-o0MGV|Qay(kz?^32p4U~7&mI^M*@9bFtXwbNkmgj1KE>UU z3cmay1Hj)@;@6N61Id0wr5RTfwplR(e*SIVPm#u<8Tx8wqFiN}J$l{n)P)V*^$U zd(hJh(m%4cV;pb*cPpacOCq4fN--9HQ&*8LSpKMJl{va*n|g#E-KHK$UyT+5cWO!6 zjfn%FVF{b-`U@8XYo~~>>k+_cse+wSnO4z-L-Y79EA>H264@}^PYslD>;AhPfVX+n zTI{#JCx@nUTR-3QBin0g2Z)dB>r0KKdfi%w7GR?cb)khg9N4VhWrm64gJu_=TM*CL z%r`1D>EUso$hEM;`zKW&pm7Q|VW$jyE~dV`{w_Up+=V02 zPrzFmOvw#jmUuw(;uES>RO5A@{UkQ-N}8UI`z4gH$`qE0@9<2dlhWNMkiIc1|t zA&!dLd-_vIBXd16z1&2|Y`CITd>3rKSY&0mb2o?|Eri8btYbN#K38d19Z+JuDlA}2 zmd*SXjbug>jKv%t>2eLfz6(t2#c!%=gH^_ zRs=+o@{;5xeIE+c;tH}R`JkR^Bi6j`?2sy(TQUH(2nl!8S>*GLJuq$HtJ$81L7E0K zr5Brh7j~~`0N)fNsr!5GR82$Au3E9zWSPK;7)EjDr$*);%_Y*=mlqh*61}2EbFbsc zyc-axIDD3bsd%x)E;>>TyK5mkv^G(qX9x-g$5~d@AY7Z$?p^rg8;|CBKIT*wbDMw6 z7IW4?v5vYLX}gHTz?t*~f;Ov@Wx|eT;}rFV=*18Pzs}_7d6R}UPY9ra*ag4Q2zpHG zm2#;NVEUNkVxdk2417Se5PX&BUQV_R|rZ zC)@89<@`l0H%D4s+t5K3^I-NaQ}Y&gcN4C_$zQcg#GY#dZZWUnxRKY~335%VJwt5C zzj|x#|EpVmyG7oVWb62rNRCai`0mevZ3f^lBt%?%t9(xMImbAiYdmP(H32eb1P(iA zWDeMaow8p~<3wu+8*!-~D7LGot>Xx+wpj8j&YoS1VDTF~5GGABt7i{`3vHT!!}Hvn z4>m075x5-ICn8KC6EhMHYAW%U;A?NUe zp?cBX!OX3T$}&E1eaZH~9BpV;q&g4Xw>#^`os`7lG8=Mc)M|KBz*M%*XAz8n{ss(? zTwFCavl*ywV5RYjP{4Qi{6?X|uxz2Au0+5jO8PCFrUI4R$mr$B5leAXtl!4|!I$El zYo@$SOgC*dpPJ|SxwNm{@gKFMxtqWD-KKq-;Rv_b#t534s%}fL$5!CMQH;;d%;Uwh z7@Lmwi9$2om|S~?2gs&ea}$p10B^GkY-gq8rg(pa+Jf&gkY%Uy?km`k)`nwPPrGE8 zc7MB@=t>M!-7DT#*1W)CZc3}#6q1B89+H}Bgj*LCBJ?-1L!`Q1VbRD&*Yv5eDhyg^ zwK@0TSbWi>OeE#*k4G%KrzmYT{Ct~7)AV@Pb8Yey z;`)zzRoa_V1GOP=j~Blm@s_kti{SB8p&R8qiE<(ozpJ|DbM zvokhk7zXK6WUB=egB{_o>#h*Y=v9FKMJBdv)gE!IBxgF&Nj*`vaEyS6dAeuoH8>koI2bbtIHrm? zIgf;%W8m4F`UM!<8tcxCvp1Ytsc&ymE3?J_COJ%bPHhr4^CaIj_{t~r7y!ZO*E`-B z&3#bofMr%zVDi0ecz#WzfC<_;n{W0?jbQhwFc~!TIOtG=7_@N>qB(OXitMnz(k|k0&CmqQPL%) zAwse}7{1h_#Zvp{pD-qs3V~pL7b^BSh4Vioe;{T+9VcX;g&}AH$+6MD>R?LjVtji* zl5|!XGPWocm^GPh*;HoKTy3sf`R;NbV;RrQZn~bLL6CjfqE(*^%F$i;tQ2AsAN>+C z#V@3w!Yfs!1o<{+x3bIOiG#w;ZrEBB%Gw>z`eeIaeCewO;gV?84)SY~gE2E$z=vof3+psN$lkaDZ3)vl26g?6Ar8m&7!gQBi*VhF?oUa{u>xWHpM_%macYMn}N*^CoA-W z4Rgccq@w)XMkBU2ra=qoaLuj{TEn>K@mX#Ul@7_Mr>bV0BVygjwlJ{E7B=Wyqvjyi zWqj#R)`{BUaKeOBtajD#Z(dEFf_%!@pq-_9vC^kN#w8H@Xy^R zCj)nB2f$=o4WZi0fs*CQ;sT}A+Pt@D*#n(Z&H94Kbk}!$tX5~Q885D#oPG|}jL0?0@W zB8suaNQy+~e-nk{h%=A7_K!D}N|_iA6+nwjrBO@GD~$_+UCf6lNwu$S%J6P#+F4U+ z$9HDwI~&ASPz#e^Ci@Lr%N4RG4YyDRR#GCbF2xTG3dOzUXdNe6Oa5|WkLkd^w+`Q* zv`i&nO_h=Oz~1+F7G1bTwTQs8WFKlNOYqmgR$Qi06XH#MFz0n^C*@BdKX{OQiBIKA zx=R(P8_%`LR}ie#vdD{(r8AzwrWR`Py|gWZGTAe3t{5o?4&G&ege*?Z0#r*;eEt7-&D0Q+tVE)B44b~ zPQ%vH=iHW)?zo4kn?c!iV0qRqKBTXGJ0N*EtR5}K=m&8Q+~A`UX`L;~UDep6y4un7 zDHtxcvMZptM)|Go%EJIO0ccZFY`JS@m8i}2cUXmwoNO}N!2bEgW(){a_G@HLWw5Ey zUC?wWg!+{#Bpv@-pOz`kpbCT=g8LmS1cTg)sO{*+~_9`kuP_@eN z!_6m!HxT~d?*y4xgDj?l`bE4K6qNMbM5FD{KelE>?(E15(r^g#(7R+a{h4ETxE>rn zctX9PDSxz{?p7Ukje#8&>X-bP8F_OG{Jx`EU|5lM&`Kcy!7}@bsiqX`HrEE)*Ao4R zhKe^snq@0|Vjo=BstkufGB2R^gX*i+2uZCBkr~+RM*YdIZxI?ZTTs{SJNsh^;a|5l zszUmabkxV(hXo|7GfGf!64=x~X18DQW9LkMvE3@D7Zis?YDbE?(=g-=j~;Ca?@Zpg zLTAFb>3nj`(lzLs-f*+rKBf+ zadA3}gqT3$txcmzop3V&JvPTx6tFX&+>_J#Xj#^VLIu43_JN%^hUBTZ0`;hn&aaN@ zpOtB1fKbO+5Aari63N*JF^=vQh)qBhgX9{iFFY{hpbCV$686jjr}@$V!8vM5RX2ip z>yk0mM!mOaC#LdX9~Kk>EDB@Dc39DA*C7r4R^i2_BJsbzTL7i-9fq@?udXwUwEZl0 z%VgYiV^Oj-(PDQ;SaFOW5eGIex`;EU4zn+G%|=N%(-ME-{cNes#_+=skQ95`U>o1b zVNQ%>{p(Puqx|VFEzy?{uBthY4p^U!X&u86qu?;*7;wpOd;uCGE7sa(ztbf(`TIdJ zA_smo_l;4Ds%x&mKU4Q4e;UrisK4m-bPKM=e+J6-sq%?T27#7{w|p$K8#X{?AQ(^z zWAXdg?FVY|-B0`Ak-UxXH+;ZbW;VRWcp61-VcRo$V9d%Z_Y`pIM;_FTDaMl+AMJ)gG7sW(ik6-ZS|y&I7JTg zTeEdj7ANRM{zRS&?fqPZ4QljUGk9ORLUxQy7NA2aclNmCs;<0KzX*mvFmtOb+JHK-(V8jI3MhOG zim2!%?M4TIT52Li@4Xue5qE2mxfqCNB|Y&y!P>@4A^Fz&6XVa1W%YJ9e@5Ns=}{zN zjf?c=?9uJ@u@coOW1yMG{x%YwU7597C&r*r6D7P-N5763_AB!22U57x&gI6U3(FA` z*L52M4O+*Lc-NdDp_M_D0IBb21P8MH*)-}h2z8sb+eZ6U&2P2tp9f9a&Pn{IK9#mY zA^YYR7%2wHZ6Al}_Y|B#A(43R!T~KQXWdbzMx8pIIP-RBhphs)Vgs5e_Xk3B?T4d6 zNHa((DT1^`U0cDU8^}zSc1X~V^~2Snx5x8x_@w3PAR2z`{^N^^?7tBkWjbUI##!SpwM?Ny^4YUft;blLO`EshI|C@e}Kq3+70rNAfmD^ z+p-^THyn=yntZ)IfpQ9f0@sN!x=p%oxvidS*TS~vQUu#!(X;b!2)EO&Eg?W4KjdOw z6jz=J-f7b6)szkQ>;zX2RLurI;$qg1vOy|FxH-)i$*>PS9knM`a)>QPf`(t~_3 zw$eAd`-4-3vVQ!aFR>>TuVgw$f6E!8c91Mj@4fyJY^_3F}cPoKFj6@lIr5}=wk8x z;iywc$@y_+4P*%AyQ^E{XE_=Rb>w(581Ob044=I0iZC53Md}Q5q@aUv6!!~0L=479QVXsl_O<<3mJ+=z#iB?3t? zQTFT7D&$a_`W#>3@N&Fru0SQ$?X5bQ8;+#C^1{!>rIw1}==y{1&y+4I-yF-jyUfzQ z8lG#f(kFIvGmJdv@O2xL6cea3)a~16ha1@Dx%ELa8OHaUqLHS5G>D$^zLt!?RuY@| z88*}EG9zTze%IC8<9xtrYaFWuZ2B?o0RSVGdA>oq7E&Lz@KDraM2reQOjVdhWx}lg z3UTkz#-0Ujw8VZ*J1b_Mc`SBGwIn&U}x*GxI*$qQu5Sn3ss#!}=zzd+MgXY_-9JPgVTp?r7PC|UZ ztd>&+@9^=2ymCQ4*XH>jsDJppl*)(yr?JN0NTp|;xbwj1JhJw z+m`y%9fd83u3;{0V3i;PK&1VhJ?E%XQ0(v5cz$)yNQY7r9=pZd5<*iCu>qKIWM-xo zrk>mrRX-2<;;1bK^0%ujVQG$1U|xJ)WsiKqYHpR0OQLdXY!1Bnh`;r;#XM*-(eRC6 zLO8Eg>+hKs|2q32?`qoQiQ?s&tzY4h`Kn)kv-a<#zWDIR>~Q8Vv{gOjIe9?lNy<7c zm*zfGu@%0&XH;a#cWb`nyKL$oj9!seZ>a&Ur@yL&&XeVMdy2v-yPqGpQ*(t+oW)a} z2JE)891Hz=gGVY#E;NjPJis{3$F zpKi4STSyPL*!@`s-&trHc0SF);Ie1qx={?ZO;j7;lO2<_O~GOK^AB~w+yAB*l#loZ z)fg$|SlKUn`&;f*DIYj=tj3P=C*`jegU2}K{B2l-TRnIqExUq28c ziBY{W3k^V@ogpHKbgMkymNhlFm6jkEU^WerEfzZjb+Q+`>xEn zYi~5H>5yUmcOl#m3{#>&a0}KG0ss$n478pIT|jfnu!qP^V=f(B?=a3}1u-`_vp73$ z$z(pg^$WcQrS6iWInS^aq>|Cq-C^zii5a(g9$&=@HLO<=ePWpt>g4`tJ$pkm#YOzq z0d_7AF3lJRhXysg3p7n8J<`*&{}G|-=W|Ip8e5fz`9hk$FeB@m#tu&k^S=adM+@Py z(0`dDeh6UE27ksP?qVH-)n}r)b?s7;__YISDg6UeRuheFL>@XBRAD`Si)J6WeJHcv zmUJLgih6vlx-*~npo6NLf<-p%G?}8JO7-nxsMCdU;xmJKuJG$hd{&i9r%FK*>@=E} zx_OGMvmdOX10idb+UikJ4+fCn?s+Z4u6%@Awr?X15T6vO~}M)Z&vgGxbh& zskq@ZEjKGGR70o|wNa^;)tnzckA88EU7>;zFWG<&<)dE?Y}LL}WVlgFoH%ks@vmeY zYI89}t{0ROJpTieDcq9l5F5vousM|WLQUN;p7fdQD=2klMSHn%&6s2cHE;x}-9C)k;HRpYbMLX8d;|dTmD^{ zdT7E;$9Dr(anIKp&KLE<-J}d#NCQOT()p7e_9ipkOo6Gb5>qARj@M5eq(t(re&wSgeu@sSC;u(=_MvzdR0Au%|a|ZF! zbNUUs)xcqFY6!ZzQfV-tRmRAk3dqrXd5dKUpp~njm1G zP%`tG)sBVLw!y2<{t`Uqv?nlpng!I4e83~x3KVwmggY7EDc;c{k2s&TFWXWAB~wyR zF)86$L>_DjEg$4;AtD?xNx**pehki4Zv=wEe3I6& zn!JV0p|TXis0C8Pcn*&PBT)-`fF%3uky^gD#x$5?sgRz@cU`b+n{gf0NUG7in6#r| zvO(Y1W44OD_SO%raJ32%K}>9H?wI8Hzf9|S551pR@se#a-Z6M<|J zer-0`Rl@PKyV4W7)AuhIp$K7}Dj%3&!24T)fz=uwF@u$%NH8*J@qAN^QN#_=*dR*! zQ|scH)JcOy5}(C7F>c2$H<(SrU0}lE(hajzo6uv>PjflR!!H%Nwsby~8oM2q=@CHvpz!+q%lJf(Mr5GW9jF*i9 zzx_X~MY&x-M1@z9&#rf-FiYS2OlKZFsVkCxmYk+xJxmOB=TenmL=X)ceJnk7D>*Jr z$Zp%)0UXrYAgEbp$h$hTVOgC7Jipk8ka0~aLbKUzyA|boYJH^mR~vvJ^dp_4TbC@` zS^F~-bN0nHzyI0^siAX#6<3ALBVb<;FQX$>fsv;Jt@)VzRlZzf51O~ECv0+`rDIn7 zfH@LL?YJdqt@)vSlhTSA`OV-R%9NM6c zpgB8KLwgD?ucYZ%uSI_B&>~%+wb_(@kZm#NjoOP>Ar@l6?!vvhlgrL?fMM#m09))~ z4h$_y@)JDjHCeMGoQk`@HyR$`K0Isqb04C?zt=RlN07!BG@y;jw?d6XoE-z)lvDW) zB$D+-x&Mf!s|d$y0UDH;S{!g52z z$80RaqKU`WBA&Z=Oydy}ek&T8B z96$}Q)}LH=qPZ2)6{|g<948C$eZ69UEB7rOk03f{&G&hYJ#v2hbqev~>R)}cwhxbV zDjnUN5CQ<>N|+cr2ZlWc#s!aXsoSotpMEhGw}O1da^BcT=OjkgI~>*7B%91RmmW&p zm#rIhrg_cMZPIV1cNZ7aZyL9kZDqLo?XQ5pid;ovitQK-#W(wXk&iLoCt1(K;bnMW zYt)H8>@bGppi&Kswn&?Jw)}jSKC?FD(C3)|?QETSG?K{bS7-dXOoPgg+2-!*s-V}G z?zL&(=8d)?=qC%PhO?<4AF`u*GB_Qqv7&IJ2Aq1ZVVHgF4-)qsBE=}>h0c!B;%br* zl@CIKrD$oHvIDHfzd{^d3E=9V3e$nqb&~-!$($3p2tQ?U@B5iStL;i-t2JAm!*i`T zs)=2MPh@Y@8}VYlpfS0FIl1L%ie{~?mW&C(t?smC=AD`eJ+C|3X(H(Jp#siLki+~( zHpcHi?oUrGHDZf`euI($7x1c2G>)idV5}E!zt|2q;Jew)yVu{h4t!d`R!__^5zyUd zg^_TJ9dLUV0_5tF*Z$)4*=YAlWa-nSk)=*pj3su!PI^8%PzxiQQD65)V*A*?TEsM^ zapCs(W`2oSwS2Q@)~}jWx#1);w^qSDErm)SG7izb6!X1T;Z4^8OXt$7%bSi41`6?v z3szeb`%~Pu#2^=S5`j>r^gUaS>^;f%-W<`Qy!R1z^JCqJsK+7^ z(aZ7o&}dSlba5bOvZd*GpS%uIM!euv;ytR5&Z8@`*ByGh7KB>alIgV*OJp>hjhB7d za{DT>OTQkyDG+2^Fn#RIK;ZL;My_9;?VWT}uloeLlJ-qKuLJMc8rcEAMeIznpZ z@yQjQxRZ$u^|jogWMkNpXiCE>{K^w24L5_jh|5-kfQB;=?BheFgSF}t1oCJ&z5K>` z)kh;q|xyAP%i3{@KXvX|TqG%tU)QDRYGy70;OUu?w`0JzD-9WEUnIIb$osSzR!`hNd&h|7Sre?CyN#3t-|mO&+w>%qaA)k)zExZIh4 zrYQBPX5q53Z~T_m@s#3Jv$HmYw@FmHMJ^yHd)Shn@$psgvi&G~88vT?2{AJJy2{7g ziVTYTxjlwEUbHP~#>NKj70K9DzJ{y;_g;^G9~Pz(uXl{PkXOQ8`59N8d$#v`Rn%|B z2G^^$vP|grrIB*rqwL^AmU!1Cr^D6~wO7%ti{}}D5FjkU@ZqeV{qL~Bsp|mC(Cfjo zZwFG|FWgYUTIV)p=00j3K)5nJePWt@rr7g7 zBQnLGrEgZ#S*3Q#opU=e3T+-%&2Sz`24Ajp8v0UV0VhY3$qCiSRDKP`s79*36lGbG z@{|=rVV6$5Z2m*2l~X*oLJ0U6eAVB~RK7U+yzAG{({Ez|=)+eS5dOb!yjj%U{h89q z_kT3#wQGyRblUF}BlJ<@h1%fC9GhZzy7^tVp(HN;xt+NVV6~Kt+t;L z@_F%kMO!%2@}xVK4NFdFwb&57cxd@1fEgNol;*L_K&wB=dYUViw+FdhXFa^zVQ3NB zcxc&V<6vD@{ARZad%fY=8n0%D58C)V_hHe4z4&knzsF~Bo;>-n0{}lk&(6j_3~}gX zW_t|qc*bWzc)Uw{wA%@XV6z^F24GK?)3UZ-LD-6is^Di@5v>9*J=Zk`I_@}LB$P}0 z3u)Clti<*wOxMu-oBEF^`TDII<{@1HZR)f2{X)+wirYYEd#Z`;ZllpR7-8|r{dCqv z1mHx7Y7fXh%*W_`U{EP?!_nu)*Y~psJ+0S{uy&uj8uPd0$%$hZ`e)YcZC4dZP zNU61jGc!yA79oiA`~77={D6T@AQY0foW-iO4g}(S@>~WX>xi?3#9{ zM6^yoWHNuM^v?E^>auU?<(Q4S@Pfl|3l8vTemZ-Tg6><#1E!%V^=Y%?in0*S?&lVg zCo7T~(VPYXm+-z^l>zvjj?b&h-QM{q`)3wO4DWz)4&S0!LCQhWEJ}`AgNzPxY=V@j z*JC1%Zm&%ngjP5&CHWBNJ*CadokX{LS_hmLojMmTiUodTiw2#ct{#>1Z9c#nB`Pcn zPPat*?$fO_nGzB39ORlgd;MKfWB&n&S~w`85;g@QLun62y&dZg$tK!hlPj&#?)cwx z?uV38b%~z7p0eABwF>)h*4@efRHqc+CZ8+=Or1X z=ZgTuYKICDT;I_JD=;o@SaGhU?*0&XgX{=r({^HN@L4g2RKMODS!-BnJrbZZYij>t zp(|q{y^s>&I`BC-dS;C|$gOUeckeT??M)Os(=-OmY4kz|L--V^vcghx|Nwec6cH|B-b0ou)#tp?cG6`8}2v(WT}8Y&FB9_ut# z(=+SYuk@x&B{)S=UctH8+U1v!MBqg- zl%V~0jZ2O+q4$tU_{|&f7H;w0pyGViopCc}B2#m6m&Fq~J%Xiwt}c91*e6&kf# zOdjJQT1Z#va&N2w8-%Cl*t6)Hk@QZM5ZF53Yg(CoLpIrA%@=jJ8>z=5BY}h-kTrxF zG=XDBL(MU`^-7xKCBhT>W&9umFPvm=XL!-5S=86TjH9$3rU{XUW|GFIn-)BxEg-BI zsMmE(pq+RfCS^eHsKu#t0#-2qi9havN>ycp_ttnu)mW1;*wYb|Z?I5|^LKw~b$0Y|ngi>o9f0q|7OZoqAua-`6O7XD_Hh zT@#0u-k%zYV4b#h>s6miEO?jxC7>A!^n(H&mb|ZPw7t>bpZ5Ox zY{z_j+Cqic{hHsk0D@xPOH0?dUe=Z;KaP_o1p2ipX4L1;Dz!^*f@78*6R?3~rK;kky$q)sRpnss_<61OeoR_D$smFDc_0UlFX%Rw z>4Z%AgrDHtPXAdTN|m6gZ6v;tjSk+oPkomt+qkz|hN&DgNp)W$H`kCFkx6%GlVT$z zNo-Vn7!SLhrXze8%htul6ctvIAPkAs9R{d=YHF=`3gvN=U-mf>uqmNogF8jq`IUY! zRt`DWcu`xXZ9Q{wvKDc}xaPC*?&`f$9hXnZFCyRc`f~|?8=2U?jUOr9H(8%obxJ7` zM4jJxcZafRVVg#s_8;t+|8_&gW~REgtt0CNX?y&e#qeA79YV;2+ejBqr_5MCnuEMc zx>Fm$EoEAcMwLi7(+bUL2&FKlzV#V^!c}MDT4yMQ9cM;C!+J)VGh5IlhPUz0Q#OAL z_FAvTuk|J{L@&@pJM)U7z*_$XbHFSMu_>?{ zQ3fr;SVuDj-sf(hfgQ;m?@CH}QD|pxe}Iv3AN$1o3$z&^Z2CD>?GjlA%Ax#@Dbw*R zok_RviH>qcT_87|2zE}8D7k0Ryfb$(-N~pot@{Gh6i2iB~ zzFlCnd#DZxFD$TgT^x!ym@!%Do$js~0?)Q)@|)|;kZm*@utG+uq81*O4htHD8eTm< zUlq_*FmI9CV-Bgn`(ZvNE?P2jGu#i2hv;y#tCBDfvM9U)~uy>(-Lt1Dw!<_RqL_B0bhm|DM|X_qUwvSnVN zQvM9LH?@OvO`>!dS~{yFOhRmkj^<&61$_OTeDXNCu+4XTf2N>~#q9))j^iPchC<9m zN@6QVXq1V&{h7lU-woKMDO)AR}nsyIPdU#+}p>6ooaFf)grYoO6(pmsYuHj!@~K2OPemlL?0 zWc~(p<7gc~62AXbJ3S^xX@Jk|{X#Yd{!xpI)3j4uEFy&Rsy>v|RI0uZwLMqAj1B%^ zWC#Rqw$hD^zQolZb+wpa%9qhBdh+<|nb1>hqlgY~u5rjATn5V-x&EFL7cGt~k++5p zQ1))LSr&XD##-F?C$>4woK zOwpI}!TrqGzJ|LC6LrqG`4>EN{ z3l8c{XVyJnNX|Z3W7h=P>mC48Cp2@Tf;Cei-A8ji+Bi4l9E9$fy&XEcv|(?q{ErvK zcbBLdM9s-6AlH}lD7}0>K7xGYfr%Xmm}*nO<4EC@Jo3AT!DmB`@HA-iX{KIJjWg{G zrRR=Km-0Bor7{c^zrDY-8as0`%XhJ_=U5zW`-hrF*CT&g=&g0MGLM>zuAnTMQc)Mq z;39@oxWH)r`6~waw+XKH>9vNKWf7S;&qDC5f(AolH4n3&^F0eF8@vnw2r}x0QCxWn zA>Z~-L%qK70&MbBahIXKrDC|S{UevA%ECKj(&>^V_gOwal0$uHQAm_YftP(rNT^Ho z)$c|}YmntTp8Zd^2#B?I=R_+c=xB;OO|lU{zQ&hsfLB{iF=uQHc$XR1u1;Sun->FW zMCC^Y7xb$i`PrU4>UHVMTh@2;-Dw@AMxLeJUVblSA!ox50JL7u$8=u->V#3qc4&WF z-u>9X5G?^Ed^4n$-|!8Hm(iQYHzR}sb^4ZD5Yn4V=#JMYq-?5QCsitN#$OPfetB$D zTYuhClJysQ#Q{3Dnr95nqX|gJ4uF!(w4g!;>o0N)i8=%)<&mA zo-fxtcyLS)azvhox4Wr2+wtkpqU4V@m`zjSm5d=Uww_GDSI$K3XKn}?i+heZ_F7X% z@jb`jj7%JktE0jM?(HV0zFAtep^@S^g6Pj%Patn?@O)lHE7`5-*#;D!i~4oUa4u{;Xcos z7Pt1eZdt^CHT$zd>B;=QQv1QaljjP`kYbm1x7u=I9Dl6f?u#2HVpE(TK!Ev_xs#>!ZC zwZS?V)TVp?-c&v%zxGaRN$|IiVM>tX9S5(hPQF0-M=lLG zgTiC7w4RJ|&w1~h2a!vBk+i*@D*uh(cdSAa9U>d^GM$smJCqeRa zbkv8-wUF_cT3g*cv%H7gB~ep5xw>X-EQeTcvqE$zJkk#20`1;x209pv7R?|4kf(SHwKC&qBXHl=5g!nUxv5*y z9Qys1O)~@u$1RUlb#{s{y&G|!4V_IznL!rn?WQ$40HSEvDdkS{&ZN#9CG|T#u47e= zjDc7}Wml%Z{pfLn)1#Rf@L1|u^TC3JUYPb%OUtX$+poKJ{Sze!&B%FS`bEILsODkRo>__C9RVi;4KA})&eHc9iEeH#nT? zbxS7N`V)5MIudJb_k!@7GrzY49XZLU`Ek~PI!(vHhuNvtRkpog$D_}NOE9;|laOAs z^^pmp^hUd80*LB0+PCoI%|~sMkK5pSYBh&}=}1GYb)#jQ))pCaxaZ*sA805y&o%PW zOOa$}4Cit^=yU_VXMg=uUs9Y3if^LMHR&aK?^2`3+`38rG%d}wNwGC( ztF{ePKN)CQ#eV9JkBSW+q^?wFG7pKVT=G;-xs|fMBVTCs{;9Vp9fER!wfpJAX14)s zgq4rA#Q(CUep^^ErGO-i)f>@P29AUbQTyk2_LeuQyl|q?;R7G?f_7QBAkeR3+G=mk zX39?PITOL)>iMhdQ<9c|(w*;PrURtg0H7rU!W@kg&XDOSifz#(I$)!1LK(=V+fCHw zu`z8Q&kIIR+&ebpD2sGKC~0NhwzuZ$ z^Jm&cgwmS2%)}=`L06eaFHBgB)F{oEkTGs4q8u@QEct zvf`vXZTz41DWq)8>N&y`CLE+Ul3vM*phc3|bY6uhc=Oe3L7W`ne!lh-1@9oBZ#7Yt zaDjcSDAU*yIF` zyUHTzj{nSH>%<1Z6-lE(NEg{#4BT~0oFhp9(jDT;nz%J^^_WV}g)ytnDEhOWH*juepGbW@Y}`(n3j47d`%@Mp zs69<);qdzp)_bW({Y-fSmFGc;XHr^)Z2K#Yi?9ZSXE zTAb54&xj!(?v;K<`WGxefe)C;4g#x4;r_9}jVZr{W@#_Gq4BdX6t<>KcyVJrU z70ScaKceF_j6^$)2E}53PLAnOx-^h;BGEKt8;|f&#dMB{uWYUVNPr%BYK3MT$MYNN z`LxFihTWg*5|*m6mMGp43-f*)>V^Dp^MVGX6Yq9VTJJ;uEPvUJLrof-;(g(ACqC$f z{Eex&$oN9`AzZoFpe`nTvPLA2`H3Zv2Y(AZ*H_schTN?3T>6QVEzpE}&ks6YLNK-_ ziP}$uv-UWWOQWOSyp!FD&cl4~Et$2Fh-_b<@3EI~>H9y0f9%f|^%|7{W{-r5ziA!0j9`NQTG zTRM!+p7qgnH#4&_*{7{r#h;9R+9kO|S{c$;F`&i=iNZVTT4|NITD=m3VNwq9%F1|c zrB2DtXr$7=xP!lvNb@_IXOtypxOXhB-pE@@6jIxEFy&|Z&|??^B-39PAHg%=g}wfN zV+Mh@>i%nm)I3x@yi5hl7grr107-QHyZQNjriA@M#F>UlT-L&jnM={%c*G9;1)b*4 zCvplAKQ(0AlW|W?ZtT%|ZNq0dKJ5Q-kH6iwX$74E#5uVYJB7$G&!qz|jT4eI#}7UUlx#OWeVcBUjhj;+qLt@KRQ>(lf4|d^-;THz}CcypYVJe0pUg}U-x#5?Ozn|id z*ZS8_uO9-!L}vmlZwvi-9)CSLBtiht{j;1lEdLJ_IC<{^0(Z)bk>6{6J<%`25G?>q zdW64u<9{F|7;=<__aRTV!`v{r64&r`1yUuetccApL(d7ct(%{mbkd z9S#41@dV0#4|(yK^oN!%ucF-4{sX_ruE#sru3Ok^)8{x_^~W;)-#@*+eXzACy20cV z<6qPt|9n9!E5QA*ZxKA4|NPBg#3E<-0rxZG!pQ#@8dQJ&c}y(eer$grI&1%fQQZHj zG5Z>EHU0Ge?d=sFumUo+u|#3atG@}C|L1N_y94g$G9l6J?tgH5>_&k5d4NKga{dRS z_zXz8{&$l9QD^<{B>x_W9{vBzo6PI@0Cl^Z>DM?)#W7?Gk~_G4dMNsj<)iTV*g26@ zkuM9Bv1OW7YurjzkZsN947s$KfYCF6(&^XKtMPi*Q?$p2L;xsT$py+iD{23?g>uX9 z^?sEMV~cpkuvBf^dws0hy3wLsN=R7TaYQ3dO01n{@Kd7n?=duR+S|@|Bf@f{)z#?8 z6BMp@Av_|9!S!5P;kvn6hdv2Etknqm2@uyQP$5(dYi7wgCFuQXc-V4)tNo-`LWMu$ zPqj(#$ohP8Sd0A^0 z^Tljm(*@%71TwTyyXNsjhKUd9yAxU-sQzVgCUE9+ws2KYY3))IlL4gCFEh9dw}Hqe|H#wvi}D7!y(Du z^ml{v_Y}Vcvh*z&!YpHlM+%>9JoqC{_^VIf?wskX;F}$Q@k@pep15W~E;`kq zaEVzZ><> zd*XfeEDF!{YSHG|<%(k=q|=-75Z{CR`ecyX?!iQY4URxKd;0W2)h`N_EQ)%&p)Zf| zFU3+W4fa&3k* zBff{QbB5uTe|B>JT=xI?BIeWKa=Dt6PY0#;tS-hphFQ{)+h;s<{)!6mr{@upa0zg& z`KI-M{V2drv1p-1-@ zm;KX|=gt2)3IW5^jr)K4<}dzKVFmnf{1@x2v;V;;1eAbLs5K6x^Zy5axau?z4cri> zfA<$FBk*vdliU>;4fWBtz;S7#nDag+`(LN*LoM6a)LUgkQIgW%Y+Mw$s$!-ZFa6F}a{R!PnVgJi+>cco18w;39rOgaw|k#-CJ%#_<@iF|$|YofoO&=`WI$w$otF|5e+-w`vNyP@*HkYcICsq2*JkbQ zzpl#uqeH^+%F@Z;b?+|6kEWR)wiuW%OnYwD?B0Zi-?$ZN3s(}zln=LicISN@zX^j0 zj9(K@{T`3$Tou6Q8Vf0IFiabEa^}hVQ*zQ}gZndWpZoYQNnU43)%UR06k!Sf(eO&S zaUa3=FnAAsP~w*-7jo`K1+~xK-)Zqq`%~^AZ(nkzxx>J?h(rj4dPg#zVbSqjk7dxM zfFW(uhCzbkOo>n~bai1``DQZ=lCiVLMt*VMXeF2yU8DAGLmSR&=`G z*5?GPoH{Q~95;Y`a^S7H`+Zrb)=F3)QzX1s^(B|o<#;xtIP$HSI^H;BC%6IlKW(RR zPg9#R#`yPNJXJHQ{Bw+7`eTf;(zi_Id`(#T753Vz*{s%DLq#t(7d8tI;(aWKA95B2 z2YkLORZPdUF}DB<>f+j{mxNVt7Mv^A`z>8*ZzG3#n>Ff_wQHuvS|7(-w(awECc+b{tkuk@3V_73=2=a{@ydHL zsw-;z91}-ohl&T+J!lx~xsG9-daW{*kZm)BZ|CbX=4}mW6D}(;Rw3I0y88)$RDH*f zb~L|zR?u|w;VM_!!NzR&d+qW3IU#BhH*frALsUdVW(!4BXfzYPY78NKJ-K(%*r*94 zWFH#c^qgTyKBWfCq2I;k6|&7jmuK>(q*(OpU7}c<{4vi1UQc*XJ+8t%izjRbdZh#GtFiWpdp|c>3uni{D_$DY3liOP+coZYI`7?$bsFqA ze4m;d5|}|4C`$eTD&8zC8x@rA8J%%*G56jvkT^cpgrlD7K00r8b=9aJz>V0Qw0|1) zsM~7nwsjR_>4d)?ie_7#j`ka?HTY4#bc?*ygC#!4*XjKBTn{+X|E?RmSppTP?O?CwW=c>p`l%P|T42sm)o<^xH~7 z91`Q1%0L$_muV#IrGEgQL5Z-8>v3K@`hs*=CYmIrWEsFRPc>yT@F_elDX%iU-L zF&j7&Gt&^D)v-sD6uR^fJS~2E6XnX>9wVINUc^vYJ3VeO|K|IKrsWGUpNZ|c^>$=8 zw6{%m@&!Z3sS7fKNR8Az4!%XWa6RY-pT7E!stG*2>TtC`0Ez3Q)$a=h($Si<78t(# zFp8JDM;lovn}An0E7fmp<63p{{j`X8pt+F&+>&ibNS}s`)vMl5t8aiOo>oei4`szw z`qaRAeUUOPC(PXXZH;&}fsGRKN|elgkJtaX5P0nldv$H$AAz^r8=ZMpw{)3ixk@p- zdzSYW+F5khQuHTGqnG#>lTGTKlh$VW+k|mC8PLbQTjjanvV|wwS2-1LndWH;)jABvAPCEs*hTZG+%~NdM(b30 zvAkhTp*+?22RwmoL4M@RmJg;&x&{I8r>2}UlHN73TlNA71gMICbWZf-= zdI%xm@Nw48ymnpdsV1_|yIwh(n#V%VRe;x?Q10vP4yuNy=3A`AxuUW_Vb*l$=FSF1@k(7a;0jF zWIO_%$d(dQ4PVOksK%wF^93$mVDfO#Ce+GAjdzEoT%=pKQg;napE5mYRr?sZ_ZkR) zJ{T`<&b|wuOF*P1#w@1{Z1EVAcKJl6ttpWEJ!TC~5Ppm#rZfjPmwxtbl(IR(i@V>8 z%IU)uPDvndj8{8vsdP%FLd-SeVR~OOloUBzZeO)cB*`gmS1*XPPhT#)8XOf7CjfoD z*GwasirG^>=^@%jpqa14x3}Enh|;7N@dR4L*t8kRRSkm0WAV2(*fAyz<~FY6@|;Nb z^y#gnE?YP1M_me0&TxbjC+jJ_RRctcV&Ak~?;V_S8`|i;51}|VS_JgEPWcWDNrsxq zU(s}6U(>s6V!o$=2q$QVlBAmxKzACva8>7e(u~B@6dsA)`H&U1^mP{2>(r|RN+emR6RFT>YOseG9EcI z4>#)z8g^dtjB50lPxu*CmFFn#0RBD(1BR+@%WdSO%W=ih`4lsb;(Plp68-5{WPAv5 z_JcNRFOQu;E@eQ&Sg-NQN9~RwT**2U06eOrx>s%`gJ)PS{iXDYX9RNqYt_FoY+qO^ zzL2eygrFxc{gg75Dj730GlVyCBRmT!)7DMBDCo|ckrn}C!!k%))XI;oh5d!Dd6u6x zi}xg*RF&WJPhuM5&RpTsQ=NvAm;+v3_qOe}@zXGogyD%Ozvw*6X2&Jxl@ODuysth< zRE=YMFk7WVOx{z)>OQJA%vrm2y-d>_ z2vZCmbZj+ZErCx0Tp=FYqz=rYv0I@e%=9xnOws$=LM#88{M&Bd%79pecOS3879TawjnA< zvb@u)vPH`NjsD&oL^IWmOMq*7RVkF}8nrGS(CT(gKl4&~n|il>QwXm~|3+py(*=u%Ck`L)_@<0kJINe_3BLSFn}P%xC*{t&uJrg8Lg;DPjiMc! z`$AW9Z}mBGanu;*D%?P6Cep2)C=&ZMczveu{BQ?Lhf6?(cnxw!;xYW-=IGnt7%=tB zQR}^JrfFUzWoUmNA@U;{+tw*azdg334f^Qd`@ys=8p8|iNtgN&|0LA9l~laGA_-Fu z-S$?3%mtIlR3C&S_Pj-s6a#HnY)lJ5-_ld{qS@i0QKuw!|5~?6%{vGYa^JWfcjc7) zdV^iYtckb^Ef1$JZ$ERMefOh`&Jbw{^Ubff4VDOCLcb!2sEf=&J4%^2JnlO@B!K@m z_e7<5-xPA^o~ZRYe1vK+m}b`5u*Ph?VS`n;>$KyM=osx+3%3Oo zMyGeQVo=&J{yEGo`EhAd(2_f%2SS8i8K0OIKu2)f0-?w)1^FXQwCFIDNa{fa$XIXM z0_Rt^y4ioc^bQACRN)~WOoSAUaEHGr!xU8c>|@;Q1iKrrGv}ePq|^IbFKt9;GeGO}NQssA%&Y_w$e>RF|NPXrD!mv(1M3u83%z3@BvXbS zQVb-tmr{GSJP{_Fv&M!AgFLmhC%aLQNZ5 z_z3n2+`d|n{lMco-$`fsZVsmr*yMb`(s{yV03f4z53VG3@pgU@PLn{Y!SFWAsKD{f z`-8{E&Y(~yWn%k0dLd$$597SeyWgLyKnyvt0)Dn9-Ky&8uC#BOS$T**zvly?4auB? zzCx)|EoL?QB56;KHl?1U>?;P?B9&kDtTEucGbyD!a{d`+r8~gJ*5TC-ACPB(vY7gV zm%jv52SPrxyw9SOv`e+!7M%TM%%t+eA;QA_^Iril{uJ@uCcvi09HnJHN$I}qe3$Y zRQuvZ;U~w#Cde*ZTgj)3LR?d}fW5B7@_|lL6(%C%NSXC#bL* zqW7IuIw`Sn_i=IqQSPw`7+wF$N{oDpk~7<+EGY~%?J=X@gNI4Fyzbm~H&TWa!q1QN z?}$x_PoE#DMsa;osK;c^hyvzkGzbST!V3TXyap#xB3n(RDVRI{lV-hxD+Ecte=P6SrN!9ij_b`p) zYSJIKlLx*X@rVIKy)?D}Ny!H}(tfKk?8K3cm>>*cYI-iU2@HYJ_S>*O$!nZnhqEdf zvZn+vNKVsGNyDy|v1qwKLrMxak)HPGR**1Hkq&Y2$`mNhtji*7cTC zxmH*??bR0Bm-mzVDm5^rX8gvqk%Io0!GNHU^!(nu5Y3-$xXfgNQp6+SP{U4?D@*{G zL&7DGE1MVpu?-;aJ{`xQVes0x5_l9lhPIiG;L%Es-kuPn0_O>8G!ZCO^HOjd#)88xqE?XvlN>gkCW z3SGg$KL&8Y_E7WrSL@j~z~RPu2|1Qo<#Y1!wvxkWMJ;&1F0 zb>w%e;Vr5+IG5T@f0!qU7t1n9*L(~E+4T254tyJRkw@Pi+&!qGkR&BQ$~EpyF%;V+ zs&Ove5QQmoIo#EyP;sX1;*X2%0+wNQk(Q`k%iM0Q?@kLrvd$b#_w}PP*2Pi%)(&Ti zUMfJdz*0-VHei1WkQD{9KKl9gd&N$**e*hZ_VF)7Q197j7Ep7sR;Qf+rDZw(RIgHa zl&P?hXkKmcI{notr2OlsH96a!J4O}(dajc-QaaK;Oxx1=Pg=HtjV+3Rou&)}L%%;mS{ zjxC(@3CDPRCxTgM-x{k;!|0Rkb=G>tkRcMI@P!58@mYD{FF1dB=r9<_h~O$|c4|RF zT3KK$7MoL}8D8FUWKo+O*Qhc7ta(20_=95<{PxGk;wwmy%jlMA-9?BV%$X#sZ@dml3_mM>eQBT!6eKM#2;1OJ4=5rw zIz)Ocj|vx`;sGM1m|f!p%eG6;FA%&odn&!atr6^3Kc9G%mBQ?$^1RAgy>rxDx#Mdr zdbE@gsHL#&ZEY=>=PPa4tj~n^jyk79SAVP7pAHTIQswq;V0#w%)aPb{-)Xm@;Xt3E zhmz<^Igjb7P;PU=4z3bD(e_P#}meu%J_r<(VkCvjx; z*ac7=Qffh6BlfQt103zo%LzAUyq-@2-R_IKwVS+OqQvrf$iki)z2L9ghX=iTJ72+m z_+%RQpr=`J^B#3UzRc)g`q?;<8%XP$n&L?fS6#T%1S{)()~GgWHi$t5VDq zE#8!f;hFa7MZhc|VpD-9VaT$#-cs(ZgE1m<3q=AW{5K*d+!WlWh(MX#=^m>s)Ol#2 zSn(EP_q%?ER`Ny>lV*CAe=nmztb9p2!cCQX+b&8>ro+(r+53C)R}73$b1`1d#sdT` zdZM)HeT^^ZiyfTuWvBQ0Gs)v_4>-FPZT01SwSjuqw&Z^2a@nmF(Z$3wMW>q7JATE? zC}bVqEUeXjJ4AI6=E{^>!L2Q1aM=B}6Dd^Vk8p52+5=Qz;}FKC`Fd$qz|-nM5=0kKPe zH-~7xe-SOfJ*!3M_g#GO{5^Uy7oP1Mk4A3n<~dCWT&Y^6rSa+SS^(!w@dLCl>*=9& z*GUsy;)kv|;P5Zs5qvmH>W6TWr-=YCX`36H)DGmsr3|dkA7WV7ON+| zw^!nesUXrzslerEsqS61cie&{i}i|gBvs%Wz`k`QB63QQZ@sA!hUp0_06*&-7jc)2 z*_j}-3Y#vQ%}=j>dRf#q;00&KP^HTuooVCh8?4Ss_*wIslg17sr3CafBkhHbl)(`q z5nZVKejzUZOv;5zLgHdQFzU*|Bq>k6{u4)}?|-awmbv8YK^nbfgbK{R4XnRMq2={{ zYodtqf<_V3h8QorPZCh}@5-+nx;UVi{F82w=N1x#6@E9tpq2EfI)}hiBI_!lQuYP6 z!euVXKZh)c^rc?&rHEPTCqqqINF2Uwwx%o5K|7cp7vubAzV5kiGrt=#>@|(|I2y^i z%+@+)fji|3!YJ10h+7=D_n{G7b615s)!lVU*tF?JNj+C3j^b^`Wt??4_5$cDy!cz~jj0P;axKC~bIhgX zkOgRBe_iwKNUj-=fTnVWO>dL#lkR1mm&8tlg5`yzTX&r!-%e1s)vM|3`oW9DJLmoV zu9#8CgOS$b6J>J}gS?k-b=t?5&FJ}o-mnoPnnGR|tiY&>GF!`UUd4%o6)JYMly!7q z=}kH#e8-bdD5J9N_m*YGL~EXCstKYv1Xh-%{sKA9%YMwx7_y*TQfN=iu;)LF5-Wpa z-rF?|Av6QjxeBKm&y%nwD@syhi6e(gv7}UB=-y8 zD_U-*kaFsL4)$QHO>Cv zHa^pwuBgjLPWrX-jIfW}&CDf%Kc{ z%W+;+XRXJt|Ax}$b)nN*-6@d=ZRg=e$|Q>RCo!3?tj8^p3g;{b+UBlFi56DNev_!( z!^@We@BNg(_+>EUrK7#^7iK@7LeVF0*;qdgghI)1bQl?(SEnZZCg=Q|5;`(RhzZ zvviGv(yV(3OM{)q%Q7Ah2sDejNiyL?N`*z?l+#k&ln3qG*g8;1o6*_|+9e(C&jM7? z4_A$1ENH_tTH+Wl)eyyXoJp44ChRsHWZxu(au7uv1K2)ud(l4 zB11)+&g=cfPU8(XL?=58AAn!|*riDbhb#ROXC2(&mN zxW#%Hp4Em?e>TLs($x*Nv5*>-!yb2AY4l$sr#W#x7>lo*ON9@n=`&!kFeUOEFT2Wq@Z%qL#Ox(ocNJ>(FNf zhhdGjB`1-c>#gSdJIyFffZL&+9 z@i3v7iv@)!2E4?zrs=#(n686!;a1el`f4<132O|GW)qq5xNj;qNjcA>@;ZyBt3cHN@P$_3iVo6;jl5O-gW?3~0GL?Y|( zJ?qUMV?|bLdiHq}>M#$zucN<0arW9}IYb;~D1MrZl0shbqG1 zg=!0|lXy@*VfTJ3?|K^bLOt%gx82JwzST0z2ARl5q$ch2eRtocqN@wu9sk-)b&XXo zh<$CN=GLJUuk?Kkeuv2_-T%$ncD{W?E)$)L^J9&-^W8UQ!7fiY-`{3pOt(D2UH_ow z2r5y#%NAa3Bp<)UIoOLM!t3AanVV7Z=u6mmnVsV!KurBHz*uW@j*>{qA;Mb zwRysK2||??*h4Zr&fqOUe`${|TrOQIzyKQwGo52va@2O&>(9Y03#NUmmw8;e;fg5B z%~OZMVB;~!7ppmj&$kh_`<*ojkvqf+- zL_r{JicQpNu@C_1G1S)%mFcRx;0IJ)>?UtEGu%Swsd0IGX!;sFOQwD^N|mnV4}S(h zEK<0p_QhZCQ%v9;5aOxWvFe5K;TrdQ2p{L4dlrN22-E2DtdC@V*y2TV=pGX3)0Dwn zr0v|}tUzO1u1%4#Mfn0mxA~YvA=d;MVuOB_4Vkn#0L3+3RXZ2&zrnhh*9bSRt-3=C zM)m1Pu4barG*lu1i??I0#oK&=mUt%KW}71v7~DEUaN+^ADelYR*u z=vQvMjL~quvPz+^{b3tVFo%$6m0j@!lp$jMY^qp%vr~WzqPNVZcvAF7Wx#q4JD-B{ z1z6pDgTCe-mYu7yzK&tEcJ1S9w?X!TTQ8W448xxkNY*lF*}|t5WKlLkb~;k%J6^i% zoE9V3@e-R=zL&QMuBT{X)FAZa)Q{Pn6NA>D<0J34`2o~yZ2X97 zn4DkhA)Lf0QJ78mzE$>ZUlz*=^!BU=ryX%Jt4PzDcyhoom#usKruUl#Ig{w%^{&IX z&29Ph_F1Mpr;FM)jD@HGVH)A~_2?5Rc&23p{=za*Hv{d4Q>%boSqS^3u5i>;Fa&xe zNIPmPdYO@*vT|!UAURHK)iM;#r zDUajkXyvTOV&BDnuU-4W0y386CpY#0-P*an;KHAVll>3Z_t*bECKokJVAB2?&-^p;Zqi8>SszkO8n}t7PmuEsf1XQt*A_9xy+| zKnsqm3Z=%~smmEVOp<2lh;L8Rk*#yiF%FtOam#b_t9?5R!yFjtz(s8ac4F?7s@9xc z2=eVkl@rqpkJpYJ5x>oo+UXfxXxZ<0)4VO$ysAAu`&*NN=&Ml2)UCH)JjO3xJ;^0+ zTV;G9Hg~={?wk@Q*x*KL3#Alo_o>^lo@dRb{54?{XkgX%qsO`-+V>qaPEYx?JMX6} zmR&_|5pp7x;00F*k}pe&87KY~eD^<3Rp7A&+~0zOLk?_tm)(oUxC*=wHq2NStm9I6 zkopjN(aG{o;HwijO>JV_t@7C$Ll&;(t7}6U{%^?dLud->o;(wcj-jEO;?jL#pDMQ; z`sB+)Xh4$` z&N7cyfcBX`)jIu89LDc3%eZO3!-tUM1j<5|m$NRASq0iR0?@c~;47q|y4r*i1$L83p;Uz06!4lpUCjV~P zLq-9DN1MxMj$eu>&pt@7^nuCSzp32(etKZoD(rNIlAoX*H)n4A+5`FJwoa>v1IX1k z589*tEz|e;jk;4tBp`e5g$GSgaXmU45oAnD~F`Ri}YpspLe5#v+-}{sOdE zALujE=h}PlB{D=KIj(^(fYpD!u55z%iX!>#>IZtigpU&;&LS7f5wE1>FDtuofLJ(J3GJ@gq=97O9} zsAAeA+kq@y6HFBe{w+iPcg>9Y+|q>I8U3pG%k4jT1Ub40G5hK#lxsb)td8&zQvt8@ zw<&^7n#yUStjz<{50U&-k+Z>r-8sGQ*cNfR<>eS7I@3JE+Ek_exnkMb=%$KF-z^IIx9H(I1=>l$s11Ta*d4p;3NHUJD zXT&WvsG&^Ma2etgFHvnSR&`B-nXfFv14f#34qM&smf8*i0bqU&KekNQES{8!xXtEdGe zF;-e45=WD%x+xaNKq<{cudxo|0mnETIUXh6!latsfwL}U!+GMoAOcrUzKI;a3O``O z8)Is%S|a+JWf09^9X`l9{34sx$f1~Fs1pAY^v1|};Kom-l(od7Na0y6YV|yg_Cum@ zPSihr@cMXFs7l7?#F--7&2!AlRlWj(GhZ&3i8px{bd**p)5yn&KO8j0_~{*AUzk01 zYy!)(3{ghPxL?Zrhx{FghH%4lg*o%z4|lePX#6q+EESrwYRC)W1(A=o_9nz3BGtitm52W|HtH z;L^W)k_)$UaWjyoEtYFm0U4Ffjf@?eJRSs-(k$KJk7Iwx@oz)=DPUl5^S1!EEDVX_ z{!hN(FJHvF1ca!|Zz8|Y{>iBRHmko6OMC~wOWaJe?oRwe-v8y3z+K?@0nYPMt?Y|i zzee`oUeUPY;Emx9RxK(1ny~-+3QHV_P?z-S3;vGV`rBxTgn^(Fu&V3G__w!yO8VCu zmuY~u^Gh7JHU0q_1dj?3TdNbh0P)`p@Gk-e=Hn6o@Swg#_JQR;WOTnS|NASPa6oMH zb#W>9|6o2YUCf8yr>CU<$xHu5fNy00vF+$94B-5?S@@;KG?y;sqvcuV$G;BmKTLe< zMYq0t34{6n$hhoOT-C3s`KX0$F6f5ZiatCHg;&?7s~j>jM9mq5p9G!+#F%e;x=C$wiF%!R7c*fQ9}SAWPK} zl7oK|qpksBlW-sx_$TO1@r#^+S?iO) zyz#%BulWCm-dOVO54I=&qidsS!IAdf&0*92`lv_Oygx}pK8BftK_Mn0+0N=Aus;{# zDDpeP8RvpKtfj$j>_1>7|8VhG`Y+M-2VAz$eeFToO7Y7cr(6EOM&+nB#PrHV!1He* zqB#J))Mv8#pPc@~7cT)Qitx^STe;nAJqb&TToYnTFaYMj`$@X@n`JzDUP>gz> z%Ct+tixReHpYA+%`7p@={4tWNWIbFDKqu6z5t9$<({5aj0CvkPE5XXaH>jd+GbqUB z$dl$+MAE`s8e-ox%CT@m9(Y{v-5%j(uZe>YFp$ackMDP~pMJQ_1%euhK2iK@S`nd! zv+XioE@U_&IDD`+`ngixw_;O`5F0JF$-(Vkj+MQ#7? zLH=m=+NhiF4fns)EF#`s;j@SRAkNmhMhFEcs~HSg;yI1NASV#3!Bplh0N1rs(i=FLcxq(1PsCB8#y==%b zaM*n$fLl==NEa)Ou6`G|6%7Wve&UiXW!)qsh%PZZ_QjxAr)X~ZiXAMCih6+;4>_Xv zY;~tB+m53poI8LL53Xodj@%@+!PeF6-GVS>Dj7NVZ=kt%De`LA0#H`}> zBm2v$Or0ZFlECZs_`St&x~;)IQr76_{a^mrh5))1(|ymsn`cR0A%Md1i5X9DW)QWD zuEVfZV`&VVLH*3i?8@?aY1ihI)8;nmQCKL9gkfEoL4{IoM)!7XK zUJ4VcpA@u|W;RdcK%mE>_rAX$T=G9fjLPX%DpTJ)ZBLBJ=0Z|M@B>;WejV$f-~s45 z2iu=X2K{MBCP8bJXHCxW*(%A>^|RV69o#d%n?;KHwNlQC?WcNiam0C?T|n2s*Jmzs^?U4xxeB)Vi)~*-^ zunA&ebfnDZd3Q8BHm%l!H^8=FA~%FP_w+jf8H3H7D7n}k)PI-P zhO?sRWNrYKm1o#+kzYT)VBV4oHvQ!lfWF-qSUTLfu_{bnR4W&qH9aJKceaj|_-=Z; z%wAnab_ejsM!E=vcS9*c+oJ_mp9&R0cx!QSM z{Ib%O_3aNaLT+}$xJA0oO&p~fg=Ux1$Tfc3T#&`b@WR-*Z+wf~wE$-w1KD?WP(aJgTJ-8)!k};avby^j>cn%Z8mW$Zf;b zH>7GCg75(AcP6^w?to`p3so)|YFRH!{Ky>#x4uQ8})MA4yqn^QvN+F(O;QDJ}s;+T@YE z`G600>}9u|)!;IQx|NM;mAD5HJ^^~eOynfF(|aCWtWcj`)S@U7js`>l7V8jh_UV;` z{m0X8n-M_g>ihFxje-{s>#CfXEQd0hvbjVYUbCEBGFb{2>;A!@V6#yPu6q(A6&qGbS10Vgl$0WnEz5kC zQ)lTi(OStoTBgVRr)kZ8dYRC0PQN1Jtjwkc{o$di*y9FsO`w~fO#`6RSn56`-8}VN z_NKOD!0qJ-{n-0mAwI|E^Ck{Fy6p;nhF}N=K>9&_j=!&t9BU2+C>dnHC5Y)%n?a{H z$a&YzFM^H@Y!e=-QRM#Ea^_1Ua9}6QC-^Y`ed5qqQDd5WkI-o=?shzj21_r(_w3>5 zc_JgX*+7){@m{xxn_KKXdmAeNjs6lcj_6Q6-m1Yb_d?kT<y?iFISvu~hn(c2IUf$6Ryt%|^?vBjl+k!NcWxTH2J-lNb=|n01qj(uuiAp-cVBo~o>g4AwcV+Sq$iaxcHCVL5xTe*X$>>A6QMbY=>+Kp^fLB9HF*nW{i1h`)$6I|;x zzj0=5xgyGe078ua8n8r{VImGcCT3EOVoLWE9JvFj)ogpoNwywMwW<&k+M>pwG9J?#e9m&utxvPsRP}>=#i`WT` z$zDwUUXzE#?&uflMoc0YvUovh@v}bkP+~q#@R?1-dCe7}B?lypmiqK*JRvx&8=$4w z+GLCsX>=LMR%W_f@Q**K;$lA|#B=H|)l0UCwdyE7;n{w|YnqKawql=^xcnW4Kf6=>;|Tr?wXZKmb% z>|B6eRlQu(*&gfhG;pd==3Fv{_o4o$_#O1XCL09Nz749yKJX5Ajrpwu?XA@Oe%+@% z$lmP8XTxC&6^s3p;$aTs%UBRSaqfFn{EhQf_aEm&t6D#+C-Ky^uGXCo7^DTgAK0sH zND~C58b!G3g2-C}% zwOqG)dfbOhKU#`jP%F05z)Zm`ZAD!5;)NPUhZ~167GRi5_}TfX36Q0FITt>r{#6q9 z&mbLw?If+d@KP&=dOj_P?<0llWAvLk2R2MPrkp)Z4EP=rpMt<+COx-3R{f!((Jb=WOwJ1@n&Qk$6ES_SYDIdH4XfEHFxAa(ADHjD$2kA{T*uIC^cE5-T zS^;8$AA;Rc51s;eyzRcQ{d$)<{9~J*tD{+>$-*-QMF!`CJ&k*L-BcL|U8(GiXN|AJ z+4v6nVmR7EOw$#%Ej8u2+J_eVFf;@c)Dig#ZXYJ#Kfd>>aq$#Zmg>E*iXGUhSSM?? zj{w?DCdVqK4^t~$CM#EKUoa<0QD}BC9VqI)Kslt=Yq3X;P8@W?^-OZ=_^e8#uCMVi z?3o`3NM|U~LlEC86g8i?A&|#r7-SAI0w+-b}ZSI|E zTRYk>i+wkPw1GK&+w@8=n(}$Nx7@|duSpnNT}3eMC4<@>NcLi;90fJOr%DgHEw&X3 z?+iXn?L+GhHzdv$LQ$(6`cdES(QR`d02q&|w}(`k2x@}mfzAGtC7b&YFLiVDn&IL) z(d?n15dwL~?g=w;Vk>%dl|xRzsT7*yuq%sl9Y8N)1U1Sn_sxrLREX9j7Cm?4efTPv z6;H^qgUYIyJZSycK5i0K@8h3BzU9^EmQrt0!#3@$x(}Y@@ zS-<2Znp6%7?uHeXU13l6IZ2%HvgaQ*MCdvjxEKzs8v~!BHVW{iPBNeV{NBvyv!l_i>IJ& zoi{6e#b!sV8}I;1L!b{aV6%{Lo1@r_K7)*cUrhc0`{JX`XR5?U#EWEaTZz zoPGTYihR3I5n*qyHfCKPmn!7e!$0R^j^TC<$6ma-Gb|$oG85VBk{UT#NzT!)D=)X1 zavbis1kE!1balh`*fd1=WUWnf`nNd!vpgVAgeMoRd(p7z^QiSD;pXX4wv1fH*9xY9iM&?Qp=Vjrmo}HzTM8UYmlERxGo4pGnfy8v6#H&L%W$ZY~ zaW2)>H{T;+Z4+D~x14{IJ~b1rn+vMU9Csf+mpHNf}OGJ{T>Xf&cTp98Z=-WN; z|9Z&f^pTI{2x#;_-kr*g;%Mhr%B~1QTBY6UA(-RXofu9mT@`RxQ1)2fUKhRD9*=RG z6n)8_!W8X&iZU~I+2Ar8;LF$ID7{FNYiE)$WSE<4>mA(6zG~S4;DKkSS4D5+5Pnc;nXUHhykn`##tLd(>D= zJ-4si1g_?R?5}AEy|RCKpD^^^^unSy%N^0rjjL4_6ZNh&Gr(~ z)MmI??&NX}%oFUEo+{)LLnR_&T%4;+x~sG5RhjdH?849TU?p9V3s~AvGNW&l$v2_E zJBiHLPPz`!-?#tyObRA#wAv*SEn@ZsF){9#K@T zXzUxMc1UYg{-B;M&&dqr6KDlq7siF^TF;c?7x-T1J0@M`X{hV~ZCDq{RNqgVsB`mK z%jM!zEnP*ApcI|~9`!kEf2KycxaRRfB4d=OErt1W@rHHPdbFXt;dX6BVNDY?i03H` zv}!9<+%{`9G;Qgek9w9w*=@j~UrS@&Ke?$>A#Jx`&g=+@z6WZ3~~K21Aq zI86}+{ayY0rUlow_&?BB{V?N|5Wyd>CSw(cfsz_qR7&xTj?J}afUFpo?-{tA=LcR z`x5WeooC{oeWJBfcJ>x^8{U8097f4bVF3ZHJpqY@o;~QmrG=K;9i|AtW-Gxt#SLd8 zpVYvv?5F8DVfJDsUBQ{`eU&lH&n1;p!|s+2f*;ubX(vPW0TvW2_bE)uw>4yAn}f9v zTVu;Moz>bi|2fwWLs(-N(lFqp^sIJ9^m@s2mYNXv^2k1_v5BkA2MasCub51Bj;aRM zM{3o4PGRV;8s--E40#qWVFqTUQ|3&`n!5nC!W{_8c*U-w@q^FCoMdhjOg?R0b=a=p zU^FK6hY*|`jFQSw=YbmF{p$NTo|GhpnD;q1dlz8W>mRlASSw;Dd&ON>rJD2Ri7$Kf?i&Y99b;e zRx8%!ohB&SFmUUM=_Urbo^H9#{g%+WA&ffDXm5(0WuVW|XUIY5W4Ve1s@KpB1>YG4 z^Adg7u`(x1lMFcUx4H>VupggrL)-q?1lPpO>Cr{g&$M)mpwT^BX^q>SgIN-ulxlE< zf3Yb*z+)5cFxw0ZsJlng^w=r~D373raKp!VQ8KohAmdL~pQ|O7I~hMkfv>0TloF1t z@{8=x`DDbM8E=PoG>y$1PC%sd&Ka6ex#!bDqxddwsv%moJPSDR^bNIVj7=jWC;MCa zQzf~^{nqwgm`n-JMlDRXIX1cdw!!o``)e(oN42TmuPC@I@-+m*`+S>I(GQJ1*Q|%V zEP#=SG{B-a_9Am73e3z$ykNH&7u9L**oLe%F^w8-Z}7VhJi|VQ9t}Ulp7Wl*I+SWj zDY*vEJC%(s;O!%l$WgjJ_9{QJ_n&ihFix}Url@Oz^%DB87hw; z@ZuWS<2gBwsabd<3?LACJcVU8O>L{M+G0X0D_`+0jcodXpLox0**&U*o(&x6BD6wO z0BB>n9OxAS-dpbN9c@hixDPLTXcBZi&Te)a#gPmgn>kjf1yRQEJ^11OPPB5U?3JYc z;x1gCoXaHQ9Bp(+9xw>zMoMEw9moKME5a@ zG{)_jVcI+=;`I#CdW?x3mneoNaLbiHx^K-oEiHL;Co-hgxsfHBdFopV`Y7R+-n?72 zE3P|=G#ZVw8gyen=zS*qsDk^)ZlQJ)+ujO@cT3cz;#4oDTEZTfOR2Hxdt~7b_MxmR z@zFK)Q&c=Eo>)uj3(uhUFRCXjg}d4ONRzW0BURR^X6n( zz@Rg3G+gOkve0sA^Z6nC@^WAJw#)FhXE2y{eHb4NC$K)x9{)tjYSozs8AIvrgR6a3 z!>nrg2rE%=q}aWL@X9RrzIiWa;jh{k95Hw_{x{4fGY50+h_(dgz{U*e&a0zZh^p2d zE3-*DrrHf(EBwaQVXBjXAt_H^lw^ECW+?jsl^J@#7^W!ic{3L!lXTMfzK&@mie23m zK3?+H0)dRpZT*sKuVS0FVO8qDbhk8=vM^!)NS8-_goYag90=yfk2Pev+sHp|o5=#0 z7h+?ydt++}Ku<;-9?-t6x*#hXv^|PB*lVj~j|_6HM+V)_^ao)wQ62EM3h^AinmG7~ z=Qd~RL0rN@YUP?pgVSI!>a28DT^*nadq}8w?M$3~P-Gginr1VUfx0LNe$5*#ge<~p z{mqtaU5yp$fJ$fP?j=GsaK%2K%}|S-dT9w0-)CY9=jPGtvD3rOcgHds4&B|j?!x!< z6c1mrld{Cb>j}9B|9&uan4a&0!|j}~4O*-Un$7&1k+%==Spxe0{8<4AR4b~)3P`^gt|J{rc$ zbC~|uy4;cR->di~9IubC0^dyoUXRt{Lm6Id8|y?cC9Y_j#8%F@T^k+A|@o}n#Z5qwZ#D$i7G<$hQ;o1Fp4 zg!A!g7n|-fs&IO4$z}W7ZEcOtgqRkXhLW!u_LlbtZ(37E@1daw-Pu`3gq!=IP z8M>4%Hb8KDPIjhdGbFrh;Mxa3sjjMUOO!;w8e*U%?-{T^&{TOVAZ)6@baDGV2}-ay zl+><7M|SRnM9H$?8MP>`r=0R!pf9D+KyXE1A#Njw#R5MgI>D&(q=k$XSOI;n`&@3nLboM0o?E?|#<)ll0|ssoM2xBiIVvoR#6i^~puBN>d(Y)Ub4)oNJzZOyD}Va*9N zLM>oPmxmQ`Q_OqSAh!*11GDLL>^{jP3Ise|*@{~N(@zjCy2d2bgybwxIuNYk*p(8U za~XAqU2oE|(T##KaA(n~xK#qbfmi(8@FfUj6L7(&iPm!zMxa33V+- zH2Lx*n1;&Uc@EJaGL)yRO9s&5v|$9Fao-d>-Q*rHiAwai*>&$ibXPB{5NF=itd0A0 z=0$u#ONF>gE11^R;vZl#v02Bb(NwWrRixs5xTTDnH66=gAlT8*s!_0H%bSbwx7mDJa%KFxj} zGkl@zdjE;3+Mw6UdYjBvU@2TcZ=9L_6Q8FihNmFHsN786+UpA^50WRgX+q``@e9=E zgY#x5a|LS4tTO?T#Oh3W9coKc?#20CAm{OV=EZ6|17aJQELa$n1o4e4Vn2`Nx>E5W zY`VU6Q|2B(DE0K5Es}y{jjJCo!*tm<_*tiw60t%qHrSEteA&C%rM%A|9Ptfc(2D~I zB0XcFm6q&NRZovJ$haUDM02b%)?38?t0PPnWbT~Nv~i%)&2aMG##G6 zc!O&H%;2aL;L>bg{qC#dop(${Y4mvFf|eRfO5E#(HNu$^7k${l&{v@v+3yuLeTvsO z2QK@_6hS>ZMZc8Bq!rhN(!Jv7sTO3!gW}jOH$~td_s$SlwJA1|ja*HBPMRlSJhd~n zeZKJoC9{2uU&rrakMKz+!ZkllU4dyK@~bL+x9rWUQRC#E@)e43k!(Y{yft2V+2Npk zXp8v0&!XpW?_{jz&+uoy0l-J%EmsPbbS1w9Kp&5*R2&0+*F49q^EZL;p1#EheXbgC z04z6N#IfnDSKOnFL+z%CETwtXL;D&BBq;@J-dbMT>CQ_(c4iz~PHO#P4FNw5SfjY^ z_VG{_V=}4gl|t=vA090L@|DTDbV>Y@+*64cauE2$7L`XX0z?$G$@A_=UJ9IQgf>55Qf%nUy6PA;mQp;`OqEP^*>Ud1fYj4h3UBP1j z2R@pILf=zjsn9MMd<`hS`0c}HL)ve3)T%bn%I{}cC;qdi#43kX>}9}IE-S^RzYlI) zH=yKUADwxI84k|}Rtq!cyB~;|mL`X@M3EoweDI)tED~WcdtyfZXx`KVKxcyv^NBy* z;j9*u3i7eRM5E6tRB}wZyVyDCY`d-lm;9qCLYv0^@Ve`nvl6@5bVz84|LI)3r{}Kg zmsPke^)#GXm}>VWFMa3+zVT7e$ye1+UOH$;kF5q@#UU?%E}Zct0^e+cHC>Al^?@uMdDNyM&|{8G|)d;8v+`%wUM*@0cQvG4k11_Oaf86jax$YmJmx4EZe zs%`_wC7nTReRFWcj&trnB{FG(*QkQ($+S=}_U?hFFWJQ7)mhW^u{kAdM8~$yVI!D7 zYG7!qUhG6R`yeyPVcswAv)qf`*U5SLh*FmYul=e!W*EStTMljwN&8)76HL9;_bX9s zi!1guv2}%V_{m(e_#~&0N1su`=cga+JeNW+O92kn4WFvgk~H!aTQ_ruR~ZrBpvCK> zw`V~rvLu9L#E$msPD48%3SFLf_C%A4yRA0ebPdaqYF@9~*pY=IMM8zt5Je<|T7>Q4 zp!_;Y*LAOGHKWqz8xlEUQ1|^dnGNWJgdcU&^g5s+u>Gg=_7@*X9ZF9R3?rUm*2QZZhX8qt$uD zOP{I7&;u;b6P!-DeJ4NIPtvC_6>d~J8ZV}(#hfMa{7LZMDbwu3yog_9U(?+DXv$u= zT>w6@x6O}f1>W*<{sJu>N$W7>ySR=yYTro}VbKH`)twq4ze@m%n#KvQf}Umf(!d-lDSmgq_ES07ZLAQ(C>QjhP~?({ZJF~ z($I?MU8`$0Ew42$ZiAT?Ct?nLC`z~-N?qMuX^NYplUmRLrfQ=eE;bA@j~w+%yDp?O zMV?1Y!X8N_0GBCTZRV~TRw=v*_JHsgz|D2HKRM3wdr&QQSwhf}6~auY+=0W1lPX8N zLU?^=z+KF!0(P+-(i?w)8giHVDT{Uv3Z6bN%YGWW(41=qoNhw!$rq%Rlz9~wwjp$4GG1svICBNWWHDrj_ zMguHrun1qZw)r{F-u}Qt793n~@bq+zeKT-|3)}4O_DoeTY;|M9+Od*mGh~z|)7-=h zwbg4;GZicr7B0H?^_XT*;c2_8PNjR9V#<-2&?Z5TSlZ49)h~l2Oso-?@c(#_IAJyF z)jPiAP!IR)9ldru8rjRm8boybHBc|J;o1SwbR=t)nV;8@%)9bnS^GvDmz5uz`Gy)q z>lh?jbJR_fi7=tZV<%7*+4cC^Y1@~$+b_QJer^#Qs~6cG?kI9(d%U~Q5w^|QJ7A>9 z7ft+ijyr}`?aI7%nuj)-y~}dKKAQ~nv)OAubnXs*=z5k!+~&jzt+5yu9$k6BYc=Vz zb6?n{2Xg58N_WA@`Bgo|eS(XTFWtC2<179py=J#IHMt=#NIdvWN}55hh>9mju=kb^ zb@doOA9);8hzVRiM^F3pO=kWlN1ANb zjLDKTVj09dBI@$3i&PIUy|LGV-4f^)2n(6G^{RVRIaPt^-H6N=uct2GmbA}qL?oYw zVc7VhojyrjV;DrP@ckxG@nOb@q?g%5DY);B5zWaqqJcWuxCPRo6m_@s;9Xm*)l&Qs zpL`ZOlw2K7UAOw`o12^Q@r}0~K6>*m*utW$D6Zvie+W%^nYR#nOG) zaycnjD{Ayy$U0bDUuBSp{Sxd|+(HgZL*foC1!sO^BO3-%$?mu!X;u58;Z0Qup=8?~ znO=nXf=-2xYugd38LeS<&Lc8AD0Y6Hqz4*2v=gGd_v+QF!#j*2)KA=pU>u69-eDYy zS^>rn0MFw;^I#sKXBd<>vlyDb<(NT{MYTyjRW*Y&87r+SErFf35JjQ8;7ha=2wKz{P2@i{2I?> z8xzfvsTWj@d~$D&v%c-iU0r||fABaiWt#kz9u<7wspJ1OhJTGj4R7WPr+8kehmsze1Jr4P)aa7r8RUc-^6fz~18zwC6XADkpV8s`HRXYJg@Y%&`n0@~(`_kf zKiogO_jzDuEZonlZ!IxRxE_l0oQhM|SKC3>O0zJVGuYtsF*n7%cSl-G_E89)O&g^H zthS}VqjrUr1{kRJ6Ae%CC=uw=Oc2_o$=RC1MiQfU-+q*+Ish6dSm-2zi^E~i#5QMj zs4uUGEQcm~c*OoS)bDcIBlj zf2~PnEybJ?hJNK&(yg+x%p4aH-fp!CwskpN)faQ=0lmdP+!cVzz2Eq4QiSnC)(ut6 zvS$_-sIv4b`k2m^_tThIac-66t4Gu5fKMw!+-?0^+L}{>tYjz{W~e%fQGX-xbfjE#44&puxpvZ<+Q+f+2_Tp{JSsX!-AziU>)`0EBuZipsDvCeSnn&2nOM)#j=?J}iB0fh?%$+y-)FHKCc8;}ED zN!&iw285gvS8r08*w1-%ZXF70nhm5d)XX@770=dvu}V>c%|~j|A$LtDW?2OJhM2-$ z1rA`^sME>JMNfNAXw85QI-vP$bW78Mm}H5nX%5y+`YXy`#7PMpDDQQiZ%>pxzIcwt zbH+DzX2%^Aba#fkk-h5+-Z@7?v!rdLOFZ6vY_8J6F6Ck8%<{LjPK>YAWB}^*YLa_& z`sQ#p&vWgAo)~4yW&_O*1EQL+*zsi$_PyRLem>suh1Pd?SWh6Gyv+rqku7>goUnBKBjY36v8zF8f2AI-VMf24rFY+aFUyTxgO7~T0g7-A8bD@stV z^0G=g;8U2glGdZw?K{_>dEUQ#EDBKmy`sLpHLPNG=eC-ZUG0J=7fAJglfiuYUJNHIa0%`XR(7b@x?hgjW0)3kz*3C!hS*3v-(@{WB z6kniysdR?ikLwW8RVTH6RkMapaPswZlb&i^EelK4ptTp7oKlW|H>N;P^EBx+%}v85 z=*^ZT(cYYUMs!2|mfgmzIF#o)k)rq!B5T$}aquKXw~yQR%^eQ|dq_#K z9v=F=ZSqz;8D#EF^yW<6Xt69=Qy>?IG* zo9Xp04J*IhYpP9j@i}3pcX6s;6ydZTEP;lXi6%!@}>1sQ4^<+)=-b<9e{3diz2e&iz@glBz`>F*Kc?pn`0lCH# ze3OH;&M8KrjavS+XIy!w(Qp@>&5 zc@BT%`GGH*J5)A2C~J)S)wfRSsZ6h=fyzq)*bDH8G|=ublbyiYbNlIPyl4n4SypWO z0m|YM{GiwI-)x)4zlhi`PcwkRN5Jz|(m@u9zS71S#rVF0RyK-H@I4X_j!?=*X;M>Z z$li?5<8*AK%%YF`-f84a49CXC&QV`g){z`8QyO zi4r9Lu+ObU9r+le&zyH(09M@OtK&9SzaGChq}B+Pc!OD!Aa%AhU%GaRdaY3?XoKp;4cym#}@wyLxmn{dQYT?W8uC1O3r zHDPini-4;JOxBPhu46c&enS~P*PNb@foK^;UO}$*q`JW#XpI-riv+Bm73pv<0@v zqNJ(cEhmzBt#jc}v)t2$k5}Id^DA8e4R+b*9MlRtem9%`80|$a>aCq*z9bcVGnwP~ zekyUfjnr@V6k&uj-!JOc_Lvw38k_Tt9$ejeoc~TV6|A>?Hu#ztN@)zADDw0n{Lp!k zH2wDIGR0yL+y`+~ki7dA{_$f}R~NH{dz008fxLyqm!sq3<(|*y2c^EfN8wD9pe?n978(N?`{yjJVzu!fPmG&9Iy)n+c4>CKbYhJtE zf?Nl-AD7#^i5)eryaz5L2kb27091G$u4?X@VxId6`t>mv?eVg7Gm9hEVVLG~@{nKUcxlPRW24y3CXy-^?6UQ`X5rf3hQo-ZBw4{! zP1k7=zq5}lyp!v+sQoXeec`v8@sCd9;?HfZR#2}zgnw$8zc3>Jp%A{BqJug`A>z-m zuhwZ4lHaCH1v|%GJ=joiR;=txuMwx^&2Abs>rZ*Wu2=o$jzj8C3H}}v{)cA(jrp61 zM}Rol9dI+OcSM$G@4V4%E{;m1-aKEFHS$j@!#_m(A77Ag00|A`jr@wm)f;P^%>$|I zbTZdf$oxu6OJ{hNq>E7m&rX~lI^h0QF#qw#fPa$sVC{e5G=VS!jX(llF@7n+9%>wn z^s;YMBi;q_MiCJP8v(p_l6<;1g8%XD(tvT8$IRpJUaYSF+jal?{}x`Nmusiiex130 z)|mh0b%X&H$$EuC$bsDdApF0)1y}^&!LGX7$p2>ie+r}j!^Nf;#6OFI+qKjGu?+lh zO8hScp8Ws!hE(~$gpL*G<1?Efpuejhi4IoI$IY$^u{WXw=IP{mzotvv6GwgoWa4>U zTlx2hz=OZ^N!9nDpecws_HfV?8kLD3nZ@|iQ~t4DuI0lr{B8}3V_RO<*@K3~_!b|t zrT7+k(EnkCQ3@GPU^1TIq{zp+PIn2JrPp8uUIy3TjF4wH~(9%M|p*oyo>46Fp_HpJ4Kj&Qa3101NG->2% zS6>$)$ffCN+K0iSr0Mf`gawn75X6CX@hUzEkN;Ay)>2pg6U)0lw1%V>cI7f!@Rtf? z8V@>ea?&1gWww;EaR_-lajM3-y4$|b$2 z6H^tiB7J7&-;ldWxd-(#_Q4p4SGKuaU}vwAdGL#A7e1epS9ceudWCiN;8wV1!%Hd+ z1H_xJT`YkFzr_1a2l>O^KFYJ~eEUO&20lVcz6-??a5&5i+0;}yM^y8DN6>pn(?<|u z)v=6$(Yw7SM2t8Yda0Y0uGU?IKjr?%O!?Ewv_#byU=PZ_KmB$xmXPYOt5e&BRuy>p z^P~QfG8soRGAq1L0{rg1om1AOMW*`IPukS?(%E`xl}$W#Kl{fnEek;lEU05F4K%xi zuoSAFb)SDhj?~6A?^_s(KyJi5Z#L(kr--D&o&L%x2np*Blg;>YyG!GuVapLFA)@vLW>GBUUV*SAiYo3*S6VpK$y!LRyuKggKd& zm4j~kG8o0_D4p*6bQOUL^7uF1c;CR`snPG-%$Kz*rE!PwaX1V35AY5Oa!IfIUrDAj zok*hNs+U3Qldf~G*GOwnANLm9nxJ78A{?clR(%husz_;sDO|^0{u^W z?{boAKmDmxf2e}08s7YJp(tZL6TmwFJP9W_hqIqB%8Q57<#;fZBHdx}a7B-bv^%%woyed`Rr zKi%vR8#57BRy{yEcTp{&t>YL=j%Oxs5|g{Nl;4X)$^3O(49Vg_(RH)K2{K(VrQePm zV+X%&Lq6&K@_P|^I3I^WCTWh2&Ns@=Z>AT=mSQG5pC@4o4U(@CFkTNio3_85?k;DD z@hS8^f1y%}Eg_2J1uJ(is5?X@cuy_WBF5-t-xg%2UYg&$w54ecrh{&OJlFgth3+@; zV~N$LI@dHf3%O%`gi?qvmCfsr_<_)aK}|XNsozJcuinmnt|Vru+BO&?H0@%oYrqo2 zYD;^?21ZR+#Z%;aD(!!JUaNH*`*@Nc-n2*|mtlC&gLO5QC7W|lpfkLT7jHKjSVqfL z^;mYgEjg!b3VJHf=fetocm;eP>r~%=LI>vYl#u16wtQYwAdo9^*FXYP*@o-7Hg+Yk z8D6W?nf*afqRDLbM1JCN(Ht?mOxEJkW+1(j-ILA}UKTx#KCVKvr}6qGo_7s1N+hyu z#XVuiABk6}@m;6iu;!$qV|&R!%fq+`HaSK4CJ^UZg!l=DcN4ekE1h&#thJ!`*VTrdM5Y^neM(weY8Z@-V>0LMA z4ioAvJMSV~*o&w}nUPnWBH4?V%?OcpBs$t#sERq<$D8up2|4p|C(!%i zR(-nPO|=(a$~Wl&DQ+?X7dGn8J$PZ5+R*(jzNV+_-IwzTsnneOcv&p+P|Wdgao=v2~?rIly8UAp` z)aC^!hcFw*zxuv@GoPd>p+?56NN}^7I-1t7u_ATfUVXGUSt)vgSDkA&W-PnWlGA_mAaTTIITS@cwilKSfOAPy3YSK#p@OV>TVFsDzeBj*R=b zI+vzbH@{^Wmhci#0_=J0VBX=6)Z-)WWlnzW!w+?HWJyUU8vEOHTf{xFv7b{n@I=%2 zULA5IK5~mUcks6jhwIGY9o%i{p=2_xw9~8RTyHq@`DV4~5YFZPQEJAhmSN-tdFd(^ z0;T84`!y+n;hj|>W&0GzLTm1f6)N1mMz%6&rjy=(hD#wk*c_e1s-<=Xfw7IavYyjq zVI6a8>DCY5z%-_Y#$Au)jZnsVe|2ZKFzQ9A^zlN?7#A<)P&@bD5Yl+%{Q!)bcPY*J?X-e%jIUM zho|nGtTnzfvl8+`jI7$T-X*jmjG&hxwiH*pEJ@LirT0%e2O&L0@uj0Nxqt z6@y$w%Yz|iI#Sj+x7hhQ?*3_r@ICzr!Ig?P6Hm(S{K`+4So}i}bPh=ECL5jnjJLLR zcM)_>u`&}vQtr-p2{0UV5z5h)mo<*lShAd2&_jZDuzflesDSqpQx|jnVENYW zd*<#Y1OZ8on0g@cw)Xl*u(5{g?Y^>x2vcOu8dI0>Y|-$w8B=2MT$kKZh~}gCj4>uX ze&B3Q;tAvF`9b#7&3(LPbZ7lh%HWq~jM+r1d!^@&m{@LX%!K*fGn_njr%=k*`%PWQ z5&ALG0ZPbHceueSp~P8pxC^luwbmD(_elHmTBRm+6?gY=)br=F+`=Lq!(h|*XXx$2 z!@ATLpHE;laY-L88?jGX6CCU`buw*lC`eCkk7ou6=fO^t1BNirF{NC*`_1n4dHuuy zv~J^(<$~z3$JX=3KqKY!>GF|Mr1?E}m*(3W! z2PD`*8t+l;J^`&r4}yAZa!303q%qHQ=9E=27O45gFa_~(Z=BKkf0Lxq3iOoS*5WXV zMLLi%aEK1eA_KS3a<48AI{ZpFf36`+lv^59#;uxSIX z5x((jCQSnTVA#t9HuN5d?(Dg8hLC``-TkywJ*5Pt4WLZza7FS zpC<2jpod)(4t%W=oR*ksuKze!Z%gjgJ$N)%YKU^;yU%+JE1R3zJ~$PGW^x@$#P~{l z--~83liClu8`7{`_X>66dc`x({ow8^kg7sc98()Q$4gH=@7}>{1S%O{jgyeGx7Yc% zKk-R&cbuHl8Q4Zr9n7Q8H@o5(_b#=s1t!xiZ(n{jxon1q-cIpTHJB1{1`!`mkM-Yn zII^i;DQGc9Pm`S_GG8K;I-7BSJ@=KvB~&&1^8NSqFVlmk{mRQ6_&DU^Y(87$ffzh?leI?K6YufxIjNj{PTkd zuw-MCgn-)v!-3RrGNbfsYISN?9u{(sry!x%`V*aKex(OL^P9k=OE^0~IivSVDjt;+ zhjPgpxA{0r61Y5~AFsK`d_fW|^ke>yMYlZTW%mU}dIp8fK%5T(UJ_UZ#~)P!uLW*t za&?lKM+Wg?+Ez=>*5NLDdz4$(#;ipf9dwpW#|iGa%2A55PnW#qx(-`dFm$Y?6FZ(o zw<&TQvf~bD_qSW&KCgC-C^fJvrg1*k8a%A#bF!T(d8OOhY}#lg{Uw;mGa=}e8-?U- z)_tlSG7iIXx2-2X_UMDV!oQxUT`lwR3n~dVKa)tEnYYA4Q307nh4weATq?}jclvy_ zhqiN;6gea>U%#tq*nV#aoSkgl@a3aZ8RPwIh?dzhSWOuI9I--m(4a{@-5hyq-Ixb- z*>OsU$st3cvqR!A8_yhffuibVnDkC3JuU@4unhsE;6`I_P^+&ObIR?n;1{egk@l=w zp#noGJAW@j{gm#7yd!Snc=K$ETpvt!A1Km)I9|v|eIp(I0LTL#(rW&(q@wZ1dZ2o2 zbtPZBDdlOZD3ket;YgmR?t=>Pt8oOlgrx@0ItT}zKs;sopBW|)!uG%ZKis`_R9tDc zJ{$-MkOYS$xCKbi1b26Lmk`_u4uu2>8r)rj6;5ypcMa}^yG!Bno%G!4>EG?{nLGb} zYq3@xs_LA2b-!Dl{p<|tf+?e2f%wa`$fLRUITdCB=jfqeWojzbhOVmHfu`H*LQRh1 zBdbB0^WrTXavHEg8}}gI!#9-x8CkdCyXk7b4G13V;#fpKH2Erj+B$Jar?;Ba>XG1O z>D1e&NK;-*9Z#YqTV^mQ>Gie+nAvQM3!}QLDX)KGqIk zL2g8q|G~h2_5^MV$1|3uud~B2h}T|V$p|fcW91`@$`1l(p)NrWeO@{3=Sa=(^OoGs z98%u-BD%Z1Ttf;#v#~~ksW$Ane9N2i5{My>X*P-@v9SWtV^H!^#p&>Pqz0d&d6kh3 zW|FuI$?HLOm6JR;=mNjhnI@6V^1Jz?UjlZ|fZx|1rjqNS`pXMha_=nBU&74==SW2}f{33pfBwcN$8t{u>H?q2nYLW5yT_HYY8F4@KhKH(}-lNLh#aOhPDv#kH zw{qyWR-Wdp(Kso4`;%Vba{$ngc}nkjvIwx?-S>XAoRp26yg&O4BKWPbT23j`xSl5i zhGUryM%W)*M)SxqQ;i#CV71Q-+kGL{&w`Jpu0nbljgIeM41YA;QfnC~nmp5H2fv$`2s zc_oh6y={-s8~V+l&i%68l6EHvc(&zfaWHaDIJHDD8j&jk{VD`R`gfiT5qV#|5yC#IO~oS3oq4m=N>`+1|-$ z`jzl?X6o~Jc`t5CUEM3U=wqVprF7hx(S3rXJf!O6i|!sk6*jcJk*~SS8=~kDYu;lv zD#k;YzDb&NLWYyf>rf9%_#?q)73s9 z>p9mtedLK#meEHiRa$eCAEN1XBKbV(WDBq3;_rFg>$ZrR3Z5aGzu0$sRYesGM((K$ruxI{7fbDY!LPCvhajnC zOOw4+?;Z-J=o%@Ih$vd{&`i5^scLipX>DglBS*v&M&rMK_c)sAqZR(sLV2%!u};G; ziQw>_ia;!5yT=`NwxTgU=Wc|wH!kP&u9o6TSSLjAyy|!Mvo9^2lZ-^~atl%vzaSxo z&!f|?!qgY(_)N2&X)k70i~1c!Lb?sslfNS(M8E&o+)$t)NkcE5v4sV=h|fw%hyNhX zem_J1p9>N!c(ss7F%QZ-&7}rn7iSHB0~a^p=XI4f+02f8vG3>}no6^|FQIlb+3@@6 zR3&msh);-lCkNN0YMkOGoE{o$eCHpA7_oToX5^+4bdWL+&QJsLoN#fP=|Jk8%No>u z?UZ!$CcKkPP&%PEnnEjL1hOcPZT9>3ja*UMAG+>R_fGHc{3bTgkBpuD6Aufb(Uug_ z@%{7RB(wz?y6zwtPAo)S+THmarBeNx>l8&T>GlV%Wj>)KyU%xh5G2X?NG z1|jCwA7~lC-N>bF=}*xp&EB~)?M_*5mHRBVr#q582{T*IuPGs>e9FyNA3Hx%lPLxs zV5_v>XFLpL5hro}E#jPF;g#q_92m9qh_8TXE50Gy(B^kB^!o)xT1)TNsU7u3BeU5O z5m9AE>ybunM(Lw)xql61B39tEz4p%Jvxs1vJ`>$K^vT!PJMJ*nu;yHVEn}S_I(?TM zi@EXAudcyxfvdfwp!wF+{r*#ha6vqaT?}HOI{u#C2dRLn*-SggQlDZ|N<+e4F_vGW zSgq%pH-o7!Kg!_=0wGoxmf|3l7QBa3x0mb~RtJ@?Y7>rwq7N5M8K29EPY0DYru3&T zrfDku`HSDK#U-0Qc^bQZ(m|R^%Zl?j<~fChE4T8x^IFG z6BNMPamIbShIulpy`xlR=ec7l?Du#hAA>BP&(Nn9Zb0?BW8iNt-ku`>ZmuW9{|Ghn zACvNDHeG5zF!{4h^Xnb{dW4EJ6Yd52XER}3_Yid_V!rr&1=1J1|L}ljeEih} z^?Pp4|MVaLpcmM(?}0CA=x}a7^{VszB?o+m=&w~FANcDT9j^j}$p5DGzl-V~I(RjE zaJJys@XsL;hC}yE?{4qkS_y~sR;Q(VbNP3F$NwXf{x~NjhsfG=o`N1wp;e53eCZ?@ z2!%9~^?Uy3n}2^$%X7GAFx`x@z(2Xle*elpE;14@GK4%nG-PlS{&M2HodtqVul9Gl zNB(2<$MbBIQ{uQdu~bKiy#CM-TD`p z<=_5c^TCgAhb*$JzW`>2tX{;KtK~mjTyj9jj3>zUKklYKjPgkYFn!#9{U!g+^hH1V>Ly1v{~xu2 z-&Y=qH=z1v@}ezQSp3Nu_xG#z2)G9tja2hrG>rre*bT!%wR=hbX`25q2He0s7jN3E z{)?vd2mwQVica6~UyK3V|L>+pezNk*-0w%zUtU0wwd>qeO0?^CJgB6AiL8*x07_0N z)&up_YWfv?-8rShy1IT7Wc=_HVZd6%bnbO+`^!iD<4q1ypnil=9eTQOCNI^|v_HZq z>7&dhyYDB8)s~44=4JoDMtngCrUGP4=V|>((ccQQF9>#t{3*d_udt%*>!z|6Qsp}B zL~an+ui>d8QrtC;Z2Fsn<-EhcKK`F|?0x%d5%Zays{fnziNx^(UWRvCVYLQ+^UjjZa8Tfb3;VZ`=M&!+qd}SQ_X_}S#(SRp ziwG*! zkq8wMAFqOAPdekVC;(WC@2b`*7}CbRbH9 zNpY~yFl>yAE+0x;>TP5!vpIC9@{(5Fw2+X?NxCZ(#4j07pYQ^^@gPx$?%+S_0>9RR zcO$91;n!=S0M!2Nu@QeshaVP+Y=OaErF;*JTB=3bRfnnVM>ct7U8s7)$?cg1lS3?ca`nR z@IW&nY1B&l>g>w_B1p$48#3V-$Mt!-uS)*Hj{oxs#_x&wwp@^>Z9_~%q!*yF%dxDh zSke0)JYKA&)(0S1Ngrx2T{!I40x>kfh=@|ArgTYUbR#w%l zY=bwPlwH_r$EVRrEEd7(dPXKJrMqe>(+fa~1&~kFxmT)H6Ba|Kr5Z-SQ@Cl{_6_oR z_5C}wAr_}`u5TaGc&J`6=*CDkHTguGXI7a@6exb*Gf3fd)C5R6$u}J=Dgt0 zcOS>MKynlddbZYk_fs&Wi}RUBsiJ zqQ9rAwcfMVAttVOse0WD-ea5i-Y7*Wv@Kgxk}YX#IDb` ztx71m3=*TIU^}h;?_3CY+@wF9;i)Kfy>6&PndR(O2Ut-H)JjVxzH8{#J4l=#@_me- zDAim1#?xHd!1Ji&-zylue<~h?wG*w9BGPl{xXUVTnDY!q%^t5b(h%&0V@5D3{uHHN zR?`hxA}t~24Zwe@%&@jlEl*tJV;*8WXgH9Nygpb1t@4r$=erO5VLmfzDKwqhyu_x_ zU=6|8A*FA>Rn8B{SOlA(ZO_#>`?oQ7-EPbs_Qm$oXWl2~rN`)P4zl@h3fm)Xls27Y zVT3vFO}}fV(>Clv{=lKzsktlBD}Sa;bZp=?&SZhGkcUtEY%{e%C-+NMGP`yK>n@`5YZk z8Ps^_cE+;CY)q2VX^Vu(j9T%6IhDWo0^OOm8u!EsDNkS?7EWrW0cQn%~j2mZlq7`!K6#=o4;3i z{-rU&VMatzjJJ>7c5n0b-VnQQZ5UbJp)biaTg^GSE?@D9M^lCte_Fk}T@7bi+joYl zp>1Y6aj1IUSVeZE@!1GlT66<|O;+$x+5Jj?>Drvx;+*b|DxpQ4@jhpr`&EUu^TH$W z+d)jSBRRgoihj~r&xiJKOk$vb_LHXwuSs98z~&B{7=V72U(AF$JlU7u9QJb4^1CKeK=eEnsU3wK~ z%Jj3}u@G(T$TYjb@M<(`Q86$uPDZ7?%BgTN;2STg0JyO9wOhsU8)u6g{G$UgY;Vv3 zt_5hyX0fTAH{IjrqJM>=fA9T+>0-G7;;{9emC0NJ(}xOeD%OF-Q!s>>riU#&5WbxA z-AZxIB9noGs(Kz4bD;{D5(2tl?i}Kst2VPzbF@Pq7k`{!>%HioN670gd=DF*I=g;i zG@U+yN_3I%QGX`g@e{v*w)5_#_J7p&|FIck-e=xV>1~3iZ}qe+t!J6F(HV&{r`fFM z4LcU=nunOOE~FUlXZ-NG!wrEFo+qt{#4}_(f|WH^bF(h3HVgGKl%6cTyEe#K7hZe> zHX(icb2UuR>m%94TC>VMq5m8Py*{TE`hg$}`m*Vc6UzRJ=moUWxyNDu zT`pbMZfcr~JK4y!A)^!&hu9bVzjT=Y^)E$O%W;BBfp&R{azV`J!WB$J%4n=6_w_={ z`B!vYVJXoaYyFt2;NUYWoG1yJ13=AxD-KUVdB)Q?N*bs|w0xA{b-tZvnMp)6_;5e0 zwV~PaxK1qG+U`QfIcdLFsVVX?B3hE87mjSY%k78l`2t^z9X2Z{*@Nq8c z>kXA2ru0*OR42czX5IFAL~~RZzfWSa&NOS>ejkxw3k{C3N0c(kIebRXVS^4QZA^Vn z{O9+V&WE@P=FxK>3aE(U>tWi0cZxVy53p-|QCqRga|QA$JsfD|C!|3>?e;}q`!8Xq ze*VV~XO+V&DlLLzx5+kny^ss2k>FCh!NV$Y`Yh3|!C|A066&|fQ?!UN>hUQXc{$!| zQy<~(4y4+!*SzC?Y0hDfu^zpzZt}Pm4|zGbmi263+&KcL-LcWECzR2A+?ITNIF)Ny z8joLV?F)c&u=jHB%HjSZ{}6URSq-j5(*o#U-%wIMv+FVGBpF@3ZJBKjZkFAdeq+;k zRh`)K<-B(LqPAM=>5mvd;@=!od49<0bKdi0ndhxj<|TJ!55D`wM+NwMyH!Nb7mzyubii}HlIV#B*%>a)@nXqLXl^SG=Gznm$#3##$M!%z z!3}lGDqdYXoyBxnCclG!0K27ka3^{MMjVt{$h8}FKQu7-Xs^r`X54*G?3rL)ovJ4r zNwjVZpOV7ktlGH+rF;YO*|6>AxGadU#BFTXM~^=iFm>vuRy&V%OX6B!^t)cnQg}@J zm`xb#eeOOWCKO-NYty1X=s$l&H&h`Xel5pyRjVHeqr_Xt062@Q<<(LHbmQ%(_W-LJkdGYM_b8g; zy#oAXm4%7XNpg|K>a(xmh*1{hZMF-gMz@xKinsmG_Lg@?>Ht3;GfDR_%F-jlT&oQ@ zICZn5l1+&j=6#UNmiO-mN^cwPxX_%=vVT7UGDGbIvcY7UZ?lX?0W;Aq{!zz@5e60G zJ~MM!RHM6?7S6uTJKaZC?Q{ zAAJ(}PkwHG)HN@B_GO4jhr!Cn(V0R4(^=fy>!jFXV(Hb8!I37fho(sXA3>i z{%hFI_TH4gwTh+%)CuXB9c_BD7=zLHY_JPFukm?wN+~7TZ1Tc90VJ16^zOMG^=QC& zK51avM~(fT@=UF*_0>8JPURwQrh`Jf;>rp)KTzc=9>ys^?Y}{&l-~rJg@9^` zw95qnJAx9x=^sz#sK;0>HYvr?Y3UEGA1!Cw?b5M@G&kQg$n6PVkHU7@B(LlWGRq*b zMhNRudaruIQXAGk;9TRg7NsjpU{<0X(k;LCL(1W(vci~Su`^5Hq>ddndu6Hi0-2j9 z>+9uJ?LDN6LObeCVe?5F$nV*4ch>4JOv_s5+-y&vHEe$99)NN9pdZ{ft$%lx^0#vK zjc)CVvQjX%X`W!D>gs#_j`BcXV#5w<8SUUPKW-$S2` zYg84g+(A@z8eIwo5^umH%GlO>a;8Jh(yX;F=MtkV7Is#n<@jn;A@p*ocF23W&TiOF zTR&xawidj6nmD6z(qM6~QCbPBdB|9_QO`Y&7Q?yS>=(a{SZtd0xT1}4QTdl?trMWZ z9i=$?SCpu!qHYANmM%$3ewBll;k=B39(UKU_0|BQ(XGg_^?<`>HbIZPq11&G;ZX;9zvml6 zjv_l9Tyi-v^R;FnqR;mesZ0TuGMC+#0<8@@!1G3%fwqe*-(a{ScRxbTQ>`t?Q-902znFf_^1=z{^fV8tW zC}$gZ`WI-#9Arm!eD0TJ7+Iw3rMi`>VP^NRhsJw3HijK$#Lw93%M*kmJ1oR>HcfXW zL(~f&gE63ufNq3|r`hk~NemdFo>~Bj#v7^K^}g@-!au1_peBYayMzO{9NDF*4&zM4V9PeQfrHw$=ZCrj8*PH%ORKA7n51qB6}$uh_a1*~_R zoYZd`a{o_y)SselBC-76C7Y7$?1M`VJOu-`gmNIi}S@utSCS{+yUYJnNU9n9)0uS z=nAhuqd01QGA~oPAOTOGj7CiF2TR|N^s7;RZ&N*VAf3Mqh#ZFhFO>AoTFO{Ca)p`K zH{98l>Z;Kf7|XB=f^Zh-RXn}k#OcuoQYcNH%VC~b#uJJ7l7zA&0P)d_bLWghw8M}< zApbpzi*JDGmlHdls#V0A=<}a zF7%br02{=`AWrhPw1rZd9H6e z4Y}SlpSo!hd?qwUyzcYH+B9m1nudPTk>sSl;S?y?&T2K?6$m9LZhpX&~-<@u{5Q+r{6nM$9aiP!%jm>T?J^0-f@K^=aUV2 z&FtxBLt~!;`w?e+_CT3_``Mk574mb7J(V9_AQpELJ1&$JdfxYqm6ZrKCUs*99ap+N z8V7q!rIS-7IyR&54hQoBfNO)2Pd42Q;V3^pTCvi2lF)|{fAM_3!Ei+_`rA@yeWhob z0rbjgXS@{&hE&k(ux$sUCZ;y%`sT2EQ1Q%3&x1uHtgvzdE1VBdQ3B7?J$Mz+KRDc+ z69PoS&&b#CGn>Mm!IJ8i&gZ%l&hmzamZSk@c_!ujaBOL!7SKcsKh6%z&Q7S%)8y|e z#8c-rU!@F}Z9*s%7ikO>A45;G4qpN#-`U0LAZk^!M$R*eV>P_C4-2BU!(r-&*xMsS zcRx?kT0X&Y17uvXKw*C8ygL$Jn_e%UBiziXY%#ojUZ|+hr9(`AI1m^yNZm({&C9*5 ze?vChf2vo+w7a`VXdE{=Rf-?po8F{tV>R0^iPP7YjOG+KBs03vs8_mj2q@xAM7K`9 zF|mA$qng$S3XAlz(oM9(p7mXpa_+hDYMJ-@+ZdwE_jgAx0YG|P?VGE9HGISMp=c+s zNy$Z3(v!m*E(zQT`join)6dn-S?}O!RaLLXDG(8er*Fa?s=m7AV7UOG>k|M`t*QbF zN;%KB(0OdpUBn``Hde>kT4Z2#ntWww*H5D6~gb5dklUvGdNXEc^p?_D^Fq{0@HO@X6AsEjalYD&D7!kf2 zhxN8U=mAKs22H+xSKVN%sDV76M3k?T~ZrR-N$Hho?-Zg2xE z`){BlPcCMVprB9DXkx*3;_1`dpUdRdBTti9tjyUOY?poZCU8@H9kP5To_cs?ZW80; zTUc9j{jf>jcshR2VnFff#z`Y*<>t%%-3uw()^8fSc$xK%zEjm!=K0Aypo_jvzmQR8 z?)d|Z$Y)Jy+?`0U9(@*DelN&pl(LIgQ?VHtwAWH3|ly~43yRmpSLss`7_!}241tM}c__uwWae6Dl)NMA-=~tc zwq*{ci?WNa=vkJxZJJzNN>Cmvh~1nWygS`s7~jh6{;t!&im8}gKW?+s7aEF`hQ10^ zAOkWzQ5~^bNb^fIA(QM58m{}tO&2ZRLYxXK6}K;6nLu&cX?TICNNU9SHdh_4sGrx_ z2x8~r;$lj-1j_EijEP>a&*Dpo8tc^WpbL6MS;F-5gLbY)TIPuTs@DpT3s#N<5St=aM=~{_yUA=n8{S=ySvnNTL-#+@8%zvk6}VbTea_4kgfOE^ds1Lxp(giwO_~g2_v3Pf z=GLHo)U;ZX=Jc}Jy?}&83hwDW&DzfI-M6cAbeP4YmmkcQG+(6cUqC9Qmx@t+1KdtI zRg4A?l)7$+vB>W)=5*_vKN{S;=inf2_}ur5^3%dB*n8&MxIii;V3R8h#rKiT48RQq z7$s#}3yi`}1RNG!-#+tw@QigozDd)iqWX9n==sHIAMc52hd0wM9|A=e=#q%(2g&ra2V9L?Yg&%PtB&@{}fj4*)E?6LwNSs`xEIn zKtDhFG7KUBxvSRtW(rzxe7wGyZjwx`)O@At?m;6_3+?FY?A{LDdFE~V!nen@9mRK$ zv#IM_lZMl_r5aLC&xeOet;1*BgUfXgizy}rw5rAt!@BUY%)<#r5V5s=Gucogcie;sv9QSd z<4Vgk42;c6(|GnggHI*La%JXa4=Wic@kHVJ>;rfQinTQ^OB&|B)crYa<2O~4;tPL+ z(?0XQ5elrHm-HyDdAFp2rO^i0egos$6D5*epAG7g&52(poGbGDRiQ1n(#`~!${ETr zxfg)M=Xon8n$MSI#;Om{0e=v@n{GIW;`O-3^LAY{0M!Dr{fKn#cY*kZbZI|!795VJ`XJJvd4-@I4@mleL zoQ%Jp>Y((K^4e>U75(UsbPMEkg)W82l5jRNn`QHtJpd3#+_}<7jLhP4Bj>u+9uBP> zuT^i^(Nag5hUZ8_Udi0_e}mUWxw`9;&eR*pRGaeyfqh)$_N)D2*J^Q*6O4E?TI4D8u`3Eb>3;(4K7>5z zr9x)qR~#nEtqVV*Cm%LkSZ~jet85YS-cmyJXTcm%O{|U)y9WXrJS8%`iZU{7*A>ctiE_7K_WD!5Ka`w8Wud;G)1d{B2drSocO%$?JYCWY+ zCsrv51n+iOEIRYD!e=&%hlkv5k<&e`oigv{4jW6^E`lz3Gn%+>&Xl4OBHq%d zmPE-Uvq~u&#vmU%C_uI`a)~NE_4jA1ClWJs2HjMf-bXw7=AyKqP<1%^eG@F9e@!U` zkgTwye8%}y{h=LJKt&u6Y#J?-=fpATUWwTpkaJ0t)DJH*JrA2aa*3L3A^1Cffl(h5 zOh>=lQ`v`pZsKy{{e#+L*rSk30@puw!dVpGu22Rch zEmCPJkOPLN)g)j#SaDC{vpFHNO}VK{!?$!G(X_ppEDpllYDmhB@(Z{bNUUV}cE_ld zFLrsQw@Lp#pjm;i;b-`m?chPf1%2@$9@S{R(>5jvIV$mla}jZmq9dxWeE5&Y_Qu0Z zBRYr8hxFvtT6aL5FKz3(bz_;>dI`dkxEVp7*_OUox;zZ|(xmeC8RTeOJXZ63(xb7B zgX-&n?NOzoZqOp!p0RKV^U(U+1(Nj-ME2o=vw()&#Y>IN^>#JR7 z^DxIXp5cOh~^-URbDhd+u(hxlug(o zx|;(pmDBAM;x>Vxe;#kc_YSZWGXq88MUs9Y4~mniLwFl2$EsrR^Hq0ZQAX;rpz1|B zHLZbdNTf!%9Siq6JiG^)i1T(Sh-O6Z){IN#Gkpjq6AQ(Z)x&taS_eK^j3V;1U5q%OmHKnHHWUXS7fU?tAE=1C$$7UMgphlHr(|jemC{e-! zU9uJQ@qOWEL_pleD>zK<$6KurIB7rh-(I%m_;T29CJMDC6Na(JeGOoX9LrNP@A%mn zr6mZNa2A#FTMUqI{@6+;qwkg+WcldO&1Ghl$2ysnZj8Ab;jvVX^MT(NluXaL>V1EE z%RSfVcp}G1@M;uO=(|4JO^O_iul(W2aDj|Vn`#=Yg{$Kx>2l0r5{|omcyhPKct(|$ zGmWlQHbIARCU>qLa@@jH?{16Uu~Eq+nUhT^=5(uMuRry!Fp^BRMwjGavMBOlJeiTx ztd$e=rS5HEtwPYfD&xdsTmVP_37tFwW+`*(H}5m3an`{mAkfQA(*{{v^FUXZ;YBYU zgH+}vlWQODi2@1vB+p6^uNi00C%7y`5<~7isJFhZR_o&jfUy)e{8oq4tToys*&oi8 zY}DYr4oeOsk3|Z3A>7X81cWEJ+>XxT4XpQ6e&{XBFe3F)HE-!BSJf9+Allucx=k8o z7fF-QlK9og?$CIS4kl$?3w3FN9IV}E>PG^4?+0{v7!m#l?_T>z`#8lOS3f%j&$G{SMy7>|0Txnf4NG$fvl=*?KyW z{KEsx9Sp^XgrUbWX=U`fgB*8*FFpZVmRVt(|<0%W|PUlv2CV zabRp`9qmR&=`+-E%IZ3-EUJn|E`IRr4j*bycEQ~>+32dYsuS*ezCYIA=ygi)2wEB| zfq|EL13(RoSuq5#b+3AuY-9p24;r?I3XKUB6pn{jHBv`tGn)i_-MX}hueQ`m)agQ) z=RHzq=`)*Dz%P^P9e=WLd40zfm-MEX6iVo(qE=L5rB#2+0!!VTF0UDh=H;=a9cG22 z$pgttvR{7VbWuO;(aPM@n=FHs%FR)ysysR@a^1W!ZGuIZA8-y%`kF{Phg#G@2TjH= zst$Ii+2uL?o&eNLc}7Fm*&Ac;JB9;)@+3{5@6}LJsCV}rT&eF@H2e^D`(eLPbg`G` zx=>g_yW;oJ=P~zTs;UNL{~x?T~E{l>YAzCeD61-HGf*&*1zr1IPD8+m2qwT0#q zZc2bUF+~#}#v4!;j0^q+3#CpyKyb7Hz_dC*%syHS_h*A=)vP6XO7Nz#%(oKH{E&O)1ux( zU(6n7;rQ5iX`;jm|FqQxuhJ}as$-75$n)7wy;k>T)L+9LC7;0|4LyGPB7&jmvdyKL zn8&SS4cvXzE|6<7tc#mfb~2rf$-R}z`GmmdWA9D@Dq#D?Zetyiv)Mr3fK^N0uLD@V zX#4W=u2awcjlms_=DrwmK7is68k+R1?v};tUT}<@z#7%;Oi|9)6eS=lFp#jTa^Buc z*Yf64c|0cRZtawzNm0Q)2-yqm&~3WK`)*+L^tn3(mmu@w{k8SW!!$ZEhLkC*ny~Z9 zj+od<_p!KT!bRZZ9W~9fVm5DM4GQKg(7oz*wCfc0b_sXx2mFUW3OBDYKk;~CJy*_H z%*McVyV%Lx#&_FlIFPOLq;*nfL?-#}OF@Qsqc(so_zGt&5_}uY(O?8P)+lYRvx*gb zhMSw`sKZgrs4ohr8YotXWROGB<~SxGDA?V%OOYif>pnb;Rx<*tiD3l0m(sdF7LnEt zzwMGa`YQ1}01_Po*(Ao9=o4h$@uKCgZj($`<5BXLq@YA%~k?(a_J==%ijFN_%tvZo^CD{DY3Due0 z(z08^1aNzUO@`CxqyWeZ)qJ%M7nTQ8cBL~XA`0;b!QH7J;C2iAHhM+nwxt(ijjqpe z9H$B{?zyp6h-B&a(G`@akVu4i+qMoD4^Pa+@^5b$h2eE73==u#Q=R9j1zOEc1xw}8 zPJptm{quFFr^5LGhz)GJQ>8VxHlx@w6m`<%&Q6R_7*aFw%gLWwj^5qejq6}FXS4-^ za*u$5@alEN5~+#8d!JQQJZAo~gC78p5$he+o%)at`VC+(TeUp|1hBCVX>^B);4QlY z9_95pGrpcdHnf^uuABa1$G{Wdpo$a^9gvsH7C?CVbWL??Zxat$xT`~I@Jms%Tn%c? z?lec`PCQ~=SFwSiBZtk{=LYlcu7aU(r_A_RAS$uuE7pKV>JB9ERVWB8d*!vUw>5ZO zp2|iy+(W%XW%?;I@8L(T{5CR&g9_5K)IvDYx2hW5>qZ%6A@{@pd#p77bQaOwb5`Q` zss_2|WQg-u>79%hRRY$ZT%CrxcLgftk%m2AzfKL6iYjb^5~`x5)PCGyDT!^U?+0>G zbM-s{EUXKa{HL#OhwP2<)uvGGH%5%)cC){XJ4L-yk>y;oi!>f5-6Mb#uAdyw6Uy|X z@j_SQ-w=t(MkqQF`FkALSBr|?v4B{L-4rA;rG55Rz;sIub z{pLGngcOT1$;N)yKYz~VK25Q@KHE0%y9UbE<3_&P_w@yXA1$cd166q|%qOU^!U$3M zinVIW>xWL)fvC62C6B&cF&eHNgp=SqET=dV3zcLXa22YaPNg3w6*5yjt_pk7+Td|h zZC0NTM9)Z`tQ!-qKHRf)?lmh24S+({f>J+!K4vuNqD2|;YEUlP;zSDs3fsR48D z=kC}jyRm*-%W@17!nW&a^5e~wS7ZSzLNo*j*FR7rk?oy(iFvhX_S@k*hx1Y}0$y1K zMJ;sekhzPJr`C1hv}W0WeIU6Ky=uRRVFu-e9@9vS%^pOnF>)gAJwF1IKv?E^c+pU- z$-=|+j83M8=UlW;%NqQy0Un^fHoC|Pr(rW!=2TRJ)o9@d48m!UEmynjR>&7n-;3ROd=wbwL-`Kx6>5i1Ppb#)OfNfdd)HCki zkkNXx2JM-;9eBxq;u%c2B;_Jeiy|I%`0t?d z8SGg6Z;y9vY6W;*9z3E=h&Fc)4@Qy*>ZkA2cjGeVD%BWPUHpRJkA`aOTG=cnrFp)OxmC>(uAlTVRC=-SobS%f z0W_njE>pAl3Xf$(-1sL;bQpXQ(FS4_n9T@siMB%w&r|d$K70_cADxe0U5F0GhwJ>Udw^!hj+E4Xcs*%?x)=Y#c_@<2(>jv3WaQDW zEbIO4`+=UgL?@K+Gl}OH$R|V1rKB6FnI{-S5a$qd@^NBb9FvQQA5JQjO&X8`wL?w{ zB$h+wGsnX@DH)9GJ!nz=aZh&#T;Q=i8$q;Zu@ZTF#!5I18b?FfRI`p-3)0Cxz+)q{ zqjLB|m(F}TIZvta*xruUiE2jsomTFTA0wZ=+qL+tqf67a>5lH5XZ>ax287{bSisQ` z39PD^S1@}rKdot3=gqWzP zWa9=gb*Uhe-C%&y3uAmV*8DKmhqQ=rc(Q7Vv{7M zx98n;fA?xPzKv6g^DCUGRQ-Lrmq)Me7?C*kqgvPHK^>VaF*$)X+ynW__i7h{%dp5*%*m&uxdlD7j zn2`pjJdhxOt-xQgmSR6twzhV0Z&B?Jg{CbeF3cFkd+2#e4LdlisPW*`=cci}38HXN zX^8KYpgoFQ!St*EFrmhMG4IYn;TENXBRqp&pTC;hTruX2`snSc^U$=>oScTG=ut?q z!?23c_VtIrCfR!L6+o_;BoY#zL?IQINS9pG=V@K3EX;G^usu5BCfzCG1(>o*UtcfP zs{y;wdS_CG5o__P1#`PsurQs=c?f{Lw`tBy6>CwsgS3KJyr!l<*d5;Z+$sBly!yhs zzW^xi1kbx0aeV(kkD+ipmbR2=bYv}7n-9ayM^Wz>mS4Ol5dvUrR{p4j*h5-;YYYfa z9gEB^eYHF5?_2XW63kbgJ|rGGRlPi~dxFw)P`N3jPib4%Wc46XX*T?s$#b^L79$|2 z)0KJhPQ9U-iAp%?;eK#^gQ{ICp$}8(ZlEs2I8wbpE}^M+gQHBS2aKdQ%l6i$p1H(u zb;fI#&weoa!jUiF_fi1;fCOkTE}sn43ib%$B;+B zhWqQ6C2FCJYQJ$mTRty(!@C{Y#k+~Uv6^t$S`Y|CrQROxG|?A3N%rtf{i|Au_RM&J zQg?kRl`JGWOC&@xVaUcm=-M9zzg}u%Qoo%-Ch88gH9eZ~(JS%Lx{8HS04bspRn2;o;;K#{78SXKnWB?sMo(x*zF$nD07?`e}Pji@{G9` z@{kZ~-OtUPlZd+j)~&y&4T;z`aGR=Bg)yleu-twg!uKM&I3}+T*kBpem$>iH*&pEX zN;fKoeC7-P=q=aiM8!uqGO9V+aEJ!|+2bCAN%n}w^FC$C{2?M@4qP2D-_dXyV|Aj& zW!1!Yskg-u(~UpuX&C-S%Xri$%zM#NkB**B^M zIt6~2);57^a4}3oZpONWvJ2ptj8w9W3s?UoCCNcg~d`fYWUzU zWEn_r|Muk(e8lzz6r|_>@uTZ-x*o~y)vs_fP>AT;JB1ayTm1(J8yfBkpHZ{()=z=? zB4?z=xCJU;I4zaK^EE2{mmIEik*p4#8Id{T6*kmI0CQ^mlbSep!L<>%HYFgZRK5HY zUd4hJ!y=HfWG)&4y8$Sd=@bC=+un@1Jr3<%;ITvZsk|Otn6T}I#eDt8?Zj3dw=NY{ z7AyoINH$H7qayWDP;rty4SH=%DOt%ysg>@`3sWtg*c&&S#OFATT{kSZS2t{Il?WFh z=~iV3wedLthFyJ4f(4(JZ?5DSGs_%fA1*G`aB0^t#70+9??<$>rqxf*1^c{Qs9g5D zAp?ht+QvHj_DL0|FT~wx$1rR-EL6pr86J)_Psanm#n0VKxT4a2T%eg6K6R`wGVFj2 zj0ZSG=9ImqBzgN5p;v~`JgJlc_jIw>qS(i`-5XS%^Kc*|V~F~^i}x+xVO>A~E0d8F z_6G)!rgz_LoIhWMuOP5DV~7g|!-aQ|{hWia#WujL>@qJ=SC zx0&Ce!eB|S6Fe7ZULD6q#mJz=iJi_)l@^;itPXK2?kMK7Fc|VW=`~S(_sHUkM5D?5 zy9?`O+V*H&w(ChRm5=p^{Ra};gWD(emp$*4vd!P-y1bAusCS(3U&s}W9nEzS6qMe! z+a0WJDy4q&-umb?T07?IRTS^lxNEd}Q3R=|8{DyaWaOK4UYm0w4l5h5PPuRr`@X>T zXV>tXd&VFUA9}_n5#6{kpU?!)o5`^+YHOR1fssT}(EG2^mxIQ73}-ako%Y zoEo`4Y7d*PYge{*QUF;*GKRR9f6pMrRK>f$UE_aP{~E%NeA3vD2-J$yjb^JX41k0! z(vUiHI}s8PMlD2bL3{In7i2-uM`&TuV-(G5CsH5YU7yyhj?k9ate&HM+~(hGN>K?5 zV)c6PP#^S7@BHcYA!KnRzNJD}1Q4oOV*EkZTjir%IDaEu{~&ow7!d+-!lkYdf@JvY z){1j2riOB(YMa8}toOyTOzAByGUpTPxbKT!ZMlk&&>(e4a+<7bB&q&Gbd!M4<+FG} zwiDX_hhI8*1P|2XV7Y)YO=8DP4|Sw$g4`7A>?lB9f`U6P)7#%iEdD4ZE-~b@py7d@ zYJYo1{N9TmHY99%?dkDSJ+_@|J1^LdN_LZ;4R8|u-hC1zZ+HPJSjxW@LVuW`KQ_b= z4PJ8G1g#_q{NLY=9{2?ls3gB7@mIU%_tyR1kw2b?|JB(3tEay`%bOn|CLhgDMD9Nd z-aq$w#usSvj4ybj@ZZSmKi~G-h#`<=2z!vwx+(sfll?C{%a74R1T=Y=NSj6NKMYlE zANpJMB|Q7>(J3{J;vbyBEwLhBK6Fki{w8aFJ^ch9{_Ba>*Q%yJ&f;I5J%&%cSCB;p z3Ya#TqR$Ft>{r%iz}428I z)R)aD{tw@{5&kI1)IUIusgK~psKUQ|*xwf-;_s_%Ra*7eWBxa<`9G|sQ!nxl-G_^o z<7ocB*XREm^aC+}(nShAg9GSatNkB-;6Faf|G!_|lFhk4C~xOQ>f-9b*Oe0+23EaX zD-fwMr05W_bIwPXhUAz_w#k+=JPGJnX}vupmChcN3AoX4Il)K=P35x^(~hgpDrda2 zKB#q`+7Z-%wP?@r*v_OPr%^3K4Xb(C35|yTSO00t2IYi7)p6t@i-aD$>B`gKmFJXm z`PFkr#f(+Ih6eS(dFODxn*Z#BpMs%;@m>`{T{(+h8)x?h+Bq`>v@^(<4N5Y(Y5CM` zsH$Iap625AlbNrs^OiyZ589u8xsshg5>a5G_P=>CC)~)rW3xxZrXQyjk;Ob*>bav( zjU4vbHLX}|_D2oQg)?2SrGrAbK%8vw-eaWVg(w1Z*maVKRhPT_%xfSdk=A^SGsw4VG!QLqXEZIP={)Yl?7VjDfA#%!Z(?`DZvKqyh$7)j zUq&j8&HAHL<7nm6kQ$jZq*^lfF>IqZ;$nqNz$0~Qb1+|JT`XTMFFfD*dq_UAYrB3M zHZOd1N}MmV-jy#MQ)ao`gl)N7w){+fZ2xC*DpE0?id3?s+LkraW$gT#_-=`$@#I%+ zX;oWdS39)ke%Ym=p-IUSYEJLj=sjvhj$GntrYX-9@JKJ;Hj3K+so-|atW{?Bj(tP1 zT)S}rpXtNE*{_ved=~AuzDHX{>Xxu2)C(V^c5I~aba!Mjk6FRlOKG+&v+J@EhhBLI zaZ30~ZlOdg=7U$G&!j*W5WHe4pL&T@nlouYKNf40Grjx36O5Wo`R#5^5>X_cxlpTs zloF2wphk>fbXFvP48XV^;1`iin`$>VIr36NUg&BYM%VA`3J_1|zvG=>A zcxOD6#Ap^5XCqHhWQQDOWG0uyWc`tO>#ost$J3>XQGbimU9ZlLE1lP|5>erKj8g4& zs@drq(_1f>IFv7WnqTxgjmx8r-)+CaZQ#`dy$PFnrK zI?FcA`KnTsqy38)N z9n1-V{HEh8tvkQhsq^*ct6YrSh&?n;b8GosvqI>}IW)|IOa{ zEKYe@nOA16O1?Y#Fw}Aj3uTl*I8*J*Yv+LGO2vZ;?a0SaIgK}(;pwzuEJpx5CLQ!b zF)?oOY4MjxvsSPI&_0B zhL2T`yE+$moJUnGpU7m<#V2Y&YR+3-pFwWSLw#K8@zUva7SpB7`orzuWR6EV-@C9I1Yl!&J>CrQ3IGw@)eBtz--CxjUO0FXcqp`kq_}M|Ns@ z$!$MKPd9@mb!EG(^B7XTE{O(zwShzk0q?x_?FiLu)&4b?bpbvJ>n$$>L^o16vwr(~iq(;byz5?` zvtw9ebWwwQ;q6AKK9K3RSHbma8$Q>X)(ff{ddgf zudJ2AdT(dNPUvWVasXR&5` zSP@_4{@J6}>XIjy9}HOE>~FU*^gOnhDs+Bo>mTVxVNOT$@Jf}1fi`I&wg$Dw)amCw z&rDU@ZtXJ7>M*C!r{g|Q%moSv z4$Yg<>xklefv#sLUX{cB7ThT|RVyz&C5^6$F4%&F99k!zMAOqnQN>mtZhM(*2wJWa zzjQEQxo-2lW|DtyMs-ut52Di!fsU%;dzmaT@BH{Co*#e4oWP`ld2RD8)>5oV+<{1b zFK~MPJib`0L%{#@Mk9rCstucA3k?bg%eECq74y2UvXLSFt4aV8NFHoCU6BqE#_pTV zui@XTtn2S;N{n6K8+=Tq{&2bUt`Y2C+hTENjH>t$qTg@RCc7z>!vHv;{2cep9!qvf zw(rTfApOc?Ui$^pmBcEME`O|WPIS3PHP<)TB&-}Ew|0EOd);eS%W%Puw}hUp$2$^> z^{SfIKdXXA(Xg)ea#8~FoN8?}x==VYYZEfB4m_|wH`F4Gzfnroe0zXBT1Ad(Dm1Rva21mL`y96OV4kuyde{b;~$cJ*CW z9m)p*BGzZuImR=3TFcuml1Ac#6-o9U3iA9k%XO?4U-V{JDw2c>h4iGgmxxRCkBn$l zMlVMW#ZJu{q-PUhd9SFB;4rA#t+t8ZT&UeD6&f_>H(LB!bDH?uCXEg=O@HaZmUbQf zo1CH8kJmoLOMa!=V5?Q7SyNE}XOeza21qPy2Pq=xv<>mGgt|&JL{cd86ewlaom!Kq zLQB#=^joG*oNqI0&U=|n?Ud%5^}FYnkC4$TXS}uTZGPcOx8enBy&S8sij6#RJ^%6j zuPP^214SuI*h(o&vr4$+osIW@ZQ6lWbQ(t0Y#$P7`TW1vCb6vOTV6THh;!M2HTP-r zjRE|%7lbe7;4Gbu(o3PUrRnDW-N9UJb5z9T2di3;o1qy~GNi={_`bO|i=4~GoQZF= zLAA|uJ*V+O&rETOF3Mhb(c`c}f@{WIyXgMc7kHk{D@X|%tX-b>a*;#^Pn!+>B&PQS zKd!Adw&HS?Z)VMq)SvHeRr@b5fI_P&3Kx95b);29CCzWAWAq9c{XOw%rEKBh=Plpb z0XY=99)}3Y$6p<@4dWKjRgI?g*);=^o)r%x^x3|aEfPXom=17UnIUbIfTP~y@>kHB zcEk~y0v{C@Gje=nnD@!uuDY@wUVBvRWdpAC%7bwg?Ox~A{VlAjED{T!;bYhh_~BNk z8ufC}OXQ;mG_q2PcBB)es+1z+ljU{ds2mo&t#BF`+HO|L*a-Kc`cBnXQ9;W6>lq2& zBQ*@i7huF;%xDly`2ulj>}bnC41HT z)}W-uB_dWdfp3UG<|jm1DBlKWkd(|1mV%l8TpX!-<&-{f`H-2pJKT%l^_ zFfmV=^<{4i--@sF4cOlGq1BAFDCE`~;w`Aw!Wwj9Ti(hV{s>sB5%4M`m;Sl`ft9v; zIsW$N*`T+=Zm%r>s)3Dtkcg{b&OY}!7YO2$>6q6h7)k|@1Vho(_=-3A_kf(F!ers|dhp$%LfTo_9%Z=r2qXHC{I;ZZkx8Jp zWrE<-VIM&-;C>UW1Z-(3M~s}0Y{w*r{Hg+11MuvC4o#F4w+a$Zf?#xeRC|t|T?cgcu_Chge z7X+6Q96r+-=io6X&A>+`>I%9$fiTaz4yt-8bJ*Qvjqjjd=3G%Cp|*-)caI9`xw@%xz^t+&KaC1E8j{| z3Lt~u41xs(j<82zH8Na}k z#W)UIG#lttL6qoJh4G3*dX>O>4IjgT6t4!dB6fffPyDwTwZi5PpC2PwRAaWAw2%%Q zwq`&xQRUSIW*BU*I~I1dVDMsaO>q;Upx_13L)X-w5a|3a-g+Zz*^L~Y{+zgSuHYdj z$bZT2@)gO7|9CI0f~!Df104m#Z)1_#lc-}KKkl-u@_Scq8CkZUPq@IjSG&*iLGPU}-1a(l>EcMfDRT~kLym;-lBtY`PwuJ2C zICAGpJgLvZLvwFHd_%0rt=O^c{_O=;qZ$uC|k1yCj5W;0(Y7qH>f-x1e1v53wiN$Z_v@ouHiirh}WH-CC5rhoJfn zt|y3>$|TW+<97FTlzVqX2fhUG%5r}NozwQ*uYV*+3M|!C8E6ZcEd0cJg=GsyZo0^P#-YzHUbxwn5sP&ukFI~?CG|u{ zo=ml`qXcE^y}hT}Qc|;bqgB&Amh3k4ruF(VLAWdX zI9<^;lD&AyRhiXKGFWLg=nkTZ*a|;Fkxa0-8E%;v zCE#B+gSrL{L;Zs$Arh0W%0Jxrz_<=5w5;Vn$}y~;sw$_dn678Uf4y7c5&B<&{U8*i z=gS?V%e)6P8KIUVkt5_L%R7;2d@bm8QjpZK3SRphRc=rtqiXAS0K<5nBwwj?X=r9f zeqapo9&lq<#d*A+j1b$Q&c%46N`+U!6of*T)JnY{b}gt4;a>_8C#MOob$S5#so_4| zlJ_3)gxoNSjhT)5Z4Ic}nkc_U-_%AW`h^Y)2t+x-@z(^){B7HIRRbv}*9%=jcZY6cJKN zn3WIrxA7w`RMs9czcCt5 z8<$RQ*+;i6Z=4QdRS(0XP%6x-=eIQ%CK-p)^@E+X+lAz#Rf5`Ga zED@$3Y1Fo;-8FuTu(>*fT)iY8$6oQyeCIs>J@C@EXFM63i+W|F^>Z9LIa!9WGxlTn z<>$3BpO_v`u=5ggQbxZYR}$P4l>zCe6h#aa?P7iBj5Lti--EeI^U>*3IPX%EQLPhO z^-QwCPFL0xpROO~mIpO_PAM2`xLd6Ux7RuaPw$*QAU0I>_++@d%+_k3&h|^(jZRBh*lsDqU=B48UNle`7F{# zxlhGSwHH>YAb6C&akB6QZg_bmYVbtfw_Wo6)~{%?W;>RX{hw;heb_@!4_pV{4psVG zl8ci%l{=B2#6~^Xkn`Qd#yW<(F&jR0Aoa{ly&6MH(zj=j$gFPixCVHnzx$z{?@M>= z)?O7vKI_orERsKfvJ?Qmn&?lu3dKLi!(#w^1$^cvDse!`A*#RB9@&_ggWCv{pk({W zu-%R~_8ZlFEW)l9x#fRMy-{P8Z2TB;lm4<)z_yEvlmG{_+H$-aHdOgxRK^n0?1RrA zfn!Pl3Hd;IfNW(XyoHYOYiBANHfB|sC3Gi&6ljtLI^W+2Xx93WXR5$yb=?hkTTg`?4_=WA#N?#_ zarb7C2-yT-Tdmn(>kghxlhi#?tgD&Fj$$cb61rHlbcEXP0Zf%yDF33G3na6 zZ$xM3C=4F9p-(c^q7(nAq;D?LEn0@J`#D?F+ZPOYB15;Wl1}6%Wd1~W1b?L*|Dj3w z&n6r)9mzdc&6>|}ac+u8W@`@bBdDXkgDl@3_h(DhZk1{aD49JMR*4`EapTtDffpVbn=?1_)Z8Lp|~v=PQrBiM%A!WyTRympT+RLjGEo+gzpstFOwYcBYXXZfw40ubn! z6xx#laUi4>N}YW--w>ME+Zx;1g^LNkRqy^dd)WKq{$tJK_T4_cVfV33cXB%w?#F1C zEM=;^ux%V@Z1l$V6R*=!57x(y?YVcM+raCc))#DjL`W#H&h6cv z7uD%rNqNgjh$38O4+Vo=Bpo-DENo^Um~l*S^(YD1TEVl(eEbIw9$D{}hIWk=YuM&6 zVV{orz`+SNS!U#(^1r1Pyqp9)*zhkN(W0}ofTOURuYHQM-z+-+_wXV4 zaG&wcBX57?ox~oNMJeG)n}|+yEZbS^ z!Yu2MC?Orl&6zop8=Ul^N0Pk?=`|wnZIbD|Xx}|4pSHhHTEAk)>$qYgj4X2j*^p4DDl?X&T=DR@Y>xgxNGHGx(nW2_$$BkTEVv6ECH6s_b?v{OzTx%Yz!o8 zRsG<_(w8`ZPoDZladRXvi}R=NZ-2pZCDzk^dXPPah{vc8)Sx-3@p^}3bkVWhY7n1= zqC~6Ql68kl*_jVC%o^BzPI>g>Ti{5Yy@1_3yUgLr>y0$h-~eQUP-hZV3^}mW<_nTq z_-bKm^}$Osfp3NIjc++^8x@!c>q~Tr`#_;*1g(vcZ!excHLa$Py6MmCax3r4wi!J6 z*eT%s#3gjHAK43HQB_^C)q{f=dt|3^CfLRwcus3I|(qTD- zTasMZu5iA}D?OD4aT&KYuh0juZ**9eIt`1}X|O67r;J_qh-@6ayWHFD!Mx=;rlFdF z^OU4_=X89Y>|64}f--wU_r8o}3cPN4;(NVKs;(v`TjQ`i+0=oi%<>@1CCAc|xrXtm z*0HU^gKMF2!v?L$yJ+J8GDs|as4SmV?1j)S8-@j_--4@e{oYQ)by;+ z(PMl_u^;6a>OXvIu#sq%KY~4C0rWase=e@KHo7UKy7G78Wf zvrd=BKnBG%`$v42ixSq~CBpFPaKQJyksmOnQafp9?x@d~zgqnX+@ea74;LBlk%8Ny zxf5T%B@|$lQn^9=r1$H3{R<8(LKaTfoe{p4_}_>ARe%+XU$e1iE$rU;XQSG?5U8;n z|MJ~=6~oNBB#o?KFsZUI8+HS55No*8d&C@Na>9w|+w&fHgZ&-YPuN z6ql`69fE8CjeHZAwrjaW3Lm6szJ*|P{)xZ&l$kRk8EM`lM}XGZa=#_G z;jHZz#*tK!!hQWxUe^hS@VqB5WT1ba-2YX_3Hju)yXv#gP-)#-JF2q7@_L$u(+#OB z9OY@EH>?wen?Tce@tL->6Wa^Y9;gx0pvK(&aLFQw;Mhp+eA&cZSH=qRu-hX?Zh^KR z6W4{!cUGU`Z5F=C`D*x~I6hxn>sJF8J6kU6UdXaQ&)p3lxTP54{pjFlb*Oze((hN7 z7L{c=40ZVrdS7(6xQgH>C@TXuP!la%c_<`Ou3^CjsivuhLthY^V`vI;EYY$ZA{n+8 zVKcC0f%KKuvf3hyDUozI(dDkv`v@Ke#M58^q!OSC?n(GkC7ve!)vNbnwYe{)e${Ig z&$i*b08E~6Kdpd|>d_@-h#kUbj?TV&s6vrqXg0rQ6n2_X}fiaY6|M^)Iw zNcd0iG$Y7t&gLNO1f^{4Z(20k1 ztV#qU{BptWflz&wU|4m;snZ+)J)`N-I*GZ)*Nzo_eBqQt$=>XnGMAy~{ z?U23qVMG^c+@xt(ZT2GO*@9+COll{53(N6~`a$gxOgSrN0(#pvGd zAS>xWlNC{wtY-BDFLIwdjFPRMW}I!L^NAfnIZ5R9%ah$dxI*G6nSn6u*I4s+0eJL? zk+eDKND7DE47TGisk$NL#$3S4?Pzk4>7$7kyk~ne8rDMof5$WMNi$9+r`4DdHxDyS zT37H%aJ)Pa<;LJ&SU!J0yamy>WFx%aSq>D-1k{qS?PdDd!n&JC4^%cB&HVHvpy!mW zlxz@3Uo}(9TeFEchphoU*2Z89w%n&Pp8*F)y*XqaaHV4OW06#wpO|0vVJ!kx{>o4f zs2OI#A(LfJ-N2y*~HA0mxVs-P&r{N;9Pbacy66 z@&n8NqNn}<^gCE52cE8Y72%7`&8`%%sr;2yOAI&gZ3T1U}T+>xC_z4r$Im%Hffi z*5W}5(y-&tP=(IV3fkjVsn^$rByN8aEd6F#3*vn|g)}2eU2eWe2@HLqlOtTDMCQ8n z3)e@FgK8oZEN4^>@`)_grKetmTLRYt-yZN@X1?1idoVp#xPE07$*;fyWR5h&iou7K3(I!4r-gtKi{_Mi38`hk$lj~B1Qsb2Xk)cL#+KW z?;1{)Y2{uqOnI)VSI+Pk;ylZA9e0`aJ+@cR{ z<}Fo`KEm3E!H}Cb`R0RoMFWzTZwHFT48&2c1H6pprU2JSp=LD=G&%N@wW(0Z#x$7K zp`Tr^r#~(90km;@4-0G8p1oK_j0Mj4l|PWT1^OqqU^MlEqp#Mea@x%2s^-BsN%d1! zzSfk+PSUVM4YA@Czj40cUxg+s-e$f`c_?r{uOlvwnq*cZ>u2GisDiIOExK$S)4+F| z?K7pPG33`-muk^qrSj2ALm?j+ly)Cu7!dUXy!Y};Uo0Qa4Xq!VT4Mvl4|AH`aU(#^ zeGo0Ab%#t2O ztGeW;Uoz2T;mP0coiEE+gj==^F`MzJk#V^SvrngjJU)~aYa*IQo{xmdRu{(FVozJC>rYJjw2!vI@RtZu^YCM?zI|hIXe75eS zJQRrH_96`q(5~w-|CK&H&04<4|#ct6YBabyejW>E&pDQ_?O`L57Vt{87)7t zMG=i6`K662CX|)yZE9+x#y4}~3GaX79jc8uT4|l_E9)z6_b4Y{(Npt_PRym}$i-k= zo{Fd4K#~^r8%Elc1Ron;`zj@n)H$wN3*Y)SDW)Zx1{7#%m5I{f8l|c{Ye{IJe{AZnfIoY=UE|c(Ngv9hfHU1 zRJ#38mHpxi9M$&jJ{kDL_Y&f_UmcYQ=%up)53Z^#hSRi+{HCC~wSD5#j$HIT`@X-w z`p>X}qVc6D{%}`SsbeYn9Y9dmX)>{YBSime!h>Y!C%y3YlStG@@^$JyC`wN%ea zy;N6&q+38Y0$zejREp%&FX9fwnDGH;`0FplS+oCZ<8Rrc(3r;XyKF!iZT&KtCHBP?b9tOwZ){p;jj+_WRDe)lXTD_V*Y*?@O4G-K*O1AvuM(K3F zL0i4qA*)_5*Jo0ygXXxBY-c0?Dq9Q{YYX$y%#om_rk#N43;JxH#9^A0g9S}K49QQ5 zDa@~>vA$3t>ELK0K_!c~a1z^~qZbWnw@PmNb7S0vMzbFZRaO$%jbP!iXD z5LFX?W87sr?~Ac-M}V^G|G<%Z0z@=1F06otR#^yh1D2SPlU5RU3ci2$-vjYC|I4#0jjefW5^ zlfczQs{Ql5My%wK*i{9t+vu!1`;&-8U7g$+%xeTvy<#s6Zf-Yw)!I+T!W-YVU|pQd z?y!Q8G*bVK$y90>2Rebv+Kx1g^M(xfqk$f_q;f!m`QnyKHBtEzm0dd?9(9TumIyo` z%A51$D`dnDyn5J@Sm{wL6AY# zgX4eq&i&LZb92^=oBl8SWNqk8h25~pX;%S>DU(F68j^?|gHico6fGv3W3jimun^Eb zYLl!O-yO7d*D6Ad5%L$jz@vT=L;r9*4qQhU?nHHESpMa*A7HEs`)+ zPAEsU9-#yNhCpyGyJ1bN37K}AxoWf2ILyk5?m>L=(wcgx7*EW2XQ=gA@Y%DUNH-tF zO|BovT5c)4@gihtfm4_5uQmMld8Mjsi z(}@qO=klM>*M#F0fxP5kV4Xplg!XF+A?LB_LhZY7?^=2FidRY%sz^Cy80ox3)HiMa zdh+V2=ur_mROCdL|_8zmR%fkd$og--?w)a1wF-lF8 ziV*PCJgQ}x=SR^Y4CnVbK4j|kHjJ)@(0XUp`B(=IsYy{+LH) z8(`t8L>-#k%L)f#5^7=I;#yDHIm`Dv#VJG7T^y?Tp8MTAbx-(e%D+(Cj$9vz`90sb zJ*6+>3w8}-zRz&%ZMp5S9==G4Av}z2)1r5f@G}$_54&lZG1WEvPYdSn8zxec>tYS@ z{Oly*x2mb3I8LacX7W8n*W%fnE51MbuexBs7X9pQu;232c+-x*zKl~l9Zd`M zo&Y4`7A*W@K4ii9mC+`PD>GG*>C4r(Apevwfd6AoAcrX1%fFO=E7wc?90T0-tBjUOxpX&=QUWHKHI5+F&70ut$5IpUzYqvIhNZB{ZXgoTSTea9?Bvc>^|eYW!{T3 z`?vHs8&9>E)JMk9CKAY!8zK+PJ2NkO14X5>uu`zx->&3R=*K-)mHJ)AGCopB5hyfn z>Pr;crt-eBf^2ogSuT~>Oz)DO#B^!~sx8L5TV9C>Yg`W)!LpDi{Nh5FPr`Q@bcVV^ zzVxH2alBe(Y`yUquwNy8!!~XLDyC}SXhR@|AE4U1IAHI;H8-xG`meB-%z2(-mn8GH zZn<)E7OE?%^Q&%k4D*fb`)Y5(~0=L(}?Ahit35A}ytr2kTir zn17G0w2o_NkccT+9L<4w7c3$1JjFi<}JuJPz~|8{xnQq$)je$P2souMPwW(5r}G7 zs-hN6V^j+K2o_Kw+)_CqKAoRjzTiTXiPoyQm%bHWDxQj-PWPxV3fLd@naewvY=~>= z#!6%LQI-)P<%E`WR<>^K;`DBfrmw2H&XQNO7hNez82pl+KzGw^MHC`hpMs!@NNM@U z+47aMdly1h{SIi{r{Uc8iV#P=a^GT5*ZbJ}A-Le%eHO3$-2fo7nSV{>?6zL?02gN3 z%_RB#MJ|r2)@;b)iwyL7s;rGGzg>bZYnBBk8Bljt&4EteBR8lze`!CzW7F61vwmz& zcIc|xNEyj>>2Sl)M?aDTEx|F=hnz_1F{G06pS9h;ceJ)JQ6M-?I=oDw;d##;N|T2z zGpP5a&x=W-&DvFYSs>{HA(knHL|t_@Uh{MKSSR=P#d&Y)s7xQ|HB|s$92{$hm8{mE z4)>m6-n{-dkXqnYq1N25v?lXpH?U2Z_dFzMB%sjhspDsDJueKd0byP%%hDC1H~SWW z!HRk^r)dN)OZog|W`w3a7AA$<%|fGyrKi6yIjQ%jnOHpGwWX7Rx|%w?Svt@!dwJ=b zpgl>AW$yYrUQz%%UFOm#dqIOahyg~TWe+sv3of#9W~AO?OHTzo9~`e8e;c+N=F)*o z8`xi-R~2bDtK|^SeX|@n?kXD3Eq4#W$IoSpE`-n2R4pfL%!6dh9hRC;*NWcKfg8)s z-ZjdjDY=y-a87BVuS^1!GFv|ye1D%@XZK{P|6_c2bYXIvswnT`YgrlpPBPonI7X6r zK=;~sNK1TjzCC_b{nsPc_Es+Zq>giO*l|)A{4AZlCy#F16%!XpKilQ`vWp#e!A@&J z+pPH(}=0()gh)s_a`Lr|&IBv5#zW z7jo%@JlSHs{TLB%6{d&j-jCbpmOyJ6M&$Gj23N+^t7#vEa@I`3yi=vA_REvKRe(D< z@QjW9#MJBVyq|w4ph)iq5KnQGPWx%Y_0JOd5w7j#G%2w;D;hv&;Cm^$A}%?KQMVau zrF*7>Aek-hOObqG;ruAC!$exk(pdM!VA670+xP7ibchwM({9Zh*n65y3YZPWFSc}# zAJpUQ=;eF*ucMJRHa2}1rEnn&;N}g2ev@$FJpEwrso`)py`W2IGVPTf6`n^wpN!Qn*zdVOJXWyE)b}ov<`nnpM zxvqW=5lueiHw6J{Quw#kJ*eTot=gtoqmtPYm^JN$OxxJu(~%JGnZ|@D&kd-(s^?R* z^1JoY?F(l6v+e9>X|6t{!&=-W zQn!#UHdVGBU{j~N&E=y~m+{f*E+n98baNaJz z^x%%#zKk@g;v_V@0(rQOuUgI5X7U*&=#a;I4Ub|tjxI1AOxdsNwb)+`FX|P%*$3*h z4Bu@cep>HKo1XZY+TDr-e|6f)!pR0;_5-)a@zCC)&yn{`f9Q#mzw<5b&*9G0&s=-NtCt2f6v0?kZ50 zc5ns1m%-xx`lK2E*mMiMCCTWo&P=@2B9jr|t6mWtBoWj||pSPvy z-nt$SVAZ6HAbyZtksm^(MX{ z27Tt8b`8t&r-39itQN|!4}2c%7T;kY=RNm9*UDHU#$zk%S^15k`wY8;H?fs=hoDN| z7~0WJw31x}?j%fX{-{v`oVs$S)65|mCZ;3AN$*C6P#$b z+||S6_r~9Nskgm6&TWmuz{z7jw~+_%xRHm-%{@q6esaQ*2n%$E1!H6umF7PL<|;f&$Nm;n5HPN(_Ha6=Aoop7P#EHH63LVY$JS!FLO`s}-J zsSG?t*%CS(f{?qZMX74de2fO5MGEyj5~FDJ+>4}5=^*c=>l4AvK2fvWjrll~dx^Z{ zI(~+AaIGHMIC$T2o!U~ZXWc8!7S5v2hxI8`8cS8UNA*qC8nh1QzB+X;4VSeJzf7M^ z);Y=GA(c}C+-PH0mwhG$pVGIgx5lV8v>=qHy01mHG-BO$cB|+Do+EbAN=n@vZDUIO zR=8Hd?w}O?p18DHh6Cl3+s#GhAiFm6zOxsM_90x!I0;V!DAo}n8$=QgZpRl>tvVJZ zU*E|N=s`g33dwHa@%LG^Cs-$J=W%CSfm$R9Xt*->LU1e@Ih3De-N= zS0#EI*btHu8A?OQ{88#c1`q4sT6cQv>cg)E4R{+zRbw@Es#sI}j;ygoPG+1*)~E}!qE zR#}<}#={*~wQWE``K1&|+^fi^as7ZptQ9nuW8aa&>vvGls+jr+j%Cdmu^Dz1+4GK2 zrux5=+WH@gKElI1NKh3jfgFqgRAYukAXOMsd=bI74)VpzRL(x3b`qEG-2?G*KqYq1#B{6Y|G*K4Qs}$5kV&EfhYEAXq|@adH%1Ae z^mhrkrg&=i6gWwh=@4x-p?I-L@gGL?B)|p(_BU+gv*?en?puzKQ_58aMA=o_jd;J3 z%Hn)`_d|D^PPYr7Rj6HMHrOe(TkmLN`uYRAMVptIneF^-xb}?rvs1E83ty>|O1rLT zq6o(X>=5@N``2=y1_nvu4&8ICXybuC0Eq{v6EicaNU!;49ZXr3G=(+YnnDIqK_e;~ zpjaLm^l2Q6>V@oh-!EflH!MTIdChLV51?SRT`Q)_cgT8(U5+t zFLBhTh3$utQ~TlvUaVsq5djlfMA#XXQ~&Vea8x^(KXA4ZMGSVRzUokCrjh;ShgJ5q zXC^Ip9%3d=PE_ZaI9GGo;H3;5*}H5IYdukK|T;NsJ> zhznCAs-I7JZ*kXV(fXplG^gixLM4WS9h-PVwKJyh*~HfhV(rXL`?WIAd1)Tq*1K@_ zGv-OIIuJ)yqCJjHq!_9vC;2dDetks!3#Y(BtLJZpU#&7cN613EGO%<{NZE&2Bf)*B zNeVSn*2jGn?z^g|C%frTH)7Wqt@ZwIBky30>GPQuu1I2djxon|30YmFcO=8lKg1U)jOAnPFwMQDYcO2`VURJJ~4|HD?YkT{<;0VtPZKE zXr658w+V?Ld>WlhV8F@rA3~s$8+C`zi4N6)^n+K3m*URq*~ZUJ0#w@K;G7oJZ-dRe z0x0E7=&p9$0j6(qX=sSow z9$qpWNIWxnx5^xWO^6iHH7uZ!4A>4m!nksD9)#mlQ|)H^dgK{QnffiOSDZF)(K(`9 z4>-<@8+N+lWCf|PbX3OxX{ODOeS<`XngCiYIN3>;)dCMabM7X=T}CT2LxR7j?Mfc? zF9_hNI?8HS8d|n)qu^cNgU9L)9?fWIf9x06X8ys;u=-vyAT*R4YZI3Bg_uQO_W?J? zcwi8N=_z_Et+jI74eE9taFef(j;1ho8G0W#4^v8FfE3zKo_01s!^2ZhD zSX85}ep4$cC#xT*rpOxa$*vUx`q6feA$6ozb02)@b9o)M5M4srKLsRZ5;z^Mmv=9C zA$EP^$VQcRuVfOHW0(ug5dHLHTDch}8Nt3Mwxc-r<=N*Q5?N3j@EgLzyBD6~Gdj>C zVxv2@P4-q^3IBDz@=(yzuaUy4q2>iXL&uG@;HN2x zn3z>B6U`Af740IA^UM(C7z>LT>WgrtUQyIne~EJ%<5*geOK{v;86;K#>dzr=1dDwC zy#rXKs;`jPNHw&kgHxX<#S%WxU z9(p4AoqNCrrhb<>X6>$3hFvOF=Xp$GI0_ttA;{QG@lL1g3pq<=hU=sTuekO1k0_Ig zZ6T6e!*_yVY)LLp;ltg;6g4#4(OmJ&*WOB%a?Z( z39Jh~Rk~<>#OBY>`_lk>tO#6Yx&izfYBsw-h&RhZJ4Zzs0|$+ct=r@z_&3{cALpm? zKB57eR8LIQuiTCk{MX#wQy9?RZIdo!G@=f(=`V>R4YY7?ykm9}OMMUm61ag^on;S~ z4jR3>pvthj#GX3rH~Uo6#EvWXDA#SK2l^%4)p9bfRzC;l^2gAR-mC5Jpr|2orejnH zVAn9+8fnvooSqK-+m3VWJVTAHTs032eySgOF(mhQ8yrZp)oD2L5Qqf=I<^s08$&Is zm=lB_4)%sGb&0N_egOQZ$M^mu`<_@-z}WmY?Sn5_-2(WulZ_j#A+@HlzgI5f&X&60 z1;i<9!%>P#G|U9`la&9bDt!$n?`81@(Qv3 zW9MSIS14$zk*mZ0eq7RdRCzK!t8ta_4M5KFliVxXvTqIhOZ7ek^xEvoh$AFbCExL& zxM)Tl8uiSh%wp9-+x_KO?*UJUFYd`HQraNSPxOQ=_~}ODOFiJWJPvO9p z3rxS1b6~r*$}4QV1ST@saX0*QgV$}}EB0 zMWuMX)Pr~KYlYam9O${G6xDegLwuKS=IhnZHLLQ$zfijFPzbk7TE#G@9=hYO}V{Kp?mW2<{dvxVyW%1qc!v4esvl?(Xg$+=IKj zHSRQ=ex8~6X5RCDbLv#>+P%AfbnV;Lx|UwrzpOtWI85BS{xiPzzdmB%A&iu74%sc% z#3W0>K^^Tn1b~~wj6H!2>CPa}m9=E6J^u2g9Xa17Nq;EHc|U*xI`tH4%v2)69{D$_ za;yNm9O`xBVL*hxqT>&qf<>I#nVtb|;bmKcqaR5v=i4dvkcZplu>-Qa_b4 znw}iYAd_iDK_u45Z*;gh%$#;U;Zyuf^9n|6RhZ0J9iW1*dyETjmO*4X_Y|wf>Tmhc z6H-6D+4n*sbq&Tyu>Ld2TY~qyzVoKEeM5NTT(gJFrPpqUH}CsE6ndd^CY*dlb4OBh%qwhv z(artN_0BN&hiV2`!hAn+WnRYxk&19sGro%%o>Pm3_Vx6jin?{S4o0Dd_Qr3At{TQ% zk;%AF%8vn5tnqxQ*F+Z=#J#)m@e_8MHmx0bTz=31W^yb#OF!D%Y@G`iA_W7>ICP6K zo()~10H`492Lym*0v#!wbf8xpp_s(NKyduj@{bB^KX5|e^Qb%0z8Tc7RhvKs0{r9i zbCG2>EDMc}2pCUJtlZ6GCqznpZ`MB=1bzM~8%rd0I$ymET zDIzKKS-5FidRhu&S#^Mq`)V*dy>5eU!*+PCTz$qmW-cxgfB5GiaJrD>%>gO&u2r2* z?mqPN*P09=CSW_>h~Se@$R&P=3cJG+xWlyMruw{cY{PxQtAywBYh>_u2>+Vn`8DIh z{fSkrL*r7!V_-8ofcOh%+)R3v#WJdr>zS%~{G>bm(M{QB0A2#~s3hKFAd(qfA9kT; z;$yYhKF|4~8sg=F*t%_f*Xb6`DZz&^E+d;64&)KD1YuP6jk>Qf7q^B1NVCL-EK!lF zx^c5!Zxc(}iRda;G3~r-gOr=gTlw84!TtHjm|`TkzSNSf3mixrDE3$d5PRI(B(^*6Z3Oo~O%44R z`kaG`T~!sc1sldkJ#dLA5$AJgO(N#kAA8Oa#PlF&yDRS96_E3N7xQ{8kn(a8Lg>kk zL8yZXDilCvgJ6eT{uC#?wY7m6u6%%cKmc|?FWQh=cbbu9zU`ji-QqV-M8M{ z@;36c}_&rI4R5xoeT7uIi7VLJhs*%HB+pcu`bX1PhhccV}7*2nuweqGSY|XcoNsyfizWyYZ8qD z!|^0ey>y3x``4f`wU=>z5@axrnoA0flp7rif;S-zVq2I(4S!X7^Y(0^RC}sf^GWaz z=pasNTc#K5Cxh6j`0bwslY88M`fENDgX$?+z;rvlepGsjo~Px9_{`;hJm$gPsp|-f|OEphi(#;m3Y->37Cz4RK3(&nN!{d}r(fC5| zJYxyB8J}m*>Bi=Ix;~K|Xbs>Ad}ggu*9q6zz742>lwa~0SV1#^W6uxOS*cW|z{~P` z6ROybR<1zS!@XdNGm3a1yg0l!Qi_J=4VX|@Li}Fk`>of)?qJk&q3}|KgM)1{9=a+f z6@x5P1*+HY?K%U))dM;*_i>ykR=VWyFWK2mEEsWW*1b9(cbEUh+c%hFLu;S)^dr+% zZle|)QgWe7CF%csqsuGhb`4yr$-8TTEFHGjlqjO2cIFCYUEJ}cisQVl%bf~KZGFf_o`TzS6jZ3?g>|DpGs*~E9d=G3E6d*LqdX%n z^AyNf-CRU3q)6ozz$;Dh!1y{iGmPqKZ-hq`9CmUx*?5+(jdaGupPE!Uykr-(uYQcC z7U2%$y+ES&%=;Wn4((EKwUJJcO(GcVRBD1rnb%9IZxT{)c7hZhGjE1=5VlFTsw|8F zweL(m5ZL*?^7s?)H#uLfy`rWmUqBtxX*oyt8hRAXg#zBx#WEk35k0MF8`<&kO9a91 z0B}d{FX~6u51lARqei(%&Jyx)^`@9Z7tLc{kVDknD?5`PFMp-Dn{gOfGb{fj`)@pJm+F3 zMxbZVqS2uHh89eHDH|JLGZdh1q$pzWUC)x$Q`L0()0t&0>LX5RqqttP5Tg0c#`|W~7>j#mU~{ zi^TPh_DLE2FBG4ls^UnHZGBI69+|O=%t$V>prfSF4X_}g1M?Rk_W12f?XS*e?8fD8 zf}3^!0gMSDqbj`jTC4l(yqYpkO9tXEsv4}XQgvzxP52;7iEK#L#y2+*wEW)h?@SIt z+gHSN4U~cezziGS^Yssp!CBJLz#-Z?}b7RQFdQ7XgYNPcpOY zE0>bgp~9vZbs;WSE@E(QM9<)){09iDa-F;^$IlECR8k(60nSLGT^hRPq~BaY)A|cM zi4V_JBE5E_oevc&UgR+)RA--0A)$<(q=)Zz-Uz2YdC^%Pr(uOxBuuqq4XH#M5FfK# z=WHp&Z#XY(-jW>}QXg#;rlUY-vfHav{C;VyGJSJ#eqnvcQB1*z!!RaEa%;JgOT!*O z-{{Vo3d@7uJ=L~zp4tR`#7(>4<(ryB2;d$4na5uMBtT$xtNw5LUsny*g`-sbt_-m2 zvXix}g~YX(aaG2uej8)2i6{iQbMhIG*PCgP3S$F{=7Cy)r!w4Q^&%2rueGe$i;D>G zUQ4Tk2o4pEbqc#I+N>h{ZVU|H|%jn<4uT)z zA^XTbBM{9s`o7bvs#F*fbNr;u!jy9DdEp&Jjr?AF&c3Q7+}qh^V4K(~!(M^r{RQ&9 zQ)9=S_v8Z_!5(_Ty-$pING))%tvRb-Zu2Xshp}bU5!3^KUXmUB=I4n1WGr?J64Ck~ zhQAZ;_L79a;{(|8C9u%^oy7zx6}|tqBNq%38@_dheNr&tPoZ;^fb%^RRJ~1%v`aux z1PZAaq6*aVmss)D>SFr(_#$4x+xK9j)8Y=Gb?+5D^%=1L4GLUQAcoy`<^(9Q_SO0= zHUfY3=HZV$^Dzsc1yS=XkZO9OoT$$F1p(|UhW(+SyNJ3U6Da_#QDeuF@bNaGjkMC4 zUamJ|m4?kvb2ua!lPW}2?9TjLv*TLvZk7Jch5Gbm0rgzYBn|h*dZCIN#Bqtv(JlLgbMmAAyLLzSVZY{O@-j_XPQy8NvFdNv5XWv*ZW?VN zrafmHI+kXTU7H#>pUyba&8q&-S`8mTH0%cJ)oX>QC-3xJ$A1Z*@`ij^D3`C%_4y$} zJhohe|FHbY8O)9yVyUYq60_^J(i#w~dK;&?FB8aKo&oq-p|p6xjYX-q+ySSx6$~rk zz5U!!W>I-r+v4r`d~iw0c;|=jp*{KySRd&`wg_N5Tl-~vEQY9E-^c@}65=O+R`2{s;bhUm+ROX6@&EI!i=lGj?YZtx}d2n9%wi z@$K(^n%E*s^{$eHn*F=n>@0qTU44#`{Us7`kiH!O-(2)ZM_Bx!>K3)cgt+T{<zW_1hiVWE%DC76jHrX$WA*$%>e{C1 zNwOFU6G?2y%g^VUdH%7$I78S$A*MD!jgyd}jkWZ%ymYs*NJi~I2E>R0cL0CCX&J!- zGq8rzVaKS+xG?(Ea3&_=u$#jyU9;G%YO3|MQzF4z7bgXKt))m{dNH$wYsfSDeo3K* zJmTZyx9$o3&Z(^hoc+Lu1M6tcNG!r+{tA3+XPnZWo9Z;PfDOB5RGI)0JmvndRbg~#^eMtZ>I7M$ z^qPLlCC{}gHkV*KAQ4eT)6}--zL9q`8VYrPr39Enpi52Mo}5Ekqubj)l|mD4yZ%K{ zn|YctVyC+|Qv@DSUMtS*6OBwuUCq6l_eRrYJG_|8NyLDSxUil#w^yuZ@-If|)|eel z53)^yIr2QCfKC#OcO~q@-e6nt21oMn!`>MVG)63;s%I9Z2vsR_9jI|dWuJ=u&eua{ zb#0ErQtQbbY~fSZ_;2vTe=%yD5_*-_6y@?|AUxy@<@AJIx(Bj-1VuZ<3~IX7^N+%f zl-6!lhN~cNaS)t(JV)qcHzwMe$?HDSb@`vZFcW6G09xBKw$TdboPX$zWL&;*BnLC? zJ70j~_$Hq1BL}`S=JI1|`_FGj$78sqp<-d7O-j8fSG-;as$Z?1@&e)01AdF;jZ!_G z{j}d}c=bs%_65MFz=u-EweC>J2|ZQBIiqo&g!=m5=dR*QR*Szr@{t2o!RhKr$ts2_ zO1jKg$qljOX>!?;KSRsaYkcl&B_DO=4jHrfY#1^TtaSCrtn{gwNNU^;6+#yHZLX;U zJ%$x1Y{+bt*uP9=wVq|M3N=`FrcVep@-QOA-W&?!WmrOD(Gsq|Fipc_i_c>kA-cnNpOn>ybzm>W@Q_D}ep-yFrAxk%$)DKT?MJIkhbuF(>(thn+6PBg zw*pW!!+}bjCxvy?gGi1vPn84Wmn_1n3)Sk%bX8+%rynb_*6MBd-y^|%Vs(}|bvQ6M zOM+{a#vlm8$s#-n_V_F9n9SdUEKKUPMlY)Dl#IHsD@Nl7G(hEA$|6fk)u+NPO$~p( zeF{QKa&Gl|%ce>6nb?Vj0rXWKbt!7);adx>0ojbsi6C~Lh`@{hRx0twf0)dL1lloQM$#@9m$xjus7qM*iWV3=_i=R zjS;z`(fZn{0z1`Xx`H%^(RdQPBq|gtjxENP7#Q?1?uqz}vqSx0L9^{R(dil?AJ+y1 z=x>DBNE9CF{f!0=e{IB42$@9O;n$`pWF+xZ;cZZpG<>E&8l+~hBN4TwN0{CqGwI`9 zcwHS1x?Tt2X?83N2C05Es7q0c`_4eGT#}Qy_zJwRpM6CGWZrp!6MBcepkP@bTeD(S zCT> z`nzA)mt~0r*IP)DzjG5|ZThk?bhG-lYpkP#YX;q}yP`}JB50o{qV*p~O=a9$x(=V~ z-dz_FtY7to2H)<+SUuVE*&hy*moLQnb+qIoplzPo*jp=ZpDN$S8Q4Lku%>ajON(&5LY!i6xeZeX9boQ;1VC6y3O(BCWZ)u zp)@4f&g)XDuFC;fA}0a?OH(VY%&?MbwIaV`^~37|f`r?Ym>1f6YnJwCB59J7DNU;a z_|R*A-H>PWJXS&1Fl+|g1l_59Bd8`IpXotGTSe|dt(}@mx0@vG*OH}R6C;BT!|Y5K z6aoQyjB6a8Qgu3dhM*r9rRs%oMOv9LPFWlvjnn?SW#1U_oCgoq?3d{<> zA$%k2T9&r$;FfQS28(Lwpvd4nEvCom4+1Q`NZ_u?%F^ld)&7k)h%ZP#q$X(@8pG9H z?=!NeQPdTE?}G^G3 ze)3ef6NIu5DZ7}~UlWpa*ZB3Akb48Ybj4AUH1BPOS3X^RrQJ~nfn)s>b|j{D-tbou z*KF!@_#~t@F%z3z!s>3&C?Abq*lN^eV`g6+lTzl7(e4V&R1%PSll!mn(Z7_VKJbnr zfSEMS8iAgsZrNn5evt{EW-b=29qC%5$`uZQvou)-wEI2#M+TdEm>Ww@u8C;SNIEdf zbh=;rTkNCd@wOO}xJ`pfsNT`?SbeWQo(HQn0YsuS9c|Fiof~iYygi?gpPqgfpVFry z91Et^&NNwiiJt_c4sCwkhr3O|t`PXnv8m^-NJw`KSNNxMc^^r5(u`aS2Y|DG-kmki zJy(`su6OQ5T)<@9Gf(vTC3tIB80s;5;*%4Ll42@2H8vAr%`w5n7BIf_YY%2|DTj#e z@QU1bfS+7oXC>9lInK_ZK0*UKKJ!!$SEIqx|4=r83HVI2`8|C=zE&REMA@*lnepDY@t2E>?{oS3$H03Wa-Tp)Tq?RIfZECtM7 zAHiKGr>elvrS9}^=;Dqh$aUo_d$!E`a^=PY;~MIwAv5eY3?}r`GCQ=&LQ@bT0lcEP zrJ(eeBS94;Bkpo__>)XL52vB*#@_B(yKa6jecfxPRap| zwsB&jt*z#D5-9uv4kO)Lg709r5_Wa9T!Mvlxlhj|KY1ubSedn@iD(2JkY-pQ947#gsdi<8@ zXi!%G0CEvre<98>`x60lq^eSGJ>NVWl{uMQ#e_CP&%T3occjCC{Z)Fu4}`a`C=_KM zEap!&T+r|~`5;F>r`JhpbD>SvZco60S`Ny2B)ncb(pp&kR6XE!W}|SH=;^9O8P_HB zQO`HzwYJprhsBgHIsrPc6mGFm7!q||K+|3n*;Ft3vx~U}Q7SLz@~-(5X5z>RA6MO} zrtgAc`%DfJA(l|d&|Ch?U^_3b+fzN?FY1?PJKVFi;V>eBZ+S|GzT!^%MeM>KVkrlB zkjF-xyOU@WqugYDr_q?Nv-K^$eYD(s9_lu)>8i!#BTQkCVi{sx2w2tT^7V*}(R$nV zqG=El1#P`gd={N|XVz7bc-R|h_Fk%1dPKI_fdz?Ny9;D)mvSwFDNbX+mtZ-GZC8sb zJY#~iY1?72wzEZ!^NF`1pesZ&ctSOIHoXPP7f)$SQU!@*G=AF#3U-XAaf636iX?8E z1UK*eiuelDh)jZy@ zw-13cxYLIWMekM5islWIfE<3+U(H36D5QCd=D3STA%dVOHJSdQ;{N} zvPhzwVLcB(LfQSwmj8LuyFeeXU{?W?xNw!0hESzcU$A|i70YOvg%dYyPQ{7!&sken_lBzKDpuZk^<4x zq8%Pv-q+>*^9g~$kLi%eMnK_0#-YK^yMQ-6CozLq66on_IUMGqEoa22;0Ssk+a}+6 zbT`D!iTB0!TjbTo*#)%1(3J^+*8?d}_*-g~cYJXArbgG9S!3_Tj~@=b7hJG&E>>`T zn{khPUvhEkQ8CX)yb4kgVu1LQ-l)1Z&Akvf?+RNPO#vi$m~X|9_OC?S6SZ@mbkrdK zYa!HerL>V`z(QxV&Rtib078np*d6ACBEgS0{pP8Ui=SImkJuss%gIySp58Ca&%Z&i zg{ha#^gtwF)bIQIX7^S(ggeZ}`Cre%zGowR^g8zV-WfVQX|!`TQ(O$)oAnD6X@s6^ zlyhVQAhY165%y+dkr=Ty_mKA_!}XK|S*<@d38GMr5du&Zt<8;#@N$e^Umxnuxa{t^*_2ZCgU>SwR@xX4 zppTu(?=D>Sd6LNIoK(fPz4hz7aCa_8{;+PMn-{asAp_4jlg#jUSa4l&f6JZ*Q!qiU z&cRuZDQ5t)ObJTs1j_AY4`OMF*Z`-fJsT#CUvPs{Zdd8OlZA`sPq;hDV(aLx=H_}Z zX)XA`#Z+>kjMfkxKucKj;t%#U@!Ww$54&)uHWhAt zmCzg;lr!v|OUUV1tKd`%f23kHO@I1L3{ey{Cy{)vex{=JT}E2k(**3@Q9GA?4Z>Z> zncp^dO@NyO4&NpNlrD^mt#)Cy8t*vbqK(0%MkM#qmhN`_hg`ya`m|@nE$#skD~~EA z;EoeK*@D^UYRM^Y+I|GxY+K6Scm0qUXO8iUP;VW8veNrr7X(tqkBa++CG9>?A1;Q0 zR1P2NQHU^K-T_|tU~tO&X)@)oq+GK+nQs!QPs7{8yFVHF^CDx^BC`gPw^`GirVBoL z%Pf@kpyvVm_^+ocK1x3VVNj|})sDG6N^pqBZLmO5x-nioN_)s{NCr{roD8Yoe4lin zTS0&DM@mu5ULifen%+n5UsU1{}c^6q(kE;h=~Nk z`bvA+cA2R(shX2d;Y9AW<#?~Ln?U1=LHTy60z|S@ZRWq;eJS{-)&lPzA1X-H8EZ=6 zUX|>~N`#qVbB`AbRE=2mYjH$UvaWPvPC`=mbifkI&pjRg_2CXCYuM*5@o*03EZfnR zSl0Fy{!TGdHug`jW2nVf>+0vGhqf$>y^*?OsH^GjjJ`Kw9^c2HTGpbbjv(a9!|AA8 z1|Ros^_g|+MYg!BXJnDN#P-uHx|e?3_pot(on-?AfZ93;jO!n!OwfrT{<_S6LjGaD zY)73Q_kQoyw|Du$fh$B6o5YXFt4~Yzr{i5-XL_rfzio`d2qYf-$z~6XF5>;_WF}5_ zj7(B3hq=$zU`Rm~8-22K9xgGvzCx~YiBM0_!(kZi8RzUL{1|SxHzPMotr*za5g(u& zTFv++Xu;!9e6E-IK~sf_w#T|LewrJqFmFkW#Sj~z&kUgJiA)N` zB4mN|M*iXrb&n?dG&jewFbw`?Gm(D|`5y!S>+XAi*3-Q>Olo@>Q3P5xCTDRV78E>Qg4GpX4?cGJI3JM86O+ToR6sH^}?V; z05TJ1?5R?3ZX7BOJ&YCGi6@_P@YG>T!Nk;A8u<`{y&9{PE@;USn2=!J-(j-re#^#o z1mbpXQkT;FUL!m9gLW(x@!Hl^R#9X0LF931<7Y;m(?zn%x7+Pf$`e8mdtsuH zC2;yyGM6al_|5!0x<~Duo*hn&%iPhe$-3c@>1(ou_l(o3)6*S+AIe^yq`_xLh8L|{v>W><_7MXCD33DOU zZGE~+1A{^y{j~=4VZx}N^oFVz1H~=sN=4!_Njp7(dSUman4fttua_B{opWkax;X-U-?}|4KHX0Od!b^gC zE@akw?)xkA$09i~#{vzzthp`w*cL(H9IF4GW7x=4wp~hUC%2QH!ft zw>yYfL-eFIIqq^1_)05u*x5MjT~jmZ5_n+dWq|_y=0W1gPj#tdCdx2=%~LY=!?f!; z?0;D$|FBIyz_Dh3AXH2~W(lBn%<5bZN~?Y>YUG6oxdSP;rP%xs>EjAkBtjp4@6~y; zybSrr8L15YP(RX8RNq_MfCXuF&)ANsFsRT}ACEzMZdC z-2yc-8}hW?TD)fzNHLeZh;U~(lP{xzlMrL7k9VAut_|V4B#9}OZYY*atEX*7?quhB z@m6GG5i$1l0i?&ivVlL@MO=JcB{5s<6rLb-+$FZN+O}B*1f>C8H+2M7Q48yUt_^Y?m+0p{)tNhzh^585vziY~3cO_*zy zA`w8jy%1?(x*3gyj7e;Icx}KiOgV3mVwAaCQE;n#fJ~5&>0JqZrM%G_K~r#q_*UlaZkC1ch}sB)3{m1N!3;FsSnu|7}u~#M<+y$yMz=EKfA#-Vi zIL&Kd($WlypM3&9bmcapsM&DGh!2AE(?BF4u_HK-rfx%kT$A*rK-%0R1OBd8Sw)#a zEf9PEb+FT@aF}t!bIx+i#fXsW-y7(^j0HT#22@{UiaCR6>KV+T2g%xn*kDIxySFNR zkph6GYQ1efku%yBdJx4tp*;qFtYWNP?UK=-Y@t$878KkD2YFT(!LFcU z#w_QqL*Z3Q)J2Lp6UgMW5-yZOB+(HaEX)J2q^;Cp<%{D_F?UNpvbgKhK>y$?pH@jy zpc5f_D;t+W(n-P0GA~x(+;B|3K8TXU0CMNfB@y#lPW3o+XZUYB=s$m7(}yIW%p*KL z?B?pyIh(%3VY-Uj7h-Lm+4<-h3UuzEUd#w=sgVpthD(NxjBCbQC=_+A!T}aL9tV>b zfDaVcq#nF9BUf_kpC&kmQ}i8X-`_Hc3>WL0399Bub`tZ@^)%eS@3iZh1#H_S>kytUN4@+aG&KbP5tI>`Uf?rEYb1{$ z{`gm?R2SWZ)3=4e6>j?3nq4<5Hw-xeVZba)+J07=wiP0X1DJ?u*r@eG!xvlG1IvOsg!4YDw6Ihk#jn>~y zim^K8?o{Zg+uDP@CS?CV-v0yKnldDTcnQk&O){$Y;>z`gr1}DvsD`CP=F@ipiGB}r zA2Mcs!F<)(y!MeRx7_ZIB5igvqS!0#=ncKHsYTX@mz#P$RiG9A!20h3Ye(^iG zn8bGc!^hEi!1ej0rK|0)BB)1ar_?XX%ZE$-4@<+}k5f_iXFl0ju-3T--W#T3%3VyE zyCJ|CbfT7wGbYuKv2!&)2M0^oH(l*OdpTuEsEHwlgTH+% zL4WA^wec|>CaF>?2MM*OlW8f~-54(gK3MXf;CO;^3sk*n>O9}(EEy3I+v*wg!a5v{ zVr|!SN=QhttMZcea9n#ed8gur>;QkK`E*yShpV)yg8WCVS&}+H#@~R%O!91G5|qoUo*i7M#v=@bGuB$LQeIZH@U)rev*lfg4BBA zDOmI(%Eo<1dG`VGXqEVRm13ZRHBJFj+6GwT=);NLOQX$YcdKW=b$tg}V<-{v)f7KM z!;H+YaF>F47&Q&Red_A7|MXX(;}V^EOhNyLVDnv&*cweNS9Zx&wYYr`pUec4xkrM5 z`~;d{;Xqv7R~Bm5m}`H3Bpf zhCt7bGD*Hye0zeP4X^uU@RcUrDzkf33kY{?U*`;BjKvmJG9{n_htI|hcdCEh{5%i- zFaxev+jRJ2SEXd&)w+<(*rI8Oal+Uda#3O>P-Gzd5ti-iy?6Vm+sQ8pR?oC=Xn=fNzd$)s*>v}bgxj5l4$4I#7nws4pUUdQ6i#Z_F8uf?Lh*f zgl+p@|8u6)1#|Ms#2J#+r5{=(;igMiaKSF_RWhHtP}J>kh6LBhvY{sF$f67LPgevF zEhQnS(UukN-z9c`Kg9`35c>>Wwp_3|*_^@Rb4vXEx4uzQIeoBq&Cj==%)f$KQ~T8Z zbbk$opB!Za30FR!n?<|xCQ!_vD2!gVWYVs(`{MMeL`po|=RZ-h=_QJ{TJmKa+9`+H zZ8IBdmWc*(Nz*Lho%6ZsPh#mu7b%<)7Ea$rI5e^B)Hy?DfTpG^C`Dl{Aj^VMMSCC9g#nv)YvZ+uO-7Vfe$|@~=P^Q)2&QhM4k_j6D zP8%}Y$STB-dM#c-(o|cdtN?=fcW(8Tfdc371M)S)d9Qw|H6Dz61cxa8SO+{W)xaj>-j?dMZCq-x#a`o*pvZ)n zcVzKK`M2GyleT@y?aC{Xj``GGA7*aoD};{rg>*!zcBb3?tJpIhKbf=j5T~4yfQ@XM z{f83li-{dp=(n}$V{{@6(}3r=UvhF<`t(8&Ug-I3ry>o6o^HYkKggY~76K8KAiO1m zc2@$27qX{s^|c)Pk=7{@V@vq?#^*pHA|0f#KwSEf8!Aar@i?@T(^1;OriS05OD};? zGJ-!!&`!u$RA^@03zzQM$<6vlTeLbeKcc`|wvCVWFww-#jKwyRakBntW&GRd{|^K9 zAB+E=cWXvpC$c$-;DGd_dmUeZeD?Ol3FWYW;9%iB(~IhyYPq6;KI0sWjHY1BBl`SO z#m73kaI}ypSoYZKF2ZlZfmI{8OenPT4o-`K&!~|eKY7z3>*$v!|`+? z1oiYXE3`U)z&-JL^gjX1qsPU z@tbzt^r#wOzsFakZVSl8Y}8+q#M^MA2@QQ%SW%&CWNcg@lT2Oz2JVU;q^Gan6%ZH* zk56Du{s$NK^WNdeSodonj&%2%KRHe4@}zd3Ywe)z-XEc-Bb18~9|-^b(BkY`^_#?h z>H_fFS#$YLHg`xk{Y$t0+x_&nD{6w=wzWW1Y@QkHe_SO2Bt~q<=vN!FIBqcjc9Jn*D(P+_wLG?qPu_(5b4bN{Wd= zwZryA^F%x?$V2P8>MASK78Vh~bvW3-I$oZ3R*V7AaGpi)LVfzgdeqki2}(>>8!nqa z9X~18cpvOA+5{|CrP=^=In~9)3Z-hJ9Gz$vZ%^OSa5p^h&5a|M(>OT4zxN1UP>fjs zPN9YnkexD{3i@iQQ z6x$~;amQl0glf<5hiLGAoJ9ey4jqw@_Ybb$80{p%C|t`!s5sELk1c8(=JB<`sl2Kz zj#i`kNK-_wicR6>cShBTBVoZ}b-NZ~#f`3#5(7yZaz}h!Bcj#UyLxO~tc5L2_4I}7 zuqkODZmUNaRxgF$tySgaY^77{L%_*`jt<%C><{*gy^iqpE?O@}ot`=#9)2G014QW) znob-I(5HX?6s4*sB+JwUySKS#yIk-iSI`cXKODG5uL*Ink`Aa zC9|jF9$p=5<=?P0?GJXBcAph=9}aHLwqLamk-FJzK|7w9z)b7ij*Zp3!h?+H!9m+j z38rqA@-o{CWPoia=TO-L)7qFV-@@G1LoKa}yZ6GEt5oOix3lv!ZE=Bp6O$l>XS*md z=LT+?GftGQ1E z4&MyTq~&UtisF>}-te}vjtZ^&1A$_0m$XWybMi)~`$$c$f2M9llkreQoJ=yq*fyDj znq&*<$Vlj~#fYD2ejT#x)+?l~txw|Lj^@jYWiy$l^L?V^n=O|a@Yt>G?xTm@mTop* zs`mCW;!O+~lN%ZcwP`u!o2*uUp5!W|b87`5;aO(DHCeASnEjfRz6uN%F9DMc#nc*0 zaLx8F&dm*<+H@E{cf5B6)*1GhawVsmLB%8_kf-Ju*Do?o@yC-L)t4Okp`FCXqf^j# z1|xzAzG*~-#|6osN@th-8ctDJ+8mBa^TmfT8lF&)AQlo3RL47RVd<$IOQn~BCl@@aNkZS4-nan?jsA7Sp} zJ>3Y5EBKUE&+%D`7BP#r`A^SlIYOTL?&aZVILup3^Lv8ULIwa zF2RF!&uV<`md%E4xBaqP$qSmkpy-6#tWMcgTt}nF^Xm6iy3O~k{5sS5Um)4+*)wD% z=3jG~IAvCg)p`^X(fA2tqr7D@4YJ*UsN0jwV_tQDrq6H(V9{y0*(_PNMX^HI)2G1f zHty}?Cn<5p#adId>?Dx8^H^#8P$VZjn&+PwLuT{KyEtU5Zmt_(Z02gS`A8IJuV99flo#`VD$jJOTGm2FtQvZLX<%^*BGX>nP%(-I?dTq)hSz z-Xg+aR!j^zcv+HLTCA_n!%R#o8XMW-QZh)vtX;`VEvHcuUE?qh*>ZS`a8U1X@kNq? zf;skC?#`#4$4h7|@*Y`s^t-S3lV_)v^(M1!%Z>KwPrO@%jXKqEuy>(SBQwRDA8?p{ zMbuY%8eU{&);ZpYvrt8F)hh^qS;OOQoQvnN&ZCGr`GX1)KI5=h=WS3aS5h8e?()`n zS4Xjpy+#Gb&&L>&nY;#!O!8L(EVnzue{62(9k}(Rv^$+L%$kkICCss!W!ti^)L1wE zv_GB^o0vf@%--HOxLIxlaG13hVQnQeY2j>Z)6d)>!vukckTx}L*r_0!$*=MW8TaID z5c^)9$>Fexk?wF~8EKND2cR?K%YdE_sDreKv&@eO&L z&eVHv_{b9UyL3sRaRVccR7B^5O1$6PH)Bcelt$E7F-|_j6dQT;KHYpZ;_TlE$7aOa z#`XIdD88JOlvE0vmbateBdGiEV<;*+MlQV?;cl}^H-G4kMHsYff4JAU*-6jmR#38q zLCfO|WXhXSbi@}-*v2;Spvd-oOWfPXmXwvnCaVZ4Noh9#6ulowFn&?$5GO$S1A`d5 zwdvKaU8Z*1v(#4p#X|`CtvK6lJmeBJpcinuKtTBm7j4aC1z8wG)OqW9yt+toCZy{P zromDxnPQI3M^*Z>nZ@V6Ux=N}VN}PJ#q9FXNpTWVqt*Hu*AC~mop!Wp{MWZy32Z6j zo91ZHaWNr>A2Bmb&eR~rAF??gDW1V+-uL(hTAD0 z=7~b7JH37U9Gb5$Ye1!d&vw=m}3jqD~0 zecKc#TgTPGg~@3X!NIfexvM3ZSdZg3$Qet(FayoD(}x~$S4hsS#z*me*-U0XBznY3jp;DiD_Po z6uTSv{Qofap3!i2ZU3-{AP6QRq6a~O=yjCQqDDy&B1%N>MDIk89=%5=dheqpdT*nT zXruQr7-RmE`@XO1dhX|aKD=wqhjUqDo#&i;?_(dwuN<2)Ix0dV$2Z|dc9G>73uQyc z?TlaA{38mAfwV;S>HBNB9-vPf7OA3Wx~pSUV}Zih2Pvs6fNBhl#B&fD>6eJ_B4_!s zLFJyKFwOpA?T0n8hmp14va>q?pV7NTeq7bnj%LNpuu-e!OF!)#-x#?^$!RX6Tny8G zh-Ui!;)(TPU<9-zo;6b4P)na#k*!za`tp+p8evZ*x6b-H?)PASjj5sU57?Hr++~n@ z3^MrF#r#pb3F8eQ6}`3Bkyu~ak?37+L{CR&H%gd6FluH#qyfd8gi9||b*qF#uC_OB zEX~u9nLe1HVDy;X(Ky{$Gmqj6cCkUSFZ^yoU6b&`+_Qnqodej|o`&S503LDMYmQpN z*^bja!yoRgs;{miCYgb9qgxph%`8Lj$q%!UwF}fCW!R$xykamv*O43_qq^pX}*Wawv$EZVvj%A7^}PYwM^ z!5z&?W}HHxmhH%Mt$_BohiM{^`A5W99UfO5k?Kd7XNaKSRLCdT5_PkQr!csw*3b#P zi+?Rz<)?-^T32V9Tc_$df?2Y4_mo-hOFLHE%(qD?O`qJ!Zs%@iiQc|MU)!UlDoH|R zdRhJ44X?m?h;}`c&*Ms4u5@FycSTY3yEn^xPlfRg8me?@9eojlLuSP9LXz5dm%g0g zvL+wy)_uAU2lKj#;z0i<2i%`Z=B(U(RKfUHru0ue7I1;lDDIL10hZ!+`xZ>oOu62{ zUuWz)P~dQ)hB22=g5P2944NFW2;f>QU#J){^+D!_;q4BLv-{c4{i`#xf$sBWxmEPq zP~~PjB3a?Ja~;Nz0R|Lk{|NiKeG?;by;Q0mvyJHdE_pSE_MRu&Y&NH$mKv1cl#OQk zMEeD3)xgvuZuskJ6Bt9t_Eqfk7{#_#q-10i2N>_ryRIKjbxMwWCpBm1#c$ntbLFI& z5yA82z)GbN{X3N2ItU>~ew{aC^f8^o5Ug~4zVnha0?_q<$K#;oLCyO{sbcwE)F%5o zN*JE(2NJ4jD87BRU-hsFu0NTqTGVw&`M9g{?QyuQyjvVAou3X9)c77Hv4q}fI3+AU zeEs#gpT?O`<_x;(I#QEocYu}djbmYH_^dq6<>FBr*NXu~7F{S)wQ&a=jS`PQgAbIEe-)0Zu;BF%+Y))ol(|at_!s;KFcLnxFJerSI?y*>Ro~*Op zTSIvrp{1&bzdWo+CQ0@#n>fQ8sTX~ddNHtn;Hcp6&3$u52%d4sd-eqA9t+rQw7|VL zd{26F%=emtbDn;-f?Yn&=C57=i_iJYRg*XJaiX#$tVfq?OxaDkmYqyD!uH~3=}6|J z+2c69=O@QDR&RZ3j=^}Q{o|ORiN4H3m>#6rN6qci?SMc3f_z4FBcne07zAHbc3gL# zPpJF?gHRFKEs;0kfK70()lWjbjZ9}iehgxU71URTC3n4#0V7C`(m12tV$bp zQvdU3?_e#|PrAh=0%EZzBiH7)7p1+?6-p1WC1%BQ{we{;yxl+JqGX`61>a!Kd{rw0 zx^N`qCuq*sT8DC=*2vaPj?dk)g}&5Oo&`+dCS4$k(LXSSYny=DLE9a;VZdA2eyhJ7B+Sp8YG zx`Jm~yaM`onL#7r-f4=UHaeWV^AADNMEYI*=u4pe|A7a5cX=qOzf4`tuTo9SKql>T zv_i>3KnsA8?gC6n-t-tu(SGW88j~oHu4TF>oVy)EBVvW)6_#*OcSssGA%tUx-%JXO z%eqHmZzht9SO;7x4t4D_}hl=m|3E6o?N+)H|0=Z>$tB%*yf zrJu+cuax--{Kh+PB}VA+8WC5^M`9&T?@cC|*Ds41qQc+>LrFrUyXk3-PM-`O6I)xQZ>CLAlnNzc6h#$RFW4hlJV1VxR@Hsmec zsZi77N^i8`lNMJ3y0`j{!@6YTBNdJ$NHXpYlR!qD#>5Vs>pCS+@RTueWSy)9KRd6y zjdowu)NY1@0@CWGw0Lhg|BQk;_!#_(MTw?9uU2bGhM!|Hx%I$Yi z#m60&Ag=q2&gktvzpY6c?2SMYal0DTr#(2buks)C-6|YJQNi~#o8)kKf2t_wyY6fd zw+~D?qqv3HBC~~m;ZKL%N_@Wb*RTkwy55ner+V|)N&2S<(HG9a`%hKGCp#83N@6HM z6T|d7{VxM`h$dWS1~*T8K(~BM``PN%w2Xp`i0T;D9vIaZF{?n(?S@;FdW?dFcOk$s z>V)A3Rm06*L19PHV^9(Hsq({ogp-Ndb}sQ-^aYn6E4#CohP02VX)s`#;bLu0;e@2i z`{+==cL#sxh+zYSL?t_a$OXhYMiEi*YOc5+2(h$Kzc@O;yqXK2C_4FRf!w zjOvzev2Rre=}m>p+JUGTuBz_IxbQ94~#UB+pqy*sj=PX>uPyY5Ph%OYn#6|;()F6gry2s1jzd18P)%juC2a?9z;R;fAp z2hLA2m`EL?ug{p7lkZus9$@oZeft2>MF#{9OOSpnzg{fvi>88+0*3gtT&-)uIar2>hd!#L8iI4e}jtiB&?1aj`{ z+Lb@h*dhh=Zk5`XZ@E&<1X5NvWy`tsDB|>W!SBm>`sSZ^6rTlakPkzyR>9urz?c-D zGWudDF*V5Xhem#%moVY^6cxO9*;oCZmvTa1!)q0N`+}Z6FTKVT_8J13Stm1!T}SYK z{hs5&s#75FFqEIVr>*tK#kbcgVfo?9dq$ML9o-IDr~I~lF?CtIMr)74H5ll-uL>Vn zt5|;Jn}1(OJI7Q2)-RUVcQ1{^ktogUjpWO&9)j<8J$#Q7>xn)PGE7_+byKJTu6|$Y zeBy#Dd7o&`%7x~At7q{026U6x@4IrveR>}qOuA@Z%0Qdmjb?XnoO->2OS<_2!@(nAjqh?HFsGEDKnm1_l z>Q%)jn@Awm+{jnw#@%G&bmp&%i_87IL7o`FjKpWBvyG8PsK&%b6W}X@KhrO7^Tw0K zm{4DiKn3#BXk5&ud*?ni&^b1IZKdcvRxB=k+*KIW*!GOZV~as={5H~*6%W|ma`}$2 z>C`@NrUZ6Iaihl?_yb8gn8^3B;XP=LKa(GvZhawf00W?Y&LZ4yy^Zc-OaUH30>t@| zp}&4LM^h4G>%dfs8+CM0t)iqldk5>avpGpOm;%4Bd)o4a_EwXtqpxFTKx_Od8HGF16~^!E&%3_}xYb zKgdWIK_%@IM}Tq#0ClI_KA8Csms8EpUVs1o(YjizeI<_)H&!1@l~7rLTy&H=$P>R= zVTxp;L2@s#htpF3!d_sxb-DAIMqW0%K%oD!I%DVZ>NYp3LWIqx!)mfurb+InFp=eH zJ7sP`x$|MtS>Vj$QJf^1JF^Tm^bKARR}tTv;`a@{A2YbmH(?Z?%I%K7daefqNR7hZ zz=^4KjPxPJGPhl=_LOg^AleCL@&UD2gU;Xm5MzRGHx@JRmU)3P9&pH5hD)}a&mEX; z8NZ5W+J)L(iWx^&eYp`svXEEvQQbt>R=DK5G=8wr)4qS-aq|ge#t~G-I9(q3phzu? zo04=N`2ltpLcVb{CeT7>3ZPM?yhiF&CUZ87C5cW2{e0%-HV8dwode3>xf8&G?TaZG z?qLI!SS8!~XyhZQ*keF&{dV)-Coq6D#|3e@M^81L8A#hb#^%9<=jeenDvDd)@E_7{ z41?BtZFSfG4d4HBF}`(QZ+3ef0(I}pcj++yEw%%#tOPIxYFY%~9}K7y(tWxUL_9=5 zK(ofO+tSD)b8xICafOi&6nv*om0;D=I~th0jV*=*sT1g)Fm@7BffsEdd#ebc(rq9 zh%}hwgb=%~!;O=8;QLL5vvnOVfN|`RStep13L-TsYbuLqwT$oa!6qVaDawwv}Nkaz2i8#%kX3o~9Rou*g1vQ;L!w;`8$~ zp{v%mGW_<6;Y@_VUP?}-Dj&RqEyB-#lkV2ms+Jh5Mwf7PY@pnp2|t&;y{YsoROKYb zqYE1v>o{gQIde1lQ8gwcATV+}yDkuc>jZ-u2VHAHeamxEHsq#iDHcavGNG;e_I`o< zXGxh;p1&0$>?j#)-b9G~FqnR&>y+OmZz2R1Pu1r})U`Xo_7HAri`9p4Z8StSm1&Tw zPpSk5|Ciq_D_80x)XIhR;dOdy3^PAd6u9;Md(4R{c8z6ItkjrU`4c9L8lHQAEjWl1 z6chy1rkIsa{(#a|eboQhpZ_Y0pL6()+ZyfuR#%i|n`M15!* zJ=qwT`n;=|1jwGie=$~G2TN`D@>s4Ep?z4^fU&C3a3NNl8pD?inyt$Bm+Iv&tgXDJzl=@p<7iRk zq|Y+VOml{ge^EHe6xF{s!I?HoH*x7erBiQ~naZ_w-w_!l1QnQQB@uIo0qpu@cC?RG zcD!dG0XcW13dtT<)(MK+RL$BpB4CzTBl@9r$5pnAu4&c;0-Ht(wMTR+F=1}9=7E5q z3$MqcLi418HcK{>sC3%&%RA=D@> zUHKgyg>SaPp2}v7uNR}H6)f{r`^q@@&%T_XEIBv`(Y$4irk~=)ji!Q! z5+6D>)K}as70-C)Y6rC%eEe~FzSexWx@yUgkGGQpkI3YeWZ^*}t}tU-vhOCT zv$)E`FGr=7?FIEvdCD9Y3>ARg<(EHeA-{25US(=n8LL$~JJ283vvGCg197G#r_7O- zE(RDed_v4>o{?Hm*SeQ;k;pvu*J3L~B9ZA~7kBYUgc?5NEvjaZCN=VBO2{r+PO(t` zHim)&&FE$KnWzI28Qb5!Y9ohMU=B7M%Nh|Fx)=p8-}W<+4054iLN(r3Y$}R0g(Vlp z{Q7Xk_(^eLVTH$BzDxUSdp8F@oL4=pY@_cKKS{TR-=fW~l*r~m9rx`nc&=N-96tKR z1F($!FsPbJIM#l|6%#qIf_lh-E`*5kd6TQe)wwcx+1I+L4jX9oqKCMyEwz`5lG6B@ zI$NvjL87_}NI$P{E?<=;%c|!?^xbqp+ZoLp9$wFBd`0EGiSNjOyVrln z6JiYQxLG5cdR(#=7$}op)-b&XwzcfJb}7}=(=UaLFjE4(^EHdz{ghsLrf50Qz3D!q zSYlO9?6Nn!<)RdDZ8N|tVRmHWji?e0^PMcvD-ZzfNid8~!l94OY01 z-k2I2H-w8-%R$~5tq zAPeV*NC8B9<(bs9=oTSf0tj82o%-!wU?>sf(UEavO0;c{TqG|s3$ zAkAD~P#p@51a)w)c_sQ92-@nI@Ak*giAqg+8jN{<@mW3gAI5(76UCW8tZ}kCy0NzIMf8ke|4<&&Ycmki05nRcXCzLLe03Is}?q!W=k_n6bn;UPYUPeZ$ zHKL#q^K735{1I2pA2O{eUWT01w)QoeI?z&q)q@vMz<~#}op4wO!>b!Jg{Wl<{%TGx z0vD-e+vHYYxO?ljKV+Uhrqw{-`b0KaAFNBLnisWvED$&fqMb1t$*3qfBuU%8B1_Z9 z0(@0Kfxi10dK`BlHH%3mA7cBM^hTD{*e%QTykKK{Yn90Uc9khGz(wy|$oxW|MVfwM zqXW6T2!wHdi+7q879Y+Q`rui7NpdFWr)DhVv$Z)8@*sT^LpL%z==4K)3JY1NVIdQF zwAkN@d`7y?Lw#0EO*dII{Odyt&nz-8j(lN?9vHqbO1Q(Pk8_IX{XJ4!Kgrq$ za|dyu^wXMS%%3;5d8CqX^VhSveai?Wk~fD_X}mOQ_a)wOd+$%+B_4fX(ZEsy=uL46 zJ3ZyYd9ol9LocK&SOzs2rKY)GVbIKWv9|<#n!(}lvg7tzlx4wh@gh@hou`!vO7rKsi$}SfPVb~GcsI*! zRKybg`t|U~Cyt*>Mc^~>zSw06=&YC++|;(mT4V9R)*exFr6+zImL%{zfs4O}E|(+7 zvn`t!&iVelpUezj7~L=HZ*kD>UWDDJ=G|Jnob^k=#vWKrxARrvp9mHnTM_$gdx;8eMj*Zvi+{{MBG1CDpJrt zrZZyf;^9O}Y`1oKA@7KDd^qsQB=My`m}~guZ7`%ntNN^11|68}%h)lIaBBUooI9Gp zWp_M~2!G0KSP(Xy)j-$Nd2;%BENx6t%e0^wfho*E4zd34jeDAV+8@Fmx}L1vBU3~V zBMhd?$fCW37`F|_t?^Px-c?SI#YbZxj0!&CkR>m)Oz#Qv^XEErzWXn(&htn%{y+p5 zeMjqAlD1pVcyvjQ>#VKt z)vK42h&(Zzt(Y?6Z0~b$iAszDlFzf^xAVvODDK9K&A+v_k}?<(A2si9s=wFnKNl7h zILGSf@ILxk&9>z_InRKn*A=Z_Ta5dnzh&)2TNul_EItsJ3nivB!8ukU=Xq*#vA5V4 z27f0i%g$8eeR-TS%XZeX-Q}fn-cG&~ofyXGryBgGl_AO_x%hdqL^TRSd#6@2VlV#4 ziJU%}qhEJz1pDxg2+HauCncpC!zUHIg`e+FYQh!nkjN}sS`*#c)fZ84q*yZ|0WV3E zwK*-kfb1V$)#{O9aJP0fGcHPT&mhY{ghk+6tYX5Luu~J2dr&_~!ztpvMh-^CrHs4z z8XzB_vbBn~LKE=rs&G7Olu$I*yANt-2!7Y|tBv)Tl(R1qLqqI!u3mKjbYC=O$=L&L zea{65rnp(57Eq!EY^@NjU6L4j8WgIgT3kywt|f?!2{#%~zxXcusy0tPhPrEI_b#Mg zi#&pu4)`gkeq%$HY*Rv#G81H2+}**1y|h>#3omKUR#-In&Pa|(( z`RzVlHRLDi3a<<_Lm+KQW%-5MsQ{2=HtbumZS-^f3}iwA-4}&uMxLYho>#J$qtid2qvjW4DSf2dI(U1rQRE)Q%f zQr#z^n}1&b8t(vNwK#a-9)#KD*Kb=s#{20pCWU#%jv zI?)6cK{fZQQfs#;e?I|ikdu?AmE@Kxo)NQ#?w4s44r4EP?2)+~FzArbi{OrA;L68- zehK<$8gT3)apK7dMz6(;pnlR_MJu>xOc|&7Jmo@UWU+$CtGrU2BKqCjWPYH2Gs#(7 zp>53!NVDST=s&fauHvhb?&jqg&)m1Dzm0w&K*WnY=bL~fSw#EvMo)R=$wBEwUFY(f z`UJgixkmx;vp!&k;dH4ymG>D^2gd(KBuDQKhwK>B@S=dA)wwWVg%QyANe2GY+a3T; z0gZ!Q>>Ah_arkA-xbgZmb)h2}$YJ@V?-r7U5$!Dn2JBWJvVuHU_QT7FlLV5R>*)>u z7T{7n#IyzS+SKit5o*|)+wtC^B4b$o#AH`?_wdzUb>3gNGX``pz|Y{~Ozb8s_?CJ| zdfCQreKPa%q{G1owS>gD#{>o4a!G* z{@vBi)rRL+*C)&avY*Yk%2S*EO$=#S%j(@ecya-ME>Pt;0z|SUo0>>mR-!K{V8G$U z&yf~3baQuLxG<_{S|KY8xW6a#c8G~zK>ipDl;Cag<7IE4HH|7mf5P~~*=h5u)sv-k zs*v@igeOK+Yvrt7+hCE;+pE4Fn^6dXHP>$?J<<3}ThrW#>7#NT*goa>Lm-mG-r=ei>`c{@b`#lh^g4pHwI!n5& zi%TNST!*%S`-NhBh2KCC^ocwvQmks}i4&p$+(z#}<_Ei+1RYinoV+Q__{w!KAMzji z!A|JT7#aXQ%&YPHC%XR+wZmg(QmWneb!US3VPjx|&6R5l8z18@o=&ec^358HChYf{ zM&?5t`2`<`i8`1Z&pdr9Wn(u;C0d9CZ}Y9O{Q4PA)=R((aIgI+1fV{EJ;nbl2-*y+;A>*vI}X?Xz;J)B5iD#4NHo2K*2g}Qh@~VY20yP&+XBg{W{R;;&z66abQ%8|vByGq z^x+v|86Dflaj&BNnD#FXcxM!b@%3YxZX)^XFaN`~TE~Z7Oio7+)!*}Noz1i}pW1L% z_})V%iL%Z=QJtk);D5ON97lbNfrsb)WV>vL+auzYEfLE>XT_a3PIIRkX2jCGXAZdZ zj{tMS6A9fJ9Ejy%NNwif3@*KM(s=9~BBOwEOG7w^)pS%Q!ehCko<*QX9E zU}Pv}Ac>rH>`r2%H6~fa-PDhI$64 zwr37gIGDgl<~=1www-T!Z_>*w#eVE%Q_^3o*s3e3MO)PvhP6TdpMGkK$9G$-}QlxOru(qn9D|FWI{sqSEUDI7#Pf&ahr z$2MBh!U2;T1Su$579=EU*EgRybz;7jMt;|lXL{{ZH!UHZ@23w&jwPBi)4)Y9i`m0> zS4fwns_~~??W6JU5uK-BtxBwOzNu#QcDZ2wu`vsaaVPNZU8;7WmFv8ke>=G_9a(5G zkaA=6S?8O-$L-IBWGR!nrXI(P*37qrgt^_`St{Iw^mNt$sw*-I>P4y$C*@xCw{O`B z3JM<5(_`8yrSY2u2fzBPHC5$yv{GJew&WUtzv}HA6&_0v)mvU_e2x4Nl(-x#8S&8n zN$~y?fKiu0jJ0j)k3)iZQXY)M>n^3MKCrK-_t%WMH7=C zh)1S)I=g*4Dk~^BbTG#E@(aXu$-(+Q&b@0wuqEc14$`rHdMa1hL-}l1_T5Qr=(rmG z=X9|^;at-D?t$cK82(wGOWXm6iT5TuKE~)x6+@D$Oggrcgo$E|m|~qu6r#yDl}0xi zF=p?Pq~q_Tis4`5hnr*-cOIHsFSq^56h-u7KyVBN(A98WYHxDW#A9nv+@bfD@ef)1 za?!Q_8*{dTmR4fhG0I$w0N(6z^?B{5;(H7(%JHE=y7uKW^37gV|Xz+ ze`z0MXH46Z|5*t*NObDJdD~3aJz30*hMuDtqVICYl-HKX_ot{S46{?5e*^exH!g z#WKP*F;R;SDT%Hc&D7UuT7)bn>jP(nqHLY)_in+}j?IlPD~rdU??|2?5JKKnmB^H3 zM04U12`!KfqbY635Kp%L>46VlvDq9HsPX>A_JWHmdG+H_NqYOi82mr8=I@aF*99@A za`9mPuU{`o{mh}d=5-S7vZbu2T2H8h-}lwXRrraK#xvlvB@MppSq5?-0bMQ0<`~Xi;E~Yr zO8ZDlyX`EuCjYS;;9pwU)YI~rC2Z_DPS|5CR2Vr78iV^+d*7enN4jZaK}>o zt?5R;k!lyRhnaq8bBOu$SO&58gvPkMygVMUVwk(;TOfAzlc~lUVL;nw^xgrXr}+9c z_j;Z0(@%6R+u80nak#|T@2C-w!d}z*&?hm*^dR52r-Y-_Illd?0lN;QY#$nJAv~bf z4YLEMR)fI6K$G$BcRoY(HB1qQD5{qoy?Z&ixw$4wa}(dPR%Cq779s5o>$v}{zW<7h z0loLti|sQ=8vhnb{yUO9s}ee@(~et__?Z7oei76EW?oy!`YKAuj|+K0JMOvh`}4JP zQg{-Vy5ki_&6wVQw6LJ-f$oVhnHj8qtMP#;{QiA83;BHai&PqqlVI5E*0nXl(}kmz zB#ok4W>AMDw!kj9Hapu9+yC-*i7&!*uByw-=G`I+k66*b4vZ6uqimrN7A`FRQz*L8 zY{YX)kd60kgUzyC15*^TEOlz+y1V<62Qm|(l5m+9!@;}fTGE8xwYDF?Xp{C9AEok0 z^@o19r|iAO+;Va~9I#ssk7~c>FzG9U|I@b*b^}awD`ANz-f_|NvH!lG)5vGdHCV!a*M0Ln>~zR zJ!w0I6Jsn9Bi~(*!isWLPV#1pk+}IT8QEZSwq?ufHS3(}0dXeZ6&Z z9$D16rI}oe#)dv#W+mN9zWJ>|SyaDaoSU}^7lOtW7b|#Nq!ztC2hPgN2BkY6Vpxxu z%aV1h{qY6>KRY^)T~C4 z8&q8WFbmXYLnZPlg+}D_Yw+dgRE+5eBksyAE!R9C9WxRTsAmyCy&?ZyTQk~(5BFso zWul_b6(xFc#Gos46ROc!l@nd;X|q=}v0_1;3xFpv_((*D!&6h+hj)MXgjxjoe!n>w zL%$KUlm!NP=J)trm-KBEfspbZ7&ZU52|oQ`Wc%r41T_8@g-k=W>^+I)^y>+E`I!Y) zmR|(t-qZGOU1%Fk6X|KYKJ9@x(u%w4UFf*Ou|{58N)| zdEPYdyEDmrW`){b6q7(J`FrlRQtviq#rLC*J)kU*7Y|xKB+1!amTp8?TL+%zTs z7CWvoWhEy}KlxkpotBn$+9=^?m5%+#B?sfPHSF3I3U4q@a*|k-~J!Ly({6m`!eO?RQn7f)9`U{Xr7){K;DxO5hdJT?;C^}a_}KXvW5Dl0~(J+ZMI37zWKG^ zeDFA*cvYhoe0v5Xyk~iI_wL<&m3B@cb3F%m%*2Bnt}f#j{2y zQEIS0;Q`BOyzzy@t>$ZwzE980D*8*bQO|)i4)ulQZ-9J?Qg_|;{*F%$efS&qLWiQm z?AVH1lnWZo6{_{^R7t_&c~;r&#A>@cwdyeqjZ+QwP}AHQ*4Ix;b1$Eey`(R3*+T5E zu(l%htsS;$RCtc;C^&_G?#<2hRx-#A%S3W+t$k6> z7I60mX5px@{Lmqh!Tn)6l;kD0AD7qn`e%z)9=M`H)w;Hl*A{7VanTf0&&$s*>j@u> z?Fo%Z^Sr>gr{AZW^z^=DvGVQzC~xI!)7fILT@hEJ!J?$A`=jl2H~nhDPQ2pMC$w&h_tAWdXstz2UljOF$SgOhZOSwt0j;ggw}b!0MsDJ(hp_ z=DlTuN;*(0%lq^M_h2+rl-2KSDq94?<#~K3RnYdw&FU|DAOy9HMy5VvW)^`qo@3vt z-P{s#rJ*Uz$I_TdKyAeZp`Gi0UaDj%3x7Glx+ywwQPX@s&p1b<;gHKHx>(f`i)Yv6&NFf%dkd~>gPjq!($h{ zl=a9R4b!1nTQg!zikaV1DA!;!Z^npvqx8Rbk@4I6-<6hsXq9G?q0T@^vLdF+`qSwW zjnmD^%Cg39@$u_#ilHsGt;&X&XUZR_Fh4?Ls-#IEgH?FTBh(5>gkQ9 zEr;gS5#MObIUkj6e&^H&a|{e9%5k_InfyG?VPT}R++vu{p6Y1#D(<}9=ToD8vs`Dt zF-|&ITRZm0Ilmbxk^eO+95CI0(1ryaiJ_WIE)Gp^SI`aveOtm@?U!wep)n_%1~*MN z(2grnkAwQg4SMu%dlf1l8WQ*#Y`9t37hbBJZw(P9KMidqLiWcQUrSmhQWgp2tRy?; zXymW@9nKdCFlkpk{YodW6L^k}3JP+k^3G&s2_BlM0Gbt=1*#B8~i6=-o?IQW_#M5uQ}gfTq!pR!x)Nb z&SE*r%32+sC$t+rXH(^67WVt&dk`Su%GL6KZEQ*fKOxHynn&?ao&4ILm;Sa>tX zlXouMu9DE|!Y$je{v;3sCzjh9<>Z{s^-`1E5uclj9R#a_B zE7owBTCbsEdVuDG`n=6E8dda_3b?HVFr*HyV#J~XDyzZ{tVA$I{%5kZPrB2@ZtfzW z#b#=C-+nNe-v4)63)w0AC z)w2jwL;k=Nm`{1~pK&VJ@VB_Me^)jUmL4IOkuB_-4_L3J1qcV?!3E+jQrjn0G)F4L z@k|b`M_6)wd#CTe)zvklJH2Op9Hs>cu%s)>sK6Ev@@RcP zHD`!>ezf;!mqE8Dc64R=28F`u7Ro*TO%pNs=AAQmMv(KdH0slyZ6JhGzXhM>zWO?; zw0Mx67rl*A7&Ij@GxPWr;f4_4E zQZm}|=wTUCgk2w+5n};yvqV8n9*D|S!v{YH-^9F{|a?u^l z65rDceRQeZp=-9Hmcb2H3|+fl#%Z@5O{vC#=I6;!FjNg5v>ZkLSm4`~IiVu9~x?sZ8tlm3^ zA75xvn1YT?@g%}o383>$)f-Pxa%6dUtXF^}O8 z_t3w%;yxS$7k&TIEsa8AEC_fd4Hh3uwaZyNPoTg!T2a^C#ksJ^FzyA2>)_zfc44}G z0er8t{m8M5i7Vmu*pGhv_;>H`Q-p3!|Ajrb_3d3vkSqbY-2z7<_D@?PEBDWPE zHPNyaV`Ib=3IQr^@H61f#wDit=&ZLm@O#=)4TR!AT|qvT_iv-N((Uriv%Pv1_62`* zioSaF%Neqa*!`va7%er1M!s68`6bLONuk<$0VP=}!gRveb*YbPT=5KD@j~CVg>0iX zlhHB|eNp+u&DwYQBZT*|eXn^`viRRrqGyuNwo5$>_mCZEaBQY5atB%2al%rr->Q1B zejTA+nHTqfVf+xkjyi`fOW$YwZ>GYCPhp?KqkKv=|2G_RMzL z`NjE?^sbQh52OuFh!qsu>(>~(6T>@nF&y(1%OglpAtEloM0(zZ9T86W-N#E+_0?}l zfWPuqzKj>J{~7;3qfnmVFU}>axlkM2wtGNpGq2p_`O1gA&zM&Xu%qJ7kK~lSI$Un8 z>1(?BHRS-Ht{dvH04D+#QGUfeTbLFiFxUles| zMC)-@sJ57_`4j2i*0@J!bmA@6t#U_P;Nyo~qASz9yu919i-+H%CidJJ#7ej}Zz!+0psWI`${EAjc^K>b!TRnO({@ z5*Chd<;<-2#MbhF+2RQ!$b}J@->rH^2A}dR1a+ zY2}F3jS9Wkm2#&b!*&5Eh{lh0nA`T3MxWy!KN}nwVG?rFb}@v^s2UH&K_8W@R=KzH zOfXX|su}M!&N>RX(v4`Lhf|5VW$d}e2;(L4nztAZ{vBj652uE6U1KiPHYG52WxLq8 zCyff(wxIoGnmnSuc z;W-BRJlnw-E#K7}dZASErn0>*EUADt&uK*;t5vpNx6oOkBq@J6J z5d5t3syHV3@w+5TMGXK~x@;ygvLD?GrP8-|Dt%<)ZZ8(?3rZ_n-g@-+u=`BpLbYb> z!B^3Am`dyPLQpL*Kq01i)HKFV_QmDJ;!z#v%pCf1U9Dv+tyF9Nr~~7lZ@&%krP5}@iHY=cCk>H;)Zg9?AJ+?2oMD-b zr9dP?yLv)3ERv?&cCZz*6c1u0TS<2rJ}#cp`(IwJ?*_brO0)|%hLORPMWjNbY4YNF z@Lq6TD-qMijB~MT%WIg)31YVNW3Fj3j#Ji&AjdqBqk`INnTG=_h>3K!@ikNHVkiF& z0`1h;6j=;<@rLB(!f&5v8jt@IdjAsv9z1k#aml&AUiwx=KxbZ>e09@r=e*?cZg~r} zx4e||owlDr{>?a5oitDxapC2jvebHL<4HK{bF)ReuQcM3o);Ei?NH?T+NnRb;71pV2@A8$0{XM#tE;7y#oaUhqa`3dKU-po~@y!i&)cdnmwWNK{dsR4C3}2Ck{AR9r zuc^5VZGNg}4{dmbc-Dce5Vic-ZE@U6Wg*CjwZeF%qZvA|hI^b_q$2Mu@*v z&@_()W3n*n&HS+D!#S{4Oo|{PWN-VMC10K0i$e?emw+R`%Qsxv!;rOlZNphaC^4;c zB02f_UN=;8z7gtE8RQuTr}sUtX1g0WT*h(Rwx_t*pd~LfP8ERX^FrPyglrpAx7K}< zJ`c28ZrMTBFkrT4B-6+D6s3gyjmqjz^?m0b4Z=Vs%1Pw~h7>RJ#F4}pPU1J)zIc%L zOL?D<{`9blm>fgD57Mm&n(uFzaHsl>0-Y-Z9N*;4t%E_Jn>iUmKSL!R(Tj2SQAd#A zXW6`4bv;R%$@;&y;{VKtKPd-F=d0RD3l(L_#NnD<8(?s zJ;PtOS-ruRjVgZ(VbG(XpqR=MpYhx4>F(}_KtdV&G+|kW&7aAQ?m$N~d#`rnqn{YS zK324x66oj4GuPd(bQ@89rbT#r%;t9*-luu!sglpd#+J*(u~liHQLiH@%9TlBDmdf) zI`0d4UHN}> zU3FZPYtseFyBeE&=IUSbFJLI+l*_@qN!Z zZ=LT?{rz;G=YHm%x#pT{W=bAxMbMt0O#_f7W1h&8oCaA}L>qSRmj)!WQPdiu& zb_x|RKlx{r{;<)7{#+$^Ic|e z14pxqoW`t==Ns*5Z5MvX%xch_O>I#SXLZbX2Gd9$0j`^+n@(I*+T9}qW~OS|0~O%4 zT$C^rQx@JllQ55E_+oD{oCnbg!xal@P|PM5WAQ0e;mi zDMdNqDjmYDmV)PKfGZCQq;caN@`zcPKT{7yXkl7kpzbkUPlJHcyl<;Xmz;)tKd`QH z;{8ntvqxY%{O-13rpF`z^&aM?vy`#A`rvkEI{QC>I_~eWl06eY$*p}HUrl*8A)bFY z!z#@R)haBdX>nPOU;&%_`Lh23estMTJq#K1o6D7%g?t`^IrMwZ=9N;L3jE;?SqNjB$Cw85e%U^Ap9kIF-Jt@ z$;HE#EII{Ip{WIN&p{r6XrS=dbFbiEg|nz6eB9R#?!@%V?LD{*Bw&{>8-nJVeB=~` zvk^jqLT@dVm10LZr19U2pShlBXU%kLJJ`<8>02sDS2I%)(8vo6U6_(+sJ~>dIXK+= zNrZ7lVPHM+p%+rcvsHB`G2ug)Hjx(UWoT$mF_3~sPA}mAr}S3I zB&iXskGr_pj0~h)Si7zn{F&u=GocK-eHg>aB$y?uH1LeK7U`Cjd7mstb$flxHF2v+ zww2AV>FJSe)Dd#%)jadUro=iXM4P{GFuL=GR#~)^3?1s$RNpr@Kfl#O+mhWw;~fMn z0*_({IBmaIes_B&wWcHPzK3t_t~aZ1t*7wS?=M^TXiKP}ELET&_stu{J4!r}B^nDEPdE$(-4C>Y>^L z>vkh|mZsi2pXzWb4)ZO-NI zROjO{?ra_uf}E*EoeG>-M=sm5!cyk+`DjuijDd2nYC7#1Y z30v}*OXV8A%pos~6^_kfn`)q=&vo;?4Oa^al) z^*3xx4!}b0US0O@g#Ih7{xisCP!k4h@QajleS03IKb1|nFlEhelNVpiui}s>ftcje z{s<#{Pya>v+e4Yaz+1VD`DP38-Kpx~55ysQtCHdTqtM^MiK2Yn zQkt5D$4&}Kv|sZ_onS()qoe7P24I9l1X1Y%h3gHU%3XaWecvMBL=zBsVf_334*@VIU5LYC4?%S$-f?JJ1rZO#I^6O6xBg?26% zm+PJDVa1YtO+*!=TQe_x-#jH+W~6&iheyB8}O^lDh1YejK-b5tYqj9D?IfUCjd zc(As*lh^NB+gI-e5U(s-(WMLQTVY^x&c6X6yCEn};gCqGUgPPj!bfN8Bge0=PFI59 z)8p3x#0V0dkx>3?tkZ_HU(3}AusQf}xZ7To2F*cOT^NY6Amn683X>J&aDqDg-lLWI zyM;i=B^^OBXy5lMZMe(ssHn8bLWC|p)sGet8-GD;4lgU_uvxNbgei%aauuW%z(RDld^xaGfgvKnvSz2 z{&|B&(5tR!vc6K>cKO)_voe!)e&NX7qDUkLvaJ1Okw_E&hQr1WjMnQnji)~;u#tpE z`G+Pr9vz*8X|$3zG1=I11^ZK@Y8*Cg+#XJkj-(&qS>16ib&(i>aJMH?Yiwq_aG#B7 zM0t373v1Y2N+AbVc6wpIAmxJW0xZ$wq$O%FLgT9n7NZ^|kvgs%HqP`{b*Eto9wNQ3 zfgxhS-2?FN9MgZMXCn((c<<~FXKb3@2zbjXMe;;-T~%Ad9%-cWT1lp=27P8ts&GD9 zeUq)5>RFLxPB^hKc=c+w^e}4JDaqEH%gJNII-RZBsq;*DuP#C}t$$n0Ws@-JZsn{< zZ0w=zS7|JVb&UK$+w&dXPf{b+rsu;ET;sLyp>Y{cpKjmtCE3mLE_rnr;bQAunb++v zwQ?DOk?zS{c|r^f4UX>5AE*@fo37H_Ui(AdLAxVSLDmCxQ0yn-be7@a;jAFP5F1%iln|J>vz^%b z=W2PC0OGAtUYd22QPd8oJKsTA_=v5&Me$DuXt1mZ8Jff@Oxi21lg{DphXXftgg98k zVb7wr%)ljvMrOuy(YlP@Nzy1F9Xub^i8QUikX-I0DdEhdsoyNUXkbv@MvWpsF{a`2 zs9Xy4QB|z~3|{+l50YPBKXAw^-1soOx+Np~=`jqG<2O$H2M;nskIIfE4R%%}oFtTf z1;w)vH@-fnkQ9|H*(k_(x|AYSjWun7JRl;Z99l0yiXH$jeHg&!q1B} z4yLl3S1FJcFP@YhS0$JrDEAQ24g;Kvpt8fHD<$u$VR+Y`xOz5ch#51ptj5Au#|g_1 zxX;8x&ckcnjg7gdE51h6;FB{#-O`M|z2GVx=qn1I`PqbzKgY(#rcNYn=Mnv~ji0Xy zlZ*R14=er`ZFZk3@r%yag zPo<=!tkArV%E8UAQtzWua}7S@TzywQ2*hD0;GZkCag50r#(ysf#_v67i>)#crk}})`*Z_tE(8CY?o$cMn6R~koe_y))x@-WcN*5$4 zz`?>|WWUQ=?mQloE@ZGaN&xbZV&f{$@DUpxiHq*b6q%nd3V8>D6rE8Gf!GxHvd+am@FPf3RdR^^B{`T2I<%ecf%; z5V$!sWhBksQtK(U#0lFl;eIK|MfS1^MXG;bKohN1b8>RMJW_ArPcWnZ8jXmk8||9( z-mp!lBhVKf$+)gAI}$iDr@~6xd5mAXi$_K?Go#KS`7^7v7VZ^n*Ru7hvj}kv-O))L zXQuVHRJZFd4CC#b^83yCpX`@EC_D=}m(KRJ#l*#Fy*zUET8#;}M%KZkU8wApc<@Fc zZbbDcCZZkt$rK`s>Ave$mnY*856AZtCT~ll51^0!r4tO;~TDR1k!(@1gl1oow1F zfs(d|sH|vT&Hh~f0zBT!16f9|AqXYvYq5S!zGe&YvKZq5SQwJz270()M-QXAFtEfI zzsB+SMRQb5re`{%OG9QRD5S5a{vN&))Z(4_Xqqo(5-(@xX|=7#C({bljzQ2PsPcng z*^|5^(}^LgD0fUuZ?bw(LH_GUYq@1>pJiu--Mfmc$0ExuOchOS`zkATzfOvGgN8?6 zl;!7#Hwxh?dvPoWX|`HG%2?Oh0U&MJebS4d`I&X^!}VfGWO**|>7@Sk={}>Q-Mjac zd#ON2ZMI3Uq222P160M^{|@MH=2CNZchBEQzatmDSS7ixy+eOF0>Z`~WjuqzIDhWR zMEGeu4S#-KnUk2v%q38&n_~qK5RP~>$7gVN;BF3PsDnun9T7r}=osIqF?v(#TTT)E zAzB9aD`?7hc5LL{D6S26PQFJCNlZ)>+n*Wgk_^7wX|UcP{39n%egF$fsEkY%*D2xdLSuSa zI*)uR44|b*6#QJ?RZx++^9H6|81sqzBwV-|F+QdVO6G+X%ySblS}yI&TOI!3+eD0M&msN0}yWe9|m(>D?!m#3cdW|RN= zPyXT}NA6>vAf_WZzlkKgu%CZZtW$Dkq|CfZC`;qcX3a)H!kt1`GY6fU6R;PgHT+@2 zhl}LgSxYT*%2B2wFKpUSrLBh&k@;;MRacoz+&=;c1)8z=5W z4*oM;S$igSBp?SO8hB5BtQD-N#1Q_BX*2t-eP==}UTV#H;e0gN#B%zR>rUya(gE@C z;9&Om5gJ7bt;nHzBcnS9A!71!k(OBH{2watz~>&u!5}WO*8*Ve*{5DQn1~Gf|!d?93nt4eCo==?iJN#R`UaKWlPl z*`0SEVS%>RAD7#Ty!~I|ux<+bgNlEJq4Br$zmEA|0Ysk{o$f=2{B*EXY<^zaQqyrL zYls(6e~7C+4e(p)>zsD!D5Fwxq1d1lcR7E!QOBjuAShCSiN9%0+D)<{H6ZFM6o~;7 zS^GvyxG2jxq~yZBREM}{%h)95G$!?UsGrM-3sK3+?(d4s1bnhhZ?Dc9p=4EVKHxR*q7$PSRZ zIUs`)$}twC(>m7zuCsk<6-+WgBP3)7O$Xp5FCelzWm4agvKcR{2j*R|DAC zS(olv^nPp=fYnO2tWUpX_$$oo51^CTD`w=*62}FYeDnkupf@C#?iJEnW8uGhE$&VVJHO=?4^$F%Qs-?m)Xnj_75LBDW%3@yW#7KH5qkjDpV%U8W zI8Ox@3jK*KKztQvCDNnc=@7W@4Vd`(!evLF9L+Ggc-#6)NxOe9Z*2vrL)yi9{E&A& zDKDB7gHTOsHH3p(xDcpF zelNxvBK{TH{gdsc>Z43G2V*G*$H3$Bb9Rg^d%Ca=%+nQY8K+|eqnps%0Q9m zj{|6PLQmRHPFd?_7sdWN^h1cIfKuN#-8yeWhLudPzY&JF%qCJZ$i3>z-!t+=+HZAe~lXEOUK&Lu*pFRxK@Ax=)wh2 zJq;g!Kqcm+@bR=$V9wumlK8m1l=dl5>;3bI|3G0?572hy3VLw%OLnM);!`?6JXBNJ zZOWyD{LR`-xw)(Zv`&>6P9MZWGCDg^q&jhq)d_AAx;%HA1k0(NX1`5xmvH^XLj4D_ z<3vXd(E&2gV@VedUvLPz16L$1!^>8+#!;*O37}C?z~|95!{$endmA?zLvQ=Ap45-j}QE>^Q==rp9xg~ zDPKwWOzvuGSk_#fv9tY!iV{=PCYOb^H&sQxU-bUtStUg?KK$nm4AjNS$;%rZ%|3*-`qMhOx|ZgK zkyg8*b#-;cefc7Xfe}ijF%W!xk`KM#K761xgF zbK&4QRfKYmhBbeY%K1WSlYosc*7UTN=k&%Jc{E>mqih-9Al=dI?5yMM#^~-g_+-oCm_>{}CX9euK}<}{g7J$r|q&La_{{4fEjjcAcocJb^K-V%qE9(mmPGpZ+W?3%fUxtzqPt3xx zGR$Ye!7spWH?T1*V>@UgVDcrFQLLw$BlC8%&_=iZxQ-Yh-~XBX^^W{&W~y{vfv;ZZ zUc6ghEOAA@e?Se3-uS?2X06xy3#_7DFeW{Huwmij)-7*sI+k+?&9-nyP*2KN7gG12 z=`@Wni&+Z`3Q~M*$wNYWucg>}S|-EYN^0D5Dp;Q`4WFeD-q72k$_`xp-0kw9sk`K~GAvo=HHHmYb87nI_tRI2Lz& zt|R){#kJXi{uR(T>4A4W5=ZNBL?R!&F)(v)!&!OjFihx~^R|YDruamspKHq-?;?&W zJ=uCUeQ*9^utwth=QEy&`KmdWR8`RTcsSomXuIz8ZxH+0wQ9yQ!3~imB6I#Luh;K7Z(daI>?U zg7sB9Pdu*vgoKWleJt`S0|(#HR(Um9P#mjSw7RnvRt=jW|{exN5^5LQ4E4aZbymg!1mih7R$E3{7hKvV)hO=lJE z-9O2WVGP?^%cJbgS7QkiZH=GC zZ+})+IgXPNA@q(IUjIF632Bp&$uPh|nyr~txpk5W^#|Sj7AZlp8jqTunu2&db}Z8* z4FrZoX#BbkgSkAW7*~DWlxToFCb|I~gB9ZK?#_>tIBaVdp!jLhiW|Ng(xc4lz0p`H z+mc@HxaTFmz=1XKz8};x5o|8+#_s#Ch*X+@BGNUXo91k7tqWX~;b)O5@@KHLS-3B6 zsZz{BG;YUo_Fl+K1H6dA8E}OYzU_2FB*r!mRSY8I=t#_s{U!E*r{{&sZVDUH4e0lL zW9Wm#f9bIgEzJI;j$u3(?EF=#EfpB|MT{U4yE*1+F%I-0eYpxWb*Nv-Lb}ynnUndO zmmd`<3weGL5APXUf!su*UEe@0=73JK(Mx19i%1js#pR_6k@vYj5_!g6vajwrhHU?8 z^UkR;-S6}PE>ajPeWO`KbW3{d%?x4l$AeTO90-0`*ZpG6@@zm+8Xw(_O0xn~lr`WV zKQeFD=-I2M*CxL$Pa#J!HNJ;_s!_XJ4lKI3TpmaPSHoZyJc!U1z#s$J8P$ zFjqQkyH@0Sasv`C+-DaX;1o`t)vZo&(q2s$G)?L)Np>eE`spy(i0(cq<5i0J;p{tO z(`zY(Ka>6c!9Z;yzoT|-jU8VJ{YcuO&LJc>a5*sf*5aPu3gHY8H-#wxM0(?&j@YhQriHu!#2#*JR4($ zBv1yF;}Lm|zk9~WCm#VJ*;WM>T+`~L;#Ba>3UQ?Nc=Lz@BGjr z$#a@_jT=ONT{*ll`i2Z<-*Dj-B{E^~vA17G+pxhVo`RWdkb>f;oz!fVVA%Rls?@zp zqy`NVkXpS{^~*l0YDM(*$CC?@-3PWjT~!^_if`^U+Nq_T92~XytmpFjOc8djf38uk zAivw2zlw9eJa<%;E0DEA*1|6WTCQ%HlLnT~E2j9OHcrtr*pX}sbfBcQn}hQXRK9MJ5)&e1Zw;E$xF zEEJn%%n@TimzK5fw(1)w>xn@hSrE2wmCKgJhbe9BQ@fo2yUH?vk{w$n%~tJqI<%XR zamk9}P_^+= zqdoLx=p^ngF4p0(9HQXg+}R(P;NMXgaH6HDzxAVzMEd$E04@8`WvdE%r|U~T4GKe5 zbD^iF=g8c4*&^m=9w7OHve@Tn!eT_Xxl&)mQePctuc}m^~6mgC}eXt}2l-69mLr+!mR~9iH?^GMy=;g7v-VSu1Joi3zYA+U(67v9b zv~3r}zl78zFg%$yWjIQ18HY(U%pUHd%m+vyJ(T1vcIxY znwqyjO+^K51RyJ6+WJEfP&D(T9?bPZs*YFEY^8^-c8FUX=));5$kS zpSf^8^hgDKmuTqs)O%V><}9f*^UgqDUtQpOYASfOt%)A0oI=>e;HM7EI5&bgGR#Zh z@WRKTHpFiS+IrSg+VumCzSoq7#U74&`e8T+1&rdbu5jOWrYSy8 zIr*)9Wh=*Jtmr8DIG@&VUW;#spng+6F=E5__#V@fw2@)t;c4D{?-fgYbN7uPMS!`5 z&hHx7iY2OM9}j%a3n)Ru?oPJUP6$tRlRfzLrwAW$zm*}9pa_g*j-AK~62H@Z1?cWh z`sD9=wj@dlEFgPwEV2uiYWZI@W`VH3a)wSZ(wfeBO?f)1KfAWJM%s8sCri_o6_l(~ zpuFO69lyH0T`cV_t+hE_>Fw;w{Fea#zx;&cViq%<)Fz8ZEZASq{-1rvP$L?!UH2iX(0_9RtE&(rP}pjuNc44NIx zJX>P&@8{rG$&b>=Ts=O|4Dgsb(U#6>pqsi!432nnO$ZYG@ezEUy#Muws3`i zjMDxFfPV0!b<@;Gb3stPJ z2oY{E;}bjqOnQ5vlr7wlR#va3+aU_+361Ys{WA8J$%9eB*WCOj0(;;QWz$R|yUt5) zs#mwV1gO8Y{yw^xUWel4qqXpx*AUT5{vmpMdBS7yn;kZw3t-b8G~Y?TojQHBVCXqy zKUb#_8q4*RGjmti4PbjFJXg5GxY^^l3|o@??tCkBZ3q`Zzy-_aI;9* z_0KWu9XQW{z^uC#tSqmnwjz~;0s^^DXv*Jwuc%leHQ75k=8E_=J|0Z|?(-t_UQ}Pd zpWv|L+|=u?n%v7ow?7NW{~awIDu@U(Z%rDrN^QitWX#kpGv~I4>uOTm><37mQ|Kmr#p>t*%kDTiqVwJ~DJ6_hM$eV>UrJ+FM- zH(#Wk9%@SelAmDQ|NNI~bK-Y!rpxgl|42|e`HypeMEV%6lAfHHf4M_VR)k0bQst$t z*2N9@CZ!$7L`eE#Zcb$V`3El~qHtz=p}F`d8ZzCG8g;mg8uByTlJ?=lwybNuol?8( zrZq-J+0ie#Y!fC}Rq+X4VMn+}TMgFbCX=_9BD(MI72f;t!->>Bq}|=gDeL6KWk^l@ zgPpM*;qmWN{BMu*2d_K8NT>XEVC8Xjh(tfJfVCiM31V8no#l6}iU9?rD6fkj*!Lxs zzoMMLf~_E1gWg+3_lZonq9={x^2(DaO(hbvT?o+e-1N2*N4tPa4MjiIrWZDT(PRuP z%T`@e8G67w7Wn?OV0p!FY0i#~_SJ)9WM-z+ zeYILUdXA||UJl?u|Lz+EMnC|qC^?)j{!#Tyw6X`Dq$+8~F)@02I1s%l}uy9n?CzaGv*Y2h2M3H2+fL}YQ zU_m8OI-2a`_w@Ql^Bw@*jxCcUo!;R@;3Qyr>{DfXEpiKrp3K=LR08>>ksV=ypG}R8 zl%8Im1v7HSi3XHY;r|A1;E;ezqO$tz2@RTWvV zdx#B;j6h=b1#ieOgo5Oy1>-QQvKRaPf(^^P*9+bOQ3=ogTZb^xO&LS&i+=inK69+?}{dWxNl1lR3ZfBu)+`_ z+MrT~shODTQ?ZGi-O0&}2^~GB;vLo5Oijatw2mx9J1;92-%$JP+k5Vg?inqe!H?(M zNMkfu_`k0W;5sqY_^(v>o$Po+U7 z<@-A+RG);sJ}aduXl8EEd+7D?1};>IW3B!ww~KoD*xlV)z&4;BIl|m@L;0K?r44|W z+II;QkWRd(h%nP!UA&xi@&%Ji zP0ni5OmwUse_+s@$xP*zz=Kttb)hTQ(+sgr?E?FG?RPH!bcBz#Qb^{W`=1^3_r4VC ztEBE$Hm|h?wtfF+^8Uvo{qtds zfv)* zSwT{x4bvKLRWjB@$RpGQU8SPEot1M9YRHFG854%#@)py=6U39v5H7{KEYS3n?hBV6 zOzUp+mz#TUr3<}JwR5bky-yoBwg!Exn_Y0oP#>pi$DxQ!^*C8xWMmBOy!8L%+?XG8 zFI-wy`)UL%3T>3Ze4L6M_(CBg<9i6sC%M@Jymy=bcG{L;G%;$*D20h8Q90{B|DIh6 z2>tyI3E+Qx0W!wLMN9eH`Zw=r-G7?+x;5aK7|-%pZxgH<*_&0^Y(8LG7j@xcWyzHr z61Tx-<9J#t&HvBhZUBm88!TS7g<8Qdj|Dv`5=Htlh@oFP`hCqyd8t2t4EPO8RY2NO z%L2C2|ECpjJ_HPy>!H`5?V_B#sQkrm5mxDgf(Q;C;&6TPewWA1|1uccgaDp=f=>DW zhwQ1V`z<4IG&KB{N?2Eb6}L_r4dTk+sH`0*=j3v?CJ-M24^9#jUuQMM;5{+bi&GxT zC&8D~bsKlrR_S-6EB%*j%{DEdGS)XaJy_xYu~*Bl0cOy$upZ+I3ZP=;!YUa0b~s1P zL51$Z!~O9p6k3w;J^D+m+H~XCRPz{+x;tBYy`Ly(YD)Q{oUiKj>i)&WWprygh<+~r zE1@M$pbvq))q~C1I5kRNg1vE^;+m%--a_hcB{W6iH^^UjEhq}McP&8t#qsR>3Z0ZV z(3QF@Cg09D$T2Y5vgN!`YP}V%nRzr7yj}jb^?c_sQzRO)1 z{zQFcX=+9Xc1}GJlECiQ*PfbhIh?mbwgnq%Pk3T5k>~{?sCw;B?#;|ZrLpXgSSIbE z^Q+^WToU=bAt{w?J$~f0`YKh!>jo=0EGls7|!i_Mh&vE}UsDHCf02gFnqtmJH zFI46)@T8`uSdC-^#>K`;U746_7|`0&;^6PNc{euEvz_sciG*C`h1NS1Gc$`qyKp=jg{TrP1NJa)Cs^71&Owp_ z(1Evc#SZ;7U0prEV?O(Wm4k!NS|Emq2*^zQuF;uN72djfpKiWs*~wvhg07n+(Wn}a zi-YsK;tUL2kxCr?Dk<6!Ix@N2_!Q`O#la@X0+j14nPS4siK45`RvmSt(3s{;Nl$Ie_AP);S6ukt0s`3CX1-Vk_>C6<=QXINK9McC`45al=**P9;|bGR__TGp}o}& zQ>V0xXRHwbw2jjQ2|72%u*|Giq>t3R%rsxP{2YoO`@umnn57qhd3V@l2*2dm(!QUY z@~f=%Ef2M;o4bmnFApE{;Q#k+0_gCDQoWs<9|JN;22nQyY+!X@H#0Ni z1+-F;lsunoY;Au{PshA{JLVCp@Eo6JO3Mn3@JP6V1uk5L>FHUaVq|i`es2G9`ppvi zh_W#kP-oY}At12<(gKK5DfsP5W@xxg1Qb(+LYG%owxVY3 zh0C`X=WZAwA`0Sn*SNK=-q|u4w`&%BR69D%=rn6RMZuqTHA!l$m^VoGXi>m zl*(r6o5G(htj_~AC*SU;QP1}dcWeIaNI+xXt$BoIra9>nGEVsuQ+rR#=X+yNC}oSC!7f$7`i~CtZ=ZPoC4>48 z`_+y{5!o>GznP#AotaI(o8#c&Q42LL=OPt8i9F%iTHV@unP;2moFhvGE5Wz8s^A}mxK#ukvC=TjY<`w@N|ap zE2Y@aDB0PSIjuso?qv|*?Y^_9JT}W$(!g-NhITLQ&KD|WQrJE*tWz#Wk)}Nm8358E&Ob%tqrH$H;uBoOS_#!go_8F!ika ze$-^=;PiXW=n7V7x#{uVN{j{i-;t#1)lYOd7kpRX=MagQ92FT;($+b|l%wotfBwB@ zuPuU^q9q{LuB@qmYnUN==i>M^wvPEN*|%tyKP(5I_=9q9w$vLz{7IgYMN50dm8&aC zvfi41zmgJcj~Cb1Cv%#PfjMnC`z=?2KxJ0O(NTlGh3L~wOslv;rMW@bFe!Mvyy=L7 zL$3x{eErN=B$84%p{#XDh>7!T^HCmcXLqXmLg^_mS)eP(lfr7L8<<~~1omAsbH(e} z=%MwO?AI!Rb^?nZ*vgxNXzK377`ata+r;UfzxTbkx)@y_9Idjwa%;YkrM(e;iFLD6 z$>oB2aeK9&+j^Wr7i7Khes_XzsBym`_PO?lunjSrTL_$l;U2rrkGS=_s({HdgZw`3 z1#Z*s5jd^iuh&)K9v7F}_G4&bv?fC6N5Cp5-Bi=_?3xS9p8e)CKizg4qy7YrJaEb} z^?lW=-CB4qk}~TlJ^jmg%eZ3g2+&)haRIa>shw%s?D$nfSn%#H zVU;`Rl)%Gu&Urqp!R5Z4-nf;~tFh784G9e$O}1~!TMw$3G|SB7%RbwK`v-_EU%4O= zeCSKGFeecR3H^;DXwsri)4m1yq7-PPRK9x#bW+lIEQ+~`FX?xBqs-Yg?rM51!MVn^ z;z;AgmbdcLvmPZXX>DQn8Js602ykT=ypCNdgkQ+*FQl|2dELQXH>gj5^<;%D=EwVC zwQxVR{j+psaVhQ3s8?slcReuoGCzeEx(O11&sF4pk|yv5*Y76c6#=b6rf5Ua1Y-?V zw-~Dl`dv6{KG2`7ljFW<_(gB4Ry^Sl=b2WLpzrgSAA00SyfMAApHO?!cKE%q`ljmX z4HxV$VP{g%a5D69oDp{Vc85W?xa*YAl$y#u?i@}mR9re#r2rv!-U=USzkJ`G zkhYU67DzfbmRc2ix?94^(nJ^4u$or$>+`Nqox{%rF|sXrAtJPYf;AQLKvC>(CtXK% z4FoXVz1?*q)y$TCRQVR^g-<1{kqYpBJeO$y%7+&d zP34hA8U7ze9A%d`gPpF|j+QG5XY^1k!k zrFeDeO0x%iPR7@QDbQ0!T`a)Wk1T5}z#}P@vH|8)UvMvoCIS2rU zg%UzUjvjKX-)fc>tw$au+t)|dblGSU;U$eFF1+EO%sac|sGTdpMQUpYcVTFs2X(#h zzpdA{Hy(SuvRzCY9Z3eX7KM0)*u56<`*M4B2qW!Y+Rj&?$VT@Z3Dvp*#!h{ffPAD< z>U~-mmz1PbPsRDOvojSVRqhsKV5!c<)he;p>@HF}_G>dE6d2OQ%97vY>UpAd;O`*+ z$ggm9jr?tm)GWz%guEO_=*NA-tgL0?zM;YL+Toy%EH4QESv#@$$jH~X$Ddd_D;eX3 zwVzOW6*gj;t*^qiD{w)2cX3kc38MnTd3i_9SVy^Ef)?Uz4bObRD*CUm`v)1ceEP&9*F__1ZOeWM9AV zKK<9-LX98{*yMk=`GLZ>`F4g4efVr<$9jmV9J}D4tmSxU)@ozOK#o-UCbac7FT~4Z z)EW$E>7z1$%tEp51qds|3nuTOwU$K+Rw^|CGExkg^pCb)Ow{`e&C6u&`9g%*O=4#pNLbu@OkKa*=vE$<>7E{eQ46K zvDa9|dMQk1WqE)9Vg?VFs_Ke;%|$W)Q56K^o?RK|2`X1Xn^@VBmf?^Z41OSHWl0lu z!}zHanE1gj$>J}q6|m$t-{dJD33Oj?e6xc)ZiqI#hMaysN5LiiJ?xEdh#&5gyimZj zi$25Mq`ce>ZlSHsjgcwr?3_G?2(? zy*btEg~1ZR%U23K?1c5JUkc67CZJd1bbwfg8uzI~_(b*X936+CA={9KwH9P#?29jKq9#7{C)Ww2Wk--T z=$>JCjrofg3Am~RFE-2Rl?YB>H1&-*6{44%-)TshvM%X!ZVS0)>ieBrVB;RSR9MmnTB1nKUcp&N!AV1{A-*L}`DXYcdvpEZm1 z&H#&<=Y5_#ulu@ey4x|HYg$Z z%3M6WfPFVnWl!EZsBf#oodEkn9X38y3=X*Z`qH9$R@xi6FB=V>R5kSgN*Crb*bwCg zD1({C)!Z1!y8k3;k@&v5s4V^;pvsyrX!n}jr*YR<^kfS&-*;s8z}TKFnre?iCKHk@ zBsFQR_&voqbk(dI0~Q%sh|QG$QbJ9jyW=}LHHGFm+3A45tl&2p;Q)#Q-+#69jo?8C z8b>(%8y@lBGq~W8mXpg*vRc&ip%gArXH@SV@qChD_JXg;pbciN+pN^?1*%oHXvrlX zrnp@cG0(mOi$-V>sNqGnR{|^uD0zWfg@E>`@Mp3F^s=hULTP~`);VoXcfBHQJT)F!=jB z%t@`JOXY&%@>n%IxAj^JJD^cCp)9ZZQD|;(_L(q9Ty8e}-Tu28-)=%2{_{IngIp!o zv+-OMjT0PfE%G(2Eo2EI>|C|Ilpb-!LQ5r~<4}Jb{?fYDvM0cgNmGJ&R+pmaGhKCX zenz&O0tJKe$h7x%ojEH6w7*;bF)U7jl7K+jge-7&udTSq2(}g%K_gkTj##$=T(kvP70Qqdhtit0&^nWiPF!rWh)}1q03p zW%_WFXMV=1L04eJ9$33QdoQE+WL|x!Gc^hQp$4qK44qz0Tm4~g?9Qd2`Z47j`X+an zrCZ-X`l~2!sl0o7U zH!&k$)T~W76^;v+a5)^y7?*%br9MAsDB(F4#SgBRIUR@}F~mk13#0?tmXZb-q+hwI zLsOk-o!;^qv#5Yg(#f7WAH3kyR1o#W#H=jx%5Iy;L2bVy!npO04EW$gB1pE$GRp{z zLxZp545Jl9I@4&0^Hw-3t1Vn*_A+=fL%2?LFh{ZNI#HufF!8hrAC^S(v$r)7UYeK; z=Df#RcS;6He*gHx(wO#n~N_HWf@ko~hK0 z`90NUBl72P8nMs#o$h3{671}Jk$0Uo_DxSKa``5%8>H%nE*>H&#hkU|r&PSbEJ1N_ zas*rsBJuX^X2AFc#I4~8tn<2Ncr-Hn`>l9hAsciqn$*BC-l;;3* zC*UFbf> z&{E&3<9&^mJ6#;m$$EFHU&`|QW>cY5`d@!l3_C;Tb2Vtpg)A*qH+-4fQ^Z|==H&E@ z0aP2p$J7CJ7+C0@AdtC=G_UfZr*XqKk&N@juhN>JeU@R;&}yS!+J+_26{xQ7a(L%f-sp=Ov&PtfgM)(;=PNQU>m2949S{Tz zV*mMq{LXE~s(>%L)03%v;ZL)r;!#Hn`R+C{`VFWdmPrKVwha5T?c(W@U0;l&T-65v zxX|b0P}TjtTRQ7`yBb#;U{2T!7+G|r-hF!U5NET6AZQAUoCb9hyy`#ohB^4KWY#7> zw*U1M_n3ajIRFl42kp5MU8Tprdgtc(lJWCTR4;ma36FRb9lqL`j(}n4X^+iGzXXOX zor0Q@Tr(Hl#Q5A4UH$kRL4h8x4-dSF9ae*-2g%O~*QsLc?H``G!kI+JcySLH1PT^v zip65Yezd+Ml%S}JaK%t?!D2pW5HkI){bw`iFhj^*jEZsIE+#TaHNRA*xEgjwmt%z!6!QT`EJcLv_3c-g)1J-~m@xt_y9TAX0$|Sywmr45-S+jTpWumoUiMnu0c+ugw0S=SWb-)og2f zU)KKtjEeZyki%-=eY~>Ke%*4K!}^_{9=9?5>j1~zA@R>0MUjW?8br+6xeFh5HZ&7u zzxR!IG45%WMCgNu>F-2EKZhN^2k{Nw#Ew+wuTo~8SxU(PIDCMF=#>f1rHr^q*ux8S z=O;uFD&tR>vSk$i?PG;XUVe+$7tUl96!z|ZsfZVL_~8JA^Am&$u_QVi+?m_uYce!1 zWNI%-*Yh};5)-D|Q3cJICDpA@;PxlJa56N4JXW$bl3K`x;&e4x@Yn9rR9xBkx$gnaV8<&m{nREi#^; z3udnA9BS6st<%BVxAhfr_=WwU1~z8^kb^Ax9U)G{lhYB*BY7rF!_r;pVp_AnMjXIDvUCYSX>UXZh((_UOO z7ynn6uJdqQ2$dK0l3>d=RSa25P!L8~x9)}QfmVj?l-u>D`o-8KwC%DE4+4;neeDSk zQIY*{(@TxTMWjnLrT*htdKVb7g8GSo#v~>ZldlBd$pqa7cro8J9oK6Gz)9GcHg7JZ zRhm&qND#Y0=le%kSjvbMI8Z<$sU)$qkIGt`DPws<&s)dA>~3js8M_Kng7DeOIcN*| z2cu(ZqR#xT-HBhnE_#D}_5L$USW&WG39|r7MgHEm^mJJOC*J}c;K>Fxv?)O-+0w@8pFiN*P{_>hd=v7qf|#@_Q_xVM#b4r9>B*ywo3 z`O1*3y;IG14`%G#ngeS0Tg38SS}NUnmfR6$iT5o9UGazOzp&r3VD`^%F6BvjJa2Unr>;T z{k9d@IJAwb5&ABjVuZ`2Z9xF-YKU;t_s$J{u|xgR4IuBWy>rI^X3**$P<**{JDy}` z4#Hu@-K$J8xV=GVkP4b;hJvzGS8MtVrYQ~rco5Y-C>(A4iDnaInrF1(z+N@w!9;jh*LY>H0II;>U?be*Q- zH`do>Q@P8~TFN;*Hsce`Bbt09umjKo(x5HvT9#SU0DsT3`yLKkEC89_LeVfRQsGvs z7;OlB7LQ`{*2=a zzT}pdUT!y zx<6aO?Dy_&M563;Tg-Q7`uTT@`*5r3%kW2|s|ETNlQWP2r=CEPShHptX%O$%qnZM5) zn$!F6%`>;2OGWtOZtmgl^*Vsr=m(R`#8KXdKw zg}M!*oIc^6)w5B-;Z@gTX%-`Slx6o53l+(Gq&ACh{JZA`4nII%g0p|~9L19yd0vh8 z1~#`8QUzN#M|`y6bl5hS5@I{@Jna{EJapnJ48UxN%%44Nr)()8Dw~?wT#phITdcED z-@S|b8jV@R1K@p8y^q#~iwNu`tG2S%H?4ks+0IGCFb1%~nqQ#Q-ZtNyCfAA)jztc7 z4C3L&H*U^J4VHcLiHIO{Q`=HD8&C|37@4khcZ%ueiH~HE$hsHb(4_Fa*4QhZXknf} zoDi7jJIwHjZzU&pv@KY7CTHmET>hCM*3_(($Gj{0r}uLpm`nZkU3m5q=OphfO);SI zYiKp?n*+CJnzSZ216e*g?{<6b9gVRar`OlX`_=v{)N92TVY=LO;g0Dv z1qCC2s~lXtDz`vUPI=s;8h`l}xAjslyy(HbBf{W81O{*A*#vR|JScq{b2*V3+hDK` z{!u9lbPvEU$HQKJQ>Z|lHGfWsuaSMhh=zQUX>4M0wB)hHTiv{Hz3d=YHIykR?^R}2 zjz?}yLLEX05NuyxdV7y+(Gt*wCnoB_ePP#)jAckW+07$U&nXksCbKt{-SE26YR*SM zPeZL8GVXX7IW)ffTpY=}Fsr3bCRheK4wuA{P(>XzLkAPew1?@g!X)67H!BELb4PD^ zbf>&JltzI4Tai1|bLyo!v~Sf^#0IsuZ3FYi#Z%jnhsKliqTXp?Adky_G6yjGekqEY zT^G6Nu)Xsu5Ym6T`PLFtkXMtqosnuK{o$yjcGUYU6@@1nKyyk$aEHPF2b_`_IR=RA zTmn|R;8%BVfBWr4F{3ov%;nLt^zE66prXO0`+|3AeSJrV(Dk;UenS1$2*+$td^u(G z4vpB8L`eerfxc*(1DB$zn^Er@-P_|{!Nu}KMIPUc0-jYWo+j3f@0`7gi~CujG;(@b zFFO_;AX5%!F7t)7IHe5u@7tiL6%SU4+%1Ed#v15@-eYjHO{ye&61#yehHJ%e3P)EO zbB&9m?BeBme^r5Db_H4MEu&z*OtQ|$!uCsW{|udgN3u}tT1-={XJlSR;#`ug890us zs@09+2hnw#t;TS3R$_gcMygNBAY(!vhgv-)OU*?FVdw8S$< z=b`e?^0vJ_WrYde&?u#0^Vlr2XtvQT&u{VQM)f62-dpTX5{PGeneODZ`6=c3)uhJ= z=j=6HjUZ5BttOfY;7(_i25Y$s*`M0B&bHI`eC(^IJTS4=;~^{4fp~kn8%F5#Gdj-X z$<5XWKa3A5IFH_u*jD_djupDux*23N8Zv-c$m7%@X#(+RX!l8ct9?Gs!|gJ_E5I@C zsO;Z+9v8X1*kmusN&cQ5${?8KZQE?AWB4IxdxvhD8y`AXMqL$kxFO|l} zT^Dw>FG^>UkgWX58(~?HUp4IV$3M3qp=FkVmKD{cAskgLwrg}MAKa=$R*ac<||y;9U$RgNz4!I60o6Ol+WWZe)|+ zmG>o*dHPPEKHa<{Nv7_>FzPlS}rdO}NVJ#3jH7X7+#p||tex!-GSCTjHJliHyy`W`wu3K9+XjOYLNlM0`VDUT} zR{ogu@%;tU^rv^n=i^s(Hh?*xhSQ5Fg}3|+3{z7)F10wG0e#QO$ll()d-q9dj-H#E zTEd2T^Guo6vVz*q+S=#-DS;P8yw$xF-V>a=hMNP%F;jJAuI?0k+)qr_!3XYXnQSH_ zDQAYVFAHTe->WBO`6&?`l?N=G?-!O87`hECdp(v>a@)xkAATdlGuLQXGHEg3CCD_( ze;4}IXQmZ$5dB+bi}bPY^Y%OaPlrPe(XntaV;&J^+lUWZ&&W7uoQ=E;6OwIR7;fK+ zSYM1L1N~RN*f*8d_IQeLvO9Zn-ro5qRnYS0Mq<*130sBy(0;|*%@E6>EE3Kr&U!zJ zh~?)*Q_&+pEq8+LwHVF5c1qL56W&d!zse9+;QD;pk+ZCO{=sU$E+k||I&rj?kkw)l zytz_4=bF3j7XT`=F%eOFR6U$#RbEB0ox@4Z?;JTR;VRDnl+cfDjRoAH&j@I(zf|3) zyW4=jn;rq(bvxd8pB7I9BEdeDqJn7(+i(G_m?`mY&i$eh7z;~O^57;bTocULW zP{M9)8@(_U3M(kf5904zd!T)U8>gin@SN5&;hdI&iO&y4yPBTIgWTeMM%Y_2_-ehx z%g2mF2xa$N9>e5*izr3-3I&Qieo9CrS)#_6PQmnL-v&}C-Rbzid3%Ihws~lX;q{w0 zF$s*i;_glAg!eI62kRvyDHWgehQ=)^=*V-!AsN&IKKVzpc zj6Yq6gHU>^o;2XWb-%7wl$U7zdq#id*HbjY5UF_7)~O+@@h3mgueSDK-QlCZKhu96 zwgm*wc#MK2e@3l8#gDdaf*=66`+Z?qGzDj;;k|P{=(5 zJ-4bW6KT4cm{3xt!F9Sg7$%+6($~;1&AHV5Uda6VHOK2Ke?PSDQRtR8yhHGLZgZRM zV?a)b$2Xg`_)eQYAq6{r1L1uIX^J((iG#ZFNLB9X%JECdaBPm*mrAoXJf4zzGYc2E zdnm{+x%@Jf;Ff0i*XI)L)Cl>W!Lv)pgrws;r3v8{uaE5*g7a{2+9+hBjJ*XZUynod zQfna%g`ZBwr3EztK>w(w+~I_F^W8HYJ(2XD?;US$3c|OkXko3+HR&m0ZhtumFUMRl zpBftv7BSC~MuW!{MH<>$wv$#GkwYFY-_cDdR%=!8dce{=Pd2H6P3sM56;sh~_lkW< zM<=mZ_fQoM=!vzI>eQ+Mian}@INxCXk`opBlp&$TdxO~`;zqqA%Q5jz^OzU$MRV>F zP(6N2Bo#Jl-eKEl?Q3O~TraQptsmYk%TX|%2rVDO&+9@S z-oQ+`Qs2Hd^HH~J^TF4Ii>VSiHDYTeO5U7r^=B+V?sIcsM%p(F9nKoj*|!tlW#bOy zhGXPs3X+3w6bN^hzc1B0b)f&%`v3dd^yU3mQ(Q3w!(A<6LN-jQJGr7Q#KTj0TI|n8 z(f_O1IEC&zlpd5GdJaRarNGu<}#k%t3Bu;}s zowWPr=N?*GO_qyoB6>Glmb-H--RF&t^HLwAkXXb_{kQipWQ&pOy~?zFd@|*F!|~!2 zZIBxOIn+RjgGwQUDLNVtpMac^UOt`k_08&JL#4~S=edyqz%p|>U}2LIayRL*LZKp{ zwi{H-JvffdXJM&wT71F=1He*rhP{#b3ebnP zb&aplf^}Ss+L~6uzE&INA3{89FX9-MoEO+d?t^^uJH_wcbVOFNIw|-$TIzB~i+OYQ z8`3OFmLFAL+Xi|za8B2BMFuC>l<%HFDPvwmMM;&jzPyjDh>(q*O?)2BZLUclWY-3fq;d7irM{MQ@{q17|{4jl&ZIa65Ks1*u&udX>o z>wP@wr2r}9?pDk;mKO>MAM8I+yzvps8BIDVtTCS#4uC&aMj^YRwj@Kv5@{x$2XgkR z*tWY2yxg77O~u=DF;(HAyU(C(2gctUCjtpOdLR3mO(-GwoDaUX+(gZ805sw=Ncv(| zN@|mlw0PZSm=vU~)#$tsPpnX0&`k88tUqNg8aG_T91cLnlARA1>)HIczam?1&>l9c@q#TKPbjHjT$W3g zbPry9h7`*}$}EWI3!-5_4fZ?V*}07JgFA!4N4;~0F$*brt0LxFDF9Jc^Rs|diIuH~ zt|@8)D$2`IyVFX6E@52JrwIy_LezlE=RAdYTJ0t+Y;mB&43!?ZqB|R2e!a3Sa|s3MtfTEs_JT46iIS2M-R#S ztV}C%;C>bq%oFcI4a&4?+5LD#VOH8MnD9PzI{{{9i0B6K#*zA}_xO}#vVz|vx`Y$2SpGVS#$9Dla&^BpyeD$||v%*P*yHMPy!*AC^ zV>1qjlq>ERz6MmJUI88)A8$2T0iY&TH`c)12XbY?DG)HK%>k%9w=(Nh36G@lTio{u zUW`_Zrju%Q=K(oBh+YDBR>+dRVrJ$liK5_VqV&8fdM@ZCjE07mr$cj2LqlDhw_6W^ zOtZ2+>`38=C>npbYq2I-IpE@ z^|h38yqkQ<#VoHB6I-MAr3I|eOd;t*=BcTvzA+c#*yy<#`jVd3d|)U+)%svH&_GVE zJWYc4H8JxSQ_zsBq?DzVk`w3AV2HTzL;96S)GA9<%W{j9~=d3 z-%Cbb6ws>d|7@;y*k+c93q49$g_>e6;x6LJ>g(t*RJ6eoLfqSJ;H@!Bo>cy5WeKMAZ%#UrU}kwO?W#_r5VG7lbD!?F^)b zZ;$B5MF}9Kn2e1iRg4-+b*dFVr*`)lM#;nyk;;nD{52@{h0~4IxQI6bagGtCvo4CS z$}lJEaCq+AO!=j)*F8u8Me>OC0=+TkRroSMkMm5i1_%tfQN(~h2w)|as^L`Lu*rWlQUAG~v*19}W0HZzL={=54uark;xDXd8?(d#LJR1(@ zZ@{`HwYO)6yz+)6Yo3HEp8G)65E|BS6Q( z7zho&2F-!Y;WC<7|ElR$0JE%$oLOmsUK-^EG8$hq-f~q|DHZo#bUBFQ z_kbn$KUy^~_|lGmroJgE+CA+_tKS4-sjW*fE%K+iq|(dj#I2KN<#8m z%ejM+JqILwmy&`yJA^S@fieNtyUUCH#7xN;Qch}c%OUHJT7;l9^}Ipl3DM@S`?cf- zq5}d0B?{!ojYhPgQfFJ0Z>CHn+GgqjwNek`xv`&L5?5AUxSfw<{1#wW9KVqzmA^h;SdUbKbEW^!r*QoZyJU{7&;g2iVBtrE%y^^-Abz$j65Eo0BiW!ksr zP&Z09YZ%)X{+#_oYym#Rkj(lbedY*pUT2Vk_l0?RI3<@@hUXfd_8H(9k};7H07bP@ zdX~@BZJU6AJy3P-qrAQ1(&lCQN1O4-im($jwXzrj4narAR_SSF7zj`it`mYA+q1yP3 zQ9pB2@XuKT+(iOVf7QKr^#|tB`5uj!sNwDTufLsagM{PY=JGn5>VFSY%ng)uma7Z# ztLGFNvYu?Jy-+$zW(NnK(1<^drM z+$eO5KvGk8ZYCF)B()=0itfy`Y7``GH!pMlclX}k;w!dw!|E_gMx_H(&=0$MahhLG#xI5|< z%XwVqpE)9o)9@DAI5z3bXGI$7A5(jZx;6mFUx`YwHKD?wU`i4^0}hr^mT|?VR?*Yi zN5(=&p2d#6&D*lC8#jzRPs^nnT$kZSBV~ydCj)2OH#tS; z{ns$~+}csfDJ%8j=4XwD_n%xAbr0M{QagSwC%H1aE-t}0j1x;o@2Pt=E~qiz#C>Q? z9sMfRzHjVUknZQtOQa_Nx?*?Pk8LAJqfiD}c9NF4G=K(wcngomu7kDIW9=kpSlS}SdbT_r zJ!%i&tB-1F;ky`y$ZVB?w^p)gs=SbN$?SHeFV60i*3?WHVRhIyJ4?Fe{B_&?_g(-_ z(}!xz^s77KEFvxyi>P91A-=$D8O~7>n&O zZLdvYQ+E|&fuB*-=^LwzU9VqHkk+Z6>Bzt7pA9Df*HH5_A9=nR>tkouQ_2qnCZ#$} zeAv1;A}2_|tfE9~pd;w|O>4Zm1~o0*ZA%s$KpTF+&;`q$(jyHuz$U zW|KeXB$|nhhezon;!$Htss(T?0BTqc;XZlcgB(~1`*A0h%)8@D5gxDYoE+k%24fK+ z>5Iwr%h}Ybk;e<)-;PhudvR5R<)vRXoIV60;3^4<4as(VV0CV)uCKhAIuDH~qEy2I z+uYHX5qW7Xu5Kb49UcSIvYwcovMoDto3U@zZoM}3+DG^s^I!P6P4b=eFV1q8)2eSj z@s!ad)Y;aChxTLbG^Jg;wLXGDFo+@n;f@V!0)R^+xDU0xK zB@ps|3%mXrg53@CariiCZim57Z05LGwP|5I3}#N#UAD(fh^Jz_f6AssBP}tQLU4U`1*t*N%(oeDNl~uzpybH^3{9h41eKwY5&AMnp zUueUGORdm!XWVwAG$$kqk0Z^hBI*K=KVt%QCMA7ZVf4R$_ii^K{S`j00vm@F2p(L> zRWGn>L}C;A3fD?Oo+uVGjU>mC>J2c}pS}({3RNw7)B+~zzIWknw@Gm2dcmV!$tXlG z-+1BFM^fh+W&7k^vD|CX9epWSaMd9c)J7`W1A-K9pj%Qg75S^ST14%5{mQL8?b z>w*r4f`=}hw=VJc_?@q5yThyi32R}+FH?5@U;cA*`Sv@SJtdMdmFSa&Ihq`1 zlxRi((yvFQ{%hmEEt?R>?=V%+i&~b5NwaAD*w~)>A}@^(nT`FiH_rLZuggj1&QBy9 zp5HugHPDTgM$@A@oJ3go5#`XbgC!E z+4myGZ1$6|{^uS4!_yU?j_DHh&5Zubf&SQn4QB7#T$yCn`41&M^?Rwzp3=W3f!y|r zD*ENUPjh=Pe8gpdmV@cI-M~d{e+@bLd0Zw1w@FIt*S4NGr6mBpub)h34U}G`#PesH3 zxz&YYpMd!ZvAo{B>o+oxV1;(i?nnKjgT$1KHt!8?-sjq=kmY}9<8#;w2NH(KtC?&= zjNQ3xCH)UC`9k5qoY?~22R=VxcrDwl0c zE@u}Pf@%f=#3K_cMO0VtsVs^fMOp&4&%G0YZRB#1Osub0o!< z|KDNI)Wf^p-rm=X`Y20ymET<;70JuV=`5`tI7vuIkoxi^f!&6}0*h3XtcG#YM`SQm z`dv}=lv>ZMR@8P{+H)HBpuoU|it@^|=x8cDJUo0{+)wa&&kuKKD8BRL^O(Z?z304+ zmbgOzbjkCmR)F74vQmycA~Lc{-wOUpS&;GVtiWnLM~}msrS)tK3yz}G@H+K!o#-#a zDXN-L#2Ke0l{D(VPfrKq3!&^=BBAYX|FEkS$k2lG+T)y5ZM@)861KxbHnqE9Ru=Ld zCyZ+gmtFj%0(bkKplea%LF==G1jS~!Zj{AvexKi!I=UZDi=2OSRay9Mj{Q$l^-)nR zH>ZM|_3emOO|Hu_ZdMzx$!U?mC)|1Ovwi*kjsDBNY>^6nlks?{a$#}5T?(pi2f zpwz`_ReXL=fd8~l54L%E}s6PD=bV#BH-C@gQ(a05dzCNt#%st<3u(D0Cjta@YVB_ zf5-s&sJK3X$kj4cmo;Yj+AvS?uD+>7`KHxSt z@qKWE7jmr^?+gI*tm9`R_4rT`#NqOD&X-9n`TbBY6o%Vo{A@A%=+IEyZ{!P5l_+dE zt?*Wv-`YcGy{`eZE(6efAz---KH6gkpl^8!AW0>RjPj6Q_~o{5nw$@nzBB6ov9-!x ztT?=Vu$lA^J4*;HgW$)+vU1*K8i{sHM+ANc;_*b#MO*W@R|Dn0PtX#>UCeQLzLSO` zNMxbopa9~=!ECXv>^C|H*9kxdEu8o;YSqlqP0)niUd-x6&*~u(9rsj7%5GCp$g;eG zOm-{pLdBDWY)0xu@$hHXW%ls!kbBAn;J3i)Fb~ANjx`2E?>M8|0AklF)78Y&Ym>|* znL9i83DAHFCdVTb#wil2I+NE6N3e%d^s-tnX|$9Y5HsnNQcs|?svl(`bzLGjt)g{T z65HWU5lEerlJTTJU=k}txSvG-)j0lZ(D#qmK$jQb+3jP#MYPMr?j$|CUd2ImF#wcb z(zdog&Ue7Ne&_S7!3PEg23wm6Ws9ZLr#BAO-#sp^w=RZ~|oSGoYst19UpHB{L0U|EVP zD+6GrypE$f6A@@N?`1H1w2Y63XQ0jDIrolcLi?>)_%kY-c3qNeo3d)}jI10tCuwQ< z#P-`w8#;1+^V!)Sp`;c|<#V+b^<~4~sQj%4tq2IvlOMbrzhg*s3IL}|=V`+SG%wO<>ty-Z1yxoi##V}CaJ4wj3C?kSQx(5R-sMHJ zfEX}HWkp6LB^6rIQhrOVkb81yRWG(9pYEP%rD|$g_*;f|Vq!u^Y-`ckwh9nxI5Lu+ zp57!>U0i8h z@~GbU>e%2531l)@APN(QYy7;B#AY7A(b3Y=_m+x3f*TL2X{7SG>(!Wslr7_UUxD1V zk_*s3U&qRi*uS1qZ@^pgSTH7-t1+t{N;}CT!5Bv*+_EPA$pxUc;3Ya!KlT*P{`;mh zq+?E5KbkpoG&+y}2TLi@QF4D`LT=z>y-4gm%;-~aMMVodUtp^*V;R9W-(6z0HH_%I za@iVcqqLq zT9|cVJ^C$1MGQI(5(o6y8i&VAi*kkH%{T&A63!M2x0$FL;<_(D^{1ZE!T0w6LZE2BVuH;Iy*f*n6dveJUZe-L&9OT{;cQF94M~j;>!^JbXKEJ06ZrsVO3!JJP$!Sg}XY1*x6T!eCQwtX8wb;K=x%^4K zxOW(R$_aUh<&ilCoi1r~AE}tFsD;}*>8O$M5fc&d@OvSgHG13}dj{Id=(iW!T5H1% zyMU+T=DjBW{xqf%_dP-7vqAMYrx#`EmS=}H-qK%&(+sHB$9uV9av)BLOn(%1Z&W6(Nw?Kes(|e6RS=}# z=XRF<-iu}anRXPI7ijET!OIy1Q$_xDKeUCiR%O-O(Q)6u{D(^6Qqlb_5G+zbh=9i4fycZum6%?{+%z=I@HaUYLDaeLo zqK78u=3w4IDT@Fz#e)C5F67~ac+_1)18ZKopzZOuG&TJfG8h;bk^rW}c*V!7E_G%E z25E-+G)9Mm?EC>hit8?X9z0ivu1vu3X@I$3Y;kAdbY+V$46 zG=rs)OO>??25Vhww1c!99Lvw;Wn^j|lk-R{(AILuhK7Z0MsVBg+Y=EfKi9*Wu8V-qRT5NLA>LYZCPMo29G2$R0MAR6e%zn#?bY@j8u5elbyF79QSc zVHDx4^C#Q^JNnMVWWjfelC_0{d3|EOV(p+OuQ?WSWC48H&9?WgiWjUpa|fbAf=^Ch zcstU`ITeJuy==3fxbnCMNd<&~{h&sJ$IFp%7jv9IRQ|!rZBRiQT$RA6ozmUtu&q&I z&bJQDA#S_IK6?)!d{&@%7Nt9l2Rq9XH6Y z5{NxDZLjIeZHwOr=9mufu}@6*FO{$@){IDr+kU0IU)0DYF8`0W|H}mw|LW$fVqPV=nZCr-kC|FBTRz)YvTlEUO6dEk$*`A+rmBAO@ZFSvIQcaafwPb^ zV@E?Mj0~rzR8?##crkqqAPi*AiD2_T?5gqFdLvs0F)tEu%*+bH6>tn%zJoOa6l|>a zmzxV}td}Q56PcBMUbB_q;A9H`fEn~n8JanYsaNMFnaRe#+|N%!^XJ8%3R=$yj|JF1 zr<~QH@Y?Z8ez$7fur@Z~*m)PmpM{LyW5Fnrz!@hez`?!X|9qtogfQ5&CM?qTFf1=( z#)&3f0!seFMnMIcDF%^u4@=jJy@sL$PJIlVRy%3g*>pzJd6}&iYMft9H5*#+jH43X zdSmWzb8`oZe47DvpMX%!%uVXDA&&uavtKQCl`m`6U!qB-=aV$`h{ z^CIbouNPk9Or;^lHP}V(9oGh9CX=!0p3Y{AHof5sB?`PNNlB}Cx1z(F7x)z02<7x8 zJEd;e*qDNYZqKgUK?Q+WhMW7B_lxrPTi=x;)MZk8;AP|q@sRSsbT|WY(TNWG@ zcjEO&1p=HvN|XnT zJZ?`5r1Y6Aoh0Lvs9W$EG1Hg6%5}4t=wxGSv`^ZW)z3m<*r%)o%Ktat(XO+OwR@A+ zYd&?IQcGr(D)vsqHt_wElV^DInIow-zrap!yhI9nZML~>+GxUvm}Bv10tZ$;#21O- z=>k)6VKN&qN-vZJfg<)@ByszVAWaXL3#m8BoRfNpJ-!~iB{v0`W7Ph|TPod->iCeH zEBr2}wLmtNA^1kn`!3p+G`}3KHfE)nMkBESWn0@xgEB7Xc^L!%6>ieA2F;8a}q5TbZF3A%Z z!9%^*VpGdN+dXz;nhEH%#1NfS;upR~F<@a~vk3F+6=d?!P>yPU zqJH?Aa+wxXV%JmB)m5Fb~*a1)u>j z){l<^791w3`SIn@Jt_(-mhO{8k)Y`(?^xM8^CXd`{7XAY#ft91u9+i5Wg ziB5_Xiu2q6U_mLM9KoQk=+-74MQU&(E=r!nX#0*v8 z(ppG;X{k;qJHU2G+W+4s!*O^Az;$Dcs2i>_=n`X$s#c4n;5MhTavlrkCZLxan-C7k zaQdb8ucKZ|J@zU9KH8>}vwJ4D`}mzV&6M`9W07OliH#x&LAQxzcN*%2g_l$*V%<`9 zsBS-FEkwBjMG~hZ&7HN4nwd@yM5`Mdy-re#pRY_Rv+ha5pJ=7OT9W#2cc|0LFwf-D zdFJ?bmrH`KTf-nN638dn0zm9)Dd>LCz{u)0oO0nO?j*wFj(L$WXByF2M_fvNSPken zRgpKO=6r;)x8&|x6`wbnESHiQB7O@{fBw6Gt#{RBahJ> zl*=HYJQuGpzNMxX6hTLmwr~?!NIIew+FhV`wNu?vQXp0MvYSu3emxKkq={%X&Ujuu z4f~QI9`XE(sKfc)%I0=CJs*Wk5N&~2y&=Z{cz_`|qL!OUM?5%9zt+4g8F#E$RoZN_ zDIN%E`r^2MP(CK$bHCg(Q(8CVA9$$&aLD8CMW^3!9?i4sv0*@5U74m|D}GtS7=gN_ z3*jHWP-V_JF^D~YeI)e~MJN|?nO^-_I&ziCDv}dQV>PaFb8R6Y`&VMU^wd}E^;8rE zw+7lhv4LpAqAG_=0Wu-Xi$W7(LXzy=1H)m!fYk<^X^9+(?n#nx=CwN>O@VJ*!$U*I z=Fj;zj-v_e)h3&0S&Q3vINSaPGQTTwXS_K$?_fN)B){YdJs}WtFysHIkPKbeOVI4( z(!+T0K%-=sZ7;X0%AvgYUGoToHYy~eV?m?V@T2yTZxIN|Ou z_cHVJbSTpo5Sbi-eiI3LGRPVc7-Sk=121IphQ@_FQQprT1>p3g+1&idyo9!rZN(x_-ut<(eedU8 z?|-vcuog3Op2v9{-}w9zS3~OR7K!HgVtOsQ-J%NRBcf6FNOy~}zdX2HXWmNZw9Ie} zV$JI+W|EW7QdQt-?ly7f1F;Uu<=yS=&&FbL!kG`9H3wB@!!W@YFMU2Db6A9z`6M63 z-u|Zs1O&+Eyc2bGo%icZSj9iu%T1nAOlUWH5)*yAZQ2*7HniNp%)N~sE(zRe9P z?G~YTYv+gx*@JZ(l>{2w)eiw45T<-#!#%+4$EVEwiVw;+LuBt0Xbn$bjXQrWxe)USSjQV_` zP*gY-ZxuzS#v)}<+anW@G2EsY^P0|gjpBJ5M_V3pJ3(u> zf9y_M>5Q%#?sEy0h+nXRe2hi*MGss*CSZM|erL58M;Oi`fdF$tRDPL0B z$h802MiDvDX}9^W6#uSNI5*IBM_Tf{1xZOeRCBRgXlj?&z>6LZ_wDp6yE{ccE31vg z?oZ|SXMDO3OVBC0Quw2b9b1?k7GFUjY*b2mU!TH{rt;(C*io5x-C+>eqI0YMj{#6m zPi)M@;Vp1Zj!Dd^&|81CKi3w~pdy#;H3KPHAU(WVXa3I}uHeCN}jAKa4Tn?8`=-2X|f4#m6UQ~^0hojd_YucuIE{u?klOXCrilyWprQ;is4}p{o_L8S$&EEFh08;0(0JIf6C?ATzEm6`mtn5SNVbb25!~0NT&8w0!NfduBp88;S}&%##3)LY-oPyT@rh1vrrjGW^{K;>XAj^ zOpDL!k}=YQ99G-v!X(Up@6bByAz*>*aI3Lb8$|!6Hx&OJ=7>Cp=V&ri>UQgGLx$1b zAI%199tA|8cR8wDaUH7)X8p?E?JS)kF6D;Dpa1(}7t=@ex0(TD>9Nh*eK4m1goZZB zeGw=&9ylIRa9H-{BhzgoysQZg#^>%7zoKz_AFH~HO7(&4-D5a$Q<$8<7lF;*FyhUk z7fb9p`@z8E3w3JD?tY&K&s?h|k%f{NtaffHZYi&`O;Wsdf+L6@9o){ahN~2vu(m&M zL{o+@IXRcGnr&!R7lR&w_)Omt|9;}>#Mo0( z)w$5s(5t+4jgAI;$A?Jt?j}{&ZIcMv^mf$U`Q%vd07Zb z|9zE4+qR}CXB)_R4jbKd#eQV2n`=0o`x*Z_s57CIbN!CB|9}X}N8}UFU;5hujn|s` z{L;OQett`fJ~Hfcc>h3lB1V(Ht@lQ|=!co_3Y(Nk|~06nhzK+f*QrIu4vd;(*T8kZZ~M%gk1j2y6J2U5MpsrSicWunj~YefIq< z0NG7;>kUa7?(hF4yE_sO45=|QE*|2RzYIZJdHM<;zwkrZZPKr4PC=0Ydd*e^(S+Cd zd~Wqe3BU+kLu3+E6M#unS5nsMGmx}Yd&EjXa_27>v8RFR6^9w&N!DCr5pRerKm-bK z3y}bt2#j7B(@dl3O=Nwni@2WrmwWzHM(kd+mf(t^5M{L>!Fd%f*umVA3gr^FiixMv zRbrWB2LJQ=+tEs|Y(1eDlPLzT4q81?4D-dL>rAoA+9K?8V$m)`3?u4_QNkshJyd?{ zRIQ?phHyiRA{O!Zd5rmQ3Wjg*K2u(c7wd(g-Y}-(8Hn0t3p7K6L8Mvfgu$VDpv;Hi zg{t24iEQzL@|DGx$#GtT*I#EW#R*_2$LTb>9u0DOdMi+MZ`}Qc8hV( zYnEqrdAeY(ZndD%=Oge`Z`OXhxae_iryi*N7nnh+3^T)n<`)-Fpq-__u)`cLTe|lR`m&QMwiAo-eJC=~ZL~>3>`$2z%`Bx=NOO z18}i3y;SO0!Q}4~BMa4uPw>C|XPC=3NXkd3WhJo#B%0G;Q^K*XQ4`9cc_KV6#Sn}` z2Ma>B?kAR&iMQ6K&Gsqx0zY)U`pt5dP0@9F7Khi3B;v;fC-?YFH2G;Li$O{!)7c9z zI6zEFLhVOd@RR&t&8(P@9{03wsV1ukslV_P^#t8jQoueeZj<0-HoRKNtGrAb3UVyR z63Vnu%l!NWkBU*Lc?Y|f7BuR7peX2*ZZ0!-%&ed9#!mUgJXJ~;_bYvt<^5ff%TdzV zxlPu@TQ7R`?E@1fJ?Tu5c=z3;PP6xB3LBHu)gN9AoG!8jj&=ByGuQD41|myT;|hR& z46fMIz-Z&%-}9EYeR$yoGs=|d8oAOc*HIn)*rr7Z$!3t$@pUdOEC|6%#am-|;BOt( ziY|6z;bW~8%<^yERFn|>{_7^Lu_bSiX0Z9v)hB|=W48gmiqsxipzz&N+0idkvD~pd zQ+n(>PdY>|0lwcEg(xRLIU`vnewF4-Gr0tMLQZOR8!l0)do*!2X+$eC{gy)gij>oo zDwjkc%{;(LS}TzA>%wda&lZf!KI|kMRZAopcvQ&r+`Olwu958hhm3j4mU<3|fXbgt z%Da2nS^Qq>P#)RkiFIcwVNp!VC%cWUdY-jFTTLIH^_lQcyq){Kkg=b~LqOgvn61Ct z3@b%D;pvuIvb-^P3>}-^rd1gVCiOC}9M$tfFjr#Gt&mcHLEWZTYAcc3_J51b34??HTD`2ToTmy0mvxHV-_OYt&i)}l~PkyU1V=47GEzhjdJoiU4zJ9 z-19)X4*MS^GSX0`)7eEMf3zwO4We4V^bY~h=80xv)sN_jDJh1tlx|DRsH>(g08!(t zeuoMFY0aR!MUva?cT3735L+Tsqg5?)J+JA36{fwrJFKm@Z)e(OJgEYE$D?_5S=EI~cU+=~&qv~U(xC5Xy2-Er_-l)wd42H3${ytBCz6t85i2lf5g*quBZ0Og zZxdHHEn!xFL`0k~Y1~$WFUZ`{s6GK=jV8BqX|pVl&7)5f>!VexrR8w3Qq0@nM$q$LF}R*jbuMFo#vvs@{uuq85Y(*8}?fX(sil z&A>#`fm67_&G`Bza|T$nMSgsFx>~o!E&DBXT`aQ9t#k3qt2n!^jt8otlCvIyy5W2Y zR{3&RrA|8SogbS_<-z6^NG^&S{=?9Ov{Y61kSF3hWa}~oIVest94ZPRxU9I^=Vb2? zu~*>J-DT4j{OfxDof?g>eFdHH?z*DLc{HepLysuj{0WW1GWQt0ULJaPdXyz>gzyax zc5#dhcatFw-Wuh$Z-Wk>w|-_Ty(ePwnr+J{ON)IfiusBG>7zm&f9$gzi7yxWIO@%I zmm-~CZ|h;t6D3OFI?RrnE$hk^-U+kco$eQ&f2v=uo3}{c-N4mnRMZTE`a0g{(oIJB2hOPAuNxeRQqs~7P^~?3eXA9n z-BFKi_#zf(^Fc}NFQMHz%lZKwRL@_`>&Xt0Ie(XE+nk z1iX_a@O@8Cn;6_YM@nqaR3wqYsG5bRh`%k6WfT{@;#m@@3VZrbLTse748QdlyUR<5m63ISG^tA$z1z|ey7)B*SYiaxx5+tFuvPfMwrF70V6;ExJ z!$IO=lieI&<#5^m3qhagh*7_f%7y2ogJ3Dj+m~ioIH43zg}i~L_Sw^C%84R2M?Z&g zTr!lNF6vW+-*+QaALK?|tu#8-KEF~!Ilan6fleu?J{2pd3(wbPqYC%v0>8(+KW)!> znp0X4j_s+rW2$RGn6^$$h4ONIKoAqcK(FxS$_0LQbea2vg4u_^jtE0w4r8Y zYSWLC->_d0p91L}2gg{*LmX5^*J@GkTi?e6qu5<_7Sgga0tT|qrF0vQ){X0dmitRoV{F+;r*c%n-WReY+EB z%v*UGzslFNIJpSsaP%8?y*0S$D~6g%wHW^i$&Mm};wLD}#^&n|;(nq>3W~;@J=;;n zrbOjn%qK{ZwHra)+8Bt5R@_P*Al)_^VM}U_znz*C+4iu}Q8ae)v9DA5He($M#{R6G%f^eu#e+}T z7{EcXZ6i>#7h)sg@A9U8SYjgR~g=z@2fnv2a%J8v@ zK<0+o?@Hem$W=Kk6w!PLCx%5hhKL2a_Fvigcgx}K*n84(7ci85Y8}po984E%T(}(q#yfWQG#^fV@ z0|50A7uW5oo^{}CH1TxpVpOVgvY50kTi!H65NoPVwM&BaNPl-$w{V@~T0wr4+`G)g z^YPJJ_zA=AZ7yo^cbDWJ*S_iwcFPl%{_h=<$l8uK8%IudVIafxDQ>aZMWY4W?I5@z z{h^$cx1h|`^Lp=jiM%R>r@Ql9wY_$Z!5}Qe@7JXy^Jc}Z(QRo9RdhzYH56PIzv}V1 zC=kU`>MwOqAijm->x%?mAnE~6U}lm}Q{M9(j%QNt;D1=9iz1=jV3Tp|3;$55DeB=I z6r%7sM|>%K4jFn#J4gLCAUJqvN_H#~Aaf;(owON2W*;x81tMol%JR>hSb^}%?J%S( zIAYMQgw6(^!c1Sy#wG+=bkSJc_^ujzA4|p^s6BoPXn8lOc?--b(DL)bHk{PZJUG#6 z0o_{t(_s0FJNvKv0}(PojU4#XQ)k{obVum3OK3@_yDZ?`oB0wLDXuUswbjN)-}QN>G_To#54M0)1IcLA%*LfHGTFl{=+)E#Qzp<`jh0b!!)fHYH6B! z!L%ABVbeysh-^w{`uBU^C0VdfhmQ9RWTKXTn9R?g(sg z2T6z-$IaS?$NxFrcJ+=hn{9B$x3F2vPK$tLlUPSX?q)Ai&$n*eUC+!H2#7Ro9y zmgy9+ZcizxZ(&w|!_Ohq&eP*&-OX|={I{#+pC@5CO+=+ci_f7)e@i4~AYe-DlQ2C0 zAhY7;$8M^b9#r5k4{S5ph#!=f%V{nx(r1LK++Gd<{+~Vz ze!JJB;{iva>1|rln{=Q`^0|Gk?rhinlm6+5Q_nr{-z{U7ubRx>j>_0u|E~=SAw_!# zoUpSu^>1PCwb@r8AsBHTo7^Gkk9J&+9~Gs33>9&1k*?8NEpo&@WXC+UI+%)HdN+{J zBsKtu4O@Wv@hhkHyMmI|$7FUZCagns^|ahQ=WPQ~(Lf;OrBrJQhXVi%U7**elgtsN zdw1r&edN3v5B1s=9dX)bz&zJ=bqvod{hzL>SX1!e$-1!N{v^&BFf!(|o}N#4T}b@$ zvX**_Tgz{a8nHjBM?JyfQLULGGz$E1Jhn667ePuX!^ZZw&tmeYcNrBBz|QQjM^@)q zj_|ym5|iLnhC29e>+7uY^NE9mSr=5s7(eGRHZ;N=T%6=9!d2&gB=G)vvjG%`*N}ss zA8-GL0`hgE8gJAN6^s-}O!!e`>IPXfV4HN}KtgRQ!>&=1FmBWnb6V z_0JAjSe~*iV2MT~UHE?TofLX{+Un_EDA77O+bVW+W$w8^prZN5p60(kQIwq6b3}!; zwze`G4@;<5e5(Q2Oj^JWnu1a(l0n7J=rkIqaYg)(v$&sYpO3+8F}ry-(U(53?93lo zP#}Q=Ie$yNTLhoe5 z5@xy!nLqi7Li?59$^{B$d=dE`_B=ji8F7HNz@tpntQ{A);vL1FfXQ9j);-1lzLxwy zW2GmE2&ktnhT6licgusn=E?ODUQO{H=82OEScf_s+R7N#9+Z5J|00%9XFg@12q19& zkb?$+KIhh5;EPvSB=p4GIsM7@U^aIR$F(NsgRhrXtGu(n#qV80?)Zpug8SeqB^pUi zGOTW1lid|S{{m3+)Nu)3W!;WOqZ6`A`grFi06ALvF5M7jh$`hadjc9_ zBwzd9N6OAXKCZb_CiGw%*4T#>b%6=FzcYUzswACS#2qWW>%J@~c;C?-R9VSPIc<<7 z1Up1Hh6@U?zOog6g4H_g0S$ju_n&swpW0CuwcPorQrA@?$$#W_S;-K$0fv>+(K9Z9 zXOxqhJ{fYM^6eduW;h8CeZFiupxINs$Qo@ixJYi+_`-h%x9_Smq-L72`C1_!gCwMe!UJHS&)$APkajQ!cgB z`r9Y|*W24P@()a?e@ZC-?`z*Bxew}P6lJhvGJ6S|-$STYy^Fk`pPzK&H3sog^6t{E z>E4IGf4hGPeNPMg2{ex-Q2s6S-A*j~1U8>K6VSe#aL3PqzY@_xSI7n*Z-VuX#6Kpa_nSjsK~n1f+;9yDD;>dVaB%R#m%Wt@UNA}ik5a>5-sa!l-GBVN9Vn%#6fn@x!~r0L?*O#G;b0Q@ z01?q&{g##C`Op`h|M`n`X|?r&kiueJ>~+1`rxh7I~A;UYP;DjXaGU^ z9aCm(NthWRVEotiz<>Q=27zx<=Ee-cvKhl?DJdmA+1S9(Dg%AzZ~9ADZga~E`iZD0 zww#Z+$VffTa*6n&sB+)sRyy1e+-y|^0s`(+!XE~GQ(N~DJ44~Ax5%9jjp&-&M_0Q8 z@<;Jv|Ie@O-=Fm{DiODb^ogw@>igxU$H=WMt&)lx$c$Fi(elktw%V0KS_~py3bXzE zbQO3I?^a})*+t$xdPJ4=)r#|U^_qi&_98FwzCY{-pGBq)EHDhz8Byo((cXfUGZDJ zPW_HGX?2yXkwLTJi$*tFeDHCT_;E7#Cz5)b=oEhYFHTTCQ-zi6d)yasl7ajJ4v&Ub zEb?hC4vkwoI|CXxhd+PPGN9gi{X1{=@3;EDUtA*d!wp;S4r&?{+uumcHcV&CEOHm%6~hoLLLbikBWvFd2Us+8oVU%+rq&u<@@e9>NNb7%?xkIqc~(Uy z{M21FXsmy1hvCwLyfb86r_sTjp%2!@ z_*v9zc$m`>o)S9CeiZ#mI{D;84xhI?;&8#aKLoD!e`7R%U2FdS+61}LX+Hr+bm7^5ho0iFMf} zUL$rB(X2iCC6ip2Z2yLc$RU`-Xr_yRyT0ui6Yl3R676E^fiI2t%TSlCYLVWQP*+#iexoD_#@TiKs^?`Q?E+UV_UQkQx}~j1hDE$o=KVO^`ii;z zo^38>#2f&biKM{k_$ZtM+n+Ld2gLQWvMEYtcJPmgatF&M`v+baqKlzfT1T zErP)oeP*{uA)<6nX3p(y8?6HesjI+R?7SXVcJ!y)k)1ck5+>z3?aDi9jwPE}6!BYs zU)uC?&}bP4I=}uf75!)gPx`^CE=;oRP&-U>V4&&u$yG35vUN0(C^LUMh^Z_4Aj|2B z`-_X=n4gDs%w|P*WYi5A(V4%2r*0J9IsxmY&fT`wV$fBv=2~|-Ro{_8LUK-N-j_Y< zHP4D+v#3MS{4W~}pcE%z9dGKy=aFNc>Q+2!4_@UnydCBHcIT2LHs;J|CEr9cJ42u3 zl|Eak+iV$|GQr%+C@{lyEbnU`AQrudLX;FX^PpK_p88R{RYQ&d@0pC@^|&vy;~=u; z(7Qzr=GVYV*K#(~X~bS}JlA$tfoy8~_EP*c6YCqifC_Pv6slD2+B(>}={keA_lV(# z2Y40B7K{Tt_p(3Mu@DWXEpc{2}Y`q%4 z@@F3Rw<~Q*X`X|&7PpcOx5`pwX?9>4OJC;OapNf-t1u87>^^l?Zz2dg4iY+;&Ey(#P3r7BF!a%yYE6%LwHPE|TXu0YHD&%a z?ckj6KK=1t(?0C+tj+6vM@L7k9aGeHZu;GzR(>1&=Cd)Mn$N;1wppzc=T((4uVty^ zZwIGVOP)Q%>Zu!Dy3*(%5@_&kKA7@4rPw;2nc1jxwxv#CjRQzR_JaAOfS{eV#g79F zXbJcc>b)?#z@V0{2~N2GRc$@fxqmY-JQxiUNMq;lr4(+W&cO92v%U3$~GF*q%C z3@<7^>Un1bpcXhqA&LzvJe8%rPP3p=u%F-8)0qLT(U)JdILgiyV1;szrt~KbIh4lCb!GOZd!_>qNQyH<82&m z2E&fWJMJL<_4AqJpsU!XgXQE07jBgpD*jh^Yx&;dTy4j^M?a7L%f7808xeD#ObSQ< zTLs983{W;=mxcLo6{KT9q8e9avfraDq zEf><#s+Ms$=2qAMU><3ojauR+BiLftt3vhf;$e6IvI!)RXw&Ok{-)TEQ3P&8JKNvc zLn|F15I`@Imt}p?rjtwyhVQgB;4IlSKe}wwQ8GHKkiYCC6zOPdy=%PdyV8v;Fjq(V z7>tSjFxS>*jSS2fjaCk^FcbM2if#wJDf1p-74Ia97=K7{*(sj&|G?| zS*d1h$?;`c7N!1x4k;BH=NRNW*QVpXG+i3;{d?Slr#pc$XIk6c5!=m!^P_Gh?Yu=sMv4~qXpKFvb9X{-daTwShGl!%1^4vF1%RgJQM^n$ASvmU4BAb~W?<}K+gq(^_&CG8 zb$dz5$oqKUd)or{IY)eXjyiEw9~9G?Zr-iMH8o@@#Ng;=EqE>&=Orf2Bqz_&!+=-&%0aWwj`QGcKHhL&7G2-@%4kKxek*sjL_tr@_bZ|SHo9K|23S4av_7)<9Q`CDzuOY;$*rX02NwRZF zXtTEGd1<^Kaz9fifQ+Z>#aR!4rt=Z~4h*Otx!Lz5-8ZwR1ar99g60q=IQ76g%R5?5 z&?B2<_ZCkZT`L~=Dj4&SUi7|*IvuwsINUQ7#p3)4j^h}@;yD`?Pwky*v&irnH_uQe zSut;4ObCY5*y_M@M$1Q&zIcw(5MO5E%rSuc9=?9q+<86iigNxunbLS~4wse(btPPT z)IYVQhVcncS{2gwEf~u$-gFd`zBQd6TM6SFa2|JPgSY`$9FA!2{YmX9X%(@%e2ZU9 z<934km~(OzDK_KNHZKz>5_pq-vBq`td9TnF&7!q`b4XU1Qgh$R~AES-1ouw)s-56A|npVf5BtgW!=T7axOw(F0MGR<^cPq3P($^5}4 zm}P@GtHg>G7WwIZOV-=HQ>2ZOU>RTA8e{O0K|J*ctI(~FZcZ}y4s{=Zne=1JwvhqU zKRU8$%IM1o(DE+UE~eEBrZ-l14|C40S@As8HgpUvXK~-Zc<+I(xSK8-w1kJS9xq#Y zh8w;Ht5@v~#bZ-FCqg=IK6;kk=W$`CvvnIbr)}1)e;B|z_vp6HM%hd8inx=4B7wXb zq(b#x|7DZIyrAn=S;UI~1KuvdS%m4zAg=7>+Y1O4X+e2X(HDer+tI6RS!%qf2b!?B z<2)grm-qbV-eoRXg(Fg=kL27$SnZe)MTMe4fOo>@K9bf1Ov>n2SuwL$sC)fz9ZUSP6!CBNwQ#=fDEyHuFV47IBnY3 z+I`Rc$?dxgA_RbFvq*;leW1nOE!?6{D)`RSLge%jTE#FBolDCnbbr|JVz}9dvID)b zY=qU@iFU7R$HVI{bo))#?c90yn%o$YC*<`QFxp@bR0=w_P`_g3?JsETx zG@hv*m^jfLyAy=J$AsX1)PlU5_DA?FKKEq@r|^b6!vG_^!7@QT_;Kyp?;}pr)!_?B zi2prSAt?VjrvjP#vlM;3OMdY}P~9KID0Rf$DF?x6y56Pe^uswr3pup;_WRxDgg}zx z`W@~eyxk6Y^ocFJom2n%qgc`7&Io~fFV>gz%;V3%pcgdKmjyq|O~$+m%i5mkUypYN zvzadn|1OJ_)6N#MpFTGz1~`Dj_N>ibQU?JabVr-0LQR5EKZ+FNDtr}6*+rs4)P8nE z!R>crFrn(V+FXy}MMo{QaVCI#cdXb==oc<|`%@8A)UW>G``iQKx5kW2JD=AFM()3fr5#B7$@|@c*+2$y;M7^!W-;Z0V+?J zNrSuz@|AGT%l!0=HUod{wtBor1A0is2Ixn(UfWf*qDQOPq^<7L&DR5`0aNh+_d3O( zp5c#7C6d(c>mU49tW8zX)mY_rGz{AH#GCMjckxkb`l*Pa^t&+B3XsYj zl(>OzJ)BmvYJzAMo?+WB9w0VD6B|0^sV`1s{TO%@-1l$1npQnB*;k5GUdXiYYd%6I z@Nmo|(ZnQXs9Ym1+X2=JLD^WObc^FiK*;MWl^m20A_l@2T6tJi^KD)&-24baY7Rfz zF-v5(cZ@Ou@D6Gp?%mu(+$@&>Qs;uvbVw!%V7*2DAOhErscDceAMWk8(Gzt1d~abP z(Gr1rWVPhHp!`&)&T>UxL>ski_QaWw2tBfu#E&olJ_|YVA~UZ7PIA^Xp1vXY<;26qkZ@v4(;#ypPLi67{-_E!9ciDn{&GS7`%{EN|V> z#SE9vugkSp{hcj4e6jg#p`^{YbUMbZiaddC!%Uhlh;D^hgXL@#;|)r)oII#yPOU}V z4pFFIi7)|(>Zq+iEC>_*L4YrNadCNQ#Tt~tf)GaHM_$u#eluo78D#3}Pm+hsKDz3y z{x23lZ7_FPxsCqs;2&F~4XcI1Je1R<+z#EWxZm9gFgV`p`|P>gg$2Kdv4+_O-aQZH-6-*{*2g+ny!tfcy8 zbLvwOWRG@E0mIQHy;1Q#w+GB<#MCzZ*XtGg<%r?WyC&qtEtQOUGee)3Q<(df5eL1J z%*4E3Z$wU2oM+04>-#Xy8^KDQ(%MkxH=Ib8{4<53RF~|F>t^^NFGFI=8Gklng+e-x zeb~=Cil?TGdo8%@&jS+?#WMv{&UTc1VrYV7Iye)V_UkFlGKbG4!h=2kT(#|iB2PeE z)G`l}gYk5<*$jjm=hL-&NCQBXWFKj8RHp{h^O&f2kPW`(vR&l(Z6Vh`RE@MZGmnJa z{N;v?xk%*e+&~t3POjm^I<;`TOn#ZvQ|#PE{tU=sZi`Z(R-s%MTK=PuW4r&qH@@^P zh#{9^7w;(``j}Z{TMKYl$nRjewojDZ@>BS;MMjF}jWRuY^U`5DY1vV;U;HtjEww#n zTw_D9zK62jgiwLACn{{8l?P1*SlfG>_~Bs)yE)`vhd9=HPnYyvwF}N>smCBDTbTdi z%i3U~3VHbAKlRQ$baOXT{9%3Buo6q}X$tah^6g7Nel$uB$L(yMIw2+uszea@lBm!8 zhWB#JBvkMFdreMsvL4=#)90dc??%BNB$A(92#D;a{gi7{?ok@X4JrQ8#X>9cu4@8m zf9c*6igA^c9n>^Mw$=HqCM9ob*?u^jfuoIxMnq4Im=3nazJzl9CJ%$NnomTU2i+b+ zsKxO$0>?0A&XO}hc-1+}vg@`b^|TQ!;?n&(D!OnYnp)2BKFJEt5U#GLg_K1`ci_nT zb%)`0m$mZq^OT#)Pf&7BY`q7ys;h8M(mk9jCjM-)AW9a|IBq<3`&zR(wz*I&>n`4o z-ObTd_hHYiRWEvIR3_pT4ky`*XUF;PAk|3Jj>}a&X1FzSAgsPZ-nT`&qk1@7)E>9l z&6l&mR5(ZhaH=pusoPpQzBW^_2%;=D%GT)9$D4T%HR!lxRJ4L9{Ayoktt*3*fn@1F zEmWWZ>4LiUsej`gZH~qajaMMtlOW6|_{B&P`$vULl5mLWRrCX2*Bi)b) zmzAK{pOB(JZu*>^fS9gHqvD)gv9D_gloT9m1>PccVNG8H_!FL|kPpr!2p@sxDzwD^ zuk;)zI7JmE-D1r7Cd-(uo0pci)^t_rX^o_qkBpMIFy3s(Z@lpSBR8+C9amrgsqP7ZMLrT@K2k0{YWXr2>^Nw#t7!SWEoQvuRg$nWbHSS2;HO_xS0 zoVEKk6(I8%4&_huqHVI2pDS@9D$w!K9|vVQGrloMHCG_Fu|68>1etx09~- zbFvyz=+napTgwy! zl>3{eIsX204k})`?=!DxIuurx*e6J`FjJ1QpxJ$2_P}EYGtXOnUHkoyMm;Sb_ZYrJ zT)|F8kNxN5`nGwEqqsTS2QqD-){`~%?jIDz6f2741muZfz=Mch`@;8i8dkv9%*zOS z6pNFe_P^dBG2C5mt~Kk7o@TI;hTGR}FCW`1fH^&m(w(g6VW~_*}QzS{WH9tBlwO){Rd{lG3#_&P(d)% z%365P(YF06#iGWmQD7aXPi9VIxg5pYyDWaRO6A~d6FPW|+u72@Yn&Z$FWS60T#L|P zb%Z8Ca$~rgOD*nYO)rdEGus<&Ri>4R(d2ttnbFB;5nI!5?33RAupk*#OTC>fj^R)x zf5;MRoN_u|HCUZhJVG}v+x_IIWtYT|HhSb6cQ9ROwsUJd^Kjz)oo)EaL1q^tINEk6 zmanxym(o!-`;v#E=M?`*{%cNDHtXqjTKAsjr$0ydoNo3$%Sb+VFP$P zPO_$CKLt~DeQ2G}EtkFblN5#q|zxRdf@G=R_0ML19!I#~UmH=Jef=*#9-mT9vGBJ4f$-qR%ae!iI z`9s*<4>KGnUcCjdA54C%(X-^ShP3zYjX`-dfg=fQV~W(+M;q&84{5booD>>l8e z@Si^;*b1rT4JL2o*i-BlfVuJ0x#`)3UuZ2}_eXy6l;Kmb>=K4bheZo^iT#n&14z9s;@H| zT^RD}RA0Z44$hTqrUp$fV8r={bsa(H{jKp;uV zgSck#zngTV`0RV`worTXZ`Tu(z;{RHT!FSst7VkPM`QSlMIqJ&04iW=1Cy7k=ZlNf z36%+2*%)G0vUQ!_-q&z|aXfUJ9+GHz4^pib`?YhB>L~bXf$;UB2t?Qv!x;T6`+9d+ z^F0#$>I~IZg8ZTLvkk=g2f?>ZN7ZK*V#GA@gyiFCb7S^z66_t(ijKv|OsyB2XE@O~ zpSF;)dh&H&09@lF0vK14A4%v5@gM=j$7Zp4q?N6V)SLSg*{ZcCZeghVey?M8@40&CQArQU67A&`Wu)jEz>RaI>le+MVl5=@tw=+JJ*6R4G7Jioq0 z@NQaj-`gV1Pd*B~0m(08=92UC?9Pa^w6Z9h5pzC zxV3dw{47oE$dM8M@iN%>{c-ixH4j=4lRD7QvEw zkW_QPhp{tX@7YJs0$p$3Ec-3&E9UVV)xk4T200OFjrD1liC7rK)q4(ZTGX%d^f8C7 zveZi*y+gCpP5PRUi|UuX!p%~|f0@}KvF3qwtwUq$lZvuaBsRLj_`xkZ5|09|gAQdD7-BADKSHwE3AUb~Ai1{~Kk$OJsI|nW z@4JP!S_sft9BjR@JB<3;RsX%tk3Sc5@e_2|>X+aAxcjOv5DoVt)nOlU8w^T0r-OJ)K;|v=3sM)cVJaf zRn*i+kB!His=V;g@jXM2eBUWDh+gp5CWqf+{EtO;6r$X2A;H%qF5BCb_at5;%Guk6 zCc2Z%J-P`RmlCIK1}13KbC<{Z@I4DZ=ab(``9n!;Maj^a>ome2>$e;MLcgNiJn!7|L;%xh zMP>)#SB^&Ow;JB_W!lLsb!_`pV4wp#xTkc|>t0=6%ih}xMKhwo?Hqk`SgWf(N~|T+ z3*7C|rR6JO&7#?b@cK7X@Z;SccJIv-dt~qA*R$;y=dZpHU1Kas56M`rv~~@%c`zK$ zzGL{t4M-+7L}3Io9BeD#+cg%mQVfpk@X$6Mp&E(RDO-4l=QHuw&7C*1W+fN)D2|I@ z&qu}mEcJmbwu4zfiy7JdW#6VZH0z3tPZQblBpffHEV<6|-2MGSn(M|s?yzIWF2xS- z$K_%2V+=p-bdsc__2j!@D(k+d&YGgIG$Bvv z&>4%!jI$M;*e$|>8mfW=Tw zKymCfB9A#?)~d;^6CE2xbC?}sftr4*NB)NQ3s1~x$tm1L6lGux1bfW^IVz|zr%voz zl^L{;`H9V7)&pn!AUV`|J#;91?8Z%kGEc7nliTc!Rpy{x_e+64B8kU_K3Ue{eJ)Cm z-TH;MLUv!|4_5WSBWvwN!c3A0Rsrc$vlN17<~jJt*1VR%F^H3bwNog)jJzMket3nP zuAvCOK`gf^12L0BgkOVmK-F*PbTSKXL2hbEsl<=wu;hm**k+cx{_VF<(RQ8PDtb#|6(+Rs{?!4wQ_@YK}h#@g5&w<{1fMYb*y;RS~i$Ajr;+Oqm#PF-NmnO2#r(l2K>v*f4b za_LTlI}pc&V)(s%)F>`q3Jv_~$c$p~$jhY#)?2(S6Lujc<)p9!WjBx!Tyr&9>Y{ zDk4-dU3R6wJzjl+1FWZ)LHxhEx^#Z!y>Qkt?K0~NPi3?@^+~$m z>lUA$n^6rvOK#*#d61`h@&!c_&R8UR-u$|jD~aS=tXOv!7b3{}^rS4AIY>^xrb8h@ zuFd=LQ;g>mqf0Wkt}musPt@MgX+Lpt$q02wnb)c4T(~GPrtb631pKPn)I5hz&Lw@O zr42gbcnVNTjou#@YQd;)4Gr6oybY<#gAU-){A=l%g|r{0HEBHlnThp1c^-<-rX{+) z&JPlCfK|!fuk5n_KFq*~z8)AJo`ix5bqb5_Npc9u0v@-cz{wv!+Zz7P!jB!to$TeY zI%)UvBlTuKo9yr-<>VBqezAqTUyLrY%zrZ`Kqz0XwNObiG2KvBb{_0iKds=|So;boRU##LV1LUdHeO<{^K6yN=>rB7e8)5aN zf#yAo_RYC*o^PPYFRLfjv~!;}@^m@xpm;e)G*~An+Er8-<2olFU)2)pZi;_L8A2Z& z*rU|h4PFvTR6RC0bidPf*v6sU{x*^mxM%n4ng2~w@Y?jo0nv}!wA#&Wmrlxf+a*6A2eUmsXze||YE8Ip;;+@#BtabI-HrYVuEia+Fm<+mPiIH^UoLPm z-&c}PvUn8Ixl0s-*$Hw_!U|Kr!!(tv107Yd7Jgi~LjDb;5Lg>6ciw-gIe;jPvDrWYoe;Yf~(`XLX_agSZXZWmRu zsVKiQ!)bR!cf+lYXwJ=vU!0s^fZ9Fz4llTUZ2qms{Rn%4taTS)(f=$U-M;1<4fmT_ zvfeB)2mO~|`88g={uAP-ozCxfWHX#e2_ZL~Ozr9RK20*Z&?w)*c;ElS*joU_v2N?% zSdicrf@{zOLU4C?cL?t8t^q=DcXxMp5+G>M!8N!A9bk~JbI!SY@4NT8_5Z3;R5K}R zrhDFAz20a2*0Zz>4|5Bu^4oX22XRNZMW?rEQgMgeWgL*%4c=EP?k4q|Z)^I{2x#!E zgINb-oXeED9KgkphjVvR&R3^TdCezh_db`aI5Tkd@S-EMvl0=k5c0pooc}OlffQr` zOM6c!O%ET#aU8TG=doP`h$2CyPT>ub252IUtYgH`pAfWg+47g^W(#u41Req6-kweA zypCWq9_Ts`R}I@Sm*E(FdTNN1u4p7_U&i=mPbwM8!syQ95tI1*o;UT=aO7nm`Bu66 zBqMdw{ynPB!^`W=vNfES3PkF3CU*tQ9f*~ahJ{%Do&vNku$~pcJ{g!W5vpjDz z9ov?By%Cq+hi|ACaxh#8aN_lTNGcIPF7fAG0p)8Fu>BClq8E1=K zU*_|93Cp_F3R*Eeqr&$H*g93PcXxM3;G+my*bW`tz9d(^cilO%){}aj-)Lyj0Tghu zRrgE5pS6SJ8-i?u?_C?s3`t|4_`Oes_w3BL=;@h)_$Vo7tO@T0ao8s+vI@i>Hz_6L z%EA4SqZPpq92f-&bA8al9Eb4~JG>|p$fW~l6)GK}p4Zm~oVv|r8>mB}z{be(WPHAu ztM=JbUWhS#U!q5{>KV`z%+^o!csx)Izm+$o=Rb#+A)%8K+tz3|=+E0O*yukZUFSs? zD&XDu(!6+iSrJE-lU@mqjDZo>SL<{`p` zqPJ0nbhZA=3>t?iaM`ZA*@Fl12luCYD2LY1|BFBWcTkbW3arlJdCly1c(thg%qyZ? zu8t|1P0HmYt6rmLZ}km)I3e z3Gy8$psTmJv#MIu6thxSh?}8DVbbngVc+(w(#*@$3jNq)b?p_UuJAsno=Ip)+?KMu zvwfbuvP=MDl-#67vrT+=OvfY>Irasa9wokdwRVZ?w#I1Fws;sH<0KR@a(MdLR8@kk zx{%lOPfO}0;t3RQFfetSe%AP{r2YP6|E7`3l>JJhnzbEuIu=}bp+SqEO5m=eTx`_F zfC6=?alf{TK2$WieDM2dELgx2Gsw2>P`B3f$gKf6#LxfLA?Klmm9JX0oa{clobpzZeYXK3RCmim3aZ?nDCP z9XT)8Q)s}1%@+e3>*u$>;dk+fKC?4a)*y=tW-*t~z_~*`0wu}mGiIJB1@#M`7r4)uuKru1<*e4z zrHb1ZC_kEh$XHM1NXpGw{F>7i@JqqWixVf2hl9Ppeyd2|>*>L%yVPV!4)hi?9~^^^ zS8IfQ>9{K8aWI-%>=fMDt&??{Ea;Jt&O;p`%~e<0ULb!CiukU!({u+oDLIO6D{sXX!uQB>!2reBKN_9$_vq#M)Q{%Kg*6P=!2~5r$vFV9D zMmXtyx>qTYPYZvZAYS&m+4*Cs|H14FIslhFm}QIPukqnO$BGn)x$K-)yGcw2@;7G! zrLKE3FUo)+u{PyRy9q_MN3V+2JH2ZGa!5Q@uf?xnzEy#Pf{S8-98E$@%+qb?Jp5{{ z0~~%w78#c>}%PT{){3r&5&e{GUp{6oNa`l98>(((1-{PeXNpY7n_ z;E2O&i`zIsd{NVeZ3y4}$y`B$BN1oe!L@=#*L}#XhqIkz!)c`s>0v8xR{N_T$@n$% zK?-tm04_4US+egPzR9^K_{!>ePNf`wf{?>*&N`vE2+3$xDz9z!$F)w&S?m%)-)Uq0 z2sQ{O?x;J&uCRl&T9}*SNFkHc63uq1vyOE-@fwwI)|q{$iD-h8Y-B*lIA?;!#4KP& zY?ZsoWQ#)}mED%lOBZ0!c+%dYgs~C}5RnqFRWjf*B!cchW1K`Ds6l^b9e<=BFj%>Y zq!{QN|0H8#1;0~3_2Kl_Ss+~j-fLV*-qJIbDQNWU9Cn%p1QvQ8h}Tl|$~-T;yhAZ6 zr`!l}Q#RqC^7yH#mu%ch!Xy%J0Y*mlB)#+`>Xb3Ph_x97Jfvn1y#1BT- z53ydP^PO4+Fuuo2T_9bN+47oddD!mCHg16pghlv|&3pzBZqTO>Xk$5xm#+w3IpFkO z2MC3)HyfwuS7^FU&>mU7TIO-Jpfqo!g4x9s^)H{y5HoJCF8mkaG1^l~ll<<$g#a1?A1WUGkb&521n(e(5S z2eaYf;n*$+n#FEl!gRMDLrygG29!Da|L#2f-Si^3iKJNSUN<_<_fBhZvHd0zl)Uiz zf!zNU-c#x~KQ68k*>vt%hk`#CiQj+o?|*_)l!`@8VpTNyd4;G)`6TEgh+_|)-Q03i zQaSp1MMd-F0;KQ~F@9Ygqd-N_1W;lQS!1oUoynBDy+LT&>A6RDuU|o^{+2KXehKQ; z+PTZ;T-~5)Ge7f7W3i8u+TLC15WA$-ZmBMldV|PJntgV3wRig&TRWyIh}BM2A)Uh( zhjlKuLGCa4#Gjwj5nIsqMzLV~i}za_ff&J)bT*TXfVIKEe7mgl>XN47wVSLClh0o99Ka@c7R1wWXA|x^a{oqi~9?wN(pn%r=1p7EdM%I+Z92TO%~K{1fu`4VE?v6C(@v#FXZq2%HQhO z>wfsa@|*3R))-v~F+MoJ5Bk76SFWC1u0|i`Y@rD;Gcg${ez*KUl7K;4k`_Ujda~Sn zme|;M6`lf{es{^cSfQ0X6iLDe>@WR>2u|S><@8(Z3V^<%uOo6w z&rRIjDs62-8Fpoh#ekiE&}kU)eB~+`ZC=QjENdJpU<#}|zQJd+A7Io4lKya{n`La^ z!zM+q{+21_>P#;_%xi5>JZ~+KU*pq#!BDi+;?EDt)w)`jfm;hUuiTH9jHmlhr*T}_ ztP4|JKYvClE?x-|8#RGMuilRqbwl2F)BJ5I{`1#BVeHh0ZG{ilC0gQ~Rl05Yf>1Z+ zz^I}GpkG-Ec6>{v$_jVVj@BJ;a3UQE@ar=9`b#MLTCA%UC>qSf^tdI&j|?08`wrVY zS#7!314gc%H)TDL<;TqV8qFqk`HGJV)wT=@JPuxhJ?|^+mkRUDm)qXH)ofJdzq83F zdp~Q*xeht)Rx2+L7L}?64fWtnzt6rs6Zk}wc|WLgCNrKsw}al(##7i#*@Z2-4NxG` zO;&1!LXTUMcGs&v%gXUjKTuo`%OHfgwm+S&*AjgGHPLvD9L1s?QvVM#5=AtqiMo*7$0iV6<}a z@(oa{aAr&SFR9M|)cXFj!ZtFIDs`JC8qbGG{f+A%;jJ))!gBo1nTBa0Uqp>BT%QC<2LoxFlQl66+9i)o%uM+vNEvn0l#;_Fg;@7}DTlN<;^2 z&FS80vofc_05)%w!vw$lnYtO#1w4AFXlQW7-1lbTC-i2u`j#N1zJ{5|cCBuedZzkJ zREBIkJVPtk<7$&%LKFqu#t`2%b$vLl#Dg+WJ~gQMj`1_922yF4rTxKY|BbRxLxO>% zGaX_?ExSso`$j(k3qKh!vY=?{3W-1~hw9gjW&vrn@sKWk)s+bDmT%&zMzO5rP+a~{ zQrvN-3jKw-S5?eULZ9O7`Df{@N1G@UFh3+>U-4q{`O5OS%P8ZyieF(fQ)4R~jsTlG z{Aa1d)2|(5cIrr;czETTxo5-#$F*&EHstklQYi*!XG z#t^Pgo_JCs?tPpuZV?%h^MZOUvw#OEM8Pnr0yc(yO&|_|51J2cSufu%fE-84@hGYOz+3IF8W99M+VRzml`dH z!fyIVwu42W?@`PoVu({rqNc%b{PKyHsh5OY*c+Mlx@~n@ejRQZkHbJs^i`|n`gIYw zbO~_Ou9y^DexH0eSMlB9U6XB$YmT|Pda{YBDc;8*H<2!XkuH)2bW^0QCYKiCFk+3| z%OOwA0S`ypco)VzV(S|Z$lCW8kr4370hpv;Q{Doqv4+cjxe0^>5iS4{{Nd<|!fxeK zciptsR!w~V!k)B3NkZ&`o}aNJPur8-$wi|Y6=8D3kGaE;Z|>qWAv0v1iTyno)~=i} z@5*;{#}Q-W;y%%giOv1wYQdI`<=#UhLKT!8`GMZ#@>mNt$LG2i+f!X*GWLhyT;GpX zW(F7w`!606VR7+LYB|s&^&&+O4H8Si1_uC9^rLJX&YshCw>-$3{s-PH3%!F;k0idd zi^+bI4AV}JnR2M#XU?J=gt*2rGBC+td=_DwXS7Uw8A-g*UgFaxwiL40*}=#6r;^&y ze$+4v+yD!#w3C}zryqL)2w_H2-ddJp1`PwC)I_py0^;FVJ$+w}QFHfY}cNg-x`!5gdSV1ZvY=?7VH6nZuKH1I9@-eRo~ zpGvXkNTU`ByRB+wkK0OWtjgjtyvPaY^vvhmL;7**vcs!ZRmw_;1%ZpVT`ELCHjNx) z;QYyle=9vC>T{6;2RUz)T zz`VzuyLwH?;e9&becGw@bh$IpT{YixIe~HScon z%Le&^SF9**Paqlgo!ZpC0^c~@Kl(QY%EE_Vg}vzbeLuAdbZ5Sodi73gGmVM%5()us z#emcOeeLBB&|SeS7_bEWdCAl>HN81Be*25`gXxOTz}zki*@AEAT{z^T1-yR1MFPej zY__~)cU}*G&NLg;=kI3`IB5+lo+!0d@L4FBme~3+Jj{0IwdJyv;E;`)aY|+tpe3I^RZ~f!4O{x%YDWlO#_+~-;o{-t3OVp;=pNc4)oH+ zJC8U_Kf}}oQDWYFDcoEF9u0$7QbWX7=9({Vd54#2>T`eSyqCx90lzOM1EDYXu{b4j zi4bm^ z@`xW89+*+fdA@|$YB8$Y_MO++4|kjEQm#>EZq5Ua>STlUGnso|td+`?#kBHZ9)Nw( z*xl1^H&14V_dEO5=G9JnJTh;ni5J3raFU4E^JM81Gb}`87(1Q1kgwN$VkAXId?=Id z`lQd@fTihpcm+T{e%Rs{oi)$#7kj!XLFgo+X|`K7y!m#Gz|x2$0VP@(gU`0&MtsG# z;+KWGrMpQRcocpV{B|B0?_C1YA*Yjc!636j)=l4#fpioBUHNx5U}ryZ((}A$Al@2g zL0Y1;!in(9YNa&rqkO;cL5XX{D=bn{CKdm5Q;PZyw}a9kS1xmKv0f$AvXkj3fq4vL z*7A`rhfc7khUY2rG3*eE=AQh?n04;+%H(&lr=h_?$(Cwj(**9`e`VRmx63)txmsB9 zD0u#0drlB+5!3Ft!CR?x&peG7#=!&A%`MaHUQxJbZd6^viOVp`Q2?8;pBKp-GVdLk zvj*IT-W~2=#*ul8(t`0}FskxGZk?IB4KoooEMPGGoAj+$wjJPa=kz$dR|^~#0ym%f z>RJ(i`*m&wAr-I3r9knlHAvEw*?Hc_`Errq3IqCAASNN9H9wg(sM5|4vs$M|EVE1~ zd0+0OJpnlC#G-ov&)7IWvLK+x;KMh5C{kikYZvXpx8gm+RCy*s@$OnM=FiNFQ&=@U zI24wqSlh7CNXAmLcer#SyJ4bHuTj1tdFiG_Ze506xmF`NGD8oA7>^VVrA=dZM>9pc z))9*)~!P7{A{zIY>=>N53VgM5eTJr&+ zU{4h{srmy+LdwkBhLw+S=WtaZ)+IQUV>FEe4+)BX$c4Q)(#>-y_k8pT6sZ|HY{HP-zT9%gQ9;@N zn=V@S(kHJK%Dpso5HBr9gLPkV%EBD2Lk}6G$@c5xB-PCGo0{I)b*OEio6|YE3z`9D z_R;@TW2qG0F`LAjy2Kba#2Cr(*%ce_?i@wjmJeJ#j(sMrXAy~Q-gdBS7{z#FsMB&9 zYe$cx6D*1DSg$m2Z#D;X4e#`jKBtWRP`%SrqZQ8?E{6)l0=ca$DBUPhYRadv&xls( zD3KC6`qqGGPtZ=ZGkk%*!=A}*Dw*VJ6q!==7K6!Nm(A<*Gkogsm1^yx`bAcN@3@;; z&yKb4$)Ett2+o}tOATtGB?`sbul#?00kp>-WyaZL{HBMp&IXlwJyR@T;RA%Y&DI{W z*^*M&upaOI-z`Y4sE%1=KpR2pth2#}=q{6{(L_m@SvMkRqxM&dgx?uvfr0O~0QCrI zG*YU2;OV+z4Fa57_?3f^=g*j)bCY0;n#(@F-CKed$OC4hE}z&LWtW}p^;(b~w@ohZ z1!zc)m6r%%;|EOk=8E|+V&F0Ha3xgm zcu4L}=;Sx?XnXj@>61zNX_e#!i7DdKCHhW`Y9SDN#znp4dvWw`;f8`RQbVNAn~zkU z7NZ|V=LaziDanoc3Da=yMkJ;s@`pl6^svWIQe+F6pC2M$a*q%24&*OB`Zyr6Uwi~H zE}XCYSBDpeCq$xoN$v2)EbhkZ=~uZTKxJK)e-_bL6j`K^(W*kDrCDRiM>LkQ{5jkV zy}4QJh3Qq4q`I|-I5Or*fkHQys4W8aAs{c)+&U6UV?wYG$?v&7sfGuZT#Q=fzv=`w zw-v8Z%_llPO&iQ47udO3M-2jM8HzCH2%2UbiS34ue@QfyyF-D8_UoL>KlMPNKkD*~AhWjc?Rm>W<@P>0h!v#Nf( zddlwGHN@7i_xU7i4hdSG2_R6fn>s-4!16kkTcFKiav-Yq)1#Mj z$b(+dO~(!TO=kO2m#?25$>v4P9!M_6T!C+)S;BvtkFW>T@=+&hgx6vuXK*m2N)v8< z@O!`))d(MPa0;+E!!gVnI$q5fLSDqooEM#G?Wig)ejP?0PYNQfsqNvtFZ6VMZdu># z4X~YK%Lve^5w>+gybc`Px8qpxJ2_vz7~)YW$Wby_vs9;A13Ft$6wh#s>-_0l*#icI zGASvU>kS5MxR&~_j0t|78zhY+`BdU!-^F+x(gp_DprxkNW=EIW=OEl`9k|H%GKNcr zk*9K|e)8fw_G{90Ms>#S8xCJ{&*-^aFAW@ZX5%KEAj8^{m1Z;e_AwQL?P6d zp|`$6<+xO`kVX@rO+GsT>krD8J^0#>!n4o(=>!yU?(h+c&_I1L=KZO)f&UT36gn#~ z1W3{!J#VeJ>uk2Js>cx5s;g^05Do3x>+4ShTvDFwLr1vU6Eicj#c#Pa4Q7)Zd(p(! zRtEvaa)eS5X7!rgPIAyfd=|#-!CjLp@>DmP`;9k5C+!XfWWy=t>QZ=m|)?RR~&`WS4e&TM4eb++5Nw)_Wp5S{0or~$<@zV z+QkKmJ%&8Cd#8M!klE4Yp|*EeqdRIJKS`pa!m;&J76lhtM|g^U7qNi=CjCiYzw$y8 zQ0(H-Cl7x8$@N|nKHQBMFuS<>4#@s7{8=9l7bZ27=F<4rPtVS9n>uY-?VF1yqMZvn zLSIL^EFlr7oyCawcFAKL(kP@c0;z#%pxyiCw1&%kpQE-9v}AKF%WjtM>Bi=pYV;~X zH>WjJzAxJ#pBhJO`x-*TEML4V49^n5;>$pQoQLD$ulB~8^G81 zcqQh4#=HGVi1xPvyXzZ#f6aR|pjC_6bn3Og*$9n^ zBg}XBnFrN!H^*!D4W%wO2=7~cRBR}sm6%s!htD^wn)apemwu<;Ks(?3V>rrI>dP9)oUfNkhof?$VD9Z(k0FLn$q!6+!X-&OvtDxj=Ysvzu4J7Pbph1)Jt_`%_(CxZEC=Nz+07 z#a$c-VZU;EARMztQ>8+_GoueLzU=h&iDZ+M$Y$(lp_!6PoDu3un26W9X<85P>{aNI z9{R%XVHf_$DKU0lD#`J;U1PUP<#5|;M)pj@yvDnj+iCk}S>$h}ibP2mMEK6TP{#{E zm>y-B?4meXYM!QD6;(kd%s&OB@y>kB0WKs4?ny;xaN)ecS#Hx-28T6~Jhsz+fa-X# zzO$oZFmT&`wlJGiqeSk(Cw`IF;oUt4jUL`<~Q)Q z%~@EuQ|h2g^eD9FYD8x`-xE79)=tbVvxY4k9Hy%4bJM2rB5qJapMTo!!t2`||I_T{ z#dmXT)6wJ;WnjpUkhE`Pk@z)E!u|3Q)DU6h-jla|3QdlmP_b+l-HiDd^J0c0aU3&r zsHCC69t!zY5@>x&dp|2`8{R5!o6|(A_Du?=RF7&FR4pn6&BVcQTmiKe!355RDv|nv zA9IU+*8zbuDo_@6tK=>s!}4x1Llz9-u4m7z_%wrFPbKKE*76+C$^XRH#gF=84=&1qfmMsSLrl!f(!Gzrex8jDU9b04 z*_ONlG*Ibf_IFXRV?kmvzQrZz*ZhR;MSj)1m-%gz>J~2_mzu0b4%v?6ieY?;aayoN zC22_dvH*w+gS~^|zsIS+Qg<>?Fqf_%UGfC~TR?x&H&YjZ1Kfy9B46_lpT4@Ww#0p? zQQySRXZgCSQsNW^j7MdOO^V>|AhsMmd!Dlmk_3s#Bxeke(NmVYkChq{^krj|(lww4 zLF68?zBt*Se2^ginr)Azf!-Npds2EsQW!4&bKcbqLSQ^L{haM&#!O6{S#fh@}X zGCq(%&`7;LV?wuBM|p%d!a~68bc?Hx!hi(kcRtsWefjO&!J+m1zM}T^53(KvDTjCz5q zG|gC4#+u> zaOkyRl0Dk34;&C$WE{7io7{CzZt%2D3y5&WBi0AHL7ny#&Wb7N`QwMu{ch+13 zU$a9s!Y+}tWG)r#F7j`8pT)ViJS;45-2N+jLkgL(uH1VYwJ^adh(s#KU6zvr>%L|! z%Nm?AEAHt08r11-Q|!Awqp#$~ed=srqeh!u$vcxrCcg8jsM6FM9`TncGi#NrOEZ>J zFUljr#nMypQObaMDT}W0jHS{${c|qjh~&}7S!hC3P+MijosxboHTxF2-HrHxWhTGJ z*MQz8E-r)aS4&Dcco)oNdztfkYSfuxEi*2=_iFX&_3i&X~hVG`8|4` zHtaktPpJ$tB1~6v2Tx2*F6E(@2UFMdKIqAt6d|nCl(NsiGf?vbc^8T%T|DLQ+dMa} z`9Ejglo81y3+P2RWGSW`sg+W5xD$}!VkbP1IDKGH;n(GtQ9oVYb`s8Cp=6mPRF#c`c%h`E z(moq_s5E@|Id_*}I#kzSxfv1hxyEheO=2=n2MW@?XSBEd>5Xf5I_-t)Idh$pJ1B3u zR$02Yxksl*l-gcV0fabSHubJ!Bp?*f0N{w;|BIgxgn~gpD;epdESoO$+nDTzlEWFL zetM_-R&$Z|e`@YfNH}zXbA({YDytnh7)>cQ(IW~}FEQNVFC)36xi`*6!a-#z^{ZMeYpd`R=e>a<#f+}GM_+KRfN_HHiK>IEqJdz^ z1pi+@F!|P{$v@Yh!uK8x#~EW0;xX)~zP&D5&Ryf8NQ&cvmd9_EFDtW*SFVbfe9ZFQ z@EJ`4d94$?A(3LR>7i9~pkSLD%h@8bFMTX5F|RL0asMALfPL2}<)Oga*s#k}gdF@S zh=RAq^EcpxsTz)fNfh z1d6~G8E4Ak-kHmHwyWo4*V+`&Z|kkDxfkn6ow8Y`%TEh#sd98+AyaA@|}3@VX(SEj|ac;;sJJLeC~Cv(^x zOUt(iwf$@2gaaGcus$b^D{^EL|DU&eDG?y-yV-h9`P zkx3blh?e#e|Eb*a%Bht%@*k&~n~L~VG-gIBX7CxfRIOBrNf@!A+CTEME~cfYt=-gqKYsXB#u}(NS2mVf{waF zrG(EUj_VbZgi4z;%Fq8fn>IsGmBeU?uZ2a3?TZ<|LH8$>F8G~1;G$`fi)+xc-o+^L zb1Boe@cVe@Ku)ZGuMmKhp9r+&ar-`HJXB=8ccWZp`l>XiC1@EZyOjL4*cxDtG-qwEH-ZixW*dPj^lqR(cRSb~%l zb171`%ha7tg{xN6Ug&S%v;B4~)Obi?7#LXnGu6r{m8R7W(a3fAj?;ec^$&mi$Bf^Y z$HZLE@J^Gq6AwAL{voL1@(Ymw0x>_d_-xqs^8yfLL1LtZv6kiaZ}i|dfa*Ygr;BqIP>2Jin4Is8N6y_wIVCTo(CTn{Wo$uuP4Gj z&e64+i{pqTGf^L=oCqPXm~KRZ24RA#MTr^!)B^t{CLzOO@;V^zFP&Zv&NZRPBc zj(~LX5#MPB6u{iuFXU#gc!S^Z-`tv3{cbhwY4!e@BG&pds@dXnA>Lj88+-otkjka< zPAMp5CVnI_E;CalJ}wQQ3QYfuG5_iI_(!azWriD!#wV9auEIg=X#9aFn0va`q!O5g zjYYB7$YZ$W9`E>&7e4=k8ZtisYx4J6~iApYNARBPC;;kAQ9i)+s?X(YeX&4#C){ zP5*2!eGiiF$2Vi2a=^71?@A9kyV+WZjY}eSklklFQk8df zIcXSY;SOe*Eu+GqAxf>@jxIE{>?+MQ9vMrXq5foHBJL)wlAJwzhod+0>>G71>XeU3smBH@;8ZiWDqYXSJ7c>-6r zLsRZ~cT&-uqyAFYKj$FTC?6)0jz`8JMttPg(ObUZv)7StWCRQ-O>a3-Ol8wBiLfX5 zD0xCAFA*o5b@6<%hr}Sy$8U=cFt)di*xuwnPd-TM>D>HtzK6p(X7AaKKH#BOqa?bxKLE1gPshLRU=F|WQ#GKc8+})otj<3}1$2SHv`6Anl0JNNnids_Frm_TG7xq`(Zs#s%4PXO#&uf1ivmI@nvD0K=U}KYU;|kOw zFJ>Ya)BX5_Nc?{J4Scsdnk)Fy2>=82%9IdHThfREgnNO!w9=`bbT z`<4*%d#M^-2V--{7NU}(mDVK`z_`fEn|y2gxaVcvA)~6v2SKJzH2*#Dwq?8&7K^$g-F1{7@y5X>3n9Goq~4Z8E|Q@R98HE!ktg61ZTs*9O7Lg z?__%Cnj!<+tddB$oj(gL=U)San9Baljxss8y|$NEC3EDAJfP<;l9J1Z^jBSPz_KQO zXPfS}PBy|nJo!uY2@g~{JeBk*dTb4|X}-N6RcSelDzr`F_FJYqLe2(W81oUy zO3gc;qQhG65B3a3t@!rF#$+kofOb~}MpEChvNF3E?_ZlkvQ}4vQHP_6mJL5u{REXV z=HLBXax@N#$ZgK*@08DYYIxvu4GlvM8UM`zT{fHuU1b9JsJ6amv$>6{6==2|PQ+!! z)$}_3`omhBAL$;f_wILzsNN{>!ZSdpSZ1*9pk(S!*?Y^S37n27z4)p-Db)VnU0 z*PGS|MaAF1hljg-zMt`z*%n9rnayK=QMul38wTV_-ivk4Em~ph_HE}@lQ;cu0cvVu z1---lj4ezAR&+N6V5ZJl&4)fuV*tMQuR6|v&Wy(eIp7ulhK$r7kn{~^^C3L7Y7hwB<&$)5znT{I${GKtgMkA)$O99p02J><3 zzHcnBqPkVK-SuR@DayW|vbQ8|^E{rr$!eJHx?8)!E}_wKbw$?9C!A5YQP@6Kw5*U# zZz7Bw21Ve_IK8B@6ru8GA_b`(Rk4vIPW?BIvTx4s)e?VVxt~Z=lwcvy`3tJaZ1mDg z3Dtlu`D7<9FMVH3R6WOYPEMXgda(ZEsSkw|qOft|E}$Og_2qNEeF4RqRMfm)ol{ij z^X8toO?6eeXv)NiT;k>QPDPs=4vV%S=%ZN@s38x(91WTq}UbUud~@z*(XH1D&= zb(-;^ag|O+lZZJfU;2;H+G9?04LWOyo7{6G__6kL9*$6Idjkm02LR^5)>^MoK%aR~ zbtMVdhRdJeDRqX=KU7NJh-z6&5D<9aDXU&Y4@D!%b>1*n3GxIwqIWsXalERxwYl4x zRUJE(iz4cUC*9AdaYK*nPdf(AEKijCxTPo?rb?JZn#0UA{tG!nXF4Pl%f4mK+!7Af?%YXpgF#c%Z{mvUIj|5~3h@JW% zo2h(LGqCgb51XfFM!pJp{9_CTdBR-V*9}7cj*ME(BObvg%kGLahc6FS>Y`>V$1r)0$F4&>rPqbd?AlVH9*0w+V~B{=V$O@iplrsByyzd47J(Er?4E}lf@U|nHc%L zTG3|Dz+mV4mAvf$O~91m_BV$jTBP$Y4#kX+VvGEuU;F4fqvvCtnY%n2_blKzI}Vv$ zVeNAwYtY5yi#dj?RiX?XPMGYZ1*|+i1ldItU$`%0zC(g?Y?D8MKb14=0$SmIkyL46 z-d~;CMSo)X`kTJU6n8l3B`1PN*3b;P&1pt$oW|qzMYTPSJ$F%fgHO;)=q9^sy6&pA z-~ni@BE!_g$>aFkJW4Yr61mk+-ur42-J?3rxyum<%!*4c5;KT*0-C}{ z?&J(8y_h|5*w42La>1E+?awk#LYw~#@4Eo?2o%Y49PzG>Wq0(hQ0jHK#5x*Fc+QLX z40Uk;_BhVtC-7tbdkdRygO1@aHi5R#^K?5>G!zHwfPydM-GN*oD5S65^OG%evj_uA zop~O%c<-mlALULyGttN=yRSX#^56bs=vpL@?%`h@k8*QV-qiYYkNEFh%RhdGNR#pN z>;HD(ObA*NUlShw67~H{-Acz;$*RdsmBCr1U~aosIWmG zIQPi_edP@EV3XF7o}=dNdLV2VZpUh6pt%3GEl_mZo4Mt8%MO z97#s+wL85erErh*PG{qOw8+>Nrra{xrJDDu4dS_gXhLum?!k$nQuPV^FT+b-8ahiZ4GW!g)%yMAsW zyN~mIFpDofV)PnL+{J)7nfACv??KZjFtxJ@o?roKv0lJ3W2|%Od1DrKdAHqNF`}RA z294kyy2x&Xpc#utuhcMs^47pHdq;N7CrV(fov=eiHJe&>w^QMh@`^F9p<)UN-8qBC z#AP_WXu>~rl)vuSe;;p9P(tN-M2o)`X%x}3*V!h1O;)XQG}YDM15`<RZS?`_qnAnB0bW+0?2xFv)5w3?9#n;|85p%vsK;u=J?X-r9*Lfm8qCiYEE!4#3Ou*Q=xE|)cX!GhAal+c0bl;#wQ9%s+dm~(P6hgoP*mf zcU`F?+=y+k29bQ{OR`q)bA-N0k;q}KIeot2Arh)ZHFiqxvbXV`u$?en0kuxP4~rXz z0)w#LwR-fQRWJPB`^~!xlckpQW@%QiIZ(T9KuVkt)`1olTzr7!YxX8(c zto1=GahIiePdgz}`s0GMp^7oX>WF^qCtWQ03&mqYfs$3Ls$$JJQS;)fwhXdfY=?Vt zoZAiR_0`qMS;tlx&bxFV@|4 zxR2oE%NZE=wz(Y4t`%Oa11gcDTOg(6d=fBD7G-gPy?rJci5u1M7Sr*zqG>;xm)q~%NWLv8F;BJr#QboM4z_xC#>@Olw_A}WGWE4R z4eTr|>3=8=j9C+juh%}VW3_ZMBKYo}xYvES6b^1~&3N9TMdk9tlvBP)*ZZW$?uUN=Vkq(-3E3*`*%z6KX0=b`MNr*K7M-1HhWM>PJ4JEs zr=%lJUEEFMcATUcjB6w<&R~)T%^LkRem7sv8bD5B6@HwxY>=HtWGF2tgbum4?|z(O z1y#$9I;3A8TQ`X3&IXS|Z7gbjMINSyq9H5njG1t^*e>!XB$y1#P+93{naJ$QiEonBoL$I^V2K~)AxJSjIMc}bPj=b zAt7)bPQ1VseC|3V(94dtPuCCD)N1$LzE3hQQGl9rng~#b&x3jnMnE6sIrFn=C*;hH z>Cl<<)^*km_C$W=J#V=A+vw_ya1Z%9iC+Ev8KxuJ5WJ?HUA63!W4o5y6M`Xu?Sw(= z*9HQ4k}oNhzdF&)^Q4oc2lJp$PS*W@IMePvX<+xToB?i9ds?KY!VM3Nznpj9v4&}v z!0S--XNOgpliER=8v`H>FyMRRXCHBu<4L3zsU8R=vZz>>Is+@qkaCyC`JK@y)dra^ z%gVrQWgR?1`Zt+m`J$bD~Ys* zaCUi)vgd3IiSp$ak$Y@56%|jp5lq{PK>2L$aJ+ya6V(^(TVh?D@P&OB#>3e7iCN%z znvl8)oLsd$?)fp&SR56+JjbRHm0XhTE4B8#kKEvI`i`R$AU?3^&;xlC3mwj~_2gD< z3i14R+cXM4&6^C>ZG?rNRt!d8EZZBh3x1S%bZsHW@>@xI0THI+qv!*lE;9ig0o|;n z1{yb3#UbAaH$heH2-#(yJ&gn~8pl(ONv;R~VU$-K&W~_q->OgE7{j*X~2# zgVxdT=;+1AtieAq$*R~O?yA+~l?9ByQ#WaWoT>ReS3rV5!2a4q!@G+@=VqKEk_7~R zS)#YBeyAE}QH@@&3;0@&GBA7s^^te>0TT~irsh?OvAq+5{sOXrzsY2l*eFzaEkea7 z>O4ln`F=w;hKP&)iz?C3WAvSR;(UP)&7GOD{wpZ&M;l1P9wX}nD(B=7srN$Vli-=9 z$+N|Bd(n!^08o-&WM|yf5T7*|)5zKTuaNH_j1_R;ppQsJ^9ElDN9mU&8~*{MjQam$ z@2%sae3$-lMGQazR}_^lDFFfLQo6glyStVZL=X@VDQN-ejwP0o?(SU4rB{SyVV8y9 zdd_*C=Tj$se}B(^_iMTK=H9ty=9+8X@0lsXY!8N=lM|ipEeLQ>2-wdoPOW;wICI0E zR6PjUM~W$O?-bM6=CIdIrjMg_;p|6bhYi#ppzf1A)gH5y=gvQ0(k0R1Be7W=9&>Pw z3(OsxAl|$*S+<@ilrZi3tae2{-ho{5ikHq|D1repDoEIhNkn!+2@4a7udhhYw%5hK00hcKY9TCK!PC_peYtNeRp}*=T z($myd8d{0ko^x?mX-$Ndj^VReW1wHKz`En@`?JVpkF@)nZX#|@gtq?ZB(~J2t4jhd zE-gp)DxSQjY-#Dwkt<#`cI?bKlmu*e(+upF_S*1t0P6> zXv$Np!(DMkglzM>S3R=t8F!__BE*PPRO6hh^vcpK`utprm4Q?%-ZA`-_#HOZxr+_M zH8#J;Y1*lay_5W1@bf){_KmFF*N68R;H6+=xqOc7QB!3=ijFV$- z0p@|xw_${3u0MSBIP_eCLK)SR(nmd59zh6#W zKeq|Hu4s{<=w4L4nT;8W-^`IeQ<6obvnjcW?D0u-FWZf|Ry)ou(!%&Lqd|GMUvx zo4DVEJnRF0tjJ|)#8mi=n8g>2%N{~gUWaw;b;wny7AYA`=HEtD{1)5&^EC-wa7X^P zQy%*FUhO#%Knj?H5&wF~+hFeE8J&R385(i^Jbf)t+Kuw?Zw6)h#`Z^Vgfa`FiC2yu z42g>n-N|uQn=)A>o-HXLiD6xkEcQ;TTQ;Ezp2@vZEmz{l4pURX5%@w46fITDMFod# zf$!x#`f;ql!!J%!0Q}XpD-bFw66n3|AQ}c4v3W~6E{~5O9q-;M`u8yuc2oHFPTsUB ze@Es#R5jc$By64T1iWXF*9EeZuJ>0Ctblydc&QgYJ$U#6aHI=^DnMlopDDPw5}QvfvXh2 z#o<|FUq-Et5vJnM=M{ zHL0fA@0ikiDLSowF63quo6n)4HrQQ?RsHJ^Gbb+nD%T_R!3@^qL^h2DWqz82LH7d) zqR#JFn^mhg^dYk$Q*P&crbvL((S%i<1zNd8H@g(enVNFn=!>(@x^bIu4$Db(+$^5f zZuaG5HK|jCz?8ujpMZ0%76oj25aAa^>W$*5``!l&R#A^QYOqst_$%DC^F8|&W7Wy| z9Oo>_c%7={9}b`qalNO9%MK1R<@El6Kv^c}S6!2)@vWrsTf=(`USy8vKND9knN3uuFUx4DAnbn_g$xpC4tq! z?#P zM!9R?F1QLXHi6lQ_Qybm&;gty+6#Foa%pI2BZO&<;X7hII3~SXE_>a|W` z_9Yd&%wdQQpD^_)}D@|Q+s@YOE3h=@+|83tPl{|N5#gjFxcH*7TOrAn9l|M;@s znAQJW@;}3!xRN^mOrH6cUMQGDCK}u>AqK_{s#owKFrVbnF}7qde4Kc&SPu;gI%$l) zv<@L?59koY6NhC^4)0DE`F)lpeoB9l!h^mYaF};pyVdYX(@DwQ_-_e#Yi?LKE?xf~(rRO{m!xFjM6cb<`Qt_!zg;oK z9Ekd)MsD5TJ1DE>?HP%~=M4hDwh7gb%rb8`+2{1Q8M6feERO(wRKVRl>cc{%m~?^t zAq|ykYy&+j`^%X!s3`{e)RN#4dsUiC!$7fCnInMe_Pz5d>(PwlXYFL=O+)q>x|m8Q z0Fo-;C&S|Iaan8M(K@7ry$;LH?pl!lI(6ZE}(~x zykfoTyQd$=RGDqEY*Yf;xCv~AI*!WX_y z!m3Sg=yGp&IwnJ9gx95wZ)$Pm==?Zfw0EM;%VTe`DQ$D$TRXM)8+u*hHso!hnu=cK zTFm8#1YP|$%1sb)zyLV({wMrfbkCGqr9Q&+bVg(Tkyc#jM0g@phb> zrP%JBGu3{%mDu7Sp3{w*icna7IfW4iqn9nk!q)}P!?!5m?YAoXdoGNjFbK-9;xHn6 zH12I*P*%mbNoE66j*l%{qNxkqEZ%;x+9C~R@m}>4dHXhD zgwJ6_nC$Fu?E5vZZ;UUpgnBdl7UaAkNE$WYSi;(Ncw;yf5|%@7k?H}28wKq&&NP^{ z6h??~*T35nkGUzRqU`fydu8+Go~OEyOIE9g%Ko+I|6;rO#>wz;5AL(#g{%@>gG3vY znO-()SAJW)Kij)YP7X_^`+?cmVTS-oXph+iE0Wuii8}TaNoN-8>>mmKJZONw9iw+U z4J7S!$kL^gJQ>cY|3*KON6JGHEpEQ2P|^HEk_s;lPzcD~L_!KLj~MBkMwZTL)D6Tf zqj$A(B)Uj^yIXULa_!C|IO#9AH-7bgI&6ow;37P70ZEZc& zR4sIUop!c7RcV5OfYm9u^~BzH6I3*>4xQ>%INRuldzT4M_%$kJ2{7_YF>wduP6tp0 zE~JpwQ7(^E5*`>VXp{Q)#9XalYlaf@Cnbf6BBCvp zA4JcGN@xbOLaYno7jL!)g^s#pEbxe1hn`(B>{WNQAw?fsW2?~XJ^VfECWX8zwMu3e zUXt1lqMDf?+OtOnaKb98Ew;PlBi{Gb?$^fW58df-q405*Wvw=*{hm<7-RY)sIQNWK ztSpt!+pSHOzuY&7$G`NZ+vQS?ge1lXs)FddJea8r%6M5-4037a;pZnwpKWRa+mCly zqZ_yUY8$E@C67gH`xsw;6>HIu*_%0^8k_Ccu<@0SUea#S-}HRf_fjSGrjEUFtEaa~ z42t*8GHLo^Cq-K1yia`oI|r>%sfaR-{NZYv!;PKEtm;>AyDY0Dlc z0V#Q`)1y_h9A-~0PwqJ7iq85lMyIdX2x#@Iy@IuEgsfmo38!BqyPv9M)ks*jWZH2w zUq}=0s0ih?cnQ?RA1qZ3Qjqi*WQ*SnkqD_KX}&-$(g?QJ2#tD*t|w5BU^89X!}hBp zN23E;4vy)gZ_9xKX;Py-&!TtVz4wpU#1f@zbG=5ah{xMin)q)iDS9VXZ(>bHy{tB#-yiy3K1q?W8x(>?2uz`Z7Kv3!Ae$b07Ox zZL16EGqXm21=2xwIE&u4ca{0_^EyyX#ekyq>m#xMa5RN{R|A%~b3DZ~<$M!>Y1_G>D8%4}d>C(hNRp1|YR3h#~ zCTQy)`qIe29v@Bf)lJ^q^!HM(^sl)QsES4hqaMVWvVxR+1Z z#j#UW1m3eU`Z!XgvXo)4_$8q0at{R5d;cbVuUAt(Q0j-mP^n>_xUQJ@1^u4;Owpm^ zC$Y?)@@}ru^|(ZLFpGxsPxK~;}muhR13?hCUSaT z;MnOrQp=1`lS^Eg3}W)Is(fmz8ap7f=WyOv)je|@L&JIcQvnr*Z3ve~>&19Rp0SKL z`5`>Fo6{msS(q`AyBDNWd}%B)f}c}U&R2%bT?N$LG!kOzd@+9WDk-QeV^uu6Jl;NY z;wp~O_{4*~GKpi&ceAieehb&-VZGt%Qz z5Sb0ryt|~3OiTCDF);1z=K?U>5yXef>26@i_X+_1faT9z-!PrevE6;zDWA8pS{w(I=^Wda z^eV3kj69aU-&@>LCJRLPjOXNym&;+;kEG3&GW5gciThGsuf=v5;DyTvm&)o%3CrX^ zzq2`z^6S?_Slz2%j=T4{>&A!8TD%7V(`LE5H;3doc&WBb3ON9((>70@3rW zow?||Ww=y8441RD8mTvmpR(((@Wo^^uFL(Asvj=fvw4Z;}(o$cqfa%Yh<3 zJjelS+WSV}H85Ls0)Q4MP7j{h;a4m65J|I&ymNIn8Mk^l>G4W!$>Bn8Y@)_Q(r$5j z_UUv( zEEFzOwbX2-(2$w<`WY86yl|ws734{=*CY)!^6x2wR?-Z;rJeI~*=|zPBTeXLNKM=3 zhc>=Vr-dDF4mzwaaZ2~jVaKo;xtqb~(t~)cOT}WvTwzg-X7vIdq)eYhCAVdI$9*#G z$My^%&M(CP$BX1cVY%K6KuT8suy@$bD(|*Ywk9hy|CgfqqZxcprg4>BKDQd_)%z6s zjhED&o<)}F10UY~VlsBO*Ww|xnThfN1@(!aY1Cv9aawIUAq|Q+&d#Lk%0G~@-{Rk& zmB}Q_^V`Gkzj^RXIYLZHH))%DvU~X*L9+g6&8Q;x1TQE!5MT6eM}@b#lLvy1lh!z= z+b~vL>%dbgqPQ*6{R5xWH~I8WeOvue>wFBG?w{#m>ptu%I1sOK+&8wurEg}o*Fhx0 z0{nk6A*#~p=!qY>))h0duc{cH2+|<47Y0o}kUzl9bP(3(PMtk@C1hY#S}lB1C{qBL(MCVJ!vO- zDGZPqsOL7%Wiz@*M1Q{;)a8%vmwBF3LKaN9thqv?Jqxgez}{C%%`+pQCr#)ag~m(+|Ir-%Gs zKG9TnyuI=NI{<%b1FvaQyY#3} z6z-IiUdeL2Z8VR{m}zKUb_PfEe4b(`49%96%gRxpIz)e<7c>YL#g@gZ*WBz18?#XK8V zMvB$}+Gj^?Ul5=+n>&)W|0rh#^CZ`;H?8OSb>o;9fCz z*Dt5{%F;g9rl9-afl9~9>F;0*4V znJoYDM_>}1G%sJrWJCz*C{%g%>T{IHrSRNlMVIJa&2Ii)3RAWovU1B{{kU&`0ilY<F~R)>bsuDtkU z7=ICP@0->IOVeD%CnAW>rs3DSG%n4UU?A#T$4r@F;kL|EFNaVn;j;7I@)(Fr{!9jF-kG&}Jm#jbpAu_5|4l5*o@bC$8F`oc zkxOk_78O|?Uy0sCak4_2lm6`|0#6w53n;Khl;EtiYvPzuC4RZsET|NI#I?w4SPy?=H~h-{_MWW5WA%hhKB)3t zyGn)$xh_?biX1|#*QSvV%1De#{MY1jO*(H9Mr;A@)6?4Pg@iedjg5v>j!o<>?L7wk zv;;UXC~g}9nAUGT%=^5u6_*|H?7o^413;lK*_6g?VGZXFgZ1{3l!&^3(C3^NJSOgt z_W~UJ>j$FFobkE^?++GT&}AY>br3qRtB}~P%yxKE5L`c>IZPdC7>n!g7WeqF`^R|u z>T5(_XW&`0+?R=F$?@g;5@0IflSyh}DV`cI+a`pcK1^Whx$ z?r~;IfH)|}Lq1(6v{9a-(CNs$+gzD+Jjj2RC+G4Re)o~nCo8@EF4g0JafsYlcY=*9vr868dcp=$ z25U@7?#zBE@3uWe3?;3r9C2MX>lDN;xXIYn0ejct&_xlgWf+|JYO&3W^clWJNNWuj_@O_}5cdytbP zAz8AKfBEv&SPeD>#xiQHwpSUTf;7;Nabz*dIo=gu@4asIY1~6_#WQ2KNe9Vs>wn>? z|22|tS4rRKX6r;h+a0|rn{S@H1!|gGxv&pDSg3(sdaq_*i@tK=AQD422sm^MpvxWY zY+jbR`o6tdO>G?HTQo7wu=O!nx|@9o;wMUfibE`$bxji@^jcF#Pwg#$mO;H=6R97U zj~$KeEJON~ffk542qgv=_66j9Oa4Ml1MDeneBGz+>HR(-R;W(BK!JF&s`mM$=%7xi zyBnPku{#eh9-Bh5v=72Q(ITKiAL!~hPmifkPcCsj^N+QTnc!FWsOE3&7SA2VMI~$4 zwuzh#g=~bVtqkIxko{b$y6SFe9HfAV(Ct(A;v&^-#rI!kTI1rS zgsYK7TDCl#QirZ_vUsj?GR^NXycyT!;K(HaESs_x#+5aeE`Lz|r$&lJJ;^6{CuR(@{ z$lyZ)yf%cefo!}qqEn;@b@KB=5ZrS+>wkIypj%?apG4ZWovnudBoZA>ZR)!(5p&(0 zT^+Zj98XGG!7^qbVS5Gcb*g9l$qvkc&TVRDnQW^77iQhPZxuMRrwGPxR{%>l5xCyn_G5!wV|DmXlX zfgZjwNl3K$3EzW`Ru;85+sGar=?Lmbv>_{N@Rlz5rs<=I?Nq+9Nd$39D^U~)GfBF! zC(+<_>XnyQi`MWvnD<;s+xoh@UOS1LQllCz8=By5^p^m`{MN$KV3b;IUpDOZMU`II z?*QDtS;+Tfy0O;GWNO5#;Jy)Oqj}{fi_a}r!?b9Ltgs}G(d;izz~k_H4)y!h>QcfQ z`|Z##Ily%&(*MPpoo2W+f3Eg$Rqvs}w<11_4bYQMi0Ksyb_BwTBH zN-0<2u~W~0V0?}aI5E(ug^R-LgOcAqbXOq4j6p z_BCdEhn=Uf3$|jIpd2pTCXqs^4+Es5RMoo0O8V<#jaFBK6F0MOTwvq2YT;lB70h#} zmf)EJfJwcTGG8<@81ZanCIE zm4f|x#`i*zkOVo|JG4zv?!~uDlO=sAEaD3sl8H+=c9Vvm>UohK^Exh(EXdxSm`&Ri zQ!q^;&h`d;p-=B48Rl5EKkMT(YnoxxZyvfC^-y~eo!ciN#a4V;U41R|W$%jg+VpcO zhm~eV-A(yTu)##yW0w>E0eJ-uPUE^Ex&qRMKI42(X4dcKW3&}g6;p%Q6x^xpiu@|r zee)@41Pqrktneh5oK^F!VLnDP<`s_nOAsJ}hswQG^&YHmAN%wrdnPcY4+6 z04xGwCvoC<4cc#zt7=T+u`#yIeK`gwu-C45n*LlAZLV254Dfk2ela6ZCH)zy$tX8L zl*p1mK-)Z#wAUKnFDLEQU!q<9IFuJdv>^ls*}4a+$sg-8Y7>m$=k|OcLSSJ*FZRin z90&}eb0RjE$qcckKk*^vS}b#&@Us1t^j@DLxEUZZY&}J(@}*KfpCTSxr?R-nD?p ze*Fof#)g{6Q}AawDaw|752=7H?l&Iau$cCr6(0I5GJ6Y~f6WqMpF`JZj8CTCj#!6` z@KE_blkRAUp;JS!L2a=8q*0F*l?hWVq*e#@tdd42(_DzE?6|FElsb66Zl9S3QS@zC z=6%BDikP%&9(^E@RUhW%-kh=y)Go#!ZcIt z*}Btv$js4A&8+&@5~5xOh4;*w4k>_b_T`(xn=Y%O`g@DX>?ZdYwnw>0mk<8meqLqshhNcxMCgpkaVYAlWO9lFXoy0~2~-+l9^+0`oDvfIFw8*@B&Kdn#c1R^Q! zftKwM)nA~SL2fvV4YtrSE&0m9eXBHcm* zth`(dP<4!1U}!B#YL3ASz{En8U>F<8GvN-6`N7(Qy5yel%`>rCQO+J^uiK$n_JcD{ z^-y617>qbhM<7*7N87@}H8D?P6=97#rt+6p0T$}pqkEmOZe>mJ*b$Vp@PVF)In|bo?R7#_Dj!pt^3sgQj)y-F}izN67{b! z`q{%9MKvKztm8^J??UM!-r8h(tMkX;p7pSw^e*AycM@yTp6#xXP4N%p+L~>Q&8cqG9e&Z+7DwdCCF-iik6$~ zID45DNtoD>?>R>WdEQ(56*o5L2R)rK4PZr zF{hy9cNfosyLd8?6?#*z9|zSB9JKGjsMeJqH5rzw-@2V)VD5n|FQ5>1|JlY&7DBGj zN-o0tz6D^$;{({CAFvDZbYYH0B?rM}-*aGT2*XE?w^MtuAQvGar~UCyhZ}Eiyd5Cf zZiv*s@?Jukf%5cK+=f0oFlJ5l(3KIqLqJ67nJ#CMiSM6ty6v9mnPtADV$sUJWC}T3 z$}}nsiwXwdGSroaN^&ESlbhO~StzsuyK- z=$FeZll-trpAE}Ld11h9_@hT-Hf=%12pe-CsArJbbf7k6rp~LTGIpyX#v}mRR5KIs zHe9bJ|K3GP<#Oxs-WTm?dm5vF?N^_!;yNWA@+y5`_w&ATz>yygOQH{7c*j5`+;Le~ zk;~3Lo=DxSp~Rx>~$H1$+~r+ z26>p3IPl5Oo9=G{uHLF#G}S5dkCI#|Pa})c-8`XzynzW+u-ihzZ563JcHdLT?9YAN z1<(Uor2fWxPp7=H1vH*KNJ+P(?;8x3jG={aYzF2ARJddvX5ag(^n0H_u6Dy?c2+fh z2K~U}(`D~<4-2R9-LjcwsSEvw!qiSPyVOYv4Xwz?r0f<+^j_9wPi?u;GS^JCHgg)- zGZ%P@`AKaGx`^eri2FWDlxD%vpjz?%Y!5Pp7XlI^&3PD{759+MHDr0EKJH#tbw|&r zo`X)h+Tg&WK^p{1K|S|=%9$>qr65hi~kjVQDv3G0PlNhgJ<$SSj#lq#0zNXPh}LVk`n2!4Tm6VxA%;(4Pf zbiFQ!KfVEO=E3GmFwm-4F^VU+ANgb9@QzUnFlu$oqF2w1+Tz)icma#R1hc&8M8GB@78t5X=f`rayhJSW`bKwnN_jwPkU+d|^6?d#3z0J_wd4Zsx32R?7S8eeQ3%T!0n*~YK8o01O7 z07cl}!@8p$fmd1}xZ?)vQ*%u|0?ViSD|>5;2|x5U@lmI{_QPqsceAFIi~1inmIO$l z3ws*3P6o%JkOzZHsy8rSPs_>-k~OAq8)t8!3@r_FDLoYVc~Bex6I`vku4-?PCsJjrnHigr8#A!2VuYp^*yqT|W2?nTOF_@j(#r361B^Z1M`oBD zw|O7jGFZJoooYbQlw!gi`4OZ8JnaiY=qW#RH;&B2)(&g)3Iy63?$(^f)Ah~=DOrVA zKQPbZ+!1_4YLp8_zf0%K0#%%G=i6cXL;_ktBVzU8Htc8A{B#io>2~bG6*hg8IlKex z)UapEbPMI{yzaLjTd98J9_)xsIuko}*I$?R!ib8p^{C7;7xRt0!la(%Sa#km#^Tvq&3i!QBlYA5@tFmJnTpC3FcdPFyfA@H0yFNh zbNBl6-{rP#SdPb&iRrFmCg8>X$4|;U z2Qw?oZS#iT*DgS}c6}xixYNgL#a($nszR%R^!CQ{-S?+r2{S3vA8R&=>VwLJn3*~* zbMX|E*5NZ;2$zM}D@d7FA*k^Aw%#!7t?bKqcv2oT)cD1>I1Yu1B#AAxo&I=+u+3#8qKPgj~7tIT{$=ECT8smnKvx{D@ zsmE)LI^G!fE|4sjv@)cshrzvJ*QVE%;LT6dXo(p-W#5dHKU4F%3dYbtc*{6%5mH)} zob;w=S>w^(Tnm@&?iod7MCNSpzaVDXPF=d8AU zVkxR<<}#n7__uN!ZxZID$+cGK_?aoXYc$l30F#^P37I>WW57>Py2b~S6E-hFGP^Y+ zjJH1uUk*))q#7xu=z2!)3M#|r3jhHB*4-6_K*GFU-92m_7GO)b3|{`eU}3}O_A?`~ zhi^SEgSTuK-aj9CE)<}1) zF{j#j@LSqNOxT-=dWCIgjRMa(rC`nyzQemA&Du+DK^A+9+4^(&C;OX`q?IsG7C`lZ zHY$tbSw*E7#wW1Q3KS>vslZBp{Bo(crtGTE&l{S^CZTyYcBHUh9t1VWxpQE2XJ=zJ zzzH1;5}meBQZYI9bKh1BIIn5s-G&zw0Co+QPF@q&dF}gZpfHVtyo-fs4X$0n#{y7F ze^6?R`=H#Rq3RMqtQStk#=2{?bMX-GDpnzNKH|{!V-oN{?PnY4)F6s=M`ftS(ZO#<}pl^ zl#z=sl|5@&?(i2O;^OXoLKzzU2SWR=dL2}U8y-Mf)&uXR2a-*Vs#HY{X zE(ti*`Gf2{8=fP| zpWgsXLZ7sZvHu`B(;6hfS35Q`&_0<$?_AB~zh*jUIkOLp$Oqi;SITS?ozAzndiXWY zUh8bE#3_+_iuK@9ptbbn85f(yujk~Fpk6om!tH^(@D~p9_lWO>Ee_R^pMRf&d&%awk4a*gXA|Za0tD8kDu`Z{48@HRg3( zo1h*6?b{t&74VLTTIqMbIlFQF&V?f`@h*tBmi+O*Vf>R*1e^F2k%gjcL{qJ7>dVO| zYLi($alAi?%xufk!Fay2&XDt(tcNc+Tp>%gitNjX+|`6ucD3d2pTf%K95)pp``x|e*5YJ8 zB|6-d#l+{Iuw!b)oW{c{O)jYN%5`diaBr=3oq{IA7beboE5+)4!Y>?l^1r_r%adYY zO&44L5WYkC@gDJ;Z*DTwPRZHpgg0*dMQ-iybrSzbL|+Bq0ERilFkRGjZK&=g-EjSB zmWMOZnN@;y$^_aHnSkX1=1oT}n;_&$!h2v@ z)`mGG^fJp_OP=(u9g1<-gj8s#$>LE@5@?{KGGcJQ`RYSuKLKH0VX~=7vufrT-1d27 zOfoj_%{{%NpRPMWUkVbn^D9QE2;A0--(}vsrS7B%lR#=Gb|$qo3vxCiU3>BG{yHjK zd;f)*{9Xs206wZ-)yPUO%^9p8O;vLl( zxoUrH-mRT2)}<$}Q9795HQfkA_r8&vnVjr|jU>{&pNJHUt=E4T8M=N##yMIZXsIbX zUtWmBCKw3S;9^px@co^0hA@-kv&R~dXGVuiUq}%0%N3>9#JcIfj+!)fU;dcz6>78K zVO4(-3*7NqODaaS=0WJNj-Siiol@ttvIA^)15KISK)%ZjZI&>C-`=SvsI#q{ndP| z%_3&RY=5688+z67Rc~qt-wz*!uCRaDP#A3n&9=+H?+{?3aIl#c@kM2a_zJ{hx(h@ z`fHxj`T9QZ`Hs`_Ai(^|8O0yf%kPA&BBe4 zU5~K^8v&2cpd60=f!9rIv95=c=8Y;y@r66_pJe=pEPwEN@SBOvWacF3!Yr!=b_c3X z-DJiC3J(ccgnp}fhP_K^guC#+y^Ev57dZsrbS;{q`rz#GV_fPVgT!a&_-`+`FtF$U z)<^t(LGV}FH>z2hlTtSS{|KEFja*b@!@X5J05U83v`|6Kx`QuHzZD<-1XQRG86JXtio1O(F>8Hi2f*9EQ$CsqX^`(3(dgl)SvB7)*Gi+vv4$n zwcub5+*{|kn6huUE%wKimNYmhpZv>~B9M>yAD{9cinJk`bc3J9M|rWyrLD}kzW;Q8 z-r^npMvbtaawWOIdu%K1bb&{|zwa;0$=UXSuUKG5+SlGot4|BrLBN%N?T>%b7i^J` z1OHc5XISu9rw-4X}JkPEQ6tTgBU^C$oH z5?oej?1Z5@a~^pgjh*h2L1Ls zrQP9e+F;S^7W;h34Tx-~C7VZov}9^Dz!gu_<1N7&P<~NWdzjQ?lO6-y`aX{TXR!sB z%76bHM*G7;PCLUIb@Pw9@fTvo8m`{EYi4)!te$P({{7qfXWu3##fG7=QFhiJ|N4G^ z{Pd&N9qK8Y#FQ^ofBegzwey!AxEd0_DimYSPkAl=yNK_fefyO*)^lfRS%(DuK8*Tj z>%Y0ZzLtI2@Y(tn-aq?^zrPVyK;l5{6g<@R|7?BlO>AZEx_Rmo`u|LzmJe|nYvg7A zt^E6(ac7*CQkTQJeE(+H)c0^0q8`dyIH5|2cPDK+AN_^G{ni8gh{r2ke4~36Pvd^= z*HXRoZ{zp~0dM%c4|P;*#Nq4zNZeS2_}+Edt@me&)ll@3SsN{?>1!rGN3&{#VzsMW0wli2jHA zSocdGo$@~g|6Yy$nXq1QVf9@lOfM()pRM?VIGujk(|^VP=RM^HkSQ)zaC?Bud3 zNr+F~T7RD_K+18Uwm)Av?NMqnvr&)zYOs#q74DsX$X@-P?;2Op2@IlzgYl8CCL@h)2rr&8bs z2xJB#myu?`13_?^^1*`HdBFvC>`OTC5E-F38(&^RWzoCK|0F|*&HD*B7Rnnil0N5= zuLAejUk#`F08Kx1mmV$f^fB*Ld%$1*4ux$2F*jn=WIh&2!hVrUd5EpgP);n)eRYY` zzQ^eO{dx0`(?$4P3sQvG-?umG$`XjCM6Hc>EayA?t4%T3QO(kK|h+PXeJAp>qcylmrBAnP?v&n`t<`*%Os-?=RidqoL;ahXi}+uq2XxVVp6l-*@*1)XlxEP^n4#-dt%&z znu|#{^<4ME;=+q4*FwrABMsQn7xTjO=ZX?)>`T@~qk&9%r-c8z>R>EVf`{3DXnZ==F~ zKfgALxaHM;USdo)y_xaaKfiIl((LW+;3ROmfJgr9^U_h<4-ps0{rPpnS=~nWO~ns% z3W|(Wi=$*;!A{E%gx!deXY(2Iq$ePR+jqCWS7LH|AsWh|pY%YwKtq|3s$1NnjRR61 zco1||dTGBHOA%kb-V%V6ET{#dHDY#1O&Xj#5#B$HqhN8qn7xZ96pY>>Zwa0l2~`R3 z&xM~g4&H6THiQcgc%F-XUL_{hYa%(UIk64Ww@Obju%Oyau?2-$Vz5mKaoI^SG=Gj2w;+ilTgVYXwfry^@WB@}|o*psDq?PK;UZ#TcmAl@;KS zE(+e+1aBq9d16p+=W_2UZ`Ck+kPN2bM@N*?Mjyw)Pz^*kD#@wT7$beU2Q_p7JXlu( z>U{Og?HMjrT0EVpRMS8&!<`lLnzlb<&_wSKybr)_gfP8YUpHOGqm!b7Ogy07(pSIj zsGi4dDz!DcStVkES*SA3m1EEq7lMv%vB52O*=ts8e`<2%E;?$wBFO6<@JIVcPalJQ z%-(WA1&`fAhsJk4!UJrDWkxY(o6|zPjfd}GA&Ug%wO0muk;wkOe&~amxJ}p9k|^xm z5uek{#DWk1e5UVDX4oQ49dIPQv8t1m0$7`cdWx$7MO}VrKV94dk=EHc7ta=2@h$y8 zQ(yFY#~AQW`1Y!NCKehsxkS}Bh-h#ad(S_t@>WQCeh=2nc?bzQJSXiq^;z-boBm8v zM3r)?;Gj5udWnHn5>gOZS*fN1!EKmRA@TSwQAsp&3AU~O^&2a$Jx{1)&{kUu{kDgh zfxC7JvCCL)GnECgUFSDHn8I~@6xe7-}h*~gW{6%h$^E7TeV_f^>O&RV2)^6 z!~vX7yT)2+av@<05`;k&G+x4Vi#T9s97zT)jm*AKyehS5Dp{j={hSR1`?prkFD9jj zm~bi}Iqvuwkl}kPcGt=-Z=lV7K-UL{pedtp@KuBkrigi{4%$rH#hca!N^)aYG4U#* z_uy*MYktRD^XH_7Btl`lyS@@)7kyZ^n7vC2LfTdPj*!(4*p;CzXmfg29X$4U^W@96 zN1l9g3-Xe>>A1Y9)BQxo;sOpbIrX@A@?nrle{&!)N2$sOu_I4<|G^CrnP^HU|Nc0d zvg!^%#uNTpxE*rvF<63A{5|(i{=g&rN z*L)O>+#fL<+g<^Nn~aXTk*GnNd@ANXOUGU=*iRMS=N-IGTkSEj^KkHxxJ)P&d4j5R zfnL&4ZuJ@pMR@o`+K|pY)aem2FSv6-=Ilyy@x?-A>WR@LA9~5@M3GR(Fi5XfaJq^7 zbr=!V{TUI=P|Xa)t3-1#_Oz2oY^bIcX7qWhMYw~)d&Li}RHDO?_o2N7x$MHx{6l@8 z#QY?=?JKJhh8xa%`>2B%nju}!q zB!}+q8e#@!zT0M7B-U*`_FQ-ZWX4hiC-3Pl0p+fg%L@^;x{W(}BHF$09pr zV!@LYUWBmZeEjs)Pw|LAS1R0F>dEKMgEUmwRkCp`z(JJJB?0?_LpJSa=-HlzmChT- zAHU#+45+hEmR-L^1(PR993O$n?4vlcD!s2prA9Z^j_?GJmE>|D?&x@)5K52rOf9lF zVg*i=t7Pl4s#e5CxYp0yhNrZ8k3u$eG(;GEMB3ARVKP40d2K2)qu-wII~+%Bp3YjA z*QMBlN7VvAJu?f&DI&;Kr7mCkX)EIhO7ppk0|B=F!SBY{+sGyyHQ=vANav^ zMd}q(_6cL%(EgUdVZ#FAyhog82YxQx!%f;^Z=U9om$q>GGx3e@wdsE3i7|h(SN$~1 zB2%}Xf%@jG-Ar3EeK;KBzqF=Ypb9xp(96PpWH{Z4 zN7d8~%$AZ)^JkZny8}!v`-yhVgLVy511{T5k@_x^ad}=Busv0BlNtnIm2l>OZf1$H zIgsktBV;Ec24TUl7iI<|N0XX{N!{@i#f!f1g$dT^^KoR8fn>B%_S|nkPDc8>1A=IO z2haR-dVQhltd;uH=)~hn@!@ltL zFXiTCFZpPV7BJ@9M#JawzZON{a@=TD1cbtuU zF(c%SThx2$c8K>nHtmI_%2kO7iJk*E%~glVkc(uMn z+XKWOA{#!ebu`__+0_NQo^(_pCLEN@m9xLBoHd*f8SU9OAnGfj35E#P=C$zFFSe?J zs|{9@EE-j6eOj_Um_vjx`<4?o*NwP@pyab1O9o>wg5Nc~d0s{|s$D+$MdfIAPZt;U z(^;_2WKpH7juJicz)zMS(R!+cKqbr?1fyfssj+Z}WbAO8O%Enj@2|)3&t8343e;J< zhdWg>vj3P>qv)|f`lAo}G;RNXMcnfq#R!3Wap+EqEVr@g!LjgB5o zr$;t10%`^Ko2$4vb;0uw9 z)#|zDvrDZLh6^c&`M+4TZHHR-ug3D?P^CN`Dn z<5lkE7=lCfyn{-GE?`TY((jmMD5ParZI0GTx7Amud8d0R=#~)K>va&uyHsVVnm?2E zBlL!Gz!qqY;mld`W-3pfOyHy|Iiwj#tMz+!ZYu0F#g@Wvnmm*uvecizX$~~gs~lGl z8S-ojiU(u=OMv~)opv*iMsMI|XD}*!ZKv&SNGxxv#{;vSr|KyUcn9&{*-28IVt`T!c#aj1Djn#_4 z516G@d`_FwIWj?3(yTZw1|fh2JlXTQ*d{Q)+r_vK-Np~vKTbei|6 zjO%2aCOM;^^&F!j6-Uthq;9ol*Mo`@5nH{9a9LtG$4qd2zE%XUZA6J==;mmaeB!g` zuXvmfW@plU4zDW=3b&!rmcA1ZLw!$~tJIn2u3-au-@z;}k;V1%(VjGRN}uzS3K(FV z<<-l+D`q$uF|RVLia^h+UmA7wCSs8Jm7uy(BaF3#$K3JeRvwr9Or+Nkfob(8c4Gn%DXxl|qRxg6GPC1{}p2&l}a5&fsBrP3b zGni;^6CXMsash=bb!o^%M%dgmV7|1wxjL@Ys?5s#BIn&tZhJKW3PD_tc+GR~Dd~DV zVMuP7rSv|2@3lFzMacU(=&a4(J_sr+|DpZf7RA(?Tf_mhRb>Bl+4H>tO~XMv&)G!Y z#eKiT`kD9W#`k`AUc>MDAC|J9NBIJwq6e@;7xsK)r|_s5=YmP7hCNQPqMa5;3y}TV zS@tSh!)ToCtkHSY`%qd*WZ*m~{5K#045g$*EdkQNz!m_=e$yw4^-Bb_Swz{kwI4F1 z_@(NcwuUX9s~&k>9=@IA0N=0gs^T)m9ih}<1%Uo{A-g>4~J&!eg4s zBa_9NXCT~qx-fQMwtjL4vGmRW6k;}JRTICYvD|}e5`%BKRS=joz2C(6OmVtL3&k;) z#g6t(;%X03t>z0)6H5vy@a;q6MJ$fIF--fh+^ezy+jdu zAJ;wKg8hyNp%Gt5AMIQt-Pxs%juRyXQ?@k|s4?^+Y!L}RWpy19LVgqeGKeDYlb*%) zxDrR?Obm!CwM9HRe9tbL%GPHc<|-K3oWSjL-w+BtSZ3k=~XK5yM_8zo)r&&1xt?=_ho(|+!@(fxO~>m z?;06^MTjhKINenuqa)mN+7e#BjhRMBXKWDUP7sE;&X^|Tom$DvmyLJ^7vT2YUg zAZ#5u@B?>l4yGCVA?FN@i{to~=fPV&!uj>onPMWt`({J^{^5NL33t6nl*B@BjF2h zo7MT+i=mRqmo6*!Sq-y3GNZJ*H5W1Zi&Xu}#sVT?=6KSq^JSY`J>ZmZh%U1-8!xoT zp4c1N8(*?urihzl33NiNYc-sBq2n_R|D>+FKNDf*CE-KR3@eF!8u2SURZ+<6BTTtU z+5ql7=16vQ%NEI0&r_`3!Lg$@eo8^U^d4Q#_(y&9)N~I~LNctz?Z~%S8C(Ii(EkBM zj&Z5)k$f4dqtdXc)b--6_*`7~MR-sjJhQ9LY<930SNXE`Z9c#K#AWwnXb|{<>iGyG zd_K5Q7TY3Y*HpDCB$uCn>OW2MFBdLS9^+|Pi(<3 zz3E0Qf<8X%F&|e;{-ycE_NXiTzz;hGD5sjp@~lGRKxfMNI@8bme0OHtF0^>ObawCF z=~jg4rTh`OR5Mt)Gj;+xt2li3sO45;AD>l7OLaA4EQ+=1)#&QI_mUr^{KNgOI!ig8 z<>!nn)>>=+^m4|=gg%g+Usqn0O+u~{MSOnhle?m^xh_4ewr-yVB$^mcj%Zlf@9+ZK zHq7+FV*w6^cPh6)TBo)VuWd{IMg$j)q63JYD`ZiYlXF3u6jv?ac4jNR^4=NA^v_JH zS>uTO98{{~?iAO{1-CD~w}aoF^ZULzs`UZK?TGe}@tjfhZD3Wz@*Z-01Q8Mni> zKj$a?O)~~yv$}K?5|7g+OSHMY5$iFE#(U#B!6L(ojjm(-uB%P$0k}Iks7s!mI&e^h z4?KJtnmR3fQvE`d?`B))hWU{nXEAx;VeQl6_5}25iS4T<@M>c?`E_mr*N34ngjGrUwo&QJH7j0t*>okw;x z%7$SWhL4awJNM?6Yej`&$7|E5Iyf$C#L!?5?WD0FuLes{6>9Ig^!H>opfN(-b-JVB zj&Qh%>`e62u_ea=c>|^_+X5#VrjJ3CzArA?d;zywXb6#8*?aZWN7gyrx~#Fk$@$R6 zWq0D`WVP}O-`L$ZMz?MLN7JLPHxt5O$w=jcEE-XtUor-4?S=7HIggw1!)w;gJ!|dNffV>Zd{F;cl{!#Zu_$& zQ>+`l-m|wMA|*I`wf5E|S0e{X@}cc&UIsn8W3(=YSqG!=O^)WCC7c>MZJQ2G=)1)1I}!-Vw7_&94zUNvV4dr|$+(jV-O~Y)#_x66`r=y~)BX|@@#G*nf zVhgiFv(-0fw@YenZHYL|XNU*V$oL@>66?oZCxhbrx;$WUV$WMD@2S4zalPdnzXjo? z$nm@BiG}eZDQHf1oyZ2rW`?VBcD3k;OQ@#x2!SqV2`zS?S&*XgVav0>IYT1eFWgKIrPP0Qxh~~JcMm&l zn)>d0n^>VeJZ_(FN+D1eu_JKluCXrCnxZA}pS1uGD=&4|aj}nD&g@D&s`KQH21Y+| z5g#p9&y6GMF&V!E`l z;mj(~_p&nhKHLB~P8LnSS97HXwvIuyZxtx^jZC1HxFNvtt<6y$IQov@dwUocJ4axjdKFbBcxeo|PC7*Frz7F{ zh6!i#3al~tav>T$i`@Lf5g=D1^pSTf=p^-YK#^+`ha2~cnXPPfQZVbD%hDMKHmM-x zi5w;1ikp2oP$$$)dP*n{4~a{q&5_#mjHdKdC^xt$9ElmG8wZuVJn`>qI%;;^dr!e% zQ_Z_Xp6I^4w&~Q}+I@rlczrUOwuTDB2qbYtr=2BTZhS-TS|$>_D(|vBUd6k_zdn~vI*h7y_^%AY;rDfey2Mf)R!zOt8v^h`+_3BN*`=usz zRwPQXxu(7gP`&1z?1S`zmF0G3O2N~vs00HO*r(e$L!{9YulJYl1U6!04k~*nF>5s@ z-XO&*Y`wk)Y1H5y{kF~VuNpC&t+koSbzHVD-SscsQ)=G%1lMsYzbfY`j^bAl1gFI_ z>@EQe67}G((mCl!A9OMozj|t4-sA0)Yu5Vd&Valg*S%@#9|Tv$mdr^lSvX(SBIG)} zTf&m#PwD!Y!*Jbb!|fABPX&x00r~yyej*FP;4L;FCi(WK-mNO;N4lA|Q7j``ppl`4 z5!Iqk9u8BMMG1POogBIVXPFIsZP;V8%T}dG+g5xJsX>JP? zfnt*?3CqMupH}F{_Aa5{<#eZJs*A$2j(usd~qAA3jblAduXOc~;(Z!o{a> zemD-X18>w>RNoE^V85N0fAK-}V>UV7Y5)tMeHjMjL8!bTLCyLR%6=T6^V8|~9MC6F z!enlN?&)wTt?f!ho{x#&nK=QO{vvbpsRk1%QS-I$NMQpt0iIZG!HJL4SZ zS<2qxyXcBh{5%3XTS9{I%Qmje!=?t5B@ZU?Ft2;EH*O5EVHRC5L)jb>bj(#{99$n? z=p;laZOwqaTh5YhRY>6cd+c#)l%%C<*2|SoE}XRzF;dB33p!N^cx6QpmFF|p0Fw*% zrEm%|yKe=ctQCfzOgaf1X#tRA#Fi*P@u+lp0L>d2%|Ca!^cx*-lHJ;Fek*)wbY<>( zCePb_)WP)!!hMP2!a`j8WaB{)##!YD+D3(|5UH7ghm+~t9JW4MNyp~9SvarTrYb3$ z%jBi+me&B8&sU0wI$P;Vk%_dsK%*tfi*G7jtX1BfQw#6Y5D<^6SmMmmRMa;L`lL>j zO0qtZ;DOmG8G%rZY4<=8AaAD1&tPhvZXQdAwA|G1dWT7eQ*nFTcjDF&gqn+Ecx!Uv&L!bB|!$xRDr*y2}dDE1?OB9O7{E30Z-mw zOBC}xa9{=CE%U{D>d*1J2@j-uUF;NS?+clSi}!$mw)Ul(<>{5SglWVSOL_8p)BL%k ze%qPoVio!}xtve0%KTa(C2EB#?_Inz*5)j)l}5|E*e(4uo_OX$HBG$fPYZKt`>0Ml zPXLWB`+ihzjtSAKRv6uor%zO7S9|kVC|iwJ zo8x({o=D*l`7vl&ao9Di)UPNdQ5c(Dvl@SbQ6?pJqxVjgsxrl*2SWm1grf_Mi)T>` zxjStP#x*pL3}x=Um`&6W&?f@8{M3;5CTD_P&L&2A9^d4Q`A@o#=0}3dIZu3EVL}2J`z6s89_~|7MU8A>hvZg+G&_{UD~j9aqqpWy_@|}Lrn7; zaVsckXXkL|dStMwxxAPqX6C$sobQx`$$XwJC}O*bQSwvL;{em<%cU3&{dC2j6>htQ zRE9@sZ9v(3#zaBXu(A0OEu&8nw~g&UGi`S5tUwn|h-MV|d{VRZS{Y@3o7ZU$=BF2H zW`a+9s>5m?U2NSs;xX%U-M39*&QNNSqsJ74o*`so>e(se;ESfllQyli#kV z0J?zh`lsoewL#EWtum#h3cvWr6+d3ngh6%6J&dz(!M%#IR(`SGOKW|lqKDF@phL1t zUG_MvoM=dFBF>Rp;6P9iqT7#SpeMU-+xwDEecR2xPWN+)pZW3qv~eHlW}~Lv@_~rn zihJlan*3VrucmTEU4wu0#j@|Nkkw9gQn+9TFzh4sPO-j^vr7+@`i23t5 z)*rocmWgTZNPN_6}VlW63axt2*C|IDm0Lerz?jxI&IY& z=hS0#yxI&ShWjiK2fz4Hcz!)|MqOk7&D9O)>opT0hPQsYOV9QI4#QlU&#C#_nlo`kbn z2;MG#8RsF19;)%Q-9i)4^tBPryO3i$_tMPm`&&U0AnrkZw3ul3td{oUC6`tOsPqB)fiapHDp4gLnL;sS?wK zwvKyW3$52FX0%^AwUdSWT*$oZaa_ny5yEJ%3?)ew|BweLT)hiGY7`uoqSO@wGk^q} zyE1YQEcWB{(@!M0rCpoi!{}VQp?gBlagVYWf#yA%vg^a<{j*_N5U z#Vi3z5hradS6IuQbdUWAd)(YXb196P1}D$lX!Z`EgRsdtWYGu1ND8U4{uQVClBajg zTHh+M>wl9*J!E@Zbfr@uk^}QsvS$-NZMZApxi2np=P}wXlhr5Dha~oNpcucutUlW1 zVrd&Gl+5WAEt}meg(l~4481(InuOygmptdSyfjp+R0fOKMvSy*iBIn??l#RObTG(Q zHuGO_#Yim}Y&M1SgD1oV42MT+k;`^-KO79<$527&ivk2dMV9->bhb3fQ5qs|1@fz0#qUIR7r!=D=6dBYz%R zfOCjVE7WmLw)Zm=l%vAWcse7F_qlxr0)3JKBlxfbpZKc8??pEiDmdODhz3hw7+ZTt z^SIvbw$7z)FEW2+T?Pd58lg;E>)N+j$cxj4HgpZL4Ssr1_I`78prW|$x$&x)L!fhD z*3Rgf2ihIDN86g;abzaTyaH;WN^R3{x$)A73nBGyjj%9mQDoFH+}9O@N;MZZDi{PP zVr=$+dYMv%#r0IXu2)1nvN?A+1ATk2;NOS`;?>H_)UtS6&Uq;u$eS%La`>HvUCS;< z-nW_^-P4D-ukD4syYcWnfA>N|9wF>1U*u}Yh-y|?qux(MNpp>5ra&9^Hn(2F*-glc zaKc#9ZLp{neq@|)rkve`{Q6`_BfJ3p#UHo#AGa#%d`}|#C9O~}_LD2)?=d{mha334 ziO;j04{r)xjtS`A$X-$|=|tg2t}dSq2X`TMr{6*gcoW04kQANkm!bJ< zGXn?JyZBsm4HpV2Q!MC`lG+UxQEYk*y_Q)4J4DR5R**u@wVtq(MAYtyjp#r3Q?%$o zR{0+J@o|w9J za0h(0tv-``K~pc(G8UzaFr8h#Ms9b~2_mIxop$@s%>;!IS8o;caT7Br;pI;`z1>`I z#whf^oz>0#*bB!%yWlFxX!SKDX|G-kzA1BQkVpCBr~;0yV=Dqcl5DzYdov9?-RPJ3 zAxli}RcBNFDA2*Rj>>0R*=nkwjLxB4eRz!5Za&gxH`#O`S^de2f_&Oi0ovWq)#DE? z96AG)B1Xkakhk@tRdx$+e7H>eW4$d&P~VFuzqDl=j}^sBd3J(lnd?}rm;}=+@T)e( z$`I@N4ibv>EluVznXaIDiaQ=Jwo&!$ivv+F9s!f9jq1Z3hK@;RizS8DpAf_?vNyTb zdgF45Nhgy{N!aSeXBf4=sp)S^#GiywiP7!B0{Us~$c(paIo*h7N5iPkE*Z_~`{GMI zXVwXE8^v_$_#C;11BD`iRYB7BXbyp$yc#U#TqId{i}a}qFkS})ge77n&> z9N$J?g=5~^d?gU>9!~uw1drzdUrY5R>cJyu zas*@msCM3>&Alfmc*T zDxi_Mvp56&%GWWE6m)AnY|@B=_y|jYu|u5gyfDV_VYXC0>eBFmG1ue!g_G8eG2L^*+`0<0!gMKQF4y6cRq&TdLT7e=o~N z(j`>{k!TV}Cm6E#yd+KUk9LFpO4Lf(4o{Mrf6y@YgcGRCUSVy3$sfGmmvUy~DD~Ch zTvA+MAD>G5X|USEF;75O<7S!IL)avru@loXxw1wuOKEobQ0kTYIo5NswZ7}7PV1!_ zAJT!{epbq?n|i++_G;d==vYkSVwwBlKW`ShQE9-Cb$u?UP8ni#>bmq62jq&ek3qm3 zaa?Z{Egz56`CW(Naj(x0N7B`T5WM6maYIklALO_ejo|#YrG7sh%F#MvrF^skrt@4_ z>%~1;gEJpTl5}zu_+9!?QEV<8YWwX?vG0s#=iAJI^%XLNvp?Skpp(a-4N_N`4BKcx z9oGv+9WVB^DTEgn6I65G+0nm^mjgniO>4UopYU2TZVji6n<{1q6U!M~W$kHdP?SuR zYiiny2llL^1)o=pG&{%bLCW`BZalKG9@s3lNNx@$S;u9{N7Kuc*p~gV-`f0Me;4iU z(s|rdX~k*}+aCRN!Ncs<6v(yPN%$%98h??*PNevU*?O{6!Bt)^cY_elx>t~Te}-(9 zq=&DZ1;q4L{FKhd+hk+(Ff_?inO5XzfF*QQmnuDcJWu7(j#4K9Gd2yJ;Pss?*!xm) z4G9!C+h*PY&S0fG=a$DRMX@3N>n1AgDpXpH%a%P}Yaq1ljbe>}Uc3ooEg#sIz#pG!#O zWuxPk6HCA{*!1jv$RqY-)kaWxk$Q1&K~!hjh5dAc@`jGXBLt1y)U1YL`8Y2UA0-ESvlp0v~7uH*L`CTz-&D%#Pn0uyc)TyTg~G1y|496fVLV} zwZWp}u`aK>o(iNzg7um=Q$qZ~SfI@o`u61j zXKUoe!6L7EBmHlSh}z#l>dy7NqG4n4*;pr;a8?qZ2#>v{f#MUXEGZvh<~H9lD(odT zUG>D9C1Li`?0YwRmlDHzp!^>m!N+CyPmmOGjCV2*f@)Y971eS5#}kfZ)Ogyd!^mDQ z)e6(Pa6lHzx(kFVJ>d*IpDJB+-KAJOFQWyi-oqoym5qL3hxi}*7N*YfzYLS8>{vUg%N}!>X*Ck*eo1M(Js8Q*pyO4r zx`-LuWlufJv<6CXijbG9c9Th_^Y%}Jt=M{=$zts)lSkhy``1NK0!xFoZa&>R%Ng&X zYP1av!GATfGoEju=n0292;u%0ul)Dd{~u%OEPVG|@uk+mPLf1H37TU%n!8M4e}FD&YB2%_93QIbzQ!+Lyb|Hdf9^^z z>dqvZDcoZCIy~dg%Ri!ZJofM0vKt6%#$zy_MI+?Ys1cQN11#x`*XbAfuO#9@y?8Zu zS^tYI{OZ@gO*It7{oB9&=K~ISRn*=D?zv7ALFI3MjQ)=r^8U+U01M;cE?tNEI^RFv z$-k}2Z-YQG;F`{%+*Q$k-Zp=q!;fgRC_rmpf)$oi^8fMy{&rah4sgxNrpkx!f5n}@ zGbVqI3H*WHyTJ~`9=QMWYgWDh*El#8zEb+<^Xqp{=l_oVgGE1z`A9T;6-58##ihpeTf4qH~x69cPB2n`m zr*DsrV1YJ0{^u{>cTh#Mx(OGmHX&$E{&vBcGt!@Z=Yk96-_*q*JHfwKhi{ z?wR<6w)@NTjwci4Od_{0o^|zX?HFL4pjL_#Vq~LjD^tDU#14}D?_UR!#~*M%`hmFK ztj}wUAWy3(O5;Q!>+m)>X*rO*@wvZ(-}Oe6%cPe&>~hbvE63FeJV{+?jl(oX+qEGQT4F_~vxIj|fD}=V;Qt zS2+tV6$@vQjqME~I<13W3q=QF61|F>xNwPX=K7@hQ9-{rC6Hyt z69OolU0;dc+NX$6Ia_eLhak6{Yko|B6Y8k*Y#(2QRtxq6f+Vv{H2w3*QifrOg?Qe< z#y|ptLh37+dYPU!vu545GCazP@85KJkC9H$UG)$u5wJuArM}b49-fi|7kvoMK$i@m zZiyVlz7xo9ad&RcqggmFJ)hx~UbCxyG{f5`9~;xGCkk+PMs$7P&&v#3%gS5#gx-}0 zK=Tzdb`v=27sRLQxZ8z{4>_yxdfFNc0Cs(09?=6es6Ofxa)b7(`z-YY6Lf+@_vrCy zFm9N{geaBjH<9;`T&b}BZXOIsQPRP@O^EHw{yQrnznduuca%A|{R**AH^3dg5;~7L zX+<#NZ&aI)aG;{!eE&SeVdxAb(A8N{UY~BpwTt`4pYM!md*hP7qNbAyivrRUcI)s# z1FY?E(B-Tw*!$X92qQhI+61!q`2le(Ufh;v2KW|e8Jyiz0tCg5l^wm~> za<+-1q3iVXa?v_p6H=mW8D{#+C9;KKYXhlDi$O|g(< zH;f9YIpVw7?~n)~tHA@4@w_2VB+wv;-n1xosuGo~-Yy3*m@FjqCY;cpWw5u=xgs}FPXjhxgoDzEyqPjkM8fl2HO|6(d-&D5e5^zVzb>F?% zwW0<+89=Pd_XBt?mdv+!J5m9!Q_$D^E} z*<6wQ=3?ASw6wFPXu8-k)3m)kYCKl(ft&qj3O_!KgiVjWIPRUWQ@2`QR3~5HO$ZTF zu1iW?UX#I-*AG#O7j7tps_Z@W3>z#eo%gSz#u4NBBTt{ZSMASVC&;DnGk@fT)(d&* zu6@BElk&KjJ2;8yxsX3Gogav6TWoY9$#;Dm!0C#(@vxkPQCQ364K4W{MbEnI_T5}N z(c7mB=4o-74<<6dQf$6G9l+puPMuWa31`>8S&Kk5o!EY^L9Ca-*?KcOdr?r6ZB(qCtCb#rSMdbdAwDt~gpzQ^ z-NV{UG6KE0oDD$7TTgRaRE59;#}Vqq8dwJT3K`LdOIO09?S({kk)n_3@U!@KX@*ls z#B`?(@i+7h-+#LoB>p$cd>oC@;A_}bcPqf~vh*lr`upz_7b%KHdnXEPIo^E=g&11l zS)@J*?B_NgmIh*|VjX6>`E`S#7<;&0N4FR872o)=NCp$|gq3La;$DCMyu4$DuU&1@ z$0p?IO?N!_@_r>H&E5hjtQI0UC$cpX_rh|l7ucO?5->!+7g^TJF1N>l3&K8d^zBD$ ztQsW+&bO;h9!QWI>b@KMvFW^_FI2B>C`}+CTvjPh&Jt2KZ+E#pI&L&mKjKzpcVJ~X z-V~=!vRYOAdcND^Vi#Jv?B1Oxmz1ZuLTX2{(|#O;xUI3U+chF>yH<}|Xhn+hyTH^m z12k{eWr$2C`%P7H9Nz2S_hlUW#Bq!acn;7sZ-40 z@fyWW*|#CiZrM zIi_N_+Jo#;JdXd45x7#DJ0FXd@P*ZcQhzMFeI++sKOtKxVq#_XXc5Hv%WHhQ%ik4B zGE!6rq@r3clzfD5E7Lh6pehV+rGLn(Lpd-;D^StXrNo~CIOXPaKuO;qPmY<{paYKf zX}Z$5?{LAdkDbQ@<$C3p(y|o`@!NkjLWc*WS{nvML(*W#LIY5;H&UMy6!%P-cEAe> zP&iH4MEuD`*3N6)IKR}KdF3rKPCLC~EIBm)tHWWd0x%q=*rWwA3sWes@PgP`e-i)2 z07(!5y@W9DNt-L>*;vL!FOzs&9cOl__k>akHO;McMNlpAzsMp7I1up%#a{Pf9=`ja zHdnAKoF64BL5-g!1{#le`jQ_Ua+5cAXGmR|YrQz5TQeoQES zLbbVD@Cp7!C^0)NMlNnOR!LrYTYPh@k~OwbO(k#wW43&!NjL7eBY1S6k?(2?H~YTl zA2t`fwvCZKhrbgBB>KKVTy?^8?gXzeihu+ZUH08-0YwQwY8!y-HAc%5Xlaa&;CrW$ ztJW7i#m|V6BNx@dyx?CuUgrqEu)Q|DlGX-!hVd|W*6GTdxgrcc`&?k40NKRVMRVl` zc|*D;9Y;hP<*mp%3D@GR1Y!xLHndRST(vr(hh|J+yIbStTcLEe^>f(1Aa<6>A(MpPooj@yma&;Mrio3=}}2VVRg4 zSsagGV{y&QPQE311f}}=VE?`S@ShUMFUP$bVA8%o{W2SKMtO~yaI?vy3>RJC&!Dn;-Icfadc6c6Oh zJgCGQMSTH>a}Aa;wZ4b*d`$M9Zc9#eECloJ zTXd?g0sFrJr`^$)|9@)vkQB zgcz3TQiZS=;k@b=x5+%#y(LNGfN$j5d-cH>Er#kFd$s)6XQo<L}>oJ?<-`^xb%10=L zQt5On6@MC!tJcz^$s&e%fyuvU3N2M=0Ptt*wZ#kg4j4JVnP#_)3yGJFvow(@{G1P1 zG)lBINPspsk;JSNt8RBwl<>;;Eyv9YDsGz7TIvYCiqs52^#(Kx*nD6YF%O7Yw2AHu zhOGcufm3A-C#$I|dv-2F!rsVrlcq4KYGZu@0xN1l11u&QUF+Q_SNuXMRmL&K(ulW%Y zik4cSUj5)>N#)I!Rs{YSIkSkOEayKVT;x|=}Jd39nO%V;dD zHg}2UBV-8PO26(E3Wop)@80#4AI$Q*HxTyOG+t)tyD{PM1)Fp|PtD8dm+SWWj=rMzLx@F_o3PD@#gp|jC zd&<>(PPlTw8q2w*X7&AM=m8tPzJQSl>?ykSo`6{Hwv7ZQWK z6_f@lgxI)Ru8?i0=F3G(U=r<~0$qRxRLbN8!+!7w56B+QH<|#^KRV<+jdU5X;FZpt z*8!d!JZZeyZ^Bqw5&Rl}ifMNsis2n-?ZyLn-gM};a5$D*UE_rm8tUAKBbp8R$6H%w z)I7FO9sAPRQ?SYSr$d;BEtfx1mAIPy(D$kyahWNG)Sqsqu$RK`WqAPLCkIHCQcwq_ znM=-1j}|C*-ZvT{#XCaw#W2bO3~U;#>wd>oxk0TSA-(i>wT_SR%&Lq@B7WhI)(^a% zlYSS6yPnRKhxd_O_~5h^`Uv-Iy_krz#$hYtv~Og#9gZKJ6`smZ}Cv|noX%f8ey{U-dvwK9?pBj zZQX#0(xcK1gfqS81G-BOkxQ!{*jpR_ld$9ZN1}Tz(4altDmCpPOel59)=*53ZA?!D)!y1W zrYugh4LEt(4+fs@tKAj?M8+Ewf-uqG2T;Xy;W(fmLjUz!-da&Arg+boa8h<@Jbek& z!LvWKwtt;A7?gK!BB9GmQjSOM;_TD;vgx8;$r6~W5z_4f{JMYmHg_-snNSi7lxi$6 zS*d))H#YQ-!%%)vV@Uuoc3}y^yUjjJ*S)8Al5~gh*)K5=NNy~_wT$@EtBKsZs+>Ua z$?N?}f1LX3Cf$hy-A?iZRjQ50a-^T0taf?((wF_^+x~^$pJB{5UY4f{`{^4=L@*Yr z(qp(BeSe1?CI1(0wd0OI4jFGz#bK#n__{f9I@QXtWjkF3;BI;V5sIbV7%8oeKe%L~ zXdBhLi2>$o2~z?JvRdXLI7DPF(aEH+5JK2-jWBL9O1{)mV643m6`n`Uaw%RD-e zhU9QGsI&UPpO94a6^&AniOfu+aWPQaNPDVGms1LtD(V|4xAc^awu{|403SccaAT%) zN=#JKe#Uyc|EdxIq5UeAV)uyoMYN~M*`y>KN$xR{}1=p_U5A) z2hcd<$Tf4z4^Cw>awfiwN?g#8y|4C&>GooYw;uzp_}cM2ey zFu(ikpy9aD&(r9B{ncbJQe(9%oPtpbIpW`Wy1t_tVLTAUUM&&!M18Q)WH`~l2ylKY zeWj0Hd9OFvELMpZX%b?Ga|ccVJS|fM8!j8>@vO198}1K3T?E0S zxuvG=z-eUxtqa*dy2iwy{?#P<)d$-0{0&d}!zDlJ9);BC*dklP$qN{itm@s#1LpHL zV2t+twstx~ZZqt@Na0dVj?6~xtmn|KuVNr3F1G*vdHt1uxP@*(_Eg+$hvn!hf8j|jE?KQr)FngqD2ht z@*U?B63X@B{BK)bSR$m!-rejSsphzH&c(fP(8cKW~ouv z^h5IWA^ikzk>Oj!Y^`R0JjbD{_iJ{by;M9l*>eR- z;qw?d7Jkumy%~ltr}2ob4Dl*ApBU^>JNt8s0`9kF5{$lOPP|NfAn-p6+@Kx+>|3ddfZta(sOEHq!%xL?g$pP;($ zbykyS{#;QGi-bes+}wcR0D8OBSHGmZh4Pc*)@-pex`*BlXg0wKm+HYMXja&Z*iZmP zkM-0;oG9{VNVFPBn+uPczEKFo#}w=~iBuc};ZZ%f>Q+y`e4ZtBsYS6e`F!ftht%;q zA5T>MhNmNJo!C|KCe=88(7I8eXR4{lH6{Ye8L11g7}H~|K~WC5>+_g(R9!P+)pMwJLq|m256ROY|`}p*9^y($> zd0b)r+6)}4crQJppn~5h{7>5W-vHwGfx&YWc`>eRl!85{t#`Q95etQD*t3E>N87y9cIX4>j*EG_jkFfjp zBb6u+yef$$llwJXX+5R>FjCv;k!)BIi(sQ4=`7NI`Y~Uz;20Ti0sD_o;;N<_@Y0CR zvzto$%R96c>O1!|BA0xpQtzQ;&S*`sk>)~mhnyAcRqG5riWSp@A*){nH%$i~CPe=T z-DVNNCTG+v*N5z#k+2cB$USy(vK8Jx4hKx10;FByOHwsSukhqiD-uyWFa}Q7(E&}W zg=ROk4N>VyVHEIHnSUVMkynq^EZ2Gch*O^dn3kWH(KA5|fj5{jdAgT`j`6%|l*qyf z6BJ|oF($<%1~@SpMqR^FmFZAUnVWuoAN}DljsEP5u`Eke8K9oe;o*8AH<$C(tD)7O zQN~j~CuV1FPJ3dLV2hoBD9sf7-g0lk(x^Qgw<2HK^Nu%rgA@w(w=Sjg#YM>;XR*H{ z6d&4+JAa92Xl9&Js5R==Z#2>#8Xt$UX9^yDh*&aHJ)jm

0|nJ0(E7ETveds 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%0Dv-qdX3LWII(vp;f9)ckyr6H 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%0Ax|uScf$5<` z=LP>od@@cGaGC`WkKZlPfAYfrYF0b+0r?IxTU1<=&?&Bg8k~;l8G-QmN*DQ99!`~; z78@)W%I%%@fsy3Bd_fk-)?n=*ArL|!UIBlON>FDzAAKFTF2jbvFSi{H2^4fhCTNQ+ zWh581U8-zN)~I3yka&}=m)HxFfk{J)Z0spItEhJe*RNk>$nU$}K zU1ReI-;RN5gC&r~u&4U1u9t|F8$h5VvVzbeT0M03hrKdun9i>+#=9#K-N^sdw<&zR z<5=x{x`dA|_4B@4q0!ppuhkkn!I~{+mUj%9R*J!yH~SebmBK>6I2)B*#F_($R{f=7S z?K&BTFk-U1|0CwjZ=@=-XqIekb@RR_)R3}R))?G?|HrCFeXeD`-ohO&cJl>5-aNiz zPmEphjW}W1rV(_<1uvwxD&ZnY4?5`dx_?yDqm(yV}EZWt)ok z789Iq9sm6FUtEng&tKSp^K^CUeC6!Q+K^FfA?QJTb#EDKLx_KopU2r> zEC@98{P7twZT`lWoiT$E9(e-KOv(KvLzJCH8YF7*%2JgwEA#o#jFo?ku%R@6OlD|LiTyw6*@hrC|bxwXZF{ z+?3VLD+$gj@h(k!;v7Qd>Nve;UcEF`O>Mdc)?bY{KKoNqHA9!+!n@mCWYDwS+}Zpk zqVCm^+_&<9cMgLR{NL*ZEV|yVme$#p79HP(bHYuS65wxeA5UM^g>EqqPE1@no17+v zB-9NZ^!klgm`sgo1;p32y1Q>m6z4F1uNq$boql3yex2#WDexRThg>Ql$6e~+)z*%K1K+{Sr^VnlxKZrjYRh=a%W zHrND5@M@)zxTFDF5IQ%6wFH(J>pOXhZmOkAn{9M-O$=ys~xvpk1grcx3MaTDyBV0#E%l?udH9RnX5b97~h+Ylp zM(LvbP2G>1u=W39GzgDY$vsL(nd2XiuD7@o^B3`3{NNkP6p=4CuHir4nU%f4B*lG$ zNw`Y5ul?O@;1PY{Uo1OWI$fldBUSLbi@Z3gD|(8@s7j#XJ3k@f8Vd2&+VXeFd%B0w ze^Yi^M1b^vzE!R(AbaR@bEInBEmyr{8vPcrnDw$irvuZ$!*_Fvq>0*JwHPv+d^XL_ zStInlQ37#!%1(ppgrP%7xy`pFrw8z3=PIhY?P+%ncSL3ufrOLU`Z(533@`k}8C_Um z-u!AR*n1*X%C^pPb$z1J5^V$ukgB+ch|<_jy1Uw?j;2sZ|R=1 z@)L9sKb{WdG_#i*{gjfc3I0ov+>;7WfW5ac4i5@ZAPV!7m7m*G|$Zn`{cCP7kIBf|X4K;4=)=w8Dut*nhSO<)K;CjXAQ7vV$8emdw<9ky9 zcrU zZ)Od-tb$fWUcu?X-`bQ4vlCH8kA`?`|Tw_TK#vn>1-_hD=+H?+Uk2Qb4C2EF|x7VNS}}^ z$mUyGr5_HzPDkA&a@U7VGsJq&^ZhGxJzIbSaD!@%wd>ml#3+@77j^Z%fKkaQ&m974 zsJJ%8YuK8D+wF->Uq_MM+{jCOQRZBVTY2bS=u`>QwO41@?}Ewj$du9#2kTn~%CbpM zn|m9V6T2+cgLcEER70N$CQIe1<$TrVx!zj?8X1A_z#QjE6VQ1oJ?AB=nAbO6pTQL5 zJ0;%?rad{xDNvPDO+BRro@I#mL*%YjhyCCE{-s6W`*de7OQ-W(!S-|8PWULz*A^>g zzSx=Mm0-=y3{;4?G?sSG+AZ?n98;cMIx8-EC!%BAG7FmaoUNlh90m?jmKSas@Kj;y zM}D5axk?I3kSaHBmKzGO^)m@tz7Q9jBbuN8+$D`9ltLWj z;`$4D53SzX;xNOzM>7(8&b*aF8L1L?XY$tUFBpprPEH9yw}$unla~bQ?ggQC`u%FF z>b<)tc*idTXKB?R=ybSe-+3bXYY2)-<~>@stCX4A*|ymNj31KVH$;UOW(&-40c(H! zTYUIbHaso#{0cvLC1Eyc(QK{0H3M@sTXqd@FxU*bebx$SP#f&oM-pf^lX^F$ttEU0 zb8Uz{c3YBtyx708#eziGf8j{yzJ%JS_2gFlIF*3rhuGEKl@;GBlSmrn!YTKej6Lx3 z!BeNhT4ooS-HGIw^v9th49h+Jl?CLiLBixi!_59B7NKh-_S6&=vS)qzPGc#X-%QPR z9nj?Q*^tITuKVgU1VrkO7shx0NhkQ_Wp>i9OKMSye5@bya2vg{eD6V>&DvH=Yi)ABzQqt+ zu!Db&y~AFEfuXy4$nO`3B7yc}Pg~L9*F5Ac;;QI269$)qK3h63 zHbnc!yR^;Ox8PEwj9QX`ui_&=Y^ZJ^*@7^eX7yUMeCtL=cO!ut!7<>gAZFFmg;TZr zf-?{0@|L+2^-1z>+>v=yG7$IyQl(v6sF_vwr>+O#Na$tf3VffRqhm>?Vm)*oEtjYG z^yd&Hl;Z?mkY2ntO{rirwA{#A-NrzpXVHgkXTP41*GRk5y0hYaB>5!-y5d=J)TLdB z`Z`>DHAK6gdkapw%_e52Bgb0jvY43*0ollb7=51Q^~im0yU%To+3k_q-ah>!QHk_L za|Y@#bR2C8eYDmBE-V`fkiq}J@F%zrmN3fhZ-(~ z7|XogdHPYk;t4HyqC4H9ALW#0&E6Zg0e2WNr9mon@Z{AHHKNRzey-Zbvgs3_)M(XZ^ z!pL{`5}H{DkkuRTO{7!JppC-B^4Zc@HDA6Z>_&)c);;9I^I;>SqpahxbdiP_u-|km zb)oCLf3JTde;_+GN^edM)s_hp_b9`!`=7287cp~TI55t@iWTWw=-HM)=cZ%-(?7%( zd^P;TN+a6Y+49N6Z$-=NTlQ4PSIg)9-=QlezM2+)b*fqTpPa*AOyn3vGF;*wCEY6N zB1{}kZxJHN-&g-)8oVDvVRiB$4BzXs?dp#*4o1A$VkYL}ccXiLIRUR2?9c#ZF9xE! zHVY|QsM*9Gj1-j(#kLGU9SxqGBU8Bb0-N(F{+k@!P*`ODWqVq1!%--3Q0_v;tK z6?h_i+OGhms`vfmaQPyrmGGvFCA|W0AWbk zu`z|pEwhJbnEykL4N$IJ{$+cr&g4T;ypjQe56RqJV)=+Iafij6?NhS54=5Ok(;aN8 zx*Nu|KD2A_kzqy$@5Sb>vH1J-GpJCS=+SrRwe{18}QFc}v-#?sj_6RqBWl z-_q%;2`G@BkZDB`SVn}1_xW^NBQIMdVg)2fMCt@m8AToCojbB>REd!AP-IA59nfaNem<)FSm7 zf&w92iGDT@IX)Km(mD8A-3oZUDL+`B9?mVYa%Sf-Nxsq`yV;!-I7*DC2DguPkd8YE z#Wn~;3?q1NSZ#feG7MDy;jz?5oBen9IpfQ z*#x|D@R)0+PvIKLDJs`j#ZGB6Tg2hx?`5oWB?3;gn;LGdEr)-0iTjhRGBs1jsL@gO z$64OPcrDJ&BtR22@XqsMxqX@DWc>4WQdWky$Nh;GOi)nN8Y}^S8B%M%g=oJqd9|b!QS0B3oCU&V}vICa(E)64f``hLPhBG8p*u#t&ee2~1O=9gPm_8cfRO zl11~q?9A7Rmk16&!y(qv>sRA>GcA5fz^##!8nePom>hQqev8(%GitbuG+Z~$1}1nv zKqfI{2WjF%NdZ3j#Z4~ymEBZ%?ZNed$W$bKnc9788Wi4 z2i+u<{Pe%tGQ}h)h(t- z+0s+a>@MzXkuz3RP`LKOen$&i^?LKoJaHejq1k}5iXZmdCz#*c6@55QLNaPI4Y`yv zFU%+X|}%Y#||8pnol9`9Tf0 z_WOJweWNpP{l!Txg_)n)>V2!lFLQX^7m*q?F|TG9)KhPl0m@$7&>+e%_5(c2poMF= z^WRD?%2}ofSBf|WC_{g0nK+MS)6rCpJo^|HJ34Wkl6?QCAL2G)4Bt1SX5Zb+NGSk> zvO!nv_aH)JYv`IYXgx_KC;x#WJ7`fvC&Kl~^-9g06O%bs`o57Ec9Y}I!<{2u{#N!8 zt%nU7%R3{NXIY!ydHIK9MNDxg6uGTGT>>w&mgzbQsD_#HBH0jc3x|O|>>EnfDyIa* zQ&gSA6E4>IE+7I?0Ou+fW+dHeM#M7~1Dpj~H?n0s^3^!xACvsqA)gbgX`L0Ti)Lq^ z@8yHtU+vmaE7#ySQxh!2wv)THwzJi1_wW!Bf*6q z>H&HsVOF0g{ZJP_4a6XzCoI@H3wr18#9ub6ewZkp`#lB zGq?Nv+o*Wxu6z&Q+F!B4&b0u+u4Ln-f+{vTFv+(mD6u97URuO*7Im9M4>4ENwtWlA zDIqyNCc338UM^L!jD&x#h25&cylJ$9cd0{w}?k^7?^gdCZ zxok{Q$uwR_G4@_x>o6=RfX9^)W1?k>w2RU0>nF{u2>c^7#}kS93Gul%zs)W{Q9_0H zi$>{anhy`Djv#ie%!WJKSaU)OE>h@gmT8ENBPqfFv`@w;wlUps4G^vXQWsgx;$vne zwJTiCux7;4k-gxH&p(Vwbw~M5qU15=6FIi&;Y==^uBVvs-ao|p%x%CFjx|Yexm6qrizY(}nhd0X%%M7d89~}UO(yE_${)o3V z3pm(W8~9Xs10f|QsATp!_gq=h^!m1)pkDMw z^rPN<=@Z$=N`r36=p$~ZE<;J@DF>O0kkJRz$4{RJiv7slH;?fa-%TLCx#0I6s15{v z-Un0BVPAkcYrw#l`Iifzw`dk%iq+^1{H=FTtaMkFZ@TGGMmTMXd9(i-?4)6%G?>sD z{7LtG=T*+K3e?b{j$uU4DRC3 zLUEqx-o$`y8nGR4fHOAsUyaWuB}0jO5Dsx~S}_dz9q?1l(-L9#kfEz*QU=Gz-+t>U zDikn7XoTxPsZ(|Hdd)-V!H~8t1pqGwiWBPkU}bv@b>xF9zt+1iV1_Zsot)<4Zy*FW ziC!Jx&Kf#SqZ%2@mWK_B%WrS5D0BRj?RXqfS-@h^=;aGjP;al`1_(#rV9bupH8ZLh z=>%s}DgfhV*8u7PA^9_k2ih>}QPh+Xi zh$6yhMEC__8AC)1KY-TRI$lK-wY8ilV6^4Wi~+)|+ODSc{ls=tMY5&hGGz>DLps2g=q-cq_ zNJ%?P#y;1-&tF{|fQd5={C!D&0db1>WV)3-m7tc=S`2)Lcx(Di4o9oa;$*m%ILXKL)fX zc?D3YdKB;q1|;RAkf_d$;tt^_buCfVrGN-2M7MMJuAhAsbgtoM5S&li?M>;p0l3v) z(UE`WghR2auO`U>b+stJlp+H3Kpx*Gg1eJ^udTn|{^3R>KSeuTUvUd_q!9z4-SZho z-vkdf{t)tZ_ID&XOJ2?M{YH%Fj%`G`vb8kDtKIk0(9fpGcdL1}XZgGF#J3Q8{B`yA z%7Y7*dji|dFT^#k8iXR^8S-)GLiQi3Mo%t z2#^Vs8`twcN%Wo+_#%HPe}!4i-i=hGoE)hKtei_aU(7I8HfaK}I`(Nl6tr;T= zrQBnssK3js8)bCJ7LZ%AhX0lgKDG1zu|bnB@Uq@^Mpbq^bH)<4+M-X`i+FFg$d(vA zOd&HW8-140>Ae;?VI)QkiFr&{^^kqAF%Er$*Pvn`SB75tz8lNF8FoJO%o^*tuo8Y` zf9_BG16XCrDA@T#^Ky^PZJ-9jNdK!9E_7Z~+*2-Lk@@sVaVW}L5;WJ%-f?JpXH+$t z2K;n4^Y}>i16tVD#zRwgCd%4V`a?|LgX%Z0Cy5h!gjKQPjN%(23@th-Hu>Xq66=Bj z*j*bB%E3GJPF7Pg^*UBnH&8;tHac}KvuS?HS8AbJy(w3?5&3?kXv1q&&p1Jyq>d+c z5F>_2-l^W@F!7~qCQ`MRk&`Ap{**hcke$s1Z9>4p`khuC9HgH$4oYOh~A2a~1nJjfJIk#2St|*(G82i@jpPKZN*N{cH8GB)0Ln$w z)#FGA6@Dy;G*bwB>E_I4DsjG7p-GxOom9UGP?dGN99k5LELXJ<@3?dtcX*_C-8BONkhlE=5-$z&}O5-7Pwz6Nfi5YZr*X^a#5!h3oTIO#5@ts4SPsP$;u_DMaKO z*M6qE@2I`}QK92ojqQm)V6<^`MD`OUjbL-e30%WIf*!F~SS9d+W4P=>d%?pM0Q^oi zWE2H{aUBHWyp(Ebyh9wxde)L`JN39yUyhY0)TyQxHS1Ys^@8YY%b!;#6Ozo7Cmsk- znH2gtIox|w!>7+V`kqz&2%))toS!?9o-amhNRkQ|6lnW%u^^_V-NHWicr#ImYsOc% zAen1ai9JJXWJkX)ahfr#6ZmSZF!ZdcbmcCs?M;B1zFfjUeGUe9aT`k0ph*Uw80}+y zCg1slDPzd2brke+SlZiCm$mzGn!PLlOUa&2ZNpKa>tk`bm)Y|3-l*->yCRaS z&oSG#eq<8EH(K0c5BcMd4yUS?Zhh*jQ- zfx+5i-z9n+RPIyVpx^Cxau+#budc#_5?+^mN5WP!syZB8%`FwdUR ztW)w6k#N17mHZL-ty~s@`ZhLZ*xJ0+XIHO@S~}bX%TLDQyNA(I$X=UOorv}J2GeUW zxV(5&c-ZOLe|i(Uv>5D%Izp;js|Q^jagGy{8uYz-mPQ0)8k_1%=Dp|*mMS(ZlPW|Mj9|3(pJLFF>gUD0{lyo z%)Hv2LFOfXKt0wd?ed!KR7c(9gu6Gtb=JSiKs2?Na~!S4OPfUv@(sdmRP@Zo%S>Y0 zsLj@{M#%*dapiKK^s{c2I7C_D8XD%sNN)G=1%h}F^ly{gPK1MtDfwvFZ65_3cfMP8 z$j!P=u;YvX1h+zl)L)OC9prVN4}-krRyS#tMmyRS*UDO0aKsI zGLC8dQ8+R@pS1nzyLKh%EP0=ffW~G`O6vL z-=ikKsShfD-zjki(}NoI8Vo}MdFF2Ta&h~D3VQ9Qq$BAw7S$D!uwxaJUv$X2k1lS% zn@t2ff(ni7tYlu#6L|=79GojiTA0Hzv%u{%$?0P>o2s$dMN>DXk~I?9F^b7uG1_M%TXc6Iu8F_5u)U0}Wvpa?^X` z{&3JrAQ>X>Gt6}SaEK2rcCC+}SXfZPVH)y+t|0LB{QDi5(yNfJf(ijLvdKEvr=|&v z*A)xzcad4hm@Wzl^f|Y1LC#)-L;u*{yhu*x4gJE(HvQ^!U^hM}*#I|0A?P)7AkLX8 zuP9EYLR;WMKXpf_Dzg2~=4Gt#1MI9eWTz>cGE(s&=GRE?@;7o$9Ss`j#NygJ#!+e+ zj9u=#P|bogeliSA9P9y!zjDV1>|xuX-W>G~WrI5Y`SI?+V3oj4=J7RjWgRn1#Ls*VE}D&u1<^6}5@wIBo-npGZ-<98=RlHptjrN_;8BYDz}~NyYmaI<+?3l- z>4h%@8KT2u7X1FKeXCqE1<=?HM~-wx&HD*jy(eZ|P?atA%@dM#Tl>X@9;Y@7^c3U6 zd*_2wWc7p8Jxg*6Fxy_G;k1`;~^a3q9O@56M% znOHYV-Q#9c3W_b+YFMGx8rZ!o2zEOXWLwP|kvt+J&r^x5Nib%s!PPy->gx>)GgYU6Lar2f7APrhU08t;aW;3E3ukVE)`jU} zp_>SxLmf!B!9#t(fghGWvcvb+)lgoiQ?RNt6e7(T;ba*06U4=Rij?%U4r)KZ+ZbGY zYB2|_(esD!w%!$Ki&ZePIBS<*NcQin5m=)_0W!|Btb`SX$TS3bKR#VHUxh5ljL3Gr zc%g00e(m(#!)tpdB~&$-*k@a_2}0~&gK`4F1o|g6{Posz=E9&fl8BHUchILPf9o(( zD94nFM>h0O**Z<;SMnDvz?}QVM6|a@7(3wf*(3FiU4OX%_8y;u;W2m6^-qVnjGqcv zxvCUs5*hmznlom53fAnW*8isJo}O?OQbU%<#(+Hm)Zw~%0B_{lXV1`s!)G~-q3)jQ z;VVCHEO=*2!ONcQ@eFA%CD??Y<&5Kdg$8$eqPS(L5k3x4f!6A>V$azWh;pTpTUQ4L z`QzG04ra5KR|#6k*b}S)OqPhJxRf5`eyf{L0P*HwxzM*sNr>0W!}qXJbPB!2YBbK> zPypbak@{l3!lG)I)~TY#7hs&;BUgmxCQ;zi4$Hhu3Vtx{&*SPI8wrXMJ|aMY-G>a5 zvU5VS8tVdP*{%H(9)CHvV40fT@4IhGG~62(uqmS`;4 znoeS}lfDL69wRaCm`x0&@@KXJLPIzwrrO2Uq)*_Z_3ya1?cQ!mlfrGcwysW@&)VfY}~@T@et+EmmiMghZpj( z^dx_^QIT-H)8+ItmB9?!?K>x%dP2}sVwjoNC*s$kBql}U9fLRsS z9`VwXJXHzuD&Y2$>!>d)89eUjo^4gE|1^Kjp=Ym&3?z%k#G?3ztn=_#!pBZm@Tm|4|zC8UX;jC`L_*;pkuA%2sWccgzPdbp&}=dL!Bg@aG1 z=hG6Cf4rNK$DA@V{WFh4sNO2#B536{cSW4d$cgzKg(Kr`F9F!0jD7BV;{(cX`1!qQ zuMX5m2bB#Y-W0Bxtlu7JS*mxRWWUEYDErB)y!VVN1V<590Jo^MbAnAf3Mr*gwWzP$7goH<&rdB; z5n4e`e;C_NxBaM9LNR6Ke#m)K;-A$zPoX^A)u*Wp1q#2ER8M(x{tdeKp9z~(Bn&>R z8YJrx!Et(2iHsSxCFwKKNqo0Z<7$>A@j0>)TPJ9uj|K~_98NC&7J4lu1otP))%gQt zC@+>xZ}U6SWw2)`uzzmxP=qPflJ1>12X3bgJjE3lfZA0&rAa|3n}K)!5yu7jg*h~c z2l?d#!-w3s;RTcMwes%{*p>ab`&GBj0 zvb3wS=S1Y~MP(?h$fF~C%hzE5Bb29qM?=p?q$x80XxCr%HgWB+5Y6u#c9R1L39ozi zN%B^c+BL1LhZ)bAR*i~VePa~_dCF$p0W-7OzyK>ErQeoiHD^O{Itk*Cm<}SqV@ht3 znTUMqNEy&jW;*FBWrJ&=uv@jP0T-U4WZzP%>%z^UH$Z)=+cbgF;KXeYNNr1eZhK5lhpNLtF~_n_{+gJFvD z7MYFZ4N#^u`;5^8*&StbT(%(jsfG3MXKh`}0wfp=$C;OO#NRYOu}F`@uPLV^b16ej zCW{uxgV5yHkwp7ULM1z0xQem`m0{6Z%^&t2xmk2zK`=@EPxih+gd3KGESDBov3bIf zRqyfvwmz9H)*@5VDBx0UmrolxtA>)3-HW{pvRlm`4Hc2tK(#eJ$q{vPVU5#uQ;=86 zk(`pyis>*17@s4?wWTG6C}MY>D1U5X;O=dF@7Hr+rk^t?k5ZFa&+bI&RjLcf)gN*e zJ;w%;^^R7q4(~DtbraQk4@=?O{XfNEd=~T~{Uk$X@&``uPz!RF0xA<@g5h*({MTXG z+uRt^!TW>cV0B%Iy0hHpF=v@`66oJDo&KM`T-h(P*T-6YRKfY}9_2&*Xy31ki744b z1?is2b)rtuS6X6UR(@j77Uh4?ddw3=%mFvPjyjBy^%*?-n2V;bUGqE;|F$I=I#%?z zir{Mwu!I?7XkiJX`e?jTyW#)+blcA6i$|FVH|lJIItHx-ROvceV?d}N4e-JDz)X>% z>D~Slhj^8|4t8Z&v_}@>3A*JxmNT|5cfj<)lQ{bmWtB*a)~0mBN%+5sWi_AYTYKq= z(K46L`dm{pmfDLGlHBjRW((>PRyy0v`1bO#WyC9jPQ&cekCfm~x6U}&{rn3$QO7Ht zPZhs7*xr>D>246;KK8uYaEBb%Y{m+0$Fu2OtWS*NaqGb;x74_HPsME*_Yy7m#0ly> zuc|{^w#G;19+zj#VJlzIwGCGS;Vk@9i63yq$#*Y*QanEhyzporIVd%r{>YCO2=aiCyYBb@?Pr`Lcs57kblLFwTv4fTx_!@#_f$CzRrgu%D`%FZu zpY9o3$e(X5Zh9laUGb)jG~Au>&^L6JnfD^er%+hnP2LC>YPpM7H=ol!fZpmrKU7aE zrm`i(Ri^C};$&3U!Qx%5j-7bu<*mQRdOY8;Lk5j@+ zM@0Kxu1dE9WSwqWb+pmhE&5=Jna`@7B(F_wPgM4xheuLDWf}TR(7~iEtNmt&=-x5T z0H9o?m6bG40be~z3d#<G63yAM zcrL_kud`5^DK^NrAjFk05D8v~i8?HOG6EcIfH{d>^C;FVb+`o5TmO zyA&5ryJMRMWs8)yNC@WzoHFLWM!r*|$zGj76C@g+>XVkGNe44Jf~U@^C97Ke@Yn@E zhKx=t>bda=r^+?kPs9{JevTP+q99LzkJCH=!WQ&rQzkM)@!^>#8V&uWokaXDoYK$? zqKI8LbkndrUnzc!JJGAERnFG0EY&C+*=28tmhcTK9-begviHrsn+;z#g<TvQQmyU4S;J3isNJdz1$(F2R?qC;PT^hyHZ1u3u4( z{&bwd02KJT%1GP3*Fx@c$3opqqTQ#Cos?wt$Xn+Y3Mcn|JpN@^t=&gdD@b--$RpO9 zjFb=b{Az@~GDPnE>IR_@co;8@SFdJ6H(vdc`RF?HQSsc!_9J>WG{E;5|Le*v!p z%Ng1%&Rw9HfE4|UX1N`A+wna83TcT?JZ&V9b(M=%5652A$EP%+5gXq^evx0F_(~)) zO%Rbur?fBcNK%c_(dCZNYYW8TYHpc*#>52Q^R7;5r>`lXfSkloH5Op_LDsZ092C<$ zQ}8%3y+*I<`ZMcZ)^I4lr{~GQpa7!gHKp9$O8T~GmG%gz6G8kL*fJ$zS&~C@S_>25 zkMO3=p=w5CtgT4X4}PO2rXcY_<%r0QSUeya?6Kts&@Jb&o~o=_lmHbZth+yke6BC@ znNiKmwIYhVK~Xh)or>R#ZsyS)*$)0K&AAmkZ8!96jQ2dZ0zhfBSF5k}a+S0F+4oSA z+^e$@`Jr$C$rwZ8JKk(vHC`}<$%yka~e(hw6k zHG~0|QLpXEG+|^F1M%hOB(bJoRw5mVqb%cGKypBQJ5VI?Jmd=kvFt$9RhBVyzHh6I zYNzXvof9Tizr4(Yq_jp+vt&o=0K6HD1bMawmKkLl1<*H=I$I=ICD$o{!jUONx3;+o zg~J_4Uf!fua)E@t&(O~=+Ak)JqUxUO>>sL+jD#yj z@czx3wJa8xIXn`L)Ma3J)}HZn&qW}TT@KU1>ot$6fhxZE7!4lUd3nMpaw5=r){^ln z)Wt27`N~d_eR(jSW6Y{Dw*6km3#>TVD9!$=1m~_WE?Um+v?3#(2^Y~m%KIyiMuUY# zM12z;18q2V8a^2#H*j-jcK@pqi%d?p2+_Lf=iMT-A9*t3scsr1=R%Q^1j-EKc1?i} zv^C;k7Y#o1(Y9j)cS?_d)>uvKhjUNo2z@On4s$hA|=;W*n7 za-0n3f3;h%9*ReR3CTK1GKpyGLyWh;x@`s|%lkGe?hqCQCupf%9dG$t-@=Je=r4kH1lK%=ng2(Ro8F=seZs z;(#H=DECvF+>nzcuxw?<9_bAW4BnlSAwo?Eajgd(;cWtICFlAu8@!C{&;3Y#y!dEO zDL$-J-+eHQ2qqIx`Vc`Rd0L2)X+LFvDUG5b%im+Yuay1R7dG-7BfY!c;`^65VB&&m zAAuZKUgM#EjzDstFUVCHX@L{ANK^?tS*WU7b6YIw-Fn$T$2G8R6&aijWxq9a9)`9E zsg#u*79aZNvd9`)yHc!Lj~!7P%g$aj_(#E<#39KOzuhIK^b2ZjXpM*c)?};q*5c|i zZk;t(+vCag3G*=Hmk60vo6EFv(<9mR=$kAV<283XUZ?$j#z(K}55Kmb;3=^Ci&M2* zdD?&Mr?7fl?09h;<7-A8zRGJn7^tN3n*)7LmN%~N+HchqQ{1JI0D+i0B=@EvS~7+O zy2u76Z!M~pH^*}g84LG|t>t+l99oLG5xpxBGU2xT3v@o5>{^1gpRb3j@f)FVA62W~ zmI1!5LYmijETBDD6@WVhJKe_z5+YI&mOVWoV~pOvp}W?Pf;EZnfTHMVIMs9^NH6}l z8a4_eD|LlvpP`;GswFrO1UkQ?XgLPIg+Ym)aBg>12T-RKGR6%a0TtbpMuj3279w-l znTSWC9@naqbRo{1*+h&E9+NC7w|dXVD}Z<=-Eb6kH(rq5#}T`x?tak}K1za?^vH1| zS<^V)iOwU+Y$Jqk6Xuth(ds-@8P1v7F#|8abr0qq7Ve3t(_vTS7E`>-Sbixr}d zmN{lUk6bn`R)ZRF&I4GZ+@Z<0HXuloB04bgRP+MRrMn;|?RdYz!06T8hCX1|fk7>C8Rc7%hA`vF1+CSFOZ;KGAeo4+ zhkX?dUJ@=s>_BEt+g-3bCN9ztftz64Vpg{7mTTZkpq^5+&Zn$E{S~U_=$DAV@A($F z(mk+W1k}cMB2Z8fRKcBdvl{v1533PJx=KJh-mPx*3XZJ)_V0zh_V7c$2=SZ1nB@hn zs*qQ;g_lANAH@beUoJD#kzG^`wL~w=fdPy!&MFkh$c3d+ka|%&Gz(r~;LhMaL}&X` zGCN%c55>DAZr{3sdH7U`LIZ(bv-I^j);bG}p0VKxEZ>)Ga}HUwM<;<|z)$qWa z*HR~saobkk8s7@-|b_P^y?`rjNny#(5*C9V$Yl7~>oR>0`(F1yE$?!C?M1 zlB-}p^bmOa!`Ens5t~+KI^Y*hb-Kja>44F;aq@8o!Te|l)by_442d(Ao~%wsfXwL^ z+{$>buQ3S{tdvd7z}FF&=l2Sxp_};i{B-Llp(o0=STSuRj&&$&vySIKi!K#JXb6SF zKtC^U{y&Iftg<@B(}X7X*S286o$R&2^1A1pMpxKA`T7x33v%=9%SrET(wXK{F4usm}@-RmrW^DTt%L^(sd zZtK#G1Mzt!%V$V~#nKY$L66+-<|6wyBG&E3u4tYqO}1;-2VV>PEU)Ls34PBV`5G<7 z_WG&?dzN)%seG;G%K7RhT=)ns z+O|ev1wq`1*bxx1P(&%xmCm+H6{MG_^e#2D5F#ofy$I4#X^Mb!1d@OtNbiK2ARPjP zk`R)R%mkCRsimy+)FcPj$ntLYy zTtsY}1{4e@&jx_=ekgK=34HZRHZMt>fA>q$LK%xx+M8!(ce-+Zc;#>EW-lh~0?M;B z{Cb_XYn<{^F|aNEYpX4)Xz|1CToymwyB-Tv?7p^hsoFML`qRVV=0N!6HRh_m_TRwy z9VFwnK!rP0YDuGFyEL$$N|H0Wf%0V+eD&u){y~-TaSdR7k=gM1^6e^@e!3^+3zRR1 z2XGjv{-S%o1NMKwfxQO8OVsXC*|F_>%s(v|b`2&hMET3|b~16n0c2l8hQ7<#<_z}}iPm=W z0p;1Y!^zJ7q?OlepcWr92aZ1S4@&0$uOa5~_sk3DjZ1F;eO8?C+)h7lcT(C8I=mSQ z-ll&GEL-$}AtOP=!YR3Y`3BH5&SgP#0Q4h;WE|MDf=S#W3ed;ww&B{Os@i+-hVClQ z*3z%7yZi}_*~|B-KVh6JdIvqV8S1izN!^AdGv2V4%B6636pLh5V{?ca{UQN)yuh*#BD$OC_Hxeqe?l zxAx!gbvb^Oz9VM1C+B~X%iCN6Gyx+&(I!g%12iY)1J7DlW5*u+gVjCxYUS-;*w)$h z(;8GtfIcr6M=+eb;HUp=bJ?~3t8MUKA_j{8{!7IF79sy7;=jb(eGVcFRnBI~Xu(c}KBV^H-sk|BF z!V?ndmiiC$ZLn&F(Qd#5mRWwpz^<@z*LO9m=VYKc+&7z!A5&JaO#pfmRkyeUO>*!&bwP;!Rkvr-pqzqQrrPu8`Y`W#J?4#0R% z<~W#k2>t`D$rY?pl6D(&(W{Ph- zQCI4W=F^uG6K6y*9-r+MFOu?W7W;f0+~3pMD`c`0)num9IYVWSuff??CmLi81es4O z>?fcP2mK+u9oE7PYB>qPKA2G`opBznb|olB?pDw8IqJZ$Z(wSCNhE<4X@WGF;T#JJ|7;(A-j{CtjJ=1_@s zj(exPteJNmX?`M9>{hCrXA5?y($&J3_Bh0DqJg8=y;Ct^xZEjOQ)xaE->emII-FOz zV6DX7x7H6=vtF=;Cb1r!apJu&zUi?bl#_`qsFn%m@w3-(S-R@NlygOZ5%4|-gLnFDnB_XrJw@Issg7`Khcds(9B3OI41PtQpMmpS= z-`1-E?57I#9$J?5sHpnYK)6Ly#JoIoWeNXSEZ~wz*zEb%mN=Fg<;|}8OAn~)=~O;X z99j`s<40U>AsUE6$5o5WXB@fHd}e$J?tbH|+H;WX<};Ts92zE`KQ z3YC))^6Q;OHmQlu2$F%_dUpFfP)z>L9%6B6!4EY?%yfZZx#zX$Q^-3;*H?FstS`Ah zb2dxXh{I(L>n9)6H$RE>23tJ%NJJ0~-l!!Ei#^px0Fl)Hu;KBYFo#B-^dLMDQOXCw zCPn*{`x7D);T{&oHNI*A#6)u5}hP-DOReXA`XC>_^R12pOuqfIsi8@^qw!7nLqcBrc2 z)`rDfX-^^pPAhKKLf%{s-gxtB;`3e&one6cP)>GV$^eIpwU=qRKUKA)eZ*6RXwSF`Vbi%te<=&k*S zCScYAwT_$noJ_Jjlfl`jqXk+y`-Iq%L~Ohrhu5}d2{vpumPX;P#=3sH4i@#qj^?)6Afr`|)o2{{R`(|CqUpZN`ewbDP>+S-HfQl53n_u&$(;i)Im zs-$k`DEe(=ooe#ZL`CpMY4Q%dZW#$6e_oVw`80#S&Z{IYVqC_Lf|;;|aXnC%v$=!w zn0ach2h41zyr>&JCCL; zYt?ApE2pvttQ5|7(iXMW)YtbMN>l&Zfe1sV(KS1jD5mC5I9HXa^YTH5nD-rvN-xAJ z`yWkr@3|>BV?-OP0*B&>oteqbQ&85e*%;s44a}<8HTXxDu zBR#__wp`fkoiB8&5U=5GlL1&9@ zM4TPB!b&*%Bg^Cx6F6p&QNZQ<#8{>$0C)Qdfh zP)UqnKvyk{L;||G=_5KI6I#b^CmqoxP5JphXn7$%zcB($9xfF!<<`eO@-<%sXv_{s_;Rp=(8UU(!?6t zW0kWJ+PC>yCwV}mxBfsWJ%NJ0!K&}9Im$3@G0P@5B?l#LeQY^N1^G|JDb%NqD>8Bg z94whdg0c8VLO~~6SXId-*Ec#Ov3`wVv}X5#sZRb)8aufC29(?#+sdKU*(vOVrPr*M zdYHFmg39h)_dU7MEplikN0~M><*^R^aFT6t>`jZ`);7kf?K1|w!dHF0NB7&>=quEb zarAZ!5}PA4eUi#1>z{cm3Nbk7e&zv{PzWj8l%xl2e3;GKf>hEs*Olpo&sE9y$50@s z+3E#4LXKhaY81j7Mrj6tmv)CL_da`mz8Ap%8pfpD@g}>%ruMW0h`NxFw`)F>W4OYF z_YDDQu$5S{r)K42Lkkk}oi(Te`6K0lDM~8SWmciyU&kmaMNWaMWKn2W>-mNegjXCeB6CFsMcwtSHa$R2>79 zp4H=2dhGpsSBK_|t#C}Wt7Dab1ZULaKq*>gr%lw(p&iRfm6iUtdAIQrY3OIDG7xP0 zr42E0L3qd69A(1IfPO=kiG&1$oP_0@Mzql{{tCYM+#r2aoX$$5PFO@1`^?=PlPq+`KbtX8>?{fkNL$5)YNWO(@W=2kF_|W36R3WiWk@i=!v_-58 zu8nvfY1vjpD&urb2bzSf-!jUt#6S}EA)zwo7?!4u7!ARzMxRbHq~+!Be=v(6TJAdg z$Iz}y1IX+~mamA3NmZG_svJ_;r!FeUdPwr=mkGv^OEyFDLd!;Js{0Jm^a)5sZ<<;H z`>etJyN|XB23_RZ_1666+gXuwI)fZ`D@aN(rsWOh4YOn!l1@cxbt)16OoM=gO*-}b zF}$+gpT~_+;Cm9t+EP3;;GSpPuoAD4iXL8T8gK~Jzs|kTHSiJr_mvitfdj+ zEs|A8?Vj1yztm>5bxYD}R=!+4_DErVk%%91k{q#qb-FAY<5PSO6usCkvaY}9L3wY> z4xVIvE|$JVHnkX{`VpAo%tiA4hrMnRhvXEsGq5RcL=*P37=iV`z?|S)yE|6BuYR|V ze@~zqJ@)`DvB0w*(?*8UT4bF9&4ciAJd3Kn@W!|)%UKExN%a&{Q@hpa3-bDI9`d*;lZ5&nZysf{kzgl_*GPmossp54SSDPPIzMA@+b0$5 z^hmJHGLk~K6{w=kx#gHiy)1j%FE21R=J;yF0bHT9CFgSgiAZYU2*kGWJ!*rtp+Kp+ z+cT5^M=_SBkDXW!gE}c`3mXK?YWOTZUXrOT;3v(7X;fH@$gAR2b}yaFIKe$#lx#2{ zLtZ+1;J~I<-;MNXV?y9hQ=Yz#R^L@!>(ibKUP*Bzq0Ieynddx7KuceWLadTP4OK1U z8Nam=DA zPb1fn<($1aYL2E3)|y&lsd7&CTFLKE{Abh`OzB9aGx~u%bB%SsgU=>Pwmcq=EX`Md zXbGk}O5miiR6lS#KE4!Z$IH_TX`H*$z4(Ai@-}#B`{Y9ePoW0mI5&}_`Dlq|Ymb9| zRfGssX+(=&)S52&*i zmGNrz9IceM<)QeOI|M&tT)Afsd_Rl%U$DaN9(-^$!@N$)P}zCZ(CEV&6P75Jy_dFB zkw2%~dMa^g^1QyDUUP?8wI#XKZY-^2&=L-eeCe&$(D#~MJp@1B-Vk!gXQRqL;Zm=U zPyUd2$JY41$xrgFV_QjS-R9Xk6cUt|60Lqr8QpG{4I~?Vn|1HabX0@qevYyPCjklq zH)vuv=Y{s%Mmtp{cO4`RqetR-FK8FmZM01pawaVR+0gODsFUzRJ5X+$n$?zTce!&> zi=Iw7l&-)Ms0-5m4QVOZr0EHLpk0?=@eKjSFss15aYQ~g)tpcl>@Z_Z5h={Id(SR7 z_i@#T28?b#r_w3ybmtjHiPzC3|3a7R2h6p$|G@U`FIB#-G@a##nhtkqkM*GC$`GDR zR4b2o4>Dz%f`fLw{+PtByf$Jzb%X9YL)A}8M43b3lc#Z8J$ zCx`}158!L%g{bYDsj!ZcZ|YryIBD+iH#fQDZ{~H|O*6X$3N#Dfhg3IFb>D}ui(|4|>@_@~QndSxq@LMuMZ{86_ z(LSYjQvBRkeact7p6&S#%zw|O8$Zru8haZWfpXQa1_caRt;MEqwN>LHp<9P;YN^Fm zFIV+ew}B^?!06|NP--$Fbn0zh0X`XbaeXQl8SRJguHXY7%R^*jXwy)1asg%rXx&Ok zCW^EdCX$>T4+(0RJn>Jgnc%%$w7KIf#Ca=TNp|6KJ}6{qw_e71BIjwRMnAjwZR`B9-Il)KPsBHtDjA z+Lns><)c^djP z%+pBXqBUt`_>6=Ue}{r)mvIuZnr3^F)~)Okt;fqFqsKIHh1Wc{z@ZdH=nbB|>23G| zvuq4e87rXIjYvQNNk_$9L>GCNnu_O9o>>R%wqX8`toZA%2StH-5(|_OyOy}-V%zRN zk-fA?I*EtWD2w1PEC|rp$D<_N6v>-Vf%Y{y0l{OY>UJX+EAp9h6GY4=D&9?o#rGlS zXH2F6zoVC)g>LLS`l2MM#Q<@xs>9BGwj=sBPw_fL?K8FPd1ESJSp;nO^a)ORvxtY?_?j8#N`NbXF_G+V*(c$)T&u zTdnuS-q504lJr6({Dw1*PREQ$8rrHnkW}2((*bQ3C^Hrnyu$5R|Hyc=6stNe57c^Vm7r z(aMi5iIOFd5$o=E1W&9|v^=hA#K`dpo1u{VOk4Rn55;X$+izvGIw4I^A34t3q4y)G^S$< z2by!T)oHyTkZm4Q-+*j$(W`UZDX5eFP1$vHO8bSK#=|rlb`W2?^C$evqTYbkzFzx+atE27`hn(z)+LdV$sBu%wik(0Uo%DWdZ;(fK zjVKNaq-0D{F!X|&d&L;QxF4SOLY&th^^a9p$Kx#LqD~<~m+&$Cq0?C$peTpJ4^_Q# zX8Z3kjB9O?6V?cYP(3MbOa;%y2elo*%n*|3M)IXfj~-fmBnYFodKBiWn*Tdwb=KS7TrdZMM)`w{G!|;RU6orE8Ba8}{9A zxpVaJ;adn!&5WulMG6Mnbe{Ns!_iwXQ>fCj4{t$O(pn2**bIdXBAq(C-ESDAK%fXu(Vdea5 zexoq9?}Yrntryryj;AbZv|h+}H2?Lfggs%Mx8z=*_yoxRnmwF0rR>~izL^`}gjSt! z?J+`~KXFd}A51&#+Ot2Gy~^ZT@UNEBUqbtvN%hd^Un_;LJhT2 z`VQ(Cc%+GCS5;lRrKVN`KPKb&0-Uss`u%lpS^CybeEa;b`}7UM3|^+(UUcMO${*iu z{rY3y-e(}x?EZG~(-wb!Id>hH*h+oc{^p-Nd{Vp9?|=E`x8H>Y96qUy`TrHvrx(+A ziOjA~rTjG8yH=XvUcvkxo^6Z4JLVLu0#cnNf4e1J@RnP#>--m>j#t_yTJgXSv!hDflfT-e74F_ z=zXT=fBeo4hErl)c`)Bu*2C0?{9OscrwW^yPXEXU_@qD#=DCupA95P*CA06*4@~(l zPQjmKbrmCs$}(F*(8G%X3o|J zcHOti-ckW6n~?9wh`6Wqlhi$C$k2g#Jfrn-Lz$IIS5ipbL96|9(*75oJ9&5)Sy&sx zm4e$J=R%+14@{*ei0_oSd*H_%s8u=8brK;Ph&jD$ad%7jtlZB(bnF-d{6ua=(WW!@ zKsnP?NGp37_?SV+54+&O-?dafN|PT_J~a|>pp;l~Z{H7?_{w(=wK5DC38@x1CpEc3 zTQP^hQ@NOXGMiWC#eW1yrGf#id|*T%<&Vt(dCwya?3G2BwC#=?1srqzDiCacl8bQ- zrm7T#jJ3lE?ZYsE14 z11wv_doQSJIt`P15^`@uHZ)u*6YWOI%U@mXoZeat{q;+D01a4A ziDuI^I}(3F3~&ik+RuV(x6r>cko1zFo~4H z{-}G9Fn8u>$bMMkzlclaGYg=I6HS^Qf79c?KJ*tE?h4ugBj2r5!you{M}G$7q~$J_ zzTmd}sXu>3;4g1KR0TBrg;9R;)4x9T_t5N@0EVhxp3!$Z_4j~&d%Nx=Fr)m~@H>z5to| zwvlx|KFM-&|6TweL0?3>um6K>i#h;on?ywn>rWc*mks_e8Glb5|0UzUXzRaZ{LSF} z|0s=5KP24R;JtYE$dTtU`+3DC8^h;UCAhe_ESoyUys8)9-HVBiMo%ii%j%ZL{4DDm z+a+u|)Dso#?z`}K)gI4zzmhqX_Bpn0Ce13*52fc`-g-kTVR5mb0&7pdYl`maIXzN= zi_4y|MlN5!a^;4c8;}h|G9Rk63)LGb_N*3up8lgpBM+jS7o88Q}$TmAEOMC^eycR3p0nG>~2;F3{QP1jz#>PjL zED1lJ{C^hDfq@jJhcenYHOhoqVawHZ(WsS`2bfQ2I}xBSQhgbkL`$puLUyoRh`TA_ z8wR})kg%r*3ZzWBb#mYqaiXq>{f8@O)2bb#Iy&dbC;TX>#A&h4{9-*pXCv33 zD_5^R9`AR*`5U#eD^lggt_5X^~sZ_+h)9m zZ^e$8+T9v8FwhINd@2Gf%-YmS6E4o7JJt&bom1jZ43e}2(lIm>rW`4Uj~*4+z3+J3 z)3B1M#WtxN)QNDCAxp4qRUmQti3#PSBjsoNfstfta{hXvSo$z^ymz|cMUD; zKez%=c+A6(e>%u3$g4eJ?~Iw6nu@BNx;;Zpe=!F_(>}7!e!d}D`f*a3l%+sfbeE8` zi8J-+W&-G}tLrWrNqU9zgXCVtNY)oWNg_6CQ_=>)xw*Kk+LIy|1IPhu5aisfH6_Aq zL$T0^N~XCFcfW43#32|Z_}t&COQ*A9D8SHU+aVWpj-cCmCgP=ePj8PU8UJRc1VB~C zFQ?U?5OPYW>x9O>p4Q&Gq*=d>mSh+Bd3Hr_P)=TMetv9%dLz7i&ty}Q>k<(>e2wFs z8Rbn41-)AUI269`yZe%P;d(fi5O~ZdFEg`rw|j--m_R3$;NsRB-a6e7qR^dD%`A83 z%o)dwfG_;4Q{^TuYs`|VOUSzslJ<@cG;bMtYR-L7zxwUM_x_Sm8l*<&7 z%Y)+=N6SogW z6dn;OcOC%*f{zo7>~ScUS3t7u@)_ANk5pMhC}_Y)R?OO@O`yC4~~s%e8E6)M)H<_vfg@zL_IAbIRHk34v2++VZfY@(zMP|rk_ zIn?04P|^89m{k9Y^K*iERYTaSnO#J+)*03hR3KFm{c$n>Wef()|i< z@zW-K0ZIcAUfE{BuG6rW1xf<6Z(!Qi;+IRVl*4F(M`vtuq=X zjv4e}hr&|!mwf#EEi)n`ma#_5+__LXReHd%Gl%`9savzZpFMT7W_3p1ZBXGNz;>Bt zGoz8rv8sjqn*>RTds`Q~+bH2PmE;SL^>Im6Gd)z&R{j)5Rr<8c z9GtY{%M-R_tNEU*Xi8?*B*=gMh&*&j+F&s79oTB*5%VzgtB#^4Yizu?-fxo}GpCnr zN_Ey1Fjsq0==+8LP;JU7))9uN4soeu8WMudbL*~Qb=;_7o@;GsS*+i|8&EpHoeM4p zo0lPD)%DkwJBiPj7YO%)5+!r|)SjfPrQ`1fLVY&_ZgYs#^PV{BtVJPnyNvAKD^)^@ zKO$Ssw7_Z=wMUazIsSZqf3`4`r2s4qF z*OgjVxMLFWX79_(lE47oXZi*=)YPP(GikQq(tQTvUW>(EKS3%sRe+}L?Pz-sBYUR5 zOGu|~?cr`fjl%;3jwZil<$XsoRHAJj`ar945PpuplrF;KM^P5gs(>I_?Ls{PsT=9e z9ny7o5Gzh(1az=QtFU_G9K{^S?y2M}@K-etAW7?zzDP3=5Qgg8c$2^5n@1@s4u@r* zim8>j8I1Y|!5KuB@{MXVlr zcO}iYUOna*3AA)_%I8d{SRkn$*GgbwX609;dJUV3(#0*_nhqUZRD3Y5owJn6B=@8u zVl_XpW7uODOfw~CvLCkH?>Ras9`hpVF2zdg{t4p;9n&@YBrT#GjOf89Y7G7qPez+R z7!hOB!O*k(EJrKF4<0(?#Mm#VU#*n#l5+;OT!^F9De>^|Ohd%(Bn4}iE}^L(j$d+9 zpLx;3Dr*W2Z?}vL4=KVu#uio&?@NBL=v~0pfZZ^T{*y;K&;0yBTgs?{>U-%Yc$-dDb}At;*<-i!7jGIC$(BbbG&B3$S@t3SlQ?d)*o1)Ff# zt5Azuy74^wJU z?$8WwPjZ%0U09uLx|QN{@l>42wQE&u%;1`9?FUiWMqiBoP`Zf9p+l!pd9q-rLGQy;Ubko@5>|`WRt)R{A$WSvZwPQ%URkmZ7 zqCCurOVm2gt$20l5y!|vyt19#{*^Z1rFrS z*NY983d3dccNAGR|0z$M&q*KZ4BEGvk%<2)_d_{MEm2OxHCLq^KusSa#W~56Hku`^ z5U5>QaD;{=HkIho6ntOKxmDpehHjnk{)0foZYS!6_?-0T990{(Th2qpX8RHsecN{o ztPWS(uR6gzbK<~FOZN8mOQ+ec**}4Uuotiu%g3!d-e{Sn$SR6xELRgnb!TWwJ}WT4 z>1XFfk3hP{+bht|bJS}Cu;n~vi#{|ChxZ01&d%7&N6ZMHo2LePHh4_Rd>)+9c8_Q0 zinCmH`RspO&TJux9W`ua(KvO((J?RQkZ@taoB2|>Xl{YCS=wAINeQ!;BV)-zcS4DH zB@M`bO2h{N@wE_&k=K~9A^}=%~}iAi^R{-Sy5Q8amkN5 zWG^v~kzfzBHL*Wuc5$|Zb@TD}?uPGV@3-T`K?#^I+bfL!I$A28jyuJM3Knx#7v(`5^#V=G63Qor2d*=;(qS}qPx9rLT! z0_?l;26%iG>TVgcrZl53V8muG`Z)NkCk@vc^=qbg%wiitCa*TV5CiP@uZDpmYgTLuy%3(QVDt zbJ1m3r81&wO(jKzdNl7D=qLbv@5KPT~;DiF@y2G_(<=?@TpQ zE}n9!Ar(L_OqP#0#~(OTEI;;abMvClJa6HxlG4u?bs;Zbz0&c5BCacmTjXQASVB2K zJ$C7LP2K|*b7JvEk=LR(&lyBbjj0l*M9VAb?M_y)M3?htHzTeW;wre+KZWQu;@@DD zEYwgoR%|7DLU^j%*5)3{O6y$r>#ehRLnwLu7A5eJH3}QVui4wP2{j`*fY zpZ8?^-RzO=`11RES02i0V`P+ST#T0ZB;z-p8<<-MMI@1`{Ym`+#6iycXfW^CT~e6= zaIjHRKf2PimN2V-^O|qco<4)Y7?Lp;jYdJvafEqnfX%6z2k$lxb@+J7bUQ*tPzbwT z{Y$pDLL3AtnHS0k*6C7yG&SOw2oyShL{hj`PS@$~>pgu?&Hjf6f^6$Omi>rT!#_lh1Pr%Z|~VZ57d{GTy3%e zl`ZgdcNJbBRumx6`w|}D6v0E(F|RS3;dC3?3Wub^<;p!k-Tht2{reC1^27+qj#Z9s znWE;oEW&3Y!~j+MHbZ=pD!tEzezN`vTQp#!Z|vkC^buTLT?5P#FWjqvGIz8~S0p7guwdcCu*SR|F1M1>BCswW$OB8<#GfX)h->H-?+2KLJ0^Ow^%jV%wGG#l@-} zLo#hLn~PpIX}qBx(s6oNq82Y)3LAQyARGnccg*$`_=n3J*@6GU#HPTj$K>7yVc&}PTK;;}afh;A2_hva7VM;5a<{HpOVY~G&J& zaq=nC#|7>rW8XZwAN#c0HTze4HPsgLFKJyM+6^zGxznS&{>=Px<556&Mr5WSPJ z9X^&bJS+#8`A2y=$0k?tP5c|=OA8ANa6ow*n3d&^czwPMqCK;QVbtnmV_N(2V$kn&8w16}Am>u*dXmPZKS z)h=WcBl!=&0m6UYVK7i;eByV(n_4r5u-mu-imJ=sEa&?b|7i+@d7fhKin4!ycl#HC zAKtYv=BYf#_B+4KyHax=MWTg@z#+uc-(FacKVP%zHS{eiF5ptaV4Tw?Jm4+)f@7#*H(y)s5tcSm3|87^d z+qg$pG7#C>*U;XRY(sFr3bq1=48*Hfe@;wJI%Nc`O*I$$liZq{o99;}u;K&njLrZ> z151Zkg{@;5T57-j4IRN;^% zBSE7qReATlY>6w2QFq>)7maOuEcwZTVRM_Th9AZ79CT+V7(s#Khy!+^8q6+0R!Bn= zL2HM0(7f_y9s5+XV0v7AFnhAZoN+5Yo+7j}8k9 z(@dzb??30WSkz=mSm@U=GO|NC1Va0AZG%k@$HEW+s|DoE5LT7U&n_}D=FNjXV5X$sFQ+fCq75~ zN9=8~&eebDpSjN4mi3>T-^dg=2loNR6kC(L(9X zfr$sASN+Z~v*^IapusA5ry@DyS2p-c^n<+Fb`p7)t=}%c$_}Y0ORDr&= z{t8A0l8&1r1Mp{zYP^fuUWnKG1qhHeGd^4PI5hj^*p+Xc)Qvz3xfUAXv!> zJuj43&Pm{W6Vf5Np~px=h*)W-aH0_IGjN=Yc=s~xg;alkYmtFcOiR6B&6sAgwCceo zOEpWKnmsMDH$2UwQ?@*UrSu1GSa{~Ac>BTm!ns9-bep`1_Za?8IQ~T!=AllKQI?Es|e?Zs*X5d+XN@USpBtn|uF z86e#b#yWN_h{*J58vSKfEAcL*Nd*D{;sWNV-RGh)V1r)D^@3*QX^u>-1TvgiCuKOx!Pc9Yn76%J_6AxvN$YMn)rfkN+lh1(vq!VfnHr5Yw8Aj4wi^k2qIr z6u>u(U82mzOo57_cxrwHdcm_RkODZf;Ola(E90s-*K1+NPGQIc6*a+zUx{#ZFF4@X5=M7)=wCQc@h%7UWsExv3>3snazZ z1%dk4o<4IF(<mk8GtByk z7Esrao|Y8fBql1l;Vk2|Xo!k>#MaBx?vX&y#B+gsN)@ubwir;8T9ti&gz3ph<^3C>M#PzN_P zLt9TQs;@o!orOp}`!ztF7A6&I+!PIh`ckds%i z-CDs{#66w3Y}0f93FG^Ah1w|BFMaD{o*j|@`(kPX53{^cf!w|wy)`WcEt1vAk=CXU zn7G^o)W4aG--aV;qXOw9k?n_A1d94JHgFiRva&L_g+3u*2u5rTX(oB&;_B+E8&E#f zyhU2yJ(b)T&M{^yG07TweycH4OJ;JABE!~3i7+Z0!hg!rLnOaoOH%Jb+_cAXsqaA6 z>9%a;kdT-~2hsR5Vl`(xb6T{v9 z1^V#KG^vFxj~6As$+x;t%j6qjxcfj9^Ayn0<@SgL<{+VJ{0X;n6a|L_i6S;9daGVN zKW{Ls?$6d|pjWor-E)g92ANk|Td8MP^C+d1CAnK>#Xk+}N2f5~d>_3P7o zo>73vVO)nLS$8=k`k7&-VqFV4$&Y6$6SJ=br0jW8{UNKJOH89*I)*af`$j~8-}7o# z44u}fX*O_@8uh8fYA%c8MkS}tc6F5B6wSYEB&yhc9hk3(8CqNgrC!|KY9bw=|h z+3_CYv67sUwk;g7EB9CT$b^JTTJ#1d(&sA)nt3j^ajGGJzslDp5r{O{W2ffS9NLcI zxigF2HhPJiyL3AyCoEcZ^7@U@_j~uqq6|Rx3?$}TY7?l#DKXw93UboT8VP@bzT1d7 z{fric8+q)#*;#xZ)ja37Iq_Aneyx5YJ-XPLUkx1PN7QHP>_TR}GTaAEBo}~?Z1Yq4 z=49mbkWD&Jccl1^c`n^&hVui^8>dP!l$j{)jzA#HTUuJCfU2{#g}lNR7bwM~S{-a& zY8zd%IS~p}kMt}R84ghxxH6Tk9^#FY(9Hp;65Dae1K(H8@$Aaj*o7i?Ua<|<0ruu& ze0I&NHjp;Ns5m_++-LeHyz%KL*eU6SuumD)DxiZD^8Ki}fv=2phWN$|n2 zu)WDkN`QFbl(vua|H2AdVMeEWPlTLcBqXU8Di2GQm`mctD#sawgoS}2hu(Ffpc3nF zN5GVf7dE;-OX^oc+fE8uK`)+pT-aQU*sxL!#PB=Ysprde5C z(C$`7c7^c@U%*lfSZ~9_RYKT$3~uR;TwL?LCZfS>YwC+Z&%vEHNULTjS2>B=%?+Lk z*LwfUR^feV!UQk=0PpO*N#nekVEtUIy6fII8Q6yF#$_ zC;CdTGX8|s;$V>*4o(~{o<=`*Is|m9iA|LU`*Jw=__Osm^a?v*Ce_oG#v&AfZaDHX zY|Dk_@L?BMYwK)apCE$T#^z2P>>=bFKl- z{`G5PVO@ZM+CHEHGAbT08QPbTu9Mfeqd=7pUd|b=$;rThf`xG!Q2*-NDSq$c zE>aGZEQs@e5waG5HNh0OJ_`+9S_68g7_5Z8B}) z5ESP`DZ3b=p*lW1Fg{Nia7%LeKg4$=wzMBxnttA4I%~l8K4+i32=N35w}`6%qnRYO z%x*uj>$pKAPQ1>Wtq+wHL)4Sb$9g6Mmf}qX${&gzC+^mKBAR;sI&C9O3R};V zeM<#h&7E0LX?j06`)1`Esji;U)8WtiUk%~Q9_Q2~L@Qjn9@EH1?2!CTlFtqX>Y0BP zq4k*L4Evo0NvLbDB; zNY+v!Whzkdy~P$y`;cR=U%is!k>}^Xx?F`7C6Q4`QH#c~)seJBG)Gs_bmVOMnBl_B zY$@8x%Qt9EJ$=+oSG%k``u#o$p3?UKQ5h1Gc98eMjmHHWSlqPnf)WlMu2boi*Oz+E zMH%kHk_A*U2#YAOUwV`nyst;>h4AI0o$(FbMoS}--vtE&TbWA9&y^bFm2952`rRV_ z$_}vQzl;E?Kn_x$F=JK0;gXUl84s2V7AYw%wrmXJl$k>VnQ%?Xg}J$N9u3{Euea(M znDJw_W@N2MYt!grV#gD%Fd)CH07%2@sZHHX9U9d&591xdCKFaX&~=;%+g>&ift6`EE0D1V=LXc(nyKKO`;Sb@)rjZ;JzS5I~5oN6BAdHj-<+~3; z6!K-7asyhV!@l267ayG8q2hHe(C%dZR}k|_gg+as5>1M>u>GUh0}#NsV+h15AZsJS z!&`v{bs!Foq3|?jI=Z6y6}E!B)Ky?lAJe8pQa;z}VyRlSyQ4q~U1Wc4c@}b+mat7T!^7M*Y*f^Nm-5LEw7tH-u>86| zYkLBF-2xG64cPw~Ru2yb{sdRDNk|^?Z@AK<8~59-+_oP6Y_XRtEY9;qtiC#KMv075 zFW#3qC)EpWQ1J99%shGe$ZDwJ`UP~&zn=qmghYbaJNw*%XBQx}|J=;~xdXvB0Mjl$ zsl)VVN!lM1zSiuVX}1$wy8o|{{P(5*Bh&_%cJXtjeR-^{;V-v){x{_^0MkCUaSMGJ zrrr3QX@@vhy!!o7{F-zk^QJrk@d2j27aHOFFZla^DY4%Vw~W5x;RKz)LH#}DME0Qfyp9RAZ}suF z*HQ57?a2S_1@PNX|9mvZBa=s#aSOWre)S7*$^URdlIC8a{TcyM2s7_^UJMJb@ z=HX{#TZGOYffO}|rlMT^NyBJ^f=GsTz5FkH`Q5R#?%4fm%F3-}#PL#sE-~#tct=(h zHPvVUd3R8~n7@RKS?u@6K_I-w1@Ybls*gX-2ot(^6v%GgBMGlQ5o~!HLq6N+AN)?} zoDM(!D;<75wz6Vx`7u|bqoM#&wosA&G1Ex7W0iE=b3nS8pKlQuFk}{}26j^u4Infx zvZT;o-Jd9OZWpgGYq0VL6n_4|m4j5=z-BBPUiY3b#G4N@ta6wKX_{AyHhw3eeW$HA z72hfI_A<#I56b6c7<&V3rQ1U)%u>l%!%$Y};l#xICb{NOTO$3z@0nHu^S)FR6oP{m z!xTtJf$aVUkI^-h$^hH;NMmjp>nS4#*ra$VU~!>^K6|oI;B+k~5zsBJ+iMwIVp2W0 zMK#4I@0`FW_%_m@VRGloqivvRPjJq=NLRI#$Zb%nzEwl&Z4f1ojAHQ3mM_)@%~Ri5 zkEZJ7*2+Xg()A`i>a9F9c&QCjsHlIn9ezyK@BLL+777dROuvM6B(vngxJDsQiZdP5 z!%0cS$T(uq&i(wZpP!teg@Wq2_R)|5w@@7!Z#Q%p1bX$9Y!>+YfiyN=tD`NtvhLopvz*6&R9c zW+rLX{vSz6NT`F-7+@BC(&%R_X%J(Litmr(=Bu(M(@F!~tgWr#u>pAGQ`8>#5jA_7 zZ{CdZ2D~%ZO=1RGH6)DO5lN1J!cn^4RS@kY0)Akb?v6gGT%}~_Sm3)86@9Z4Uia?Z zyClAgW~s;2!_9!#Hy7DrH1n$tKlQk*>%$IliG-ggde$y>BO6A`u&M92ZUO*-4#BHMlSZ0g1+*tn*$F{|X1E^o=Er;ub?QloJ z$M#CuFYb@9JG{vTS7ZWNjtC>A5&D&Rwd;fr8r3b>N0 zlZtIAP~1Gm5Ozz>Q+u*|iS%JkW?q<6NLc>tXncO!G=J9>l;E}tr?rkfwr4c?v+;h` zY#F`)z{A?8E%|C*|M@dYI|3^!UOPbS%$d$f)XCfG>mIp@}%!1N17TMBy|K5TN3(k4|8YxBSOO^BA?j1E(J=jJ|QA9 zYnxr1f7JSG>;3wxy{Hx)haz!6N&$NDVp@8_+3ff^UdDHC|FzQDk7SsiBoZpq5GoUX z&jp;&uW>W%2h0*#m>zY1cM3>vRH^A}@Bgv%Ol{A*lWa=$Dny;BUH_3@QU|;)22!Xh`4Z3Giv|=t*<#Lj)!aDxiEaGCSLx9KB`N2>F#KZYjpCY#*z~zqJX?hlhN9F?~#<5YK=h)2OC@4ocFBW zM$EF^iPKHz?UawW@5&}BO!AdgRK{x2p%SzDIamuJki}yb|>>MezOUv z^4z#FJw2Vo$5U#Aw|O}W$Bw}xmfE$DaS7$hxpTY zWe)ydJTV0Z6S4bkdird=ro0+OO-*_{n(txlb<4Q;_zN^W{ryy8{`0Mg^-X$nfN<=c zYf=&gy6oLwnY#aDt6dUcd3ibr&0`Oj!6F1eo3ip8O?V4~CiDBI@4;K|ty2JTU+3bZn9zAOFx_mEUwF;&{n4pYF%ypF zZ4;)jj52p#B*SH{SBdwy+XI!BX3)YDWFa*Uc3amEjtl>g3&=L+hYRtFPKz1Y<-uB7 z6vy|U29L0$w^rXa7_mBNX^~Krm#2z`t_8M*>qsZSs_dVvUc%W|V@xA5ufFO5`ZVtC z-7O1+NK1cLBO~XP1?mmvmbUN!VKNx(lBEn_7-Pw4DDT(<;zytn4WU$6q5xf1R`v1A zzcM8Ns^z!;$L0wf{Q8AS`*OC6;8FZG7x8PC_D=3LLPDa{hMWQEWn~{ZGq+PZJJ-%sG-#i}dn0&J_TqY; z>CAFW%iX`?oxT#2X^oPDLhv;`9uJyi!t@YtgZ+*Kl z#afJj4)hO3nh{btc9Wgor&%0*U?msOImoB8MT@d~xPLARW+WEXaVEE9NeBz$&>9fn z`t0tDxm#CG4ZXh70pGE;y;eCK=!+n?X;{ZVSroYXPxP-4t#r5*-;b%am6i^TKD zSNjC}&Jur(YlXVJy546KXr4NgzWzKleM8_6yutk)>q;}Z^^LB*Ke;p-WTQ5b z(rSB-wqmD@NV*Jtbi3c)+Ct+ZOz|%+;-83J(BmrKgVoKocUH%YLoJ&?@wYPtczfrz zeqA-E6`C!=H@vGqtwoSP`<0Y=^#-;#Tbtbm!sHqXI_~0kcPWHt^`||%_Wvgqy&&@Z z=P9-5o=>r??7_ZwJ|UkxSrJmy)}|y;da2Zuf*dY+jda1Qg)jXav8z&7+R%}j>%C}X ze*f+j9zZtmzWMmEkk{IShV3mWDJg*iNa~{H^!uMK3Al%DlDMn;{Re9OHZ1@8$ZvuD zAOk5Q<9~_KbmzYhg!0Z;blEQBRBLDf56r>FiGP`cd4O&p$gAH5ez$5D#l*X500V;P zpHsio!DJ75>QPsVD*;Cdbibqng0`0*<}9DY1W}U&G$Bzylso5O4tvTIP7fIKj;;sZ z-@osUef@Wj)!&ErKa&9PP@5hofI1j)n<{v{w+l`!EbO_lxVpNke_B0ag)WVdGBy3a zN6$zf0na({8rcuL+d0I++MI&*Ucce4n$(96R`!iKm!MntYw4d)UE6!~NM(Cv6)CBw z?3q)(^`S*vE^IH}ENG9Yto26^rT)g+a_`$u+sOPQVSkd2u-enZUYp$PbY)&Qw+zYHl|UnfqD6lB43_@MDe7M)=-St`FDt zL>fTstF8;*TZ%SkZiBe!B!PHTB*J36T05K}O74H?d%1!_e>^LE(PJ=vgtvV*QiUYr z%;T=xfo~5WYT55h^Gu6Bpb(Jrp?XFr&iXR+Yt)l<$to7$Kf}{u-|~u@AH&~jhQE!C z#l{9LuyRmxSh3>PMDWXfBD>`d{M#hK?1ojk44_>{mJIBZJvuSQs#PJR11ni8IqhKA z?fEuAG{V{VAd~r_j}=O~mWsPxGdT&opW`1ng^_@lW-Ep4fSyWskOB7Y4w1lBy zlJwrN+24_jhvM~CS78VQk~{8z9@uUZiwlLHcAaTwWz)~+_=m<1vWkR*Va+@3D>bXW zsEnc_K@1Q6{Esp~AgTMp*w}0*9ErYm|G%At|N5caoqvR8W#{PA@V6tu!e>uv2p}dV zRdctmV}1P;+=p2c_KEkt@h9HLYkXG)Ug3rZGDS$HGSzZ#Gdpk51XIGv%iP^RV=UVY zW@Z$P#Mmqy89}=e$lPliuAAP7)?#wo`XYLiPaCTt#)tcDzm;g7v6vIHF`i$w3w->2 zO;Lg>1h>^w3)@)uy|)M@*O=PKnYFpFp9bfj%l~;WhW=ScXWoSKe3+j_ORvbzJnXK$ z6XgmNISi8H-3j(Da+5qgalSA0>S1^c^{#c4=c=Y+W{J9P9)Nd|ZOO;#)>tWcq7gB< zoK#b9Uv>!2#Mor`KkzBWxEBXQO zIMdqTMQnPNi8By}S-xTr^Cv-0l=^pi+AQ}+K3d$6n9RUB(O^k$OFJl&NI&fWnn6ad zA&TXIpm~LH=-7bdB4hgdca}IFMWhORKm;4fTBzU(^iJI#tU|8NVih54-*MWml#JW0 z?jaz{tE(UMmuIeT_ZKs_O`q3f-2Y`$#VTB2rF<6{xZV!s+Gu|AV zi>opZ%g$4u2JP@s&i~fM?_%#qfdA|mXHS$xe_QwndWH(9IqsoRGS1}Un1_Jbr3NQ0 zCkW_NKWu4JiLm#2PqLu3{+NA*>{{j@d_`<&&=aGyI*~Y#!~L? z_pg5SJm%NM`MWW>iuqN_T^MaCQABc?gI#U~W*m6@qWE*t|2a5!BCdF&ri1l(E_3kV z12P5VHE)rBS)c#7#oxbs%;d3YnQK&?M-$)G7Fo;~ENggU;)?_xQEC#!20B;%nL}F~ zueB<*tWhAApC9f$uNx3j=8Jfl-{xyd|9RiQpjj3Wv>mZk8KS+odBcl4a;*+f zny-BZ2kkiRPEr`)F5bVAULZ?XR_G$xtfOLhA*z*?!Sm9Mu>b$=1^-+;l#D;g^-4Hs z3F=lNwa^s{DrSnFMze)<_<%M|OtL_a@9e^o6JfG+baW{qct;QaJ}_4?Pi}>x`wt*N z*k3-a@mY!kihD+=i*4*LT?J&wSde8}1=|Y;y?vV~KeAXLD#xJt}BjLOP~Q$4CTB1$@RI^u>lPdk`u1A)a1XWmXa3xKQQt&m>=pB)Ka0jQn817%@Gww#vEI_M!J@rx@rA~O&SlB#o_Xv{#E*18s*q(b=9|Qt^*Y_{{L*Upv!J!LJbU1C z`R|MEd=;LrdgSMl_lxGn=4K($=H-pi3$R7GAaQk!s2n+}%IY8?9;}nHvU?KCM*FDB z(Krz?w7q!xOny$zEIFZ7%5GqcUD)gBMAR+N335n z-NW*U-_sTQw+@Q?7y|1VGm2P7uiwRf9V{)^dP#wg>4drMgxa@pS#>naaT}{JS$uvS zFq-(yi?(x>@1ahGUB6tINKnItn1A9DcXuKTs+BHcFAfBPfnCrQZN>rA4%xz!`-bId zq*w*cfJW=BAzjr}){9!yH}4aNokMHCAu!{XL(b&(>&tkGDM8>0DrvbjLWo{r^qd5q z-au>WqQ;l{cNGh_)x?un$Sq*UFqeXLN{h%+6V;Xh6E$CS?4_It>D8C*S;}gflx}-) zG`Gcm=WUsKO(ks*74;vjA;wX{@wQi+i~mgGRN?YPeH5+RPqHXfOR+s2RMiu4lD zyby{du@H9h0o(cef2_$x7UrMto-<(7z0 zQ;ok?ES?)A7^Zmtv92!pW$esXF~GBKzAD1M%)u^Lo)AWr8@C@}UteBY3eD4#q@$-# zNvo9nRCkJg?9-401Q5L=k%3uRl1Rg;m-_q-OqXzJF82T+;RC>O{aF)>w&~<1Hmpey z8=Fdz%ZRRqb%Pa_SCuz_%}o(S+IH&*`dqVhfKsLe7Eb5@eS`!9KKiMbJMqvBA7zM2iYBGmI?F^;?M|1_F&hx!Ta+qhC0D1 z{^ig)7p91iNnZ4)wc!d)Q&wJJbzNkG{_A&q82Wrkr^8!#+dWP3&5RtmA$!n?oW6;h zdRs|H+g)%}ZgtU?j7FOG@&3N7Ofxd5C4{<}1HSdh;*AT@$Fn7i_z);!gh9&2F`6m< zGOM9h9z#DqW3uWjuw+?zUoF2zFuhjJk#e3!+9(itx-5kID&0PE29zTC&o-_lS2>meQ5O1o4xe1mYlz#!IP&K|+&>dAufv+yYzy8u znB4kKW5gu~05|03uA+M`Iee@y(SHA~V$7@U+X1(dwKei(gk(v?BOBDJzo zagAix`G7dI;r8MOLB5rV;?rhe!y~r?lJ9kAUjzj*GqWClW-OM#Y}6qODeWoWXn%&| z?OC();xUyH-+t-mTUrDKPu`8<8K?g&>B-bmishohoGswz3JG}|t^Ii-@=0=5k|0IU zDKyLKM_~7VU2y;Jnrzid$idsQTO(+XWmKY;>j!2G8Fa!bHo|kV&>9-^>L_#Es*fw* zNjj$cnG}9UgiJJFps`GdKB^?s>Tv1f$X1WJMwLO>ui34a`J!vQf49!=V2>iXe!0Gs z;|>lTpxWgm>SW0oGv-S@y^O)kj z1X`k1IITb8vPxfjf*#}u|2s3*s*|wB(#|fj7nU6%)z{zBJKjs3X)`MIYiuWKB@2PA zo4kY^E70NPfvAp-ai^xGNv26hJ@fP1(^Xnhx@g3H|8A2~e&5?k2>Xj5V(Adru1iAU z?6wZsmia*@G+t03Vw$Aib%mhq61e*g5HL;N{I$Jv6>X6r80`9t{4(anlH6nJ%W3WE zWlRLw^Ao^}dQFD1UBUs7SqcE2h9G77Z{^DWJlY-jd1%O??{}H|(2@t-=yl`6-*zv! z*p}8aKOi|(@rSde^*w3Pd%1X>Bp={GPM#+&s5En!C-JF`}&n$dKuE(Hy5%RH&@1uIjbS z92J?iV0eorqY+J)h}N!RGEvp`AJ7$B579(WQI1&F8I*Sn?8sjxg*)mXFeCbo}f3uDpx(0{ZdbH17N;z_Pq0$ zWcm&DdObyhl1}sGL*J4;>k$`5@=bPFFGv@!jk(DW>Xb?n5)o11Vo8Ni@1L8Ks)Mzi z4NbmpjLa9I``;IYW!yQ(gOs+RS>fZcR)w9_$4kD93Or_df~2YG z@d#HzHcXBd!RHOW0PtjNViM8#6}4mOc=ZxM!^7j;?ccwFfhakM<*GrKq|pX5&*>u( zpNr0F-#IR=g2OqB4J3Kv4@8H&>d_TzB>U`@u-uyW39A`A%s|N4vwZwd$jA$}1VTo_ zfY^Y#x3!t&K&N?v>)2eM{m|vgIWp5xE4?`6_z~BODykpuS!YOrqT7}+HOw1WgLxC> z3&1opLF4$Vq8ErKAG>;-MlMc+;X5WV0KK+RIctC;Gb|U=ogi`ai6a*MUhXvw(i~MQ z)qj&}3WCGA*(M%MJ*h+Vqn5NIwv0;bWh6<5%)PO)?Ju9G`Zx>c(&$qw>C&LQn-O}Y z%%7@)HS#-O;lRHV5BO7VWt{a@vP6Dt<-^625Mh{!W?5CI35&4<6!g8YRe9M}*9ekp zYLfEs&HSuyM!t*4rv+3pl3mjtX0z%Wa%Q&U2Mf7(S0wdoG~*6k`))Bk?k=Mt2@n?! z_&nK*h}^DP%3vTE+TqArER5GB?#Q8xkphKutgsD$(a>_G$e7OZSy{sh#W8tiR}(Sf z7Lyw#Axbj(?e<{>?9Vb63+Nky)9mhfy4VdCb>R@lZn%6cX3tQ}zX~x7sQh83n*T1( zwoGDqJx5UE%xtM)-{SR2ZW6`9v4fu%nq2fxz?m?Pd1APG%CAr1#OxIP6PE5-Pp(m7 z8ArWNq`$aPgJ|1-BY?-H5qk==kgx&O&~6d^g9fq!gc9AA)l|Q)uzQ)jH+Nc(JANp zNK>6Rqe{WD2Nq+H{I@>{O8nVvOT$JrC{~<1Xi87ZS&KbO`Pg{5rRGYLHPYj*QJ5bR zIcXWTW)4C&qqF3oHkEx}KXmW0g@H;FBL_WgR&3kDI@!bC97t7swY5u~H#Lc1S#)oh zR0pr0S$oD^YmzHH=A9IC5-<^BJauTF*~eyw~`!D*WU`8&aHWeq_YZyg{(wnkwaM&Zx1)CNp<@->3$p=^7X$nw{y#^ z)e0VWmH6&TN7>XJ*B+vlbq?3tW3VaPR`4t>t!sQTzS!!6$aFv9UGBXaKN8!P$rwq0 zuzhVRk;uC;MZOhg}11XHB&rXItfF#Zj{SyS5B+ru(Pp+KyH z)!p3j0v-5x{uWZDuaL$fS!G;Cn0EBYBiQ z)osA;01=98ym2_>=Dn7!+4L0S6{<)M`!eaMR|10MDDF__iFcQ%G=T$<^jO>$6!H&6 z@5OE3MqmMxWs2s^{f8x<>->6iwy_jeWRCd`PF+H_>NO;;B#akPWE7_n407= zN5a#yhGKCc&pbaPp&iR+`e@3M|(-qf2zS`~`;%rW$~ zrEEnuTNoN?d}F-hpcduI{}C_PxFK^E63@4Qh8=fmf`FKMXGJnCrG|3aFXg^h6%F~V zFM?dbu0DWs130HO=xe#lOuX_y{t-C{_}Rnrq*+K`dROabpu1lw*BjTjEsNVu`6zec zPSCRRDS*5ssBnV-?nh?kfb`2`al7~#)5?vUCl-;^o^$d87=ga^z^xk_wxN*bA1CyD_%8@r@mo|XAtC~CFX)PF)02T?-2JJU*q+y z$s3&NZta;VT&!;jT%p!^cj?}Jg!}sUT7mjW{hB-I=G;ivTs{_tTHPzhhe!G^9x^wu zJh-LRI_7Xu@sazrbF>Heq0s8ReFKeZqqy^2h_SgbH?m+j!W9wm_8RO~@z7eT?z=UZ z5#tB3&&piZI_Xd?XIT_$`}?YKAVFy=wX$*ASR1os)w8eMQ?tz%}Zw8cWgSb zKI)z6`anY%At}51IW}Ohut~1P2x6W2utYK9A$*V{!Y4K)wZv;gOQ7qZ&;)*SRKu!e zML5H=!hGBt=4??kns>}|!yvw^%Jy!vft1N-D`4ME1RFmO8a0MfjJC}jX3GpcWQmMX zlF(Q^iIg;ixUm36WMZS>l*2Ycfe|KW_K=Dc?uQH)ErqFiFS05z@Xzc17NtzVWdLS0M3_@8hycy8vRmRA?yXdb1XPknxApoDQ4%?Do4kvHnYdlN8`gxTPgD}W1J$cy{eZM zUAR%Huu|btJ}&1II5okLr&GU09{c+N0 zVHRK#+rd!xM)AadfRu$16 z-l2}g<{=4?V4bnh3!dlrNlfbpcf09dI7%KpK~9Jjp-d|H4thcfYK(6khHh=F38{;f zs(c{c=1xLzjg~8as!LFF1D^SFPgVN3Ev3TSMSj}#clJd6^X=r%+Z-5@jvwq1E6GpJ zDn_Im_0JsG%M|&GtS6QrA;f;yrObq?6wOP{4BqE@58XK0g&w5zn)_wkk2U$sz|PlD z%HBNM?c>mYaLX{lVE4HN@a?I3KY-+TkDo5e8dMAB*Uhv3tUe}OTQq%lA;C{@{RD!y zs5@8xKuKFW*Top!(K~Xak<=KxYhf`;VGEc8dNt-DX8Pop#=6Pv@!Xm^5Hzty&9+r! zw>opWY;4ed`?c^?Ujie=B;ChJ6(uUe1Uvf;n+^;f`~rBl^FVahU_54XktSPX1ZAoH zULQ%}ngdNzRzKjA!cY@%!9fYlESsyzO{vVYx`dAADMe5(iy}8TtmuATDSGf@t;Gq~ z{xG9!_Fd2~AcGNGKl|D>`+@6fz>y}zI?L#_hr9N*6IUkd4LxA9_}SgIy42VQg+5rtQ2h0nkK63qJF>-on2`Z{?M{6t3|(sGqi-?OcoG zFbsdnW7kWhV&Q$N-hQ^!1RIzY;kX4qQ1m*EzUO=;#nmc07EdmfS+{&~9t;>3 zYdG%t+0P#la5zaE=oUU3F_j&hbPXAIsb>SU4X@$h;p|5ZlyXijCq}GUSm^HzTF=!s zCN0yYe{@^Ecz=44_UHE@Z8%5gqyY_c zJ}PbV`^*Tk0hO@0fsqB(BfUuhPRK$|LO3RxY@#UWCd?3Sl7>||{V zzi(&s$&J_>oqWv058_<5|x^E~|fWbQ$1*D})KH8ma$ zyJVr!vSW~7A{n_%_s!2}8nRnn^|;vA0T+FcW6G?&_J|-Eq)m0&|Q+lRFCsMk* zIzkMW>hV=GL^oOlRi(ONZE=@f8`M*GChvvkmdi6P8^34TJ?L?rc-3TmvY;Y~X4W6+ z;lv-M2=Bh(Co7$5mYP800ahDR8v^i(>nwCQmfNd_y&0Yj7-^Nvhi=&xvXA`I)ftv} z536pxA~>tyT0eMPuI9E&C_lrwri`xee4BIaV?6J#h=Lo4i;{28!vXWswLFGiK11c7 z5^#RpRvM|+uR0gPG^9b{r=z8~_r8E4n8jt&>yes(GKWLN72q!?BgFPT>ddYztq~5G z-5Y8wI;vJbVG8Ta3nj5|0~d@D^bgk6hv^>qgm&KP={Xw7xi8dUK&+%iw=7+jf-+@! zSFT*7;l~#gn$Ts@(f0&;!YBcjJfZcQOcnOq3woByQ(`xf%HACOUc05FG4wz?S6gaV zgXrPr$n|Dj=vaHXa`j;;*4~)Uo9KDT!q8I3aI1SMPkknzS_2G<4`1vaZgJkzYbHuu zc&QM7OOTy!{pgOT>%G>)90Dd+f2k$5VXmHVsmzRT60AS@7F*{XisS#77n@!*@`ICW z>Yo}n#4Nz#vhnN#$GR4%653vQw^)wrr#HuVw{iCh)s@rB1H`SRvi*bU94J@U+u9cv zR4rOhDo3MUWIw5U%TLD&+fo-CseUtRig_BMNLdsAk*5=<=Fz8k-OmC--i6UJ)76jJ ziXZkco6yey+t6fC+9EzQZeK5E2A$e8##X*JpO&{jamCvcnOv^z;iSWd9v%Blc6w}# zd8qqXuKDf-00fGj_27*onHK+((@1?*!XC)CL&OjN)PDVmO=tq+ySanM>PfKrRCeWA zD0@kfCp&9ong0!Qt(!U2>S8SL)5`LcrzS!|T-FM-Th3;I!?x{y*0nPMtA<75!{DUh z8T(9iqB+Qd-{JAohufp_P+qZLyC;633Q4dSE>O8m-h&JB`Omff@!!mL_AVuw>@{$i z(?iYsy9h&AX|7OkODMoP)mfK04}jUND}ha%R5e_WbPIn~gVybrm5*4`I3)D-8!U+f zf`{H?u}Q6cZ_<^Jgk#n9jPgnK9ui0D#j*)rbptmBh@MPHM9E9+y_;HpDoWYuYet#k zy`i{b{cKJ2Q;uQ$r>LjjL@8h)@W>cV7D)&18Qd8;6GNg1AJB?aCLcT4(q8Nu$No=U zZ=+8+p^yTIU8cI>Bly;0m#qs?{+8x=9;l_7J;SpLb2?Dd%!off^Bm3?mfW>ketOHO zDSo31=M;CsHT?$^LY%8hyZ{hZ0IE?W`XH)M!x&bYe6d8T@iV^$%?cx}(LoX*=$W&C zolydOXP)OL@{wYDI3Ng(KQL2A64zH&5^9v`CB8mtm)eH9o#AN|8Ntp)RQ{{1NB0r- z5%zM&Tb2dhe`ywZPJg^zyWYyBU~!VI$`JO$pVxV1L``pK1A@RYHZ={ja7EL<1T>?_ z3P1ce_IqIf{m#5vvpP9aB0@(uQ#8FXrr)tL4nB=AZO}DTYP^1;WuXQ zpO25<0GYFHQHIMDlGPSq1!j=4OR8S5_4XeWQEm5mW{_R?QhUOGl>zReK%t1@5&#tt zR^7T^Bkstc0MHAYL9CAzn>h}DR|9mZ)Oi@mcNy}i`#i;qGG(U;I9+(MytEd27vOLs06m%}6halv zZV~o`>z|1x$qwjVYEa>8+?L{llXfBJDpOw6A>PqMBgecSl%s7OTrEH`U6j6-sdOUx zwjUGYOA_YJk-`{4o`^1`SdjtWrtq}*Rb-bnZ!u>FID} zO=o)yMT0k2eWUxB!7Ds6K<5|8FAy>_!sA6{Jr~NNFrTNz(5p^~d+QY*9`Iupe;y@y zq*)ax8Lmy+kai%_6!nTV>>#?}0AqmtuN9|x^-)O`STc^2!JO>p# zsA1g~hWmgRBrR~ogZ%oZO5y!l1qstp&bgxGvf7_*qGn2_w>-9(9`vqiJ1z1`yy_nj z-B{VM;YOHwlU{I>39m8NoVSaZdW--^Y|(q%zIuy`(J}Vx0Xmno6(B$7P_`yDLsncX z`3Xw9sw%2WWK~_FBLjo|4hIF$puLMt^lvNvT*dkg1rrw`7CGC>tJ&_Qw`d+^qt^#^ z*h9qce5vl#BkqqsJ&5%e{)t%C)^34iKN)BO+vp>KR5arA&xm(zwo)O(x@7QyV!;+w_ZLQFoZqnxJiB2?XM z9Ebb`u=bkn`F9D~_RPMDaVtU19z1qv<64-6+#3_v%${);fYVpc%`@O~(*V@n*BBF_ zN3hVtbxgbUr_bgemoHd6f`=aFCI@mG@*iX>NuEp~r!J<(A9DlVU~!F6;>=epuHSh; zt%Vpm@hpUzeV^o!)bN;57@)znNO}MK@h+^ngchl^ER8HVsfY%!W6t>{U(B0H7vPXRWB%dZn%ru>Z#D~CFb^>OnjUC5Z<9U z&F$K8ucV1$pWV=>6c0%BVW}Jvbr9Uri}9YoC@jm(dYK1@q`^vhuVb($dr@W*-W{_? z_hgvue$2>ii)5)CpXI_W=`}*ZIzNB^)Q7<;O70Uo^AeaF3nC zwHQv@B-$UH4tCp-c4i?QwypKU#SX`Z$6awEw@kl_ZA|p0b@A3}4#iC8dWb1|n2&?B z?hCiG*SG8%f9;Q?>Yf&UL{$uf#B?uWC>|4Eb({Rl% zTX*nq%ysCp~tQx5iE@l^J5>o85@94`sdu^vXu1 z4Yz^tCOj~M)u(wGK12-JPzEJD|7Z%_Mc$HhQKoRHd3N2M`l zK(`k+Fn>DT1P>Ouz0m6M*=s%lW>`M~mC_RHR{YIMUHI`I5flmtNecC9!sK{4r_j4! ziiK-HYx!`y+&L>w$BhQRBDXX0%-IE5bnNKsBUmzNi5Hl3a%BHKqJPowayTES$nPx+sV?|iNm;7@~H{jfVDUnzC zLyxJ{YVU(TaMOhpQYrwv;H(^o%M{Gkg3b@7VnUCFN@Z3r zrFc5a_RqHbR{vOMsxV1FkQ|~yAKu!*p+y-M_GrG5mEkygeJwc2N$hsRJB>-p94dK1 z1`%!czFwxDB+9Lu!akATUn(D^J+lFUR%)6KG(~Od<|0*tu-GUo??$M`aZSvGx;>K* zb)lxObLb~fDq|#1)RWX&-g?xG!mhGU)P<2X2uHA($&*EgxxC5ed{l^d?B(=8G8MEW zNt9AYT`D^?7}~}5!gf1H=h{~;$>f6rAUv-a!&9i_A; zS8D6|#}9X(GO;ePy}~7YX{VWxu%0V5H1(E@EOJoRTh4g%5#Q~L^-r~nfOLMc2|004 z)@ot_qxZT`8iFkYJNTZ#`~i1vkAtIyo@g?dUR9e3tX`~G1_;%<;N=Q3lmi-nwFfxbUM`Du2kzKfin_;|YO%^b&`ZB0EY>=OkKe zY>sqXQwU5C`|ehH8&lRiu^)6>DvxnR+0x8l83nVIn}3mZG^#ms;N_$;jB`-&xn}TS z8~$lpyU2W+Aqa$;EuQm_2_1}oO*tamyT~nSS6JClEYc2txnUx7m6pr)?zchJwthah zZnZUr|7PXHgU<_Z>N_;coV%icT&||37!n+%`R2TP1dxGsIa-0(ONfYQrOBBD1K9pN zxslE0ILWdNJCJ$337P`kv{BAxN$n2`67ib|I`p-p|Eef9IJ)is%fgobrcDI+V>5iN zGGVVN+uncevtJ-{raGh;Q$G_)Z%lbgz{KgQU3x$wHUs4;{q^4Qk^N|QQfJo8z@p+k zcl*2DCSq8{EulrI;D{Q}d)H)Ruj!nC;;!9`h3h!$YzxfZy=YzCBD2iIxN{9jd60hJ zP305~M-vno>|tZw;7c~{QAidGAdU!Yi*QmxjA;TXE4@MezWKS9zTp1l`b!DO4{;6| zh}I34`8M@UQ(RuzoI*rcoVt2q5I0L@(=qSfFl&BeZ)}t?bllgJnwp!t2y(rI@g}oW zxS9roKa)Ekz0Jj#=~r<73(C472?xuo9;kiTEDR6QNXh6MTzDGAUK(1{zWlI|{k-6c z0qyjr=2_)S?M=>Kg0K>lyd}eF^&l4fw5%hpOh9w+)TvsaMYDK`hb8<44c2<^nOH#xQ4TqM@ZGM!6Z%A@RP>C;@-LZ;& z0d`hzo~KH-tqs!!htu>$2CoRQM_YqjnEh?2H5E^2C%_Ss)FC0A!is{tt0HQ2>xzfL zee8LmharS;TUpCgfN2Ze?;cHv5%PXn)oBCj!(~X6vCl2`8Nh-!k>xL1G#0Wqn+WYa z-Pg?NumVcOobE-)yXD-qU3$3Bg&l?qFHN*VR4JP7gN~mD`H8rEQMOzoG+38VdkMN8 zZ<}#!9m5^}`3_HzxP&TqZ@5%pWR0gVq~fXhKHeW*_Vfy%MLB+zF%49YaaA&9f^|j- ze(n!Tiivpv%2Z$vh@JD-{3~q+8ibxLG8#|hh2mPiBb`CbJ28;#J(7Gu6k1?613Xgc z_mw;MKgI)$7n+-DhEO-ZS-_4l@%2gtH)eT)u^kQh`O@kP6GEYf*$lUF-_+W=3^jHlkAPVs_T7tz+IB zqhH?`sz&%g{C8H7isKQ4zSo*>Oq%$W zgD{Y-NX^RXZF(bWfOGtbDbKrfOWg;hZ&_O?3}GPLTi57jP8aeAMN%lp*hI*a{yhKR z!JY)qLo>$+pNN#gx%@7OxUu43>I}$-%?`drQzI+AvE~txabS!T$z80nwX;gyrEZZN zzR7LCxuycO3k z^_NK5#IQWG6h8BL8%VJ@H{)brhjpd%?i!>>1kI36u_&;qb~GKDB6>>hVpI2D5?cBc zKtWf*wOk<|)V;Lg%y;=ZRc`>b{#>p-BI4Y>AE<&$ts)O9O_H5%j)8RkUKQ}bQV5{1 z$eN}Xi1LC~hqMPQQd}TFvU?t}XEhWH6*n>Q>K{;D?T>n~wSnYn=5oOLW7hwPgFWib zld(y_hrkmXC+T`eE}O+~~n=RZ$)!8NCPfop)Hh>(BpI0KZ@1fL&_OJs4W zga0?r{4-*|Y}-ZcT(bWX}~!n%<~if`q(s6$f{Z_k)0#m>}t??~?`t6`m48Lb0Cp?;^SMgWKad zG}C`hGG{*Yb^-_fcfjZ03yN$!86gG|H+&h~VgU4>(fL%@MNR$#5S9a4m(%%uHEK!o=E#injOsikg6w)FuTJoZ#^y8xMlHnya{nVdO`Rl$T2?d zi>YjphP|k+#-4O)F=)UmXXCRJD3%sB*Vn0PqgwRB9+cSzh{3+NCQDYc?QXk+-d!Nq+ z4pi-bwAegntD9Vpt4|u@(S_3S?4<{LJx*`2qRRGv8JU?6LzVh5HF$$UKMD2ui>_pW z62QSIx|R6iLt=@3bsbt|oQSutSLj_dpAC)7OP}D&iNC+E(zu?Ouh=aNmWAutr#ft@ zEs4L1mw+YN?k_D_fq){|&$yYHbhNJAH*@-eZ-Wy0{-5^VGpebs?G_e9L8(!ChX{!D zBE1Qrs0boT5$RpJNDZNvP^1V_qyzy4r5EYF_ue~%9w0ynEd;*Y&pGEi=ecj+F`l1i zobmFD5jHD(ueH}&*P7Ry^SY(FgEhuQB4w`4zI8A0rPf`lAMxX*|Lkz;sr)GMC67c` zS8dp76c@Z`&)%*XTj6~7{jlqjtKn#JrT<=PbV6(=^C;xN;GLaPP+V+qA?cBR0qKAn zt|p#aPsnPA(-p)q{^Lls=zdg2TM?z5QrqJ%7m^Rxcpl&gWyDf%jrW#}lLTxC1yp~< zSUZj_68iXtmWa1!nf@Ff@?F=FlbvJBO_jD-NgKI7)veJlZ~8xH)4w()!7}`-ay%eI z*qB}MIA(ZiYN`iEBE!j4y`&Z(pbs@^e{t$m%{RW+&R!?=w$)^d9sPK6zYkt3IvI^P z_#T{-880ohh#2yWS$fpb?#-1Sip=Z;U&0$m>5-c^9P*Ib4j^hqB)aQmCzwHWaVX$$ zF*Le6yyMv)SIGlhqG~a0EGPUE&R@mH%X*CPU({;5uk5PP8L{N@vwX(Y@4vimuSv=w zSE2qBYWBB0)62i6^sgr})bWpXd6TqZ8HvVn7YR81U#9k;huT=e(+}v`iA5qXOTOuU zz#iLbTa4y}b1Xa`MV{#W2PX5&MEHMl@qah`|M%d3cg25q#lJ;o{|XxZFL^5zJRj%|*7j*;>hV4U zgTol*ycJhV^ZL_-UaTHYdr>ek-I4rwmPh&V948o5d+`G8)%R{I`$GEJwuvgY=U0u>z^`S^x!>PX%6EDnRLJdzjMJJ!*lnm$Pr*$tM zcF$~3OZu*A|IE*iOR0Ugg+I4{+NtG>bGlmV9)W*W|Bl0TL~=t`|(VaeosF{q-l?_1S0Qpl(6rY zF8U(y3mo^m_kTi8@EM1uE_xxW`Azg^)nW6$E5VX-l; z`G#}(*|UzbHNx5sJhyGdwQG&T?3<3y=7fZ=1NL4oO?U2;T05(dYGfpazc+FFm>H0c z($S3Bku)}Z!;RV)q%V_|#p%^@UTve??e^39E+q8~Alg;d$S;Y=Svd3_zFwVAV z_BIo0HdEi*p|}uzJ>#%kt8!HH`$^ZXNcvfuXAPW6go!x0aFfsR z)AKF3<{AUJV=V4Cm2t}9Fa+j3zv?z0>c$-;Blm(jT(Q6H)-wbkrQ+vSrH(#WCa;Sc z-JHzumzdV6#xrcBJSLt^8t>TNTGW?C<|D`#dnPiQvYc>g*$5c{Z!(GZ)!I#}9lYzh z`F#2ED2~hWI-qScqXbY_hN>4A)YuGVvxl^rUC;<`LHK zETyW+yVp)NH1jVR`(L~i?RDxcq_D!GxURwYiLcD^EyRXmd1BXBNSxP)CF)n&L0RpL%lr&aQ2rFvWpa{|vF z;EG3*cdyD}Cdzm9t~Bh94nvZR<3ANQjM)h~?OPt<(Dg!C%a9-1z{?LoX4pA+|4{1k z65)5QN~7+ZiV;B1m#v|ikNmJ`zk|;$M$&~iq{pK;GTqt=CkoEi)fCt`?r97<(v&}U zLxNksm0X@Tc~3t#I<@bc&1^cqim6}AHRQr?@t^lapg(NxiJ$VWwmZ3cpPVm6rjO0M z)0x9&>Z&$gG%qxud+xOlH5`Dw_6A(hufG*!_u@vmIKA$Nv9tWuVQ!2Kp?~=%7Q5tw ztCMVu@LDo+SOFVU_BdsDKEb)G=I-@O@lTuf%^q7n&JbVpE*9Uw^?0u?vZ<~LnCzx7 zi_-yJp8TX~FM8r`&m}6>?a_#REbw#5W6m5qy|Z=dcP6qo9(z3a2GM>nJSDbeoz~Id zupXUW*MP7o=j@8SFy^I3&B9Wh>aB(eYWBv$wPD_F&dXOb=%cx%`leHQ%s$v)eJVzF zJ>8(vUX(u04=vEhjU#N(pXnfL(#17pF=h2dXtrF3*xv@kG|AV7xUot-*|L66cYE5J zh-VV-JuU~`gEQ_p-Pau|Ge4gjoM^&gV4mr2-h*%K=JrGkHA@lGewaDGgv7+k{h=q` z8Od<*M(^UO#ADv6(<+YRy>dk9eJ)HRZ@EC~PnZbuP>Nu>(s<@9@l?Mz z3suB!dV5|1O@BI*%~KI!k$$)$>0K*#k@j}EuivzPr0hNi=7rfY6m%KlF)*EbTq8Bz zL{~*|O2))ygNKRpa~{jFzFP82&w0@ga;&y#5>FArJV^p^*-|^(OfPtghP#wL`BZ_D zA>ZtKE;6I7nj9D2NF5zt#>F6=urG~#&fNs`y=vTVlxQ8DtfQLE!q=C!Xs%B& zT7PlTDm>hKah4YKo_sFvk#j%q_&w(>toI2|O0Lves*L)iXVCCrI~Mqa(9z>T#vIL6 zjQn|E#g1ALp_tE8$Lf9JMH&ptj!+4p@cv^{OJnxyXHCsjBh!DOTuCMczX}oxjYcJM zdlDrZj8Dj^vmxJ_y!za|5b384If>`*8Y}98La=*X@?cQRscFsL20}F4EnEES(2jqH z#nXs@j?V&r=@9CR!UyacokL{u!k518y#MPgYs82%%R9FB*jvmE56iXu$r-};P1gE^ zM4;3OcmwBy=-SfW*}V5@%@wnHxxUn}!jbCz88ta#Qtqx$68tHhe52{`ca>}t&Y);} z;=8TX>J@werdG~LVsFg*^FyiG)6AtU7me@2-i@z&aoXq8$tLkd-=X|doDAm+7+L$` zherBZdXO0YXr=gc!5tRgioWNgb2fuczI%ONKPIz*Pncp2>rQuSiw}0LO(ECjvv|!a z7Z3!4F389@sMap9pt1n4sS3fu}i}Zfarv|isUYW9EkZ@i*G&zi!v_m#D8D@Cxdl)s;<22iQ zYHxT9#+$9)>SyU#nJ~HTGBzDWtRJm|9h0_SX#f7Skj>;nhG;aDvr(-2%Ra8W1Ce$_ zwbwod_nV;N!IgyFADNZ*fUy5%+G~B@3^D%f^)27ZZwoBtH#1c6D z)&87wZo#NUy4&n*Biy|Be#C@>-5hVY`|&h)4SK^4{njPuBS$Sly^z^F)vz_h%*An3 z%7%$!@?EK-wDCgWo^McnomZ+wIh}x(9eVqPLzA)R_T!-gxx(DZxYg`*a6LgLM>qVd zD6?Jx1iZSP^pO&2aefhWdU7%6QbLeZSmh-7y{BE3#cwjTv{edk`a{r!U*ybAKWg@{ zJF%3^T#UGl^V7_|BiF~3(4sjN@9Qy5=0ho8{Y}BhF{#_LB!ou&LH!CN;u#~}J{$It zMuaR>2$I8CDg8RTVtrK+grE(RJr4F7be!DoJXyc6EB^dixR7k_qkD{PQ1n&h+3B8q z4(ttC4-NXl8$~*G%zU%1a++5}M{d#`1M|JGL)O~EN(>8a`ru!5m?H8#%tW%i&G#1CM^ovq@Jh_KzTr zO+-$Q7Y1!)D=#dVBv0)O%v2`hI;|d;MDvK{`%k=)-t;>fiV2_4LfDrZ#V?4hVuKuJ zUDTwX=o<*>Nq#R^(yOyX;5ayL4Ob_U?w>24h_!uo^S|6QzEUZUByOLTugjQqgF~57 z9K@UCQmEj8(PR0mtFBkMOe~GxD*F=okF9h|gRe=a3eh`FpEjzJ9oie*8Y`;ze(R#k z$1E?-C#|9%Ree^oIxc^s!YNuUnXgpCM1Df^kBkVvVdk}Xeo`azVz@u&Lvb*$Y--6p z`!u9DZu(&<>=Ko2#C~+`gzOL6`&D%5BT5{AtJw9xN+`yRxm{)`KA9_3ta5BWC%%^j zt9m{5^w+DOIoj*b-qiMKtZK|nbeaS$_~VJ(Wqa@-c$k;-shT1QJ*{YvRav9kZpMLKp~ zGnvR%qOgJOx4Fs$oFgS5x>D$T8~}Yh6eFv>#}bH-|87Cp%@!22LZOf__G=&&W5(Um41{z zCjqYksT9o=$`_|iWfxsg%I{HOs@^uicweP z@fSI#<*7u&*ItT`mhuw?2+?$zv(ZVf#oqh?4jPho%86M2nxh!X-HLB(yOdJLdP|7C zjiMtI6fDDSlB;S6b3L*3S{&alFMpR7^b+*QxbeD1NFaAB0H~(R0PsdBF8}aZszGeL ztLU=56>tx4<7+;Dk(lz@!>DM|LwGH89|$MVIy{SwEe!a0#+aS4+)j<-Lf@bvpbFL> z)fb;jv+0AHIh(C8cirAeEn68^fMq!WYF?<|)2=!P0tTWEt}Tg75aID_NITBlZ~pIFC5(<1~HX!>%D9T6RumcnTn&`biEt9Yg!+ zpxheDU-FhATAmo#A*au8L!P5&Jx4SuR6fw$w~`k)c0=P{l#s1Up>gPRkT%Jnnnf|| z!bOa)vlG#mPkDOnea0cE;c1t6c7|q-fsXC6>zK%XU>AtsG07I3^fsc5G%n)nq2(*0 zAp1U-xh*?wR%xj$j~)xf*N@5ACB9MshE4$XO#UL&1}TER!#@C=siap#&N*LISlcAS zz1KDmxnPk(>yc4p8)-v21?pWK?CIPBgF?EU^>5OmZ>!Y!-D{=O7jRxyR5MSLl1>Xx zUZTBEPQt}88mswLrm$6iIW?!!kslR(C68hn6tQrr-iaU{+qTe)QibMMeAik@Xq}go zZ0`idNQkC+@%I&QsOkVe3(*l%xB>d<7~~?lS0Jq|kwW1%i+l!E7Ks7TXH&>qgatz8 z#yvJ>Wv=6&E?5z_(8_OpUv0ztmFukLXTiv6{s*0688?5lU-mL8G%2uhaLAo1&$Vp9 zEbvWzvib{6B+`Z(8&A{cTzNCqD~gS=8;AWBE=r(Gk=ww<`?oZ~8*&mu zff4gu%W#orj4N%t+GBFRN?%*C(Jc6ZKfKRSXi^9!Rx|-j*L1$!rjIL5D9KXP&pj@= zCmHitDIY9i$tei1Tzi=GJ#UNuWhPTV$N zbm$&#uU0d*#6*&}elz#6u$SOroO9l9E=^GT*vY*+>`7)8#dKf8Fv-wIL$2<~M=@P6 z(V1z(vXiy5V$X6bxyeM!s<>wBvOEw1j3h=03<-{NML)M>__88|JcyF<>aBS1`tG#u zbbdB*BoGN^-MEqV(D|1I|HdM})b*~9dv~V|q->4;4jEB@8rJGAn8sobFt|;XL70}uWoo%-eqogyl9uwx|UU*cA zh{shRCDpX!jqC;rI@MWw5MaM4{}ZIA=e+`@)E>Fg%dVfmyYEU_EdcQ#}^lp3Wy(cM7j+ijD*J*eZw@m`4Z<+6WRnq{` z?R;@yv#HCUD(Ddg@&iZBOJwjr66mkUIN4w$WpM1;sEF~OZSC5^pvM3>2_le>i*daa?-{@Dqe#AhX zh(sl*SM0S(tiPzVUln}F>oXqfd4JwDqqDPzN{FW?QA-_^j8axI)7-4Be(}qplbqI! zD3M&|SWg9x@|zV!cafX-1TTucA)WSt64}NB2YsS@+E({MdY% z>1IF?Ep$&@dq!hi!4Wm6#epl(NrZ4E8T1Nd74&$7U+Nj5anWxPV;5%gqAZ79$r6C+ zC$)ah2>4CK2c6Z?<&>v-B%3_Kua+qS;;^?}yq-x|neu!{bLhV*!Nr;uuk|Cll!l8( z*iDdna_;feH)a@vh}=c9_DrQMxjn*})^brNqfv<3Dg`b(*abb~iXXUQQ>4jme0n}m zt>4*mWTaa^N}Uu!8|g|lB-fFgf18{+0nT0TtYIRv;cE+{O|eK$0wmBOQX*$mpbnzK zA--u!(&o>pHe4(DOh_J~J09yO8?1Q|9KyWfyt5!IZfnr~*9wNte8CHZ*^Vj3UY*~D z((k44dY-f-3z+nkkAM%ODkLxFKRb)Io=3u7S*7uY)2gNoI!GUl8Dhva2&0e^p^1%m z?K)ZaJ-p_5u>M}3th3Gfn`De%h8>evntMLZ@K_EGB0zUqS9@%HPU2D@6uNuZuy~TE zl*XFuAsHP{V&RFW5lE- zC(d(ZDFi;S+TGh)Ud;J#E5-j>G=^pG9PejzRE`&_nN0k8Oy{7hx$q*G3hRi&^Wq(al-~fKb8L2HVWrm#iyQ6*gjKs4 z9_P6$-fop4Q0rFSaJUO5sjx*;82w{7`S_|L{ReKUFIa#H-bUFC>QM&Sb z>Q2C?-Yluj(o;S&!YL35D?7|J!WC~b0c?JlZa2OJ$EG_Fu^s@k8XZB#r=)|tTlYH# zSEX#7_4UH!iO-?Z(5(v9C^?Y9I+i_RnLyBY)sCA#mOhE7!KzL$YftTaG)2@w=i{fy z=f9lK;_#EzcI(}dauX2(I^X@nUK)#^`0n4g)T`W$x974`npRNDs|u67z0W+wNMUKD zb#0S$6%EI8AT<5q2;Iz)&(&;$RR+E^IGHe_UKK9LBc9b3zIy^KrB$R_C4*0D57j5D zpOLjoWciz7wpGGh_p02bvEa{krW(-qz>Mi;9b z2$#0n!WI~s^+|3vdzRi@91>KzW@j1gWp5HCG%n4~-O6?Pa_5uXNw^TnCR-VYpfS~E z?#1a||B|WZUCg(`f|szNi%_-a#vS^R?spA@rH4-Tekc6dughJ2jRV$n}BsKz# zWErB3`{b{9Hvz($!!$O1GTL#gzBV$}g?iy*vy&7PNxC9HVnTB|br+&)*~%xhfIT0? zjEIwn?kmD~_cQtrEq<@O-Tp{F z?|hd}|28zs8iPM8JD6YbB8_W$F*7GO*RSjo2_*B-zMh+rx9NkzH<@GU!M0NJwvkZp zIY_FKA#;>pp2yCoy%0~G(Z9tK|8s??Wx)%%*w?k@(>G%e)2p_pme%uEiDhqvc3h)W z(lfU0{Q%%M+eMZaT`KaE=4o{E;NGX_#8Wjm>5SOP8LPmAt{!9Aaj{X`am8@;T zjQnpP9&srmEUq#2mJYQEV9C2v(S4!DU)Ys}x3>IDlR&a7!bGbVWFysj8aF}U~31Uu~^K0_e0aH!Oo5$Cl;(y&T0djaySOwz%J8F<~XjraAw4w z4G=zeY%J!#=ju4*K)hAKHn{!1@8sU>BG+mCszGsrK?8Au6sS)9?78*99w3?hQ=+RM`>VC_v5YQJBetRcVxL7`$3bCj!`hq=_C)=XJ?` zkPhm~@Z?W7E~>j2eeWu2+08^R$a9zjG`lp`@5hJLF_tC0LG)F@yp% zdx#P$+PK)w3A02Do{P4hedy@q2}Expif>pa-ZxDs4Hup)B)T9<5!{#^ zP?W*vfFnXbF_bw>$S+YfiG;#q)xht48M_%GLwX`RGG7@wnAf-3)1r}W!B$4a9gkpB#;QaW z9q2V0MVL>>>?68^x?-Gjtl8dK?wKDJPmgx~gQDP%&mh+5su<35MD zXGH*v$>n#4aR$|O`Q8tL=Ws}z81*-Bd*cA1#qs0FR$i;}Ej?okWoHY`BfIh&H&{3R z@&X{&B={PyA;aI%F;HqlmozB4#A{L(8_OD|h+pXbSEvcWPDz2buCuQeAgbFHPatha1uO+Q@@^uSeY!Z!jq9jiuRUU3I@=7X$ z`6@+&PdAM`B`X;vWKZy!Gxq2lE1t~a#Qaeduo>ay#yY2`Pw2iav-lpSQu5AV&SSUi zl+V^?kM9uBGqUffBydbwBM90(Y2$SmvXI#duXLG z%gyJQANxW^eaM8cCB$}qUs8d7l~_kkLAJfFaWQaEi8Wi!R-n*CaM?FC#4g&wB5k_! zM%V2!0(ID-iv4I0lQ$#J145O8XkX09IJ!-ej8g!c|BQlw% zG!&?4J|9XPC@0@RvFp@$_=^(J6Yc+UX!1F+nR?xNXFd>nwauL=qSA1%8vNdQ{MMY< zNYh!1=j0yKo|!|=Zzr*hFT#yus&pc$a}zXkX%B8Y%mR%TGe7$3A^=yBE-EBt>v-<{{i^~;4BV_U% z;;QFGBR}u9J(F^xmUwy|(NHCEf{A|ENz?VBAX@gKd;Z#Oqd;7QN;tBJ_dUC>R))Uo z;-K=|;7lu^RP3#fqdGu;Gu|r!{Yn{Xn8)*xtli)Jaz*G6`yv>3p!rHw{-+SzlU%M_ ze3;}T=}#3~ zCUMo%kC*~Q-lvA_UC8A_@8x81*5Pd?i7tDUo`vP<1mo+qrlU;NzZ&*NPq$sj6Yr-5 zEw@_>E_Qik5=nZM5MQ&U3juO=U5#G-(q?QI013C7;QS_3e$7YnN7-~aE1J5%bh8Ye z_ASQ6#oZ{4ATkzyY4RNCc9uAO7vJSRfDSKEHoJ$@#R}A8mUE5u1zBEIHDSUi*C=)n zDvT&ML1oW?97nX?Qu=#2)}snO<-=^NeVBEPa|-Ip)2vr%8lmDYR3p0p^QBy zY((X=I*Utl83mjCnETKgH9ext0Tr+1=M7&@h9nbUMA&RH7J#Bl(VDh4JSo8LCD@B5O# zW%`x-EFiS4E3+Ebbhgq^Bk!Z2Zrz#7ZYU*#;NC)8>A)K#Q+CJ|^kfkNlCV5V-q*$*_n$PV}7xmA`01tN+82qdq?c?ruIlH&!v1}~2 z1Od&T_b(Kh1er62;*IR@qKxddB)FF;Ta#Zvme-E6S?1#*A+>bWKli-`?_4^dU(5CJ z!0E^$K!*+D@`uEocMIvHB{Uq~vU|dC#byY06wBUy?*(pn>&fymBy^ zqw04Sme)GIdc2%WJgpq7c*Liw%tGuTPm4MviEMc7%TA>Lj|%J zV(gs8f`18}7NC7X{N%7IM(&Gk-O62&_Yt?=gBBoF;YCDzpiNg&Uo|(M(eSR@U2l3S zOUZW=qtcXq{q~ZSevLy85OXd6?HeZU5AAowASz*B*`f}0HW2? zDW3F$FIkt5jD#4~ZCE(I(wT;Mw{*AqABYKfj_C-d**QD5#0B|=4f{g_oWu2^T3F&f z4>7uq1H1~TuAUIg)Ve(%Z>it~TAImZ?b>ts=SkrZ%lU`^IZY`v;4tWBuPR$Y>|3Vn zfwtcjPs?nhn6BUN#~5{zwTsDx>D>VmygG>tB_?}H3nzs{R&-a8N7cTiUSE;zRjQ%r zvAIcW&-EhXYvAzV2-102!BYvE3K&$QU2h8rua)6p6nWdR>|au0GP0_UQLm{U3NLQV zAd`mr<~;+Q$}uTAHu*w?KVkhT>N0#TIw%{WB`#y@(?h%KMCT+37k%uEtjwMax0?9h zybXyG-J>;|X*UT|^BcL9{mZVn_5rA(SQzL`c1aiXjGCO$Aa8SKWTS?&^J=jl7!^+R zVb^>>LUen=)&cU_o@$&Bl2KYgMZ)#9t*yqNmpp2T7LJF{6KDp|>xxc&EsJTb&I=b1 z`6RBv38EHJDYuqVkl0E z(G6!CQxbNxm(a#18e?ycTOXoFswlR98U(*hd)Iv<7-+uISKgcOQ>2{bfH9O!0@!XY z13xHe6CoecroG%8bdu>hjB1zYpl!EK4l^BuG_asrz>)F=(Gt7EmFFA+!y(s#z7*f& zOji>q*SPNvMjYER(z-CNU2Dps%pP;AT4ZlF+~Ir>nj{yvGaQR5{jvMUe# z>QI}UD@H~xCeEFut0T!MgA!(EQTfepG?YyGc=>WsX2kEmKtq@UjQmi@E3DtN*7vKA z>$C4qp(isC1x$Af6Pn2=*X>RT(KAs1@itMz?i)G&c0N#JAHSS$-9ctBl*luKJzl!9aY;$RQ#Qkm?r}0y=_J@IGz2B6%QiBnC8<P1 zeT~$z&Y&LY%YLN}q`z#L)}?9jSF2DtUinJNO#w?%-npddRL|4tR6J3pNlRZ9i7ZZ7 z`J$Vv!@{rsm3SFCGWKJr=i^KcPyi5W_(oc*y^fHTf6M-h%L`n{x+}@7rRm+kG2ULC0s@UP%1| z{!1>Jt!%@AWVFf&9wRM<8pSIL|EGK}a+bneV8y}CPqD0_V~J`D5chdP4Eb0hg@Yfe zj!RoYNloG9hSBr64XPCqy!HJ#r-D$D1umeZJkbUbFG~o~feUE1g{bSs$!5duXA}y< z5{)=Y&r#r1O#1-rZ(=gL2ly=UVmKxS+UVg@!9XB5=;hI}`fzh@`+?HATI#1}kHe77 zkJU78y01GL*^*oDb=@2t1%7QhKFa4lS@gn?(uG62McI<;&rjyNb4rB~@84O3Y%yuY zRW11#-hC?}OaX`*y9M?%uQ1f(zf($a7-h%mp8-%r3XN#|6bG%$2LcHwLB&bNUVO@9 z+Di2@=Q;4t>+yic(sG~&S;FCDs#_4g*&Z;PKO3zGC;PrgMs&2V5)-g-#aU2JMAX7eWf z-wlN~*ehD@21Ke;K&{fkf(9dobS$Meuc3WYMv$i;*wIq>jGeT~#=t%z`3kpWIKkn# zh`IK(1(=xK^eS}vR1_}0=8msGKcHYNzO){#ey zT)Ku*e<4x1eL(Bw;K@ByHtDF-mgcTkv^mwtk;Hz2OGH2W_+z;E9%U{yt!sMt%CYkf zH&^@gf;iLdA1Wz;k{Rv*OX;3 zA6vV-88%-hyAvxGsLkTqJf3Xq6)hoq2G3N5@h!>oRBNlwPgQ%m!+pEoYNaXE){<4T z%!)=6M)BE`DoBSg!MUReEnG4iG$UPYU};KB5L)c{?a-QY2T- zh2Z8{P=g#OGOvEqjjb&C(TfW2akvV zN!XYA)z^-@`i-YXaZ(cP7NeiZ7^EHqug-9PDE0Inj{`nBsa;3W2JYDvYsQ4EE4jL) zD0@?{Ammxv1Fr%pNcd|WQvWtLWi-VT%Jdz)nD)r%*vwW00edM9H_N~9xE_8{dm5}p zU3m^MBx=|GF`y1$APh(?YGPOZe(!tLROXYK=7>xs3oZ?OD1Fs}&kG-GJBc68NZu`= z2AdB&r@8g|h4{OapVKvd`(dtXsnLRB;)AB9bfw`TzKfgno96OwM%94{u~xrR_`Wn$z;S1RJ`67+2U)3s_7s*eH*cVq?%oz>|Mk=_W;h~wAn@Xxjot9WNX^WoiT^<~ zk)Uiaef#113U3Q`Rb6X#w2Xqx=q?w{NwchA)*HlL?WKk&as%35w_IO7rWJrxWo?VY z!wW#>3an%vTAwZ^#$|wZ;_d`~V4EMSqPWu?da$#$%}o*e>tgH7=ww=%po4K$CAOXW`#!*HN#iuO&@C*ut1`$Qn$Ebxrgz`ms zr!d01@5DXDA7RR+xX?|J?%wy$ZcDFPh-IhJ`h^4b!jWk#STk2Cbbq8>5-bQ#AB6@H z03$|pX`7O7CbLj2OP5lp?y1HaKXiCR-!F=tp!Qp~@s)_@MK*SvkXE=9 zEj&aWrGbmG`hN@AYz;%QuuX;o5t9C|H!QNNQI!aTM|_yJSH_hz1T=G#WkcG^Hs70_I zM_w{$5P}K+(DZhApAi)MykWt0YHK%XJCCyU5OYZ4cK)5F-3@H5L&eCpRUUOHF}z&j zqFkBM$*2JPVNY}{!QIGUj>rJ-$GP5E6}NP}mCdM%GnLwy{&dbLEFhdK$hAndy{SoR z&9-5p_c?5M>&rJPw#4?Iyu_p-=sm4P)zu$GWw;bXokspOuLAk#KUpZ0KOIg4N1b z7IJg%)o?}&So~U+OmK0)c9Kru%2|Ffkasq&`^r6zeE)bK`|N*HZvJPQtg(T>+kU>{ zdmO@za2`G%@;sj{h)_rA)blk* zE@8Bs%f$_Vy{*q`g$QA0q{&r-F!ma`)stOU+vBVZ=F z)m|2G4Ad$C4^ZZXmxB0EkRneE2eq=%+9Sb|VGsk47+JR}4-M7RQK~NJ1*l-wh@~4c zq*TCepd)cf0l{SZaw^id{J@|<*WehgR8a-Zic;AU@^M2kB`UD(SBEx*M@nHyZAl{A}0 z*D!F1$j^eO+KcuTe(jcw@s-vIw(uXH&KH=_-}WGm)-0QH*SI=hms5r2O~(ODlK}JA zGs4*kFhZ4Ab>@B~esWa}rF?yiacdPR(X%&U9o@8Ti#r35yhBICC9!b^j}*P}Gj5mL zSxjyp$z;xK9j%Z3cKnCzi=Bjq?wxC>K&>?9>i8`K`SzN!H_LF$4Z5mM#xbpwKFPv^ zUWq=LX4G4ewpVgHVHmbK6_LI@m({bK?&P2wOY`!*ZjxcvUl!Q=^i+p#%rVWe8@%=r zo%5*CLD>x=OT%R08z=ku=ORm;*8$KzlG)WiIo5`qlz$d#} zkWyc5^m>x9y9a;bKk_bbp*Q@jk4`!LJl_9tX4T!F{-y{)8p-Ahh}r*|EHGGFsL}KN z`@Pt(;a{frETvv9{QMJg8?djDc^X|GAlCra!I@7NCi>O>nys+a{@vw&^=7FN@{3tE z%5yp{ts(K>CwzcmzzwZq264w zw_T7Z0vGLL`UEU1VNvFknN#9D41vb%yvX7^r#NI&DwkkxnYmRA`mM>}K?>CqE_>PY& zT|Xc)HrQk8G?F zSH$>hAb4cHi5DMozq9gj((Iv3)rp_qm%j~vfRjK#>~ho0z<19j3Gu2ok;Y)OC>ARo zw5k7xFQ|AFz(gOhZ1yx?r+oeM-0|rz4gCGnIs)AFhFM=5p8oyC{Ab&LO&uF5+$pp0)%`@J zf8SOAtEYFrgS);C^cWofhYtM11~&W%w|^OY=j09h&z^Vp9>Ep4$3w{kt@WvZ8@QjR M${L^|MU%k)52z)LLjV8( literal 0 HcmV?d00001 diff --git a/docs/observability/index.asciidoc b/docs/observability/index.asciidoc new file mode 100644 index 00000000000000..d63402e8df2fbd --- /dev/null +++ b/docs/observability/index.asciidoc @@ -0,0 +1,24 @@ +[chapter] +[role="xpack"] +[[observability]] += Observability + +Observability enables you to add and monitor your logs, system +metrics, uptime data, and application traces, as a single stack. + +With *Observability*, you have: + +* A central place to add and configure your data sources. +* A variety of charts displaying analytics relating to each data source. +* *View in app* options to drill down and analyze data in the Logs, Metrics, Uptime, and APM apps. +* An alerts chart to keep you informed of any issues that you may need to resolve quickly. + +[role="screenshot"] +image::observability/images/observability-overview.png[Observability Overview in {kib}] + +[float] +== Get started + +{kib} provides step-by-step instructions to help you add and configure your data +sources. The {observability-guide}/index.html[Observability Guide] is a good source for more detailed information +and instructions. diff --git a/docs/user/index.asciidoc b/docs/user/index.asciidoc index 01be8c2e264c5c..abbdbeb68d9cbc 100644 --- a/docs/user/index.asciidoc +++ b/docs/user/index.asciidoc @@ -27,6 +27,8 @@ include::graph/index.asciidoc[] include::visualize.asciidoc[] +include::{kib-repo-dir}/observability/index.asciidoc[] + include::{kib-repo-dir}/logs/index.asciidoc[] include::{kib-repo-dir}/infrastructure/index.asciidoc[] From c24b17f334fed777f65d34ddae104c80be3ec9c9 Mon Sep 17 00:00:00 2001 From: Matthias Wilhelm Date: Wed, 5 Aug 2020 10:49:36 +0200 Subject: [PATCH 02/33] [Discover] Inline noWhiteSpace function (#74331) * Inline noWhiteSpace function * Fix TypeScript * Remove unused function file --- .../kibana/common/utils/no_white_space.js | 37 ------------------- .../angular/doc_table/components/table_row.ts | 21 +++++++---- 2 files changed, 14 insertions(+), 44 deletions(-) delete mode 100644 src/legacy/core_plugins/kibana/common/utils/no_white_space.js diff --git a/src/legacy/core_plugins/kibana/common/utils/no_white_space.js b/src/legacy/core_plugins/kibana/common/utils/no_white_space.js deleted file mode 100644 index 580418eb3423f4..00000000000000 --- a/src/legacy/core_plugins/kibana/common/utils/no_white_space.js +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -const TAGS_WITH_WS = />\s+<'); -} diff --git a/src/plugins/discover/public/application/angular/doc_table/components/table_row.ts b/src/plugins/discover/public/application/angular/doc_table/components/table_row.ts index 7b862ec518a040..e7fafde2e68d0d 100644 --- a/src/plugins/discover/public/application/angular/doc_table/components/table_row.ts +++ b/src/plugins/discover/public/application/angular/doc_table/components/table_row.ts @@ -17,13 +17,10 @@ * under the License. */ -import _ from 'lodash'; +import { find, template } from 'lodash'; import $ from 'jquery'; -// @ts-ignore import rison from 'rison-node'; import '../../doc_viewer'; -// @ts-ignore -import { noWhiteSpace } from '../../../../../../../legacy/core_plugins/kibana/common/utils/no_white_space'; import openRowHtml from './table_row/open.html'; import detailsHtml from './table_row/details.html'; @@ -35,6 +32,16 @@ import truncateByHeightTemplateHtml from '../components/table_row/truncate_by_he import { esFilters } from '../../../../../../data/public'; import { getServices } from '../../../../kibana_services'; +const TAGS_WITH_WS = />\s+<'); +} + // guesstimate at the minimum number of chars wide cells in the table should be const MIN_LINE_LENGTH = 20; @@ -43,8 +50,8 @@ interface LazyScope extends ng.IScope { } export function createTableRowDirective($compile: ng.ICompileService, $httpParamSerializer: any) { - const cellTemplate = _.template(noWhiteSpace(cellTemplateHtml)); - const truncateByHeightTemplate = _.template(noWhiteSpace(truncateByHeightTemplateHtml)); + const cellTemplate = template(noWhiteSpace(cellTemplateHtml)); + const truncateByHeightTemplate = template(noWhiteSpace(truncateByHeightTemplateHtml)); return { restrict: 'A', @@ -169,7 +176,7 @@ export function createTableRowDirective($compile: ng.ICompileService, $httpParam const $cell = $cells.eq(i); if ($cell.data('discover:html') === html) return; - const reuse = _.find($cells.slice(i + 1), function (cell: any) { + const reuse = find($cells.slice(i + 1), function (cell: any) { return $.data(cell, 'discover:html') === html; }); From 22d6f09d317b54cf2832ec4cac51df42db17c28f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez?= Date: Wed, 5 Aug 2020 11:19:41 +0200 Subject: [PATCH 03/33] [Logs UI] Correct trial period duration in anomaly splash screen (#74249) --- .../logging/log_analysis_setup/subscription_splash_content.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/infra/public/components/logging/log_analysis_setup/subscription_splash_content.tsx b/x-pack/plugins/infra/public/components/logging/log_analysis_setup/subscription_splash_content.tsx index e0e293b1cc3e75..81f52f986cab81 100644 --- a/x-pack/plugins/infra/public/components/logging/log_analysis_setup/subscription_splash_content.tsx +++ b/x-pack/plugins/infra/public/components/logging/log_analysis_setup/subscription_splash_content.tsx @@ -61,7 +61,7 @@ export const SubscriptionSplashContent: React.FC = () => { description = ( ); From beb7b8245d0b28662a988efb6c856af8fb35d280 Mon Sep 17 00:00:00 2001 From: John Schulz Date: Wed, 5 Aug 2020 07:08:04 -0400 Subject: [PATCH 04/33] [Ingest Manager] prevent crash on unhandled rejection from setupIngestManager (#74300) * Add test to ensure setup rejects if errors thrown. * Return the promise from setup so test passes --- .../server/services/setup.test.ts | 44 +++++++++++++++++++ .../ingest_manager/server/services/setup.ts | 5 +++ 2 files changed, 49 insertions(+) create mode 100644 x-pack/plugins/ingest_manager/server/services/setup.test.ts diff --git a/x-pack/plugins/ingest_manager/server/services/setup.test.ts b/x-pack/plugins/ingest_manager/server/services/setup.test.ts new file mode 100644 index 00000000000000..474b2fde23c81d --- /dev/null +++ b/x-pack/plugins/ingest_manager/server/services/setup.test.ts @@ -0,0 +1,44 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { setupIngestManager } from './setup'; +import { savedObjectsClientMock } from 'src/core/server/mocks'; + +describe('setupIngestManager', () => { + it('returned promise should reject if errors thrown', async () => { + const { savedObjectsClient, callClusterMock } = makeErrorMocks(); + const setupPromise = setupIngestManager(savedObjectsClient, callClusterMock); + await expect(setupPromise).rejects.toThrow('mocked'); + }); +}); + +function makeErrorMocks() { + jest.mock('./app_context'); // else fails w/"Logger not set." + jest.mock('./epm/registry/registry_url', () => { + return { + fetchUrl: () => { + throw new Error('mocked registry#fetchUrl'); + }, + }; + }); + + const callClusterMock = jest.fn(); + const savedObjectsClient = savedObjectsClientMock.create(); + savedObjectsClient.find = jest.fn().mockImplementation(() => { + throw new Error('mocked SO#find'); + }); + savedObjectsClient.get = jest.fn().mockImplementation(() => { + throw new Error('mocked SO#get'); + }); + savedObjectsClient.update = jest.fn().mockImplementation(() => { + throw new Error('mocked SO#update'); + }); + + return { + savedObjectsClient, + callClusterMock, + }; +} diff --git a/x-pack/plugins/ingest_manager/server/services/setup.ts b/x-pack/plugins/ingest_manager/server/services/setup.ts index c91cae98e17d2e..4ef093d38879ab 100644 --- a/x-pack/plugins/ingest_manager/server/services/setup.ts +++ b/x-pack/plugins/ingest_manager/server/services/setup.ts @@ -127,6 +127,11 @@ export async function setupIngestManager( // if anything errors, reject/fail onSetupReject(error); } + + // be sure to return the promise because it has the resolved/rejected status attached to it + // otherwise, we effectively return success every time even if there are errors + // because `return undefined` -> `Promise.resolve(undefined)` in an `async` function + return setupIngestStatus; } export async function setupFleet( From 8231b0ccfc12f9756dedf16ba7c36d8dcae0769a Mon Sep 17 00:00:00 2001 From: Dima Arnautov Date: Wed, 5 Aug 2020 13:18:29 +0200 Subject: [PATCH 05/33] [ML] Fix initial plugin's bundle size (#74047) * [ML] use dynamic imports * [ML] fix react-use imports * [ML] change embeddables imports * [ML] embeddable exports * [ML] move SCSS import * [ML] management page styles * [ML] refactor with types and constants files * [ML] move declarations --- .../plugins/ml/public/application/_index.scss | 6 -- x-pack/plugins/ml/public/application/app.tsx | 1 + .../components/data_grid/use_column_chart.tsx | 2 +- .../explorer/add_to_dashboard_control.tsx | 6 +- .../explorer/swimlane_container.tsx | 7 +- .../public/application/management/_index.scss | 1 - .../management/jobs_list/_index.scss | 5 +- .../application/management/jobs_list/index.ts | 1 + .../application/routing/routes/jobs_list.tsx | 2 +- .../routing/routes/timeseriesexplorer.tsx | 2 +- .../public/application/routing/use_refresh.ts | 2 +- .../public/application/util/string_utils.ts | 4 +- .../anomaly_swimlane_embeddable.tsx | 74 +++---------------- ...omaly_swimlane_embeddable_factory.test.tsx | 6 +- .../anomaly_swimlane_embeddable_factory.ts | 28 ++++--- .../anomaly_swimlane_initializer.tsx | 2 +- .../anomaly_swimlane_setup_flyout.tsx | 6 +- .../embeddable_swim_lane_container.test.tsx | 7 +- .../embeddable_swim_lane_container.tsx | 16 ++-- .../embeddables/anomaly_swimlane/index.ts | 1 - .../swimlane_input_resolver.test.ts | 5 +- .../swimlane_input_resolver.ts | 10 +-- .../ml/public/embeddables/constants.ts | 7 ++ x-pack/plugins/ml/public/embeddables/index.ts | 3 + x-pack/plugins/ml/public/embeddables/types.ts | 66 +++++++++++++++++ x-pack/plugins/ml/public/index.scss | 1 - x-pack/plugins/ml/public/index.ts | 1 - x-pack/plugins/ml/public/plugin.ts | 25 +++---- .../apply_influencer_filters_action.tsx | 7 +- .../ui_actions/apply_time_range_action.tsx | 7 +- .../ui_actions/edit_swimlane_panel_action.tsx | 16 ++-- x-pack/plugins/ml/public/ui_actions/index.ts | 10 ++- .../open_in_anomaly_explorer_action.tsx | 7 +- x-pack/plugins/ml/public/url_generator.ts | 12 ++- 34 files changed, 180 insertions(+), 176 deletions(-) delete mode 100644 x-pack/plugins/ml/public/application/management/_index.scss create mode 100644 x-pack/plugins/ml/public/embeddables/constants.ts create mode 100644 x-pack/plugins/ml/public/embeddables/types.ts delete mode 100644 x-pack/plugins/ml/public/index.scss diff --git a/x-pack/plugins/ml/public/application/_index.scss b/x-pack/plugins/ml/public/application/_index.scss index 65e914a1ac923a..45b14543946c7c 100644 --- a/x-pack/plugins/ml/public/application/_index.scss +++ b/x-pack/plugins/ml/public/application/_index.scss @@ -1,11 +1,6 @@ // ML has it's own variables for coloring @import 'variables'; -// Kibana management page ML section -#kibanaManagementMLSection { - @import 'management/index'; -} - // Protect the rest of Kibana from ML generic namespacing // SASSTODO: Prefix ml selectors instead .ml-app { @@ -24,7 +19,6 @@ // Components @import 'components/annotations/annotation_description_list/index'; // SASSTODO: This file overwrites EUI directly @import 'components/anomalies_table/index'; // SASSTODO: This file overwrites EUI directly - @import 'components/chart_tooltip/index'; @import 'components/color_range_legend/index'; @import 'components/controls/index'; @import 'components/entity_cell/index'; diff --git a/x-pack/plugins/ml/public/application/app.tsx b/x-pack/plugins/ml/public/application/app.tsx index cc3af9d7f49805..42c462fa9d8697 100644 --- a/x-pack/plugins/ml/public/application/app.tsx +++ b/x-pack/plugins/ml/public/application/app.tsx @@ -5,6 +5,7 @@ */ import React, { FC } from 'react'; +import './_index.scss'; import ReactDOM from 'react-dom'; import { AppMountParameters, CoreStart, HttpStart } from 'kibana/public'; diff --git a/x-pack/plugins/ml/public/application/components/data_grid/use_column_chart.tsx b/x-pack/plugins/ml/public/application/components/data_grid/use_column_chart.tsx index a762c44e243bf0..6b5fbbb22120d1 100644 --- a/x-pack/plugins/ml/public/application/components/data_grid/use_column_chart.tsx +++ b/x-pack/plugins/ml/public/application/components/data_grid/use_column_chart.tsx @@ -8,7 +8,7 @@ import moment from 'moment'; import { BehaviorSubject } from 'rxjs'; import React from 'react'; -import { useObservable } from 'react-use'; +import useObservable from 'react-use/lib/useObservable'; import { euiPaletteColorBlind, EuiDataGridColumn } from '@elastic/eui'; diff --git a/x-pack/plugins/ml/public/application/explorer/add_to_dashboard_control.tsx b/x-pack/plugins/ml/public/application/explorer/add_to_dashboard_control.tsx index 3ad749c9d06314..04ce7f79e1c029 100644 --- a/x-pack/plugins/ml/public/application/explorer/add_to_dashboard_control.tsx +++ b/x-pack/plugins/ml/public/application/explorer/add_to_dashboard_control.tsx @@ -25,13 +25,11 @@ import { EuiInMemoryTable } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { useMlKibana } from '../contexts/kibana'; import { SavedObjectDashboard } from '../../../../../../src/plugins/dashboard/public'; -import { - ANOMALY_SWIMLANE_EMBEDDABLE_TYPE, - getDefaultPanelTitle, -} from '../../embeddables/anomaly_swimlane/anomaly_swimlane_embeddable'; +import { getDefaultPanelTitle } from '../../embeddables/anomaly_swimlane/anomaly_swimlane_embeddable'; import { useDashboardService } from '../services/dashboard_service'; import { SWIMLANE_TYPE, SwimlaneType } from './explorer_constants'; import { JobId } from '../../../common/types/anomaly_detection_jobs'; +import { ANOMALY_SWIMLANE_EMBEDDABLE_TYPE } from '../../embeddables'; export interface DashboardItem { id: string; diff --git a/x-pack/plugins/ml/public/application/explorer/swimlane_container.tsx b/x-pack/plugins/ml/public/application/explorer/swimlane_container.tsx index 51ea0f00d5f6ac..0fefa71dea48b4 100644 --- a/x-pack/plugins/ml/public/application/explorer/swimlane_container.tsx +++ b/x-pack/plugins/ml/public/application/explorer/swimlane_container.tsx @@ -15,12 +15,9 @@ import { } from '@elastic/eui'; import { throttle } from 'lodash'; -import { - ExplorerSwimlane, - ExplorerSwimlaneProps, -} from '../../application/explorer/explorer_swimlane'; +import { ExplorerSwimlane, ExplorerSwimlaneProps } from './explorer_swimlane'; -import { MlTooltipComponent } from '../../application/components/chart_tooltip'; +import { MlTooltipComponent } from '../components/chart_tooltip'; import { SwimLanePagination } from './swimlane_pagination'; import { SWIMLANE_TYPE } from './explorer_constants'; import { ViewBySwimLaneData } from './explorer_utils'; diff --git a/x-pack/plugins/ml/public/application/management/_index.scss b/x-pack/plugins/ml/public/application/management/_index.scss deleted file mode 100644 index e14df2d7c20395..00000000000000 --- a/x-pack/plugins/ml/public/application/management/_index.scss +++ /dev/null @@ -1 +0,0 @@ -@import 'jobs_list/index'; diff --git a/x-pack/plugins/ml/public/application/management/jobs_list/_index.scss b/x-pack/plugins/ml/public/application/management/jobs_list/_index.scss index 841415620d6917..d4928a4126c1be 100644 --- a/x-pack/plugins/ml/public/application/management/jobs_list/_index.scss +++ b/x-pack/plugins/ml/public/application/management/jobs_list/_index.scss @@ -1 +1,4 @@ -@import 'components/index'; +// Kibana management page ML section +#kibanaManagementMLSection { + @import 'components/index'; +} diff --git a/x-pack/plugins/ml/public/application/management/jobs_list/index.ts b/x-pack/plugins/ml/public/application/management/jobs_list/index.ts index b16f680a2a362f..81190a412abc03 100644 --- a/x-pack/plugins/ml/public/application/management/jobs_list/index.ts +++ b/x-pack/plugins/ml/public/application/management/jobs_list/index.ts @@ -12,6 +12,7 @@ import { MlStartDependencies } from '../../../plugin'; import { JobsListPage } from './components'; import { getJobsListBreadcrumbs } from '../breadcrumbs'; import { setDependencyCache, clearCache } from '../../util/dependency_cache'; +import './_index.scss'; const renderApp = (element: HTMLElement, coreStart: CoreStart) => { ReactDOM.render(React.createElement(JobsListPage, { coreStart }), element); diff --git a/x-pack/plugins/ml/public/application/routing/routes/jobs_list.tsx b/x-pack/plugins/ml/public/application/routing/routes/jobs_list.tsx index db58b6a537e06f..38a7900916ba83 100644 --- a/x-pack/plugins/ml/public/application/routing/routes/jobs_list.tsx +++ b/x-pack/plugins/ml/public/application/routing/routes/jobs_list.tsx @@ -5,7 +5,7 @@ */ import React, { useEffect, FC } from 'react'; -import { useObservable } from 'react-use'; +import useObservable from 'react-use/lib/useObservable'; import { i18n } from '@kbn/i18n'; import { NavigateToPath } from '../../contexts/kibana'; diff --git a/x-pack/plugins/ml/public/application/routing/routes/timeseriesexplorer.tsx b/x-pack/plugins/ml/public/application/routing/routes/timeseriesexplorer.tsx index 6486db818e1138..1f122ed18a8512 100644 --- a/x-pack/plugins/ml/public/application/routing/routes/timeseriesexplorer.tsx +++ b/x-pack/plugins/ml/public/application/routing/routes/timeseriesexplorer.tsx @@ -6,7 +6,7 @@ import { isEqual } from 'lodash'; import React, { FC, useCallback, useEffect, useState } from 'react'; -import { usePrevious } from 'react-use'; +import usePrevious from 'react-use/lib/usePrevious'; import moment from 'moment'; import { i18n } from '@kbn/i18n'; diff --git a/x-pack/plugins/ml/public/application/routing/use_refresh.ts b/x-pack/plugins/ml/public/application/routing/use_refresh.ts index 539ce6f88a421e..332677e3c5796e 100644 --- a/x-pack/plugins/ml/public/application/routing/use_refresh.ts +++ b/x-pack/plugins/ml/public/application/routing/use_refresh.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { useObservable } from 'react-use'; +import useObservable from 'react-use/lib/useObservable'; import { merge } from 'rxjs'; import { map } from 'rxjs/operators'; diff --git a/x-pack/plugins/ml/public/application/util/string_utils.ts b/x-pack/plugins/ml/public/application/util/string_utils.ts index 55dd16082a07c2..88900c8b0ce713 100644 --- a/x-pack/plugins/ml/public/application/util/string_utils.ts +++ b/x-pack/plugins/ml/public/application/util/string_utils.ts @@ -7,7 +7,6 @@ /* * Contains utility functions for performing operations on Strings. */ -import _ from 'lodash'; import d3 from 'd3'; import he from 'he'; @@ -28,7 +27,8 @@ export function replaceStringTokens( ) { return String(str).replace(/\$([^?&$\'"]+)\$/g, (match, name) => { // Use lodash get to allow nested JSON fields to be retrieved. - let tokenValue = _.get(valuesByTokenName, name, null); + let tokenValue = + valuesByTokenName && valuesByTokenName[name] !== undefined ? valuesByTokenName[name] : null; if (encodeForURI === true && tokenValue !== null) { tokenValue = encodeURIComponent(tokenValue); } diff --git a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable.tsx b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable.tsx index 9f96b73d67c578..e837cabf0b4943 100644 --- a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable.tsx +++ b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable.tsx @@ -9,29 +9,17 @@ import ReactDOM from 'react-dom'; import { CoreStart } from 'kibana/public'; import { i18n } from '@kbn/i18n'; import { Subject } from 'rxjs'; -import { - Embeddable, - EmbeddableInput, - EmbeddableOutput, - IContainer, - IEmbeddable, -} from '../../../../../../src/plugins/embeddable/public'; +import { Embeddable, IContainer } from '../../../../../../src/plugins/embeddable/public'; import { EmbeddableSwimLaneContainer } from './embeddable_swim_lane_container'; -import { AnomalyDetectorService } from '../../application/services/anomaly_detector_service'; import { JobId } from '../../../common/types/anomaly_detection_jobs'; -import { AnomalyTimelineService } from '../../application/services/anomaly_timeline_service'; -import { - Filter, - Query, - RefreshInterval, - TimeRange, -} from '../../../../../../src/plugins/data/common'; -import { SwimlaneType } from '../../application/explorer/explorer_constants'; import { MlDependencies } from '../../application/app'; -import { AppStateSelectedCells } from '../../application/explorer/explorer_utils'; -import { SWIM_LANE_SELECTION_TRIGGER } from '../../ui_actions/triggers'; - -export const ANOMALY_SWIMLANE_EMBEDDABLE_TYPE = 'ml_anomaly_swimlane'; +import { SWIM_LANE_SELECTION_TRIGGER } from '../../ui_actions'; +import { + ANOMALY_SWIMLANE_EMBEDDABLE_TYPE, + AnomalySwimlaneEmbeddableInput, + AnomalySwimlaneEmbeddableOutput, + AnomalySwimlaneServices, +} from '..'; export const getDefaultPanelTitle = (jobIds: JobId[]) => i18n.translate('xpack.ml.swimlaneEmbeddable.title', { @@ -39,51 +27,7 @@ export const getDefaultPanelTitle = (jobIds: JobId[]) => values: { jobIds: jobIds.join(', ') }, }); -export interface AnomalySwimlaneEmbeddableCustomInput { - jobIds: JobId[]; - swimlaneType: SwimlaneType; - viewBy?: string; - perPage?: number; - - // Embeddable inputs which are not included in the default interface - filters: Filter[]; - query: Query; - refreshConfig: RefreshInterval; - timeRange: TimeRange; -} - -export interface EditSwimlanePanelContext { - embeddable: IEmbeddable; -} - -export interface SwimLaneDrilldownContext extends EditSwimlanePanelContext { - /** - * Optional data provided by swim lane selection - */ - data?: AppStateSelectedCells; -} - -export type AnomalySwimlaneEmbeddableInput = EmbeddableInput & AnomalySwimlaneEmbeddableCustomInput; - -export type AnomalySwimlaneEmbeddableOutput = EmbeddableOutput & - AnomalySwimlaneEmbeddableCustomOutput; - -export interface AnomalySwimlaneEmbeddableCustomOutput { - perPage?: number; - fromPage?: number; - interval?: number; -} - -export interface AnomalySwimlaneServices { - anomalyDetectorService: AnomalyDetectorService; - anomalyTimelineService: AnomalyTimelineService; -} - -export type AnomalySwimlaneEmbeddableServices = [ - CoreStart, - MlDependencies, - AnomalySwimlaneServices -]; +export type IAnomalySwimlaneEmbeddable = typeof AnomalySwimlaneEmbeddable; export class AnomalySwimlaneEmbeddable extends Embeddable< AnomalySwimlaneEmbeddableInput, diff --git a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable_factory.test.tsx b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable_factory.test.tsx index 243369982ac1f8..12813ad6277aaf 100644 --- a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable_factory.test.tsx +++ b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable_factory.test.tsx @@ -7,10 +7,8 @@ import { AnomalySwimlaneEmbeddableFactory } from './anomaly_swimlane_embeddable_factory'; import { coreMock } from '../../../../../../src/core/public/mocks'; import { dataPluginMock } from '../../../../../../src/plugins/data/public/mocks'; -import { - AnomalySwimlaneEmbeddable, - AnomalySwimlaneEmbeddableInput, -} from './anomaly_swimlane_embeddable'; +import { AnomalySwimlaneEmbeddable } from './anomaly_swimlane_embeddable'; +import { AnomalySwimlaneEmbeddableInput } from '..'; jest.mock('./anomaly_swimlane_embeddable', () => ({ AnomalySwimlaneEmbeddable: jest.fn(), diff --git a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable_factory.ts b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable_factory.ts index 14fbf77544b216..9d2fd07e11be5a 100644 --- a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable_factory.ts +++ b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable_factory.ts @@ -10,23 +10,16 @@ import { StartServicesAccessor } from 'kibana/public'; import { EmbeddableFactoryDefinition, - ErrorEmbeddable, IContainer, } from '../../../../../../src/plugins/embeddable/public'; +import { HttpService } from '../../application/services/http_service'; +import { MlPluginStart, MlStartDependencies } from '../../plugin'; +import { MlDependencies } from '../../application/app'; import { ANOMALY_SWIMLANE_EMBEDDABLE_TYPE, - AnomalySwimlaneEmbeddable, AnomalySwimlaneEmbeddableInput, AnomalySwimlaneEmbeddableServices, -} from './anomaly_swimlane_embeddable'; -import { HttpService } from '../../application/services/http_service'; -import { AnomalyDetectorService } from '../../application/services/anomaly_detector_service'; -import { AnomalyTimelineService } from '../../application/services/anomaly_timeline_service'; -import { mlResultsServiceProvider } from '../../application/services/results_service'; -import { resolveAnomalySwimlaneUserInput } from './anomaly_swimlane_setup_flyout'; -import { mlApiServicesProvider } from '../../application/services/ml_api_service'; -import { MlPluginStart, MlStartDependencies } from '../../plugin'; -import { MlDependencies } from '../../application/app'; +} from '..'; export class AnomalySwimlaneEmbeddableFactory implements EmbeddableFactoryDefinition { @@ -50,6 +43,7 @@ export class AnomalySwimlaneEmbeddableFactory const [coreStart] = await this.getServices(); try { + const { resolveAnomalySwimlaneUserInput } = await import('./anomaly_swimlane_setup_flyout'); return await resolveAnomalySwimlaneUserInput(coreStart); } catch (e) { return Promise.reject(); @@ -59,6 +53,15 @@ export class AnomalySwimlaneEmbeddableFactory private async getServices(): Promise { const [coreStart, pluginsStart] = await this.getStartServices(); + const { AnomalyDetectorService } = await import( + '../../application/services/anomaly_detector_service' + ); + const { AnomalyTimelineService } = await import( + '../../application/services/anomaly_timeline_service' + ); + const { mlApiServicesProvider } = await import('../../application/services/ml_api_service'); + const { mlResultsServiceProvider } = await import('../../application/services/results_service'); + const httpService = new HttpService(coreStart.http); const anomalyDetectorService = new AnomalyDetectorService(httpService); const anomalyTimelineService = new AnomalyTimelineService( @@ -77,8 +80,9 @@ export class AnomalySwimlaneEmbeddableFactory public async create( initialInput: AnomalySwimlaneEmbeddableInput, parent?: IContainer - ): Promise { + ): Promise { const services = await this.getServices(); + const { AnomalySwimlaneEmbeddable } = await import('./anomaly_swimlane_embeddable'); return new AnomalySwimlaneEmbeddable(initialInput, services, parent); } } diff --git a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_initializer.tsx b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_initializer.tsx index e5a13adca05db4..026d4e225f45b3 100644 --- a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_initializer.tsx +++ b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_initializer.tsx @@ -22,7 +22,7 @@ import { import { FormattedMessage } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; import { SWIMLANE_TYPE, SwimlaneType } from '../../application/explorer/explorer_constants'; -import { AnomalySwimlaneEmbeddableInput } from './anomaly_swimlane_embeddable'; +import { AnomalySwimlaneEmbeddableInput } from '..'; export interface AnomalySwimlaneInitializerProps { defaultTitle: string; diff --git a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_setup_flyout.tsx b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_setup_flyout.tsx index 1ffdadb60aaa33..3a3597a7fa9274 100644 --- a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_setup_flyout.tsx +++ b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_setup_flyout.tsx @@ -16,12 +16,10 @@ import { AnomalySwimlaneInitializer } from './anomaly_swimlane_initializer'; import { JobSelectorFlyout } from '../../application/components/job_selector/job_selector_flyout'; import { AnomalyDetectorService } from '../../application/services/anomaly_detector_service'; import { getInitialGroupsMap } from '../../application/components/job_selector/job_selector'; -import { - AnomalySwimlaneEmbeddableInput, - getDefaultPanelTitle, -} from './anomaly_swimlane_embeddable'; +import { getDefaultPanelTitle } from './anomaly_swimlane_embeddable'; import { getMlGlobalServices } from '../../application/app'; import { HttpService } from '../../application/services/http_service'; +import { AnomalySwimlaneEmbeddableInput } from '..'; export async function resolveAnomalySwimlaneUserInput( coreStart: CoreStart, diff --git a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/embeddable_swim_lane_container.test.tsx b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/embeddable_swim_lane_container.test.tsx index 23045834eae5f0..ff621953cc577a 100644 --- a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/embeddable_swim_lane_container.test.tsx +++ b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/embeddable_swim_lane_container.test.tsx @@ -12,11 +12,7 @@ import { } from './embeddable_swim_lane_container'; import { BehaviorSubject, Observable } from 'rxjs'; import { I18nProvider } from '@kbn/i18n/react'; -import { - AnomalySwimlaneEmbeddable, - AnomalySwimlaneEmbeddableInput, - AnomalySwimlaneServices, -} from './anomaly_swimlane_embeddable'; +import { AnomalySwimlaneEmbeddable } from './anomaly_swimlane_embeddable'; import { CoreStart } from 'kibana/public'; import { useSwimlaneInputResolver } from './swimlane_input_resolver'; import { SWIMLANE_TYPE } from '../../application/explorer/explorer_constants'; @@ -25,6 +21,7 @@ import { MlDependencies } from '../../application/app'; import { uiActionsPluginMock } from 'src/plugins/ui_actions/public/mocks'; import { TriggerContract } from 'src/plugins/ui_actions/public/triggers'; import { TriggerId } from 'src/plugins/ui_actions/public'; +import { AnomalySwimlaneEmbeddableInput, AnomalySwimlaneServices } from '..'; jest.mock('./swimlane_input_resolver', () => ({ useSwimlaneInputResolver: jest.fn(() => { diff --git a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/embeddable_swim_lane_container.tsx b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/embeddable_swim_lane_container.tsx index 8ee4e391fcddee..60681446ac7aa6 100644 --- a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/embeddable_swim_lane_container.tsx +++ b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/embeddable_swim_lane_container.tsx @@ -10,12 +10,7 @@ import { Observable } from 'rxjs'; import { CoreStart } from 'kibana/public'; import { FormattedMessage } from '@kbn/i18n/react'; -import { - AnomalySwimlaneEmbeddable, - AnomalySwimlaneEmbeddableInput, - AnomalySwimlaneEmbeddableOutput, - AnomalySwimlaneServices, -} from './anomaly_swimlane_embeddable'; +import { IAnomalySwimlaneEmbeddable } from './anomaly_swimlane_embeddable'; import { useSwimlaneInputResolver } from './swimlane_input_resolver'; import { SwimlaneType } from '../../application/explorer/explorer_constants'; import { @@ -24,11 +19,16 @@ import { } from '../../application/explorer/swimlane_container'; import { AppStateSelectedCells } from '../../application/explorer/explorer_utils'; import { MlDependencies } from '../../application/app'; -import { SWIM_LANE_SELECTION_TRIGGER } from '../../ui_actions/triggers'; +import { SWIM_LANE_SELECTION_TRIGGER } from '../../ui_actions'; +import { + AnomalySwimlaneEmbeddableInput, + AnomalySwimlaneEmbeddableOutput, + AnomalySwimlaneServices, +} from '..'; export interface ExplorerSwimlaneContainerProps { id: string; - embeddableContext: AnomalySwimlaneEmbeddable; + embeddableContext: InstanceType; embeddableInput: Observable; services: [CoreStart, MlDependencies, AnomalySwimlaneServices]; refresh: Observable; diff --git a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/index.ts b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/index.ts index c0b02960d5144c..ba2e1c88b3ea8b 100644 --- a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/index.ts +++ b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/index.ts @@ -5,4 +5,3 @@ */ export { AnomalySwimlaneEmbeddableFactory } from './anomaly_swimlane_embeddable_factory'; -export { ANOMALY_SWIMLANE_EMBEDDABLE_TYPE } from './anomaly_swimlane_embeddable'; diff --git a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/swimlane_input_resolver.test.ts b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/swimlane_input_resolver.test.ts index a34955adebf62c..258b72067cddd0 100644 --- a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/swimlane_input_resolver.test.ts +++ b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/swimlane_input_resolver.test.ts @@ -8,12 +8,9 @@ import { renderHook, act } from '@testing-library/react-hooks'; import { processFilters, useSwimlaneInputResolver } from './swimlane_input_resolver'; import { BehaviorSubject, Observable, of, Subject } from 'rxjs'; import { SWIMLANE_TYPE } from '../../application/explorer/explorer_constants'; -import { - AnomalySwimlaneEmbeddableInput, - AnomalySwimlaneServices, -} from './anomaly_swimlane_embeddable'; import { CoreStart, IUiSettingsClient } from 'kibana/public'; import { MlStartDependencies } from '../../plugin'; +import { AnomalySwimlaneEmbeddableInput, AnomalySwimlaneServices } from '..'; describe('useSwimlaneInputResolver', () => { let embeddableInput: BehaviorSubject>; diff --git a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/swimlane_input_resolver.ts b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/swimlane_input_resolver.ts index f17c779a002527..6ddb1e954e57b7 100644 --- a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/swimlane_input_resolver.ts +++ b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/swimlane_input_resolver.ts @@ -20,11 +20,6 @@ import { } from 'rxjs/operators'; import { CoreStart } from 'kibana/public'; import { TimeBuckets } from '../../application/util/time_buckets'; -import { - AnomalySwimlaneEmbeddableInput, - AnomalySwimlaneEmbeddableOutput, - AnomalySwimlaneServices, -} from './anomaly_swimlane_embeddable'; import { MlStartDependencies } from '../../plugin'; import { ANOMALY_SWIM_LANE_HARD_LIMIT, @@ -41,6 +36,11 @@ import { AnomalyDetectorService } from '../../application/services/anomaly_detec import { isViewBySwimLaneData } from '../../application/explorer/swimlane_container'; import { ViewMode } from '../../../../../../src/plugins/embeddable/public'; import { CONTROLLED_BY_SWIM_LANE_FILTER } from '../../ui_actions/apply_influencer_filters_action'; +import { + AnomalySwimlaneEmbeddableInput, + AnomalySwimlaneEmbeddableOutput, + AnomalySwimlaneServices, +} from '..'; const FETCH_RESULTS_DEBOUNCE_MS = 500; diff --git a/x-pack/plugins/ml/public/embeddables/constants.ts b/x-pack/plugins/ml/public/embeddables/constants.ts new file mode 100644 index 00000000000000..054cb8ba4b0bca --- /dev/null +++ b/x-pack/plugins/ml/public/embeddables/constants.ts @@ -0,0 +1,7 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export const ANOMALY_SWIMLANE_EMBEDDABLE_TYPE = 'ml_anomaly_swimlane'; diff --git a/x-pack/plugins/ml/public/embeddables/index.ts b/x-pack/plugins/ml/public/embeddables/index.ts index db9f094d5721e0..cc4bec0b67836c 100644 --- a/x-pack/plugins/ml/public/embeddables/index.ts +++ b/x-pack/plugins/ml/public/embeddables/index.ts @@ -8,6 +8,9 @@ import { AnomalySwimlaneEmbeddableFactory } from './anomaly_swimlane'; import { MlCoreSetup } from '../plugin'; import { EmbeddableSetup } from '../../../../../src/plugins/embeddable/public'; +export * from './constants'; +export * from './types'; + export function registerEmbeddables(embeddable: EmbeddableSetup, core: MlCoreSetup) { const anomalySwimlaneEmbeddableFactory = new AnomalySwimlaneEmbeddableFactory( core.getStartServices diff --git a/x-pack/plugins/ml/public/embeddables/types.ts b/x-pack/plugins/ml/public/embeddables/types.ts new file mode 100644 index 00000000000000..93ec79d9b8310f --- /dev/null +++ b/x-pack/plugins/ml/public/embeddables/types.ts @@ -0,0 +1,66 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { CoreStart } from 'kibana/public'; +import { JobId } from '../../common/types/anomaly_detection_jobs'; +import { SwimlaneType } from '../application/explorer/explorer_constants'; +import { Filter } from '../../../../../src/plugins/data/common/es_query/filters'; +import { Query, RefreshInterval, TimeRange } from '../../../../../src/plugins/data/common/query'; +import { + EmbeddableInput, + EmbeddableOutput, + IEmbeddable, +} from '../../../../../src/plugins/embeddable/public'; +import { AnomalyDetectorService } from '../application/services/anomaly_detector_service'; +import { AnomalyTimelineService } from '../application/services/anomaly_timeline_service'; +import { MlDependencies } from '../application/app'; +import { AppStateSelectedCells } from '../application/explorer/explorer_utils'; + +export interface AnomalySwimlaneEmbeddableCustomInput { + jobIds: JobId[]; + swimlaneType: SwimlaneType; + viewBy?: string; + perPage?: number; + + // Embeddable inputs which are not included in the default interface + filters: Filter[]; + query: Query; + refreshConfig: RefreshInterval; + timeRange: TimeRange; +} + +export type AnomalySwimlaneEmbeddableInput = EmbeddableInput & AnomalySwimlaneEmbeddableCustomInput; + +export interface AnomalySwimlaneServices { + anomalyDetectorService: AnomalyDetectorService; + anomalyTimelineService: AnomalyTimelineService; +} + +export type AnomalySwimlaneEmbeddableServices = [ + CoreStart, + MlDependencies, + AnomalySwimlaneServices +]; + +export interface AnomalySwimlaneEmbeddableCustomOutput { + perPage?: number; + fromPage?: number; + interval?: number; +} + +export type AnomalySwimlaneEmbeddableOutput = EmbeddableOutput & + AnomalySwimlaneEmbeddableCustomOutput; + +export interface EditSwimlanePanelContext { + embeddable: IEmbeddable; +} + +export interface SwimLaneDrilldownContext extends EditSwimlanePanelContext { + /** + * Optional data provided by swim lane selection + */ + data?: AppStateSelectedCells; +} diff --git a/x-pack/plugins/ml/public/index.scss b/x-pack/plugins/ml/public/index.scss deleted file mode 100644 index 9bd47b64733721..00000000000000 --- a/x-pack/plugins/ml/public/index.scss +++ /dev/null @@ -1 +0,0 @@ -@import './application/index'; diff --git a/x-pack/plugins/ml/public/index.ts b/x-pack/plugins/ml/public/index.ts index 5a956651c86d8b..80308977735d26 100755 --- a/x-pack/plugins/ml/public/index.ts +++ b/x-pack/plugins/ml/public/index.ts @@ -5,7 +5,6 @@ */ import { PluginInitializer, PluginInitializerContext } from 'kibana/public'; -import './index.scss'; import { MlPlugin, MlPluginSetup, diff --git a/x-pack/plugins/ml/public/plugin.ts b/x-pack/plugins/ml/public/plugin.ts index a8e1e804c2fe31..aa6163379f9c0a 100644 --- a/x-pack/plugins/ml/public/plugin.ts +++ b/x-pack/plugins/ml/public/plugin.ts @@ -6,36 +6,35 @@ import { i18n } from '@kbn/i18n'; import { - Plugin, - CoreStart, - CoreSetup, AppMountParameters, + CoreSetup, + CoreStart, + Plugin, PluginInitializerContext, } from 'kibana/public'; import { BehaviorSubject } from 'rxjs'; import { take } from 'rxjs/operators'; import { ManagementSetup } from 'src/plugins/management/public'; -import { SharePluginSetup, SharePluginStart, UrlGeneratorState } from 'src/plugins/share/public'; +import { SharePluginSetup, SharePluginStart } from 'src/plugins/share/public'; import { UsageCollectionSetup } from 'src/plugins/usage_collection/server'; import { DataPublicPluginStart } from 'src/plugins/data/public'; import { HomePublicPluginSetup } from 'src/plugins/home/public'; import { EmbeddableSetup } from 'src/plugins/embeddable/public'; -import { AppStatus, AppUpdater } from '../../../../src/core/public'; +import { AppStatus, AppUpdater, DEFAULT_APP_CATEGORIES } from '../../../../src/core/public'; import { SecurityPluginSetup } from '../../security/public'; import { LicensingPluginSetup } from '../../licensing/public'; import { registerManagementSection } from './application/management'; import { LicenseManagementUIPluginSetup } from '../../license_management/public'; import { setDependencyCache } from './application/util/dependency_cache'; -import { PLUGIN_ID, PLUGIN_ICON } from '../common/constants/app'; +import { PLUGIN_ICON, PLUGIN_ID } from '../common/constants/app'; import { registerFeature } from './register_feature'; -import { DEFAULT_APP_CATEGORIES } from '../../../../src/core/public'; -import { registerEmbeddables } from './embeddables'; import { UiActionsSetup, UiActionsStart } from '../../../../src/plugins/ui_actions/public'; import { registerMlUiActions } from './ui_actions'; import { KibanaLegacyStart } from '../../../../src/plugins/kibana_legacy/public'; -import { registerUrlGenerator, MlUrlGeneratorState, ML_APP_URL_GENERATOR } from './url_generator'; -import { isMlEnabled, isFullLicense } from '../common/license'; +import { registerUrlGenerator } from './url_generator'; +import { isFullLicense, isMlEnabled } from '../common/license'; +import { registerEmbeddables } from './embeddables'; export interface MlStartDependencies { data: DataPublicPluginStart; @@ -56,12 +55,6 @@ export interface MlSetupDependencies { share: SharePluginSetup; } -declare module '../../../../src/plugins/share/public' { - export interface UrlGeneratorStateMapping { - [ML_APP_URL_GENERATOR]: UrlGeneratorState; - } -} - export type MlCoreSetup = CoreSetup; export class MlPlugin implements Plugin { diff --git a/x-pack/plugins/ml/public/ui_actions/apply_influencer_filters_action.tsx b/x-pack/plugins/ml/public/ui_actions/apply_influencer_filters_action.tsx index 3af39993d39fdd..9e50410751c372 100644 --- a/x-pack/plugins/ml/public/ui_actions/apply_influencer_filters_action.tsx +++ b/x-pack/plugins/ml/public/ui_actions/apply_influencer_filters_action.tsx @@ -6,13 +6,10 @@ import { i18n } from '@kbn/i18n'; import { ActionContextMapping, createAction } from '../../../../../src/plugins/ui_actions/public'; -import { - AnomalySwimlaneEmbeddable, - SwimLaneDrilldownContext, -} from '../embeddables/anomaly_swimlane/anomaly_swimlane_embeddable'; import { MlCoreSetup } from '../plugin'; import { SWIMLANE_TYPE, VIEW_BY_JOB_LABEL } from '../application/explorer/explorer_constants'; import { Filter, FilterStateStore } from '../../../../../src/plugins/data/common'; +import { ANOMALY_SWIMLANE_EMBEDDABLE_TYPE, SwimLaneDrilldownContext } from '../embeddables'; export const APPLY_INFLUENCER_FILTERS_ACTION = 'applyInfluencerFiltersAction'; @@ -73,7 +70,7 @@ export function createApplyInfluencerFiltersAction( async isCompatible({ embeddable, data }: SwimLaneDrilldownContext) { // Only compatible with view by influencer swim lanes and single selection return ( - embeddable instanceof AnomalySwimlaneEmbeddable && + embeddable.type === ANOMALY_SWIMLANE_EMBEDDABLE_TYPE && data !== undefined && data.type === SWIMLANE_TYPE.VIEW_BY && data.viewByFieldName !== VIEW_BY_JOB_LABEL && diff --git a/x-pack/plugins/ml/public/ui_actions/apply_time_range_action.tsx b/x-pack/plugins/ml/public/ui_actions/apply_time_range_action.tsx index ec59ba20acf98c..325e903de0e2d8 100644 --- a/x-pack/plugins/ml/public/ui_actions/apply_time_range_action.tsx +++ b/x-pack/plugins/ml/public/ui_actions/apply_time_range_action.tsx @@ -7,11 +7,8 @@ import { i18n } from '@kbn/i18n'; import moment from 'moment'; import { ActionContextMapping, createAction } from '../../../../../src/plugins/ui_actions/public'; -import { - AnomalySwimlaneEmbeddable, - SwimLaneDrilldownContext, -} from '../embeddables/anomaly_swimlane/anomaly_swimlane_embeddable'; import { MlCoreSetup } from '../plugin'; +import { ANOMALY_SWIMLANE_EMBEDDABLE_TYPE, SwimLaneDrilldownContext } from '../embeddables'; export const APPLY_TIME_RANGE_SELECTION_ACTION = 'applyTimeRangeSelectionAction'; @@ -52,7 +49,7 @@ export function createApplyTimeRangeSelectionAction( }); }, async isCompatible({ embeddable, data }: SwimLaneDrilldownContext) { - return embeddable instanceof AnomalySwimlaneEmbeddable && data !== undefined; + return embeddable.type === ANOMALY_SWIMLANE_EMBEDDABLE_TYPE && data !== undefined; }, }); } diff --git a/x-pack/plugins/ml/public/ui_actions/edit_swimlane_panel_action.tsx b/x-pack/plugins/ml/public/ui_actions/edit_swimlane_panel_action.tsx index cfd90f92e32380..c40d1e175ec771 100644 --- a/x-pack/plugins/ml/public/ui_actions/edit_swimlane_panel_action.tsx +++ b/x-pack/plugins/ml/public/ui_actions/edit_swimlane_panel_action.tsx @@ -6,13 +6,9 @@ import { i18n } from '@kbn/i18n'; import { ActionContextMapping, createAction } from '../../../../../src/plugins/ui_actions/public'; -import { - AnomalySwimlaneEmbeddable, - EditSwimlanePanelContext, -} from '../embeddables/anomaly_swimlane/anomaly_swimlane_embeddable'; -import { resolveAnomalySwimlaneUserInput } from '../embeddables/anomaly_swimlane/anomaly_swimlane_setup_flyout'; import { ViewMode } from '../../../../../src/plugins/embeddable/public'; import { MlCoreSetup } from '../plugin'; +import { ANOMALY_SWIMLANE_EMBEDDABLE_TYPE, EditSwimlanePanelContext } from '../embeddables'; export const EDIT_SWIMLANE_PANEL_ACTION = 'editSwimlanePanelAction'; @@ -27,7 +23,7 @@ export function createEditSwimlanePanelAction(getStartServices: MlCoreSetup['get i18n.translate('xpack.ml.actions.editSwimlaneTitle', { defaultMessage: 'Edit swim lane', }), - execute: async ({ embeddable }: EditSwimlanePanelContext) => { + async execute({ embeddable }: EditSwimlanePanelContext) { if (!embeddable) { throw new Error('Not possible to execute an action without the embeddable context'); } @@ -35,15 +31,19 @@ export function createEditSwimlanePanelAction(getStartServices: MlCoreSetup['get const [coreStart] = await getStartServices(); try { + const { resolveAnomalySwimlaneUserInput } = await import( + '../embeddables/anomaly_swimlane/anomaly_swimlane_setup_flyout' + ); + const result = await resolveAnomalySwimlaneUserInput(coreStart, embeddable.getInput()); embeddable.updateInput(result); } catch (e) { return Promise.reject(); } }, - isCompatible: async ({ embeddable }: EditSwimlanePanelContext) => { + async isCompatible({ embeddable }: EditSwimlanePanelContext) { return ( - embeddable instanceof AnomalySwimlaneEmbeddable && + embeddable.type === ANOMALY_SWIMLANE_EMBEDDABLE_TYPE && embeddable.getInput().viewMode === ViewMode.EDIT ); }, diff --git a/x-pack/plugins/ml/public/ui_actions/index.ts b/x-pack/plugins/ml/public/ui_actions/index.ts index b7262a330b3107..437a38acf6f8bd 100644 --- a/x-pack/plugins/ml/public/ui_actions/index.ts +++ b/x-pack/plugins/ml/public/ui_actions/index.ts @@ -13,7 +13,6 @@ import { createOpenInExplorerAction, OPEN_IN_ANOMALY_EXPLORER_ACTION, } from './open_in_anomaly_explorer_action'; -import { EditSwimlanePanelContext } from '../embeddables/anomaly_swimlane/anomaly_swimlane_embeddable'; import { UiActionsSetup } from '../../../../../src/plugins/ui_actions/public'; import { MlPluginStart, MlStartDependencies } from '../plugin'; import { CONTEXT_MENU_TRIGGER } from '../../../../../src/plugins/embeddable/public'; @@ -22,11 +21,18 @@ import { createApplyInfluencerFiltersAction, } from './apply_influencer_filters_action'; import { SWIM_LANE_SELECTION_TRIGGER, swimLaneSelectionTrigger } from './triggers'; -import { SwimLaneDrilldownContext } from '../embeddables/anomaly_swimlane/anomaly_swimlane_embeddable'; import { APPLY_TIME_RANGE_SELECTION_ACTION, createApplyTimeRangeSelectionAction, } from './apply_time_range_action'; +import { EditSwimlanePanelContext, SwimLaneDrilldownContext } from '../embeddables'; + +export { APPLY_TIME_RANGE_SELECTION_ACTION } from './apply_time_range_action'; +export { EDIT_SWIMLANE_PANEL_ACTION } from './edit_swimlane_panel_action'; +export { APPLY_INFLUENCER_FILTERS_ACTION } from './apply_influencer_filters_action'; +export { OPEN_IN_ANOMALY_EXPLORER_ACTION } from './open_in_anomaly_explorer_action'; + +export { SWIM_LANE_SELECTION_TRIGGER } from './triggers'; /** * Register ML UI actions diff --git a/x-pack/plugins/ml/public/ui_actions/open_in_anomaly_explorer_action.tsx b/x-pack/plugins/ml/public/ui_actions/open_in_anomaly_explorer_action.tsx index 211840467e38c9..e18f593145f9c1 100644 --- a/x-pack/plugins/ml/public/ui_actions/open_in_anomaly_explorer_action.tsx +++ b/x-pack/plugins/ml/public/ui_actions/open_in_anomaly_explorer_action.tsx @@ -6,12 +6,9 @@ import { i18n } from '@kbn/i18n'; import { ActionContextMapping, createAction } from '../../../../../src/plugins/ui_actions/public'; -import { - AnomalySwimlaneEmbeddable, - SwimLaneDrilldownContext, -} from '../embeddables/anomaly_swimlane/anomaly_swimlane_embeddable'; import { MlCoreSetup } from '../plugin'; import { ML_APP_URL_GENERATOR } from '../url_generator'; +import { ANOMALY_SWIMLANE_EMBEDDABLE_TYPE, SwimLaneDrilldownContext } from '../embeddables'; export const OPEN_IN_ANOMALY_EXPLORER_ACTION = 'openInAnomalyExplorerAction'; @@ -60,7 +57,7 @@ export function createOpenInExplorerAction(getStartServices: MlCoreSetup['getSta await application.navigateToUrl(anomalyExplorerUrl!); }, async isCompatible({ embeddable }: SwimLaneDrilldownContext) { - return embeddable instanceof AnomalySwimlaneEmbeddable; + return embeddable.type === ANOMALY_SWIMLANE_EMBEDDABLE_TYPE; }, }); } diff --git a/x-pack/plugins/ml/public/url_generator.ts b/x-pack/plugins/ml/public/url_generator.ts index b7cf64159a8274..4e08c57c0b2e0b 100644 --- a/x-pack/plugins/ml/public/url_generator.ts +++ b/x-pack/plugins/ml/public/url_generator.ts @@ -5,13 +5,23 @@ */ import { CoreSetup } from 'kibana/public'; -import { SharePluginSetup, UrlGeneratorsDefinition } from '../../../../src/plugins/share/public'; +import { + SharePluginSetup, + UrlGeneratorsDefinition, + UrlGeneratorState, +} from '../../../../src/plugins/share/public'; import { TimeRange } from '../../../../src/plugins/data/public'; import { setStateToKbnUrl } from '../../../../src/plugins/kibana_utils/public'; import { JobId } from '../../reporting/common/types'; import { ExplorerAppState } from './application/explorer/explorer_dashboard_service'; import { MlStartDependencies } from './plugin'; +declare module '../../../../src/plugins/share/public' { + export interface UrlGeneratorStateMapping { + [ML_APP_URL_GENERATOR]: UrlGeneratorState; + } +} + export const ML_APP_URL_GENERATOR = 'ML_APP_URL_GENERATOR'; export interface ExplorerUrlState { From b26bd6175d11d52c577e62ebfc3186dea9d7ec58 Mon Sep 17 00:00:00 2001 From: Sonja Krause-Harder Date: Wed, 5 Aug 2020 13:48:11 +0200 Subject: [PATCH 06/33] [Ingest Manager] Adjust dataset aggs to use datastream fields instead (#74342) * [Ingest Manager] Adjust dataset aggs to use datastream fields instead Elastic Agent and Elasticsearch are switching over from using dataset.* to datastream.*. This adjust the aggregation on the dataset page to get the datastreams. For this to work properly, the most recent version of Elasticsearch 7.9 must be used and is pending updates on all the packages to ship also the datastream fields, see https://github.com/elastic/integrations/pull/213 * Update datastream to data_stream * Update data stream name generation * Fix typo * Temporarily use datastream instead of data_stream * updating to use `data_stream` instead of `datastream` Co-authored-by: ruflin Co-authored-by: Jen Huang --- .../server/routes/data_streams/handlers.ts | 10 +++++----- .../services/epm/elasticsearch/template/template.ts | 12 ++++++------ 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/x-pack/plugins/ingest_manager/server/routes/data_streams/handlers.ts b/x-pack/plugins/ingest_manager/server/routes/data_streams/handlers.ts index df37aeb27c75c4..43ae2b72f6077c 100644 --- a/x-pack/plugins/ingest_manager/server/routes/data_streams/handlers.ts +++ b/x-pack/plugins/ingest_manager/server/routes/data_streams/handlers.ts @@ -31,12 +31,12 @@ export const getListHandler: RequestHandler = async (context, request, response) must: [ { exists: { - field: 'dataset.namespace', + field: 'data_stream.namespace', }, }, { exists: { - field: 'dataset.name', + field: 'data_stream.dataset', }, }, ], @@ -54,19 +54,19 @@ export const getListHandler: RequestHandler = async (context, request, response) aggs: { dataset: { terms: { - field: 'dataset.name', + field: 'data_stream.dataset', size: 1, }, }, namespace: { terms: { - field: 'dataset.namespace', + field: 'data_stream.namespace', size: 1, }, }, type: { terms: { - field: 'dataset.type', + field: 'data_stream.type', size: 1, }, }, diff --git a/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/template.ts b/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/template.ts index a739806d5868b3..71e49acf1766fc 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/template.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/template.ts @@ -393,14 +393,14 @@ const updateExistingIndex = async ({ // are added in https://github.com/elastic/kibana/issues/66551. namespace value we will continue // to skip updating and assume the value in the index mapping is correct delete mappings.properties.stream; - delete mappings.properties.dataset; + delete mappings.properties.data_stream; - // get the dataset values from the index template to compose data stream name + // get the data_stream values from the index template to compose data stream name const indexMappings = await getIndexMappings(indexName, callCluster); - const dataset = indexMappings[indexName].mappings.properties.dataset.properties; - if (!dataset.type.value || !dataset.name.value || !dataset.namespace.value) - throw new Error(`dataset values are missing from the index template ${indexName}`); - const dataStreamName = `${dataset.type.value}-${dataset.name.value}-${dataset.namespace.value}`; + const dataStream = indexMappings[indexName].mappings.properties.data_stream.properties; + if (!dataStream.type.value || !dataStream.dataset.value || !dataStream.namespace.value) + throw new Error(`data_stream values are missing from the index template ${indexName}`); + const dataStreamName = `${dataStream.type.value}-${dataStream.dataset.value}-${dataStream.namespace.value}`; // try to update the mappings first try { From 7a1b09dcf1189ef9b5c950678d36ac0844572140 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=AA=20Marcondes?= <55978943+cauemarcondes@users.noreply.github.com> Date: Wed, 5 Aug 2020 13:28:13 +0100 Subject: [PATCH 07/33] [APM] Average for transaction error rate includes null values (#74345) --- .../shared/charts/ErroneousTransactionsRateChart/index.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/x-pack/plugins/apm/public/components/shared/charts/ErroneousTransactionsRateChart/index.tsx b/x-pack/plugins/apm/public/components/shared/charts/ErroneousTransactionsRateChart/index.tsx index a433b0b5072398..8214c081e6ce16 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/ErroneousTransactionsRateChart/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/ErroneousTransactionsRateChart/index.tsx @@ -6,7 +6,6 @@ import { EuiTitle } from '@elastic/eui'; import theme from '@elastic/eui/dist/eui_theme_light.json'; import { i18n } from '@kbn/i18n'; -import { mean } from 'lodash'; import React, { useCallback } from 'react'; import { EuiPanel } from '@elastic/eui'; import { useChartsSync } from '../../../../hooks/useChartsSync'; @@ -79,7 +78,7 @@ export function ErroneousTransactionsRateChart() { { color: theme.euiColorVis7, data: [], - legendValue: tickFormatY(mean(errorRates.map((rate) => rate.y))), + legendValue: tickFormatY(data?.average), legendClickDisabled: true, title: i18n.translate('xpack.apm.errorRateChart.avgLabel', { defaultMessage: 'Avg.', From f9fc83fb1d0b2e44c4a080ef7e96f7123072fd96 Mon Sep 17 00:00:00 2001 From: Tim Roes Date: Wed, 5 Aug 2020 14:28:56 +0200 Subject: [PATCH 08/33] Add README files for Kibana app plugins (#74277) * Add README files for Kibana app plugins * Update src/plugins/timelion/README.md Co-authored-by: Matthias Wilhelm * Update src/plugins/vis_type_vislib/README.md Co-authored-by: Matthias Wilhelm Co-authored-by: Matthias Wilhelm --- .github/CODEOWNERS | 1 - src/plugins/dashboard/README.md | 1 + src/plugins/discover/README.md | 1 + src/plugins/input_control_vis/README.md | 1 + src/plugins/timelion/README.md | 2 ++ src/plugins/vis_type_markdown/README.md | 1 + src/plugins/vis_type_metric/README.md | 1 + src/plugins/vis_type_table/README.md | 1 + src/plugins/vis_type_tagcloud/README.md | 1 + src/plugins/vis_type_timelion/README.md | 2 ++ src/plugins/vis_type_timeseries/README.md | 1 + src/plugins/vis_type_vega/README.md | 1 + src/plugins/vis_type_vislib/README.md | 2 ++ src/plugins/vis_type_xy/README.md | 2 ++ src/plugins/visualizations/README.md | 2 ++ src/plugins/visualize/README.md | 2 ++ x-pack/plugins/dashboard_enhanced/README.md | 2 +- x-pack/plugins/dashboard_mode/README.md | 1 + x-pack/plugins/discover_enhanced/README.md | 1 + 19 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 src/plugins/dashboard/README.md create mode 100644 src/plugins/discover/README.md create mode 100644 src/plugins/input_control_vis/README.md create mode 100644 src/plugins/timelion/README.md create mode 100644 src/plugins/vis_type_markdown/README.md create mode 100644 src/plugins/vis_type_metric/README.md create mode 100644 src/plugins/vis_type_table/README.md create mode 100644 src/plugins/vis_type_tagcloud/README.md create mode 100644 src/plugins/vis_type_timeseries/README.md create mode 100644 src/plugins/vis_type_vega/README.md create mode 100644 src/plugins/vis_type_vislib/README.md create mode 100644 src/plugins/vis_type_xy/README.md create mode 100644 src/plugins/visualizations/README.md create mode 100644 src/plugins/visualize/README.md create mode 100644 x-pack/plugins/dashboard_mode/README.md create mode 100644 x-pack/plugins/discover_enhanced/README.md diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index f1a374445657f2..73fb10532fd8d8 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -7,7 +7,6 @@ /x-pack/plugins/discover_enhanced/ @elastic/kibana-app /x-pack/plugins/lens/ @elastic/kibana-app /x-pack/plugins/graph/ @elastic/kibana-app -/src/legacy/core_plugins/kibana/public/local_application_service/ @elastic/kibana-app /src/plugins/dashboard/ @elastic/kibana-app /src/plugins/discover/ @elastic/kibana-app /src/plugins/input_control_vis/ @elastic/kibana-app diff --git a/src/plugins/dashboard/README.md b/src/plugins/dashboard/README.md new file mode 100644 index 00000000000000..f44bd943eaca9a --- /dev/null +++ b/src/plugins/dashboard/README.md @@ -0,0 +1 @@ +Contains the dashboard application. \ No newline at end of file diff --git a/src/plugins/discover/README.md b/src/plugins/discover/README.md new file mode 100644 index 00000000000000..a914d651eef352 --- /dev/null +++ b/src/plugins/discover/README.md @@ -0,0 +1 @@ +Contains the Discover application and the saved search embeddable. \ No newline at end of file diff --git a/src/plugins/input_control_vis/README.md b/src/plugins/input_control_vis/README.md new file mode 100644 index 00000000000000..67266079dede52 --- /dev/null +++ b/src/plugins/input_control_vis/README.md @@ -0,0 +1 @@ +Contains the input control visualization allowing to place custom filter controls on a dashboard. \ No newline at end of file diff --git a/src/plugins/timelion/README.md b/src/plugins/timelion/README.md new file mode 100644 index 00000000000000..d29a33028e9671 --- /dev/null +++ b/src/plugins/timelion/README.md @@ -0,0 +1,2 @@ +Contains the deprecated timelion application. For the timelion visualization, +which also contains the timelion APIs and backend, look at the vis_type_timelion plugin. diff --git a/src/plugins/vis_type_markdown/README.md b/src/plugins/vis_type_markdown/README.md new file mode 100644 index 00000000000000..ae79a4822d4ac1 --- /dev/null +++ b/src/plugins/vis_type_markdown/README.md @@ -0,0 +1 @@ +The markdown visualization that can be used to place text panels on dashboards. \ No newline at end of file diff --git a/src/plugins/vis_type_metric/README.md b/src/plugins/vis_type_metric/README.md new file mode 100644 index 00000000000000..78df92832bdbfb --- /dev/null +++ b/src/plugins/vis_type_metric/README.md @@ -0,0 +1 @@ +Contains the metric visualization. \ No newline at end of file diff --git a/src/plugins/vis_type_table/README.md b/src/plugins/vis_type_table/README.md new file mode 100644 index 00000000000000..cf37e133ed1cff --- /dev/null +++ b/src/plugins/vis_type_table/README.md @@ -0,0 +1 @@ +Contains the data table visualization, that allows presenting data in a simple table format. \ No newline at end of file diff --git a/src/plugins/vis_type_tagcloud/README.md b/src/plugins/vis_type_tagcloud/README.md new file mode 100644 index 00000000000000..7e8f2a6e5b72a1 --- /dev/null +++ b/src/plugins/vis_type_tagcloud/README.md @@ -0,0 +1 @@ +Contains the tagcloud visualization. \ No newline at end of file diff --git a/src/plugins/vis_type_timelion/README.md b/src/plugins/vis_type_timelion/README.md index c306e03abf2c60..89d34527c51d6e 100644 --- a/src/plugins/vis_type_timelion/README.md +++ b/src/plugins/vis_type_timelion/README.md @@ -1,5 +1,7 @@ # Vis type Timelion +Contains the timelion visualization and the timelion backend. + # Generate a parser If your grammar was changed in `public/chain.peg` you need to re-generate the static parser. You could use a grunt task: diff --git a/src/plugins/vis_type_timeseries/README.md b/src/plugins/vis_type_timeseries/README.md new file mode 100644 index 00000000000000..4b4184b6eadd9a --- /dev/null +++ b/src/plugins/vis_type_timeseries/README.md @@ -0,0 +1 @@ +Contains everything around TSVB (the editor, visualizatin implementations and backends). \ No newline at end of file diff --git a/src/plugins/vis_type_vega/README.md b/src/plugins/vis_type_vega/README.md new file mode 100644 index 00000000000000..3d9bfd387e2c52 --- /dev/null +++ b/src/plugins/vis_type_vega/README.md @@ -0,0 +1 @@ +Contains the Vega visualization. \ No newline at end of file diff --git a/src/plugins/vis_type_vislib/README.md b/src/plugins/vis_type_vislib/README.md new file mode 100644 index 00000000000000..7641ea2acd1ecb --- /dev/null +++ b/src/plugins/vis_type_vislib/README.md @@ -0,0 +1,2 @@ +Contains the vislib visualizations. These are the classical area/line/bar, pie, gauge/goal and +heatmap charts. diff --git a/src/plugins/vis_type_xy/README.md b/src/plugins/vis_type_xy/README.md new file mode 100644 index 00000000000000..70ddb21c1e9dbe --- /dev/null +++ b/src/plugins/vis_type_xy/README.md @@ -0,0 +1,2 @@ +Contains the new xy-axis chart using the elastic-charts library, which will eventually +replace the vislib xy-axis (bar, area, line) charts. \ No newline at end of file diff --git a/src/plugins/visualizations/README.md b/src/plugins/visualizations/README.md new file mode 100644 index 00000000000000..c61beb670a5032 --- /dev/null +++ b/src/plugins/visualizations/README.md @@ -0,0 +1,2 @@ +Contains most of the visualization infrastructure, e.g. the visualization type registry or the +visualization embeddable. \ No newline at end of file diff --git a/src/plugins/visualize/README.md b/src/plugins/visualize/README.md new file mode 100644 index 00000000000000..be3e555a1407ba --- /dev/null +++ b/src/plugins/visualize/README.md @@ -0,0 +1,2 @@ +Contains the visualize application which includes the listing page and the app frame, +which will load the visualization's editor. \ No newline at end of file diff --git a/x-pack/plugins/dashboard_enhanced/README.md b/x-pack/plugins/dashboard_enhanced/README.md index d9296ae158621d..0aeb156a99f1f6 100644 --- a/x-pack/plugins/dashboard_enhanced/README.md +++ b/x-pack/plugins/dashboard_enhanced/README.md @@ -1 +1 @@ -# X-Pack part of Dashboard app +Contains the enhancements to the OSS dashboard app. \ No newline at end of file diff --git a/x-pack/plugins/dashboard_mode/README.md b/x-pack/plugins/dashboard_mode/README.md new file mode 100644 index 00000000000000..4e244afb97fdf6 --- /dev/null +++ b/x-pack/plugins/dashboard_mode/README.md @@ -0,0 +1 @@ +The deprecated dashboard only mode. \ No newline at end of file diff --git a/x-pack/plugins/discover_enhanced/README.md b/x-pack/plugins/discover_enhanced/README.md new file mode 100644 index 00000000000000..08d0dbb9cdbef8 --- /dev/null +++ b/x-pack/plugins/discover_enhanced/README.md @@ -0,0 +1 @@ +Contains the enhancements to the OSS discover app. \ No newline at end of file From bf22fe54e1f1579821e2b55f211d432f12555bd5 Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Wed, 5 Aug 2020 09:21:57 -0400 Subject: [PATCH 09/33] [Ingest Node Pipelines] Refactor pipeline simulator code (#72328) --- .../components/pipeline_form/index.ts | 2 +- .../pipeline_form/pipeline_form.tsx | 22 -- .../pipeline_form/pipeline_form_fields.tsx | 18 +- .../pipeline_form/pipeline_form_provider.tsx | 20 -- .../pipeline_test_flyout.tsx | 203 ------------------ .../pipeline_test_flyout_provider.tsx | 47 ---- .../pipeline_form/processors_header.tsx | 28 +-- .../pipeline_processors_editor.helpers.tsx | 6 +- .../pipeline_processors_editor.test.tsx | 5 + .../components/index.ts | 2 + .../components/pipeline_processors_editor.tsx | 1 + .../components/test_pipeline/button.tsx | 30 +++ .../test_pipeline/flyout_provider.tsx | 171 +++++++++++++++ .../test_pipeline/flyout_tabs}/index.ts | 0 .../flyout_tabs}/pipeline_test_tabs.tsx | 0 .../test_pipeline/flyout_tabs}/schema.tsx | 4 +- .../flyout_tabs}/tab_documents.tsx | 23 +- .../test_pipeline/flyout_tabs}/tab_output.tsx | 3 +- .../components/test_pipeline}/index.ts | 2 +- .../context/context.tsx | 42 ++++ .../context/index.ts | 15 ++ .../processors_context.tsx} | 25 ++- .../context}/test_config_context.tsx | 0 .../pipeline_processors_editor/index.ts | 4 +- .../pipeline_processors_editor/types.ts | 4 + .../public/application/services/api.ts | 2 +- .../application/services/documentation.ts | 4 - .../translations/translations/ja-JP.json | 3 - .../translations/translations/zh-CN.json | 3 - 29 files changed, 323 insertions(+), 366 deletions(-) delete mode 100644 x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_form_provider.tsx delete mode 100644 x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_test_flyout/pipeline_test_flyout.tsx delete mode 100644 x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_test_flyout/pipeline_test_flyout_provider.tsx create mode 100644 x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/test_pipeline/button.tsx create mode 100644 x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/test_pipeline/flyout_provider.tsx rename x-pack/plugins/ingest_pipelines/public/application/components/{pipeline_form/pipeline_test_flyout/tabs => pipeline_processors_editor/components/test_pipeline/flyout_tabs}/index.ts (100%) rename x-pack/plugins/ingest_pipelines/public/application/components/{pipeline_form/pipeline_test_flyout/tabs => pipeline_processors_editor/components/test_pipeline/flyout_tabs}/pipeline_test_tabs.tsx (100%) rename x-pack/plugins/ingest_pipelines/public/application/components/{pipeline_form/pipeline_test_flyout/tabs => pipeline_processors_editor/components/test_pipeline/flyout_tabs}/schema.tsx (96%) rename x-pack/plugins/ingest_pipelines/public/application/components/{pipeline_form/pipeline_test_flyout/tabs => pipeline_processors_editor/components/test_pipeline/flyout_tabs}/tab_documents.tsx (85%) rename x-pack/plugins/ingest_pipelines/public/application/components/{pipeline_form/pipeline_test_flyout/tabs => pipeline_processors_editor/components/test_pipeline/flyout_tabs}/tab_output.tsx (97%) rename x-pack/plugins/ingest_pipelines/public/application/components/{pipeline_form/pipeline_test_flyout => pipeline_processors_editor/components/test_pipeline}/index.ts (70%) create mode 100644 x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/context/context.tsx create mode 100644 x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/context/index.ts rename x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/{context.tsx => context/processors_context.tsx} (91%) rename x-pack/plugins/ingest_pipelines/public/application/components/{pipeline_form => pipeline_processors_editor/context}/test_config_context.tsx (100%) diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/index.ts b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/index.ts index 2b007a25667a1f..21a2ee30a84e16 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/index.ts +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/index.ts @@ -4,4 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -export { PipelineFormProvider as PipelineForm } from './pipeline_form_provider'; +export { PipelineForm } from './pipeline_form'; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_form.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_form.tsx index 341e15132d353c..5279bd718c16e5 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_form.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_form.tsx @@ -16,7 +16,6 @@ import './pipeline_form.scss'; import { OnUpdateHandlerArg, OnUpdateHandler } from '../pipeline_processors_editor'; import { PipelineRequestFlyout } from './pipeline_request_flyout'; -import { PipelineTestFlyout } from './pipeline_test_flyout'; import { PipelineFormFields } from './pipeline_form_fields'; import { PipelineFormError } from './pipeline_form_error'; import { pipelineFormSchema } from './schema'; @@ -48,8 +47,6 @@ export const PipelineForm: React.FunctionComponent = ({ }) => { const [isRequestVisible, setIsRequestVisible] = useState(false); - const [isTestingPipeline, setIsTestingPipeline] = useState(false); - const { processors: initialProcessors, on_failure: initialOnFailureProcessors, @@ -79,10 +76,6 @@ export const PipelineForm: React.FunctionComponent = ({ } }; - const handleTestPipelineClick = () => { - setIsTestingPipeline(true); - }; - const { form } = useForm({ schema: pipelineFormSchema, defaultValue: defaultFormValues, @@ -90,7 +83,6 @@ export const PipelineForm: React.FunctionComponent = ({ }); const onEditorFlyoutOpen = useCallback(() => { - setIsTestingPipeline(false); setIsRequestVisible(false); }, [setIsRequestVisible]); @@ -137,8 +129,6 @@ export const PipelineForm: React.FunctionComponent = ({ onFailure={processorsState.onFailure} onProcessorsUpdate={onProcessorsChangeHandler} hasVersion={Boolean(defaultValue.version)} - isTestButtonDisabled={isTestingPipeline || form.isValid === false} - onTestPipelineClick={handleTestPipelineClick} isEditing={isEditing} /> @@ -198,18 +188,6 @@ export const PipelineForm: React.FunctionComponent = ({ closeFlyout={() => setIsRequestVisible((prevIsRequestVisible) => !prevIsRequestVisible)} /> ) : null} - - {/* Test pipeline flyout */} - {isTestingPipeline ? ( - - processorStateRef.current?.getData() || { processors: [], on_failure: [] } - } - closeFlyout={() => { - setIsTestingPipeline((prevIsTestingPipeline) => !prevIsTestingPipeline); - }} - /> - ) : null} diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_form_fields.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_form_fields.tsx index 0e7a45e8d07b9d..32beb61039a904 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_form_fields.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_form_fields.tsx @@ -13,7 +13,7 @@ import { Processor } from '../../../../common/types'; import { getUseField, getFormRow, Field, useKibana } from '../../../shared_imports'; import { - PipelineProcessorsContextProvider, + ProcessorsEditorContextProvider, GlobalOnFailureProcessorsEditor, ProcessorsEditor, OnUpdateHandler, @@ -29,8 +29,6 @@ interface Props { onLoadJson: OnDoneLoadJsonHandler; onProcessorsUpdate: OnUpdateHandler; hasVersion: boolean; - isTestButtonDisabled: boolean; - onTestPipelineClick: () => void; onEditorFlyoutOpen: () => void; isEditing?: boolean; } @@ -45,8 +43,6 @@ export const PipelineFormFields: React.FunctionComponent = ({ onProcessorsUpdate, isEditing, hasVersion, - isTestButtonDisabled, - onTestPipelineClick, onEditorFlyoutOpen, }) => { const { services } = useKibana(); @@ -125,20 +121,18 @@ export const PipelineFormFields: React.FunctionComponent = ({ {/* Pipeline Processors Editor */} -

- + @@ -154,7 +148,7 @@ export const PipelineFormFields: React.FunctionComponent = ({
- + ); }; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_form_provider.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_form_provider.tsx deleted file mode 100644 index e6482a9fc12c2f..00000000000000 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_form_provider.tsx +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React from 'react'; - -import { PipelineForm as PipelineFormUI, PipelineFormProps } from './pipeline_form'; -import { TestConfigContextProvider } from './test_config_context'; - -export const PipelineFormProvider: React.FunctionComponent = ( - passThroughProps -) => { - return ( - - - - ); -}; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_test_flyout/pipeline_test_flyout.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_test_flyout/pipeline_test_flyout.tsx deleted file mode 100644 index da5e6cf77364c9..00000000000000 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_test_flyout/pipeline_test_flyout.tsx +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React, { useState, useEffect, useCallback } from 'react'; -import { FormattedMessage } from '@kbn/i18n/react'; -import { i18n } from '@kbn/i18n'; - -import { - EuiFlyout, - EuiFlyoutBody, - EuiFlyoutHeader, - EuiSpacer, - EuiTitle, - EuiCallOut, -} from '@elastic/eui'; - -import { useKibana } from '../../../../shared_imports'; -import { Pipeline } from '../../../../../common/types'; -import { Tabs, Tab, OutputTab, DocumentsTab } from './tabs'; -import { useTestConfigContext } from '../test_config_context'; - -export interface PipelineTestFlyoutProps { - closeFlyout: () => void; - pipeline: Pipeline; - isPipelineValid: boolean; -} - -export const PipelineTestFlyout: React.FunctionComponent = ({ - closeFlyout, - pipeline, - isPipelineValid, -}) => { - const { services } = useKibana(); - - const { testConfig } = useTestConfigContext(); - const { documents: cachedDocuments, verbose: cachedVerbose } = testConfig; - - const initialSelectedTab = cachedDocuments ? 'output' : 'documents'; - const [selectedTab, setSelectedTab] = useState(initialSelectedTab); - - const [shouldExecuteImmediately, setShouldExecuteImmediately] = useState(false); - const [isExecuting, setIsExecuting] = useState(false); - const [executeError, setExecuteError] = useState(null); - const [executeOutput, setExecuteOutput] = useState(undefined); - - const handleExecute = useCallback( - async (documents: object[], verbose?: boolean) => { - const { name: pipelineName, ...pipelineDefinition } = pipeline; - - setIsExecuting(true); - setExecuteError(null); - - const { error, data: output } = await services.api.simulatePipeline({ - documents, - verbose, - pipeline: pipelineDefinition, - }); - - setIsExecuting(false); - - if (error) { - setExecuteError(error); - return; - } - - setExecuteOutput(output); - - services.notifications.toasts.addSuccess( - i18n.translate('xpack.ingestPipelines.testPipelineFlyout.successNotificationText', { - defaultMessage: 'Pipeline executed', - }), - { - toastLifeTimeMs: 1000, - } - ); - - setSelectedTab('output'); - }, - [pipeline, services.api, services.notifications.toasts] - ); - - useEffect(() => { - if (cachedDocuments) { - setShouldExecuteImmediately(true); - } - // We only want to know on initial mount if there are cached documents - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - useEffect(() => { - // If the user has already tested the pipeline once, - // use the cached test config and automatically execute the pipeline - if (shouldExecuteImmediately && Object.entries(pipeline).length > 0) { - setShouldExecuteImmediately(false); - handleExecute(cachedDocuments!, cachedVerbose); - } - }, [ - pipeline, - handleExecute, - cachedDocuments, - cachedVerbose, - isExecuting, - shouldExecuteImmediately, - ]); - - let tabContent; - - if (selectedTab === 'output') { - tabContent = ( - - ); - } else { - // default to "documents" tab - tabContent = ( - - ); - } - - return ( - - - -

- {pipeline.name ? ( - - ) : ( - - )} -

-
-
- - - !executeOutput && tabId === 'output'} - /> - - - - {/* Execute error */} - {executeError ? ( - <> - - } - color="danger" - iconType="alert" - > -

{executeError.message}

-
- - - ) : null} - - {/* Invalid pipeline error */} - {!isPipelineValid ? ( - <> - - } - color="danger" - iconType="alert" - /> - - - ) : null} - - {/* Documents or output tab content */} - {tabContent} -
-
- ); -}; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_test_flyout/pipeline_test_flyout_provider.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_test_flyout/pipeline_test_flyout_provider.tsx deleted file mode 100644 index 7f91672d64df45..00000000000000 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_test_flyout/pipeline_test_flyout_provider.tsx +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import React, { useState, useEffect } from 'react'; - -import { Pipeline } from '../../../../../common/types'; -import { useFormContext } from '../../../../shared_imports'; - -import { ReadProcessorsFunction } from '../types'; - -import { PipelineTestFlyout, PipelineTestFlyoutProps } from './pipeline_test_flyout'; - -interface Props extends Omit { - readProcessors: ReadProcessorsFunction; -} - -export const PipelineTestFlyoutProvider: React.FunctionComponent = ({ - closeFlyout, - readProcessors, -}) => { - const form = useFormContext(); - const [formData, setFormData] = useState({} as Pipeline); - const [isFormDataValid, setIsFormDataValid] = useState(false); - - useEffect(() => { - const subscription = form.subscribe(async ({ isValid, validate, data }) => { - const isFormValid = isValid ?? (await validate()); - if (isFormValid) { - setFormData(data.format() as Pipeline); - } - setIsFormDataValid(isFormValid); - }); - - return subscription.unsubscribe; - }, [form]); - - return ( - - ); -}; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/processors_header.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/processors_header.tsx index 5e5cddbd36b921..3e8cd999a484a6 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/processors_header.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/processors_header.tsx @@ -5,25 +5,23 @@ */ import React, { FunctionComponent } from 'react'; -import { EuiButton, EuiFlexGroup, EuiFlexItem, EuiLink, EuiText, EuiTitle } from '@elastic/eui'; +import { EuiFlexGroup, EuiFlexItem, EuiLink, EuiText, EuiTitle } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { usePipelineProcessorsContext } from '../pipeline_processors_editor/context'; -import { LoadFromJsonButton, OnDoneLoadJsonHandler } from '../pipeline_processors_editor'; +import { + LoadFromJsonButton, + OnDoneLoadJsonHandler, + TestPipelineButton, +} from '../pipeline_processors_editor'; export interface Props { - onTestPipelineClick: () => void; - isTestButtonDisabled: boolean; onLoadJson: OnDoneLoadJsonHandler; } -export const ProcessorsHeader: FunctionComponent = ({ - onTestPipelineClick, - isTestButtonDisabled, - onLoadJson, -}) => { +export const ProcessorsHeader: FunctionComponent = ({ onLoadJson }) => { const { links } = usePipelineProcessorsContext(); return ( = ({ - - - + ); diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/__jest__/pipeline_processors_editor.helpers.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/__jest__/pipeline_processors_editor.helpers.tsx index e7258a74f47326..227513dcdaacc5 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/__jest__/pipeline_processors_editor.helpers.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/__jest__/pipeline_processors_editor.helpers.tsx @@ -7,7 +7,7 @@ import { act } from 'react-dom/test-utils'; import React from 'react'; import { registerTestBed, TestBed } from '../../../../../../../test_utils'; import { - PipelineProcessorsContextProvider, + ProcessorsEditorContextProvider, Props, ProcessorsEditor, GlobalOnFailureProcessorsEditor, @@ -62,9 +62,9 @@ jest.mock('react-virtualized', () => { const testBedSetup = registerTestBed( (props: Props) => ( - + - + ), { doMountAsync: false, diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/__jest__/pipeline_processors_editor.test.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/__jest__/pipeline_processors_editor.test.tsx index df4832f9a45e06..a45a677846b2ec 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/__jest__/pipeline_processors_editor.test.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/__jest__/pipeline_processors_editor.test.tsx @@ -3,8 +3,11 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ +import { notificationServiceMock } from 'src/core/public/mocks'; + import { setup, SetupResult } from './pipeline_processors_editor.helpers'; import { Pipeline } from '../../../../../common/types'; +import { apiService } from '../../../services'; const testProcessors: Pick = { processors: [ @@ -46,6 +49,8 @@ describe('Pipeline Editor', () => { links: { esDocsBasePath: 'test', }, + toasts: notificationServiceMock.createSetupContract().toasts, + api: apiService, }); }); diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/index.ts b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/index.ts index b532b2d953e65d..bf724be950fdf1 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/index.ts +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/index.ts @@ -20,4 +20,6 @@ export { ProcessorRemoveModal } from './processor_remove_modal'; export { OnDoneLoadJsonHandler, LoadFromJsonButton } from './load_from_json'; +export { TestPipelineButton } from './test_pipeline'; + export { PipelineProcessorsItemTooltip, Position } from './pipeline_processors_editor_item_tooltip'; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/pipeline_processors_editor.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/pipeline_processors_editor.tsx index c89ff1d3d99ac0..ef8bf790a18aa6 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/pipeline_processors_editor.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/pipeline_processors_editor.tsx @@ -21,6 +21,7 @@ export const PipelineProcessorsEditor: FunctionComponent = memo( state: { editor, processors }, } = usePipelineProcessorsContext(); const baseSelector = useMemo(() => [stateSlice], [stateSlice]); + return ( { + return ( + + {(openFlyout) => { + return ( + + {i18nTexts.buttonLabel} + + ); + }} + + ); +}; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/test_pipeline/flyout_provider.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/test_pipeline/flyout_provider.tsx new file mode 100644 index 00000000000000..ad88259e3bcc47 --- /dev/null +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/test_pipeline/flyout_provider.tsx @@ -0,0 +1,171 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { useState, useEffect, useCallback } from 'react'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { i18n } from '@kbn/i18n'; + +import { + EuiFlyout, + EuiFlyoutBody, + EuiFlyoutHeader, + EuiSpacer, + EuiTitle, + EuiCallOut, +} from '@elastic/eui'; + +import { usePipelineProcessorsContext, useTestConfigContext } from '../../context'; +import { serialize } from '../../serialize'; + +import { Tabs, Tab, OutputTab, DocumentsTab } from './flyout_tabs'; + +export interface Props { + children: (openFlyout: () => void) => React.ReactNode; +} + +export const FlyoutProvider: React.FunctionComponent = ({ children }) => { + const { + state: { processors }, + api, + toasts, + } = usePipelineProcessorsContext(); + + const serializedProcessors = serialize(processors.state); + + const { testConfig } = useTestConfigContext(); + const { documents: cachedDocuments, verbose: cachedVerbose } = testConfig; + + const [isFlyoutVisible, setIsFlyoutVisible] = useState(false); + + const initialSelectedTab = cachedDocuments ? 'output' : 'documents'; + const [selectedTab, setSelectedTab] = useState(initialSelectedTab); + + const [shouldExecuteImmediately, setShouldExecuteImmediately] = useState(false); + const [isExecuting, setIsExecuting] = useState(false); + const [executeError, setExecuteError] = useState(null); + const [executeOutput, setExecuteOutput] = useState(undefined); + + const handleExecute = useCallback( + async (documents: object[], verbose?: boolean) => { + setIsExecuting(true); + setExecuteError(null); + + const { error, data: output } = await api.simulatePipeline({ + documents, + verbose, + pipeline: { ...serializedProcessors }, + }); + + setIsExecuting(false); + + if (error) { + setExecuteError(error); + return; + } + + setExecuteOutput(output); + + toasts.addSuccess( + i18n.translate('xpack.ingestPipelines.testPipelineFlyout.successNotificationText', { + defaultMessage: 'Pipeline executed', + }), + { + toastLifeTimeMs: 1000, + } + ); + + setSelectedTab('output'); + }, + [serializedProcessors, api, toasts] + ); + + useEffect(() => { + if (isFlyoutVisible === false && cachedDocuments) { + setShouldExecuteImmediately(true); + } + }, [isFlyoutVisible, cachedDocuments]); + + useEffect(() => { + // If the user has already tested the pipeline once, + // use the cached test config and automatically execute the pipeline + if (isFlyoutVisible && shouldExecuteImmediately && cachedDocuments) { + setShouldExecuteImmediately(false); + handleExecute(cachedDocuments!, cachedVerbose); + } + }, [handleExecute, cachedDocuments, cachedVerbose, isFlyoutVisible, shouldExecuteImmediately]); + + let tabContent; + + if (selectedTab === 'output') { + tabContent = ( + + ); + } else { + // default to "Documents" tab + tabContent = ; + } + + return ( + <> + {children(() => setIsFlyoutVisible(true))} + + {isFlyoutVisible && ( + setIsFlyoutVisible(false)} + data-test-subj="testPipelineFlyout" + > + + +

+ +

+
+
+ + + !executeOutput && tabId === 'output'} + /> + + + + {/* Execute error */} + {executeError ? ( + <> + + } + color="danger" + iconType="alert" + > +

{executeError.message}

+
+ + + ) : null} + + {/* Documents or output tab content */} + {tabContent} +
+
+ )} + + ); +}; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_test_flyout/tabs/index.ts b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/test_pipeline/flyout_tabs/index.ts similarity index 100% rename from x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_test_flyout/tabs/index.ts rename to x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/test_pipeline/flyout_tabs/index.ts diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_test_flyout/tabs/pipeline_test_tabs.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/test_pipeline/flyout_tabs/pipeline_test_tabs.tsx similarity index 100% rename from x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_test_flyout/tabs/pipeline_test_tabs.tsx rename to x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/test_pipeline/flyout_tabs/pipeline_test_tabs.tsx diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_test_flyout/tabs/schema.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/test_pipeline/flyout_tabs/schema.tsx similarity index 96% rename from x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_test_flyout/tabs/schema.tsx rename to x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/test_pipeline/flyout_tabs/schema.tsx index de9910344bd4bc..e8ac223d56ed93 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_test_flyout/tabs/schema.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/test_pipeline/flyout_tabs/schema.tsx @@ -9,8 +9,8 @@ import { FormattedMessage } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; import { EuiCode } from '@elastic/eui'; -import { FormSchema, fieldValidators, ValidationFuncArg } from '../../../../../shared_imports'; -import { parseJson, stringifyJson } from '../../../../lib'; +import { FormSchema, fieldValidators, ValidationFuncArg } from '../../../../../../shared_imports'; +import { parseJson, stringifyJson } from '../../../../../lib'; const { emptyField, isJsonField } = fieldValidators; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_test_flyout/tabs/tab_documents.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/test_pipeline/flyout_tabs/tab_documents.tsx similarity index 85% rename from x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_test_flyout/tabs/tab_documents.tsx rename to x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/test_pipeline/flyout_tabs/tab_documents.tsx index be9ebc57c69eeb..593347f8b2343a 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_test_flyout/tabs/tab_documents.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/test_pipeline/flyout_tabs/tab_documents.tsx @@ -17,32 +17,27 @@ import { Form, useForm, FormConfig, - useKibana, -} from '../../../../../shared_imports'; +} from '../../../../../../shared_imports'; + +import { usePipelineProcessorsContext, useTestConfigContext, TestConfig } from '../../../context'; import { documentsSchema } from './schema'; -import { useTestConfigContext, TestConfig } from '../../test_config_context'; const UseField = getUseField({ component: Field }); interface Props { handleExecute: (documents: object[], verbose: boolean) => void; - isPipelineValid: boolean; isExecuting: boolean; } -export const DocumentsTab: React.FunctionComponent = ({ - isPipelineValid, - handleExecute, - isExecuting, -}) => { - const { services } = useKibana(); +export const DocumentsTab: React.FunctionComponent = ({ handleExecute, isExecuting }) => { + const { links } = usePipelineProcessorsContext(); const { setCurrentTestConfig, testConfig } = useTestConfigContext(); const { verbose: cachedVerbose, documents: cachedDocuments } = testConfig; const executePipeline: FormConfig['onSubmit'] = async (formData, isValid) => { - if (!isValid || !isPipelineValid) { + if (!isValid) { return; } @@ -76,7 +71,7 @@ export const DocumentsTab: React.FunctionComponent = ({ values={{ learnMoreLink: ( @@ -98,7 +93,7 @@ export const DocumentsTab: React.FunctionComponent = ({
{/* Documents editor */} @@ -125,7 +120,7 @@ export const DocumentsTab: React.FunctionComponent = ({ onClick={form.submit} size="s" isLoading={isExecuting} - disabled={(form.isSubmitted && !form.isValid) || !isPipelineValid} + disabled={form.isSubmitted && !form.isValid} > {isExecuting ? ( = ({ + children, + links, + api, + toasts, + onUpdate, + value, + onFlyoutOpen, +}: Props) => { + return ( + + + {children} + + + ); +}; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/context/index.ts b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/context/index.ts new file mode 100644 index 00000000000000..1664b3410c1c0d --- /dev/null +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/context/index.ts @@ -0,0 +1,15 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export { ProcessorsEditorContextProvider } from './context'; + +export { TestConfigContextProvider, useTestConfigContext, TestConfig } from './test_config_context'; + +export { + PipelineProcessorsContextProvider, + usePipelineProcessorsContext, + Props, +} from './processors_context'; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/context.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/context/processors_context.tsx similarity index 91% rename from x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/context.tsx rename to x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/context/processors_context.tsx index 098473b0d25726..db4629823ef52e 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/context.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/context/processors_context.tsx @@ -15,7 +15,10 @@ import React, { useRef, } from 'react'; -import { Processor } from '../../../../common/types'; +import { NotificationsSetup } from 'src/core/public'; + +import { Processor } from '../../../../../common/types'; +import { ApiService } from '../../../services'; import { EditorMode, @@ -26,29 +29,31 @@ import { ContextValueState, Links, ProcessorInternal, -} from './types'; +} from '../types'; -import { useProcessorsState, isOnFailureSelector } from './processors_reducer'; +import { useProcessorsState, isOnFailureSelector } from '../processors_reducer'; -import { deserialize } from './deserialize'; +import { deserialize } from '../deserialize'; -import { serialize } from './serialize'; +import { serialize } from '../serialize'; -import { OnActionHandler } from './components/processors_tree'; +import { OnActionHandler } from '../components/processors_tree'; import { ProcessorRemoveModal, PipelineProcessorsItemTooltip, ProcessorSettingsForm, OnSubmitHandler, -} from './components'; +} from '../components'; -import { getValue } from './utils'; +import { getValue } from '../utils'; const PipelineProcessorsContext = createContext({} as any); export interface Props { links: Links; + api: ApiService; + toasts: NotificationsSetup['toasts']; value: { processors: Processor[]; onFailure?: Processor[]; @@ -62,6 +67,8 @@ export interface Props { export const PipelineProcessorsContextProvider: FunctionComponent = ({ links, + api, + toasts, value: { processors: originalProcessors, onFailure: originalOnFailureProcessors }, onUpdate, onFlyoutOpen, @@ -205,6 +212,8 @@ export const PipelineProcessorsContextProvider: FunctionComponent = ({ ; + pipeline: Pick; }) { const result = await this.sendRequest({ path: `${API_BASE_PATH}/simulate`, diff --git a/x-pack/plugins/ingest_pipelines/public/application/services/documentation.ts b/x-pack/plugins/ingest_pipelines/public/application/services/documentation.ts index 7f6a87a46fea35..daed338eb6ab45 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/services/documentation.ts +++ b/x-pack/plugins/ingest_pipelines/public/application/services/documentation.ts @@ -34,10 +34,6 @@ export class DocumentationService { public getPutPipelineApiUrl() { return `${this.esDocBasePath}/put-pipeline-api.html`; } - - public getSimulatePipelineApiUrl() { - return `${this.esDocBasePath}/simulate-pipeline-api.html`; - } } export const documentationService = new DocumentationService(); diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index aa12e2a34075ea..7e1ce610a19484 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -9799,7 +9799,6 @@ "xpack.ingestPipelines.pipelineEditor.setForm.valueFieldLabel": "値", "xpack.ingestPipelines.pipelineEditor.setForm.valueRequiredError": "設定する値が必要です。", "xpack.ingestPipelines.pipelineEditor.settingsForm.learnMoreLabelLink.processor": "{processorLabel}ドキュメント", - "xpack.ingestPipelines.pipelineEditor.testPipelineButtonLabel": "パイプラインをテスト", "xpack.ingestPipelines.pipelineEditor.typeField.fieldRequiredError": "タイプが必要です。", "xpack.ingestPipelines.pipelineEditor.typeField.typeFieldLabel": "プロセッサー", "xpack.ingestPipelines.processors.label.append": "末尾に追加", @@ -9857,13 +9856,11 @@ "xpack.ingestPipelines.testPipelineFlyout.documentsTab.simulateDocumentionLink": "詳細", "xpack.ingestPipelines.testPipelineFlyout.documentsTab.tabDescriptionText": "投入するパイプラインのドキュメントの配列を指定します。{learnMoreLink}", "xpack.ingestPipelines.testPipelineFlyout.executePipelineError": "パイプラインを実行できません", - "xpack.ingestPipelines.testPipelineFlyout.invalidPipelineErrorMessage": "実行するパイプラインが無効です。", "xpack.ingestPipelines.testPipelineFlyout.outputTab.descriptionLinkLabel": "出力を更新", "xpack.ingestPipelines.testPipelineFlyout.outputTab.descriptionText": "出力データを表示するか、パイプライン経由で渡されるときに各プロセッサーがドキュメントにどのように影響するのかを確認します。", "xpack.ingestPipelines.testPipelineFlyout.outputTab.verboseSwitchLabel": "冗長出力を表示", "xpack.ingestPipelines.testPipelineFlyout.successNotificationText": "パイプラインが実行されました", "xpack.ingestPipelines.testPipelineFlyout.title": "パイプラインをテスト", - "xpack.ingestPipelines.testPipelineFlyout.withPipelineNameTitle": "パイプライン'{pipelineName}'をテスト", "xpack.lens.app.docLoadingError": "保存されたドキュメントの保存中にエラーが発生", "xpack.lens.app.docSavingError": "ドキュメントの保存中にエラーが発生", "xpack.lens.app.indexPatternLoadingError": "インデックスパターンの読み込み中にエラーが発生", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index befce4de3d2471..e82ba7cc1d60f4 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -9801,7 +9801,6 @@ "xpack.ingestPipelines.pipelineEditor.setForm.valueFieldLabel": "值", "xpack.ingestPipelines.pipelineEditor.setForm.valueRequiredError": "需要设置值。", "xpack.ingestPipelines.pipelineEditor.settingsForm.learnMoreLabelLink.processor": "{processorLabel}文档", - "xpack.ingestPipelines.pipelineEditor.testPipelineButtonLabel": "测试管道", "xpack.ingestPipelines.pipelineEditor.typeField.fieldRequiredError": "类型必填。", "xpack.ingestPipelines.pipelineEditor.typeField.typeFieldLabel": "处理器", "xpack.ingestPipelines.processors.label.append": "追加", @@ -9859,13 +9858,11 @@ "xpack.ingestPipelines.testPipelineFlyout.documentsTab.simulateDocumentionLink": "了解详情", "xpack.ingestPipelines.testPipelineFlyout.documentsTab.tabDescriptionText": "为管道提供要采集的一系列文档。{learnMoreLink}", "xpack.ingestPipelines.testPipelineFlyout.executePipelineError": "无法执行管道", - "xpack.ingestPipelines.testPipelineFlyout.invalidPipelineErrorMessage": "要执行的管道无效。", "xpack.ingestPipelines.testPipelineFlyout.outputTab.descriptionLinkLabel": "刷新输出", "xpack.ingestPipelines.testPipelineFlyout.outputTab.descriptionText": "查看输出数据或了解文档通过管道时每个处理器对文档的影响。", "xpack.ingestPipelines.testPipelineFlyout.outputTab.verboseSwitchLabel": "查看详细输出", "xpack.ingestPipelines.testPipelineFlyout.successNotificationText": "管道已执行", "xpack.ingestPipelines.testPipelineFlyout.title": "测试管道", - "xpack.ingestPipelines.testPipelineFlyout.withPipelineNameTitle": "测试管道“{pipelineName}”", "xpack.lens.app.docLoadingError": "加载已保存文档时出错", "xpack.lens.app.docSavingError": "保存文档时出错", "xpack.lens.app.indexPatternLoadingError": "加载索引模式时出错", From 87596465766158ccd758bb7eafa10d4d6d6acb99 Mon Sep 17 00:00:00 2001 From: Mikhail Shustov Date: Wed, 5 Aug 2020 16:28:03 +0300 Subject: [PATCH 10/33] update docs (#74364) --- .../architecture/code-exploration.asciidoc | 74 ++++++++++--------- 1 file changed, 41 insertions(+), 33 deletions(-) diff --git a/docs/developer/architecture/code-exploration.asciidoc b/docs/developer/architecture/code-exploration.asciidoc index 4481dea44795c9..bb7222020180ca 100644 --- a/docs/developer/architecture/code-exploration.asciidoc +++ b/docs/developer/architecture/code-exploration.asciidoc @@ -58,9 +58,9 @@ The Charts plugin is a way to create easier integration of shared colors, themes WARNING: Missing README. -- {kib-repo}blob/{branch}/src/plugins/dashboard[dashboard] +- {kib-repo}blob/{branch}/src/plugins/dashboard/README.md[dashboard] -WARNING: Missing README. +Contains the dashboard application. - {kib-repo}blob/{branch}/src/plugins/data/README.md[data] @@ -76,9 +76,9 @@ Routing will be handled by the id of the dev tool - your dev tool will be mounte This API doesn't support angular, for registering angular dev tools, bootstrap a local module on mount into the given HTML element. -- {kib-repo}blob/{branch}/src/plugins/discover[discover] +- {kib-repo}blob/{branch}/src/plugins/discover/README.md[discover] -WARNING: Missing README. +Contains the Discover application and the saved search embeddable. - {kib-repo}blob/{branch}/src/plugins/embeddable/README.md[embeddable] @@ -109,9 +109,9 @@ Moves the legacy ui/registry/feature_catalogue module for registering "features" WARNING: Missing README. -- {kib-repo}blob/{branch}/src/plugins/input_control_vis[inputControlVis] +- {kib-repo}blob/{branch}/src/plugins/input_control_vis/README.md[inputControlVis] -WARNING: Missing README. +Contains the input control visualization allowing to place custom filter controls on a dashboard. - {kib-repo}blob/{branch}/src/plugins/inspector/README.md[inspector] @@ -206,9 +206,10 @@ This plugin adds the Advanced Settings section for the Usage Data collection (ak WARNING: Missing README. -- {kib-repo}blob/{branch}/src/plugins/timelion[timelion] +- {kib-repo}blob/{branch}/src/plugins/timelion/README.md[timelion] -WARNING: Missing README. +Contains the deprecated timelion application. For the timelion visualization, +which also contains the timelion APIs and backend, look at the vis_type_timelion plugin. - {kib-repo}blob/{branch}/src/plugins/ui_actions/README.md[uiActions] @@ -222,59 +223,63 @@ Usage Collection allows collecting usage data for other services to consume (tel To integrate with the telemetry services for usage collection of your feature, there are 2 steps: -- {kib-repo}blob/{branch}/src/plugins/vis_type_markdown[visTypeMarkdown] +- {kib-repo}blob/{branch}/src/plugins/vis_type_markdown/README.md[visTypeMarkdown] -WARNING: Missing README. +The markdown visualization that can be used to place text panels on dashboards. -- {kib-repo}blob/{branch}/src/plugins/vis_type_metric[visTypeMetric] +- {kib-repo}blob/{branch}/src/plugins/vis_type_metric/README.md[visTypeMetric] -WARNING: Missing README. +Contains the metric visualization. -- {kib-repo}blob/{branch}/src/plugins/vis_type_table[visTypeTable] +- {kib-repo}blob/{branch}/src/plugins/vis_type_table/README.md[visTypeTable] -WARNING: Missing README. +Contains the data table visualization, that allows presenting data in a simple table format. -- {kib-repo}blob/{branch}/src/plugins/vis_type_tagcloud[visTypeTagcloud] +- {kib-repo}blob/{branch}/src/plugins/vis_type_tagcloud/README.md[visTypeTagcloud] -WARNING: Missing README. +Contains the tagcloud visualization. - {kib-repo}blob/{branch}/src/plugins/vis_type_timelion/README.md[visTypeTimelion] -If your grammar was changed in public/chain.peg you need to re-generate the static parser. You could use a grunt task: +Contains the timelion visualization and the timelion backend. -- {kib-repo}blob/{branch}/src/plugins/vis_type_timeseries[visTypeTimeseries] +- {kib-repo}blob/{branch}/src/plugins/vis_type_timeseries/README.md[visTypeTimeseries] -WARNING: Missing README. +Contains everything around TSVB (the editor, visualizatin implementations and backends). -- {kib-repo}blob/{branch}/src/plugins/vis_type_vega[visTypeVega] +- {kib-repo}blob/{branch}/src/plugins/vis_type_vega/README.md[visTypeVega] -WARNING: Missing README. +Contains the Vega visualization. -- {kib-repo}blob/{branch}/src/plugins/vis_type_vislib[visTypeVislib] +- {kib-repo}blob/{branch}/src/plugins/vis_type_vislib/README.md[visTypeVislib] -WARNING: Missing README. +Contains the vislib visualizations. These are the classical area/line/bar, pie, gauge/goal and +heatmap charts. -- {kib-repo}blob/{branch}/src/plugins/vis_type_xy[visTypeXy] +- {kib-repo}blob/{branch}/src/plugins/vis_type_xy/README.md[visTypeXy] -WARNING: Missing README. +Contains the new xy-axis chart using the elastic-charts library, which will eventually +replace the vislib xy-axis (bar, area, line) charts. -- {kib-repo}blob/{branch}/src/plugins/visualizations[visualizations] +- {kib-repo}blob/{branch}/src/plugins/visualizations/README.md[visualizations] -WARNING: Missing README. +Contains most of the visualization infrastructure, e.g. the visualization type registry or the +visualization embeddable. -- {kib-repo}blob/{branch}/src/plugins/visualize[visualize] +- {kib-repo}blob/{branch}/src/plugins/visualize/README.md[visualize] -WARNING: Missing README. +Contains the visualize application which includes the listing page and the app frame, +which will load the visualization's editor. [discrete] @@ -345,9 +350,12 @@ You can run a local cluster and simulate a remote cluster within a single Kibana - {kib-repo}blob/{branch}/x-pack/plugins/dashboard_enhanced/README.md[dashboardEnhanced] -- {kib-repo}blob/{branch}/x-pack/plugins/dashboard_mode[dashboardMode] +Contains the enhancements to the OSS dashboard app. -WARNING: Missing README. + +- {kib-repo}blob/{branch}/x-pack/plugins/dashboard_mode/README.md[dashboardMode] + +The deprecated dashboard only mode. - {kib-repo}blob/{branch}/x-pack/plugins/data_enhanced[dataEnhanced] @@ -355,9 +363,9 @@ WARNING: Missing README. WARNING: Missing README. -- {kib-repo}blob/{branch}/x-pack/plugins/discover_enhanced[discoverEnhanced] +- {kib-repo}blob/{branch}/x-pack/plugins/discover_enhanced/README.md[discoverEnhanced] -WARNING: Missing README. +Contains the enhancements to the OSS discover app. - {kib-repo}blob/{branch}/x-pack/plugins/embeddable_enhanced[embeddableEnhanced] From 3fb77fb546054d11b2aa731ab205f82e2b51d4f3 Mon Sep 17 00:00:00 2001 From: Melissa Alvarez Date: Wed, 5 Aug 2020 10:31:47 -0400 Subject: [PATCH 11/33] [ML] DF Analytics creation wizard: show link to results (#74025) * show view results card once job complete * update types * update types and move css to own file --- .../data_frame_analytics/_index.scss | 1 + .../analytics_creation/components/_index.scss | 3 + .../back_to_list_panel/back_to_list_panel.tsx | 6 +- .../components/create_step/create_step.tsx | 10 +- .../create_step_footer.tsx} | 122 +++++++----------- .../components/create_step_footer/index.ts | 7 + .../create_step_footer/progress_stats.tsx | 83 ++++++++++++ .../components/view_results_panel/index.ts | 7 + .../view_results_panel/view_results_panel.tsx | 46 +++++++ .../components/analytics_list/common.ts | 2 +- 10 files changed, 201 insertions(+), 86 deletions(-) create mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/_index.scss rename x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/{create_step/progress_stats.tsx => create_step_footer/create_step_footer.tsx} (55%) create mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step_footer/index.ts create mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step_footer/progress_stats.tsx create mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/view_results_panel/index.ts create mode 100644 x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/view_results_panel/view_results_panel.tsx diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/_index.scss b/x-pack/plugins/ml/public/application/data_frame_analytics/_index.scss index 140593cb17f6ec..231d0f6a0d8c55 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/_index.scss +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/_index.scss @@ -1,3 +1,4 @@ @import 'pages/analytics_exploration/components/regression_exploration/index'; @import 'pages/analytics_management/components/analytics_list/index'; @import 'pages/analytics_management/components/create_analytics_button/index'; +@import 'pages/analytics_creation/components/index'; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/_index.scss b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/_index.scss new file mode 100644 index 00000000000000..28d0928eb4d354 --- /dev/null +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/_index.scss @@ -0,0 +1,3 @@ +.dfAnalyticsCreationWizard__card { + width: 300px; +} diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/back_to_list_panel/back_to_list_panel.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/back_to_list_panel/back_to_list_panel.tsx index 183cbe084f9b35..babb5571052702 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/back_to_list_panel/back_to_list_panel.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/back_to_list_panel/back_to_list_panel.tsx @@ -5,7 +5,7 @@ */ import React, { FC, Fragment } from 'react'; -import { EuiCard, EuiHorizontalRule, EuiIcon } from '@elastic/eui'; +import { EuiCard, EuiIcon } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { useNavigateToPath } from '../../../../../contexts/kibana'; @@ -18,10 +18,8 @@ export const BackToListPanel: FC = () => { return ( - } title={i18n.translate('xpack.ml.dataframe.analytics.create.analyticsListCardTitle', { defaultMessage: 'Data Frame Analytics', diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step/create_step.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step/create_step.tsx index 8ad49b84134cb5..dc9f1bd586d9fe 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step/create_step.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step/create_step.tsx @@ -18,8 +18,7 @@ import { i18n } from '@kbn/i18n'; import { CreateAnalyticsFormProps } from '../../../analytics_management/hooks/use_create_analytics_form'; import { Messages } from '../shared'; import { ANALYTICS_STEPS } from '../../page'; -import { BackToListPanel } from '../back_to_list_panel'; -import { ProgressStats } from './progress_stats'; +import { CreateStepFooter } from '../create_step_footer'; interface Props extends CreateAnalyticsFormProps { step: ANALYTICS_STEPS; @@ -28,7 +27,7 @@ interface Props extends CreateAnalyticsFormProps { export const CreateStep: FC = ({ actions, state, step }) => { const { createAnalyticsJob, startAnalyticsJob } = actions; const { isAdvancedEditorValidJson, isJobCreated, isJobStarted, isValid, requestMessages } = state; - const { jobId } = state.form; + const { jobId, jobType } = state.form; const [checked, setChecked] = useState(true); const [showProgress, setShowProgress] = useState(false); @@ -86,8 +85,9 @@ export const CreateStep: FC = ({ actions, state, step }) => { )} - {isJobCreated === true && showProgress && } - {isJobCreated === true && } + {isJobCreated === true && ( + + )} ); }; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step/progress_stats.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step_footer/create_step_footer.tsx similarity index 55% rename from x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step/progress_stats.tsx rename to x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step_footer/create_step_footer.tsx index c87f0f4206feb6..93d88ebc0b5ac2 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step/progress_stats.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step_footer/create_step_footer.tsx @@ -4,38 +4,43 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { FC, useState, useEffect } from 'react'; -import { - EuiCallOut, - EuiFlexGroup, - EuiFlexItem, - EuiProgress, - EuiSpacer, - EuiText, -} from '@elastic/eui'; +import React, { FC, useEffect, useState } from 'react'; +import { EuiFlexGroup, EuiFlexItem, EuiHorizontalRule } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { useMlKibana } from '../../../../../contexts/kibana'; + import { getDataFrameAnalyticsProgressPhase, DATA_FRAME_TASK_STATE, } from '../../../analytics_management/components/analytics_list/common'; import { isGetDataFrameAnalyticsStatsResponseOk } from '../../../analytics_management/services/analytics_service/get_analytics'; +import { useMlKibana } from '../../../../../contexts/kibana'; import { ml } from '../../../../../services/ml_api_service'; -import { DataFrameAnalyticsId } from '../../../../common/analytics'; +import { BackToListPanel } from '../back_to_list_panel'; +import { ViewResultsPanel } from '../view_results_panel'; +import { ProgressStats } from './progress_stats'; +import { ANALYSIS_CONFIG_TYPE } from '../../../../common/analytics'; export const PROGRESS_REFRESH_INTERVAL_MS = 1000; -export const ProgressStats: FC<{ jobId: DataFrameAnalyticsId }> = ({ jobId }) => { +interface Props { + jobId: string; + jobType: ANALYSIS_CONFIG_TYPE; + showProgress: boolean; +} + +export interface AnalyticsProgressStats { + currentPhase: number; + progress: number; + totalPhases: number; +} + +export const CreateStepFooter: FC = ({ jobId, jobType, showProgress }) => { const [initialized, setInitialized] = useState(false); const [failedJobMessage, setFailedJobMessage] = useState(undefined); - const [currentProgress, setCurrentProgress] = useState< - | { - currentPhase: number; - progress: number; - totalPhases: number; - } - | undefined - >(undefined); + const [jobFinished, setJobFinished] = useState(false); + const [currentProgress, setCurrentProgress] = useState( + undefined + ); const { services: { notifications }, @@ -77,6 +82,7 @@ export const ProgressStats: FC<{ jobId: DataFrameAnalyticsId }> = ({ jobId }) => jobStats.state === DATA_FRAME_TASK_STATE.STOPPED ) { clearInterval(interval); + setJobFinished(true); } } else { clearInterval(interval); @@ -95,62 +101,26 @@ export const ProgressStats: FC<{ jobId: DataFrameAnalyticsId }> = ({ jobId }) => return () => clearInterval(interval); }, [initialized]); - if (currentProgress === undefined) return null; - return ( - <> - - {failedJobMessage !== undefined && ( - <> - -

{failedJobMessage}

-
- - - )} - - - {i18n.translate('xpack.ml.dataframe.analytics.create.analyticsProgressTitle', { - defaultMessage: 'Progress', - })} - - - - - - - - {i18n.translate('xpack.ml.dataframe.analytics.create.analyticsProgressPhaseTitle', { - defaultMessage: 'Phase', - })}{' '} - {currentProgress.currentPhase}/{currentProgress.totalPhases} - - - - - - - - {`${currentProgress.progress}%`} - - - + + + {showProgress && ( + + )} + + + + + + + + {jobFinished === true && ( + + + + )} + + + ); }; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step_footer/index.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step_footer/index.ts new file mode 100644 index 00000000000000..fc4e230ba10341 --- /dev/null +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step_footer/index.ts @@ -0,0 +1,7 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export { CreateStepFooter } from './create_step_footer'; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step_footer/progress_stats.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step_footer/progress_stats.tsx new file mode 100644 index 00000000000000..522bafa54a2707 --- /dev/null +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/create_step_footer/progress_stats.tsx @@ -0,0 +1,83 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { FC } from 'react'; +import { + EuiCallOut, + EuiFlexGroup, + EuiFlexItem, + EuiProgress, + EuiSpacer, + EuiText, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { AnalyticsProgressStats } from './create_step_footer'; + +interface Props { + currentProgress?: AnalyticsProgressStats; + failedJobMessage: string | undefined; +} + +export const ProgressStats: FC = ({ currentProgress, failedJobMessage }) => { + if (currentProgress === undefined) return null; + + return ( + <> + + {failedJobMessage !== undefined && ( + <> + +

{failedJobMessage}

+
+ + + )} + + + {i18n.translate('xpack.ml.dataframe.analytics.create.analyticsProgressTitle', { + defaultMessage: 'Progress', + })} + + + + + + + + {i18n.translate('xpack.ml.dataframe.analytics.create.analyticsProgressPhaseTitle', { + defaultMessage: 'Phase', + })}{' '} + {currentProgress.currentPhase}/{currentProgress.totalPhases} + + + + + + + + {`${currentProgress.progress}%`} + + + + ); +}; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/view_results_panel/index.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/view_results_panel/index.ts new file mode 100644 index 00000000000000..ef3c0cce38652b --- /dev/null +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/view_results_panel/index.ts @@ -0,0 +1,7 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export { ViewResultsPanel } from './view_results_panel'; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/view_results_panel/view_results_panel.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/view_results_panel/view_results_panel.tsx new file mode 100644 index 00000000000000..13706eb548ec8a --- /dev/null +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/view_results_panel/view_results_panel.tsx @@ -0,0 +1,46 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { FC, Fragment } from 'react'; +import { EuiCard, EuiIcon } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { useNavigateToPath } from '../../../../../contexts/kibana'; +import { getResultsUrl } from '../../../analytics_management/components/analytics_list/common'; +import { ANALYSIS_CONFIG_TYPE } from '../../../../common/analytics'; + +interface Props { + jobId: string; + analysisType: ANALYSIS_CONFIG_TYPE; +} + +export const ViewResultsPanel: FC = ({ jobId, analysisType }) => { + const navigateToPath = useNavigateToPath(); + + const redirectToAnalyticsManagementPage = async () => { + const path = getResultsUrl(jobId, analysisType); + await navigateToPath(path); + }; + + return ( + + } + title={i18n.translate('xpack.ml.dataframe.analytics.create.viewResultsCardTitle', { + defaultMessage: 'View Results', + })} + description={i18n.translate( + 'xpack.ml.dataframe.analytics.create.viewResultsCardDescription', + { + defaultMessage: 'View results for the analytics job.', + } + )} + onClick={redirectToAnalyticsManagementPage} + data-test-subj="analyticsWizardViewResultsCard" + /> + + ); +}; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/common.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/common.ts index e2d9ecccf06266..cc52138d7c7b73 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/common.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/common.ts @@ -130,6 +130,6 @@ export function isCompletedAnalyticsJob(stats: DataFrameAnalyticsStats) { return stats.state === DATA_FRAME_TASK_STATE.STOPPED && progress === 100; } -export function getResultsUrl(jobId: string, analysisType: string) { +export function getResultsUrl(jobId: string, analysisType: ANALYSIS_CONFIG_TYPE | string) { return `#/data_frame_analytics/exploration?_g=(ml:(jobId:${jobId},analysisType:${analysisType}))`; } From 88c063134464047c5da471e480dd26cabe471a02 Mon Sep 17 00:00:00 2001 From: Mikhail Shustov Date: Wed, 5 Aug 2020 18:32:19 +0300 Subject: [PATCH 12/33] Update @typescript-eslint to ensure compatibility with TypeScript v3.9 (#74091) * bump @typescript-eslint deps * update rules * fix errors in pacakges * fix src/ * fix x-pack * fix test * fix typings * fix examples * allow _ as prefix and suffix * roll back prefix and suffix changes * add eslint-plugin-eslint-comments * report unused rules * remove unused eslint comments from tests * remove unused eslint comments 2nd pass * remove unused eslint comments from src/ * remove unused comments in x-pack * use no-script-url and no-unsanitized/property for ts files * remove unused eslint comments * eui/href-or-on-click removed when not complained * no import/* rules for ts files * cleanup * remove the unused eslint-disable * rollback unnecessary changes * allow underscore prefix & sufix in type name * update docs * fix type error in enterprise search plugin mocks * rename platform hack __coreProvider --> _coreProvider * rollback space removal in src/core/public/legacy/legacy_service.test.ts * fix naming convention in APM --- ...a_utils-public-state_sync.isyncstateref.md | 2 +- .../public/components/create_alert.tsx | 1 + examples/alerting_example/public/plugin.tsx | 1 + kibana.d.ts | 1 - package.json | 5 +- packages/eslint-config-kibana/package.json | 9 +- packages/eslint-config-kibana/typescript.js | 91 +++++++++++++++++-- packages/kbn-plugin-helpers/src/lib/utils.ts | 4 +- src/cli/cluster/cluster_manager.ts | 2 +- src/core/server/config/config_service.test.ts | 2 - .../lifecycle_handlers.test.ts | 5 +- src/core/server/legacy/legacy_service.ts | 1 + .../migrations/core/call_cluster.ts | 2 - .../integration_tests/bulk_create.test.ts | 8 +- .../routes/integration_tests/bulk_get.test.ts | 8 +- .../integration_tests/bulk_update.test.ts | 8 +- .../routes/integration_tests/create.test.ts | 8 +- .../routes/integration_tests/delete.test.ts | 8 +- .../routes/integration_tests/export.test.ts | 8 +- .../routes/integration_tests/find.test.ts | 8 +- .../routes/integration_tests/import.test.ts | 8 +- .../log_legacy_import.test.ts | 6 +- .../resolve_import_errors.test.ts | 8 +- .../routes/integration_tests/update.test.ts | 8 +- .../saved_objects/serialization/serializer.ts | 3 +- .../saved_objects/service/lib/repository.ts | 1 + src/core/server/status/status_service.ts | 2 - src/core/server/utils/package_json.ts | 1 - .../core_plugins/elasticsearch/index.d.ts | 2 - .../public/new_platform/__mocks__/helpers.ts | 2 - .../ui/public/new_platform/new_platform.ts | 1 + .../public/new_platform/set_services.test.ts | 2 - .../management_app/components/field/field.tsx | 2 + .../management_app/components/form/form.tsx | 1 + .../console_history/console_history.tsx | 1 - .../legacy_core_editor/create_readonly.ts | 1 - .../legacy_core_editor/legacy_core_editor.ts | 4 +- .../public/lib/autocomplete/autocomplete.ts | 1 - src/plugins/console/public/lib/es/es.ts | 2 +- .../lib/spec_definitions/js/aggregations.ts | 2 +- .../server/lib/spec_definitions/js/aliases.ts | 1 - .../lib/spec_definitions/js/document.ts | 1 - .../server/lib/spec_definitions/js/filter.ts | 1 - .../server/lib/spec_definitions/js/globals.ts | 1 - .../server/lib/spec_definitions/js/ingest.ts | 1 - .../lib/spec_definitions/js/mappings.ts | 1 - .../lib/spec_definitions/js/query/dsl.ts | 1 - .../spec_definitions/js/query/templates.ts | 1 - .../server/lib/spec_definitions/js/reindex.ts | 1 - .../server/lib/spec_definitions/js/search.ts | 1 - .../lib/spec_definitions/js/settings.ts | 1 - .../server/lib/spec_definitions/js/shared.ts | 1 - .../actions/clone_panel_action.test.tsx | 2 - .../actions/expand_panel_action.test.tsx | 2 - .../actions/replace_panel_action.test.tsx | 2 - .../public/application/application.ts | 2 +- .../embeddable/dashboard_container.test.tsx | 3 - .../embeddable/grid/dashboard_grid.test.tsx | 1 - .../embeddable/grid/dashboard_grid.tsx | 2 + .../viewport/dashboard_viewport.test.tsx | 1 - .../public/embeddable_plugin_test_samples.ts | 1 - .../dashboard/public/url_generator.test.ts | 1 - .../index_patterns/index_patterns.test.ts | 1 - .../date_interval_utils/is_valid_interval.ts | 4 +- src/plugins/data/public/search/aggs/mocks.ts | 1 - .../search_source/normalize_sort_request.ts | 1 + .../index_pattern_select.tsx | 10 +- .../query_string_input/query_bar_top_row.tsx | 1 + .../data/public/ui/search_bar/search_bar.tsx | 3 +- .../ui/typeahead/suggestion_component.tsx | 1 + .../autocomplete/value_suggestions_route.ts | 1 + .../components/table/table_row.tsx | 1 + .../discover/public/url_generator.test.ts | 1 - .../embeddable_child_panel.test.tsx | 1 - .../lib/panel/embeddable_panel.test.tsx | 1 - .../add_panel/add_panel_action.test.tsx | 1 - .../inspect_panel_action.test.tsx | 1 - .../lib/panel/panel_header/panel_header.tsx | 1 + src/plugins/embeddable/public/mocks.tsx | 2 - .../public/tests/apply_filter_action.test.ts | 1 - .../embeddable/public/tests/container.test.ts | 1 - .../tests/customize_panel_modal.test.tsx | 1 - .../public/tests/explicit_input.test.ts | 1 - .../embeddable/public/tests/test_plugin.ts | 2 - .../ace/use_ui_ace_keyboard_mode.tsx | 1 - .../forms/hook_form_lib/hooks/use_field.ts | 1 + .../expressions/common/execution/container.ts | 1 - src/plugins/expressions/public/mocks.tsx | 2 - src/plugins/expressions/server/mocks.ts | 3 - .../data_sets/ecommerce/saved_objects.ts | 1 - .../data_sets/logs/saved_objects.ts | 1 - .../step_index_pattern/step_index_pattern.tsx | 1 + .../editor/range_control_editor.test.tsx | 2 +- .../public/components/vis/form_row.test.tsx | 6 +- .../components/vis/input_control_vis.test.tsx | 8 +- .../components/vis/list_control.test.tsx | 4 +- .../components/vis/range_control.test.tsx | 4 +- .../public/control/control.ts | 2 - src/plugins/inspector/public/mocks.ts | 1 - .../public/utils/inject_header_style.ts | 1 + .../adapters/ui_to_react_component.test.tsx | 4 + .../public/markdown/markdown.test.tsx | 10 +- .../validated_range/validated_dual_range.tsx | 6 +- .../public/state_sync/public.api.md | 2 +- .../public/state_sync/state_sync.ts | 2 +- .../public/storage/hashed_item_store/mock.ts | 1 + .../public/plugin.test.ts | 2 - .../telemetry_collection/get_local_stats.ts | 1 + src/plugins/timelion/public/application.ts | 2 +- .../public/components/metric_vis_value.tsx | 2 + .../public/table_vis_controller.test.ts | 3 - .../public/table_vis_fn.test.ts | 1 - .../vis_type_timeseries/common/vis_schema.ts | 1 + .../application/components/color_picker.tsx | 2 +- .../public/data_model/vega_parser.ts | 1 - .../vis_type_vislib/public/pie_fn.test.ts | 1 - .../vislib/components/legend/legend.tsx | 1 + .../vislib/components/legend/legend_item.tsx | 1 + .../public/legacy/build_pipeline.ts | 6 +- .../saved_visualizations.ts | 2 +- src/test_utils/public/http_test_setup.ts | 2 - test/functional/apps/console/_console.ts | 1 - test/functional/apps/home/_navigation.ts | 1 - .../functional/apps/visualize/_chart_types.ts | 1 - .../apps/visualize/_linked_saved_searches.ts | 1 - test/functional/apps/visualize/_tsvb_chart.ts | 1 - .../apps/visualize/_tsvb_markdown.ts | 1 - .../apps/visualize/_tsvb_time_series.ts | 1 - test/functional/apps/visualize/_vega_chart.ts | 1 - test/functional/apps/visualize/index.ts | 1 - .../input_control_vis/input_control_range.ts | 1 - test/mocha_decorations.d.ts | 1 - .../plugins/core_app_status/public/plugin.tsx | 2 +- .../plugins/core_app_status/public/types.ts | 2 +- .../core_provider_plugin/public/index.ts | 2 +- .../plugins/core_provider_plugin/types.ts | 2 +- .../test_suites/application_links/index.ts | 1 - .../application_links/redirect_app_links.ts | 7 +- .../core_plugins/application_leave_confirm.ts | 1 - .../core_plugins/application_status.ts | 5 +- .../test_suites/core_plugins/applications.ts | 1 - .../core_plugins/elasticsearch_client.ts | 1 - .../test_suites/core_plugins/index.ts | 1 - .../core_plugins/legacy_plugins.ts | 1 - .../test_suites/core_plugins/rendering.ts | 1 - .../core_plugins/server_plugins.ts | 1 - .../test_suites/core_plugins/top_nav.ts | 1 - .../test_suites/core_plugins/ui_plugins.ts | 9 +- .../test_suites/core_plugins/ui_settings.ts | 7 +- .../test_suites/data_plugin/index_patterns.ts | 1 - .../test_suites/doc_views/doc_views.ts | 1 - test/typings/rison_node.d.ts | 4 +- typings/rison_node.d.ts | 4 +- .../beats_management/common/io_ts_types.ts | 1 - .../beats_management/scripts/fake_env.ts | 6 +- .../beats_management/server/lib/beats.ts | 2 +- .../server/builtin_action_types/index.test.ts | 4 +- .../servicenow/case_types.ts | 2 - .../alerts/server/alert_type_registry.test.ts | 3 - x-pack/plugins/alerts/server/alerts_client.ts | 1 + x-pack/plugins/alerts/server/types.ts | 1 - .../apm/e2e/cypress/integration/helpers.ts | 2 - .../CytoscapeExampleData.stories.tsx | 1 - .../plugins/apm/public/hooks/useFetcher.tsx | 2 - .../plugins/apm/public/utils/testHelpers.tsx | 4 + .../apm/scripts/shared/read-kibana-config.ts | 2 + .../scripts/upload-telemetry-data/index.ts | 1 - x-pack/plugins/apm/server/index.ts | 2 + .../collect_data_telemetry/tasks.test.ts | 2 + .../__tests__/get_buckets.test.ts | 2 + .../server/lib/helpers/setup_request.test.ts | 2 + .../settings/apm_indices/get_apm_indices.ts | 4 + .../lib/transaction_groups/get_error_rate.ts | 10 +- .../avg_duration_by_country/index.ts | 1 + .../lib/transactions/breakdown/index.test.ts | 2 + .../get_timeseries_data/fetcher.test.ts | 2 + .../apm/server/routes/settings/apm_indices.ts | 2 + .../apm/server/saved_objects/apm_indices.ts | 1 + .../public/components/tag/tag_edit.tsx | 5 +- .../functions/external/saved_map.ts | 1 - x-pack/plugins/canvas/public/application.tsx | 1 - .../confirm_modal/confirm_modal.tsx | 1 - .../custom_element_modal.tsx | 1 - .../canvas/public/lib/aeroelastic/index.d.ts | 12 +-- .../plugins/canvas/public/lib/elastic_logo.ts | 1 - .../canvas/public/state/selectors/workpad.ts | 5 +- .../server/routes/shareables/zip.test.ts | 1 + .../shareable_runtime/components/canvas.tsx | 2 + .../components/footer/page_controls.tsx | 8 +- .../components/footer/page_preview.tsx | 4 +- .../footer/settings/autoplay_settings.tsx | 2 + .../footer/settings/toolbar_settings.tsx | 6 +- .../canvas/shareable_runtime/test/utils.ts | 1 + .../canvas/storybook/addon/src/register.tsx | 2 - .../api/cases/comments/delete_all_comments.ts | 1 + .../api/cases/comments/delete_comment.ts | 1 + .../api/cases/comments/patch_comment.ts | 1 + .../routes/api/cases/comments/post_comment.ts | 1 + .../api/cases/configure/patch_configure.ts | 1 + .../api/cases/configure/post_configure.ts | 1 + .../server/routes/api/cases/delete_cases.ts | 1 + .../server/routes/api/cases/patch_cases.ts | 1 + .../case/server/routes/api/cases/post_case.ts | 1 + .../case/server/routes/api/cases/push_case.ts | 1 + .../plugins/case/server/routes/api/utils.ts | 2 + .../server/services/user_actions/helpers.ts | 1 + .../auto_follow_pattern_serialization.ts | 13 ++- .../services/follower_index_serialization.ts | 4 +- .../public/app/index.tsx | 4 +- .../server/lib/ccr_stats_serialization.ts | 2 +- .../server/lib/format_es_error.ts | 7 +- .../server/search/es_search_strategy.ts | 1 + .../lib/enterprise_search_config_api.test.ts | 1 + .../server/routes/__mocks__/router.mock.ts | 12 +-- .../server/routes/app_search/engines.test.ts | 1 + .../routes/workplace_search/overview.test.ts | 1 + .../server/es/cluster_client_adapter.ts | 1 + .../routes/integration_tests/find.test.ts | 6 +- x-pack/plugins/graph/public/application.ts | 2 +- .../components/field_manager/field_editor.tsx | 1 + .../components/field_manager/field_picker.tsx | 1 + .../graph_visualization.tsx | 2 + .../guidance_panel/guidance_panel.tsx | 2 + .../components/settings/url_template_form.tsx | 1 + .../server/lib/kibana_framework.ts | 14 ++- .../api/templates/register_fetch_route.ts | 3 +- .../helpers/setup_environment.tsx | 1 - .../home/data_streams_tab.helpers.ts | 4 +- .../client_integration/home/home.helpers.ts | 4 +- .../home/index_templates_tab.helpers.ts | 2 +- .../home/indices_tab.helpers.ts | 4 +- .../template_clone.helpers.ts | 2 +- .../template_create.helpers.ts | 2 +- .../template_edit.helpers.ts | 2 +- .../common/lib/data_stream_serialization.ts | 5 +- .../helpers/setup_environment.tsx | 1 - .../component_templates.tsx | 1 + .../component_templates_selector.tsx | 1 + .../component_templates/lib/documentation.ts | 1 + .../datatypes/text_datatype.test.tsx | 3 + .../configuration_form/configuration_form.tsx | 4 + .../dynamic_mapping_section.tsx | 1 + .../field_parameters/dynamic_parameter.tsx | 1 + .../fields/create_field/create_field.tsx | 2 + .../fields/fields_list_item.tsx | 8 ++ .../search_fields/search_result_item.tsx | 5 + .../templates_form/templates_form.tsx | 1 + .../mappings_editor/mappings_editor.tsx | 2 + .../data_stream_table/data_stream_table.tsx | 1 - .../server/routes/api/templates/lib.ts | 1 + .../index_management/server/routes/helpers.ts | 7 +- x-pack/plugins/infra/common/errors/metrics.ts | 1 - .../inventory/components/expression.tsx | 1 - .../infra/public/alerting/inventory/index.ts | 1 - .../components/expression.tsx | 1 - .../public/components/document_title.tsx | 6 +- .../logging/log_text_stream/jump_to_tail.tsx | 2 - .../log_text_stream/loading_item_view.tsx | 2 - .../scrollable_log_text_stream_view.tsx | 2 - .../components/navigation/routed_tabs.tsx | 1 - .../metrics_explorer/components/charts.tsx | 4 +- .../lib/adapters/framework/adapter_types.ts | 4 +- .../framework/kibana_framework_adapter.ts | 8 +- .../lib/adapters/metrics/adapter_types.ts | 8 +- .../alerting/metric_threshold/test_mocks.ts | 1 + .../lib/log_analysis/log_entry_anomalies.ts | 1 + .../queries/log_entry_categories.ts | 1 + .../queries/log_entry_category_examples.ts | 1 + .../applications/ingest_manager/index.tsx | 1 - .../components/settings/index.tsx | 1 + .../edit_package_config_page/index.tsx | 3 + .../server/services/agent_config.ts | 2 + .../server/services/agents/crud.ts | 1 + .../server/services/agents/events.ts | 1 + .../services/api_keys/enrollment_api_key.ts | 1 + .../server/services/package_config.ts | 1 + .../helpers/pipelines_clone.helpers.ts | 2 +- .../helpers/pipelines_create.helpers.ts | 2 +- .../helpers/pipelines_edit.helpers.ts | 2 +- .../helpers/setup_environment.tsx | 2 - .../context_menu.tsx | 1 + .../inline_text_input.tsx | 1 + .../pipeline_processors_editor_item.tsx | 7 +- .../components/drop_zone_button.tsx | 3 + .../server/routes/api/create.ts | 1 + .../server/routes/api/update.ts | 1 + .../editor_frame/suggestion_panel.tsx | 2 + .../workspace_panel_wrapper.tsx | 1 + .../dimension_panel/field_select.tsx | 2 + .../public/persistence/saved_object_store.ts | 1 - .../lists/common/schemas/common/schemas.ts | 2 +- .../index_es_list_item_schema.ts | 2 - .../elastic_query/index_es_list_schema.ts | 2 - .../update_es_list_item_schema.ts | 2 - .../elastic_query/update_es_list_schema.ts | 2 - .../search_es_list_item_schema.ts | 2 - .../elastic_response/search_es_list_schema.ts | 2 - .../create_endpoint_list_item_schema.ts | 2 - .../create_exception_list_item_schema.ts | 2 - .../request/create_exception_list_schema.ts | 2 - .../request/create_list_item_schema.ts | 2 - .../delete_endpoint_list_item_schema.ts | 2 - .../delete_exception_list_item_schema.ts | 2 - .../request/delete_exception_list_schema.ts | 2 - .../request/delete_list_item_schema.ts | 2 - .../schemas/request/delete_list_schema.ts | 2 - .../request/export_list_item_query_schema.ts | 2 - .../request/find_endpoint_list_item_schema.ts | 2 - .../find_exception_list_item_schema.ts | 2 - .../request/find_exception_list_schema.ts | 2 - .../schemas/request/find_list_item_schema.ts | 2 - .../schemas/request/find_list_schema.ts | 2 - .../request/import_list_item_query_schema.ts | 2 - .../request/import_list_item_schema.ts | 2 - .../schemas/request/patch_list_item_schema.ts | 2 - .../schemas/request/patch_list_schema.ts | 2 - .../request/read_endpoint_list_item_schema.ts | 2 - .../read_exception_list_item_schema.ts | 2 - .../request/read_exception_list_schema.ts | 2 - .../schemas/request/read_list_item_schema.ts | 2 - .../schemas/request/read_list_schema.ts | 2 - .../update_endpoint_list_item_schema.ts | 2 - .../update_exception_list_item_schema.ts | 2 - .../request/update_exception_list_schema.ts | 2 - .../request/update_list_item_schema.ts | 2 - .../schemas/request/update_list_schema.ts | 2 - .../response/create_endpoint_list_schema.ts | 2 - .../response/exception_list_item_schema.ts | 2 - .../schemas/response/exception_list_schema.ts | 2 - .../found_exception_list_item_schema.ts | 2 - .../response/found_exception_list_schema.ts | 2 - .../response/found_list_item_schema.ts | 2 - .../schemas/response/found_list_schema.ts | 2 - .../schemas/response/list_item_schema.ts | 2 - .../common/schemas/response/list_schema.ts | 2 - .../exceptions_list_so_schema.ts | 2 - .../lists/common/schemas/types/comment.ts | 2 - .../lists/common/schemas/types/entries.ts | 2 - .../common/schemas/types/entry_exists.ts | 2 - .../lists/common/schemas/types/entry_list.ts | 2 - .../lists/common/schemas/types/entry_match.ts | 2 - .../common/schemas/types/entry_match_any.ts | 2 - .../common/schemas/types/entry_nested.ts | 2 - .../exceptions/hooks/use_exception_list.ts | 1 + x-pack/plugins/lists/public/lists/api.ts | 3 + .../server/services/exception_lists/utils.ts | 4 + .../utils/transform_elastic_to_list_item.ts | 2 + .../maps/public/actions/map_actions.ts | 2 - .../layers/tile_layer/tile_layer.test.ts | 1 - .../convert_to_geojson.test.ts | 4 + .../convert_to_lines.test.ts | 5 + .../mvt_field_config_editor.tsx | 1 - .../mvt_single_layer_vector_source_editor.tsx | 1 - .../vector/components/legend/symbol_icon.tsx | 7 +- .../properties/dynamic_icon_property.test.tsx | 1 - .../properties/dynamic_style_property.tsx | 7 +- .../public/classes/util/es_agg_utils.test.ts | 1 + .../tooltip_selector/tooltip_selector.tsx | 2 + .../flyout_body/flyout_body.tsx | 1 - .../flyout_body/layer_wizard_select.test.tsx | 1 + .../maps/public/index_pattern_util.test.ts | 2 + .../maps_legacy_licensing/public/plugin.ts | 1 - .../chart_tooltip/chart_tooltip.tsx | 2 +- .../components/data_grid/column_chart.tsx | 1 + .../components/data_grid/use_data_grid.tsx | 1 - .../contexts/kibana/kibana_context.ts | 1 - .../data_frame_analytics/common/fields.ts | 1 + .../analysis_fields_table.tsx | 4 +- .../hooks/use_index_data.ts | 3 - .../use_exploration_results.ts | 2 - .../outlier_exploration.tsx | 1 - .../outlier_exploration/use_outlier_data.ts | 2 - .../regression_exploration/evaluate_panel.tsx | 2 + .../components/action_clone/clone_button.tsx | 1 + .../analytics_list/expanded_row.tsx | 2 + .../hooks/use_create_analytics_form/state.ts | 1 - .../services/results_service/index.ts | 4 +- .../application/util/custom_url_utils.test.ts | 1 - .../monitoring/public/alerts/panel.tsx | 1 - .../monitoring/public/lib/setup_mode.tsx | 4 +- .../telemetry_collection/get_kibana_stats.ts | 2 + .../observability/public/data_handler.ts | 1 - .../public/hooks/use_route_params.tsx | 2 - .../public/services/get_news_feed.ts | 1 - .../services/get_observability_alerts.ts | 1 - .../oss_telemetry/server/test_utils/index.ts | 1 - .../application/components/main_controls.tsx | 1 + x-pack/plugins/painless_lab/public/links.ts | 1 + .../lib/job_completion_notifications.ts | 6 +- .../get_csv_panel_action.test.ts | 4 +- .../export_types/common/validate_urls.test.ts | 1 + .../server/lib/screenshots/observable.test.ts | 1 - .../server/routes/generation.test.ts | 6 +- .../reporting/server/routes/jobs.test.ts | 6 +- .../server/test_helpers/create_mock_server.ts | 1 - .../rollup/server/lib/format_es_error.ts | 7 +- .../components/percentage_badge.tsx | 2 + .../register_privileges_with_cluster.test.ts | 1 + .../schemas/common/schemas.ts | 2 +- .../request/add_prepackaged_rules_schema.ts | 2 - .../add_prepackged_rules_schema.test.ts | 1 + .../request/create_rules_schema.test.ts | 2 + .../schemas/request/create_rules_schema.ts | 2 - .../schemas/request/export_rules_schema.ts | 2 - .../schemas/request/find_rules_schema.ts | 2 - .../request/import_rules_schema.test.ts | 1 + .../schemas/request/import_rules_schema.ts | 2 - .../schemas/request/patch_rules_schema.ts | 2 - .../schemas/request/query_rules_schema.ts | 2 - .../request/set_signal_status_schema.ts | 2 - .../request/update_rules_schema.test.ts | 1 + .../schemas/request/update_rules_schema.ts | 2 - .../schemas/response/error_schema.ts | 2 - .../schemas/response/import_rules_schema.ts | 2 - .../response/prepackaged_rules_schema.ts | 2 - .../prepackaged_rules_status_schema.ts | 2 - .../schemas/response/rules_schema.ts | 1 - .../response/type_timeline_only_schema.ts | 2 - .../types/default_max_signals_number.ts | 1 - .../types/default_risk_score_mapping_array.ts | 1 - .../types/default_severity_mapping_array.ts | 1 - .../detection_engine/transform_actions.ts | 2 +- .../common/types/timeline/index.ts | 19 ++-- .../security_solution/public/app/index.tsx | 1 - .../components/configure_cases/index.tsx | 1 + .../components/endpoint/link_to_app.tsx | 1 - .../components/exceptions/builder/helpers.tsx | 1 - .../common/components/exceptions/helpers.tsx | 2 + .../viewer/exception_item/index.stories.tsx | 1 + .../public/common/components/links/index.tsx | 2 + .../navigation/breadcrumbs/index.ts | 1 - .../public/common/hooks/types.ts | 1 - .../common/lib/compose/kibana_compose.tsx | 1 - .../public/common/lib/kibana/services.ts | 1 - .../public/common/mock/kibana_core.ts | 1 - .../alerts_histogram_panel/helpers.tsx | 1 + .../alerts_table/default_config.tsx | 2 - .../rules/description_step/index.test.tsx | 1 - .../detection_engine/rules/types.ts | 2 - .../detection_engine/rules/create/index.tsx | 2 - .../detection_engine/rules/details/index.tsx | 7 +- .../detection_engine/rules/edit/index.tsx | 2 - .../pages/detection_engine/rules/utils.ts | 1 - .../public/hosts/pages/details/utils.ts | 1 - .../view/details/host_details.tsx | 2 +- .../pages/endpoint_hosts/view/index.test.tsx | 1 + .../pages/endpoint_hosts/view/index.tsx | 1 - .../policy/models/policy_details_config.ts | 16 ++-- .../policy/store/policy_details/selectors.ts | 1 + .../public/network/pages/ip_details/utils.ts | 1 - .../alerts_by_category/index.test.tsx | 2 - .../models/indexed_process_tree/index.ts | 2 - .../public/resolver/store/data/selectors.ts | 7 +- .../store/middleware/resolver_tree_fetcher.ts | 2 - .../simulator/mock_resolver.tsx | 1 - .../public/resolver/types.ts | 8 +- .../public/resolver/view/map.tsx | 2 - .../view/resolver_without_providers.tsx | 2 - .../components/formatted_ip/index.tsx | 2 +- .../open_timeline/export_timeline/mocks.ts | 1 + .../components/open_timeline/helpers.ts | 3 - .../timelines_table/actions_columns.tsx | 2 - .../server/endpoint/routes/resolver/entity.ts | 1 + .../manifest_manager/manifest_manager.ts | 1 + .../routes/signals/query_signals_route.ts | 2 +- .../get_rule_actions_saved_object.ts | 1 + .../signals/bulk_create_threshold_signals.ts | 1 + .../lib/detection_engine/signals/types.ts | 1 + .../server/lib/framework/types.ts | 2 +- .../server/lib/matrix_histogram/utils.ts | 2 + .../timeline/routes/utils/create_timelines.ts | 1 - .../server/lib/tls/elasticsearch_adapter.ts | 2 +- .../helpers/home.helpers.ts | 1 - .../helpers/policy_add.helpers.ts | 1 - .../helpers/policy_edit.helpers.ts | 1 - .../helpers/repository_add.helpers.ts | 1 - .../helpers/repository_edit.helpers.ts | 1 - .../helpers/restore_snapshot.helpers.ts | 1 - .../helpers/setup_environment.tsx | 1 - .../policy_list/policy_table/policy_table.tsx | 1 - .../repository_table/repository_table.tsx | 1 - .../snapshot_table/snapshot_table.tsx | 1 - .../server/lib/wrap_es_error.ts | 7 +- .../snapshot_restore/test/fixtures/policy.ts | 1 - .../server/lib/spaces_client/spaces_client.ts | 2 + .../spaces_usage_collector.ts | 1 + .../plugins/task_manager/server/task_store.ts | 2 + .../aggregation_list/popover_form.tsx | 1 - .../components/group_by_list/popover_form.tsx | 4 +- .../application/components/health_check.tsx | 3 + .../public/custom_time_range_action.test.ts | 2 - ...nnected_flyout_manage_drilldowns.story.tsx | 6 +- .../flyout_drilldown_wizard.story.tsx | 8 +- .../deprecations/reindex/flyout/container.tsx | 1 + .../reindex/flyout/step_progress.tsx | 1 + .../uptime/server/lib/alerts/status_check.ts | 1 + .../__tests__/get_monitor_status.test.ts | 2 + .../server/lib/requests/__tests__/helper.ts | 1 + .../lib/requests/get_monitor_availability.ts | 1 + .../lib/requests/get_monitor_locations.ts | 1 + .../server/lib/requests/get_monitor_status.ts | 2 +- .../helpers/app_context.mock.tsx | 1 - .../helpers/setup_environment.ts | 1 - .../helpers/watch_create_json.helpers.ts | 2 - .../helpers/watch_create_threshold.helpers.ts | 2 - .../helpers/watch_edit.helpers.ts | 2 - .../helpers/watch_list.helpers.ts | 1 - .../helpers/watch_status.helpers.ts | 1 - .../public/application/app_context.tsx | 1 + .../alerting_api_integration/common/config.ts | 1 - .../spaces_only/tests/alerting/alerts_base.ts | 1 - .../apis/lens/existing_fields.ts | 1 - .../api_integration/apis/lens/field_stats.ts | 1 - .../api_integration/apis/lens/telemetry.ts | 1 - .../apis/metrics_ui/log_analysis.ts | 1 - .../apis/ml/annotations/create_annotations.ts | 1 - .../apis/ml/annotations/delete_annotations.ts | 1 - .../apis/ml/annotations/get_annotations.ts | 1 - .../apis/ml/annotations/update_annotations.ts | 1 - .../apis/ml/anomaly_detectors/create.ts | 1 - .../apis/ml/calendars/create_calendars.ts | 1 - .../apis/ml/calendars/delete_calendars.ts | 1 - .../apis/ml/calendars/get_calendars.ts | 1 - .../apis/ml/calendars/update_calendars.ts | 1 - .../data_visualizer/get_field_histograms.ts | 1 - .../ml/data_visualizer/get_field_stats.ts | 1 - .../ml/data_visualizer/get_overall_stats.ts | 1 - .../ml/fields_service/field_cardinality.ts | 1 - .../ml/fields_service/time_field_range.ts | 1 - .../apis/ml/filters/create_filters.ts | 1 - .../apis/ml/filters/delete_filters.ts | 1 - .../apis/ml/filters/get_filters.ts | 1 - .../apis/ml/filters/update_filters.ts | 1 - .../job_validation/bucket_span_estimator.ts | 1 - .../calculate_model_memory_limit.ts | 1 - .../apis/ml/job_validation/cardinality.ts | 1 - .../apis/ml/job_validation/validate.ts | 1 - .../ml/jobs/categorization_field_examples.ts | 1 - .../apis/ml/jobs/close_jobs.ts | 1 - .../apis/ml/jobs/delete_jobs.ts | 1 - .../apis/ml/jobs/jobs_summary.ts | 1 - .../apis/ml/modules/get_module.ts | 1 - .../apis/ml/modules/recognize_module.ts | 1 - .../apis/ml/modules/setup_module.ts | 1 - .../ml/results/get_anomalies_table_data.ts | 1 - .../apis/transform/delete_transforms.ts | 1 - .../case_api_integration/common/lib/mock.ts | 1 + .../case_api_integration/common/lib/utils.ts | 2 + .../common/config.ts | 1 - .../detection_engine_api_integration/utils.ts | 5 + x-pack/test/functional/apps/lens/index.ts | 1 - .../functional/apps/lens/lens_reporting.ts | 1 - .../apps/lens/persistent_context.ts | 1 - .../test/functional/apps/lens/smokescreen.ts | 1 - .../apps/ml/anomaly_detection/advanced_job.ts | 1 - .../ml/anomaly_detection/anomaly_explorer.ts | 1 - .../anomaly_detection/categorization_job.ts | 1 - .../ml/anomaly_detection/date_nanos_job.ts | 1 - .../ml/anomaly_detection/multi_metric_job.ts | 1 - .../ml/anomaly_detection/population_job.ts | 1 - .../ml/anomaly_detection/saved_search_job.ts | 1 - .../ml/anomaly_detection/single_metric_job.ts | 1 - .../anomaly_detection/single_metric_viewer.ts | 1 - .../data_visualizer/file_data_visualizer.ts | 1 - .../data_visualizer/index_data_visualizer.ts | 1 - x-pack/test/functional_with_es_ssl/config.ts | 1 - .../fixtures/plugins/alerts/public/plugin.ts | 1 + .../apis/agent_config/agent_config.ts | 1 + .../test/licensing_plugin/public/updates.ts | 8 +- x-pack/test/mocha_decorations.d.ts | 1 - .../apis/implicit_flow/index.ts | 1 - .../apis/implicit_flow/oidc_auth.ts | 1 - .../implicit_flow.config.ts | 1 - .../licensed_feature_usage/feature_usage.ts | 1 - x-pack/test/plugin_functional/config.ts | 1 - .../global_search/global_search_api.ts | 2 +- .../global_search/global_search_providers.ts | 2 +- .../test/security_solution_cypress/runner.ts | 1 + .../security_and_spaces/apis/get_all.ts | 2 + x-pack/test/ui_capabilities/common/config.ts | 1 - .../common/nav_links_builder.ts | 4 +- x-pack/typings/rison_node.d.ts | 4 +- yarn.lock | 69 +++++++++----- 583 files changed, 669 insertions(+), 779 deletions(-) diff --git a/docs/development/plugins/kibana_utils/public/state_sync/kibana-plugin-plugins-kibana_utils-public-state_sync.isyncstateref.md b/docs/development/plugins/kibana_utils/public/state_sync/kibana-plugin-plugins-kibana_utils-public-state_sync.isyncstateref.md index 137db68cd6b487..b4bc93fd78a9d3 100644 --- a/docs/development/plugins/kibana_utils/public/state_sync/kibana-plugin-plugins-kibana_utils-public-state_sync.isyncstateref.md +++ b/docs/development/plugins/kibana_utils/public/state_sync/kibana-plugin-plugins-kibana_utils-public-state_sync.isyncstateref.md @@ -8,7 +8,7 @@ Signature: ```typescript -export interface ISyncStateRef +export interface ISyncStateRef ``` ## Properties diff --git a/examples/alerting_example/public/components/create_alert.tsx b/examples/alerting_example/public/components/create_alert.tsx index a8e1f06cb39143..72e3835b100fec 100644 --- a/examples/alerting_example/public/components/create_alert.tsx +++ b/examples/alerting_example/public/components/create_alert.tsx @@ -30,6 +30,7 @@ import { ALERTING_EXAMPLE_APP_ID } from '../../common/constants'; export const CreateAlert = ({ http, + // eslint-disable-next-line @typescript-eslint/naming-convention triggers_actions_ui, charts, uiSettings, diff --git a/examples/alerting_example/public/plugin.tsx b/examples/alerting_example/public/plugin.tsx index f0635a1071f641..3f972fa9fe2ee0 100644 --- a/examples/alerting_example/public/plugin.tsx +++ b/examples/alerting_example/public/plugin.tsx @@ -46,6 +46,7 @@ export interface AlertingExamplePublicStartDeps { export class AlertingExamplePlugin implements Plugin { public setup( core: CoreSetup, + // eslint-disable-next-line @typescript-eslint/naming-convention { alerts, triggers_actions_ui, developerExamples }: AlertingExamplePublicSetupDeps ) { core.application.register({ diff --git a/kibana.d.ts b/kibana.d.ts index 21e3e99abaa902..d64752abd8b60c 100644 --- a/kibana.d.ts +++ b/kibana.d.ts @@ -35,7 +35,6 @@ import * as LegacyKibanaServer from './src/legacy/server/kbn_server'; /** * Re-export legacy types under a namespace. */ -// eslint-disable-next-line @typescript-eslint/no-namespace export namespace Legacy { export type KibanaConfig = LegacyKibanaServer.KibanaConfig; export type Request = LegacyKibanaServer.Request; diff --git a/package.json b/package.json index 880534997cff0c..aaa7ae7ee46846 100644 --- a/package.json +++ b/package.json @@ -400,8 +400,8 @@ "@types/vinyl": "^2.0.4", "@types/vinyl-fs": "^2.4.11", "@types/zen-observable": "^0.8.0", - "@typescript-eslint/eslint-plugin": "^2.34.0", - "@typescript-eslint/parser": "^2.34.0", + "@typescript-eslint/eslint-plugin": "^3.7.1", + "@typescript-eslint/parser": "^3.7.1", "angular-mocks": "^1.7.9", "archiver": "^3.1.1", "axe-core": "^3.4.1", @@ -425,6 +425,7 @@ "eslint-plugin-babel": "^5.3.0", "eslint-plugin-ban": "^1.4.0", "eslint-plugin-cypress": "^2.8.1", + "eslint-plugin-eslint-comments": "^3.2.0", "eslint-plugin-import": "^2.19.1", "eslint-plugin-jest": "^23.10.0", "eslint-plugin-jsx-a11y": "^6.2.3", diff --git a/packages/eslint-config-kibana/package.json b/packages/eslint-config-kibana/package.json index e14423d681a4e6..967e53249da750 100644 --- a/packages/eslint-config-kibana/package.json +++ b/packages/eslint-config-kibana/package.json @@ -11,17 +11,18 @@ "author": "Spencer Alger ", "license": "Apache-2.0", "bugs": { - "url": "https://github.com/elastic/eslint-config-kibana/issues" + "url": "https://github.com/elastic/kibana/tree/master/packages/eslint-config-kibana" }, - "homepage": "https://github.com/elastic/eslint-config-kibana#readme", + "homepage": "https://github.com/elastic/kibana/tree/master/packages/eslint-config-kibana", "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^2.34.0", - "@typescript-eslint/parser": "^2.34.0", + "@typescript-eslint/eslint-plugin": "^3.7.1", + "@typescript-eslint/parser": "^3.7.1", "babel-eslint": "^10.0.3", "eslint": "^6.8.0", "eslint-plugin-babel": "^5.3.0", "eslint-plugin-ban": "^1.4.0", "eslint-plugin-jsx-a11y": "^6.2.3", + "eslint-plugin-eslint-comments": "^3.2.0", "eslint-plugin-import": "^2.19.1", "eslint-plugin-jest": "^23.10.0", "eslint-plugin-mocha": "^6.2.2", diff --git a/packages/eslint-config-kibana/typescript.js b/packages/eslint-config-kibana/typescript.js index a55ca9391011d3..18b11eb62beef6 100644 --- a/packages/eslint-config-kibana/typescript.js +++ b/packages/eslint-config-kibana/typescript.js @@ -8,6 +8,11 @@ const PKG = require('../../package.json'); const eslintConfigPrettierTypescriptEslintRules = require('eslint-config-prettier/@typescript-eslint').rules; +// The current implementation excluded all the variables matching the regexp. +// We should remove it as soon as multiple underscores are supported by the linter. +// https://github.com/typescript-eslint/typescript-eslint/issues/1712 +// Due to the same reason we have to duplicate the "filter" option for "default" and other "selectors". +const allowedNameRegexp = '^(UNSAFE_|_{1,3})|_{1,3}$'; module.exports = { overrides: [ { @@ -19,6 +24,7 @@ module.exports = { 'ban', 'import', 'prefer-object-spread', + 'eslint-comments' ], settings: { @@ -87,16 +93,82 @@ module.exports = { 'React.StatelessComponent': { message: 'Use FunctionComponent instead.', fixWith: 'React.FunctionComponent' - } + }, + // used in the codebase in the wild + '{}': false, + 'object': false, + 'Function': false, } }], 'camelcase': 'off', - '@typescript-eslint/camelcase': ['error', { - 'properties': 'never', - 'ignoreDestructuring': true, - 'allow': ['^[A-Z0-9_]+$', '^UNSAFE_'] - }], - '@typescript-eslint/class-name-casing': 'error', + '@typescript-eslint/naming-convention': [ + 'error', + { + selector: 'default', + format: ['camelCase'], + filter: { + regex: allowedNameRegexp, + match: false + } + }, + { + selector: 'variable', + format: [ + 'camelCase', + 'UPPER_CASE', // const SOMETHING = ... + 'PascalCase', // React.FunctionComponent = + ], + filter: { + regex: allowedNameRegexp, + match: false + } + }, + { + selector: 'parameter', + format: [ + 'camelCase', + 'PascalCase', + ], + filter: { + regex: allowedNameRegexp, + match: false + } + }, + { + selector: 'memberLike', + format: [ + 'camelCase', + 'PascalCase', + 'snake_case', // keys in elasticsearch requests / responses + 'UPPER_CASE' + ], + filter: { + regex: allowedNameRegexp, + match: false + } + }, + { + selector: 'function', + format: [ + 'camelCase', + 'PascalCase' // React.FunctionComponent = + ], + filter: { + regex: allowedNameRegexp, + match: false + } + }, + { + selector: 'typeLike', + format: ['PascalCase', 'UPPER_CASE'], + leadingUnderscore: 'allow', + trailingUnderscore: 'allow', + }, + { + selector: 'enum', + format: ['PascalCase', 'UPPER_CASE', 'camelCase'], + }, + ], '@typescript-eslint/explicit-member-accessibility': ['error', { accessibility: 'off', @@ -145,10 +217,12 @@ module.exports = { 'no-extend-native': 'error', 'no-eval': 'error', 'no-new-wrappers': 'error', + 'no-script-url': 'error', 'no-shadow': 'error', 'no-throw-literal': 'error', 'no-undef-init': 'error', 'no-unsafe-finally': 'error', + 'no-unsanitized/property': 'error', 'no-unused-expressions': 'error', 'no-unused-labels': 'error', 'no-var': 'error', @@ -171,6 +245,9 @@ module.exports = { ], 'import/no-default-export': 'error', + + 'eslint-comments/no-unused-disable': 'error', + 'eslint-comments/no-unused-enable': 'error' }, eslintConfigPrettierTypescriptEslintRules ) diff --git a/packages/kbn-plugin-helpers/src/lib/utils.ts b/packages/kbn-plugin-helpers/src/lib/utils.ts index 0348f9f8deda98..be7fa65cc29396 100644 --- a/packages/kbn-plugin-helpers/src/lib/utils.ts +++ b/packages/kbn-plugin-helpers/src/lib/utils.ts @@ -26,10 +26,10 @@ export function babelRegister() { try { // add support for moved @babel/register source: https://github.com/elastic/kibana/pull/13973 - require(resolve(plugin.kibanaRoot, 'src/setup_node_env/babel_register')); // eslint-disable-line import/no-dynamic-require + require(resolve(plugin.kibanaRoot, 'src/setup_node_env/babel_register')); } catch (error) { if (error.code === 'MODULE_NOT_FOUND') { - require(resolve(plugin.kibanaRoot, 'src/optimize/babel/register')); // eslint-disable-line import/no-dynamic-require + require(resolve(plugin.kibanaRoot, 'src/optimize/babel/register')); } else { throw error; } diff --git a/src/cli/cluster/cluster_manager.ts b/src/cli/cluster/cluster_manager.ts index f193f33e6f47e8..5ada95bfeef94e 100644 --- a/src/cli/cluster/cluster_manager.ts +++ b/src/cli/cluster/cluster_manager.ts @@ -354,6 +354,6 @@ export class ClusterManager { onWatcherError = (err: any) => { this.log.bad('failed to watch files!\n', err.stack); - process.exit(1); // eslint-disable-line no-process-exit + process.exit(1); }; } diff --git a/src/core/server/config/config_service.test.ts b/src/core/server/config/config_service.test.ts index 236cf6579d7c80..95153447bd4a90 100644 --- a/src/core/server/config/config_service.test.ts +++ b/src/core/server/config/config_service.test.ts @@ -17,8 +17,6 @@ * under the License. */ -/* eslint-disable max-classes-per-file */ - import { BehaviorSubject, Observable } from 'rxjs'; import { first, take } from 'rxjs/operators'; diff --git a/src/core/server/http/integration_tests/lifecycle_handlers.test.ts b/src/core/server/http/integration_tests/lifecycle_handlers.test.ts index 2120fb5b881de9..e23426e6304550 100644 --- a/src/core/server/http/integration_tests/lifecycle_handlers.test.ts +++ b/src/core/server/http/integration_tests/lifecycle_handlers.test.ts @@ -17,10 +17,10 @@ * under the License. */ -import { resolve } from 'path'; import supertest from 'supertest'; import { BehaviorSubject } from 'rxjs'; import { ByteSizeValue } from '@kbn/config-schema'; +import pkg from '../../../../../package.json'; import { createHttpServer } from '../test_utils'; import { HttpService } from '../http_service'; @@ -30,8 +30,7 @@ import { IRouter, RouteRegistrar } from '../router'; import { configServiceMock } from '../../config/config_service.mock'; import { contextServiceMock } from '../../context/context_service.mock'; -const pkgPath = resolve(__dirname, '../../../../../package.json'); -const actualVersion = require(pkgPath).version; +const actualVersion = pkg.version; const versionHeader = 'kbn-version'; const xsrfHeader = 'kbn-xsrf'; const nameHeader = 'kbn-name'; diff --git a/src/core/server/legacy/legacy_service.ts b/src/core/server/legacy/legacy_service.ts index fada40e773f12b..976d92e6fe7fb1 100644 --- a/src/core/server/legacy/legacy_service.ts +++ b/src/core/server/legacy/legacy_service.ts @@ -375,6 +375,7 @@ export class LegacyService implements CoreService { // from being started multiple times in different processes. // We only want one REPL. if (this.coreContext.env.cliArgs.repl && process.env.kbnWorkerType === 'server') { + // eslint-disable-next-line @typescript-eslint/no-var-requires require('../../../cli/repl').startRepl(kbnServer); } diff --git a/src/core/server/saved_objects/migrations/core/call_cluster.ts b/src/core/server/saved_objects/migrations/core/call_cluster.ts index 628f2785e6c649..ad2e0e9660a63b 100644 --- a/src/core/server/saved_objects/migrations/core/call_cluster.ts +++ b/src/core/server/saved_objects/migrations/core/call_cluster.ts @@ -25,7 +25,6 @@ import { IndexMapping } from '../../mappings'; -/* eslint-disable @typescript-eslint/unified-signatures */ export interface CallCluster { (path: 'bulk', opts: { body: object[] }): Promise; (path: 'count', opts: CountOpts): Promise<{ count: number; _shards: ShardsInfo }>; @@ -49,7 +48,6 @@ export interface CallCluster { error?: ErrorResponse; }>; } -/* eslint-enable @typescript-eslint/unified-signatures */ /////////////////////////////////////////////////////////////////// // callCluster argument type definitions diff --git a/src/core/server/saved_objects/routes/integration_tests/bulk_create.test.ts b/src/core/server/saved_objects/routes/integration_tests/bulk_create.test.ts index 28afdefe1413fa..3d455ff9d594c9 100644 --- a/src/core/server/saved_objects/routes/integration_tests/bulk_create.test.ts +++ b/src/core/server/saved_objects/routes/integration_tests/bulk_create.test.ts @@ -23,12 +23,12 @@ import { registerBulkCreateRoute } from '../bulk_create'; import { savedObjectsClientMock } from '../../../../../core/server/mocks'; import { setupServer } from '../test_utils'; -type setupServerReturn = UnwrapPromise>; +type SetupServerReturn = UnwrapPromise>; describe('POST /api/saved_objects/_bulk_create', () => { - let server: setupServerReturn['server']; - let httpSetup: setupServerReturn['httpSetup']; - let handlerContext: setupServerReturn['handlerContext']; + let server: SetupServerReturn['server']; + let httpSetup: SetupServerReturn['httpSetup']; + let handlerContext: SetupServerReturn['handlerContext']; let savedObjectsClient: ReturnType; beforeEach(async () => { diff --git a/src/core/server/saved_objects/routes/integration_tests/bulk_get.test.ts b/src/core/server/saved_objects/routes/integration_tests/bulk_get.test.ts index 521e62e16b1d81..5deea94299d7d9 100644 --- a/src/core/server/saved_objects/routes/integration_tests/bulk_get.test.ts +++ b/src/core/server/saved_objects/routes/integration_tests/bulk_get.test.ts @@ -23,12 +23,12 @@ import { registerBulkGetRoute } from '../bulk_get'; import { savedObjectsClientMock } from '../../../../../core/server/mocks'; import { setupServer } from '../test_utils'; -type setupServerReturn = UnwrapPromise>; +type SetupServerReturn = UnwrapPromise>; describe('POST /api/saved_objects/_bulk_get', () => { - let server: setupServerReturn['server']; - let httpSetup: setupServerReturn['httpSetup']; - let handlerContext: setupServerReturn['handlerContext']; + let server: SetupServerReturn['server']; + let httpSetup: SetupServerReturn['httpSetup']; + let handlerContext: SetupServerReturn['handlerContext']; let savedObjectsClient: ReturnType; beforeEach(async () => { diff --git a/src/core/server/saved_objects/routes/integration_tests/bulk_update.test.ts b/src/core/server/saved_objects/routes/integration_tests/bulk_update.test.ts index 9c888406b0c96a..45f310ecc3fa2e 100644 --- a/src/core/server/saved_objects/routes/integration_tests/bulk_update.test.ts +++ b/src/core/server/saved_objects/routes/integration_tests/bulk_update.test.ts @@ -23,12 +23,12 @@ import { registerBulkUpdateRoute } from '../bulk_update'; import { savedObjectsClientMock } from '../../../../../core/server/mocks'; import { setupServer } from '../test_utils'; -type setupServerReturn = UnwrapPromise>; +type SetupServerReturn = UnwrapPromise>; describe('PUT /api/saved_objects/_bulk_update', () => { - let server: setupServerReturn['server']; - let httpSetup: setupServerReturn['httpSetup']; - let handlerContext: setupServerReturn['handlerContext']; + let server: SetupServerReturn['server']; + let httpSetup: SetupServerReturn['httpSetup']; + let handlerContext: SetupServerReturn['handlerContext']; let savedObjectsClient: ReturnType; beforeEach(async () => { diff --git a/src/core/server/saved_objects/routes/integration_tests/create.test.ts b/src/core/server/saved_objects/routes/integration_tests/create.test.ts index ba3d620f8fdb5b..9e69c3dbc64ec1 100644 --- a/src/core/server/saved_objects/routes/integration_tests/create.test.ts +++ b/src/core/server/saved_objects/routes/integration_tests/create.test.ts @@ -23,12 +23,12 @@ import { registerCreateRoute } from '../create'; import { savedObjectsClientMock } from '../../service/saved_objects_client.mock'; import { setupServer } from '../test_utils'; -type setupServerReturn = UnwrapPromise>; +type SetupServerReturn = UnwrapPromise>; describe('POST /api/saved_objects/{type}', () => { - let server: setupServerReturn['server']; - let httpSetup: setupServerReturn['httpSetup']; - let handlerContext: setupServerReturn['handlerContext']; + let server: SetupServerReturn['server']; + let httpSetup: SetupServerReturn['httpSetup']; + let handlerContext: SetupServerReturn['handlerContext']; let savedObjectsClient: ReturnType; const clientResponse = { diff --git a/src/core/server/saved_objects/routes/integration_tests/delete.test.ts b/src/core/server/saved_objects/routes/integration_tests/delete.test.ts index 652d267f08fe74..a58f400ec3e1de 100644 --- a/src/core/server/saved_objects/routes/integration_tests/delete.test.ts +++ b/src/core/server/saved_objects/routes/integration_tests/delete.test.ts @@ -23,12 +23,12 @@ import { registerDeleteRoute } from '../delete'; import { savedObjectsClientMock } from '../../../../../core/server/mocks'; import { setupServer } from '../test_utils'; -type setupServerReturn = UnwrapPromise>; +type SetupServerReturn = UnwrapPromise>; describe('DELETE /api/saved_objects/{type}/{id}', () => { - let server: setupServerReturn['server']; - let httpSetup: setupServerReturn['httpSetup']; - let handlerContext: setupServerReturn['handlerContext']; + let server: SetupServerReturn['server']; + let httpSetup: SetupServerReturn['httpSetup']; + let handlerContext: SetupServerReturn['handlerContext']; let savedObjectsClient: ReturnType; beforeEach(async () => { diff --git a/src/core/server/saved_objects/routes/integration_tests/export.test.ts b/src/core/server/saved_objects/routes/integration_tests/export.test.ts index 7b342dde2febe7..d47f7c6050d8f7 100644 --- a/src/core/server/saved_objects/routes/integration_tests/export.test.ts +++ b/src/core/server/saved_objects/routes/integration_tests/export.test.ts @@ -29,7 +29,7 @@ import { SavedObjectConfig } from '../../saved_objects_config'; import { registerExportRoute } from '../export'; import { setupServer, createExportableType } from '../test_utils'; -type setupServerReturn = UnwrapPromise>; +type SetupServerReturn = UnwrapPromise>; const exportSavedObjectsToStream = exportMock.exportSavedObjectsToStream as jest.Mock; const allowedTypes = ['index-pattern', 'search']; const config = { @@ -38,9 +38,9 @@ const config = { } as SavedObjectConfig; describe('POST /api/saved_objects/_export', () => { - let server: setupServerReturn['server']; - let httpSetup: setupServerReturn['httpSetup']; - let handlerContext: setupServerReturn['handlerContext']; + let server: SetupServerReturn['server']; + let httpSetup: SetupServerReturn['httpSetup']; + let handlerContext: SetupServerReturn['handlerContext']; beforeEach(async () => { ({ server, httpSetup, handlerContext } = await setupServer()); diff --git a/src/core/server/saved_objects/routes/integration_tests/find.test.ts b/src/core/server/saved_objects/routes/integration_tests/find.test.ts index d5a7710f04b395..4fe9cbe415cd63 100644 --- a/src/core/server/saved_objects/routes/integration_tests/find.test.ts +++ b/src/core/server/saved_objects/routes/integration_tests/find.test.ts @@ -25,12 +25,12 @@ import { registerFindRoute } from '../find'; import { savedObjectsClientMock } from '../../../../../core/server/mocks'; import { setupServer } from '../test_utils'; -type setupServerReturn = UnwrapPromise>; +type SetupServerReturn = UnwrapPromise>; describe('GET /api/saved_objects/_find', () => { - let server: setupServerReturn['server']; - let httpSetup: setupServerReturn['httpSetup']; - let handlerContext: setupServerReturn['handlerContext']; + let server: SetupServerReturn['server']; + let httpSetup: SetupServerReturn['httpSetup']; + let handlerContext: SetupServerReturn['handlerContext']; let savedObjectsClient: ReturnType; const clientResponse = { diff --git a/src/core/server/saved_objects/routes/integration_tests/import.test.ts b/src/core/server/saved_objects/routes/integration_tests/import.test.ts index c4e304a3f892f8..61f32a420d92bc 100644 --- a/src/core/server/saved_objects/routes/integration_tests/import.test.ts +++ b/src/core/server/saved_objects/routes/integration_tests/import.test.ts @@ -24,7 +24,7 @@ import { savedObjectsClientMock } from '../../../../../core/server/mocks'; import { SavedObjectConfig } from '../../saved_objects_config'; import { setupServer, createExportableType } from '../test_utils'; -type setupServerReturn = UnwrapPromise>; +type SetupServerReturn = UnwrapPromise>; const allowedTypes = ['index-pattern', 'visualization', 'dashboard']; const config = { @@ -33,9 +33,9 @@ const config = { } as SavedObjectConfig; describe('POST /internal/saved_objects/_import', () => { - let server: setupServerReturn['server']; - let httpSetup: setupServerReturn['httpSetup']; - let handlerContext: setupServerReturn['handlerContext']; + let server: SetupServerReturn['server']; + let httpSetup: SetupServerReturn['httpSetup']; + let handlerContext: SetupServerReturn['handlerContext']; let savedObjectsClient: ReturnType; const emptyResponse = { diff --git a/src/core/server/saved_objects/routes/integration_tests/log_legacy_import.test.ts b/src/core/server/saved_objects/routes/integration_tests/log_legacy_import.test.ts index 8d021580da36c7..d86ac985d9da12 100644 --- a/src/core/server/saved_objects/routes/integration_tests/log_legacy_import.test.ts +++ b/src/core/server/saved_objects/routes/integration_tests/log_legacy_import.test.ts @@ -23,11 +23,11 @@ import { registerLogLegacyImportRoute } from '../log_legacy_import'; import { loggingSystemMock } from '../../../logging/logging_system.mock'; import { setupServer } from '../test_utils'; -type setupServerReturn = UnwrapPromise>; +type SetupServerReturn = UnwrapPromise>; describe('POST /api/saved_objects/_log_legacy_import', () => { - let server: setupServerReturn['server']; - let httpSetup: setupServerReturn['httpSetup']; + let server: SetupServerReturn['server']; + let httpSetup: SetupServerReturn['httpSetup']; let logger: ReturnType; beforeEach(async () => { diff --git a/src/core/server/saved_objects/routes/integration_tests/resolve_import_errors.test.ts b/src/core/server/saved_objects/routes/integration_tests/resolve_import_errors.test.ts index 27750ec692e5ad..6a6976b513ca17 100644 --- a/src/core/server/saved_objects/routes/integration_tests/resolve_import_errors.test.ts +++ b/src/core/server/saved_objects/routes/integration_tests/resolve_import_errors.test.ts @@ -24,7 +24,7 @@ import { savedObjectsClientMock } from '../../../../../core/server/mocks'; import { setupServer, createExportableType } from '../test_utils'; import { SavedObjectConfig } from '../../saved_objects_config'; -type setupServerReturn = UnwrapPromise>; +type SetupServerReturn = UnwrapPromise>; const allowedTypes = ['index-pattern', 'visualization', 'dashboard']; const config = { @@ -33,9 +33,9 @@ const config = { } as SavedObjectConfig; describe('POST /api/saved_objects/_resolve_import_errors', () => { - let server: setupServerReturn['server']; - let httpSetup: setupServerReturn['httpSetup']; - let handlerContext: setupServerReturn['handlerContext']; + let server: SetupServerReturn['server']; + let httpSetup: SetupServerReturn['httpSetup']; + let handlerContext: SetupServerReturn['handlerContext']; let savedObjectsClient: ReturnType; beforeEach(async () => { diff --git a/src/core/server/saved_objects/routes/integration_tests/update.test.ts b/src/core/server/saved_objects/routes/integration_tests/update.test.ts index eb6eb1cdb6bd95..dfccb651d72d7a 100644 --- a/src/core/server/saved_objects/routes/integration_tests/update.test.ts +++ b/src/core/server/saved_objects/routes/integration_tests/update.test.ts @@ -23,12 +23,12 @@ import { registerUpdateRoute } from '../update'; import { savedObjectsClientMock } from '../../../../../core/server/mocks'; import { setupServer } from '../test_utils'; -type setupServerReturn = UnwrapPromise>; +type SetupServerReturn = UnwrapPromise>; describe('PUT /api/saved_objects/{type}/{id?}', () => { - let server: setupServerReturn['server']; - let httpSetup: setupServerReturn['httpSetup']; - let handlerContext: setupServerReturn['handlerContext']; + let server: SetupServerReturn['server']; + let httpSetup: SetupServerReturn['httpSetup']; + let handlerContext: SetupServerReturn['handlerContext']; let savedObjectsClient: ReturnType; beforeEach(async () => { diff --git a/src/core/server/saved_objects/serialization/serializer.ts b/src/core/server/saved_objects/serialization/serializer.ts index 3b19d494d8ecf2..c0c09b6375bdf0 100644 --- a/src/core/server/saved_objects/serialization/serializer.ts +++ b/src/core/server/saved_objects/serialization/serializer.ts @@ -17,8 +17,6 @@ * under the License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import uuid from 'uuid'; import { decodeVersion, encodeVersion } from '../version'; import { ISavedObjectTypeRegistry } from '../saved_objects_type_registry'; @@ -97,6 +95,7 @@ export class SavedObjectsSerializer { namespaces, attributes, migrationVersion, + // eslint-disable-next-line @typescript-eslint/naming-convention updated_at, version, references, diff --git a/src/core/server/saved_objects/service/lib/repository.ts b/src/core/server/saved_objects/service/lib/repository.ts index 8b7b1d62c1b7de..d7e1ecba0370be 100644 --- a/src/core/server/saved_objects/service/lib/repository.ts +++ b/src/core/server/saved_objects/service/lib/repository.ts @@ -1242,6 +1242,7 @@ export class SavedObjectsRepository { response )[0] as any; + // eslint-disable-next-line @typescript-eslint/naming-convention const { [type]: attributes, references, updated_at } = documentToSave; if (error) { return { diff --git a/src/core/server/status/status_service.ts b/src/core/server/status/status_service.ts index 569b044a4fb270..aea335e64babf8 100644 --- a/src/core/server/status/status_service.ts +++ b/src/core/server/status/status_service.ts @@ -17,8 +17,6 @@ * under the License. */ -/* eslint-disable max-classes-per-file */ - import { Observable, combineLatest } from 'rxjs'; import { map, distinctUntilChanged, shareReplay, take } from 'rxjs/operators'; import { isDeepStrictEqual } from 'util'; diff --git a/src/core/server/utils/package_json.ts b/src/core/server/utils/package_json.ts index ab1700e681a929..fcffa6593d5991 100644 --- a/src/core/server/utils/package_json.ts +++ b/src/core/server/utils/package_json.ts @@ -22,6 +22,5 @@ import { dirname } from 'path'; export const pkg = { __filename: require.resolve('../../../../package.json'), __dirname: dirname(require.resolve('../../../../package.json')), - // eslint-disable no-var-requires ...require('../../../../package.json'), }; diff --git a/src/legacy/core_plugins/elasticsearch/index.d.ts b/src/legacy/core_plugins/elasticsearch/index.d.ts index df713160137a6a..683f58b1a80ce9 100644 --- a/src/legacy/core_plugins/elasticsearch/index.d.ts +++ b/src/legacy/core_plugins/elasticsearch/index.d.ts @@ -17,7 +17,6 @@ * under the License. */ -/* eslint-disable */ import { Client as ESClient, GenericParams, @@ -145,7 +144,6 @@ import { TasksGetParams, TasksListParams, } from 'elasticsearch'; -/* eslint-enable */ export class Cluster { public callWithRequest: CallClusterWithRequest; diff --git a/src/legacy/ui/public/new_platform/__mocks__/helpers.ts b/src/legacy/ui/public/new_platform/__mocks__/helpers.ts index e3aa49baeae0d8..35aa8e48304289 100644 --- a/src/legacy/ui/public/new_platform/__mocks__/helpers.ts +++ b/src/legacy/ui/public/new_platform/__mocks__/helpers.ts @@ -17,7 +17,6 @@ * under the License. */ -/* eslint-disable @kbn/eslint/no-restricted-paths */ import { coreMock } from '../../../../../core/public/mocks'; import { dataPluginMock } from '../../../../../plugins/data/public/mocks'; import { embeddablePluginMock } from '../../../../../plugins/embeddable/public/mocks'; @@ -33,7 +32,6 @@ import { advancedSettingsMock } from '../../../../../plugins/advanced_settings/p import { savedObjectsManagementPluginMock } from '../../../../../plugins/saved_objects_management/public/mocks'; import { visualizationsPluginMock } from '../../../../../plugins/visualizations/public/mocks'; import { discoverPluginMock } from '../../../../../plugins/discover/public/mocks'; -/* eslint-enable @kbn/eslint/no-restricted-paths */ export const pluginsMock = { createSetup: () => ({ diff --git a/src/legacy/ui/public/new_platform/new_platform.ts b/src/legacy/ui/public/new_platform/new_platform.ts index ddf768495a9dad..37787ffbde4fc4 100644 --- a/src/legacy/ui/public/new_platform/new_platform.ts +++ b/src/legacy/ui/public/new_platform/new_platform.ts @@ -174,6 +174,7 @@ export const legacyAppRegister = (app: App) => { } legacyAppRegistered = true; + // eslint-disable-next-line @typescript-eslint/no-var-requires require('ui/chrome').setRootController(app.id, ($scope: IScope, $element: JQLite) => { const element = document.createElement('div'); $element[0].appendChild(element); diff --git a/src/legacy/ui/public/new_platform/set_services.test.ts b/src/legacy/ui/public/new_platform/set_services.test.ts index b7878954846fa4..74e789ec220b1b 100644 --- a/src/legacy/ui/public/new_platform/set_services.test.ts +++ b/src/legacy/ui/public/new_platform/set_services.test.ts @@ -18,9 +18,7 @@ */ import { __reset__, __setup__, __start__, PluginsSetup, PluginsStart } from './new_platform'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths import * as dataServices from '../../../../plugins/data/public/services'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths import * as visualizationsServices from '../../../../plugins/visualizations/public/services'; import { LegacyCoreSetup, LegacyCoreStart } from '../../../../core/public'; import { coreMock } from '../../../../core/public/mocks'; diff --git a/src/plugins/advanced_settings/public/management_app/components/field/field.tsx b/src/plugins/advanced_settings/public/management_app/components/field/field.tsx index 32bfc0826e7c44..45e359679056fd 100644 --- a/src/plugins/advanced_settings/public/management_app/components/field/field.tsx +++ b/src/plugins/advanced_settings/public/management_app/components/field/field.tsx @@ -664,7 +664,9 @@ export class Field extends PureComponent { const isInvalid = unsavedChanges?.isInvalid; const className = classNames('mgtAdvancedSettings__field', { + // eslint-disable-next-line @typescript-eslint/naming-convention 'mgtAdvancedSettings__field--unsaved': unsavedChanges, + // eslint-disable-next-line @typescript-eslint/naming-convention 'mgtAdvancedSettings__field--invalid': isInvalid, }); const id = setting.name; diff --git a/src/plugins/advanced_settings/public/management_app/components/form/form.tsx b/src/plugins/advanced_settings/public/management_app/components/form/form.tsx index 142ea06c7dce48..5533f684870d90 100644 --- a/src/plugins/advanced_settings/public/management_app/components/form/form.tsx +++ b/src/plugins/advanced_settings/public/management_app/components/form/form.tsx @@ -336,6 +336,7 @@ export class Form extends PureComponent { if (pageNav?.value === 'legacy') { bottomBarClasses = classNames('mgtAdvancedSettingsForm__bottomBar', { + // eslint-disable-next-line @typescript-eslint/naming-convention 'mgtAdvancedSettingsForm__bottomBar--pushForNav': localStorage.getItem(NAV_IS_LOCKED_KEY) === 'true', }); diff --git a/src/plugins/console/public/application/containers/console_history/console_history.tsx b/src/plugins/console/public/application/containers/console_history/console_history.tsx index 433ad15990d77a..e44d215775c69c 100644 --- a/src/plugins/console/public/application/containers/console_history/console_history.tsx +++ b/src/plugins/console/public/application/containers/console_history/console_history.tsx @@ -160,7 +160,6 @@ export function ConsoleHistory({ close }: Props) { const isSelected = viewingReq === req; return ( // Ignore a11y issues on li's - // eslint-disable-next-line
  • { const aliasRules = { filter: {}, diff --git a/src/plugins/console/server/lib/spec_definitions/js/document.ts b/src/plugins/console/server/lib/spec_definitions/js/document.ts index f8214faab26819..f235860232cdc6 100644 --- a/src/plugins/console/server/lib/spec_definitions/js/document.ts +++ b/src/plugins/console/server/lib/spec_definitions/js/document.ts @@ -18,7 +18,6 @@ */ import { SpecDefinitionsService } from '../../../services'; -/* eslint-disable @typescript-eslint/camelcase */ export const document = (specService: SpecDefinitionsService) => { specService.addEndpointDescription('update', { data_autocomplete_rules: { diff --git a/src/plugins/console/server/lib/spec_definitions/js/filter.ts b/src/plugins/console/server/lib/spec_definitions/js/filter.ts index b5e99e610b8ba8..f43f62c9cf2ed7 100644 --- a/src/plugins/console/server/lib/spec_definitions/js/filter.ts +++ b/src/plugins/console/server/lib/spec_definitions/js/filter.ts @@ -18,7 +18,6 @@ */ import { SpecDefinitionsService } from '../../../services'; -/* eslint-disable @typescript-eslint/camelcase */ const filters: Record = {}; filters.and = { diff --git a/src/plugins/console/server/lib/spec_definitions/js/globals.ts b/src/plugins/console/server/lib/spec_definitions/js/globals.ts index 9fef5c6dbf1e37..bf628e6b659a31 100644 --- a/src/plugins/console/server/lib/spec_definitions/js/globals.ts +++ b/src/plugins/console/server/lib/spec_definitions/js/globals.ts @@ -18,7 +18,6 @@ */ import { SpecDefinitionsService } from '../../../services'; -/* eslint-disable @typescript-eslint/camelcase */ const highlightOptions = { boundary_chars: {}, boundary_max_scan: 20, diff --git a/src/plugins/console/server/lib/spec_definitions/js/ingest.ts b/src/plugins/console/server/lib/spec_definitions/js/ingest.ts index 20dbeda5e0b3df..3450055804cf23 100644 --- a/src/plugins/console/server/lib/spec_definitions/js/ingest.ts +++ b/src/plugins/console/server/lib/spec_definitions/js/ingest.ts @@ -19,7 +19,6 @@ import { SpecDefinitionsService } from '../../../services'; -/* eslint-disable @typescript-eslint/camelcase */ const commonPipelineParams = { on_failure: [], ignore_failure: { diff --git a/src/plugins/console/server/lib/spec_definitions/js/mappings.ts b/src/plugins/console/server/lib/spec_definitions/js/mappings.ts index fbc9a822e509c2..d09637b05a3cb5 100644 --- a/src/plugins/console/server/lib/spec_definitions/js/mappings.ts +++ b/src/plugins/console/server/lib/spec_definitions/js/mappings.ts @@ -23,7 +23,6 @@ import { SpecDefinitionsService } from '../../../services'; import { BOOLEAN } from './shared'; -/* eslint-disable @typescript-eslint/camelcase */ export const mappings = (specService: SpecDefinitionsService) => { specService.addEndpointDescription('put_mapping', { priority: 10, // collides with put doc by id diff --git a/src/plugins/console/server/lib/spec_definitions/js/query/dsl.ts b/src/plugins/console/server/lib/spec_definitions/js/query/dsl.ts index d6e5030fb6928f..b94809d38e1a8f 100644 --- a/src/plugins/console/server/lib/spec_definitions/js/query/dsl.ts +++ b/src/plugins/console/server/lib/spec_definitions/js/query/dsl.ts @@ -36,7 +36,6 @@ import { regexpTemplate, } from './templates'; -/* eslint-disable @typescript-eslint/camelcase */ const matchOptions = { cutoff_frequency: 0.001, query: '', diff --git a/src/plugins/console/server/lib/spec_definitions/js/query/templates.ts b/src/plugins/console/server/lib/spec_definitions/js/query/templates.ts index 60192f81fec803..b1e636828c1442 100644 --- a/src/plugins/console/server/lib/spec_definitions/js/query/templates.ts +++ b/src/plugins/console/server/lib/spec_definitions/js/query/templates.ts @@ -17,7 +17,6 @@ * under the License. */ -/* eslint-disable @typescript-eslint/camelcase */ export const regexpTemplate = { FIELD: 'REGEXP', }; diff --git a/src/plugins/console/server/lib/spec_definitions/js/reindex.ts b/src/plugins/console/server/lib/spec_definitions/js/reindex.ts index 862a4323f7bf3a..e5b29041720965 100644 --- a/src/plugins/console/server/lib/spec_definitions/js/reindex.ts +++ b/src/plugins/console/server/lib/spec_definitions/js/reindex.ts @@ -19,7 +19,6 @@ import { SpecDefinitionsService } from '../../../services'; -/* eslint-disable @typescript-eslint/camelcase */ export const reindex = (specService: SpecDefinitionsService) => { specService.addEndpointDescription('reindex', { methods: ['POST'], diff --git a/src/plugins/console/server/lib/spec_definitions/js/search.ts b/src/plugins/console/server/lib/spec_definitions/js/search.ts index e319870d7be5cd..f0e2813117574c 100644 --- a/src/plugins/console/server/lib/spec_definitions/js/search.ts +++ b/src/plugins/console/server/lib/spec_definitions/js/search.ts @@ -18,7 +18,6 @@ */ import { SpecDefinitionsService } from '../../../services'; -/* eslint-disable @typescript-eslint/camelcase */ export const search = (specService: SpecDefinitionsService) => { specService.addEndpointDescription('search', { priority: 10, // collides with get doc by id diff --git a/src/plugins/console/server/lib/spec_definitions/js/settings.ts b/src/plugins/console/server/lib/spec_definitions/js/settings.ts index 88c58e618533bc..9ffaad2e52b592 100644 --- a/src/plugins/console/server/lib/spec_definitions/js/settings.ts +++ b/src/plugins/console/server/lib/spec_definitions/js/settings.ts @@ -19,7 +19,6 @@ import { SpecDefinitionsService } from '../../../services'; import { BOOLEAN } from './shared'; -/* eslint-disable @typescript-eslint/camelcase */ export const settings = (specService: SpecDefinitionsService) => { specService.addEndpointDescription('put_settings', { data_autocomplete_rules: { diff --git a/src/plugins/console/server/lib/spec_definitions/js/shared.ts b/src/plugins/console/server/lib/spec_definitions/js/shared.ts index a884e1aebe2e70..ace189e2d09138 100644 --- a/src/plugins/console/server/lib/spec_definitions/js/shared.ts +++ b/src/plugins/console/server/lib/spec_definitions/js/shared.ts @@ -17,7 +17,6 @@ * under the License. */ -/* eslint-disable @typescript-eslint/camelcase */ export const BOOLEAN = Object.freeze({ __one_of: [true, false], }); diff --git a/src/plugins/dashboard/public/application/actions/clone_panel_action.test.tsx b/src/plugins/dashboard/public/application/actions/clone_panel_action.test.tsx index e7534fa09aa3f1..b6bee5c3360b4c 100644 --- a/src/plugins/dashboard/public/application/actions/clone_panel_action.test.tsx +++ b/src/plugins/dashboard/public/application/actions/clone_panel_action.test.tsx @@ -29,8 +29,6 @@ import { import { coreMock } from '../../../../../core/public/mocks'; import { CoreStart } from 'kibana/public'; import { ClonePanelAction } from '.'; - -// eslint-disable-next-line import { embeddablePluginMock } from 'src/plugins/embeddable/public/mocks'; const { setup, doStart } = embeddablePluginMock.createInstance(); diff --git a/src/plugins/dashboard/public/application/actions/expand_panel_action.test.tsx b/src/plugins/dashboard/public/application/actions/expand_panel_action.test.tsx index 0f4a92a1a7b7de..ff4e3ee5f06eb7 100644 --- a/src/plugins/dashboard/public/application/actions/expand_panel_action.test.tsx +++ b/src/plugins/dashboard/public/application/actions/expand_panel_action.test.tsx @@ -28,8 +28,6 @@ import { ContactCardEmbeddableInput, ContactCardEmbeddableOutput, } from '../../embeddable_plugin_test_samples'; - -// eslint-disable-next-line import { embeddablePluginMock } from 'src/plugins/embeddable/public/mocks'; const { setup, doStart } = embeddablePluginMock.createInstance(); diff --git a/src/plugins/dashboard/public/application/actions/replace_panel_action.test.tsx b/src/plugins/dashboard/public/application/actions/replace_panel_action.test.tsx index cc06bd41379aa5..38afc226707094 100644 --- a/src/plugins/dashboard/public/application/actions/replace_panel_action.test.tsx +++ b/src/plugins/dashboard/public/application/actions/replace_panel_action.test.tsx @@ -29,8 +29,6 @@ import { } from '../../embeddable_plugin_test_samples'; import { coreMock } from '../../../../../core/public/mocks'; import { CoreStart } from 'kibana/public'; - -// eslint-disable-next-line import { embeddablePluginMock } from 'src/plugins/embeddable/public/mocks'; const { setup, doStart } = embeddablePluginMock.createInstance(); diff --git a/src/plugins/dashboard/public/application/application.ts b/src/plugins/dashboard/public/application/application.ts index 08eeb19dcda930..21f423d009ee76 100644 --- a/src/plugins/dashboard/public/application/application.ts +++ b/src/plugins/dashboard/public/application/application.ts @@ -110,7 +110,7 @@ const thirdPartyAngularDependencies = ['ngSanitize', 'ngRoute', 'react']; function mountDashboardApp(appBasePath: string, element: HTMLElement) { const mountpoint = document.createElement('div'); mountpoint.setAttribute('class', 'dshAppContainer'); - // eslint-disable-next-line + // eslint-disable-next-line no-unsanitized/property mountpoint.innerHTML = mainTemplate(appBasePath); // bootstrap angular into detached element and attach it later to // make angular-within-angular possible diff --git a/src/plugins/dashboard/public/application/embeddable/dashboard_container.test.tsx b/src/plugins/dashboard/public/application/embeddable/dashboard_container.test.tsx index 3cebe2b8471550..a7226082d3dce3 100644 --- a/src/plugins/dashboard/public/application/embeddable/dashboard_container.test.tsx +++ b/src/plugins/dashboard/public/application/embeddable/dashboard_container.test.tsx @@ -17,8 +17,6 @@ * under the License. */ -// @ts-ignore -import { findTestSubject } from '@elastic/eui/lib/test'; import { nextTick } from 'test_utils/enzyme_helpers'; import { isErrorEmbeddable, ViewMode } from '../../embeddable_plugin'; import { DashboardContainer, DashboardContainerOptions } from './dashboard_container'; @@ -30,7 +28,6 @@ import { ContactCardEmbeddable, ContactCardEmbeddableOutput, } from '../../embeddable_plugin_test_samples'; -// eslint-disable-next-line import { embeddablePluginMock } from 'src/plugins/embeddable/public/mocks'; const options: DashboardContainerOptions = { diff --git a/src/plugins/dashboard/public/application/embeddable/grid/dashboard_grid.test.tsx b/src/plugins/dashboard/public/application/embeddable/grid/dashboard_grid.test.tsx index 493ae8eb517977..42d8f92de80aa5 100644 --- a/src/plugins/dashboard/public/application/embeddable/grid/dashboard_grid.test.tsx +++ b/src/plugins/dashboard/public/application/embeddable/grid/dashboard_grid.test.tsx @@ -31,7 +31,6 @@ import { ContactCardEmbeddableFactory, } from '../../../embeddable_plugin_test_samples'; import { KibanaContextProvider } from '../../../../../kibana_react/public'; -// eslint-disable-next-line import { embeddablePluginMock } from 'src/plugins/embeddable/public/mocks'; let dashboardContainer: DashboardContainer | undefined; diff --git a/src/plugins/dashboard/public/application/embeddable/grid/dashboard_grid.tsx b/src/plugins/dashboard/public/application/embeddable/grid/dashboard_grid.tsx index dcd07fe394c7d1..d4d8fd0a4374b9 100644 --- a/src/plugins/dashboard/public/application/embeddable/grid/dashboard_grid.tsx +++ b/src/plugins/dashboard/public/application/embeddable/grid/dashboard_grid.tsx @@ -256,7 +256,9 @@ class DashboardGridUi extends React.Component { expandedPanelId !== undefined && expandedPanelId === panel.explicitInput.id; const hidePanel = expandedPanelId !== undefined && expandedPanelId !== panel.explicitInput.id; const classes = classNames({ + // eslint-disable-next-line @typescript-eslint/naming-convention 'dshDashboardGrid__item--expanded': expandPanel, + // eslint-disable-next-line @typescript-eslint/naming-convention 'dshDashboardGrid__item--hidden': hidePanel, }); return ( diff --git a/src/plugins/dashboard/public/application/embeddable/viewport/dashboard_viewport.test.tsx b/src/plugins/dashboard/public/application/embeddable/viewport/dashboard_viewport.test.tsx index 733ea11c1eb64c..1e07c610b0ef27 100644 --- a/src/plugins/dashboard/public/application/embeddable/viewport/dashboard_viewport.test.tsx +++ b/src/plugins/dashboard/public/application/embeddable/viewport/dashboard_viewport.test.tsx @@ -32,7 +32,6 @@ import { ContactCardEmbeddableFactory, } from '../../../embeddable_plugin_test_samples'; import { KibanaContextProvider } from '../../../../../kibana_react/public'; -// eslint-disable-next-line import { embeddablePluginMock } from 'src/plugins/embeddable/public/mocks'; import { applicationServiceMock } from '../../../../../../core/public/mocks'; diff --git a/src/plugins/dashboard/public/embeddable_plugin_test_samples.ts b/src/plugins/dashboard/public/embeddable_plugin_test_samples.ts index 0e49a94278dfc9..45759bf0789112 100644 --- a/src/plugins/dashboard/public/embeddable_plugin_test_samples.ts +++ b/src/plugins/dashboard/public/embeddable_plugin_test_samples.ts @@ -17,5 +17,4 @@ * under the License. */ -// eslint-disable-next-line export * from '../../../plugins/embeddable/public/lib/test_samples'; diff --git a/src/plugins/dashboard/public/url_generator.test.ts b/src/plugins/dashboard/public/url_generator.test.ts index 0eeb8f26ed88bf..208b229318a9e0 100644 --- a/src/plugins/dashboard/public/url_generator.test.ts +++ b/src/plugins/dashboard/public/url_generator.test.ts @@ -19,7 +19,6 @@ import { createDashboardUrlGenerator } from './url_generator'; import { hashedItemStore } from '../../kibana_utils/public'; -// eslint-disable-next-line import { mockStorage } from '../../kibana_utils/public/storage/hashed_item_store/mock'; import { esFilters, Filter } from '../../data/public'; import { SavedObjectLoader } from '../../saved_objects/public'; diff --git a/src/plugins/data/common/index_patterns/index_patterns/index_patterns.test.ts b/src/plugins/data/common/index_patterns/index_patterns/index_patterns.test.ts index a1842d31479c09..8223b31042124f 100644 --- a/src/plugins/data/common/index_patterns/index_patterns/index_patterns.test.ts +++ b/src/plugins/data/common/index_patterns/index_patterns/index_patterns.test.ts @@ -17,7 +17,6 @@ * under the License. */ -// eslint-disable-next-line max-classes-per-file import { IndexPatternsService } from './index_patterns'; import { fieldFormatsMock } from '../../field_formats/mocks'; import { diff --git a/src/plugins/data/common/search/aggs/date_interval_utils/is_valid_interval.ts b/src/plugins/data/common/search/aggs/date_interval_utils/is_valid_interval.ts index 03d84c5e2c97b7..cb8cb8e63f175d 100644 --- a/src/plugins/data/common/search/aggs/date_interval_utils/is_valid_interval.ts +++ b/src/plugins/data/common/search/aggs/date_interval_utils/is_valid_interval.ts @@ -23,7 +23,7 @@ import { leastCommonInterval } from './least_common_interval'; // When base interval is set, check for least common interval and allow // input the value is the same. This means that the input interval is a // multiple of the base interval. -function _parseWithBase(value: string, baseInterval: string) { +function parseWithBase(value: string, baseInterval: string) { try { const interval = leastCommonInterval(baseInterval, value); return interval === value.replace(/\s/g, ''); @@ -34,7 +34,7 @@ function _parseWithBase(value: string, baseInterval: string) { export function isValidInterval(value: string, baseInterval?: string) { if (baseInterval) { - return _parseWithBase(value, baseInterval); + return parseWithBase(value, baseInterval); } else { return isValidEsInterval(value); } diff --git a/src/plugins/data/public/search/aggs/mocks.ts b/src/plugins/data/public/search/aggs/mocks.ts index 7a5dcc9be45929..2cad6460672927 100644 --- a/src/plugins/data/public/search/aggs/mocks.ts +++ b/src/plugins/data/public/search/aggs/mocks.ts @@ -17,7 +17,6 @@ * under the License. */ -// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { coreMock } from '../../../../../../src/core/public/mocks'; import { AggConfigs, diff --git a/src/plugins/data/public/search/search_source/normalize_sort_request.ts b/src/plugins/data/public/search/search_source/normalize_sort_request.ts index b00d28b38d6701..3ec0a13282d3ee 100644 --- a/src/plugins/data/public/search/search_source/normalize_sort_request.ts +++ b/src/plugins/data/public/search/search_source/normalize_sort_request.ts @@ -61,6 +61,7 @@ function normalize( } // Don't include unmapped_type for _score field + // eslint-disable-next-line @typescript-eslint/naming-convention const { unmapped_type, ...otherSortOptions } = defaultSortOptions; return { [sortField]: { ...order, ...(sortField === '_score' ? otherSortOptions : defaultSortOptions) }, diff --git a/src/plugins/data/public/ui/index_pattern_select/index_pattern_select.tsx b/src/plugins/data/public/ui/index_pattern_select/index_pattern_select.tsx index 20e3fdae5ce5f9..f187dcb804c796 100644 --- a/src/plugins/data/public/ui/index_pattern_select/index_pattern_select.tsx +++ b/src/plugins/data/public/ui/index_pattern_select/index_pattern_select.tsx @@ -189,12 +189,12 @@ export class IndexPatternSelect extends Component { render() { const { - fieldTypes, // eslint-disable-line no-unused-vars - onChange, // eslint-disable-line no-unused-vars - indexPatternId, // eslint-disable-line no-unused-vars + fieldTypes, + onChange, + indexPatternId, placeholder, - onNoIndexPatterns, // eslint-disable-line no-unused-vars - savedObjectsClient, // eslint-disable-line no-unused-vars + onNoIndexPatterns, + savedObjectsClient, ...rest } = this.props; diff --git a/src/plugins/data/public/ui/query_string_input/query_bar_top_row.tsx b/src/plugins/data/public/ui/query_string_input/query_bar_top_row.tsx index 05249d46a1c502..e5d03e2a774f1f 100644 --- a/src/plugins/data/public/ui/query_string_input/query_bar_top_row.tsx +++ b/src/plugins/data/public/ui/query_string_input/query_bar_top_row.tsx @@ -275,6 +275,7 @@ export function QueryBarTopRow(props: Props) { }); const wrapperClasses = classNames('kbnQueryBar__datePickerWrapper', { + // eslint-disable-next-line @typescript-eslint/naming-convention 'kbnQueryBar__datePickerWrapper-isHidden': isQueryInputFocused, }); diff --git a/src/plugins/data/public/ui/search_bar/search_bar.tsx b/src/plugins/data/public/ui/search_bar/search_bar.tsx index 2f740cc476087b..b18b2fa9f04188 100644 --- a/src/plugins/data/public/ui/search_bar/search_bar.tsx +++ b/src/plugins/data/public/ui/search_bar/search_bar.tsx @@ -224,9 +224,7 @@ class SearchBarUI extends Component { }; // member-ordering rules conflict with use-before-declaration rules - /* eslint-disable */ public ro = new ResizeObserver(this.setFilterBarHeight); - /* eslint-enable */ public onSave = async (savedQueryMeta: SavedQueryMeta, saveAsNew = false) => { if (!this.state.query) return; @@ -411,6 +409,7 @@ class SearchBarUI extends Component { let filterBar; if (this.shouldRenderFilterBar()) { const filterGroupClasses = classNames('globalFilterGroup__wrapper', { + // eslint-disable-next-line @typescript-eslint/naming-convention 'globalFilterGroup__wrapper-isVisible': this.state.isFiltersVisible, }); filterBar = ( diff --git a/src/plugins/data/public/ui/typeahead/suggestion_component.tsx b/src/plugins/data/public/ui/typeahead/suggestion_component.tsx index 951e47165819fd..b859428e6ed7ea 100644 --- a/src/plugins/data/public/ui/typeahead/suggestion_component.tsx +++ b/src/plugins/data/public/ui/typeahead/suggestion_component.tsx @@ -53,6 +53,7 @@ export function SuggestionComponent(props: Props) { // eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/interactive-supports-focus
    , field: IFieldType | string, query: string, diff --git a/src/plugins/discover/public/application/components/table/table_row.tsx b/src/plugins/discover/public/application/components/table/table_row.tsx index abb6e149b1bfda..5f7dd9f37dcd3d 100644 --- a/src/plugins/discover/public/application/components/table/table_row.tsx +++ b/src/plugins/discover/public/application/components/table/table_row.tsx @@ -60,6 +60,7 @@ export function DocViewTableRow({ valueRaw, }: Props) { const valueClassName = classNames({ + // eslint-disable-next-line @typescript-eslint/naming-convention kbnDocViewer__value: true, 'truncate-by-height': isCollapsible && isCollapsed, }); diff --git a/src/plugins/discover/public/url_generator.test.ts b/src/plugins/discover/public/url_generator.test.ts index cf9beb246fea29..a18ee486ab0078 100644 --- a/src/plugins/discover/public/url_generator.test.ts +++ b/src/plugins/discover/public/url_generator.test.ts @@ -19,7 +19,6 @@ import { DiscoverUrlGenerator } from './url_generator'; import { hashedItemStore, getStatesFromKbnUrl } from '../../kibana_utils/public'; -// eslint-disable-next-line import { mockStorage } from '../../kibana_utils/public/storage/hashed_item_store/mock'; import { FilterStateStore } from '../../data/common'; diff --git a/src/plugins/embeddable/public/lib/containers/embeddable_child_panel.test.tsx b/src/plugins/embeddable/public/lib/containers/embeddable_child_panel.test.tsx index e29e941e898fbe..aa0b504b63fbe1 100644 --- a/src/plugins/embeddable/public/lib/containers/embeddable_child_panel.test.tsx +++ b/src/plugins/embeddable/public/lib/containers/embeddable_child_panel.test.tsx @@ -28,7 +28,6 @@ import { ContactCardEmbeddableOutput, ContactCardEmbeddable, } from '../test_samples/embeddables/contact_card/contact_card_embeddable'; -// eslint-disable-next-line import { inspectorPluginMock } from '../../../../inspector/public/mocks'; import { mount } from 'enzyme'; import { embeddablePluginMock, createEmbeddablePanelMock } from '../../mocks'; diff --git a/src/plugins/embeddable/public/lib/panel/embeddable_panel.test.tsx b/src/plugins/embeddable/public/lib/panel/embeddable_panel.test.tsx index ff9f466a8d5539..341a51d7348b2d 100644 --- a/src/plugins/embeddable/public/lib/panel/embeddable_panel.test.tsx +++ b/src/plugins/embeddable/public/lib/panel/embeddable_panel.test.tsx @@ -40,7 +40,6 @@ import { ContactCardEmbeddableInput, ContactCardEmbeddableOutput, } from '../test_samples/embeddables/contact_card/contact_card_embeddable'; -// eslint-disable-next-line import { inspectorPluginMock } from '../../../../inspector/public/mocks'; import { EuiBadge } from '@elastic/eui'; import { embeddablePluginMock } from '../../mocks'; diff --git a/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_action.test.tsx b/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_action.test.tsx index 74b08535bf27a5..d8def3147e52c9 100644 --- a/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_action.test.tsx +++ b/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_action.test.tsx @@ -26,7 +26,6 @@ import { } from '../../../../test_samples/embeddables/filterable_embeddable'; import { FilterableEmbeddableFactory } from '../../../../test_samples/embeddables/filterable_embeddable_factory'; import { FilterableContainer } from '../../../../test_samples/embeddables/filterable_container'; -// eslint-disable-next-line import { coreMock } from '../../../../../../../../core/public/mocks'; import { ContactCardEmbeddable } from '../../../../test_samples'; import { esFilters, Filter } from '../../../../../../../../plugins/data/public'; diff --git a/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/inspect_panel_action.test.tsx b/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/inspect_panel_action.test.tsx index 491eaad9faefa4..eb836414489869 100644 --- a/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/inspect_panel_action.test.tsx +++ b/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/inspect_panel_action.test.tsx @@ -26,7 +26,6 @@ import { FilterableEmbeddable, ContactCardEmbeddable, } from '../../../test_samples'; -// eslint-disable-next-line import { inspectorPluginMock } from '../../../../../../../plugins/inspector/public/mocks'; import { EmbeddableOutput, isErrorEmbeddable, ErrorEmbeddable } from '../../../embeddables'; import { of } from '../../../../tests/helpers'; diff --git a/src/plugins/embeddable/public/lib/panel/panel_header/panel_header.tsx b/src/plugins/embeddable/public/lib/panel/panel_header/panel_header.tsx index 7b66f29cc27267..2f086a3fb2c0cf 100644 --- a/src/plugins/embeddable/public/lib/panel/panel_header/panel_header.tsx +++ b/src/plugins/embeddable/public/lib/panel/panel_header/panel_header.tsx @@ -132,6 +132,7 @@ export function PanelHeader({ const showTitle = !isViewMode || (title && !hidePanelTitles) || viewDescription !== ''; const showPanelBar = badges.length > 0 || showTitle; const classes = classNames('embPanel__header', { + // eslint-disable-next-line @typescript-eslint/naming-convention 'embPanel__header--floater': !showPanelBar, }); diff --git a/src/plugins/embeddable/public/mocks.tsx b/src/plugins/embeddable/public/mocks.tsx index 6b451e71522c54..94aa980e446ca4 100644 --- a/src/plugins/embeddable/public/mocks.tsx +++ b/src/plugins/embeddable/public/mocks.tsx @@ -33,9 +33,7 @@ import { CoreStart } from '../../../core/public'; import { Start as InspectorStart } from '../../inspector/public'; import { dataPluginMock } from '../../data/public/mocks'; -// eslint-disable-next-line import { inspectorPluginMock } from '../../inspector/public/mocks'; -// eslint-disable-next-line import { uiActionsPluginMock } from '../../ui_actions/public/mocks'; export type Setup = jest.Mocked; diff --git a/src/plugins/embeddable/public/tests/apply_filter_action.test.ts b/src/plugins/embeddable/public/tests/apply_filter_action.test.ts index ec92f334267f58..9d765c99064436 100644 --- a/src/plugins/embeddable/public/tests/apply_filter_action.test.ts +++ b/src/plugins/embeddable/public/tests/apply_filter_action.test.ts @@ -30,7 +30,6 @@ import { FilterableContainerFactory, FilterableEmbeddableInput, } from '../lib/test_samples'; -// eslint-disable-next-line import { esFilters } from '../../../data/public'; test('ApplyFilterAction applies the filter to the root of the container tree', async () => { diff --git a/src/plugins/embeddable/public/tests/container.test.ts b/src/plugins/embeddable/public/tests/container.test.ts index e6162748fdb689..621ffe4c9dad60 100644 --- a/src/plugins/embeddable/public/tests/container.test.ts +++ b/src/plugins/embeddable/public/tests/container.test.ts @@ -43,7 +43,6 @@ import { FilterableContainer, FilterableContainerInput, } from '../lib/test_samples/embeddables/filterable_container'; -// eslint-disable-next-line import { coreMock } from '../../../../core/public/mocks'; import { testPlugin } from './test_plugin'; import { of } from './helpers'; diff --git a/src/plugins/embeddable/public/tests/customize_panel_modal.test.tsx b/src/plugins/embeddable/public/tests/customize_panel_modal.test.tsx index 311efae49f7359..e094afe5284982 100644 --- a/src/plugins/embeddable/public/tests/customize_panel_modal.test.tsx +++ b/src/plugins/embeddable/public/tests/customize_panel_modal.test.tsx @@ -31,7 +31,6 @@ import { ContactCardEmbeddableFactory, } from '../lib/test_samples/embeddables/contact_card/contact_card_embeddable_factory'; import { HelloWorldContainer } from '../lib/test_samples/embeddables/hello_world_container'; -// eslint-disable-next-line import { coreMock } from '../../../../core/public/mocks'; import { testPlugin } from './test_plugin'; import { CustomizePanelModal } from '../lib/panel/panel_header/panel_actions/customize_title/customize_panel_modal'; diff --git a/src/plugins/embeddable/public/tests/explicit_input.test.ts b/src/plugins/embeddable/public/tests/explicit_input.test.ts index cfddeec25b3b4f..24785dd50a0322 100644 --- a/src/plugins/embeddable/public/tests/explicit_input.test.ts +++ b/src/plugins/embeddable/public/tests/explicit_input.test.ts @@ -33,7 +33,6 @@ import { import { FilterableContainer } from '../lib/test_samples/embeddables/filterable_container'; import { isErrorEmbeddable } from '../lib'; import { HelloWorldContainer } from '../lib/test_samples/embeddables/hello_world_container'; -// eslint-disable-next-line import { coreMock } from '../../../../core/public/mocks'; import { esFilters, Filter } from '../../../../plugins/data/public'; import { createEmbeddablePanelMock } from '../mocks'; diff --git a/src/plugins/embeddable/public/tests/test_plugin.ts b/src/plugins/embeddable/public/tests/test_plugin.ts index bb12e3d7b90116..2c298b437a118b 100644 --- a/src/plugins/embeddable/public/tests/test_plugin.ts +++ b/src/plugins/embeddable/public/tests/test_plugin.ts @@ -19,9 +19,7 @@ import { CoreSetup, CoreStart } from 'src/core/public'; import { UiActionsStart } from '../../../ui_actions/public'; -// eslint-disable-next-line import { uiActionsPluginMock } from '../../../ui_actions/public/mocks'; -// eslint-disable-next-line import { inspectorPluginMock } from '../../../inspector/public/mocks'; import { dataPluginMock } from '../../../data/public/mocks'; import { coreMock } from '../../../../core/public/mocks'; diff --git a/src/plugins/es_ui_shared/__packages_do_not_import__/ace/use_ui_ace_keyboard_mode.tsx b/src/plugins/es_ui_shared/__packages_do_not_import__/ace/use_ui_ace_keyboard_mode.tsx index d0d1aa1d8db157..4abb78c3bbc903 100644 --- a/src/plugins/es_ui_shared/__packages_do_not_import__/ace/use_ui_ace_keyboard_mode.tsx +++ b/src/plugins/es_ui_shared/__packages_do_not_import__/ace/use_ui_ace_keyboard_mode.tsx @@ -27,7 +27,6 @@ const OverlayText = () => ( // The point of this element is for accessibility purposes, so ignore eslint error // in this case // - // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions <> Press Enter to start editing. When you’re done, press Escape to stop editing. diff --git a/src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_field.ts b/src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_field.ts index b2f00610a3d33f..15ea99eb6cc3a8 100644 --- a/src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_field.ts +++ b/src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_field.ts @@ -41,6 +41,7 @@ export const useField = ( serializer, deserializer, } = config; + const { getFormData, __removeField, __updateFormDataAt, __validateFields } = form; const initialValue = useMemo(() => { diff --git a/src/plugins/expressions/common/execution/container.ts b/src/plugins/expressions/common/execution/container.ts index 6302c0adb550bf..d0867e7ec6b576 100644 --- a/src/plugins/expressions/common/execution/container.ts +++ b/src/plugins/expressions/common/execution/container.ts @@ -58,7 +58,6 @@ const executionDefaultState: ExecutionState = { }, }; -// eslint-disable-next-line export interface ExecutionPureTransitions { start: (state: ExecutionState) => () => ExecutionState; setResult: (state: ExecutionState) => (result: Output) => ExecutionState; diff --git a/src/plugins/expressions/public/mocks.tsx b/src/plugins/expressions/public/mocks.tsx index 3a5ece271c4ee3..6e649c29ead7dd 100644 --- a/src/plugins/expressions/public/mocks.tsx +++ b/src/plugins/expressions/public/mocks.tsx @@ -20,10 +20,8 @@ import React from 'react'; import { ExpressionsSetup, ExpressionsStart, plugin as pluginInitializer } from '.'; -/* eslint-disable */ import { coreMock } from '../../../core/public/mocks'; import { bfetchPluginMock } from '../../bfetch/public/mocks'; -/* eslint-enable */ export type Setup = jest.Mocked; export type Start = jest.Mocked; diff --git a/src/plugins/expressions/server/mocks.ts b/src/plugins/expressions/server/mocks.ts index 1ace19a1848b04..e6b883e38f2442 100644 --- a/src/plugins/expressions/server/mocks.ts +++ b/src/plugins/expressions/server/mocks.ts @@ -20,10 +20,7 @@ import { ExpressionsServerSetup, ExpressionsServerStart } from '.'; import { plugin as pluginInitializer } from '.'; import { coreMock } from '../../../core/server/mocks'; - -/* eslint-disable */ import { bfetchPluginMock } from '../../bfetch/server/mocks'; -/* eslint-enable */ export type Setup = jest.Mocked; export type Start = jest.Mocked; diff --git a/src/plugins/home/server/services/sample_data/data_sets/ecommerce/saved_objects.ts b/src/plugins/home/server/services/sample_data/data_sets/ecommerce/saved_objects.ts index f680329045625f..4c31ccee1243a9 100644 --- a/src/plugins/home/server/services/sample_data/data_sets/ecommerce/saved_objects.ts +++ b/src/plugins/home/server/services/sample_data/data_sets/ecommerce/saved_objects.ts @@ -18,7 +18,6 @@ */ /* eslint max-len: 0 */ -/* eslint-disable */ import { i18n } from '@kbn/i18n'; import { SavedObject } from 'kibana/server'; diff --git a/src/plugins/home/server/services/sample_data/data_sets/logs/saved_objects.ts b/src/plugins/home/server/services/sample_data/data_sets/logs/saved_objects.ts index 0620e93118b8d3..97258c21bc8f07 100644 --- a/src/plugins/home/server/services/sample_data/data_sets/logs/saved_objects.ts +++ b/src/plugins/home/server/services/sample_data/data_sets/logs/saved_objects.ts @@ -18,7 +18,6 @@ */ /* eslint max-len: 0 */ -/* eslint-disable */ import { i18n } from '@kbn/i18n'; import { SavedObject } from 'kibana/server'; diff --git a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_index_pattern/step_index_pattern.tsx b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_index_pattern/step_index_pattern.tsx index 5797149a51aeac..fab638509313dd 100644 --- a/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_index_pattern/step_index_pattern.tsx +++ b/src/plugins/index_pattern_management/public/components/create_index_pattern_wizard/components/step_index_pattern/step_index_pattern.tsx @@ -106,6 +106,7 @@ export class StepIndexPattern extends Component { await updateComponent(component); - expect(component).toMatchSnapshot(); // eslint-disable-line + expect(component).toMatchSnapshot(); }); test('handleOptionsChange - step', async () => { diff --git a/src/plugins/input_control_vis/public/components/vis/form_row.test.tsx b/src/plugins/input_control_vis/public/components/vis/form_row.test.tsx index e0f34113bd6a05..4a98acbe17bd1b 100644 --- a/src/plugins/input_control_vis/public/components/vis/form_row.test.tsx +++ b/src/plugins/input_control_vis/public/components/vis/form_row.test.tsx @@ -28,7 +28,7 @@ test('renders enabled control', () => {
    My Control
    ); - expect(component).toMatchSnapshot(); // eslint-disable-line + expect(component).toMatchSnapshot(); }); test('renders control with warning', () => { @@ -37,7 +37,7 @@ test('renders control with warning', () => {
    My Control
    ); - expect(component).toMatchSnapshot(); // eslint-disable-line + expect(component).toMatchSnapshot(); }); test('renders disabled control with tooltip', () => { @@ -51,5 +51,5 @@ test('renders disabled control with tooltip', () => {
    My Control
    ); - expect(component).toMatchSnapshot(); // eslint-disable-line + expect(component).toMatchSnapshot(); }); diff --git a/src/plugins/input_control_vis/public/components/vis/input_control_vis.test.tsx b/src/plugins/input_control_vis/public/components/vis/input_control_vis.test.tsx index b0b674ad7b6eed..e0938f700428e4 100644 --- a/src/plugins/input_control_vis/public/components/vis/input_control_vis.test.tsx +++ b/src/plugins/input_control_vis/public/components/vis/input_control_vis.test.tsx @@ -93,7 +93,7 @@ test('Renders list control', () => { refreshControl={refreshControlMock} /> ); - expect(component).toMatchSnapshot(); // eslint-disable-line + expect(component).toMatchSnapshot(); }); test('Renders range control', () => { @@ -114,7 +114,7 @@ test('Renders range control', () => { refreshControl={refreshControlMock} /> ); - expect(component).toMatchSnapshot(); // eslint-disable-line + expect(component).toMatchSnapshot(); }); test('Apply and Cancel change btns enabled when there are changes', () => { @@ -135,7 +135,7 @@ test('Apply and Cancel change btns enabled when there are changes', () => { refreshControl={refreshControlMock} /> ); - expect(component).toMatchSnapshot(); // eslint-disable-line + expect(component).toMatchSnapshot(); }); test('Clear btns enabled when there are values', () => { @@ -156,7 +156,7 @@ test('Clear btns enabled when there are values', () => { refreshControl={refreshControlMock} /> ); - expect(component).toMatchSnapshot(); // eslint-disable-line + expect(component).toMatchSnapshot(); }); test('clearControls', () => { diff --git a/src/plugins/input_control_vis/public/components/vis/list_control.test.tsx b/src/plugins/input_control_vis/public/components/vis/list_control.test.tsx index 79fe2e376863ac..4944a9dacfed60 100644 --- a/src/plugins/input_control_vis/public/components/vis/list_control.test.tsx +++ b/src/plugins/input_control_vis/public/components/vis/list_control.test.tsx @@ -49,7 +49,7 @@ test('renders ListControl', () => { intl={{} as any} /> ); - expect(component).toMatchSnapshot(); // eslint-disable-line + expect(component).toMatchSnapshot(); }); test('disableMsg', () => { @@ -66,5 +66,5 @@ test('disableMsg', () => { intl={{} as any} /> ); - expect(component).toMatchSnapshot(); // eslint-disable-line + expect(component).toMatchSnapshot(); }); diff --git a/src/plugins/input_control_vis/public/components/vis/range_control.test.tsx b/src/plugins/input_control_vis/public/components/vis/range_control.test.tsx index ff5d572fa21c4f..569d115c9dbdaf 100644 --- a/src/plugins/input_control_vis/public/components/vis/range_control.test.tsx +++ b/src/plugins/input_control_vis/public/components/vis/range_control.test.tsx @@ -46,7 +46,7 @@ test('renders RangeControl', () => { const component = shallowWithIntl( {}} /> ); - expect(component).toMatchSnapshot(); // eslint-disable-line + expect(component).toMatchSnapshot(); }); test('disabled', () => { @@ -69,7 +69,7 @@ test('disabled', () => { const component = shallowWithIntl( {}} /> ); - expect(component).toMatchSnapshot(); // eslint-disable-line + expect(component).toMatchSnapshot(); }); test('ceilWithPrecision', () => { diff --git a/src/plugins/input_control_vis/public/control/control.ts b/src/plugins/input_control_vis/public/control/control.ts index 1e1e05c96cc1a2..91e8f1b26164ba 100644 --- a/src/plugins/input_control_vis/public/control/control.ts +++ b/src/plugins/input_control_vis/public/control/control.ts @@ -17,8 +17,6 @@ * under the License. */ -/* eslint-disable no-multi-str*/ - import _ from 'lodash'; import { i18n } from '@kbn/i18n'; diff --git a/src/plugins/inspector/public/mocks.ts b/src/plugins/inspector/public/mocks.ts index 451daf4b8dc1a0..ccddc0217831a8 100644 --- a/src/plugins/inspector/public/mocks.ts +++ b/src/plugins/inspector/public/mocks.ts @@ -20,7 +20,6 @@ import { Setup as PluginSetup, Start as PluginStart } from '.'; import { InspectorViewRegistry } from './view_registry'; import { plugin as pluginInitializer } from '.'; -// eslint-disable-next-line import { coreMock } from '../../../core/public/mocks'; export type Setup = jest.Mocked; diff --git a/src/plugins/kibana_legacy/public/utils/inject_header_style.ts b/src/plugins/kibana_legacy/public/utils/inject_header_style.ts index b95e9721d5da43..0b953caeba8c4a 100644 --- a/src/plugins/kibana_legacy/public/utils/inject_header_style.ts +++ b/src/plugins/kibana_legacy/public/utils/inject_header_style.ts @@ -36,6 +36,7 @@ export function injectHeaderStyle(uiSettings: IUiSettingsClient) { document.getElementsByTagName('head')[0].appendChild(style); uiSettings.get$('truncate:maxHeight').subscribe((value: number) => { + // eslint-disable-next-line no-unsanitized/property style.innerHTML = buildCSS(value); }); } diff --git a/src/plugins/kibana_react/public/adapters/ui_to_react_component.test.tsx b/src/plugins/kibana_react/public/adapters/ui_to_react_component.test.tsx index aefbd66e50fcf4..cb8a9a4a2b65ea 100644 --- a/src/plugins/kibana_react/public/adapters/ui_to_react_component.test.tsx +++ b/src/plugins/kibana_react/public/adapters/ui_to_react_component.test.tsx @@ -25,6 +25,7 @@ import { reactToUiComponent } from './react_to_ui_component'; const UiComp: UiComponent<{ cnt?: number }> = () => ({ render: (el, { cnt = 0 }) => { + // eslint-disable-next-line no-unsanitized/property el.innerHTML = `cnt: ${cnt}`; }, }); @@ -64,6 +65,7 @@ describe('uiToReactComponent', () => { test('does not crash if .unmount() not provided', () => { const UiComp2: UiComponent<{ cnt?: number }> = () => ({ render: (el, { cnt = 0 }) => { + // eslint-disable-next-line no-unsanitized/property el.innerHTML = `cnt: ${cnt}`; }, }); @@ -80,6 +82,7 @@ describe('uiToReactComponent', () => { const unmount = jest.fn(); const UiComp2: UiComponent<{ cnt?: number }> = () => ({ render: (el, { cnt = 0 }) => { + // eslint-disable-next-line no-unsanitized/property el.innerHTML = `cnt: ${cnt}`; }, unmount, @@ -100,6 +103,7 @@ describe('uiToReactComponent', () => { test('calls .render() method only once when components mounts, and once on every re-render', () => { const render = jest.fn((el, { cnt = 0 }) => { + // eslint-disable-next-line no-unsanitized/property el.innerHTML = `cnt: ${cnt}`; }); const UiComp2: UiComponent<{ cnt?: number }> = () => ({ diff --git a/src/plugins/kibana_react/public/markdown/markdown.test.tsx b/src/plugins/kibana_react/public/markdown/markdown.test.tsx index 5846b7a2d0dba1..2fc0c6359fcc0d 100644 --- a/src/plugins/kibana_react/public/markdown/markdown.test.tsx +++ b/src/plugins/kibana_react/public/markdown/markdown.test.tsx @@ -24,14 +24,14 @@ import { Markdown } from './markdown'; test('render', () => { const component = shallow(); - expect(component).toMatchSnapshot(); // eslint-disable-line + expect(component).toMatchSnapshot(); }); test('should never render html tags', () => { const component = shallow( ); - expect(component).toMatchSnapshot(); // eslint-disable-line + expect(component).toMatchSnapshot(); }); test('should render links with parentheses correctly', () => { @@ -65,19 +65,19 @@ describe('props', () => { test('markdown', () => { const component = shallow(); - expect(component).toMatchSnapshot(); // eslint-disable-line + expect(component).toMatchSnapshot(); }); test('openLinksInNewTab', () => { const component = shallow(); - expect(component).toMatchSnapshot(); // eslint-disable-line + expect(component).toMatchSnapshot(); }); test('whiteListedRules', () => { const component = shallow( ); - expect(component).toMatchSnapshot(); // eslint-disable-line + expect(component).toMatchSnapshot(); }); test('should update markdown when openLinksInNewTab prop change', () => { diff --git a/src/plugins/kibana_react/public/validated_range/validated_dual_range.tsx b/src/plugins/kibana_react/public/validated_range/validated_dual_range.tsx index 45592c8a703af1..832ea70f0460e0 100644 --- a/src/plugins/kibana_react/public/validated_range/validated_dual_range.tsx +++ b/src/plugins/kibana_react/public/validated_range/validated_dual_range.tsx @@ -100,9 +100,9 @@ export class ValidatedDualRange extends Component { fullWidth, label, formRowDisplay, - value, // eslint-disable-line no-unused-vars - onChange, // eslint-disable-line no-unused-vars - allowEmptyRange, // eslint-disable-line no-unused-vars + value, + onChange, + allowEmptyRange, ...rest // TODO: Consider alternatives for spread operator in component } = this.props; diff --git a/src/plugins/kibana_utils/public/state_sync/public.api.md b/src/plugins/kibana_utils/public/state_sync/public.api.md index c174ba798d01a7..ae8c0e8e401b8e 100644 --- a/src/plugins/kibana_utils/public/state_sync/public.api.md +++ b/src/plugins/kibana_utils/public/state_sync/public.api.md @@ -74,7 +74,7 @@ export interface IStateSyncConfig { +export interface ISyncStateRef { start: StartSyncStateFnType; stop: StopSyncStateFnType; } diff --git a/src/plugins/kibana_utils/public/state_sync/state_sync.ts b/src/plugins/kibana_utils/public/state_sync/state_sync.ts index bbcaaedd0d8bf2..2ceacb51235138 100644 --- a/src/plugins/kibana_utils/public/state_sync/state_sync.ts +++ b/src/plugins/kibana_utils/public/state_sync/state_sync.ts @@ -38,7 +38,7 @@ export type StartSyncStateFnType = () => void; /** * @public */ -export interface ISyncStateRef { +export interface ISyncStateRef { /** * stop state syncing */ diff --git a/src/plugins/kibana_utils/public/storage/hashed_item_store/mock.ts b/src/plugins/kibana_utils/public/storage/hashed_item_store/mock.ts index e3360e0e3cf515..43a8856176c42c 100644 --- a/src/plugins/kibana_utils/public/storage/hashed_item_store/mock.ts +++ b/src/plugins/kibana_utils/public/storage/hashed_item_store/mock.ts @@ -32,6 +32,7 @@ export const mockStorage = new StubBrowserStorage(); const mockHashedItemStore = new HashedItemStore(mockStorage); jest.mock('./', () => { return { + // eslint-disable-next-line @typescript-eslint/no-var-requires HashedItemStore: require('./hashed_item_store').HashedItemStore, hashedItemStore: mockHashedItemStore, }; diff --git a/src/plugins/saved_objects_management/public/plugin.test.ts b/src/plugins/saved_objects_management/public/plugin.test.ts index 09080f46a68694..8b1ee2cefe468d 100644 --- a/src/plugins/saved_objects_management/public/plugin.test.ts +++ b/src/plugins/saved_objects_management/public/plugin.test.ts @@ -18,9 +18,7 @@ */ import { coreMock } from '../../../core/public/mocks'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { homePluginMock } from '../../home/public/mocks'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { managementPluginMock } from '../../management/public/mocks'; import { dataPluginMock } from '../../data/public/mocks'; import { SavedObjectsManagementPlugin } from './plugin'; diff --git a/src/plugins/telemetry/server/telemetry_collection/get_local_stats.ts b/src/plugins/telemetry/server/telemetry_collection/get_local_stats.ts index 4d4031bb428baf..98c83a3394628b 100644 --- a/src/plugins/telemetry/server/telemetry_collection/get_local_stats.ts +++ b/src/plugins/telemetry/server/telemetry_collection/get_local_stats.ts @@ -37,6 +37,7 @@ import { getDataTelemetry, DATA_TELEMETRY_ID, DataTelemetryPayload } from './get * @param {Object} kibana The Kibana Usage stats */ export function handleLocalStats( + // eslint-disable-next-line @typescript-eslint/naming-convention { cluster_name, cluster_uuid, version }: ESClusterInfo, { _nodes, cluster_name: clusterName, ...clusterStats }: any, kibana: KibanaUsageStats, diff --git a/src/plugins/timelion/public/application.ts b/src/plugins/timelion/public/application.ts index a398106d56f589..a4963ee6b1b033 100644 --- a/src/plugins/timelion/public/application.ts +++ b/src/plugins/timelion/public/application.ts @@ -100,7 +100,7 @@ const thirdPartyAngularDependencies = ['ngSanitize', 'ngRoute', 'react', 'angula function mountTimelionApp(appBasePath: string, element: HTMLElement, deps: RenderDeps) { const mountpoint = document.createElement('div'); mountpoint.setAttribute('class', 'timelionAppContainer'); - // eslint-disable-next-line + // eslint-disable-next-line no-unsanitized/property mountpoint.innerHTML = mainTemplate(appBasePath); // bootstrap angular into detached element and attach it later to // make angular-within-angular possible diff --git a/src/plugins/vis_type_metric/public/components/metric_vis_value.tsx b/src/plugins/vis_type_metric/public/components/metric_vis_value.tsx index 267d92abe2c756..5bc6c53d5a6a09 100644 --- a/src/plugins/vis_type_metric/public/components/metric_vis_value.tsx +++ b/src/plugins/vis_type_metric/public/components/metric_vis_value.tsx @@ -54,7 +54,9 @@ export class MetricVisValue extends Component { }; const containerClassName = classNames('mtrVis__container', { + // eslint-disable-next-line @typescript-eslint/naming-convention 'mtrVis__container--light': metric.lightText, + // eslint-disable-next-line @typescript-eslint/naming-convention 'mtrVis__container-isfilterable': hasFilter, }); diff --git a/src/plugins/vis_type_table/public/table_vis_controller.test.ts b/src/plugins/vis_type_table/public/table_vis_controller.test.ts index e7d7f6726b0cdc..56d17c187bd3fc 100644 --- a/src/plugins/vis_type_table/public/table_vis_controller.test.ts +++ b/src/plugins/vis_type_table/public/table_vis_controller.test.ts @@ -28,14 +28,11 @@ import { getAngularModule } from './get_inner_angular'; import { initTableVisLegacyModule } from './table_vis_legacy_module'; import { getTableVisTypeDefinition } from './table_vis_type'; import { Vis } from '../../visualizations/public'; -// eslint-disable-next-line import { stubFields } from '../../data/public/stubs'; -// eslint-disable-next-line import { tableVisResponseHandler } from './table_vis_response_handler'; import { coreMock } from '../../../core/public/mocks'; import { IAggConfig, search } from '../../data/public'; // TODO: remove linting disable -// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { searchServiceMock } from '../../data/public/search/mocks'; const { createAggConfigs } = searchServiceMock.createStartContract().aggs; diff --git a/src/plugins/vis_type_table/public/table_vis_fn.test.ts b/src/plugins/vis_type_table/public/table_vis_fn.test.ts index 6cb3f3e0f37791..2471522544fdff 100644 --- a/src/plugins/vis_type_table/public/table_vis_fn.test.ts +++ b/src/plugins/vis_type_table/public/table_vis_fn.test.ts @@ -20,7 +20,6 @@ import { createTableVisFn } from './table_vis_fn'; import { tableVisResponseHandler } from './table_vis_response_handler'; -// eslint-disable-next-line import { functionWrapper } from '../../expressions/common/expression_functions/specs/tests/utils'; jest.mock('./table_vis_response_handler', () => ({ diff --git a/src/plugins/vis_type_timeseries/common/vis_schema.ts b/src/plugins/vis_type_timeseries/common/vis_schema.ts index 7161c197b69409..a462e488c67327 100644 --- a/src/plugins/vis_type_timeseries/common/vis_schema.ts +++ b/src/plugins/vis_type_timeseries/common/vis_schema.ts @@ -233,6 +233,7 @@ export const panel = schema.object({ legend_position: stringOptionalNullable, markdown: stringOptionalNullable, markdown_scrollbars: numberIntegerOptional, + // eslint-disable-next-line @typescript-eslint/naming-convention markdown_openLinksInNewTab: numberIntegerOptional, markdown_vertical_align: stringOptionalNullable, markdown_less: stringOptionalNullable, diff --git a/src/plugins/vis_type_timeseries/public/application/components/color_picker.tsx b/src/plugins/vis_type_timeseries/public/application/components/color_picker.tsx index 444e5c90c7a6db..97069fa0c5e0c2 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/color_picker.tsx +++ b/src/plugins/vis_type_timeseries/public/application/components/color_picker.tsx @@ -17,7 +17,7 @@ * under the License. */ -/* eslint-disable jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions */ +/* eslint-disable jsx-a11y/click-events-have-key-events */ // The color picker is not yet accessible. import React, { useState } from 'react'; diff --git a/src/plugins/vis_type_vega/public/data_model/vega_parser.ts b/src/plugins/vis_type_vega/public/data_model/vega_parser.ts index c867523d2b3b34..94d79071b8ef22 100644 --- a/src/plugins/vis_type_vega/public/data_model/vega_parser.ts +++ b/src/plugins/vis_type_vega/public/data_model/vega_parser.ts @@ -159,7 +159,6 @@ export class VegaParser { */ _compileVegaLite() { this.vlspec = this.spec; - // eslint-disable-next-line import/namespace const logger = vega.logger(vega.Warn); // note: eslint has a false positive here logger.warn = this._onWarning.bind(this); this.spec = vegaLite.compile(this.vlspec, logger).spec; diff --git a/src/plugins/vis_type_vislib/public/pie_fn.test.ts b/src/plugins/vis_type_vislib/public/pie_fn.test.ts index a8c03eba2b4499..eb68353b7c0e2d 100644 --- a/src/plugins/vis_type_vislib/public/pie_fn.test.ts +++ b/src/plugins/vis_type_vislib/public/pie_fn.test.ts @@ -17,7 +17,6 @@ * under the License. */ -// eslint-disable-next-line import { functionWrapper } from '../../expressions/common/expression_functions/specs/tests/utils'; import { createPieVisFn } from './pie_fn'; // @ts-ignore diff --git a/src/plugins/vis_type_vislib/public/vislib/components/legend/legend.tsx b/src/plugins/vis_type_vislib/public/vislib/components/legend/legend.tsx index 129fdd2ade9bdb..5a2db2d21c6fe6 100644 --- a/src/plugins/vis_type_vislib/public/vislib/components/legend/legend.tsx +++ b/src/plugins/vis_type_vislib/public/vislib/components/legend/legend.tsx @@ -254,6 +254,7 @@ export class VisLegend extends PureComponent { type="button" onClick={this.toggleLegend} className={classNames('visLegend__toggle kbn-resetFocusState', { + // eslint-disable-next-line @typescript-eslint/naming-convention 'visLegend__toggle--isOpen': open, })} aria-label={i18n.translate('visTypeVislib.vislib.legend.toggleLegendButtonAriaLabel', { diff --git a/src/plugins/vis_type_vislib/public/vislib/components/legend/legend_item.tsx b/src/plugins/vis_type_vislib/public/vislib/components/legend/legend_item.tsx index b440384899d5f0..1bc41f9f61a1a8 100644 --- a/src/plugins/vis_type_vislib/public/vislib/components/legend/legend_item.tsx +++ b/src/plugins/vis_type_vislib/public/vislib/components/legend/legend_item.tsx @@ -182,6 +182,7 @@ const VisLegendItemComponent = ({ onClick={setColor(item.label, color)} onKeyPress={setColor(item.label, color)} className={classNames('visLegend__valueColorPickerDot', { + // eslint-disable-next-line @typescript-eslint/naming-convention 'visLegend__valueColorPickerDot-isSelected': color === getColor(item.label), })} style={{ color }} diff --git a/src/plugins/visualizations/public/legacy/build_pipeline.ts b/src/plugins/visualizations/public/legacy/build_pipeline.ts index d3fe814f3b0103..d52e2fcc13bffe 100644 --- a/src/plugins/visualizations/public/legacy/build_pipeline.ts +++ b/src/plugins/visualizations/public/legacy/build_pipeline.ts @@ -52,16 +52,18 @@ export interface Schemas { [key: string]: any[] | undefined; } -type buildVisFunction = ( +type BuildVisFunction = ( params: VisParams, schemas: Schemas, uiState: any, meta?: { savedObjectId?: string } ) => string; + +// eslint-disable-next-line @typescript-eslint/naming-convention type buildVisConfigFunction = (schemas: Schemas, visParams?: VisParams) => VisParams; interface BuildPipelineVisFunction { - [key: string]: buildVisFunction; + [key: string]: BuildVisFunction; } interface BuildVisConfigFunction { diff --git a/src/plugins/visualizations/public/saved_visualizations/saved_visualizations.ts b/src/plugins/visualizations/public/saved_visualizations/saved_visualizations.ts index d44fc2f4a75af0..94538b4081aef6 100644 --- a/src/plugins/visualizations/public/saved_visualizations/saved_visualizations.ts +++ b/src/plugins/visualizations/public/saved_visualizations/saved_visualizations.ts @@ -43,7 +43,7 @@ export function createSavedVisLoader(services: SavedObjectKibanaServicesWithVisu typeName = JSON.parse(String(source.visState)).type; } catch (e) { /* missing typename handled below */ - } // eslint-disable-line no-empty + } } if (!typeName || !visTypes.get(typeName)) { diff --git a/src/test_utils/public/http_test_setup.ts b/src/test_utils/public/http_test_setup.ts index 4a71e912f0f9e2..7c70f64887af11 100644 --- a/src/test_utils/public/http_test_setup.ts +++ b/src/test_utils/public/http_test_setup.ts @@ -17,11 +17,9 @@ * under the License. */ -/* eslint-disable @kbn/eslint/no-restricted-paths */ import { HttpService } from '../../core/public/http'; import { fatalErrorsServiceMock } from '../../core/public/fatal_errors/fatal_errors_service.mock'; import { injectedMetadataServiceMock } from '../../core/public/injected_metadata/injected_metadata_service.mock'; -/* eslint-enable @kbn/eslint/no-restricted-paths */ export type SetupTap = ( injectedMetadata: ReturnType, diff --git a/test/functional/apps/console/_console.ts b/test/functional/apps/console/_console.ts index 2c2528ab8c41d4..6e524b2cd33df2 100644 --- a/test/functional/apps/console/_console.ts +++ b/test/functional/apps/console/_console.ts @@ -31,7 +31,6 @@ GET _search `.trim(); -// eslint-disable-next-line import/no-default-export export default function ({ getService, getPageObjects }: FtrProviderContext) { const retry = getService('retry'); const log = getService('log'); diff --git a/test/functional/apps/home/_navigation.ts b/test/functional/apps/home/_navigation.ts index b8fa5b184cd1f4..91ef444bc3a83b 100644 --- a/test/functional/apps/home/_navigation.ts +++ b/test/functional/apps/home/_navigation.ts @@ -20,7 +20,6 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../ftr_provider_context'; -// eslint-disable-next-line import/no-default-export export default function ({ getService, getPageObjects }: FtrProviderContext) { const browser = getService('browser'); const PageObjects = getPageObjects(['common', 'header', 'home', 'timePicker']); diff --git a/test/functional/apps/visualize/_chart_types.ts b/test/functional/apps/visualize/_chart_types.ts index 8aa8b9c32e967d..ecb7e9630c2c65 100644 --- a/test/functional/apps/visualize/_chart_types.ts +++ b/test/functional/apps/visualize/_chart_types.ts @@ -21,7 +21,6 @@ import _ from 'lodash'; import expect from '@kbn/expect'; import { FtrProviderContext } from '../../ftr_provider_context'; -// eslint-disable-next-line import/no-default-export export default function ({ getService, getPageObjects }: FtrProviderContext) { const log = getService('log'); const PageObjects = getPageObjects(['common', 'visualize']); diff --git a/test/functional/apps/visualize/_linked_saved_searches.ts b/test/functional/apps/visualize/_linked_saved_searches.ts index e7b2909afa5a1f..4151e0e9b471c5 100644 --- a/test/functional/apps/visualize/_linked_saved_searches.ts +++ b/test/functional/apps/visualize/_linked_saved_searches.ts @@ -19,7 +19,6 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../ftr_provider_context'; -// eslint-disable-next-line import/no-default-export export default function ({ getService, getPageObjects }: FtrProviderContext) { const browser = getService('browser'); const filterBar = getService('filterBar'); diff --git a/test/functional/apps/visualize/_tsvb_chart.ts b/test/functional/apps/visualize/_tsvb_chart.ts index f1082bf618b90d..ab76598ae2ea53 100644 --- a/test/functional/apps/visualize/_tsvb_chart.ts +++ b/test/functional/apps/visualize/_tsvb_chart.ts @@ -20,7 +20,6 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../ftr_provider_context'; -// eslint-disable-next-line import/no-default-export export default function ({ getService, getPageObjects }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const log = getService('log'); diff --git a/test/functional/apps/visualize/_tsvb_markdown.ts b/test/functional/apps/visualize/_tsvb_markdown.ts index fae60fe019433c..ba60aa83d92daf 100644 --- a/test/functional/apps/visualize/_tsvb_markdown.ts +++ b/test/functional/apps/visualize/_tsvb_markdown.ts @@ -20,7 +20,6 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../ftr_provider_context'; -// eslint-disable-next-line import/no-default-export export default function ({ getPageObjects, getService }: FtrProviderContext) { const { visualBuilder, timePicker } = getPageObjects(['visualBuilder', 'timePicker']); const retry = getService('retry'); diff --git a/test/functional/apps/visualize/_tsvb_time_series.ts b/test/functional/apps/visualize/_tsvb_time_series.ts index c048755fc5fbe3..0b2a52b367a20a 100644 --- a/test/functional/apps/visualize/_tsvb_time_series.ts +++ b/test/functional/apps/visualize/_tsvb_time_series.ts @@ -19,7 +19,6 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../ftr_provider_context'; -// eslint-disable-next-line import/no-default-export export default function ({ getPageObjects, getService }: FtrProviderContext) { const { visualize, visualBuilder } = getPageObjects(['visualBuilder', 'visualize']); const retry = getService('retry'); diff --git a/test/functional/apps/visualize/_vega_chart.ts b/test/functional/apps/visualize/_vega_chart.ts index 6c0b77411ae993..a1ed8460f1b228 100644 --- a/test/functional/apps/visualize/_vega_chart.ts +++ b/test/functional/apps/visualize/_vega_chart.ts @@ -20,7 +20,6 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../ftr_provider_context'; -// eslint-disable-next-line import/no-default-export export default function ({ getPageObjects, getService }: FtrProviderContext) { const PageObjects = getPageObjects([ 'timePicker', diff --git a/test/functional/apps/visualize/index.ts b/test/functional/apps/visualize/index.ts index 42b82486dc13f7..a30517519820e0 100644 --- a/test/functional/apps/visualize/index.ts +++ b/test/functional/apps/visualize/index.ts @@ -20,7 +20,6 @@ import { FtrProviderContext } from '../../ftr_provider_context.d'; import { UI_SETTINGS } from '../../../../src/plugins/data/common'; -// eslint-disable-next-line @typescript-eslint/no-namespace, import/no-default-export export default function ({ getService, getPageObjects, loadTestFile }: FtrProviderContext) { const browser = getService('browser'); const log = getService('log'); diff --git a/test/functional/apps/visualize/input_control_vis/input_control_range.ts b/test/functional/apps/visualize/input_control_vis/input_control_range.ts index f52a812d4d50c2..b855a014270687 100644 --- a/test/functional/apps/visualize/input_control_vis/input_control_range.ts +++ b/test/functional/apps/visualize/input_control_vis/input_control_range.ts @@ -20,7 +20,6 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../../ftr_provider_context'; -// eslint-disable-next-line import/no-default-export export default function ({ getService, getPageObjects }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const kibanaServer = getService('kibanaServer'); diff --git a/test/mocha_decorations.d.ts b/test/mocha_decorations.d.ts index 4645faf3d5fe84..5ad289eb4f1a33 100644 --- a/test/mocha_decorations.d.ts +++ b/test/mocha_decorations.d.ts @@ -34,7 +34,6 @@ type Tags = | 'ciGroup12'; // We need to use the namespace here to match the Mocha definition -// eslint-disable-next-line @typescript-eslint/no-namespace declare module 'mocha' { interface Suite { /** diff --git a/test/plugin_functional/plugins/core_app_status/public/plugin.tsx b/test/plugin_functional/plugins/core_app_status/public/plugin.tsx index bdc08c03c19128..d8042f2c240dc2 100644 --- a/test/plugin_functional/plugins/core_app_status/public/plugin.tsx +++ b/test/plugin_functional/plugins/core_app_status/public/plugin.tsx @@ -63,7 +63,7 @@ export class CoreAppStatusPlugin implements Plugin<{}, CoreAppStatusPluginStart> return core.application.navigateToApp(appId); }, }; - window.__coreAppStatus = startContract; + window._coreAppStatus = startContract; return startContract; } public stop() {} diff --git a/test/plugin_functional/plugins/core_app_status/public/types.ts b/test/plugin_functional/plugins/core_app_status/public/types.ts index 7c708e6c26d91f..4f6070d130568a 100644 --- a/test/plugin_functional/plugins/core_app_status/public/types.ts +++ b/test/plugin_functional/plugins/core_app_status/public/types.ts @@ -21,6 +21,6 @@ import { CoreAppStatusPluginStart } from './plugin'; declare global { interface Window { - __coreAppStatus: CoreAppStatusPluginStart; + _coreAppStatus: CoreAppStatusPluginStart; } } diff --git a/test/plugin_functional/plugins/core_provider_plugin/public/index.ts b/test/plugin_functional/plugins/core_provider_plugin/public/index.ts index ac2d63bb9fd75f..c1dd56fb967006 100644 --- a/test/plugin_functional/plugins/core_provider_plugin/public/index.ts +++ b/test/plugin_functional/plugins/core_provider_plugin/public/index.ts @@ -31,7 +31,7 @@ class CoreProviderPlugin implements Plugin { } public start(core: CoreStart, plugins: Record) { - window.__coreProvider = { + window._coreProvider = { setup: this.setupDeps!, start: { core, diff --git a/test/plugin_functional/plugins/core_provider_plugin/types.ts b/test/plugin_functional/plugins/core_provider_plugin/types.ts index cae3b604ecd959..6edbaa59598f80 100644 --- a/test/plugin_functional/plugins/core_provider_plugin/types.ts +++ b/test/plugin_functional/plugins/core_provider_plugin/types.ts @@ -20,7 +20,7 @@ import { CoreSetup, CoreStart } from 'kibana/public'; declare global { interface Window { - __coreProvider: { + _coreProvider: { setup: { core: CoreSetup; plugins: Record; diff --git a/test/plugin_functional/test_suites/application_links/index.ts b/test/plugin_functional/test_suites/application_links/index.ts index 120b3fb49f138f..ddacfebea96d23 100644 --- a/test/plugin_functional/test_suites/application_links/index.ts +++ b/test/plugin_functional/test_suites/application_links/index.ts @@ -18,7 +18,6 @@ */ import { PluginFunctionalProviderContext } from '../../services'; -// eslint-disable-next-line import/no-default-export export default function ({ loadTestFile }: PluginFunctionalProviderContext) { describe('application links', () => { loadTestFile(require.resolve('./redirect_app_links')); diff --git a/test/plugin_functional/test_suites/application_links/redirect_app_links.ts b/test/plugin_functional/test_suites/application_links/redirect_app_links.ts index 9120018958bda7..2117e0e37f71dd 100644 --- a/test/plugin_functional/test_suites/application_links/redirect_app_links.ts +++ b/test/plugin_functional/test_suites/application_links/redirect_app_links.ts @@ -24,7 +24,7 @@ import '../../plugins/core_app_status/public/types'; declare global { interface Window { - __nonReloadedFlag?: boolean; + _nonReloadedFlag?: boolean; } } @@ -33,7 +33,6 @@ const getPathWithHash = (absoluteUrl: string) => { return `${parsed.path}${parsed.hash ?? ''}`; }; -// eslint-disable-next-line import/no-default-export export default function ({ getService, getPageObjects }: PluginFunctionalProviderContext) { const PageObjects = getPageObjects(['common']); const browser = getService('browser'); @@ -41,13 +40,13 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide const setNonReloadedFlag = () => { return browser.executeAsync(async (cb) => { - window.__nonReloadedFlag = true; + window._nonReloadedFlag = true; cb(); }); }; const wasReloaded = () => { return browser.executeAsync(async (cb) => { - const reloaded = window.__nonReloadedFlag !== true; + const reloaded = window._nonReloadedFlag !== true; cb(reloaded); }); }; diff --git a/test/plugin_functional/test_suites/core_plugins/application_leave_confirm.ts b/test/plugin_functional/test_suites/core_plugins/application_leave_confirm.ts index d2e23f7d9572ec..98c59717fcac01 100644 --- a/test/plugin_functional/test_suites/core_plugins/application_leave_confirm.ts +++ b/test/plugin_functional/test_suites/core_plugins/application_leave_confirm.ts @@ -29,7 +29,6 @@ const getKibanaUrl = (pathname?: string, search?: string) => search, }); -// eslint-disable-next-line import/no-default-export export default function ({ getService, getPageObjects }: PluginFunctionalProviderContext) { const PageObjects = getPageObjects(['common']); const browser = getService('browser'); diff --git a/test/plugin_functional/test_suites/core_plugins/application_status.ts b/test/plugin_functional/test_suites/core_plugins/application_status.ts index f56a6e8d62fb12..b937ffdc7f5e6a 100644 --- a/test/plugin_functional/test_suites/core_plugins/application_status.ts +++ b/test/plugin_functional/test_suites/core_plugins/application_status.ts @@ -36,7 +36,6 @@ const getKibanaUrl = (pathname?: string, search?: string) => search, }); -// eslint-disable-next-line import/no-default-export export default function ({ getService, getPageObjects }: PluginFunctionalProviderContext) { const PageObjects = getPageObjects(['common']); const browser = getService('browser'); @@ -46,14 +45,14 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide const setAppStatus = async (s: Partial) => { return browser.executeAsync(async (status, cb) => { - window.__coreAppStatus.setAppStatus(status); + window._coreAppStatus.setAppStatus(status); cb(); }, s); }; const navigateToApp = async (id: string) => { return await browser.executeAsync(async (appId, cb) => { - await window.__coreAppStatus.navigateToApp(appId); + await window._coreAppStatus.navigateToApp(appId); cb(); }, id); }; diff --git a/test/plugin_functional/test_suites/core_plugins/applications.ts b/test/plugin_functional/test_suites/core_plugins/applications.ts index 6d31889a9cbe41..9306b62b9d5216 100644 --- a/test/plugin_functional/test_suites/core_plugins/applications.ts +++ b/test/plugin_functional/test_suites/core_plugins/applications.ts @@ -20,7 +20,6 @@ import url from 'url'; import expect from '@kbn/expect'; import { PluginFunctionalProviderContext } from '../../services'; -// eslint-disable-next-line import/no-default-export export default function ({ getService, getPageObjects }: PluginFunctionalProviderContext) { const PageObjects = getPageObjects(['common']); diff --git a/test/plugin_functional/test_suites/core_plugins/elasticsearch_client.ts b/test/plugin_functional/test_suites/core_plugins/elasticsearch_client.ts index 9b9efc261126f3..a44db4193248d1 100644 --- a/test/plugin_functional/test_suites/core_plugins/elasticsearch_client.ts +++ b/test/plugin_functional/test_suites/core_plugins/elasticsearch_client.ts @@ -19,7 +19,6 @@ import { PluginFunctionalProviderContext } from '../../services'; import '../../plugins/core_provider_plugin/types'; -// eslint-disable-next-line import/no-default-export export default function ({ getService, getPageObjects }: PluginFunctionalProviderContext) { const supertest = getService('supertest'); describe('elasticsearch client', () => { diff --git a/test/plugin_functional/test_suites/core_plugins/index.ts b/test/plugin_functional/test_suites/core_plugins/index.ts index 99ac6dc9b84743..cc498fa10818f0 100644 --- a/test/plugin_functional/test_suites/core_plugins/index.ts +++ b/test/plugin_functional/test_suites/core_plugins/index.ts @@ -18,7 +18,6 @@ */ import { PluginFunctionalProviderContext } from '../../services'; -// eslint-disable-next-line import/no-default-export export default function ({ loadTestFile }: PluginFunctionalProviderContext) { describe('core plugins', () => { loadTestFile(require.resolve('./applications')); diff --git a/test/plugin_functional/test_suites/core_plugins/legacy_plugins.ts b/test/plugin_functional/test_suites/core_plugins/legacy_plugins.ts index c9274c867df837..d03185796000fe 100644 --- a/test/plugin_functional/test_suites/core_plugins/legacy_plugins.ts +++ b/test/plugin_functional/test_suites/core_plugins/legacy_plugins.ts @@ -20,7 +20,6 @@ import expect from '@kbn/expect'; import { PluginFunctionalProviderContext } from '../../services'; -// eslint-disable-next-line import/no-default-export export default function ({ getService, getPageObjects }: PluginFunctionalProviderContext) { const PageObjects = getPageObjects(['common']); const testSubjects = getService('testSubjects'); diff --git a/test/plugin_functional/test_suites/core_plugins/rendering.ts b/test/plugin_functional/test_suites/core_plugins/rendering.ts index 7ae6865d45a978..08fd576c036a44 100644 --- a/test/plugin_functional/test_suites/core_plugins/rendering.ts +++ b/test/plugin_functional/test_suites/core_plugins/rendering.ts @@ -32,7 +32,6 @@ declare global { } } -// eslint-disable-next-line import/no-default-export export default function ({ getService, getPageObjects }: PluginFunctionalProviderContext) { const PageObjects = getPageObjects(['common']); const appsMenu = getService('appsMenu'); diff --git a/test/plugin_functional/test_suites/core_plugins/server_plugins.ts b/test/plugin_functional/test_suites/core_plugins/server_plugins.ts index 00f242ccc62f64..f67474f3fe3b97 100644 --- a/test/plugin_functional/test_suites/core_plugins/server_plugins.ts +++ b/test/plugin_functional/test_suites/core_plugins/server_plugins.ts @@ -19,7 +19,6 @@ import { PluginFunctionalProviderContext } from '../../services'; -// eslint-disable-next-line import/no-default-export export default function ({ getService }: PluginFunctionalProviderContext) { const supertest = getService('supertest'); diff --git a/test/plugin_functional/test_suites/core_plugins/top_nav.ts b/test/plugin_functional/test_suites/core_plugins/top_nav.ts index 6d2c6b7f85d28a..c679ac89f2f610 100644 --- a/test/plugin_functional/test_suites/core_plugins/top_nav.ts +++ b/test/plugin_functional/test_suites/core_plugins/top_nav.ts @@ -19,7 +19,6 @@ import expect from '@kbn/expect'; import { PluginFunctionalProviderContext } from '../../services'; -// eslint-disable-next-line import/no-default-export export default function ({ getService, getPageObjects }: PluginFunctionalProviderContext) { const PageObjects = getPageObjects(['common']); diff --git a/test/plugin_functional/test_suites/core_plugins/ui_plugins.ts b/test/plugin_functional/test_suites/core_plugins/ui_plugins.ts index 3a27be42a2a424..e17ce4059ad21d 100644 --- a/test/plugin_functional/test_suites/core_plugins/ui_plugins.ts +++ b/test/plugin_functional/test_suites/core_plugins/ui_plugins.ts @@ -21,7 +21,6 @@ import expect from '@kbn/expect'; import { PluginFunctionalProviderContext } from '../../services'; import '../../../../test/plugin_functional/plugins/core_provider_plugin/types'; -// eslint-disable-next-line import/no-default-export export default function ({ getService, getPageObjects }: PluginFunctionalProviderContext) { const PageObjects = getPageObjects(['common']); const browser = getService('browser'); @@ -36,7 +35,7 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide it('should run the new platform plugins', async () => { expect( await browser.execute(() => { - return window.__coreProvider.setup.plugins.core_plugin_b.sayHi(); + return window._coreProvider.setup.plugins.core_plugin_b.sayHi(); }) ).to.be('Plugin A said: Hello from Plugin A!'); }); @@ -50,7 +49,7 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide it('to start services via coreSetup.getStartServices', async () => { expect( await browser.executeAsync(async (cb) => { - const [coreStart] = await window.__coreProvider.setup.core.getStartServices(); + const [coreStart] = await window._coreProvider.setup.core.getStartServices(); cb(Boolean(coreStart.overlays)); }) ).to.be(true); @@ -77,7 +76,7 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide it('should send kbn-system-request header when asSystemRequest: true', async () => { expect( await browser.executeAsync(async (cb) => { - window.__coreProvider.start.plugins.core_plugin_b.sendSystemRequest(true).then(cb); + window._coreProvider.start.plugins.core_plugin_b.sendSystemRequest(true).then(cb); }) ).to.be('/core_plugin_b/system_request says: "System request? true"'); }); @@ -85,7 +84,7 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide it('should not send kbn-system-request header when asSystemRequest: false', async () => { expect( await browser.executeAsync(async (cb) => { - window.__coreProvider.start.plugins.core_plugin_b.sendSystemRequest(false).then(cb); + window._coreProvider.start.plugins.core_plugin_b.sendSystemRequest(false).then(cb); }) ).to.be('/core_plugin_b/system_request says: "System request? false"'); }); diff --git a/test/plugin_functional/test_suites/core_plugins/ui_settings.ts b/test/plugin_functional/test_suites/core_plugins/ui_settings.ts index 3a618ceaeb22f4..2ff3072552b050 100644 --- a/test/plugin_functional/test_suites/core_plugins/ui_settings.ts +++ b/test/plugin_functional/test_suites/core_plugins/ui_settings.ts @@ -20,7 +20,6 @@ import expect from '@kbn/expect'; import { PluginFunctionalProviderContext } from '../../services'; import '../../plugins/core_provider_plugin/types'; -// eslint-disable-next-line import/no-default-export export default function ({ getService, getPageObjects }: PluginFunctionalProviderContext) { const PageObjects = getPageObjects(['common']); const browser = getService('browser'); @@ -33,7 +32,7 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide it('client plugins have access to registered settings', async () => { const settings = await browser.execute(() => { - return window.__coreProvider.setup.core.uiSettings.getAll().ui_settings_plugin; + return window._coreProvider.setup.core.uiSettings.getAll().ui_settings_plugin; }); expect(settings).to.eql({ @@ -44,13 +43,13 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide }); const settingsValue = await browser.execute(() => { - return window.__coreProvider.setup.core.uiSettings.get('ui_settings_plugin'); + return window._coreProvider.setup.core.uiSettings.get('ui_settings_plugin'); }); expect(settingsValue).to.be('2'); const settingsValueViaObservables = await browser.executeAsync(async (callback) => { - window.__coreProvider.setup.core.uiSettings + window._coreProvider.setup.core.uiSettings .get$('ui_settings_plugin') .subscribe((v) => callback(v)); }); diff --git a/test/plugin_functional/test_suites/data_plugin/index_patterns.ts b/test/plugin_functional/test_suites/data_plugin/index_patterns.ts index 481e9d76e3accb..2db9eb733f8057 100644 --- a/test/plugin_functional/test_suites/data_plugin/index_patterns.ts +++ b/test/plugin_functional/test_suites/data_plugin/index_patterns.ts @@ -20,7 +20,6 @@ import expect from '@kbn/expect'; import { PluginFunctionalProviderContext } from '../../services'; import '../../plugins/core_provider_plugin/types'; -// eslint-disable-next-line import/no-default-export export default function ({ getService, getPageObjects }: PluginFunctionalProviderContext) { const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); diff --git a/test/plugin_functional/test_suites/doc_views/doc_views.ts b/test/plugin_functional/test_suites/doc_views/doc_views.ts index 87b4dc2a63d5aa..d45be1c66149a1 100644 --- a/test/plugin_functional/test_suites/doc_views/doc_views.ts +++ b/test/plugin_functional/test_suites/doc_views/doc_views.ts @@ -20,7 +20,6 @@ import expect from '@kbn/expect'; import { PluginFunctionalProviderContext } from '../../services'; -// eslint-disable-next-line import/no-default-export export default function ({ getService, getPageObjects }: PluginFunctionalProviderContext) { const testSubjects = getService('testSubjects'); const find = getService('find'); diff --git a/test/typings/rison_node.d.ts b/test/typings/rison_node.d.ts index a0497f421c3fe2..2c63488e6b6db9 100644 --- a/test/typings/rison_node.d.ts +++ b/test/typings/rison_node.d.ts @@ -29,11 +29,11 @@ declare module 'rison-node' { export const decode: (input: string) => RisonValue; - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line @typescript-eslint/naming-convention export const decode_object: (input: string) => RisonObject; export const encode: (input: Input) => string; - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line @typescript-eslint/naming-convention export const encode_object: (input: Input) => string; } diff --git a/typings/rison_node.d.ts b/typings/rison_node.d.ts index a0497f421c3fe2..2c63488e6b6db9 100644 --- a/typings/rison_node.d.ts +++ b/typings/rison_node.d.ts @@ -29,11 +29,11 @@ declare module 'rison-node' { export const decode: (input: string) => RisonValue; - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line @typescript-eslint/naming-convention export const decode_object: (input: string) => RisonObject; export const encode: (input: Input) => string; - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line @typescript-eslint/naming-convention export const encode_object: (input: Input) => string; } diff --git a/x-pack/legacy/plugins/beats_management/common/io_ts_types.ts b/x-pack/legacy/plugins/beats_management/common/io_ts_types.ts index 7d71ea5ad82562..175aba82c8dac7 100644 --- a/x-pack/legacy/plugins/beats_management/common/io_ts_types.ts +++ b/x-pack/legacy/plugins/beats_management/common/io_ts_types.ts @@ -8,7 +8,6 @@ import * as t from 'io-ts'; import { isRight } from 'fp-ts/lib/Either'; class DateFromStringType extends t.Type { - // eslint-disable-next-line public readonly _tag: 'DateFromISOStringType' = 'DateFromISOStringType'; constructor() { super( diff --git a/x-pack/legacy/plugins/beats_management/scripts/fake_env.ts b/x-pack/legacy/plugins/beats_management/scripts/fake_env.ts index 246f86c957174d..65254d24863cd9 100644 --- a/x-pack/legacy/plugins/beats_management/scripts/fake_env.ts +++ b/x-pack/legacy/plugins/beats_management/scripts/fake_env.ts @@ -3,7 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import Chance from 'chance'; // eslint-disable-line +import Chance from 'chance'; // @ts-ignore import request from 'request'; import uuidv4 from 'uuid/v4'; @@ -121,8 +121,8 @@ const start = async ( () => ({ type: configBlockSchemas[Math.floor(Math.random())].id, - description: `Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sint ista Graecorum; -Nihil ad rem! Ne sit sane; Quod quidem nobis non saepe contingit. + description: `Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sint ista Graecorum; +Nihil ad rem! Ne sit sane; Quod quidem nobis non saepe contingit. Duo Reges: constructio interrete. Itaque his sapiens semper vacabit.`.substring( 0, Math.floor(Math.random() * (0 - 115 + 1)) diff --git a/x-pack/legacy/plugins/beats_management/server/lib/beats.ts b/x-pack/legacy/plugins/beats_management/server/lib/beats.ts index 6b7053f40550b7..e8a6e6f999ca34 100644 --- a/x-pack/legacy/plugins/beats_management/server/lib/beats.ts +++ b/x-pack/legacy/plugins/beats_management/server/lib/beats.ts @@ -93,8 +93,8 @@ export class CMBeatsDomain { remoteAddress: string, beat: Partial ): Promise<{ status: string; accessToken?: string }> { + // eslint-disable-next-line @typescript-eslint/naming-convention const { token, expires_on } = await this.tokens.getEnrollmentToken(enrollmentToken); - // eslint-disable-next-line @typescript-eslint/camelcase if (expires_on && moment(expires_on).isBefore(moment())) { return { status: BeatEnrollmentStatus.ExpiredEnrollmentToken }; } diff --git a/x-pack/plugins/actions/server/builtin_action_types/index.test.ts b/x-pack/plugins/actions/server/builtin_action_types/index.test.ts index 21efc05d49c38a..acab6dd41b4b3d 100644 --- a/x-pack/plugins/actions/server/builtin_action_types/index.test.ts +++ b/x-pack/plugins/actions/server/builtin_action_types/index.test.ts @@ -44,8 +44,6 @@ beforeEach(() => { describe('action is registered', () => { test('gets registered with builtin actions', () => { const { actionTypeRegistry } = createActionTypeRegistry(); - ACTION_TYPE_IDS.forEach((ACTION_TYPE_ID) => - expect(actionTypeRegistry.has(ACTION_TYPE_ID)).toEqual(true) - ); + ACTION_TYPE_IDS.forEach((id) => expect(actionTypeRegistry.has(id)).toEqual(true)); }); }); diff --git a/x-pack/plugins/actions/server/builtin_action_types/servicenow/case_types.ts b/x-pack/plugins/actions/server/builtin_action_types/servicenow/case_types.ts index 7e659125af7b2d..49b85f9254af92 100644 --- a/x-pack/plugins/actions/server/builtin_action_types/servicenow/case_types.ts +++ b/x-pack/plugins/actions/server/builtin_action_types/servicenow/case_types.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/no-explicit-any */ - import { TypeOf } from '@kbn/config-schema'; import { ExecutorSubActionGetIncidentParamsSchema, diff --git a/x-pack/plugins/alerts/server/alert_type_registry.test.ts b/x-pack/plugins/alerts/server/alert_type_registry.test.ts index 229847bda1836f..60adde80e883f3 100644 --- a/x-pack/plugins/alerts/server/alert_type_registry.test.ts +++ b/x-pack/plugins/alerts/server/alert_type_registry.test.ts @@ -57,7 +57,6 @@ describe('register()', () => { executor: jest.fn(), producer: 'alerts', }; - // eslint-disable-next-line @typescript-eslint/no-var-requires const registry = new AlertTypeRegistry(alertTypeRegistryParams); const invalidCharacters = [' ', ':', '*', '*', '/']; @@ -89,7 +88,6 @@ describe('register()', () => { executor: jest.fn(), producer: 'alerts', }; - // eslint-disable-next-line @typescript-eslint/no-var-requires const registry = new AlertTypeRegistry(alertTypeRegistryParams); expect(() => registry.register(alertType)).toThrowError( @@ -111,7 +109,6 @@ describe('register()', () => { executor: jest.fn(), producer: 'alerts', }; - // eslint-disable-next-line @typescript-eslint/no-var-requires const registry = new AlertTypeRegistry(alertTypeRegistryParams); registry.register(alertType); expect(taskManager.registerTaskDefinitions).toHaveBeenCalledTimes(1); diff --git a/x-pack/plugins/alerts/server/alerts_client.ts b/x-pack/plugins/alerts/server/alerts_client.ts index eec60f924bf384..256cae24e519f3 100644 --- a/x-pack/plugins/alerts/server/alerts_client.ts +++ b/x-pack/plugins/alerts/server/alerts_client.ts @@ -295,6 +295,7 @@ export class AlertsClient { type: 'alert', }); + // eslint-disable-next-line @typescript-eslint/naming-convention const authorizedData = data.map(({ id, attributes, updated_at, references }) => { ensureAlertTypeIsAuthorized(attributes.alertTypeId, attributes.consumer); return this.getAlertFromRaw( diff --git a/x-pack/plugins/alerts/server/types.ts b/x-pack/plugins/alerts/server/types.ts index 154a9564518e8b..71ab35f7f434b6 100644 --- a/x-pack/plugins/alerts/server/types.ts +++ b/x-pack/plugins/alerts/server/types.ts @@ -23,7 +23,6 @@ import { export type State = Record; // eslint-disable-next-line @typescript-eslint/no-explicit-any export type Context = Record; -// eslint-disable-next-line @typescript-eslint/no-explicit-any export type AlertParams = Record; export type WithoutQueryAndParams = Pick>; export type GetServicesFunction = (request: KibanaRequest) => Services; diff --git a/x-pack/plugins/apm/e2e/cypress/integration/helpers.ts b/x-pack/plugins/apm/e2e/cypress/integration/helpers.ts index 5791dfe5b9463b..1956f1c2d9f0d2 100644 --- a/x-pack/plugins/apm/e2e/cypress/integration/helpers.ts +++ b/x-pack/plugins/apm/e2e/cypress/integration/helpers.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable import/no-extraneous-dependencies */ - const BASE_URL = Cypress.config().baseUrl; /** The default time in ms to wait for a Cypress command to complete */ diff --git a/x-pack/plugins/apm/public/components/app/ServiceMap/__stories__/CytoscapeExampleData.stories.tsx b/x-pack/plugins/apm/public/components/app/ServiceMap/__stories__/CytoscapeExampleData.stories.tsx index 44278b2846128a..830e3719b11f9d 100644 --- a/x-pack/plugins/apm/public/components/app/ServiceMap/__stories__/CytoscapeExampleData.stories.tsx +++ b/x-pack/plugins/apm/public/components/app/ServiceMap/__stories__/CytoscapeExampleData.stories.tsx @@ -3,7 +3,6 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable no-console */ import { EuiButton, diff --git a/x-pack/plugins/apm/public/hooks/useFetcher.tsx b/x-pack/plugins/apm/public/hooks/useFetcher.tsx index b2cd217b6cdd27..68b197c46e8885 100644 --- a/x-pack/plugins/apm/public/hooks/useFetcher.tsx +++ b/x-pack/plugins/apm/public/hooks/useFetcher.tsx @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable no-console */ - import React, { useContext, useEffect, useState, useMemo } from 'react'; import { i18n } from '@kbn/i18n'; import { IHttpFetchError } from 'src/core/public'; diff --git a/x-pack/plugins/apm/public/utils/testHelpers.tsx b/x-pack/plugins/apm/public/utils/testHelpers.tsx index e750102de2baa6..217e6a30a33b4f 100644 --- a/x-pack/plugins/apm/public/utils/testHelpers.tsx +++ b/x-pack/plugins/apm/public/utils/testHelpers.tsx @@ -106,12 +106,14 @@ interface MockSetup { config: APMConfig; uiFiltersES: ESFilter[]; indices: { + /* eslint-disable @typescript-eslint/naming-convention */ 'apm_oss.sourcemapIndices': string; 'apm_oss.errorIndices': string; 'apm_oss.onboardingIndices': string; 'apm_oss.spanIndices': string; 'apm_oss.transactionIndices': string; 'apm_oss.metricsIndices': string; + /* eslint-enable @typescript-eslint/naming-convention */ apmAgentConfigurationIndex: string; apmCustomLinkIndex: string; }; @@ -152,12 +154,14 @@ export async function inspectSearchParams( config: new Proxy({}, { get: () => 'myIndex' }) as APMConfig, uiFiltersES: [{ term: { 'my.custom.ui.filter': 'foo-bar' } }], indices: { + /* eslint-disable @typescript-eslint/naming-convention */ 'apm_oss.sourcemapIndices': 'myIndex', 'apm_oss.errorIndices': 'myIndex', 'apm_oss.onboardingIndices': 'myIndex', 'apm_oss.spanIndices': 'myIndex', 'apm_oss.transactionIndices': 'myIndex', 'apm_oss.metricsIndices': 'myIndex', + /* eslint-enable @typescript-eslint/naming-convention */ apmAgentConfigurationIndex: 'myIndex', apmCustomLinkIndex: 'myIndex', }, diff --git a/x-pack/plugins/apm/scripts/shared/read-kibana-config.ts b/x-pack/plugins/apm/scripts/shared/read-kibana-config.ts index fe226c8ab27d23..aa269bd61d132a 100644 --- a/x-pack/plugins/apm/scripts/shared/read-kibana-config.ts +++ b/x-pack/plugins/apm/scripts/shared/read-kibana-config.ts @@ -36,12 +36,14 @@ export const readKibanaConfig = () => { }; return { + /* eslint-disable @typescript-eslint/naming-convention */ 'apm_oss.transactionIndices': 'apm-*', 'apm_oss.metricsIndices': 'apm-*', 'apm_oss.errorIndices': 'apm-*', 'apm_oss.spanIndices': 'apm-*', 'apm_oss.onboardingIndices': 'apm-*', 'apm_oss.sourcemapIndices': 'apm-*', + /* eslint-enable @typescript-eslint/naming-convention */ 'elasticsearch.hosts': 'http://localhost:9200', ...loadedKibanaConfig, ...cliEsCredentials, diff --git a/x-pack/plugins/apm/scripts/upload-telemetry-data/index.ts b/x-pack/plugins/apm/scripts/upload-telemetry-data/index.ts index 10651d97f3c3de..fd628f77eb519e 100644 --- a/x-pack/plugins/apm/scripts/upload-telemetry-data/index.ts +++ b/x-pack/plugins/apm/scripts/upload-telemetry-data/index.ts @@ -19,7 +19,6 @@ import { stampLogger } from '../shared/stamp-logger'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { CollectTelemetryParams } from '../../server/lib/apm_telemetry/collect_data_telemetry'; import { downloadTelemetryTemplate } from '../shared/download-telemetry-template'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { mergeApmTelemetryMapping } from '../../common/apm_telemetry'; import { generateSampleDocuments } from './generate-sample-documents'; import { readKibanaConfig } from '../shared/read-kibana-config'; diff --git a/x-pack/plugins/apm/server/index.ts b/x-pack/plugins/apm/server/index.ts index 431210926c948f..fa4b8b821f9f8a 100644 --- a/x-pack/plugins/apm/server/index.ts +++ b/x-pack/plugins/apm/server/index.ts @@ -41,6 +41,7 @@ export function mergeConfigs( apmConfig: APMXPackConfig ) { return { + /* eslint-disable @typescript-eslint/naming-convention */ 'apm_oss.transactionIndices': apmOssConfig.transactionIndices, 'apm_oss.spanIndices': apmOssConfig.spanIndices, 'apm_oss.errorIndices': apmOssConfig.errorIndices, @@ -48,6 +49,7 @@ export function mergeConfigs( 'apm_oss.sourcemapIndices': apmOssConfig.sourcemapIndices, 'apm_oss.onboardingIndices': apmOssConfig.onboardingIndices, 'apm_oss.indexPattern': apmOssConfig.indexPattern, + /* eslint-enable @typescript-eslint/naming-convention */ 'xpack.apm.serviceMapEnabled': apmConfig.serviceMapEnabled, 'xpack.apm.serviceMapFingerprintBucketSize': apmConfig.serviceMapFingerprintBucketSize, diff --git a/x-pack/plugins/apm/server/lib/apm_telemetry/collect_data_telemetry/tasks.test.ts b/x-pack/plugins/apm/server/lib/apm_telemetry/collect_data_telemetry/tasks.test.ts index eafd0f04b9d10f..9d06fc2ad9309b 100644 --- a/x-pack/plugins/apm/server/lib/apm_telemetry/collect_data_telemetry/tasks.test.ts +++ b/x-pack/plugins/apm/server/lib/apm_telemetry/collect_data_telemetry/tasks.test.ts @@ -10,10 +10,12 @@ import { tasks } from './tasks'; describe('data telemetry collection tasks', () => { const indices = { + /* eslint-disable @typescript-eslint/naming-convention */ 'apm_oss.errorIndices': 'apm-8.0.0-error', 'apm_oss.metricsIndices': 'apm-8.0.0-metric', 'apm_oss.spanIndices': 'apm-8.0.0-span', 'apm_oss.transactionIndices': 'apm-8.0.0-transaction', + /* eslint-enable @typescript-eslint/naming-convention */ } as ApmIndicesConfig; describe('aggregated_transactions', () => { diff --git a/x-pack/plugins/apm/server/lib/errors/distribution/__tests__/get_buckets.test.ts b/x-pack/plugins/apm/server/lib/errors/distribution/__tests__/get_buckets.test.ts index e0df4d77446108..1a83113de35f2a 100644 --- a/x-pack/plugins/apm/server/lib/errors/distribution/__tests__/get_buckets.test.ts +++ b/x-pack/plugins/apm/server/lib/errors/distribution/__tests__/get_buckets.test.ts @@ -47,12 +47,14 @@ describe('timeseriesFetcher', () => { }, ], indices: { + /* eslint-disable @typescript-eslint/naming-convention */ 'apm_oss.sourcemapIndices': 'apm-*', 'apm_oss.errorIndices': 'apm-*', 'apm_oss.onboardingIndices': 'apm-*', 'apm_oss.spanIndices': 'apm-*', 'apm_oss.transactionIndices': 'apm-*', 'apm_oss.metricsIndices': 'apm-*', + /* eslint-enable @typescript-eslint/naming-convention */ apmAgentConfigurationIndex: '.apm-agent-configuration', apmCustomLinkIndex: '.apm-custom-link', }, diff --git a/x-pack/plugins/apm/server/lib/helpers/setup_request.test.ts b/x-pack/plugins/apm/server/lib/helpers/setup_request.test.ts index d8dbd8273f4769..b7c9b178c7cd4f 100644 --- a/x-pack/plugins/apm/server/lib/helpers/setup_request.test.ts +++ b/x-pack/plugins/apm/server/lib/helpers/setup_request.test.ts @@ -12,12 +12,14 @@ import { PROCESSOR_EVENT } from '../../../common/elasticsearch_fieldnames'; jest.mock('../settings/apm_indices/get_apm_indices', () => ({ getApmIndices: async () => ({ + /* eslint-disable @typescript-eslint/naming-convention */ 'apm_oss.sourcemapIndices': 'apm-*', 'apm_oss.errorIndices': 'apm-*', 'apm_oss.onboardingIndices': 'apm-*', 'apm_oss.spanIndices': 'apm-*', 'apm_oss.transactionIndices': 'apm-*', 'apm_oss.metricsIndices': 'apm-*', + /* eslint-enable @typescript-eslint/naming-convention */ apmAgentConfigurationIndex: 'apm-*', }), })); diff --git a/x-pack/plugins/apm/server/lib/settings/apm_indices/get_apm_indices.ts b/x-pack/plugins/apm/server/lib/settings/apm_indices/get_apm_indices.ts index 430be3b96934b6..2f3b2a602048c1 100644 --- a/x-pack/plugins/apm/server/lib/settings/apm_indices/get_apm_indices.ts +++ b/x-pack/plugins/apm/server/lib/settings/apm_indices/get_apm_indices.ts @@ -18,12 +18,14 @@ import { APMRequestHandlerContext } from '../../../routes/typings'; type ISavedObjectsClient = Pick; export interface ApmIndicesConfig { + /* eslint-disable @typescript-eslint/naming-convention */ 'apm_oss.sourcemapIndices': string; 'apm_oss.errorIndices': string; 'apm_oss.onboardingIndices': string; 'apm_oss.spanIndices': string; 'apm_oss.transactionIndices': string; 'apm_oss.metricsIndices': string; + /* eslint-enable @typescript-eslint/naming-convention */ apmAgentConfigurationIndex: string; apmCustomLinkIndex: string; } @@ -46,12 +48,14 @@ async function getApmIndicesSavedObject( export function getApmIndicesConfig(config: APMConfig): ApmIndicesConfig { return { + /* eslint-disable @typescript-eslint/naming-convention */ 'apm_oss.sourcemapIndices': config['apm_oss.sourcemapIndices'], 'apm_oss.errorIndices': config['apm_oss.errorIndices'], 'apm_oss.onboardingIndices': config['apm_oss.onboardingIndices'], 'apm_oss.spanIndices': config['apm_oss.spanIndices'], 'apm_oss.transactionIndices': config['apm_oss.transactionIndices'], 'apm_oss.metricsIndices': config['apm_oss.metricsIndices'], + /* eslint-enable @typescript-eslint/naming-convention */ // system indices, not configurable apmAgentConfigurationIndex: '.apm-agent-configuration', apmCustomLinkIndex: '.apm-custom-link', diff --git a/x-pack/plugins/apm/server/lib/transaction_groups/get_error_rate.ts b/x-pack/plugins/apm/server/lib/transaction_groups/get_error_rate.ts index 8fb2ceb30db850..d4e0bd1d54da1c 100644 --- a/x-pack/plugins/apm/server/lib/transaction_groups/get_error_rate.ts +++ b/x-pack/plugins/apm/server/lib/transaction_groups/get_error_rate.ts @@ -74,10 +74,14 @@ export async function getErrorRate({ const erroneousTransactionsRate = resp.aggregations?.total_transactions.buckets.map( - ({ key, doc_count: totalTransactions, erroneous_transactions }) => { + ({ + key, + doc_count: totalTransactions, + erroneous_transactions: erroneousTransactions, + }) => { const errornousTransactionsCount = - // @ts-ignore - erroneous_transactions.doc_count; + // @ts-expect-error + erroneousTransactions.doc_count; return { x: key, y: errornousTransactionsCount / totalTransactions, diff --git a/x-pack/plugins/apm/server/lib/transactions/avg_duration_by_country/index.ts b/x-pack/plugins/apm/server/lib/transactions/avg_duration_by_country/index.ts index 9bb42d2fa7aad1..3954d99cd52a85 100644 --- a/x-pack/plugins/apm/server/lib/transactions/avg_duration_by_country/index.ts +++ b/x-pack/plugins/apm/server/lib/transactions/avg_duration_by_country/index.ts @@ -75,6 +75,7 @@ export async function getTransactionAvgDurationByCountry({ const buckets = resp.aggregations.country_code.buckets; const avgDurationsByCountry = buckets.map( + // eslint-disable-next-line @typescript-eslint/naming-convention ({ key, doc_count, avg_duration: { value } }) => ({ key: key as string, docCount: doc_count, diff --git a/x-pack/plugins/apm/server/lib/transactions/breakdown/index.test.ts b/x-pack/plugins/apm/server/lib/transactions/breakdown/index.test.ts index 3c1618ed7715fb..731f75226cbe4c 100644 --- a/x-pack/plugins/apm/server/lib/transactions/breakdown/index.test.ts +++ b/x-pack/plugins/apm/server/lib/transactions/breakdown/index.test.ts @@ -11,12 +11,14 @@ import dataResponse from './mock_responses/data.json'; import { APMConfig } from '../../..'; const mockIndices = { + /* eslint-disable @typescript-eslint/naming-convention */ 'apm_oss.sourcemapIndices': 'myIndex', 'apm_oss.errorIndices': 'myIndex', 'apm_oss.onboardingIndices': 'myIndex', 'apm_oss.spanIndices': 'myIndex', 'apm_oss.transactionIndices': 'myIndex', 'apm_oss.metricsIndices': 'myIndex', + /* eslint-enable @typescript-eslint/naming-convention */ apmAgentConfigurationIndex: 'myIndex', apmCustomLinkIndex: 'myIndex', }; diff --git a/x-pack/plugins/apm/server/lib/transactions/charts/get_timeseries_data/fetcher.test.ts b/x-pack/plugins/apm/server/lib/transactions/charts/get_timeseries_data/fetcher.test.ts index 09e1287f032f58..a7a740a239ea72 100644 --- a/x-pack/plugins/apm/server/lib/transactions/charts/get_timeseries_data/fetcher.test.ts +++ b/x-pack/plugins/apm/server/lib/transactions/charts/get_timeseries_data/fetcher.test.ts @@ -35,12 +35,14 @@ describe('timeseriesFetcher', () => { }, ], indices: { + /* eslint-disable @typescript-eslint/naming-convention */ 'apm_oss.sourcemapIndices': 'myIndex', 'apm_oss.errorIndices': 'myIndex', 'apm_oss.onboardingIndices': 'myIndex', 'apm_oss.spanIndices': 'myIndex', 'apm_oss.transactionIndices': 'myIndex', 'apm_oss.metricsIndices': 'myIndex', + /* eslint-enable @typescript-eslint/naming-convention */ apmAgentConfigurationIndex: 'myIndex', apmCustomLinkIndex: 'myIndex', }, diff --git a/x-pack/plugins/apm/server/routes/settings/apm_indices.ts b/x-pack/plugins/apm/server/routes/settings/apm_indices.ts index e52ce760e026a5..1946bd1111d4b4 100644 --- a/x-pack/plugins/apm/server/routes/settings/apm_indices.ts +++ b/x-pack/plugins/apm/server/routes/settings/apm_indices.ts @@ -42,12 +42,14 @@ export const saveApmIndicesRoute = createRoute(() => ({ }, params: { body: t.partial({ + /* eslint-disable @typescript-eslint/naming-convention */ 'apm_oss.sourcemapIndices': t.string, 'apm_oss.errorIndices': t.string, 'apm_oss.onboardingIndices': t.string, 'apm_oss.spanIndices': t.string, 'apm_oss.transactionIndices': t.string, 'apm_oss.metricsIndices': t.string, + /* eslint-enable @typescript-eslint/naming-convention */ }), }, handler: async ({ context }) => { diff --git a/x-pack/plugins/apm/server/saved_objects/apm_indices.ts b/x-pack/plugins/apm/server/saved_objects/apm_indices.ts index b1473219ea45fe..1137abdb474acc 100644 --- a/x-pack/plugins/apm/server/saved_objects/apm_indices.ts +++ b/x-pack/plugins/apm/server/saved_objects/apm_indices.ts @@ -11,6 +11,7 @@ export const apmIndices: SavedObjectsType = { namespaceType: 'agnostic', mappings: { properties: { + /* eslint-disable @typescript-eslint/naming-convention */ 'apm_oss.sourcemapIndices': { type: 'keyword', }, diff --git a/x-pack/plugins/beats_management/public/components/tag/tag_edit.tsx b/x-pack/plugins/beats_management/public/components/tag/tag_edit.tsx index 5ea4b643fb5a2a..9fca9d3add5e7f 100644 --- a/x-pack/plugins/beats_management/public/components/tag/tag_edit.tsx +++ b/x-pack/plugins/beats_management/public/components/tag/tag_edit.tsx @@ -67,6 +67,7 @@ export class TagEdit extends React.PureComponent { } public render() { + // eslint-disable-next-line @typescript-eslint/naming-convention const { tag, attachedBeats, configuration_blocks } = this.props; return ( @@ -151,9 +152,7 @@ export class TagEdit extends React.PureComponent {
    { if (action === 'delete') { this.props.onConfigRemoved(block); diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/external/saved_map.ts b/x-pack/plugins/canvas/canvas_plugin_src/functions/external/saved_map.ts index 2a3741e15f467a..ec640cfb5b299d 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/external/saved_map.ts +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/external/saved_map.ts @@ -13,7 +13,6 @@ import { EmbeddableExpression, } from '../../expression_types'; import { getFunctionHelp } from '../../../i18n'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { MapEmbeddableInput } from '../../../../../plugins/maps/public/embeddable'; interface Arguments { diff --git a/x-pack/plugins/canvas/public/application.tsx b/x-pack/plugins/canvas/public/application.tsx index 0bbf449ce11f99..90173a20500e56 100644 --- a/x-pack/plugins/canvas/public/application.tsx +++ b/x-pack/plugins/canvas/public/application.tsx @@ -26,7 +26,6 @@ import { getDocumentationLinks } from './lib/documentation_links'; import { HelpMenu } from './components/help_menu/help_menu'; import { createStore } from './store'; -/* eslint-enable */ import { init as initStatsReporter } from './lib/ui_metric'; import { CapabilitiesStrings } from '../i18n'; diff --git a/x-pack/plugins/canvas/public/components/confirm_modal/confirm_modal.tsx b/x-pack/plugins/canvas/public/components/confirm_modal/confirm_modal.tsx index 1be587c31528ff..31a75acbba4ecc 100644 --- a/x-pack/plugins/canvas/public/components/confirm_modal/confirm_modal.tsx +++ b/x-pack/plugins/canvas/public/components/confirm_modal/confirm_modal.tsx @@ -4,7 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable react/forbid-elements */ import { EuiConfirmModal, EuiOverlayMask } from '@elastic/eui'; import PropTypes from 'prop-types'; import React, { FunctionComponent } from 'react'; diff --git a/x-pack/plugins/canvas/public/components/custom_element_modal/custom_element_modal.tsx b/x-pack/plugins/canvas/public/components/custom_element_modal/custom_element_modal.tsx index ceb7c83f3cab5f..e2bc81b39749fb 100644 --- a/x-pack/plugins/canvas/public/components/custom_element_modal/custom_element_modal.tsx +++ b/x-pack/plugins/canvas/public/components/custom_element_modal/custom_element_modal.tsx @@ -4,7 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable react/forbid-elements */ import React, { PureComponent } from 'react'; import { get } from 'lodash'; import PropTypes from 'prop-types'; diff --git a/x-pack/plugins/canvas/public/lib/aeroelastic/index.d.ts b/x-pack/plugins/canvas/public/lib/aeroelastic/index.d.ts index 3163e318b25dde..c21aac3fbfb25f 100644 --- a/x-pack/plugins/canvas/public/lib/aeroelastic/index.d.ts +++ b/x-pack/plugins/canvas/public/lib/aeroelastic/index.d.ts @@ -7,15 +7,15 @@ /* eslint-disable @typescript-eslint/no-empty-interface */ // linear algebra -type f64 = number; // eventual AssemblyScript compatibility; doesn't hurt with vanilla TS either -type f = f64; // shorthand +type F64 = number; // eventual AssemblyScript compatibility; doesn't hurt with vanilla TS either +type F = F64; // shorthand -export type Vector2d = Readonly<[f, f, f]>; -export type Vector3d = Readonly<[f, f, f, f]>; +export type Vector2d = Readonly<[F, F, F]>; +export type Vector3d = Readonly<[F, F, F, F]>; -export type Matrix2d = [f, f, f, f, f, f, f, f, f]; +export type Matrix2d = [F, F, F, F, F, F, F, F, F]; export type TransformMatrix2d = Readonly; -export type Matrix3d = [f, f, f, f, f, f, f, f, f, f, f, f, f, f, f, f]; +export type Matrix3d = [F, F, F, F, F, F, F, F, F, F, F, F, F, F, F, F]; export type TransformMatrix3d = Readonly; // plain, JSON-bijective value diff --git a/x-pack/plugins/canvas/public/lib/elastic_logo.ts b/x-pack/plugins/canvas/public/lib/elastic_logo.ts index e73b8615045ae0..5f0408ab01e295 100644 --- a/x-pack/plugins/canvas/public/lib/elastic_logo.ts +++ b/x-pack/plugins/canvas/public/lib/elastic_logo.ts @@ -4,6 +4,5 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable */ export const elasticLogo = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgdmlld0JveD0iMCAwIDI3MC42MDAwMSAyNjkuNTQ2NjYiCiAgIGhlaWdodD0iMjY5LjU0NjY2IgogICB3aWR0aD0iMjcwLjYwMDAxIgogICB4bWw6c3BhY2U9InByZXNlcnZlIgogICBpZD0ic3ZnMiIKICAgdmVyc2lvbj0iMS4xIj48bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE4Ij48cmRmOlJERj48Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+PGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+PGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPjwvY2M6V29yaz48L3JkZjpSREY+PC9tZXRhZGF0YT48ZGVmcwogICAgIGlkPSJkZWZzNiIgLz48ZwogICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMzMzMzMzMywwLDAsLTEuMzMzMzMzMywwLDI2OS41NDY2NykiCiAgICAgaWQ9ImcxMCI+PGcKICAgICAgIHRyYW5zZm9ybT0ic2NhbGUoMC4xKSIKICAgICAgIGlkPSJnMTIiPjxwYXRoCiAgICAgICAgIGlkPSJwYXRoMTQiCiAgICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiCiAgICAgICAgIGQ9Im0gMjAyOS40OCw5NjIuNDQxIGMgMCwxNzAuMDk5IC0xMDUuNDYsMzE4Ljc5OSAtMjY0LjE3LDM3Ni42NTkgNi45OCwzNS44NiAxMC42Miw3MS43MSAxMC42MiwxMDkuMDUgMCwzMTYuMTkgLTI1Ny4yNCw1NzMuNDMgLTU3My40Nyw1NzMuNDMgLTE4NC43MiwwIC0zNTYuNTU4LC04OC41OSAtNDY0LjUzLC0yMzcuODUgLTUzLjA5LDQxLjE4IC0xMTguMjg1LDYzLjc1IC0xODYuMzA1LDYzLjc1IC0xNjcuODM2LDAgLTMwNC4zODMsLTEzNi41NCAtMzA0LjM4MywtMzA0LjM4IDAsLTM3LjA4IDYuNjE3LC03Mi41OCAxOS4wMzEsLTEwNi4wOCBDIDEwOC40ODgsMTM4MC4wOSAwLDEyMjcuODkgMCwxMDU4Ljg4IDAsODg3LjkxIDEwNS45NzcsNzM4LjUzOSAyNjUuMzk4LDY4MS4wOSBjIC02Ljc2OSwtMzUuNDQyIC0xMC40NiwtNzIuMDIgLTEwLjQ2LC0xMDkgQyAyNTQuOTM4LDI1Ni42MjEgNTExLjU2NiwwIDgyNy4wMjcsMCAxMDEyLjIsMCAxMTgzLjk0LDg4Ljk0MTQgMTI5MS4zLDIzOC44MzIgYyA1My40NSwtNDEuOTYxIDExOC44LC02NC45OTIgMTg2LjU2LC02NC45OTIgMTY3LjgzLDAgMzA0LjM4LDEzNi40OTIgMzA0LjM4LDMwNC4zMzIgMCwzNy4wNzggLTYuNjIsNzIuNjI5IC0xOS4wMywxMDYuMTI5IDE1Ny43OCw1Ni44NzkgMjY2LjI3LDIwOS4xMjkgMjY2LjI3LDM3OC4xNCIgLz48cGF0aAogICAgICAgICBpZD0icGF0aDE2IgogICAgICAgICBzdHlsZT0iZmlsbDojZmFjZjA5O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICBkPSJtIDc5Ny44OTgsMTE1MC45MyA0NDQuMDcyLC0yMDIuNDUgNDQ4LjA1LDM5Mi41OCBjIDYuNDksMzIuMzkgOS42Niw2NC42NyA5LjY2LDk4LjQ2IDAsMjc2LjIzIC0yMjQuNjgsNTAwLjk1IC01MDAuOSw1MDAuOTUgLTE2NS4yNCwwIC0zMTkuMzcsLTgxLjM2IC00MTMuMDUzLC0yMTcuNzkgbCAtNzQuNTI0LC0zODYuNjQgODYuNjk1LC0xODUuMTEiIC8+PHBhdGgKICAgICAgICAgaWQ9InBhdGgxOCIKICAgICAgICAgc3R5bGU9ImZpbGw6IzQ5YzFhZTtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgICAgZD0ibSAzMzguMjIzLDY4MC42NzIgYyAtNi40ODksLTMyLjM4MyAtOS44MDksLTY1Ljk4MSAtOS44MDksLTk5Ljk3MyAwLC0yNzYuOTI5IDIyNS4zMzYsLTUwMi4yNTc2IDUwMi4zMTMsLTUwMi4yNTc2IDE2Ni41OTMsMCAzMjEuNDczLDgyLjExNzYgNDE1LjAxMywyMTkuOTQ5NiBsIDczLjk3LDM4NS4zNDcgLTk4LjcyLDE4OC42MjEgTCA3NzUuMTU2LDEwNzUuNTcgMzM4LjIyMyw2ODAuNjcyIiAvPjxwYXRoCiAgICAgICAgIGlkPSJwYXRoMjAiCiAgICAgICAgIHN0eWxlPSJmaWxsOiNlZjI5OWI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiCiAgICAgICAgIGQ9Im0gMzM1LjQxLDE0NDkuMTggMzA0LjMzMiwtNzEuODYgNjYuNjgsMzQ2LjAyIGMgLTQxLjU4NiwzMS43OCAtOTIuOTMsNDkuMTggLTE0NS43MzEsNDkuMTggLTEzMi4yNSwwIC0yMzkuODEyLC0xMDcuNjEgLTIzOS44MTIsLTIzOS44NyAwLC0yOS4yMSA0Ljg3OSwtNTcuMjIgMTQuNTMxLC04My40NyIgLz48cGF0aAogICAgICAgICBpZD0icGF0aDIyIgogICAgICAgICBzdHlsZT0iZmlsbDojNGNhYmU0O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICBkPSJNIDMwOC45OTIsMTM3Ni43IEMgMTczLjAyLDEzMzEuNjQgNzguNDgwNSwxMjAxLjMgNzguNDgwNSwxMDU3LjkzIDc4LjQ4MDUsOTE4LjM0IDE2NC44Miw3OTMuNjggMjk0LjQwNiw3NDQuMzUyIGwgNDI2Ljk4MSwzODUuOTM4IC03OC4zOTUsMTY3LjUxIC0zMzQsNzguOSIgLz48cGF0aAogICAgICAgICBpZD0icGF0aDI0IgogICAgICAgICBzdHlsZT0iZmlsbDojODVjZTI2O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgICBkPSJtIDEzMjMuOCwyOTguNDEgYyA0MS43NCwtMzIuMDkgOTIuODMsLTQ5LjU5IDE0NC45OCwtNDkuNTkgMTMyLjI1LDAgMjM5LjgxLDEwNy41NTkgMjM5LjgxLDIzOS44MjEgMCwyOS4xNiAtNC44OCw1Ny4xNjggLTE0LjUzLDgzLjQxOCBsIC0zMDQuMDgsNzEuMTYgLTY2LjE4LC0zNDQuODA5IiAvPjxwYXRoCiAgICAgICAgIGlkPSJwYXRoMjYiCiAgICAgICAgIHN0eWxlPSJmaWxsOiMzMTc3YTc7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiCiAgICAgICAgIGQ9Im0gMTM4NS42Nyw3MjIuOTMgMzM0Ljc2LC03OC4zMDEgYyAxMzYuMDIsNDQuOTYxIDIzMC41NiwxNzUuMzUxIDIzMC41NiwzMTguNzYyIDAsMTM5LjMzOSAtODYuNTQsMjYzLjg1OSAtMjE2LjM4LDMxMy4wMzkgbCAtNDM3Ljg0LC0zODMuNTkgODguOSwtMTY5LjkxIiAvPjwvZz48L2c+PC9zdmc+'; diff --git a/x-pack/plugins/canvas/public/state/selectors/workpad.ts b/x-pack/plugins/canvas/public/state/selectors/workpad.ts index b05615b7930c5e..6eddca42e21c6d 100644 --- a/x-pack/plugins/canvas/public/state/selectors/workpad.ts +++ b/x-pack/plugins/canvas/public/state/selectors/workpad.ts @@ -214,13 +214,13 @@ export function getGlobalFilters(state: State): string[] { }, []); } -type onValueFunction = ( +type OnValueFunction = ( argValue: ExpressionAstArgument, argNames?: string, args?: ExpressionAstFunction['arguments'] ) => ExpressionAstArgument | ExpressionAstArgument[] | undefined; -function buildGroupValues(args: ExpressionAstFunction['arguments'], onValue: onValueFunction) { +function buildGroupValues(args: ExpressionAstFunction['arguments'], onValue: OnValueFunction) { const argNames = Object.keys(args); return argNames.reduce((values, argName) => { @@ -495,7 +495,6 @@ export function getRenderedWorkpad(state: State) { const workpad = getWorkpad(state); - // eslint-disable-next-line no-unused-vars const { pages, variables, ...rest } = workpad; return { diff --git a/x-pack/plugins/canvas/server/routes/shareables/zip.test.ts b/x-pack/plugins/canvas/server/routes/shareables/zip.test.ts index 29dcb4268e6184..0c19886f07e5c4 100644 --- a/x-pack/plugins/canvas/server/routes/shareables/zip.test.ts +++ b/x-pack/plugins/canvas/server/routes/shareables/zip.test.ts @@ -6,6 +6,7 @@ jest.mock('archiver'); +// eslint-disable-next-line @typescript-eslint/no-var-requires const archiver = require('archiver') as jest.Mock; import { kibanaResponseFactory, RequestHandlerContext, RequestHandler } from 'src/core/server'; import { httpServiceMock, httpServerMock, loggingSystemMock } from 'src/core/server/mocks'; diff --git a/x-pack/plugins/canvas/shareable_runtime/components/canvas.tsx b/x-pack/plugins/canvas/shareable_runtime/components/canvas.tsx index b1eb9af6fc4a16..e327f90e80aeb2 100644 --- a/x-pack/plugins/canvas/shareable_runtime/components/canvas.tsx +++ b/x-pack/plugins/canvas/shareable_runtime/components/canvas.tsx @@ -15,7 +15,9 @@ import { CanvasRenderedWorkpad, Stage, Settings, Refs } from '../types'; let timeout: number = 0; +// eslint-disable-next-line @typescript-eslint/naming-convention export type onSetPageFn = (page: number) => void; +// eslint-disable-next-line @typescript-eslint/naming-convention export type onSetScrubberVisibleFn = (visible: boolean) => void; type Workpad = Pick; diff --git a/x-pack/plugins/canvas/shareable_runtime/components/footer/page_controls.tsx b/x-pack/plugins/canvas/shareable_runtime/components/footer/page_controls.tsx index 836d10f9ee8f59..9f94ef4f24187f 100644 --- a/x-pack/plugins/canvas/shareable_runtime/components/footer/page_controls.tsx +++ b/x-pack/plugins/canvas/shareable_runtime/components/footer/page_controls.tsx @@ -14,19 +14,19 @@ import { setAutoplayAction, } from '../../context'; -type onSetPageNumberFn = (page: number) => void; -type onToggleScrubberFn = () => void; +type OnSetPageNumberFn = (page: number) => void; +type OnToggleScrubberFn = () => void; interface Props { /** * The handler to invoke when the current page number is set. */ - onSetPageNumber: onSetPageNumberFn; + onSetPageNumber: OnSetPageNumberFn; /** * The handler to invoke when the scrubber visibility is toggled. */ - onToggleScrubber: onToggleScrubberFn; + onToggleScrubber: OnToggleScrubberFn; /** * The current page number. diff --git a/x-pack/plugins/canvas/shareable_runtime/components/footer/page_preview.tsx b/x-pack/plugins/canvas/shareable_runtime/components/footer/page_preview.tsx index 7908b3edb981f9..8c06a0a342c248 100644 --- a/x-pack/plugins/canvas/shareable_runtime/components/footer/page_preview.tsx +++ b/x-pack/plugins/canvas/shareable_runtime/components/footer/page_preview.tsx @@ -12,7 +12,7 @@ import { setPageAction } from '../../context/actions'; import css from './page_preview.module.scss'; -type onClickFn = (index: number) => void; +type OnClickFn = (index: number) => void; export interface Props { /** @@ -28,7 +28,7 @@ export interface Props { /** * The handler to invoke if the preview is clicked. */ - onClick: onClickFn; + onClick: OnClickFn; /** * An object describing the page. diff --git a/x-pack/plugins/canvas/shareable_runtime/components/footer/settings/autoplay_settings.tsx b/x-pack/plugins/canvas/shareable_runtime/components/footer/settings/autoplay_settings.tsx index 4c7c65511698d9..c20d9f6fc39e2d 100644 --- a/x-pack/plugins/canvas/shareable_runtime/components/footer/settings/autoplay_settings.tsx +++ b/x-pack/plugins/canvas/shareable_runtime/components/footer/settings/autoplay_settings.tsx @@ -14,7 +14,9 @@ import { import { createTimeInterval } from '../../../../public/lib/time_interval'; import { CustomInterval } from '../../../../public/components/workpad_header/view_menu/custom_interval'; +// eslint-disable-next-line @typescript-eslint/naming-convention export type onSetAutoplayFn = (autoplay: boolean) => void; +// eslint-disable-next-line @typescript-eslint/naming-convention export type onSetIntervalFn = (interval: string) => void; export interface Props { diff --git a/x-pack/plugins/canvas/shareable_runtime/components/footer/settings/toolbar_settings.tsx b/x-pack/plugins/canvas/shareable_runtime/components/footer/settings/toolbar_settings.tsx index 2c90c5c0ceded4..8b545061a41853 100644 --- a/x-pack/plugins/canvas/shareable_runtime/components/footer/settings/toolbar_settings.tsx +++ b/x-pack/plugins/canvas/shareable_runtime/components/footer/settings/toolbar_settings.tsx @@ -8,7 +8,7 @@ import React, { FC } from 'react'; import { EuiSwitch, EuiFormRow } from '@elastic/eui'; import { useCanvasShareableState, setToolbarAutohideAction } from '../../../context'; -export type onSetAutohideFn = (isAutohide: boolean) => void; +export type OnSetAutohideFn = (isAutohide: boolean) => void; export interface Props { /** @@ -20,7 +20,7 @@ export interface Props { /** * The handler to invoke when autohide is set. */ - onSetAutohide: onSetAutohideFn; + onSetAutohide: OnSetAutohideFn; } /** @@ -52,7 +52,7 @@ export const ToolbarSettings: FC> = ({ onSetAutohid const { toolbar } = settings; const { isAutohide } = toolbar; - const onSetAutohideFn: onSetAutohideFn = (autohide: boolean) => { + const onSetAutohideFn: OnSetAutohideFn = (autohide: boolean) => { onSetAutohide(autohide); dispatch(setToolbarAutohideAction(autohide)); }; diff --git a/x-pack/plugins/canvas/shareable_runtime/test/utils.ts b/x-pack/plugins/canvas/shareable_runtime/test/utils.ts index fe3c1be9ba154d..5e65594972da2e 100644 --- a/x-pack/plugins/canvas/shareable_runtime/test/utils.ts +++ b/x-pack/plugins/canvas/shareable_runtime/test/utils.ts @@ -15,6 +15,7 @@ export const tick = (ms = 0) => export const takeMountedSnapshot = (mountedComponent: ReactWrapper<{}, {}, Component>) => { const html = mountedComponent.html(); const template = document.createElement('template'); + // eslint-disable-next-line no-unsanitized/property template.innerHTML = html; return template.content.firstChild; }; diff --git a/x-pack/plugins/canvas/storybook/addon/src/register.tsx b/x-pack/plugins/canvas/storybook/addon/src/register.tsx index 3a5c4a6818ac12..4934438789b94c 100644 --- a/x-pack/plugins/canvas/storybook/addon/src/register.tsx +++ b/x-pack/plugins/canvas/storybook/addon/src/register.tsx @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable import/no-extraneous-dependencies */ - import React from 'react'; import { addons, types } from '@storybook/addons'; import { AddonPanel } from '@storybook/components'; diff --git a/x-pack/plugins/case/server/routes/api/cases/comments/delete_all_comments.ts b/x-pack/plugins/case/server/routes/api/cases/comments/delete_all_comments.ts index e06b3a33dfc724..0bf8ad89ce470b 100644 --- a/x-pack/plugins/case/server/routes/api/cases/comments/delete_all_comments.ts +++ b/x-pack/plugins/case/server/routes/api/cases/comments/delete_all_comments.ts @@ -24,6 +24,7 @@ export function initDeleteAllCommentsApi({ caseService, router, userActionServic async (context, request, response) => { try { const client = context.core.savedObjects.client; + // eslint-disable-next-line @typescript-eslint/naming-convention const { username, full_name, email } = await caseService.getUser({ request, response }); const deleteDate = new Date().toISOString(); diff --git a/x-pack/plugins/case/server/routes/api/cases/comments/delete_comment.ts b/x-pack/plugins/case/server/routes/api/cases/comments/delete_comment.ts index df08af025df035..70c0d8c2f84f98 100644 --- a/x-pack/plugins/case/server/routes/api/cases/comments/delete_comment.ts +++ b/x-pack/plugins/case/server/routes/api/cases/comments/delete_comment.ts @@ -27,6 +27,7 @@ export function initDeleteCommentApi({ caseService, router, userActionService }: async (context, request, response) => { try { const client = context.core.savedObjects.client; + // eslint-disable-next-line @typescript-eslint/naming-convention const { username, full_name, email } = await caseService.getUser({ request, response }); const deleteDate = new Date().toISOString(); diff --git a/x-pack/plugins/case/server/routes/api/cases/comments/patch_comment.ts b/x-pack/plugins/case/server/routes/api/cases/comments/patch_comment.ts index 1aca27bbf18537..85cc63b2f4d170 100644 --- a/x-pack/plugins/case/server/routes/api/cases/comments/patch_comment.ts +++ b/x-pack/plugins/case/server/routes/api/cases/comments/patch_comment.ts @@ -68,6 +68,7 @@ export function initPatchCommentApi({ ); } + // eslint-disable-next-line @typescript-eslint/naming-convention const { username, full_name, email } = await caseService.getUser({ request, response }); const updatedDate = new Date().toISOString(); const [updatedComment, updatedCase, myCaseConfigure] = await Promise.all([ diff --git a/x-pack/plugins/case/server/routes/api/cases/comments/post_comment.ts b/x-pack/plugins/case/server/routes/api/cases/comments/post_comment.ts index 486f709b1e7ed6..dd6f06777fe983 100644 --- a/x-pack/plugins/case/server/routes/api/cases/comments/post_comment.ts +++ b/x-pack/plugins/case/server/routes/api/cases/comments/post_comment.ts @@ -48,6 +48,7 @@ export function initPostCommentApi({ caseId, }); + // eslint-disable-next-line @typescript-eslint/naming-convention const { username, full_name, email } = await caseService.getUser({ request, response }); const createdDate = new Date().toISOString(); diff --git a/x-pack/plugins/case/server/routes/api/cases/configure/patch_configure.ts b/x-pack/plugins/case/server/routes/api/cases/configure/patch_configure.ts index 29df97c5f84763..06c99c8018cc04 100644 --- a/x-pack/plugins/case/server/routes/api/cases/configure/patch_configure.ts +++ b/x-pack/plugins/case/server/routes/api/cases/configure/patch_configure.ts @@ -49,6 +49,7 @@ export function initPatchCaseConfigure({ caseConfigureService, caseService, rout ); } + // eslint-disable-next-line @typescript-eslint/naming-convention const { username, full_name, email } = await caseService.getUser({ request, response }); const updateDate = new Date().toISOString(); diff --git a/x-pack/plugins/case/server/routes/api/cases/configure/post_configure.ts b/x-pack/plugins/case/server/routes/api/cases/configure/post_configure.ts index a49a6c9ec5b76b..3f02809cbd08fe 100644 --- a/x-pack/plugins/case/server/routes/api/cases/configure/post_configure.ts +++ b/x-pack/plugins/case/server/routes/api/cases/configure/post_configure.ts @@ -43,6 +43,7 @@ export function initPostCaseConfigure({ caseConfigureService, caseService, route ) ); } + // eslint-disable-next-line @typescript-eslint/naming-convention const { email, full_name, username } = await caseService.getUser({ request, response }); const creationDate = new Date().toISOString(); diff --git a/x-pack/plugins/case/server/routes/api/cases/delete_cases.ts b/x-pack/plugins/case/server/routes/api/cases/delete_cases.ts index 9f57663c85f6f0..db7bd6b9a76c83 100644 --- a/x-pack/plugins/case/server/routes/api/cases/delete_cases.ts +++ b/x-pack/plugins/case/server/routes/api/cases/delete_cases.ts @@ -55,6 +55,7 @@ export function initDeleteCasesApi({ caseService, router, userActionService }: R ) ); } + // eslint-disable-next-line @typescript-eslint/naming-convention const { username, full_name, email } = await caseService.getUser({ request, response }); const deleteDate = new Date().toISOString(); diff --git a/x-pack/plugins/case/server/routes/api/cases/patch_cases.ts b/x-pack/plugins/case/server/routes/api/cases/patch_cases.ts index 0c722cf56ada39..b70177b47ec976 100644 --- a/x-pack/plugins/case/server/routes/api/cases/patch_cases.ts +++ b/x-pack/plugins/case/server/routes/api/cases/patch_cases.ts @@ -87,6 +87,7 @@ export function initPatchCasesApi({ return Object.keys(updateCaseAttributes).length > 0; }); if (updateFilterCases.length > 0) { + // eslint-disable-next-line @typescript-eslint/naming-convention const { username, full_name, email } = await caseService.getUser({ request, response }); const updatedDt = new Date().toISOString(); const updatedCases = await caseService.patchCases({ diff --git a/x-pack/plugins/case/server/routes/api/cases/post_case.ts b/x-pack/plugins/case/server/routes/api/cases/post_case.ts index 05574698edd443..50883667a50475 100644 --- a/x-pack/plugins/case/server/routes/api/cases/post_case.ts +++ b/x-pack/plugins/case/server/routes/api/cases/post_case.ts @@ -38,6 +38,7 @@ export function initPostCaseApi({ fold(throwErrors(Boom.badRequest), identity) ); + // eslint-disable-next-line @typescript-eslint/naming-convention const { username, full_name, email } = await caseService.getUser({ request, response }); const createdDate = new Date().toISOString(); const myCaseConfigure = await caseConfigureService.find({ client }); diff --git a/x-pack/plugins/case/server/routes/api/cases/push_case.ts b/x-pack/plugins/case/server/routes/api/cases/push_case.ts index 3379bbd318d5be..f7990b861f8150 100644 --- a/x-pack/plugins/case/server/routes/api/cases/push_case.ts +++ b/x-pack/plugins/case/server/routes/api/cases/push_case.ts @@ -49,6 +49,7 @@ export function initPushCaseUserActionApi({ throw Boom.notFound('Action client have not been found'); } + // eslint-disable-next-line @typescript-eslint/naming-convention const { username, full_name, email } = await caseService.getUser({ request, response }); const pushedDate = new Date().toISOString(); diff --git a/x-pack/plugins/case/server/routes/api/utils.ts b/x-pack/plugins/case/server/routes/api/utils.ts index ec2881807442fa..074957ec69bca2 100644 --- a/x-pack/plugins/case/server/routes/api/utils.ts +++ b/x-pack/plugins/case/server/routes/api/utils.ts @@ -29,6 +29,7 @@ export const transformNewCase = ({ connectorId, createdDate, email, + // eslint-disable-next-line @typescript-eslint/naming-convention full_name, newCase, username, @@ -63,6 +64,7 @@ export const transformNewComment = ({ comment, createdDate, email, + // eslint-disable-next-line @typescript-eslint/naming-convention full_name, username, }: NewCommentArgs): CommentAttributes => ({ diff --git a/x-pack/plugins/case/server/services/user_actions/helpers.ts b/x-pack/plugins/case/server/services/user_actions/helpers.ts index 228b42b4c638fd..5b7d1f4618fed3 100644 --- a/x-pack/plugins/case/server/services/user_actions/helpers.ts +++ b/x-pack/plugins/case/server/services/user_actions/helpers.ts @@ -23,6 +23,7 @@ export const transformNewUserAction = ({ action, actionAt, email, + // eslint-disable-next-line @typescript-eslint/naming-convention full_name, newValue = null, oldValue = null, diff --git a/x-pack/plugins/cross_cluster_replication/common/services/auto_follow_pattern_serialization.ts b/x-pack/plugins/cross_cluster_replication/common/services/auto_follow_pattern_serialization.ts index 265af0ede14625..2694f9038d6b21 100644 --- a/x-pack/plugins/cross_cluster_replication/common/services/auto_follow_pattern_serialization.ts +++ b/x-pack/plugins/cross_cluster_replication/common/services/auto_follow_pattern_serialization.ts @@ -11,15 +11,20 @@ export const deserializeAutoFollowPattern = ( ): AutoFollowPattern => { const { name, - pattern: { active, remote_cluster, leader_index_patterns, follow_index_pattern }, + pattern: { + active, + remote_cluster: remoteCluster, + leader_index_patterns: leaderIndexPatterns, + follow_index_pattern: followIndexPattern, + }, } = autoFollowPattern; return { name, active, - remoteCluster: remote_cluster, - leaderIndexPatterns: leader_index_patterns, - followIndexPattern: follow_index_pattern, + remoteCluster, + leaderIndexPatterns, + followIndexPattern, }; }; diff --git a/x-pack/plugins/cross_cluster_replication/common/services/follower_index_serialization.ts b/x-pack/plugins/cross_cluster_replication/common/services/follower_index_serialization.ts index df476a0b2db89a..72aeaad3c29100 100644 --- a/x-pack/plugins/cross_cluster_replication/common/services/follower_index_serialization.ts +++ b/x-pack/plugins/cross_cluster_replication/common/services/follower_index_serialization.ts @@ -13,7 +13,7 @@ import { FollowerIndexAdvancedSettings, FollowerIndexAdvancedSettingsToEs, } from '../types'; - +/* eslint-disable @typescript-eslint/naming-convention */ export const deserializeShard = ({ remote_cluster, leader_index, @@ -106,7 +106,7 @@ export const deserializeFollowerIndex = ({ readPollTimeout: read_poll_timeout, shards: shards && shards.map(deserializeShard), }); - +/* eslint-enable @typescript-eslint/naming-convention */ export const deserializeListFollowerIndices = ( followerIndices: FollowerIndexFromEs[] ): FollowerIndex[] => followerIndices.map(deserializeFollowerIndex); diff --git a/x-pack/plugins/cross_cluster_replication/public/app/index.tsx b/x-pack/plugins/cross_cluster_replication/public/app/index.tsx index 8be3eb5c8b32ac..3efe7ec842c733 100644 --- a/x-pack/plugins/cross_cluster_replication/public/app/index.tsx +++ b/x-pack/plugins/cross_cluster_replication/public/app/index.tsx @@ -36,8 +36,8 @@ export async function mountApp({ element, setBreadcrumbs, I18nContext, - ELASTIC_WEBSITE_URL, - DOC_LINK_VERSION, + ELASTIC_WEBSITE_URL, // eslint-disable-line @typescript-eslint/naming-convention + DOC_LINK_VERSION, // eslint-disable-line @typescript-eslint/naming-convention history, getUrlForApp, }: { diff --git a/x-pack/plugins/cross_cluster_replication/server/lib/ccr_stats_serialization.ts b/x-pack/plugins/cross_cluster_replication/server/lib/ccr_stats_serialization.ts index 7e2b0889198426..d6c3baa899d287 100644 --- a/x-pack/plugins/cross_cluster_replication/server/lib/ccr_stats_serialization.ts +++ b/x-pack/plugins/cross_cluster_replication/server/lib/ccr_stats_serialization.ts @@ -12,7 +12,7 @@ import { AutoFollowStats, AutoFollowStatsFromEs, } from '../../common/types'; - +/* eslint-disable @typescript-eslint/naming-convention */ export const deserializeRecentAutoFollowErrors = ({ timestamp, leader_index, diff --git a/x-pack/plugins/cross_cluster_replication/server/lib/format_es_error.ts b/x-pack/plugins/cross_cluster_replication/server/lib/format_es_error.ts index 9dde027cd69492..0f00bfb0c1e7c5 100644 --- a/x-pack/plugins/cross_cluster_replication/server/lib/format_es_error.ts +++ b/x-pack/plugins/cross_cluster_replication/server/lib/format_es_error.ts @@ -8,13 +8,12 @@ function extractCausedByChain( causedBy: Record = {}, accumulator: string[] = [] ): string[] { - const { reason, caused_by } = causedBy; // eslint-disable-line @typescript-eslint/camelcase + const { reason, caused_by } = causedBy; // eslint-disable-line @typescript-eslint/naming-convention if (reason) { accumulator.push(reason); } - // eslint-disable-next-line @typescript-eslint/camelcase if (caused_by) { return extractCausedByChain(caused_by, accumulator); } @@ -36,8 +35,8 @@ export function wrapEsError( const { error: { - root_cause = [], // eslint-disable-line @typescript-eslint/camelcase - caused_by = undefined, // eslint-disable-line @typescript-eslint/camelcase + root_cause = [], // eslint-disable-line @typescript-eslint/naming-convention + caused_by = undefined, // eslint-disable-line @typescript-eslint/naming-convention } = {}, } = JSON.parse(response); diff --git a/x-pack/plugins/data_enhanced/server/search/es_search_strategy.ts b/x-pack/plugins/data_enhanced/server/search/es_search_strategy.ts index d2a8384b1f8826..0ed5485cfb6c9c 100644 --- a/x-pack/plugins/data_enhanced/server/search/es_search_strategy.ts +++ b/x-pack/plugins/data_enhanced/server/search/es_search_strategy.ts @@ -119,6 +119,7 @@ async function asyncSearch( ...queryParams, }); + // eslint-disable-next-line @typescript-eslint/naming-convention const { id, response, is_partial, is_running } = (await caller( 'transport.request', { method, path, body, query }, diff --git a/x-pack/plugins/enterprise_search/server/lib/enterprise_search_config_api.test.ts b/x-pack/plugins/enterprise_search/server/lib/enterprise_search_config_api.test.ts index cf35a458b48258..ee96f8099cf7ca 100644 --- a/x-pack/plugins/enterprise_search/server/lib/enterprise_search_config_api.test.ts +++ b/x-pack/plugins/enterprise_search/server/lib/enterprise_search_config_api.test.ts @@ -5,6 +5,7 @@ */ jest.mock('node-fetch'); +// eslint-disable-next-line @typescript-eslint/no-var-requires const fetchMock = require('node-fetch') as jest.Mock; const { Response } = jest.requireActual('node-fetch'); diff --git a/x-pack/plugins/enterprise_search/server/routes/__mocks__/router.mock.ts b/x-pack/plugins/enterprise_search/server/routes/__mocks__/router.mock.ts index 1ca7755979f99b..e3471d7268cb17 100644 --- a/x-pack/plugins/enterprise_search/server/routes/__mocks__/router.mock.ts +++ b/x-pack/plugins/enterprise_search/server/routes/__mocks__/router.mock.ts @@ -16,12 +16,12 @@ import { * Test helper that mocks Kibana's router and DRYs out various helper (callRoute, schema validation) */ -type methodType = 'get' | 'post' | 'put' | 'patch' | 'delete'; -type payloadType = 'params' | 'query' | 'body'; +type MethodType = 'get' | 'post' | 'put' | 'patch' | 'delete'; +type PayloadType = 'params' | 'query' | 'body'; interface IMockRouterProps { - method: methodType; - payload?: payloadType; + method: MethodType; + payload?: PayloadType; } interface IMockRouterRequest { body?: object; @@ -32,8 +32,8 @@ type TMockRouterRequest = KibanaRequest | IMockRouterRequest; export class MockRouter { public router!: jest.Mocked; - public method: methodType; - public payload?: payloadType; + public method: MethodType; + public payload?: PayloadType; public response = httpServerMock.createResponseFactory(); constructor({ method, payload }: IMockRouterProps) { diff --git a/x-pack/plugins/enterprise_search/server/routes/app_search/engines.test.ts b/x-pack/plugins/enterprise_search/server/routes/app_search/engines.test.ts index d5b1bc50034562..968ecb95fd9312 100644 --- a/x-pack/plugins/enterprise_search/server/routes/app_search/engines.test.ts +++ b/x-pack/plugins/enterprise_search/server/routes/app_search/engines.test.ts @@ -11,6 +11,7 @@ import { registerEnginesRoute } from './engines'; jest.mock('node-fetch'); const fetch = jest.requireActual('node-fetch'); const { Response } = fetch; +// eslint-disable-next-line @typescript-eslint/no-var-requires const fetchMock = require('node-fetch') as jest.Mocked; describe('engine routes', () => { diff --git a/x-pack/plugins/enterprise_search/server/routes/workplace_search/overview.test.ts b/x-pack/plugins/enterprise_search/server/routes/workplace_search/overview.test.ts index b1b55397953575..3a4e28b0de5ff0 100644 --- a/x-pack/plugins/enterprise_search/server/routes/workplace_search/overview.test.ts +++ b/x-pack/plugins/enterprise_search/server/routes/workplace_search/overview.test.ts @@ -11,6 +11,7 @@ import { registerWSOverviewRoute } from './overview'; jest.mock('node-fetch'); const fetch = jest.requireActual('node-fetch'); const { Response } = fetch; +// eslint-disable-next-line @typescript-eslint/no-var-requires const fetchMock = require('node-fetch') as jest.Mocked; const ORG_ROUTE = 'http://localhost:3002/ws/org'; diff --git a/x-pack/plugins/event_log/server/es/cluster_client_adapter.ts b/x-pack/plugins/event_log/server/es/cluster_client_adapter.ts index f86e5d9ca0e320..8c3e6e11b75c5b 100644 --- a/x-pack/plugins/event_log/server/es/cluster_client_adapter.ts +++ b/x-pack/plugins/event_log/server/es/cluster_client_adapter.ts @@ -133,6 +133,7 @@ export class ClusterClientAdapter { namespace: string | undefined, type: string, id: string, + // eslint-disable-next-line @typescript-eslint/naming-convention { page, per_page: perPage, start, end, sort_field, sort_order }: FindOptionsType ): Promise { const defaultNamespaceQuery = { diff --git a/x-pack/plugins/global_search/server/routes/integration_tests/find.test.ts b/x-pack/plugins/global_search/server/routes/integration_tests/find.test.ts index 878e4ac896b96d..01bd68ca38b128 100644 --- a/x-pack/plugins/global_search/server/routes/integration_tests/find.test.ts +++ b/x-pack/plugins/global_search/server/routes/integration_tests/find.test.ts @@ -13,7 +13,7 @@ import { GlobalSearchFindError } from '../../../common/errors'; import { globalSearchPluginMock } from '../../mocks'; import { registerInternalFindRoute } from '../find'; -type setupServerReturn = UnwrapPromise>; +type SetupServerReturn = UnwrapPromise>; const pluginId = Symbol('globalSearch'); const createResult = (id: string): GlobalSearchResult => ({ @@ -31,8 +31,8 @@ const createBatch = (...ids: string[]): GlobalSearchBatchedResults => ({ const expectedResults = (...ids: string[]) => ids.map((id) => expect.objectContaining({ id })); describe('POST /internal/global_search/find', () => { - let server: setupServerReturn['server']; - let httpSetup: setupServerReturn['httpSetup']; + let server: SetupServerReturn['server']; + let httpSetup: SetupServerReturn['httpSetup']; let globalSearchHandlerContext: ReturnType; beforeEach(async () => { diff --git a/x-pack/plugins/graph/public/application.ts b/x-pack/plugins/graph/public/application.ts index 0969b80bc38b0b..b249fe2be32c71 100644 --- a/x-pack/plugins/graph/public/application.ts +++ b/x-pack/plugins/graph/public/application.ts @@ -115,7 +115,7 @@ const thirdPartyAngularDependencies = ['ngSanitize', 'ngRoute', 'react', 'ui.boo function mountGraphApp(appBasePath: string, element: HTMLElement) { const mountpoint = document.createElement('div'); mountpoint.setAttribute('class', 'gphAppWrapper'); - // eslint-disable-next-line + // eslint-disable-next-line no-unsanitized/property mountpoint.innerHTML = mainTemplate(appBasePath); // bootstrap angular into detached element and attach it later to // make angular-within-angular possible diff --git a/x-pack/plugins/graph/public/components/field_manager/field_editor.tsx b/x-pack/plugins/graph/public/components/field_manager/field_editor.tsx index cd2227bf6a18c3..f4006d6bf142bb 100644 --- a/x-pack/plugins/graph/public/components/field_manager/field_editor.tsx +++ b/x-pack/plugins/graph/public/components/field_manager/field_editor.tsx @@ -125,6 +125,7 @@ export function FieldEditor({ color={initialField.color} iconSide="right" className={classNames('gphFieldEditor__badge', { + // eslint-disable-next-line @typescript-eslint/naming-convention 'gphFieldEditor__badge--disabled': isDisabled, })} onClickAriaLabel={badgeDescription} diff --git a/x-pack/plugins/graph/public/components/field_manager/field_picker.tsx b/x-pack/plugins/graph/public/components/field_manager/field_picker.tsx index ae32e8d2ce6d6f..d59bbe92af98d0 100644 --- a/x-pack/plugins/graph/public/components/field_manager/field_picker.tsx +++ b/x-pack/plugins/graph/public/components/field_manager/field_picker.tsx @@ -55,6 +55,7 @@ export function FieldPicker({ } className={classNames('gphUrlTemplateList__accordion', { + // eslint-disable-next-line @typescript-eslint/naming-convention 'gphUrlTemplateList__accordion--isOpen': open, })} buttonClassName="gphUrlTemplateList__accordionbutton" diff --git a/x-pack/plugins/grokdebugger/server/lib/kibana_framework.ts b/x-pack/plugins/grokdebugger/server/lib/kibana_framework.ts index 015a2e250bb0e4..ee7fa74022fd50 100644 --- a/x-pack/plugins/grokdebugger/server/lib/kibana_framework.ts +++ b/x-pack/plugins/grokdebugger/server/lib/kibana_framework.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/array-type */ - import { i18n } from '@kbn/i18n'; import { @@ -19,9 +17,9 @@ import { import { ILicense } from '../../../licensing/server'; -type GrokDebuggerRouteConfig = { +type GrokDebuggerRouteConfig = { method: RouteMethod; -} & RouteConfig; +} & RouteConfig; export class KibanaFramework { public router: IRouter; @@ -44,12 +42,12 @@ export class KibanaFramework { return this.license.isActive; } - public registerRoute( - config: GrokDebuggerRouteConfig, - handler: RequestHandler + public registerRoute( + config: GrokDebuggerRouteConfig, + handler: RequestHandler ) { // Automatically wrap all route registrations with license checking - const wrappedHandler: RequestHandler = async ( + const wrappedHandler: RequestHandler = async ( requestContext, request, response diff --git a/x-pack/plugins/index_lifecycle_management/server/routes/api/templates/register_fetch_route.ts b/x-pack/plugins/index_lifecycle_management/server/routes/api/templates/register_fetch_route.ts index 942eec347341f1..c8d02783864e1d 100644 --- a/x-pack/plugins/index_lifecycle_management/server/routes/api/templates/register_fetch_route.ts +++ b/x-pack/plugins/index_lifecycle_management/server/routes/api/templates/register_fetch_route.ts @@ -31,7 +31,8 @@ function filterAndFormatTemplates(templates: any): any { const formattedTemplates = []; const templateNames = Object.keys(templates); for (const templateName of templateNames) { - const { settings, index_patterns } = templates[templateName]; // eslint-disable-line camelcase + // eslint-disable-next-line @typescript-eslint/naming-convention + const { settings, index_patterns } = templates[templateName]; if (isReservedSystemTemplate(templateName, index_patterns)) { continue; } diff --git a/x-pack/plugins/index_management/__jest__/client_integration/helpers/setup_environment.tsx b/x-pack/plugins/index_management/__jest__/client_integration/helpers/setup_environment.tsx index e40cdc026210d6..910d9be842da8d 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/helpers/setup_environment.tsx +++ b/x-pack/plugins/index_management/__jest__/client_integration/helpers/setup_environment.tsx @@ -4,7 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @kbn/eslint/no-restricted-paths */ import React from 'react'; import axios from 'axios'; import axiosXhrAdapter from 'axios/lib/adapters/xhr'; diff --git a/x-pack/plugins/index_management/__jest__/client_integration/home/data_streams_tab.helpers.ts b/x-pack/plugins/index_management/__jest__/client_integration/home/data_streams_tab.helpers.ts index 9397ce21ba827a..db7541c93f9ac2 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/home/data_streams_tab.helpers.ts +++ b/x-pack/plugins/index_management/__jest__/client_integration/home/data_streams_tab.helpers.ts @@ -14,8 +14,8 @@ import { findTestSubject, } from '../../../../../test_utils'; import { DataStream } from '../../../common'; -import { IndexManagementHome } from '../../../public/application/sections/home'; // eslint-disable-line @kbn/eslint/no-restricted-paths -import { indexManagementStore } from '../../../public/application/store'; // eslint-disable-line @kbn/eslint/no-restricted-paths +import { IndexManagementHome } from '../../../public/application/sections/home'; +import { indexManagementStore } from '../../../public/application/store'; import { WithAppDependencies, services, TestSubjects } from '../helpers'; export interface DataStreamsTabTestBed extends TestBed { diff --git a/x-pack/plugins/index_management/__jest__/client_integration/home/home.helpers.ts b/x-pack/plugins/index_management/__jest__/client_integration/home/home.helpers.ts index c58109364890a1..27920ad8cdbdb8 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/home/home.helpers.ts +++ b/x-pack/plugins/index_management/__jest__/client_integration/home/home.helpers.ts @@ -5,8 +5,8 @@ */ import { registerTestBed, TestBed, TestBedConfig } from '../../../../../test_utils'; -import { IndexManagementHome } from '../../../public/application/sections/home'; // eslint-disable-line @kbn/eslint/no-restricted-paths -import { indexManagementStore } from '../../../public/application/store'; // eslint-disable-line @kbn/eslint/no-restricted-paths +import { IndexManagementHome } from '../../../public/application/sections/home'; +import { indexManagementStore } from '../../../public/application/store'; import { WithAppDependencies, services, TestSubjects } from '../helpers'; const testBedConfig: TestBedConfig = { diff --git a/x-pack/plugins/index_management/__jest__/client_integration/home/index_templates_tab.helpers.ts b/x-pack/plugins/index_management/__jest__/client_integration/home/index_templates_tab.helpers.ts index 23b40f4cbd3d79..fe938bb087d2e1 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/home/index_templates_tab.helpers.ts +++ b/x-pack/plugins/index_management/__jest__/client_integration/home/index_templates_tab.helpers.ts @@ -12,7 +12,7 @@ import { TestBedConfig, findTestSubject, } from '../../../../../test_utils'; -import { TemplateList } from '../../../public/application/sections/home/template_list'; // eslint-disable-line @kbn/eslint/no-restricted-paths +import { TemplateList } from '../../../public/application/sections/home/template_list'; import { TemplateDeserialized } from '../../../common'; import { WithAppDependencies, TestSubjects } from '../helpers'; diff --git a/x-pack/plugins/index_management/__jest__/client_integration/home/indices_tab.helpers.ts b/x-pack/plugins/index_management/__jest__/client_integration/home/indices_tab.helpers.ts index 11ea29fd9b78c6..b660adb9eec08a 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/home/indices_tab.helpers.ts +++ b/x-pack/plugins/index_management/__jest__/client_integration/home/indices_tab.helpers.ts @@ -13,8 +13,8 @@ import { TestBedConfig, findTestSubject, } from '../../../../../test_utils'; -import { IndexManagementHome } from '../../../public/application/sections/home'; // eslint-disable-line @kbn/eslint/no-restricted-paths -import { indexManagementStore } from '../../../public/application/store'; // eslint-disable-line @kbn/eslint/no-restricted-paths +import { IndexManagementHome } from '../../../public/application/sections/home'; +import { indexManagementStore } from '../../../public/application/store'; import { WithAppDependencies, services, TestSubjects } from '../helpers'; const testBedConfig: TestBedConfig = { diff --git a/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_clone.helpers.ts b/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_clone.helpers.ts index 1a58cfa8fb55e8..62adb8c4333662 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_clone.helpers.ts +++ b/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_clone.helpers.ts @@ -5,7 +5,7 @@ */ import { registerTestBed, TestBedConfig } from '../../../../../test_utils'; -import { TemplateClone } from '../../../public/application/sections/template_clone'; // eslint-disable-line @kbn/eslint/no-restricted-paths +import { TemplateClone } from '../../../public/application/sections/template_clone'; import { WithAppDependencies } from '../helpers'; import { formSetup } from './template_form.helpers'; diff --git a/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_create.helpers.ts b/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_create.helpers.ts index ab0a7b85676079..9ad8d61e637e5e 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_create.helpers.ts +++ b/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_create.helpers.ts @@ -5,7 +5,7 @@ */ import { registerTestBed, TestBedConfig } from '../../../../../test_utils'; -import { TemplateCreate } from '../../../public/application/sections/template_create'; // eslint-disable-line @kbn/eslint/no-restricted-paths +import { TemplateCreate } from '../../../public/application/sections/template_create'; import { WithAppDependencies } from '../helpers'; import { formSetup, TestSubjects } from './template_form.helpers'; diff --git a/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_edit.helpers.ts b/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_edit.helpers.ts index 29ecd84e585ced..c3a139f89cb5f5 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_edit.helpers.ts +++ b/x-pack/plugins/index_management/__jest__/client_integration/index_template_wizard/template_edit.helpers.ts @@ -5,7 +5,7 @@ */ import { registerTestBed, TestBedConfig } from '../../../../../test_utils'; -import { TemplateEdit } from '../../../public/application/sections/template_edit'; // eslint-disable-line @kbn/eslint/no-restricted-paths +import { TemplateEdit } from '../../../public/application/sections/template_edit'; import { WithAppDependencies } from '../helpers'; import { formSetup, TestSubjects } from './template_form.helpers'; diff --git a/x-pack/plugins/index_management/common/lib/data_stream_serialization.ts b/x-pack/plugins/index_management/common/lib/data_stream_serialization.ts index 51528ed9856ce9..7832662aea4949 100644 --- a/x-pack/plugins/index_management/common/lib/data_stream_serialization.ts +++ b/x-pack/plugins/index_management/common/lib/data_stream_serialization.ts @@ -7,12 +7,13 @@ import { DataStream, DataStreamFromEs } from '../types'; export function deserializeDataStream(dataStreamFromEs: DataStreamFromEs): DataStream { - const { name, timestamp_field, indices, generation } = dataStreamFromEs; + const { name, timestamp_field: timeStampField, indices, generation } = dataStreamFromEs; return { name, - timeStampField: timestamp_field, + timeStampField, indices: indices.map( + // eslint-disable-next-line @typescript-eslint/naming-convention ({ index_name, index_uuid }: { index_name: string; index_uuid: string }) => ({ name: index_name, uuid: index_uuid, diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/setup_environment.tsx b/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/setup_environment.tsx index 2f7317e3e656b9..79e213229fc516 100644 --- a/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/setup_environment.tsx +++ b/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/setup_environment.tsx @@ -3,7 +3,6 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @kbn/eslint/no-restricted-paths */ import React from 'react'; import axios from 'axios'; import axiosXhrAdapter from 'axios/lib/adapters/xhr'; diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_selector/component_templates.tsx b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_selector/component_templates.tsx index ea5632ac861924..b07279c57d2bec 100644 --- a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_selector/component_templates.tsx +++ b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_selector/component_templates.tsx @@ -171,6 +171,7 @@ export const ComponentTemplates = ({ isLoading, components, listItemProps }: Pro
    diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_selector/component_templates_selector.tsx b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_selector/component_templates_selector.tsx index ed570579d4e455..ccdfaad78fb6bc 100644 --- a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_selector/component_templates_selector.tsx +++ b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_selector/component_templates_selector.tsx @@ -157,6 +157,7 @@ export const ComponentTemplatesSelector = ({ {/* Selection */} diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/lib/documentation.ts b/x-pack/plugins/index_management/public/application/components/component_templates/lib/documentation.ts index db06877d6e81a0..7bec03a5bade8d 100644 --- a/x-pack/plugins/index_management/public/application/components/component_templates/lib/documentation.ts +++ b/x-pack/plugins/index_management/public/application/components/component_templates/lib/documentation.ts @@ -6,6 +6,7 @@ import { DocLinksStart } from 'src/core/public'; +// eslint-disable-next-line @typescript-eslint/naming-convention export const getDocumentation = ({ ELASTIC_WEBSITE_URL, DOC_LINK_VERSION }: DocLinksStart) => { const docsBase = `${ELASTIC_WEBSITE_URL}guide/en`; const esDocsBase = `${docsBase}/elasticsearch/reference/${DOC_LINK_VERSION}`; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/datatypes/text_datatype.test.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/datatypes/text_datatype.test.tsx index c03aa4805d27f0..66989baa2dc67c 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/datatypes/text_datatype.test.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/datatypes/text_datatype.test.tsx @@ -307,8 +307,11 @@ describe.skip('Mappings editor: text datatype', () => { const indexSettings = { analysis: { analyzer: { + // eslint-disable-next-line @typescript-eslint/naming-convention customAnalyzer_1: {}, + // eslint-disable-next-line @typescript-eslint/naming-convention customAnalyzer_2: {}, + // eslint-disable-next-line @typescript-eslint/naming-convention customAnalyzer_3: {}, }, }, diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/configuration_form/configuration_form.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/configuration_form/configuration_form.tsx index 20b2e11855029e..3a3e19783d74d9 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/configuration_form/configuration_form.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/configuration_form/configuration_form.tsx @@ -24,9 +24,11 @@ const formSerializer: SerializerFunc = (formData) => { dynamicMapping: { enabled: dynamicMappingsEnabled, throwErrorsForUnmappedFields, + /* eslint-disable @typescript-eslint/naming-convention */ numeric_detection, date_detection, dynamic_date_formats, + /* eslint-enable @typescript-eslint/naming-convention */ }, sourceField, metaField, @@ -51,9 +53,11 @@ const formSerializer: SerializerFunc = (formData) => { const formDeserializer = (formData: GenericObject) => { const { dynamic, + /* eslint-disable @typescript-eslint/naming-convention */ numeric_detection, date_detection, dynamic_date_formats, + /* eslint-enable @typescript-eslint/naming-convention */ _source: { enabled, includes, excludes } = {} as { enabled?: boolean; includes?: string[]; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/configuration_form/dynamic_mapping_section/dynamic_mapping_section.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/configuration_form/dynamic_mapping_section/dynamic_mapping_section.tsx index 05d871ccfac715..c5001740c26c66 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/configuration_form/dynamic_mapping_section/dynamic_mapping_section.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/configuration_form/dynamic_mapping_section/dynamic_mapping_section.tsx @@ -55,6 +55,7 @@ export const DynamicMappingSection = () => ( {(formData) => { const { 'dynamicMapping.enabled': enabled, + // eslint-disable-next-line @typescript-eslint/naming-convention 'dynamicMapping.date_detection': dateDetection, } = formData; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/dynamic_parameter.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/dynamic_parameter.tsx index 1882802b27487b..f8b7f90f983c50 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/dynamic_parameter.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/dynamic_parameter.tsx @@ -24,6 +24,7 @@ export const dynamicSerializer = (field: Field): Field => { const dynamic = field.dynamic_toggle === true ? true : field.dynamic_strict === true ? 'strict' : false; + // eslint-disable-next-line @typescript-eslint/naming-convention const { dynamic_toggle, dynamic_strict, ...rest } = field; return { diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/create_field.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/create_field.tsx index dc631b7dbf32dc..ecaa40b398d086 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/create_field.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/create_field.tsx @@ -164,8 +164,10 @@ export const CreateField = React.memo(function CreateFieldComponent({ >
    0, + // eslint-disable-next-line @typescript-eslint/naming-convention 'mappingsEditor__createFieldWrapper--multiField': isMultiField, })} style={{ diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/fields_list_item.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/fields_list_item.tsx index c4d0a659055574..4ab0ea0fb355b6 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/fields_list_item.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/fields_list_item.tsx @@ -193,6 +193,7 @@ function FieldListItemComponent( return (
  • treeDepth, })} diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/search_fields/search_result_item.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/search_fields/search_result_item.tsx index 73d3e078f6ff3f..a2d9a50f283949 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/search_fields/search_result_item.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/search_fields/search_result_item.tsx @@ -89,8 +89,11 @@ export const SearchResultItem = React.memo(function FieldListItemFlatComponent({
    @@ -99,7 +102,9 @@ export const SearchResultItem = React.memo(function FieldListItemFlatComponent({ gutterSize="s" alignItems="center" className={classNames('mappingsEditor__fieldsListItem__content', { + // eslint-disable-next-line @typescript-eslint/naming-convention 'mappingsEditor__fieldsListItem__content--toggle': hasChildFields || hasMultiFields, + // eslint-disable-next-line @typescript-eslint/naming-convention 'mappingsEditor__fieldsListItem__content--multiField': isMultiField, })} > diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/templates_form/templates_form.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/templates_form/templates_form.tsx index 44a809a7a01bf9..9367eb6faee206 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/templates_form/templates_form.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/templates_form/templates_form.tsx @@ -44,6 +44,7 @@ const formSerializer: SerializerFunc = (formData) }; const formDeserializer = (formData: { [key: string]: any }) => { + // eslint-disable-next-line @typescript-eslint/naming-convention const { dynamic_templates } = formData; return { diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/mappings_editor.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/mappings_editor.tsx index 292882f1c5b4b2..39451639bfb864 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/mappings_editor.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/mappings_editor.tsx @@ -59,11 +59,13 @@ export const MappingsEditor = React.memo(({ onChange, value, indexSettings }: Pr _meta, _routing, dynamic, + /* eslint-disable @typescript-eslint/naming-convention */ numeric_detection, date_detection, dynamic_date_formats, properties, dynamic_templates, + /* eslint-enable @typescript-eslint/naming-convention */ } = mappingsDefinition; const parsed = { diff --git a/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_table/data_stream_table.tsx b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_table/data_stream_table.tsx index d01d8fa03a3fae..d1e093f1ffc832 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_table/data_stream_table.tsx +++ b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_table/data_stream_table.tsx @@ -42,7 +42,6 @@ export const DataStreamTable: React.FunctionComponent = ({ sortable: true, render: (name: DataStream['name'], item: DataStream) => { return ( - /* eslint-disable-next-line @elastic/eui/href-or-on-click */ { - const { reason, caused_by } = causedBy; // eslint-disable-line @typescript-eslint/camelcase + const { reason, caused_by } = causedBy; // eslint-disable-line @typescript-eslint/naming-convention if (reason) { accumulator.push(reason); } - // eslint-disable-next-line @typescript-eslint/camelcase if (caused_by) { return extractCausedByChain(caused_by, accumulator); } @@ -31,8 +30,8 @@ export const wrapEsError = (err: any, statusCodeToMessageMap: any = {}) => { const { error: { - root_cause = [], // eslint-disable-line @typescript-eslint/camelcase - caused_by = {}, // eslint-disable-line @typescript-eslint/camelcase + root_cause = [], // eslint-disable-line @typescript-eslint/naming-convention + caused_by = {}, // eslint-disable-line @typescript-eslint/naming-convention } = {}, } = JSON.parse(response); diff --git a/x-pack/plugins/infra/common/errors/metrics.ts b/x-pack/plugins/infra/common/errors/metrics.ts index 2acf2b741cec9d..08d58a7db326ea 100644 --- a/x-pack/plugins/infra/common/errors/metrics.ts +++ b/x-pack/plugins/infra/common/errors/metrics.ts @@ -5,6 +5,5 @@ */ export enum InfraMetricsErrorCodes { - // eslint-disable-next-line @typescript-eslint/camelcase invalid_node = 'METRICS_INVALID_NODE', } diff --git a/x-pack/plugins/infra/public/alerting/inventory/components/expression.tsx b/x-pack/plugins/infra/public/alerting/inventory/components/expression.tsx index b69078beec670a..7ca17617871ffb 100644 --- a/x-pack/plugins/infra/public/alerting/inventory/components/expression.tsx +++ b/x-pack/plugins/infra/public/alerting/inventory/components/expression.tsx @@ -39,7 +39,6 @@ import { import { IErrorObject } from '../../../../../triggers_actions_ui/public/types'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { AlertsContextValue } from '../../../../../triggers_actions_ui/public/application/context/alerts_context'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { MetricsExplorerKueryBar } from '../../../pages/metrics/metrics_explorer/components/kuery_bar'; import { useSourceViaHttp } from '../../../containers/source/use_source_via_http'; import { sqsMetricTypes } from '../../../../common/inventory_models/aws_sqs/toolbar_items'; diff --git a/x-pack/plugins/infra/public/alerting/inventory/index.ts b/x-pack/plugins/infra/public/alerting/inventory/index.ts index 30f16ef137a17f..b5f6e17cc2a133 100644 --- a/x-pack/plugins/infra/public/alerting/inventory/index.ts +++ b/x-pack/plugins/infra/public/alerting/inventory/index.ts @@ -10,7 +10,6 @@ import { METRIC_INVENTORY_THRESHOLD_ALERT_TYPE_ID } from '../../../server/lib/al // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { AlertTypeModel } from '../../../../triggers_actions_ui/public/types'; import { validateMetricThreshold } from './components/validation'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths export function createInventoryMetricAlertType(): AlertTypeModel { return { diff --git a/x-pack/plugins/infra/public/alerting/metric_threshold/components/expression.tsx b/x-pack/plugins/infra/public/alerting/metric_threshold/components/expression.tsx index 8bb8b3934b5fdf..8031f7a03731a4 100644 --- a/x-pack/plugins/infra/public/alerting/metric_threshold/components/expression.tsx +++ b/x-pack/plugins/infra/public/alerting/metric_threshold/components/expression.tsx @@ -20,7 +20,6 @@ import { import { FormattedMessage } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; import { AlertPreview } from '../../common'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { Comparator, Aggregators, diff --git a/x-pack/plugins/infra/public/components/document_title.tsx b/x-pack/plugins/infra/public/components/document_title.tsx index 51f179760ec70a..5ae3aa7ec8b42a 100644 --- a/x-pack/plugins/infra/public/components/document_title.tsx +++ b/x-pack/plugins/infra/public/components/document_title.tsx @@ -6,10 +6,10 @@ import React from 'react'; -type titleProp = string | ((previousTitle: string) => string); +type TitleProp = string | ((previousTitle: string) => string); interface DocumentTitleProps { - title: titleProp; + title: TitleProp; } interface DocumentTitleState { @@ -47,7 +47,7 @@ const wrapWithSharedState = () => { return null; } - private getTitle(title: titleProp) { + private getTitle(title: TitleProp) { return typeof title === 'function' ? title(titles[this.state.index - 1]) : title; } diff --git a/x-pack/plugins/infra/public/components/logging/log_text_stream/jump_to_tail.tsx b/x-pack/plugins/infra/public/components/logging/log_text_stream/jump_to_tail.tsx index 78caa8054860f6..50c26784bbdab0 100644 --- a/x-pack/plugins/infra/public/components/logging/log_text_stream/jump_to_tail.tsx +++ b/x-pack/plugins/infra/public/components/logging/log_text_stream/jump_to_tail.tsx @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable max-classes-per-file */ - import { EuiButtonEmpty, EuiText } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import * as React from 'react'; diff --git a/x-pack/plugins/infra/public/components/logging/log_text_stream/loading_item_view.tsx b/x-pack/plugins/infra/public/components/logging/log_text_stream/loading_item_view.tsx index eb187a7af03f61..1dd6e0b23e6bce 100644 --- a/x-pack/plugins/infra/public/components/logging/log_text_stream/loading_item_view.tsx +++ b/x-pack/plugins/infra/public/components/logging/log_text_stream/loading_item_view.tsx @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable max-classes-per-file */ - import { EuiText, EuiFlexGroup, diff --git a/x-pack/plugins/infra/public/components/logging/log_text_stream/scrollable_log_text_stream_view.tsx b/x-pack/plugins/infra/public/components/logging/log_text_stream/scrollable_log_text_stream_view.tsx index 74d1878fc89c20..fc0c50b9044dc1 100644 --- a/x-pack/plugins/infra/public/components/logging/log_text_stream/scrollable_log_text_stream_view.tsx +++ b/x-pack/plugins/infra/public/components/logging/log_text_stream/scrollable_log_text_stream_view.tsx @@ -326,8 +326,6 @@ export class ScrollableLogTextStreamView extends React.PureComponent< } }; - // this is actually a method but not recognized as such - // eslint-disable-next-line @typescript-eslint/member-ordering private handleVisibleChildrenChange = callWithoutRepeats( ({ topChild, diff --git a/x-pack/plugins/infra/public/components/navigation/routed_tabs.tsx b/x-pack/plugins/infra/public/components/navigation/routed_tabs.tsx index 29db3c893a4606..d9340d804fb24c 100644 --- a/x-pack/plugins/infra/public/components/navigation/routed_tabs.tsx +++ b/x-pack/plugins/infra/public/components/navigation/routed_tabs.tsx @@ -42,7 +42,6 @@ const Tab = ({ title, pathname, app }: TabConfiguration) => { children={({ match, history }) => { return ( - {/* eslint-disable-next-line @elastic/eui/href-or-on-click */} {title} diff --git a/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/components/charts.tsx b/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/components/charts.tsx index b9595548debf2b..270ccac000637f 100644 --- a/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/components/charts.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/components/charts.tsx @@ -19,13 +19,13 @@ import { NoData } from '../../../../components/empty_states/no_data'; import { MetricsExplorerChart } from './chart'; import { SourceQuery } from '../../../../graphql/types'; -type stringOrNull = string | null; +type StringOrNull = string | null; interface Props { loading: boolean; options: MetricsExplorerOptions; chartOptions: MetricsExplorerChartOptions; - onLoadMore: (afterKey: stringOrNull | Record) => void; + onLoadMore: (afterKey: StringOrNull | Record) => void; onRefetch: () => void; onFilter: (filter: string) => void; onTimeChange: (start: string, end: string) => void; diff --git a/x-pack/plugins/infra/server/lib/adapters/framework/adapter_types.ts b/x-pack/plugins/infra/server/lib/adapters/framework/adapter_types.ts index 117749ae87bbed..1ecae84c54ffba 100644 --- a/x-pack/plugins/infra/server/lib/adapters/framework/adapter_types.ts +++ b/x-pack/plugins/infra/server/lib/adapters/framework/adapter_types.ts @@ -171,6 +171,6 @@ export interface InfraTSVBSeries { export type InfraTSVBDataPoint = [number, number]; -export type InfraRouteConfig = { +export type InfraRouteConfig = { method: RouteMethod; -} & RouteConfig; +} & RouteConfig; diff --git a/x-pack/plugins/infra/server/lib/adapters/framework/kibana_framework_adapter.ts b/x-pack/plugins/infra/server/lib/adapters/framework/kibana_framework_adapter.ts index 453f01ef028f17..2dcab5b49dcdb6 100644 --- a/x-pack/plugins/infra/server/lib/adapters/framework/kibana_framework_adapter.ts +++ b/x-pack/plugins/infra/server/lib/adapters/framework/kibana_framework_adapter.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/array-type */ - import { GraphQLSchema } from 'graphql'; import { runHttpQuery } from 'apollo-server-core'; import { schema, TypeOf } from '@kbn/config-schema'; @@ -43,9 +41,9 @@ export class KibanaFramework { this.plugins = plugins; } - public registerRoute( - config: InfraRouteConfig, - handler: RequestHandler + public registerRoute( + config: InfraRouteConfig, + handler: RequestHandler ) { const defaultOptions = { tags: ['access:infra'], diff --git a/x-pack/plugins/infra/server/lib/adapters/metrics/adapter_types.ts b/x-pack/plugins/infra/server/lib/adapters/metrics/adapter_types.ts index 6659cb060b1a8e..f786c043ee27c3 100644 --- a/x-pack/plugins/infra/server/lib/adapters/metrics/adapter_types.ts +++ b/x-pack/plugins/infra/server/lib/adapters/metrics/adapter_types.ts @@ -40,12 +40,12 @@ export enum InfraMetricModelMetricType { min = 'min', calculation = 'calculation', cardinality = 'cardinality', - series_agg = 'series_agg', // eslint-disable-line @typescript-eslint/camelcase - positive_only = 'positive_only', // eslint-disable-line @typescript-eslint/camelcase + series_agg = 'series_agg', + positive_only = 'positive_only', derivative = 'derivative', count = 'count', sum = 'sum', - cumulative_sum = 'cumulative_sum', // eslint-disable-line @typescript-eslint/camelcase + cumulative_sum = 'cumulative_sum', } export interface InfraMetricModel { @@ -80,7 +80,7 @@ export interface InfraMetricModelBasicMetric { export interface InfraMetricModelSeriesAgg { id: string; function: string; - type: InfraMetricModelMetricType.series_agg; // eslint-disable-line @typescript-eslint/camelcase + type: InfraMetricModelMetricType.series_agg; } export interface InfraMetricModelDerivative { diff --git a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/test_mocks.ts b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/test_mocks.ts index 5c2f76cea87c4b..164f1ed6d18e58 100644 --- a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/test_mocks.ts +++ b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/test_mocks.ts @@ -68,6 +68,7 @@ export const emptyRateResponse = { buckets: [ { doc_count: 2, + // eslint-disable-next-line @typescript-eslint/naming-convention aggregatedValue_max: { value: null }, }, ], diff --git a/x-pack/plugins/infra/server/lib/log_analysis/log_entry_anomalies.ts b/x-pack/plugins/infra/server/lib/log_analysis/log_entry_anomalies.ts index 950de4261bda0a..a55958aee12854 100644 --- a/x-pack/plugins/infra/server/lib/log_analysis/log_entry_anomalies.ts +++ b/x-pack/plugins/infra/server/lib/log_analysis/log_entry_anomalies.ts @@ -246,6 +246,7 @@ async function fetchLogEntryAnomalies( const anomalies = hits.map((result) => { const { + // eslint-disable-next-line @typescript-eslint/naming-convention job_id, record_score: anomalyScore, typical, diff --git a/x-pack/plugins/infra/server/lib/log_analysis/queries/log_entry_categories.ts b/x-pack/plugins/infra/server/lib/log_analysis/queries/log_entry_categories.ts index c7ad60eeaabc2c..3ef10d3378a66f 100644 --- a/x-pack/plugins/infra/server/lib/log_analysis/queries/log_entry_categories.ts +++ b/x-pack/plugins/infra/server/lib/log_analysis/queries/log_entry_categories.ts @@ -46,4 +46,5 @@ export const logEntryCategoriesResponseRT = rt.intersection([ }), ]); +// eslint-disable-next-line @typescript-eslint/naming-convention export type logEntryCategoriesResponse = rt.TypeOf; diff --git a/x-pack/plugins/infra/server/lib/log_analysis/queries/log_entry_category_examples.ts b/x-pack/plugins/infra/server/lib/log_analysis/queries/log_entry_category_examples.ts index 2f4502f991dd9f..6e2afa874b7573 100644 --- a/x-pack/plugins/infra/server/lib/log_analysis/queries/log_entry_category_examples.ts +++ b/x-pack/plugins/infra/server/lib/log_analysis/queries/log_entry_category_examples.ts @@ -82,4 +82,5 @@ export const logEntryCategoryExamplesResponseRT = rt.intersection([ }), ]); +// eslint-disable-next-line @typescript-eslint/naming-convention export type logEntryCategoryExamplesResponse = rt.TypeOf; diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/index.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/index.tsx index 0eaf7854055903..443708ec6384fd 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/index.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/index.tsx @@ -94,7 +94,6 @@ const IngestManagerRoutes = memo<{ history: AppMountParameters['history']; basep setPermissionsError('REQUEST_ERROR'); } })(); - // eslint-disable-next-line react-hooks/exhaustive-deps }, []); if (isPermissionsLoading || permissionsError) { diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/details_page/components/settings/index.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/details_page/components/settings/index.tsx index 6bb381e29ded2e..dfdd63bd984dda 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/details_page/components/settings/index.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/details_page/components/settings/index.tsx @@ -74,6 +74,7 @@ export const ConfigSettingsView = memo<{ config: AgentConfig }>( const submitUpdateAgentConfig = async () => { setIsLoading(true); try { + // eslint-disable-next-line @typescript-eslint/naming-convention const { name, description, namespace, monitoring_enabled } = agentConfig; const { data, error } = await sendUpdateAgentConfig(agentConfig.id, { name, diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/edit_package_config_page/index.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/edit_package_config_page/index.tsx index f4411a6057a152..3005f8d36f343c 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/edit_package_config_page/index.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/edit_package_config_page/index.tsx @@ -100,10 +100,12 @@ export const EditPackageConfigPage: React.FunctionComponent = () => { id, revision, inputs, + /* eslint-disable @typescript-eslint/naming-convention */ created_by, created_at, updated_by, updated_at, + /* eslint-enable @typescript-eslint/naming-convention */ ...restOfPackageConfig } = packageConfigData.item; // Remove `compiled_stream` from all stream info, we assign this after saving @@ -114,6 +116,7 @@ export const EditPackageConfigPage: React.FunctionComponent = () => { return { ...restOfInput, streams: streams.map((stream) => { + // eslint-disable-next-line @typescript-eslint/naming-convention const { compiled_stream, ...restOfStream } = stream; return restOfStream; }), diff --git a/x-pack/plugins/ingest_manager/server/services/agent_config.ts b/x-pack/plugins/ingest_manager/server/services/agent_config.ts index 63d4e6f012e079..10b5d9aa0b2f8b 100644 --- a/x-pack/plugins/ingest_manager/server/services/agent_config.ts +++ b/x-pack/plugins/ingest_manager/server/services/agent_config.ts @@ -218,6 +218,7 @@ class AgentConfigService { if (!baseAgentConfig) { throw new Error('Agent config not found'); } + // eslint-disable-next-line @typescript-eslint/naming-convention const { namespace, monitoring_enabled } = baseAgentConfig; const newAgentConfig = await this.create( soClient, @@ -393,6 +394,7 @@ class AgentConfigService { outputs: { // TEMPORARY as we only support a default output ...[defaultOutput].reduce( + // eslint-disable-next-line @typescript-eslint/naming-convention (outputs, { config: outputConfig, name, type, hosts, ca_sha256, api_key }) => { outputs[name] = { type, diff --git a/x-pack/plugins/ingest_manager/server/services/agents/crud.ts b/x-pack/plugins/ingest_manager/server/services/agents/crud.ts index 4420135aec9528..a57735e25ff7b5 100644 --- a/x-pack/plugins/ingest_manager/server/services/agents/crud.ts +++ b/x-pack/plugins/ingest_manager/server/services/agents/crud.ts @@ -51,6 +51,7 @@ export async function listAgents( filters.push(`(${agentActiveCondition}) OR (${recentlySeenEphemeralAgent})`); } + // eslint-disable-next-line @typescript-eslint/naming-convention const { saved_objects, total } = await soClient.find({ type: AGENT_SAVED_OBJECT_TYPE, sortField, diff --git a/x-pack/plugins/ingest_manager/server/services/agents/events.ts b/x-pack/plugins/ingest_manager/server/services/agents/events.ts index 55970607c74abd..dfa599e4ffdfdb 100644 --- a/x-pack/plugins/ingest_manager/server/services/agents/events.ts +++ b/x-pack/plugins/ingest_manager/server/services/agents/events.ts @@ -19,6 +19,7 @@ export async function getAgentEvents( ) { const { page, perPage, kuery } = options; + // eslint-disable-next-line @typescript-eslint/naming-convention const { total, saved_objects } = await soClient.find({ type: AGENT_EVENT_SAVED_OBJECT_TYPE, filter: diff --git a/x-pack/plugins/ingest_manager/server/services/api_keys/enrollment_api_key.ts b/x-pack/plugins/ingest_manager/server/services/api_keys/enrollment_api_key.ts index 02e2c8151fac7f..e1266ac5941642 100644 --- a/x-pack/plugins/ingest_manager/server/services/api_keys/enrollment_api_key.ts +++ b/x-pack/plugins/ingest_manager/server/services/api_keys/enrollment_api_key.ts @@ -24,6 +24,7 @@ export async function listEnrollmentApiKeys( ): Promise<{ items: EnrollmentAPIKey[]; total: any; page: any; perPage: any }> { const { page = 1, perPage = 20, kuery } = options; + // eslint-disable-next-line @typescript-eslint/naming-convention const { saved_objects, total } = await soClient.find({ type: ENROLLMENT_API_KEYS_SAVED_OBJECT_TYPE, page, diff --git a/x-pack/plugins/ingest_manager/server/services/package_config.ts b/x-pack/plugins/ingest_manager/server/services/package_config.ts index 5d1c5d1717714c..a369aa5c41cd46 100644 --- a/x-pack/plugins/ingest_manager/server/services/package_config.ts +++ b/x-pack/plugins/ingest_manager/server/services/package_config.ts @@ -121,6 +121,7 @@ class PackageConfigService { options?: { user?: AuthenticatedUser; bumpConfigRevision?: boolean } ): Promise { const isoDate = new Date().toISOString(); + // eslint-disable-next-line @typescript-eslint/naming-convention const { saved_objects } = await soClient.bulkCreate( packageConfigs.map((packageConfig) => ({ type: SAVED_OBJECT_TYPE, diff --git a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_clone.helpers.ts b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_clone.helpers.ts index 2791ffc32c8580..f369bfe66f6421 100644 --- a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_clone.helpers.ts +++ b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_clone.helpers.ts @@ -6,7 +6,7 @@ import { registerTestBed, TestBedConfig, TestBed } from '../../../../../test_utils'; import { BASE_PATH } from '../../../common/constants'; -import { PipelinesClone } from '../../../public/application/sections/pipelines_clone'; // eslint-disable-line @kbn/eslint/no-restricted-paths +import { PipelinesClone } from '../../../public/application/sections/pipelines_clone'; import { getFormActions, PipelineFormTestSubjects } from './pipeline_form.helpers'; import { WithAppDependencies } from './setup_environment'; diff --git a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_create.helpers.ts b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_create.helpers.ts index 54a62a8357e524..ce5ab1faa01bee 100644 --- a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_create.helpers.ts +++ b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_create.helpers.ts @@ -6,7 +6,7 @@ import { registerTestBed, TestBedConfig, TestBed } from '../../../../../test_utils'; import { BASE_PATH } from '../../../common/constants'; -import { PipelinesCreate } from '../../../public/application/sections/pipelines_create'; // eslint-disable-line @kbn/eslint/no-restricted-paths +import { PipelinesCreate } from '../../../public/application/sections/pipelines_create'; import { getFormActions, PipelineFormTestSubjects } from './pipeline_form.helpers'; import { WithAppDependencies } from './setup_environment'; diff --git a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_edit.helpers.ts b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_edit.helpers.ts index 12320f034a8193..31c9630086178e 100644 --- a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_edit.helpers.ts +++ b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_edit.helpers.ts @@ -6,7 +6,7 @@ import { registerTestBed, TestBedConfig, TestBed } from '../../../../../test_utils'; import { BASE_PATH } from '../../../common/constants'; -import { PipelinesEdit } from '../../../public/application/sections/pipelines_edit'; // eslint-disable-line @kbn/eslint/no-restricted-paths +import { PipelinesEdit } from '../../../public/application/sections/pipelines_edit'; import { getFormActions, PipelineFormTestSubjects } from './pipeline_form.helpers'; import { WithAppDependencies } from './setup_environment'; diff --git a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/setup_environment.tsx b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/setup_environment.tsx index a5796c10f8d930..c380032bd9482e 100644 --- a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/setup_environment.tsx +++ b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/setup_environment.tsx @@ -3,7 +3,6 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @kbn/eslint/no-restricted-paths */ import React from 'react'; import { LocationDescriptorObject } from 'history'; import { KibanaContextProvider } from '../../../../../../src/plugins/kibana_react/public'; @@ -17,7 +16,6 @@ import { import { usageCollectionPluginMock } from '../../../../../../src/plugins/usage_collection/public/mocks'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { HttpService } from '../../../../../../src/core/public/http'; import { diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/pipeline_processors_editor_item/context_menu.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/pipeline_processors_editor_item/context_menu.tsx index 5cee5311c62a94..1c2f2cc2f48437 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/pipeline_processors_editor_item/context_menu.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/pipeline_processors_editor_item/context_menu.tsx @@ -26,6 +26,7 @@ export const ContextMenu: FunctionComponent = (props) => { const [isOpen, setIsOpen] = useState(false); const containerClasses = classNames({ + // eslint-disable-next-line @typescript-eslint/naming-convention 'pipelineProcessorsEditor__item--displayNone': hidden, }); diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/pipeline_processors_editor_item/inline_text_input.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/pipeline_processors_editor_item/inline_text_input.tsx index ea936115f1ac99..e91974adca20ad 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/pipeline_processors_editor_item/inline_text_input.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/pipeline_processors_editor_item/inline_text_input.tsx @@ -26,6 +26,7 @@ export const InlineTextInput: FunctionComponent = ({ const [textValue, setTextValue] = useState(text ?? ''); const containerClasses = classNames('pipelineProcessorsEditor__item__textContainer', { + // eslint-disable-next-line @typescript-eslint/naming-convention 'pipelineProcessorsEditor__item__textContainer--notEditing': !isShowingTextInput && !disabled, }); diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/pipeline_processors_editor_item/pipeline_processors_editor_item.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/pipeline_processors_editor_item/pipeline_processors_editor_item.tsx index 3fbef4c1b78982..b43e2bc1342c30 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/pipeline_processors_editor_item/pipeline_processors_editor_item.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/pipeline_processors_editor_item/pipeline_processors_editor_item.tsx @@ -62,15 +62,19 @@ export const PipelineProcessorsEditorItem: FunctionComponent = memo( const isDimmed = isEditingOtherProcessor || isMovingOtherProcessor; const panelClasses = classNames('pipelineProcessorsEditor__item', { + // eslint-disable-next-line @typescript-eslint/naming-convention 'pipelineProcessorsEditor__item--selected': isMovingThisProcessor || isEditingThisProcessor, + // eslint-disable-next-line @typescript-eslint/naming-convention 'pipelineProcessorsEditor__item--dimmed': isDimmed, }); const actionElementClasses = classNames({ + // eslint-disable-next-line @typescript-eslint/naming-convention 'pipelineProcessorsEditor__item--displayNone': isInMoveMode, }); const inlineTextInputContainerClasses = classNames({ + // eslint-disable-next-line @typescript-eslint/naming-convention 'pipelineProcessorsEditor__item--displayNone': isInMoveMode && !processor.options.description, }); @@ -80,6 +84,7 @@ export const PipelineProcessorsEditorItem: FunctionComponent = memo( : i18nTexts.cancelMoveButtonLabel; const dataTestSubj = !isMovingThisProcessor ? 'moveItemButton' : 'cancelMoveItemButton'; const moveButtonClasses = classNames('pipelineProcessorsEditor__item__moveButton', { + // eslint-disable-next-line @typescript-eslint/naming-convention 'pipelineProcessorsEditor__item__moveButton--cancel': isMovingThisProcessor, }); const icon = isMovingThisProcessor ? 'cross' : 'sortable'; @@ -143,7 +148,7 @@ export const PipelineProcessorsEditorItem: FunctionComponent = memo( onChange={(nextDescription) => { let nextOptions: Record; if (!nextDescription) { - const { description: __, ...restOptions } = processor.options; + const { description: _description, ...restOptions } = processor.options; nextOptions = restOptions; } else { nextOptions = { diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processors_tree/components/drop_zone_button.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processors_tree/components/drop_zone_button.tsx index 193b5b9afe447a..57ecb6f7f1187b 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processors_tree/components/drop_zone_button.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_processors_editor/components/processors_tree/components/drop_zone_button.tsx @@ -32,10 +32,13 @@ export const DropZoneButton: FunctionComponent = (props) => { const { onClick, isDisabled, isVisible } = props; const isUnavailable = isVisible && isDisabled; const containerClasses = classNames({ + // eslint-disable-next-line @typescript-eslint/naming-convention 'pipelineProcessorsEditor__tree__dropZoneContainer--visible': isVisible, + // eslint-disable-next-line @typescript-eslint/naming-convention 'pipelineProcessorsEditor__tree__dropZoneContainer--unavailable': isUnavailable, }); const buttonClasses = classNames({ + // eslint-disable-next-line @typescript-eslint/naming-convention 'pipelineProcessorsEditor__tree__dropZoneButton--visible': isVisible, }); diff --git a/x-pack/plugins/ingest_pipelines/server/routes/api/create.ts b/x-pack/plugins/ingest_pipelines/server/routes/api/create.ts index c2328bcc9d0ab5..4600580985b574 100644 --- a/x-pack/plugins/ingest_pipelines/server/routes/api/create.ts +++ b/x-pack/plugins/ingest_pipelines/server/routes/api/create.ts @@ -33,6 +33,7 @@ export const registerCreateRoute = ({ const { callAsCurrentUser } = ctx.core.elasticsearch.legacy.client; const pipeline = req.body as Pipeline; + // eslint-disable-next-line @typescript-eslint/naming-convention const { name, description, processors, version, on_failure } = pipeline; try { diff --git a/x-pack/plugins/ingest_pipelines/server/routes/api/update.ts b/x-pack/plugins/ingest_pipelines/server/routes/api/update.ts index cd0e3568f0f601..82a5ccbc280d74 100644 --- a/x-pack/plugins/ingest_pipelines/server/routes/api/update.ts +++ b/x-pack/plugins/ingest_pipelines/server/routes/api/update.ts @@ -32,6 +32,7 @@ export const registerUpdateRoute = ({ license.guardApiRoute(async (ctx, req, res) => { const { callAsCurrentUser } = ctx.core.elasticsearch.legacy.client; const { name } = req.params; + // eslint-disable-next-line @typescript-eslint/naming-convention const { description, processors, version, on_failure } = req.body; try { diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_panel.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_panel.tsx index b06b316ec79aa3..7efaecb125c8ee 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_panel.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/suggestion_panel.tsx @@ -71,6 +71,7 @@ const PreviewRenderer = ({ return (
    @@ -123,6 +124,7 @@ const SuggestionPreview = ({ diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/field_select.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/field_select.tsx index 35c510521b35b7..b8f868a8694ddf 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/field_select.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/field_select.tsx @@ -100,7 +100,9 @@ export function FieldSelect({ label, value, className: classNames({ + // eslint-disable-next-line @typescript-eslint/naming-convention 'lnFieldSelect__option--incompatible': !compatible, + // eslint-disable-next-line @typescript-eslint/naming-convention 'lnFieldSelect__option--nonExistant': !exists, }), 'data-test-subj': `lns-fieldOption${compatible ? '' : 'Incompatible'}-${label}`, diff --git a/x-pack/plugins/lens/public/persistence/saved_object_store.ts b/x-pack/plugins/lens/public/persistence/saved_object_store.ts index 7632be3d820465..af90634874fb12 100644 --- a/x-pack/plugins/lens/public/persistence/saved_object_store.ts +++ b/x-pack/plugins/lens/public/persistence/saved_object_store.ts @@ -4,7 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { SavedObjectAttributes } from 'kibana/server'; import { Query, Filter } from '../../../../../src/plugins/data/public'; diff --git a/x-pack/plugins/lists/common/schemas/common/schemas.ts b/x-pack/plugins/lists/common/schemas/common/schemas.ts index 76aa896a741f68..0d52b075ebf126 100644 --- a/x-pack/plugins/lists/common/schemas/common/schemas.ts +++ b/x-pack/plugins/lists/common/schemas/common/schemas.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ +/* eslint-disable @typescript-eslint/naming-convention */ import * as t from 'io-ts'; diff --git a/x-pack/plugins/lists/common/schemas/elastic_query/index_es_list_item_schema.ts b/x-pack/plugins/lists/common/schemas/elastic_query/index_es_list_item_schema.ts index 8dc5a376d14958..8bc42d531768b9 100644 --- a/x-pack/plugins/lists/common/schemas/elastic_query/index_es_list_item_schema.ts +++ b/x-pack/plugins/lists/common/schemas/elastic_query/index_es_list_item_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { diff --git a/x-pack/plugins/lists/common/schemas/elastic_query/index_es_list_schema.ts b/x-pack/plugins/lists/common/schemas/elastic_query/index_es_list_schema.ts index be41e57f99421c..347e1be03dc8cd 100644 --- a/x-pack/plugins/lists/common/schemas/elastic_query/index_es_list_schema.ts +++ b/x-pack/plugins/lists/common/schemas/elastic_query/index_es_list_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { diff --git a/x-pack/plugins/lists/common/schemas/elastic_query/update_es_list_item_schema.ts b/x-pack/plugins/lists/common/schemas/elastic_query/update_es_list_item_schema.ts index 20187de535a8e8..10302e529d2b93 100644 --- a/x-pack/plugins/lists/common/schemas/elastic_query/update_es_list_item_schema.ts +++ b/x-pack/plugins/lists/common/schemas/elastic_query/update_es_list_item_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { esDataTypeUnion, metaOrUndefined, updated_at, updated_by } from '../common/schemas'; diff --git a/x-pack/plugins/lists/common/schemas/elastic_query/update_es_list_schema.ts b/x-pack/plugins/lists/common/schemas/elastic_query/update_es_list_schema.ts index 80b9733908d393..5b2461156e81a3 100644 --- a/x-pack/plugins/lists/common/schemas/elastic_query/update_es_list_schema.ts +++ b/x-pack/plugins/lists/common/schemas/elastic_query/update_es_list_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { diff --git a/x-pack/plugins/lists/common/schemas/elastic_response/search_es_list_item_schema.ts b/x-pack/plugins/lists/common/schemas/elastic_response/search_es_list_item_schema.ts index 76419587c59258..445c53116bc2b1 100644 --- a/x-pack/plugins/lists/common/schemas/elastic_response/search_es_list_item_schema.ts +++ b/x-pack/plugins/lists/common/schemas/elastic_response/search_es_list_item_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { diff --git a/x-pack/plugins/lists/common/schemas/elastic_response/search_es_list_schema.ts b/x-pack/plugins/lists/common/schemas/elastic_response/search_es_list_schema.ts index 6807201cf18d9e..7252f3ca4987f5 100644 --- a/x-pack/plugins/lists/common/schemas/elastic_response/search_es_list_schema.ts +++ b/x-pack/plugins/lists/common/schemas/elastic_response/search_es_list_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { diff --git a/x-pack/plugins/lists/common/schemas/request/create_endpoint_list_item_schema.ts b/x-pack/plugins/lists/common/schemas/request/create_endpoint_list_item_schema.ts index 626b9e3e624ef7..dacd9d515de519 100644 --- a/x-pack/plugins/lists/common/schemas/request/create_endpoint_list_item_schema.ts +++ b/x-pack/plugins/lists/common/schemas/request/create_endpoint_list_item_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { diff --git a/x-pack/plugins/lists/common/schemas/request/create_exception_list_item_schema.ts b/x-pack/plugins/lists/common/schemas/request/create_exception_list_item_schema.ts index 039a38594a3677..fd3390721d41e9 100644 --- a/x-pack/plugins/lists/common/schemas/request/create_exception_list_item_schema.ts +++ b/x-pack/plugins/lists/common/schemas/request/create_exception_list_item_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { diff --git a/x-pack/plugins/lists/common/schemas/request/create_exception_list_schema.ts b/x-pack/plugins/lists/common/schemas/request/create_exception_list_schema.ts index 7009fbd709e548..ffec974602714a 100644 --- a/x-pack/plugins/lists/common/schemas/request/create_exception_list_schema.ts +++ b/x-pack/plugins/lists/common/schemas/request/create_exception_list_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { diff --git a/x-pack/plugins/lists/common/schemas/request/create_list_item_schema.ts b/x-pack/plugins/lists/common/schemas/request/create_list_item_schema.ts index 351eae48a638de..8627d98bec5b87 100644 --- a/x-pack/plugins/lists/common/schemas/request/create_list_item_schema.ts +++ b/x-pack/plugins/lists/common/schemas/request/create_list_item_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { id, list_id, meta, value } from '../common/schemas'; diff --git a/x-pack/plugins/lists/common/schemas/request/delete_endpoint_list_item_schema.ts b/x-pack/plugins/lists/common/schemas/request/delete_endpoint_list_item_schema.ts index 5af5bcd17e7443..6855261ee375f0 100644 --- a/x-pack/plugins/lists/common/schemas/request/delete_endpoint_list_item_schema.ts +++ b/x-pack/plugins/lists/common/schemas/request/delete_endpoint_list_item_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { id, item_id } from '../common/schemas'; diff --git a/x-pack/plugins/lists/common/schemas/request/delete_exception_list_item_schema.ts b/x-pack/plugins/lists/common/schemas/request/delete_exception_list_item_schema.ts index da6516f4b6fe4a..97abdcf7302407 100644 --- a/x-pack/plugins/lists/common/schemas/request/delete_exception_list_item_schema.ts +++ b/x-pack/plugins/lists/common/schemas/request/delete_exception_list_item_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { id, item_id, namespace_type } from '../common/schemas'; diff --git a/x-pack/plugins/lists/common/schemas/request/delete_exception_list_schema.ts b/x-pack/plugins/lists/common/schemas/request/delete_exception_list_schema.ts index 0911a9342f7a9e..4e12ac12e9e90f 100644 --- a/x-pack/plugins/lists/common/schemas/request/delete_exception_list_schema.ts +++ b/x-pack/plugins/lists/common/schemas/request/delete_exception_list_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { id, list_id, namespace_type } from '../common/schemas'; diff --git a/x-pack/plugins/lists/common/schemas/request/delete_list_item_schema.ts b/x-pack/plugins/lists/common/schemas/request/delete_list_item_schema.ts index 5e2425271c4637..7012a9b723ed1c 100644 --- a/x-pack/plugins/lists/common/schemas/request/delete_list_item_schema.ts +++ b/x-pack/plugins/lists/common/schemas/request/delete_list_item_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { id, list_id, valueOrUndefined } from '../common/schemas'; diff --git a/x-pack/plugins/lists/common/schemas/request/delete_list_schema.ts b/x-pack/plugins/lists/common/schemas/request/delete_list_schema.ts index 830e7fe695d1df..630c77bf80dd2e 100644 --- a/x-pack/plugins/lists/common/schemas/request/delete_list_schema.ts +++ b/x-pack/plugins/lists/common/schemas/request/delete_list_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { id } from '../common/schemas'; diff --git a/x-pack/plugins/lists/common/schemas/request/export_list_item_query_schema.ts b/x-pack/plugins/lists/common/schemas/request/export_list_item_query_schema.ts index 8d14f015d3805f..c393a9b7c08767 100644 --- a/x-pack/plugins/lists/common/schemas/request/export_list_item_query_schema.ts +++ b/x-pack/plugins/lists/common/schemas/request/export_list_item_query_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { list_id } from '../common/schemas'; diff --git a/x-pack/plugins/lists/common/schemas/request/find_endpoint_list_item_schema.ts b/x-pack/plugins/lists/common/schemas/request/find_endpoint_list_item_schema.ts index bc839ce1346f3a..af94229c4ebd32 100644 --- a/x-pack/plugins/lists/common/schemas/request/find_endpoint_list_item_schema.ts +++ b/x-pack/plugins/lists/common/schemas/request/find_endpoint_list_item_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { filter, sort_field, sort_order } from '../common/schemas'; diff --git a/x-pack/plugins/lists/common/schemas/request/find_exception_list_item_schema.ts b/x-pack/plugins/lists/common/schemas/request/find_exception_list_item_schema.ts index 634c080d70b75b..4f9f8ef3632ad1 100644 --- a/x-pack/plugins/lists/common/schemas/request/find_exception_list_item_schema.ts +++ b/x-pack/plugins/lists/common/schemas/request/find_exception_list_item_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { sort_field, sort_order } from '../common/schemas'; diff --git a/x-pack/plugins/lists/common/schemas/request/find_exception_list_schema.ts b/x-pack/plugins/lists/common/schemas/request/find_exception_list_schema.ts index 7ce01c79bbe426..7765bbfbb29bd3 100644 --- a/x-pack/plugins/lists/common/schemas/request/find_exception_list_schema.ts +++ b/x-pack/plugins/lists/common/schemas/request/find_exception_list_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { filter, namespace_type, sort_field, sort_order } from '../common/schemas'; diff --git a/x-pack/plugins/lists/common/schemas/request/find_list_item_schema.ts b/x-pack/plugins/lists/common/schemas/request/find_list_item_schema.ts index ba3dfc6ee33ecf..477b111af424d2 100644 --- a/x-pack/plugins/lists/common/schemas/request/find_list_item_schema.ts +++ b/x-pack/plugins/lists/common/schemas/request/find_list_item_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { cursor, filter, list_id, sort_field, sort_order } from '../common/schemas'; diff --git a/x-pack/plugins/lists/common/schemas/request/find_list_schema.ts b/x-pack/plugins/lists/common/schemas/request/find_list_schema.ts index e5020cc8eff84a..8bbe8003970ca6 100644 --- a/x-pack/plugins/lists/common/schemas/request/find_list_schema.ts +++ b/x-pack/plugins/lists/common/schemas/request/find_list_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { cursor, filter, sort_field, sort_order } from '../common/schemas'; diff --git a/x-pack/plugins/lists/common/schemas/request/import_list_item_query_schema.ts b/x-pack/plugins/lists/common/schemas/request/import_list_item_query_schema.ts index e45f77ca18ae1c..6b0818fdcbe448 100644 --- a/x-pack/plugins/lists/common/schemas/request/import_list_item_query_schema.ts +++ b/x-pack/plugins/lists/common/schemas/request/import_list_item_query_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { RequiredKeepUndefined } from '../../types'; diff --git a/x-pack/plugins/lists/common/schemas/request/import_list_item_schema.ts b/x-pack/plugins/lists/common/schemas/request/import_list_item_schema.ts index 671aeda757effc..4b6f599ab013ec 100644 --- a/x-pack/plugins/lists/common/schemas/request/import_list_item_schema.ts +++ b/x-pack/plugins/lists/common/schemas/request/import_list_item_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { file } from '../common/schemas'; diff --git a/x-pack/plugins/lists/common/schemas/request/patch_list_item_schema.ts b/x-pack/plugins/lists/common/schemas/request/patch_list_item_schema.ts index 9c5284c15ca995..f61def1365f5f5 100644 --- a/x-pack/plugins/lists/common/schemas/request/patch_list_item_schema.ts +++ b/x-pack/plugins/lists/common/schemas/request/patch_list_item_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { _version, id, meta, value } from '../common/schemas'; diff --git a/x-pack/plugins/lists/common/schemas/request/patch_list_schema.ts b/x-pack/plugins/lists/common/schemas/request/patch_list_schema.ts index c92abd2e912eb8..394eab8ddb348f 100644 --- a/x-pack/plugins/lists/common/schemas/request/patch_list_schema.ts +++ b/x-pack/plugins/lists/common/schemas/request/patch_list_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { _version, description, id, meta, name, version } from '../common/schemas'; diff --git a/x-pack/plugins/lists/common/schemas/request/read_endpoint_list_item_schema.ts b/x-pack/plugins/lists/common/schemas/request/read_endpoint_list_item_schema.ts index d6c54e289effe2..01690f0a6b2621 100644 --- a/x-pack/plugins/lists/common/schemas/request/read_endpoint_list_item_schema.ts +++ b/x-pack/plugins/lists/common/schemas/request/read_endpoint_list_item_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { id, item_id } from '../common/schemas'; diff --git a/x-pack/plugins/lists/common/schemas/request/read_exception_list_item_schema.ts b/x-pack/plugins/lists/common/schemas/request/read_exception_list_item_schema.ts index a2ba8126c77880..12e2e2dc278a7b 100644 --- a/x-pack/plugins/lists/common/schemas/request/read_exception_list_item_schema.ts +++ b/x-pack/plugins/lists/common/schemas/request/read_exception_list_item_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { id, item_id, namespace_type } from '../common/schemas'; diff --git a/x-pack/plugins/lists/common/schemas/request/read_exception_list_schema.ts b/x-pack/plugins/lists/common/schemas/request/read_exception_list_schema.ts index f22eca6a8ab151..5db0d2d3662d8c 100644 --- a/x-pack/plugins/lists/common/schemas/request/read_exception_list_schema.ts +++ b/x-pack/plugins/lists/common/schemas/request/read_exception_list_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { id, list_id, namespace_type } from '../common/schemas'; diff --git a/x-pack/plugins/lists/common/schemas/request/read_list_item_schema.ts b/x-pack/plugins/lists/common/schemas/request/read_list_item_schema.ts index 063f430aa9ceac..80d1321406113d 100644 --- a/x-pack/plugins/lists/common/schemas/request/read_list_item_schema.ts +++ b/x-pack/plugins/lists/common/schemas/request/read_list_item_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { id, list_id, value } from '../common/schemas'; diff --git a/x-pack/plugins/lists/common/schemas/request/read_list_schema.ts b/x-pack/plugins/lists/common/schemas/request/read_list_schema.ts index e395875462cb48..b0de5f81514ebe 100644 --- a/x-pack/plugins/lists/common/schemas/request/read_list_schema.ts +++ b/x-pack/plugins/lists/common/schemas/request/read_list_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { id } from '../common/schemas'; diff --git a/x-pack/plugins/lists/common/schemas/request/update_endpoint_list_item_schema.ts b/x-pack/plugins/lists/common/schemas/request/update_endpoint_list_item_schema.ts index 5bf0cb3b7984e9..6ce5ad7858b788 100644 --- a/x-pack/plugins/lists/common/schemas/request/update_endpoint_list_item_schema.ts +++ b/x-pack/plugins/lists/common/schemas/request/update_endpoint_list_item_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { diff --git a/x-pack/plugins/lists/common/schemas/request/update_exception_list_item_schema.ts b/x-pack/plugins/lists/common/schemas/request/update_exception_list_item_schema.ts index 7fbd5cd65f04dc..659dde0b5b533e 100644 --- a/x-pack/plugins/lists/common/schemas/request/update_exception_list_item_schema.ts +++ b/x-pack/plugins/lists/common/schemas/request/update_exception_list_item_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { diff --git a/x-pack/plugins/lists/common/schemas/request/update_exception_list_schema.ts b/x-pack/plugins/lists/common/schemas/request/update_exception_list_schema.ts index dd1bc65d182309..54e0bbafe49812 100644 --- a/x-pack/plugins/lists/common/schemas/request/update_exception_list_schema.ts +++ b/x-pack/plugins/lists/common/schemas/request/update_exception_list_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { diff --git a/x-pack/plugins/lists/common/schemas/request/update_list_item_schema.ts b/x-pack/plugins/lists/common/schemas/request/update_list_item_schema.ts index c6ed5ef0e95179..731c4f20a3ef33 100644 --- a/x-pack/plugins/lists/common/schemas/request/update_list_item_schema.ts +++ b/x-pack/plugins/lists/common/schemas/request/update_list_item_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { _version, id, meta, value } from '../common/schemas'; diff --git a/x-pack/plugins/lists/common/schemas/request/update_list_schema.ts b/x-pack/plugins/lists/common/schemas/request/update_list_schema.ts index a9778f23f13020..cd0ed47cc3cb57 100644 --- a/x-pack/plugins/lists/common/schemas/request/update_list_schema.ts +++ b/x-pack/plugins/lists/common/schemas/request/update_list_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { _version, description, id, meta, name, version } from '../common/schemas'; diff --git a/x-pack/plugins/lists/common/schemas/response/create_endpoint_list_schema.ts b/x-pack/plugins/lists/common/schemas/response/create_endpoint_list_schema.ts index 4653b73347f72e..a2ee6adf9ead90 100644 --- a/x-pack/plugins/lists/common/schemas/response/create_endpoint_list_schema.ts +++ b/x-pack/plugins/lists/common/schemas/response/create_endpoint_list_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { exceptionListSchema } from './exception_list_schema'; diff --git a/x-pack/plugins/lists/common/schemas/response/exception_list_item_schema.ts b/x-pack/plugins/lists/common/schemas/response/exception_list_item_schema.ts index 54907f3f8a8542..65a1a26eaa6227 100644 --- a/x-pack/plugins/lists/common/schemas/response/exception_list_item_schema.ts +++ b/x-pack/plugins/lists/common/schemas/response/exception_list_item_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { diff --git a/x-pack/plugins/lists/common/schemas/response/exception_list_schema.ts b/x-pack/plugins/lists/common/schemas/response/exception_list_schema.ts index 2dbabb0e2bc3b3..6597cb20508cab 100644 --- a/x-pack/plugins/lists/common/schemas/response/exception_list_schema.ts +++ b/x-pack/plugins/lists/common/schemas/response/exception_list_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { diff --git a/x-pack/plugins/lists/common/schemas/response/found_exception_list_item_schema.ts b/x-pack/plugins/lists/common/schemas/response/found_exception_list_item_schema.ts index a58bf433017e66..8f30064c6aff9d 100644 --- a/x-pack/plugins/lists/common/schemas/response/found_exception_list_item_schema.ts +++ b/x-pack/plugins/lists/common/schemas/response/found_exception_list_item_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { page, per_page, total } from '../common/schemas'; diff --git a/x-pack/plugins/lists/common/schemas/response/found_exception_list_schema.ts b/x-pack/plugins/lists/common/schemas/response/found_exception_list_schema.ts index a2ea09a3263ae7..c60a90dff52297 100644 --- a/x-pack/plugins/lists/common/schemas/response/found_exception_list_schema.ts +++ b/x-pack/plugins/lists/common/schemas/response/found_exception_list_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { page, per_page, total } from '../common/schemas'; diff --git a/x-pack/plugins/lists/common/schemas/response/found_list_item_schema.ts b/x-pack/plugins/lists/common/schemas/response/found_list_item_schema.ts index f792774cd0c12b..5a64f4e6965e55 100644 --- a/x-pack/plugins/lists/common/schemas/response/found_list_item_schema.ts +++ b/x-pack/plugins/lists/common/schemas/response/found_list_item_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { cursor, page, per_page, total } from '../common/schemas'; diff --git a/x-pack/plugins/lists/common/schemas/response/found_list_schema.ts b/x-pack/plugins/lists/common/schemas/response/found_list_schema.ts index aaf4a721d050de..1f3f6571a712ee 100644 --- a/x-pack/plugins/lists/common/schemas/response/found_list_schema.ts +++ b/x-pack/plugins/lists/common/schemas/response/found_list_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { cursor, page, per_page, total } from '../common/schemas'; diff --git a/x-pack/plugins/lists/common/schemas/response/list_item_schema.ts b/x-pack/plugins/lists/common/schemas/response/list_item_schema.ts index 9ee801298f9500..fbe66913f98188 100644 --- a/x-pack/plugins/lists/common/schemas/response/list_item_schema.ts +++ b/x-pack/plugins/lists/common/schemas/response/list_item_schema.ts @@ -6,8 +6,6 @@ import * as t from 'io-ts'; -/* eslint-disable @typescript-eslint/camelcase */ - import { _versionOrUndefined, created_at, diff --git a/x-pack/plugins/lists/common/schemas/response/list_schema.ts b/x-pack/plugins/lists/common/schemas/response/list_schema.ts index 539c6221fcb0f0..be0fe53f4d926e 100644 --- a/x-pack/plugins/lists/common/schemas/response/list_schema.ts +++ b/x-pack/plugins/lists/common/schemas/response/list_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { diff --git a/x-pack/plugins/lists/common/schemas/saved_objects/exceptions_list_so_schema.ts b/x-pack/plugins/lists/common/schemas/saved_objects/exceptions_list_so_schema.ts index 2bd2a51ca8c74c..f4db77f4ee0579 100644 --- a/x-pack/plugins/lists/common/schemas/saved_objects/exceptions_list_so_schema.ts +++ b/x-pack/plugins/lists/common/schemas/saved_objects/exceptions_list_so_schema.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { commentsArrayOrUndefined, entriesArrayOrUndefined } from '../types'; diff --git a/x-pack/plugins/lists/common/schemas/types/comment.ts b/x-pack/plugins/lists/common/schemas/types/comment.ts index 4d7aba3b3ad988..0c0d7543fea513 100644 --- a/x-pack/plugins/lists/common/schemas/types/comment.ts +++ b/x-pack/plugins/lists/common/schemas/types/comment.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { NonEmptyString } from '../../shared_imports'; diff --git a/x-pack/plugins/lists/common/schemas/types/entries.ts b/x-pack/plugins/lists/common/schemas/types/entries.ts index 4f20b9278d3ffe..9f014a3e75c14d 100644 --- a/x-pack/plugins/lists/common/schemas/types/entries.ts +++ b/x-pack/plugins/lists/common/schemas/types/entries.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { entriesMatchAny } from './entry_match_any'; diff --git a/x-pack/plugins/lists/common/schemas/types/entry_exists.ts b/x-pack/plugins/lists/common/schemas/types/entry_exists.ts index 4d9c09cc935744..50bf4ca776d522 100644 --- a/x-pack/plugins/lists/common/schemas/types/entry_exists.ts +++ b/x-pack/plugins/lists/common/schemas/types/entry_exists.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { NonEmptyString } from '../../shared_imports'; diff --git a/x-pack/plugins/lists/common/schemas/types/entry_list.ts b/x-pack/plugins/lists/common/schemas/types/entry_list.ts index fcfec5e0cccdf1..edf93ebffada0c 100644 --- a/x-pack/plugins/lists/common/schemas/types/entry_list.ts +++ b/x-pack/plugins/lists/common/schemas/types/entry_list.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { NonEmptyString } from '../../shared_imports'; diff --git a/x-pack/plugins/lists/common/schemas/types/entry_match.ts b/x-pack/plugins/lists/common/schemas/types/entry_match.ts index 247d64674e27da..50cf2138d1587f 100644 --- a/x-pack/plugins/lists/common/schemas/types/entry_match.ts +++ b/x-pack/plugins/lists/common/schemas/types/entry_match.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { NonEmptyString } from '../../shared_imports'; diff --git a/x-pack/plugins/lists/common/schemas/types/entry_match_any.ts b/x-pack/plugins/lists/common/schemas/types/entry_match_any.ts index b6c4ef509c4773..cff943b9a1275f 100644 --- a/x-pack/plugins/lists/common/schemas/types/entry_match_any.ts +++ b/x-pack/plugins/lists/common/schemas/types/entry_match_any.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { NonEmptyString } from '../../shared_imports'; diff --git a/x-pack/plugins/lists/common/schemas/types/entry_nested.ts b/x-pack/plugins/lists/common/schemas/types/entry_nested.ts index f9e8e4356b8112..96653eac81ae7a 100644 --- a/x-pack/plugins/lists/common/schemas/types/entry_nested.ts +++ b/x-pack/plugins/lists/common/schemas/types/entry_nested.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ - import * as t from 'io-ts'; import { NonEmptyString } from '../../shared_imports'; diff --git a/x-pack/plugins/lists/public/exceptions/hooks/use_exception_list.ts b/x-pack/plugins/lists/public/exceptions/hooks/use_exception_list.ts index 8097a7b8c5898e..50196a1a0bcc70 100644 --- a/x-pack/plugins/lists/public/exceptions/hooks/use_exception_list.ts +++ b/x-pack/plugins/lists/public/exceptions/hooks/use_exception_list.ts @@ -94,6 +94,7 @@ export const useExceptionList = ({ } setLoading(false); } else { + // eslint-disable-next-line @typescript-eslint/naming-convention const { page, per_page, total, data } = await fetchExceptionListsItemsByListIds({ filterOptions: filters, http, diff --git a/x-pack/plugins/lists/public/lists/api.ts b/x-pack/plugins/lists/public/lists/api.ts index 211b2445a0429c..2b123280474dfb 100644 --- a/x-pack/plugins/lists/public/lists/api.ts +++ b/x-pack/plugins/lists/public/lists/api.ts @@ -44,6 +44,7 @@ const findLists = async ({ http, cursor, page, + // eslint-disable-next-line @typescript-eslint/naming-convention per_page, signal, }: ApiParams & FindListSchemaEncoded): Promise => { @@ -82,6 +83,7 @@ export { findListsWithValidation as findLists }; const importList = async ({ file, http, + // eslint-disable-next-line @typescript-eslint/naming-convention list_id, type, signal, @@ -154,6 +156,7 @@ export { deleteListWithValidation as deleteList }; const exportList = async ({ http, + // eslint-disable-next-line @typescript-eslint/naming-convention list_id, signal, }: ApiParams & ExportListItemQuerySchemaEncoded): Promise => diff --git a/x-pack/plugins/lists/server/services/exception_lists/utils.ts b/x-pack/plugins/lists/server/services/exception_lists/utils.ts index 836f642899086a..2989a09b0ce00a 100644 --- a/x-pack/plugins/lists/server/services/exception_lists/utils.ts +++ b/x-pack/plugins/lists/server/services/exception_lists/utils.ts @@ -70,6 +70,7 @@ export const transformSavedObjectToExceptionList = ({ const { version: _version, attributes: { + /* eslint-disable @typescript-eslint/naming-convention */ _tags, created_at, created_by, @@ -83,6 +84,7 @@ export const transformSavedObjectToExceptionList = ({ type, updated_by, version, + /* eslint-enable @typescript-eslint/naming-convention */ }, id, updated_at: updatedAt, @@ -168,6 +170,7 @@ export const transformSavedObjectToExceptionListItem = ({ const { version: _version, attributes: { + /* eslint-disable @typescript-eslint/naming-convention */ _tags, comments, created_at, @@ -182,6 +185,7 @@ export const transformSavedObjectToExceptionListItem = ({ tie_breaker_id, type, updated_by, + /* eslint-enable @typescript-eslint/naming-convention */ }, id, updated_at: updatedAt, diff --git a/x-pack/plugins/lists/server/services/utils/transform_elastic_to_list_item.ts b/x-pack/plugins/lists/server/services/utils/transform_elastic_to_list_item.ts index 26fe15e9106fef..14794870bf67ab 100644 --- a/x-pack/plugins/lists/server/services/utils/transform_elastic_to_list_item.ts +++ b/x-pack/plugins/lists/server/services/utils/transform_elastic_to_list_item.ts @@ -25,6 +25,7 @@ export const transformElasticToListItem = ({ const { _id, _source: { + /* eslint-disable @typescript-eslint/naming-convention */ created_at, deserializer, serializer, @@ -34,6 +35,7 @@ export const transformElasticToListItem = ({ list_id, tie_breaker_id, meta, + /* eslint-enable @typescript-eslint/naming-convention */ }, } = hit; const value = findSourceValue(hit._source); diff --git a/x-pack/plugins/maps/public/actions/map_actions.ts b/x-pack/plugins/maps/public/actions/map_actions.ts index 4914432f02de00..7191fb312b211c 100644 --- a/x-pack/plugins/maps/public/actions/map_actions.ts +++ b/x-pack/plugins/maps/public/actions/map_actions.ts @@ -3,8 +3,6 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/consistent-type-definitions */ - import { Dispatch } from 'redux'; import turfBboxPolygon from '@turf/bbox-polygon'; import turfBooleanContains from '@turf/boolean-contains'; diff --git a/x-pack/plugins/maps/public/classes/layers/tile_layer/tile_layer.test.ts b/x-pack/plugins/maps/public/classes/layers/tile_layer/tile_layer.test.ts index 7954d0c59d97f1..2ddbd367baea50 100644 --- a/x-pack/plugins/maps/public/classes/layers/tile_layer/tile_layer.test.ts +++ b/x-pack/plugins/maps/public/classes/layers/tile_layer/tile_layer.test.ts @@ -4,7 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -// eslint-disable-next-line max-classes-per-file import { ITileLayerArguments, TileLayer } from './tile_layer'; import { SOURCE_TYPES } from '../../../../common/constants'; import { XYZTMSSourceDescriptor } from '../../../../common/descriptor_types'; diff --git a/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/convert_to_geojson.test.ts b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/convert_to_geojson.test.ts index e79d8e09fce9b6..523cc869150108 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/convert_to_geojson.test.ts +++ b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/convert_to_geojson.test.ts @@ -53,6 +53,7 @@ describe('convertCompositeRespToGeoJson', () => { avg_of_bytes: 5359.2307692307695, doc_count: 65, 'terms_of_machine.os.keyword': 'win xp', + // eslint-disable-next-line @typescript-eslint/naming-convention 'terms_of_machine.os.keyword__percentage': 25, }, type: 'Feature', @@ -80,6 +81,7 @@ describe('convertCompositeRespToGeoJson', () => { avg_of_bytes: 5359.2307692307695, doc_count: 65, 'terms_of_machine.os.keyword': 'win xp', + // eslint-disable-next-line @typescript-eslint/naming-convention 'terms_of_machine.os.keyword__percentage': 25, }, type: 'Feature', @@ -127,6 +129,7 @@ describe('convertRegularRespToGeoJson', () => { avg_of_bytes: 5359.2307692307695, doc_count: 65, 'terms_of_machine.os.keyword': 'win xp', + // eslint-disable-next-line @typescript-eslint/naming-convention 'terms_of_machine.os.keyword__percentage': 25, }, type: 'Feature', @@ -154,6 +157,7 @@ describe('convertRegularRespToGeoJson', () => { avg_of_bytes: 5359.2307692307695, doc_count: 65, 'terms_of_machine.os.keyword': 'win xp', + // eslint-disable-next-line @typescript-eslint/naming-convention 'terms_of_machine.os.keyword__percentage': 25, }, type: 'Feature', diff --git a/x-pack/plugins/maps/public/classes/sources/es_pew_pew_source/convert_to_lines.test.ts b/x-pack/plugins/maps/public/classes/sources/es_pew_pew_source/convert_to_lines.test.ts index 14c62aa0207feb..23e6c25ac0d042 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_pew_pew_source/convert_to_lines.test.ts +++ b/x-pack/plugins/maps/public/classes/sources/es_pew_pew_source/convert_to_lines.test.ts @@ -19,6 +19,7 @@ const esResponse = { { key: '4/9/3', doc_count: 1, + // eslint-disable-next-line @typescript-eslint/naming-convention terms_of_Carrier: { buckets: [ { @@ -34,6 +35,7 @@ const esResponse = { }, count: 1, }, + // eslint-disable-next-line @typescript-eslint/naming-convention avg_of_FlightDelayMin: { value: 3, }, @@ -59,9 +61,12 @@ it('Should convert elasticsearch aggregation response into feature collection of }, id: '10.39269994944334,43.68389896117151,4/9/3', properties: { + // eslint-disable-next-line @typescript-eslint/naming-convention avg_of_FlightDelayMin: 3, doc_count: 1, + // eslint-disable-next-line @typescript-eslint/naming-convention terms_of_Carrier: 'ES-Air', + // eslint-disable-next-line @typescript-eslint/naming-convention terms_of_Carrier__percentage: 100, }, type: 'Feature', diff --git a/x-pack/plugins/maps/public/classes/sources/mvt_single_layer_vector_source/mvt_field_config_editor.tsx b/x-pack/plugins/maps/public/classes/sources/mvt_single_layer_vector_source/mvt_field_config_editor.tsx index b2a93a4ef88ad8..080138839ba2e7 100644 --- a/x-pack/plugins/maps/public/classes/sources/mvt_single_layer_vector_source/mvt_field_config_editor.tsx +++ b/x-pack/plugins/maps/public/classes/sources/mvt_single_layer_vector_source/mvt_field_config_editor.tsx @@ -3,7 +3,6 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/consistent-type-definitions */ import React, { ChangeEvent, Component, Fragment } from 'react'; import { diff --git a/x-pack/plugins/maps/public/classes/sources/mvt_single_layer_vector_source/mvt_single_layer_vector_source_editor.tsx b/x-pack/plugins/maps/public/classes/sources/mvt_single_layer_vector_source/mvt_single_layer_vector_source_editor.tsx index 49487e96a45440..72fe2d9a90a719 100644 --- a/x-pack/plugins/maps/public/classes/sources/mvt_single_layer_vector_source/mvt_single_layer_vector_source_editor.tsx +++ b/x-pack/plugins/maps/public/classes/sources/mvt_single_layer_vector_source/mvt_single_layer_vector_source_editor.tsx @@ -3,7 +3,6 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/consistent-type-definitions */ import React, { Component, ChangeEvent } from 'react'; import _ from 'lodash'; diff --git a/x-pack/plugins/maps/public/classes/styles/vector/components/legend/symbol_icon.tsx b/x-pack/plugins/maps/public/classes/styles/vector/components/legend/symbol_icon.tsx index c5d41ae2b1a9b4..839f7a42eb9d6d 100644 --- a/x-pack/plugins/maps/public/classes/styles/vector/components/legend/symbol_icon.tsx +++ b/x-pack/plugins/maps/public/classes/styles/vector/components/legend/symbol_icon.tsx @@ -55,12 +55,7 @@ export class SymbolIcon extends Component { return null; } - const { - symbolId, // eslint-disable-line no-unused-vars - fill, // eslint-disable-line no-unused-vars - stroke, // eslint-disable-line no-unused-vars - ...rest - } = this.props; + const { symbolId, fill, stroke, ...rest } = this.props; return ( extends IStyleProperty { getValueSuggestions(query: string): Promise; } -type fieldFormatter = (value: string | number | undefined) => string | number; +type FieldFormatter = (value: string | number | undefined) => string | number; export class DynamicStyleProperty extends AbstractStyleProperty implements IDynamicStyleProperty { @@ -56,14 +55,14 @@ export class DynamicStyleProperty extends AbstractStyleProperty protected readonly _field: IField | null; protected readonly _layer: IVectorLayer; - protected readonly _getFieldFormatter: (fieldName: string) => null | fieldFormatter; + protected readonly _getFieldFormatter: (fieldName: string) => null | FieldFormatter; constructor( options: T, styleName: VECTOR_STYLES, field: IField | null, vectorLayer: IVectorLayer, - getFieldFormatter: (fieldName: string) => null | fieldFormatter + getFieldFormatter: (fieldName: string) => null | FieldFormatter ) { super(options, styleName); this._field = field; diff --git a/x-pack/plugins/maps/public/classes/util/es_agg_utils.test.ts b/x-pack/plugins/maps/public/classes/util/es_agg_utils.test.ts index 445a7621194b7f..b51f48fe621579 100644 --- a/x-pack/plugins/maps/public/classes/util/es_agg_utils.test.ts +++ b/x-pack/plugins/maps/public/classes/util/es_agg_utils.test.ts @@ -34,6 +34,7 @@ describe('extractPropertiesFromBucket', () => { expect(properties).toEqual({ doc_count: 3, 'terms_of_machine.os.keyword': 'win xp', + // eslint-disable-next-line @typescript-eslint/naming-convention 'terms_of_machine.os.keyword__percentage': 33, }); }); diff --git a/x-pack/plugins/maps/public/components/tooltip_selector/tooltip_selector.tsx b/x-pack/plugins/maps/public/components/tooltip_selector/tooltip_selector.tsx index 6c07c322d5c495..84316a1b9105d2 100644 --- a/x-pack/plugins/maps/public/components/tooltip_selector/tooltip_selector.tsx +++ b/x-pack/plugins/maps/public/components/tooltip_selector/tooltip_selector.tsx @@ -176,7 +176,9 @@ export class TooltipSelector extends Component { {(provided, state) => (
    diff --git a/x-pack/plugins/maps/public/connected_components/add_layer_panel/flyout_body/flyout_body.tsx b/x-pack/plugins/maps/public/connected_components/add_layer_panel/flyout_body/flyout_body.tsx index 3f493ef7d43555..f7de84a9c1ad00 100644 --- a/x-pack/plugins/maps/public/connected_components/add_layer_panel/flyout_body/flyout_body.tsx +++ b/x-pack/plugins/maps/public/connected_components/add_layer_panel/flyout_body/flyout_body.tsx @@ -9,7 +9,6 @@ import { EuiButtonEmpty, EuiSpacer } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { LayerWizardSelect } from './layer_wizard_select'; import { LayerWizard, RenderWizardArguments } from '../../../classes/layers/layer_wizard_registry'; -/* eslint-disable @typescript-eslint/consistent-type-definitions */ type Props = RenderWizardArguments & { layerWizard: LayerWizard | null; diff --git a/x-pack/plugins/maps/public/connected_components/add_layer_panel/flyout_body/layer_wizard_select.test.tsx b/x-pack/plugins/maps/public/connected_components/add_layer_panel/flyout_body/layer_wizard_select.test.tsx index e802c5259e5eda..d64e38cf49deac 100644 --- a/x-pack/plugins/maps/public/connected_components/add_layer_panel/flyout_body/layer_wizard_select.test.tsx +++ b/x-pack/plugins/maps/public/connected_components/add_layer_panel/flyout_body/layer_wizard_select.test.tsx @@ -17,6 +17,7 @@ const defaultProps = { describe('LayerWizardSelect', () => { beforeAll(() => { + // eslint-disable-next-line @typescript-eslint/no-var-requires require('../../../classes/layers/layer_wizard_registry').getLayerWizards = async () => { return [ { diff --git a/x-pack/plugins/maps/public/index_pattern_util.test.ts b/x-pack/plugins/maps/public/index_pattern_util.test.ts index 27b0a4aac9bf74..ffcc6da52677a4 100644 --- a/x-pack/plugins/maps/public/index_pattern_util.test.ts +++ b/x-pack/plugins/maps/public/index_pattern_util.test.ts @@ -68,6 +68,7 @@ describe('Gold+ licensing', () => { describe('basic license', () => { beforeEach(() => { + // eslint-disable-next-line @typescript-eslint/no-var-requires require('./kibana_services').getIsGoldPlus = () => false; }); @@ -90,6 +91,7 @@ describe('Gold+ licensing', () => { describe('gold license', () => { beforeEach(() => { + // eslint-disable-next-line @typescript-eslint/no-var-requires require('./kibana_services').getIsGoldPlus = () => true; }); describe('getAggregatableGeoFieldTypes', () => { diff --git a/x-pack/plugins/maps_legacy_licensing/public/plugin.ts b/x-pack/plugins/maps_legacy_licensing/public/plugin.ts index 69c25efd96e758..eaf527f856bc5f 100644 --- a/x-pack/plugins/maps_legacy_licensing/public/plugin.ts +++ b/x-pack/plugins/maps_legacy_licensing/public/plugin.ts @@ -13,7 +13,6 @@ import { LicensingPluginSetup, ILicense } from '../../licensing/public'; * @public */ -// eslint-disable-next-line @typescript-eslint/no-empty-interface export interface MapsLegacyLicensingSetupDependencies { licensing: LicensingPluginSetup; mapsLegacy: any; diff --git a/x-pack/plugins/ml/public/application/components/chart_tooltip/chart_tooltip.tsx b/x-pack/plugins/ml/public/application/components/chart_tooltip/chart_tooltip.tsx index a354612a348dc7..07e33a43d3ff9a 100644 --- a/x-pack/plugins/ml/public/application/components/chart_tooltip/chart_tooltip.tsx +++ b/x-pack/plugins/ml/public/application/components/chart_tooltip/chart_tooltip.tsx @@ -69,7 +69,7 @@ const Tooltip: FC<{ service: ChartTooltipService }> = React.memo(({ service }) = .slice(1) .map(({ label, value, color, isHighlighted, seriesIdentifier, valueAccessor }) => { const classes = classNames('mlChartTooltip__item', { - /* eslint @typescript-eslint/camelcase:0 */ + // eslint-disable-next-line @typescript-eslint/naming-convention echTooltip__rowHighlighted: isHighlighted, }); return ( diff --git a/x-pack/plugins/ml/public/application/components/data_grid/column_chart.tsx b/x-pack/plugins/ml/public/application/components/data_grid/column_chart.tsx index 00e2d5b14a96be..a3a67fbb8bb751 100644 --- a/x-pack/plugins/ml/public/application/components/data_grid/column_chart.tsx +++ b/x-pack/plugins/ml/public/application/components/data_grid/column_chart.tsx @@ -61,6 +61,7 @@ export const ColumnChart: FC = ({ chartData, columnType, dataTestSubj }) )}
    { setVisibleColumns(defaultVisibleColumns); - // eslint-disable-next-line react-hooks/exhaustive-deps }, [defaultVisibleColumns.join()]); const [invalidSortingColumnns, setInvalidSortingColumnns] = useState([]); diff --git a/x-pack/plugins/ml/public/application/contexts/kibana/kibana_context.ts b/x-pack/plugins/ml/public/application/contexts/kibana/kibana_context.ts index 3bc3b8c2c6dfd2..e3da9b509e6204 100644 --- a/x-pack/plugins/ml/public/application/contexts/kibana/kibana_context.ts +++ b/x-pack/plugins/ml/public/application/contexts/kibana/kibana_context.ts @@ -23,6 +23,5 @@ interface StartPlugins { } export type StartServices = CoreStart & StartPlugins & { kibanaVersion: string } & MlServicesContext; -// eslint-disable-next-line react-hooks/rules-of-hooks export const useMlKibana = () => useKibana(); export type MlKibanaReactContextValue = KibanaReactContextValue; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/common/fields.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/common/fields.ts index 1b28875a624f8d..1b99aac812fcdd 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/common/fields.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/common/fields.ts @@ -47,6 +47,7 @@ export const EXTENDED_NUMERICAL_TYPES = new Set([ ES_FIELD_TYPES.SCALED_FLOAT, ]); +// eslint-disable-next-line @typescript-eslint/naming-convention export const ML__ID_COPY = 'ml__id_copy'; export const isKeywordAndTextType = (fieldName: string): boolean => { diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/analysis_fields_table.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/analysis_fields_table.tsx index a229a79d316d72..a52cbb99d7f48b 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/analysis_fields_table.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/configuration_step/analysis_fields_table.tsx @@ -54,7 +54,7 @@ const columns = [ id: 'is_included', alignment: LEFT_ALIGNMENT, isSortable: true, - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line @typescript-eslint/naming-convention render: ({ is_included }: { is_included: boolean }) => (is_included ? 'Yes' : 'No'), }, { @@ -64,7 +64,7 @@ const columns = [ id: 'is_required', alignment: LEFT_ALIGNMENT, isSortable: true, - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line @typescript-eslint/naming-convention render: ({ is_required }: { is_required: boolean }) => (is_required ? 'Yes' : 'No'), }, { diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/hooks/use_index_data.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/hooks/use_index_data.ts index 2cecffc9932570..eab5165a421375 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/hooks/use_index_data.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/hooks/use_index_data.ts @@ -63,7 +63,6 @@ export const useIndexData = ( useEffect(() => { resetPagination(); // custom comparison - // eslint-disable-next-line react-hooks/exhaustive-deps }, [JSON.stringify(query)]); const getIndexData = async function () { @@ -103,7 +102,6 @@ export const useIndexData = ( useEffect(() => { getIndexData(); // custom comparison - // eslint-disable-next-line react-hooks/exhaustive-deps }, [indexPattern.title, JSON.stringify([query, pagination, sortingColumns])]); const dataLoader = useMemo(() => new DataLoader(indexPattern, toastNotifications), [ @@ -132,7 +130,6 @@ export const useIndexData = ( fetchColumnChartsData(); } // custom comparison - // eslint-disable-next-line react-hooks/exhaustive-deps }, [ dataGrid.chartsVisible, indexPattern.title, diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_results_table/use_exploration_results.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_results_table/use_exploration_results.ts index 98dd40986e32b6..8d53214d23d477 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_results_table/use_exploration_results.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_results_table/use_exploration_results.ts @@ -70,7 +70,6 @@ export const useExplorationResults = ( useEffect(() => { getIndexData(jobConfig, dataGrid, searchQuery); // custom comparison - // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobConfig && jobConfig.id, dataGrid.pagination, searchQuery, dataGrid.sortingColumns]); const dataLoader = useMemo( @@ -103,7 +102,6 @@ export const useExplorationResults = ( fetchColumnChartsData(); } // custom comparison - // eslint-disable-next-line react-hooks/exhaustive-deps }, [ dataGrid.chartsVisible, jobConfig?.dest.index, diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/outlier_exploration/outlier_exploration.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/outlier_exploration/outlier_exploration.tsx index 4c4731d0dad5f7..2b1c40f0eb734a 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/outlier_exploration/outlier_exploration.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/outlier_exploration/outlier_exploration.tsx @@ -56,7 +56,6 @@ export const OutlierExploration: FC = React.memo(({ jobId }) = const { columnsWithCharts, errorMessage, status, tableItems } = outlierData; - /* eslint-disable-next-line react-hooks/rules-of-hooks */ const colorRange = useColorRange( COLOR_RANGE.BLUE, COLOR_RANGE_SCALE.INFLUENCER, diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/outlier_exploration/use_outlier_data.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/outlier_exploration/use_outlier_data.ts index 90294a09c0adc3..24649ae5f1e71d 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/outlier_exploration/use_outlier_data.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/outlier_exploration/use_outlier_data.ts @@ -77,7 +77,6 @@ export const useOutlierData = ( useEffect(() => { getIndexData(jobConfig, dataGrid, searchQuery); // custom comparison - // eslint-disable-next-line react-hooks/exhaustive-deps }, [jobConfig && jobConfig.id, dataGrid.pagination, searchQuery, dataGrid.sortingColumns]); const dataLoader = useMemo( @@ -112,7 +111,6 @@ export const useOutlierData = ( fetchColumnChartsData(); } // custom comparison - // eslint-disable-next-line react-hooks/exhaustive-deps }, [ dataGrid.chartsVisible, jobConfig?.dest.index, diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/regression_exploration/evaluate_panel.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/regression_exploration/evaluate_panel.tsx index 75c41c097192ea..895d217555ef46 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/regression_exploration/evaluate_panel.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/regression_exploration/evaluate_panel.tsx @@ -94,6 +94,7 @@ export const EvaluatePanel: FC = ({ jobConfig, jobStatus, searchQuery }) genErrorEval.eval && isRegressionEvaluateResponse(genErrorEval.eval) ) { + // eslint-disable-next-line @typescript-eslint/naming-convention const { mse, msle, huber, r_squared } = getValuesFromResponse(genErrorEval.eval); setGeneralizationEval({ mse, @@ -131,6 +132,7 @@ export const EvaluatePanel: FC = ({ jobConfig, jobStatus, searchQuery }) trainingErrorEval.eval && isRegressionEvaluateResponse(trainingErrorEval.eval) ) { + // eslint-disable-next-line @typescript-eslint/naming-convention const { mse, msle, huber, r_squared } = getValuesFromResponse(trainingErrorEval.eval); setTrainingEval({ mse, diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_clone/clone_button.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_clone/clone_button.tsx index 010aa7b8513b5d..d78e1bcc1a913c 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_clone/clone_button.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_clone/clone_button.tsx @@ -314,6 +314,7 @@ export type CloneDataFrameAnalyticsConfig = Omit< export function extractCloningConfig({ id, version, + // eslint-disable-next-line @typescript-eslint/naming-convention create_time, ...configToClone }: DeepReadonly): CloneDataFrameAnalyticsConfig { diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row.tsx index 5276fedff0fde0..645c6c276a6f9f 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/expanded_row.tsx @@ -95,6 +95,7 @@ export const ExpandedRow: FC = ({ item }) => { genErrorEval.eval && isRegressionEvaluateResponse(genErrorEval.eval) ) { + // eslint-disable-next-line @typescript-eslint/naming-convention const { mse, msle, huber, r_squared } = getValuesFromResponse(genErrorEval.eval); setGeneralizationEval({ mse, @@ -129,6 +130,7 @@ export const ExpandedRow: FC = ({ item }) => { trainingErrorEval.eval && isRegressionEvaluateResponse(trainingErrorEval.eval) ) { + // eslint-disable-next-line @typescript-eslint/naming-convention const { mse, msle, huber, r_squared } = getValuesFromResponse(trainingErrorEval.eval); setTrainingEval({ mse, diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.ts index 69599f43ef297c..f932e4d0db7d7e 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.ts @@ -18,7 +18,6 @@ import { CloneDataFrameAnalyticsConfig } from '../../components/action_clone'; export enum DEFAULT_MODEL_MEMORY_LIMIT { regression = '100mb', - // eslint-disable-next-line @typescript-eslint/camelcase outlier_detection = '50mb', classification = '100mb', } diff --git a/x-pack/plugins/ml/public/application/services/results_service/index.ts b/x-pack/plugins/ml/public/application/services/results_service/index.ts index 6c508422e70632..5547c4096e3de1 100644 --- a/x-pack/plugins/ml/public/application/services/results_service/index.ts +++ b/x-pack/plugins/ml/public/application/services/results_service/index.ts @@ -10,9 +10,9 @@ import { ml, MlApiServices } from '../ml_api_service'; export type MlResultsService = typeof mlResultsService; -type time = string; +type Time = string; export interface ModelPlotOutputResults { - results: Record; + results: Record; } export interface CriteriaField { diff --git a/x-pack/plugins/ml/public/application/util/custom_url_utils.test.ts b/x-pack/plugins/ml/public/application/util/custom_url_utils.test.ts index 428060dd2c31b4..2912aad6819cff 100644 --- a/x-pack/plugins/ml/public/application/util/custom_url_utils.test.ts +++ b/x-pack/plugins/ml/public/application/util/custom_url_utils.test.ts @@ -211,7 +211,6 @@ describe('ML - custom URL utils', () => { ); }); - // eslint-disable-next-line ban/ban test('truncates long queries', () => { const TEST_DOC_WITH_METHOD: AnomalyRecordDoc = { ...TEST_DOC, diff --git a/x-pack/plugins/monitoring/public/alerts/panel.tsx b/x-pack/plugins/monitoring/public/alerts/panel.tsx index 91a426cc8798e2..91604acf115fa1 100644 --- a/x-pack/plugins/monitoring/public/alerts/panel.tsx +++ b/x-pack/plugins/monitoring/public/alerts/panel.tsx @@ -23,7 +23,6 @@ import { AlertMessage } from '../../server/alerts/types'; import { Legacy } from '../legacy_shims'; import { replaceTokens } from './lib/replace_tokens'; import { AlertsContextProvider } from '../../../triggers_actions_ui/public'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { AlertEdit } from '../../../triggers_actions_ui/public'; import { isInSetupMode, hideBottomBar, showBottomBar } from '../lib/setup_mode'; import { BASE_ALERT_API_PATH } from '../../../alerts/common'; diff --git a/x-pack/plugins/monitoring/public/lib/setup_mode.tsx b/x-pack/plugins/monitoring/public/lib/setup_mode.tsx index b99093a3d8ad19..3425e0ee2a8188 100644 --- a/x-pack/plugins/monitoring/public/lib/setup_mode.tsx +++ b/x-pack/plugins/monitoring/public/lib/setup_mode.tsx @@ -110,7 +110,7 @@ export const updateSetupModeData = async (uuid?: string, fetchWithoutClusterUuid text, }); }); - return toggleSetupMode(false); // eslint-disable-line no-use-before-define + return toggleSetupMode(false); } notifySetupModeDataChange(); @@ -160,7 +160,7 @@ export const toggleSetupMode = (inSetupMode: boolean) => { setupModeState.enabled = inSetupMode; globalState.inSetupMode = inSetupMode; globalState.save(); - setSetupModeMenuItem(); // eslint-disable-line no-use-before-define + setSetupModeMenuItem(); notifySetupModeDataChange(); if (inSetupMode) { diff --git a/x-pack/plugins/monitoring/server/telemetry_collection/get_kibana_stats.ts b/x-pack/plugins/monitoring/server/telemetry_collection/get_kibana_stats.ts index 45df56b2139ff5..e87c8398ad0b01 100644 --- a/x-pack/plugins/monitoring/server/telemetry_collection/get_kibana_stats.ts +++ b/x-pack/plugins/monitoring/server/telemetry_collection/get_kibana_stats.ts @@ -104,9 +104,11 @@ export function getUsageStats(rawStats: SearchResponse) { dashboard, visualization, search, + /* eslint-disable @typescript-eslint/naming-convention */ index_pattern, graph_workspace, timelion_sheet, + /* eslint-enable @typescript-eslint/naming-convention */ xpack, ...pluginsTop } = currUsage; diff --git a/x-pack/plugins/observability/public/data_handler.ts b/x-pack/plugins/observability/public/data_handler.ts index 834d7a52d767f3..b0bdcf17b9066a 100644 --- a/x-pack/plugins/observability/public/data_handler.ts +++ b/x-pack/plugins/observability/public/data_handler.ts @@ -40,7 +40,6 @@ export async function fetchHasData(): Promise> return result.value; } - // eslint-disable-next-line no-console console.error('Error while fetching has data', result.reason); return false; }); diff --git a/x-pack/plugins/observability/public/hooks/use_route_params.tsx b/x-pack/plugins/observability/public/hooks/use_route_params.tsx index 93a79bfda7fc13..1b32933eec3e64 100644 --- a/x-pack/plugins/observability/public/hooks/use_route_params.tsx +++ b/x-pack/plugins/observability/public/hooks/use_route_params.tsx @@ -36,12 +36,10 @@ export function useRouteParams(params: Params) { const queryResult = rts.queryRt.decode(queryParams); const pathResult = rts.pathRt.decode(pathParams); if (isLeft(queryResult)) { - // eslint-disable-next-line no-console console.error(PathReporter.report(queryResult)[0]); } if (isLeft(pathResult)) { - // eslint-disable-next-line no-console console.error(PathReporter.report(pathResult)[0]); } diff --git a/x-pack/plugins/observability/public/services/get_news_feed.ts b/x-pack/plugins/observability/public/services/get_news_feed.ts index 3a6e60fa741883..af8d062154e2d6 100644 --- a/x-pack/plugins/observability/public/services/get_news_feed.ts +++ b/x-pack/plugins/observability/public/services/get_news_feed.ts @@ -20,7 +20,6 @@ export async function getNewsFeed({ core }: { core: AppMountContext['core'] }): try { return await core.http.get('https://feeds.elastic.co/observability-solution/v8.0.0.json'); } catch (e) { - // eslint-disable-next-line no-console console.error('Error while fetching news feed', e); return { items: [] }; } diff --git a/x-pack/plugins/observability/public/services/get_observability_alerts.ts b/x-pack/plugins/observability/public/services/get_observability_alerts.ts index fe5451597688ab..602e4cf2bdd13e 100644 --- a/x-pack/plugins/observability/public/services/get_observability_alerts.ts +++ b/x-pack/plugins/observability/public/services/get_observability_alerts.ts @@ -23,7 +23,6 @@ export async function getObservabilityAlerts({ core }: { core: AppMountContext[' return data.filter(({ consumer }) => allowedConsumers.includes(consumer)); } catch (e) { - // eslint-disable-next-line no-console console.error('Error while fetching alerts', e); return []; } diff --git a/x-pack/plugins/oss_telemetry/server/test_utils/index.ts b/x-pack/plugins/oss_telemetry/server/test_utils/index.ts index 3eee1978d4f1c0..9201899d5a161a 100644 --- a/x-pack/plugins/oss_telemetry/server/test_utils/index.ts +++ b/x-pack/plugins/oss_telemetry/server/test_utils/index.ts @@ -13,7 +13,6 @@ import { ConcreteTaskInstance, TaskStatus, TaskManagerStartContract, - // eslint-disable-next-line @kbn/eslint/no-restricted-paths } from '../../../task_manager/server'; export const getMockTaskInstance = ( diff --git a/x-pack/plugins/painless_lab/public/application/components/main_controls.tsx b/x-pack/plugins/painless_lab/public/application/components/main_controls.tsx index 7018cfd27c5091..4d44ae01761039 100644 --- a/x-pack/plugins/painless_lab/public/application/components/main_controls.tsx +++ b/x-pack/plugins/painless_lab/public/application/components/main_controls.tsx @@ -93,6 +93,7 @@ export function MainControls({ let classes = ''; if (isNavLegacy) { classes = classNames('painlessLab__bottomBar', { + // eslint-disable-next-line @typescript-eslint/naming-convention 'painlessLab__bottomBar-isNavDrawerLocked': isNavDrawerLocked, }); } diff --git a/x-pack/plugins/painless_lab/public/links.ts b/x-pack/plugins/painless_lab/public/links.ts index 8f610140c3f34c..c3a6ab5fafabfd 100644 --- a/x-pack/plugins/painless_lab/public/links.ts +++ b/x-pack/plugins/painless_lab/public/links.ts @@ -8,6 +8,7 @@ import { DocLinksStart } from 'src/core/public'; export type Links = ReturnType; +// eslint-disable-next-line @typescript-eslint/naming-convention export const getLinks = ({ DOC_LINK_VERSION, ELASTIC_WEBSITE_URL }: DocLinksStart) => Object.freeze({ painlessExecuteAPI: `${ELASTIC_WEBSITE_URL}guide/en/elasticsearch/painless/${DOC_LINK_VERSION}/painless-execute-api.html`, diff --git a/x-pack/plugins/reporting/public/lib/job_completion_notifications.ts b/x-pack/plugins/reporting/public/lib/job_completion_notifications.ts index 99f37738563252..06694361b757d5 100644 --- a/x-pack/plugins/reporting/public/lib/job_completion_notifications.ts +++ b/x-pack/plugins/reporting/public/lib/job_completion_notifications.ts @@ -6,7 +6,7 @@ import { JOB_COMPLETION_NOTIFICATIONS_SESSION_KEY } from '../../constants'; -type jobId = string; +type JobId = string; const set = (jobs: any) => { sessionStorage.setItem(JOB_COMPLETION_NOTIFICATIONS_SESSION_KEY, JSON.stringify(jobs)); @@ -17,13 +17,13 @@ const getAll = () => { return sessionValue ? JSON.parse(sessionValue) : []; }; -export const add = (jobId: jobId) => { +export const add = (jobId: JobId) => { const jobs = getAll(); jobs.push(jobId); set(jobs); }; -export const remove = (jobId: jobId) => { +export const remove = (jobId: JobId) => { const jobs = getAll(); const index = jobs.indexOf(jobId); diff --git a/x-pack/plugins/reporting/public/panel_actions/get_csv_panel_action.test.ts b/x-pack/plugins/reporting/public/panel_actions/get_csv_panel_action.test.ts index f07235742a1d36..b97a56c15fb4d1 100644 --- a/x-pack/plugins/reporting/public/panel_actions/get_csv_panel_action.test.ts +++ b/x-pack/plugins/reporting/public/panel_actions/get_csv_panel_action.test.ts @@ -9,7 +9,7 @@ import { first } from 'rxjs/operators'; import { LicensingPluginSetup } from '../../../licensing/public'; import { GetCsvReportPanelAction } from './get_csv_panel_action'; -type licenseResults = 'valid' | 'invalid' | 'unavailable' | 'expired'; +type LicenseResults = 'valid' | 'invalid' | 'unavailable' | 'expired'; describe('GetCsvReportPanelAction', () => { let core: any; @@ -27,7 +27,7 @@ describe('GetCsvReportPanelAction', () => { }); beforeEach(() => { - mockLicense$ = (state: licenseResults = 'valid') => { + mockLicense$ = (state: LicenseResults = 'valid') => { return (of({ check: jest.fn().mockImplementation(() => ({ state })), }) as unknown) as LicensingPluginSetup['license$']; diff --git a/x-pack/plugins/reporting/server/export_types/common/validate_urls.test.ts b/x-pack/plugins/reporting/server/export_types/common/validate_urls.test.ts index 5e576e13c02275..5464f3d6dd505b 100644 --- a/x-pack/plugins/reporting/server/export_types/common/validate_urls.test.ts +++ b/x-pack/plugins/reporting/server/export_types/common/validate_urls.test.ts @@ -35,6 +35,7 @@ describe('Validate URLS', () => { }); it(`throws for JS URLs`, () => { + // eslint-disable-next-line no-script-url expect(() => validateUrls(['javascript:alert(document.cookies)'])).toThrow(); }); diff --git a/x-pack/plugins/reporting/server/lib/screenshots/observable.test.ts b/x-pack/plugins/reporting/server/lib/screenshots/observable.test.ts index 0ad41cd904853f..b25e8fab3abcf7 100644 --- a/x-pack/plugins/reporting/server/lib/screenshots/observable.test.ts +++ b/x-pack/plugins/reporting/server/lib/screenshots/observable.test.ts @@ -16,7 +16,6 @@ jest.mock('../../browsers/chromium/puppeteer', () => ({ })); import * as Rx from 'rxjs'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { loggingSystemMock } from '../../../../../../src/core/server/mocks'; import { HeadlessChromiumDriver } from '../../browsers'; import { LevelLogger } from '../'; diff --git a/x-pack/plugins/reporting/server/routes/generation.test.ts b/x-pack/plugins/reporting/server/routes/generation.test.ts index c73c443d2390bb..87a696948ad84d 100644 --- a/x-pack/plugins/reporting/server/routes/generation.test.ts +++ b/x-pack/plugins/reporting/server/routes/generation.test.ts @@ -15,12 +15,12 @@ import { createMockReportingCore } from '../test_helpers'; import { createMockLevelLogger } from '../test_helpers/create_mock_levellogger'; import { registerJobGenerationRoutes } from './generation'; -type setupServerReturn = UnwrapPromise>; +type SetupServerReturn = UnwrapPromise>; describe('POST /api/reporting/generate', () => { const reportingSymbol = Symbol('reporting'); - let server: setupServerReturn['server']; - let httpSetup: setupServerReturn['httpSetup']; + let server: SetupServerReturn['server']; + let httpSetup: SetupServerReturn['httpSetup']; let mockExportTypesRegistry: ExportTypesRegistry; let callClusterStub: any; let core: ReportingCore; diff --git a/x-pack/plugins/reporting/server/routes/jobs.test.ts b/x-pack/plugins/reporting/server/routes/jobs.test.ts index a0e3379da12be7..2957bc76f46826 100644 --- a/x-pack/plugins/reporting/server/routes/jobs.test.ts +++ b/x-pack/plugins/reporting/server/routes/jobs.test.ts @@ -16,12 +16,12 @@ import { createMockReportingCore } from '../test_helpers'; import { ExportTypeDefinition } from '../types'; import { registerJobInfoRoutes } from './jobs'; -type setupServerReturn = UnwrapPromise>; +type SetupServerReturn = UnwrapPromise>; describe('GET /api/reporting/jobs/download', () => { const reportingSymbol = Symbol('reporting'); - let server: setupServerReturn['server']; - let httpSetup: setupServerReturn['httpSetup']; + let server: SetupServerReturn['server']; + let httpSetup: SetupServerReturn['httpSetup']; let exportTypesRegistry: ExportTypesRegistry; let core: ReportingCore; diff --git a/x-pack/plugins/reporting/server/test_helpers/create_mock_server.ts b/x-pack/plugins/reporting/server/test_helpers/create_mock_server.ts index 01b9f6cbd9cd68..078d153cff18df 100644 --- a/x-pack/plugins/reporting/server/test_helpers/create_mock_server.ts +++ b/x-pack/plugins/reporting/server/test_helpers/create_mock_server.ts @@ -6,7 +6,6 @@ // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { createHttpServer, createCoreContext } from 'src/core/server/http/test_utils'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { coreMock } from 'src/core/server/mocks'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { ContextService } from 'src/core/server/context/context_service'; diff --git a/x-pack/plugins/rollup/server/lib/format_es_error.ts b/x-pack/plugins/rollup/server/lib/format_es_error.ts index 9dde027cd69492..0f00bfb0c1e7c5 100644 --- a/x-pack/plugins/rollup/server/lib/format_es_error.ts +++ b/x-pack/plugins/rollup/server/lib/format_es_error.ts @@ -8,13 +8,12 @@ function extractCausedByChain( causedBy: Record = {}, accumulator: string[] = [] ): string[] { - const { reason, caused_by } = causedBy; // eslint-disable-line @typescript-eslint/camelcase + const { reason, caused_by } = causedBy; // eslint-disable-line @typescript-eslint/naming-convention if (reason) { accumulator.push(reason); } - // eslint-disable-next-line @typescript-eslint/camelcase if (caused_by) { return extractCausedByChain(caused_by, accumulator); } @@ -36,8 +35,8 @@ export function wrapEsError( const { error: { - root_cause = [], // eslint-disable-line @typescript-eslint/camelcase - caused_by = undefined, // eslint-disable-line @typescript-eslint/camelcase + root_cause = [], // eslint-disable-line @typescript-eslint/naming-convention + caused_by = undefined, // eslint-disable-line @typescript-eslint/naming-convention } = {}, } = JSON.parse(response); diff --git a/x-pack/plugins/searchprofiler/public/application/components/percentage_badge.tsx b/x-pack/plugins/searchprofiler/public/application/components/percentage_badge.tsx index e39e37e8656db6..700b6f85f4db88 100644 --- a/x-pack/plugins/searchprofiler/public/application/components/percentage_badge.tsx +++ b/x-pack/plugins/searchprofiler/public/application/components/percentage_badge.tsx @@ -24,7 +24,9 @@ export const PercentageBadge = ({ timePercentage, label, valueType = 'percent' } return ( { }); test('defaults max signals to 100', () => { + // eslint-disable-next-line @typescript-eslint/naming-convention const { max_signals, ...noMaxSignals } = getAddPrepackagedRulesSchemaMock(); const payload: AddPrepackagedRulesSchema = { ...noMaxSignals, diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_schema.test.ts index c2c2f4784f2b5a..56bc68a275ee47 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_schema.test.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_schema.test.ts @@ -1298,6 +1298,7 @@ describe('create rules schema', () => { }); test('defaults max signals to 100', () => { + // eslint-disable-next-line @typescript-eslint/naming-convention const { max_signals, ...noMaxSignals } = getCreateRulesSchemaMock(); const payload: CreateRulesSchema = { ...noMaxSignals, @@ -1453,6 +1454,7 @@ describe('create rules schema', () => { }); test('it generates a uuid v4 whenever you omit the rule_id', () => { + // eslint-disable-next-line @typescript-eslint/naming-convention const { rule_id, ...noRuleId } = getCreateRulesSchemaMock(); const decoded = createRulesSchema.decode(noRuleId); const checked = exactCheck(noRuleId, decoded); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_schema.ts index 308b3c24010fbd..7b6b98383cc338 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_schema.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/create_rules_schema.ts @@ -6,7 +6,6 @@ import * as t from 'io-ts'; -/* eslint-disable @typescript-eslint/camelcase */ import { description, anomaly_threshold, @@ -47,7 +46,6 @@ import { RiskScoreMapping, SeverityMapping, } from '../common/schemas'; -/* eslint-enable @typescript-eslint/camelcase */ import { DefaultStringArray, diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/export_rules_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/export_rules_schema.ts index 75fa2da92b787a..3874ff8ec90ebe 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/export_rules_schema.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/export_rules_schema.ts @@ -6,9 +6,7 @@ import * as t from 'io-ts'; -/* eslint-disable @typescript-eslint/camelcase */ import { rule_id, FileName, ExcludeExportDetails } from '../common/schemas'; -/* eslint-enable @typescript-eslint/camelcase */ import { DefaultExportFileName } from '../types/default_export_file_name'; import { DefaultStringBooleanFalse } from '../types/default_string_boolean_false'; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rules_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rules_schema.ts index 87076803c95827..2e008c2b7401d9 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rules_schema.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/find_rules_schema.ts @@ -6,11 +6,9 @@ import * as t from 'io-ts'; -/* eslint-disable @typescript-eslint/camelcase */ import { queryFilter, fields, sort_field, sort_order, PerPage, Page } from '../common/schemas'; import { DefaultPerPage } from '../types/default_per_page'; import { DefaultPage } from '../types/default_page'; -/* eslint-enable @typescript-eslint/camelcase */ export const findRulesSchema = t.exact( t.partial({ diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_schema.test.ts index 00a3f2126f44a0..db2e9acc4615f8 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_schema.test.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_schema.test.ts @@ -681,6 +681,7 @@ describe('import rules schema', () => { }); test('defaults max signals to 100', () => { + // eslint-disable-next-line @typescript-eslint/naming-convention const { max_signals, ...noMaxSignals } = getImportRulesSchemaMock(); const payload: ImportRulesSchema = { ...noMaxSignals, diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_schema.ts index d141ca56828b6a..698716fea696e8 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_schema.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/import_rules_schema.ts @@ -6,7 +6,6 @@ import * as t from 'io-ts'; -/* eslint-disable @typescript-eslint/camelcase */ import { description, anomaly_threshold, @@ -53,7 +52,6 @@ import { RiskScoreMapping, SeverityMapping, } from '../common/schemas'; -/* eslint-enable @typescript-eslint/camelcase */ import { DefaultStringArray, diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_schema.ts index dd325c1a5034fd..a674ac86af87bd 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_schema.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/patch_rules_schema.ts @@ -6,7 +6,6 @@ import * as t from 'io-ts'; -/* eslint-disable @typescript-eslint/camelcase */ import { description, anomaly_threshold, @@ -49,7 +48,6 @@ import { severity_mapping, } from '../common/schemas'; import { listArrayOrUndefined } from '../types/lists'; -/* eslint-enable @typescript-eslint/camelcase */ /** * All of the patch elements should default to undefined if not set diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_schema.ts index cb8f21128b0520..5d6bc5be6b75af 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_schema.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_rules_schema.ts @@ -6,9 +6,7 @@ import * as t from 'io-ts'; -/* eslint-disable @typescript-eslint/camelcase */ import { rule_id, id } from '../common/schemas'; -/* eslint-enable @typescript-eslint/camelcase */ export const queryRulesSchema = t.exact( t.partial({ diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/set_signal_status_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/set_signal_status_schema.ts index 0e922aeaf8cdfd..1464896e502941 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/set_signal_status_schema.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/set_signal_status_schema.ts @@ -6,9 +6,7 @@ import * as t from 'io-ts'; -/* eslint-disable @typescript-eslint/camelcase */ import { signal_ids, signal_status_query, status } from '../common/schemas'; -/* eslint-enable @typescript-eslint/camelcase */ export const setSignalsStatusSchema = t.intersection([ t.type({ diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_schema.test.ts index 024198d7830483..1cbd3b99c27d70 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_schema.test.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_schema.test.ts @@ -664,6 +664,7 @@ describe('update rules schema', () => { }); test('defaults max signals to 100', () => { + // eslint-disable-next-line @typescript-eslint/naming-convention const { max_signals, ...noMaxSignals } = getUpdateRulesSchemaMock(); const payload: UpdateRulesSchema = { ...noMaxSignals, diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_schema.ts index 4f284eedef3fda..1299dada065e15 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_schema.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/update_rules_schema.ts @@ -6,7 +6,6 @@ import * as t from 'io-ts'; -/* eslint-disable @typescript-eslint/camelcase */ import { description, anomaly_threshold, @@ -49,7 +48,6 @@ import { RiskScoreMapping, SeverityMapping, } from '../common/schemas'; -/* eslint-enable @typescript-eslint/camelcase */ import { DefaultStringArray, diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/response/error_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/response/error_schema.ts index 986d3ad87ec851..b07fb9cc19b7b3 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/response/error_schema.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/response/error_schema.ts @@ -6,9 +6,7 @@ import * as t from 'io-ts'; -/* eslint-disable @typescript-eslint/camelcase */ import { rule_id, status_code, message } from '../common/schemas'; -/* eslint-enable @typescript-eslint/camelcase */ // We use id: t.string intentionally and _never_ the id from global schemas as // sometimes echo back out the id that the user gave us and it is not guaranteed diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/response/import_rules_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/response/import_rules_schema.ts index adea77e7b933f9..1131dee0aa8a26 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/response/import_rules_schema.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/response/import_rules_schema.ts @@ -6,10 +6,8 @@ import * as t from 'io-ts'; -/* eslint-disable @typescript-eslint/camelcase */ import { success, success_count } from '../common/schemas'; import { errorSchema } from './error_schema'; -/* eslint-enable @typescript-eslint/camelcase */ export const importRulesSchema = t.exact( t.type({ diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/response/prepackaged_rules_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/response/prepackaged_rules_schema.ts index 73d144500e0038..5e8da6bfcea0bd 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/response/prepackaged_rules_schema.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/response/prepackaged_rules_schema.ts @@ -6,14 +6,12 @@ import * as t from 'io-ts'; -/* eslint-disable @typescript-eslint/camelcase */ import { rules_installed, rules_updated, timelines_installed, timelines_updated, } from '../common/schemas'; -/* eslint-enable @typescript-eslint/camelcase */ const prePackagedRulesSchema = t.type({ rules_installed, diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/response/prepackaged_rules_status_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/response/prepackaged_rules_status_schema.ts index aabdbdd7300f43..889241d68eb2a5 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/response/prepackaged_rules_status_schema.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/response/prepackaged_rules_status_schema.ts @@ -6,7 +6,6 @@ import * as t from 'io-ts'; -/* eslint-disable @typescript-eslint/camelcase */ import { rules_installed, rules_custom_installed, @@ -16,7 +15,6 @@ import { timelines_not_installed, timelines_not_updated, } from '../common/schemas'; -/* eslint-enable @typescript-eslint/camelcase */ export const prePackagedTimelinesStatusSchema = t.type({ timelines_installed, diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/response/rules_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/response/rules_schema.ts index 4bd18a13e4ebb0..04df25d805f9e8 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/response/rules_schema.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/response/rules_schema.ts @@ -4,7 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase */ import * as t from 'io-ts'; import { isObject } from 'lodash/fp'; import { Either, left, fold } from 'fp-ts/lib/Either'; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/response/type_timeline_only_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/response/type_timeline_only_schema.ts index d23d4ad2e83d49..c39edbbf76f45e 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/response/type_timeline_only_schema.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/response/type_timeline_only_schema.ts @@ -6,9 +6,7 @@ import * as t from 'io-ts'; -/* eslint-disable @typescript-eslint/camelcase */ import { timeline_id, type } from '../common/schemas'; -/* eslint-enable @typescript-eslint/camelcase */ /** * Special schema type that is only the type and the timeline_id. diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_max_signals_number.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_max_signals_number.ts index 518af32dcf2b46..642ee1cef96865 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_max_signals_number.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_max_signals_number.ts @@ -6,7 +6,6 @@ import * as t from 'io-ts'; import { Either } from 'fp-ts/lib/Either'; -// eslint-disable-next-line @typescript-eslint/camelcase import { max_signals } from '../common/schemas'; import { DEFAULT_MAX_SIGNALS } from '../../../constants'; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_risk_score_mapping_array.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_risk_score_mapping_array.ts index bf88ece9137677..d96323018dfec6 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_risk_score_mapping_array.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_risk_score_mapping_array.ts @@ -6,7 +6,6 @@ import * as t from 'io-ts'; import { Either } from 'fp-ts/lib/Either'; -// eslint-disable-next-line @typescript-eslint/camelcase import { risk_score_mapping, RiskScoreMapping } from '../common/schemas'; /** diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_severity_mapping_array.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_severity_mapping_array.ts index 56b0ac1b759825..ec8f6b0a3739b8 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_severity_mapping_array.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/types/default_severity_mapping_array.ts @@ -6,7 +6,6 @@ import * as t from 'io-ts'; import { Either } from 'fp-ts/lib/Either'; -// eslint-disable-next-line @typescript-eslint/camelcase import { severity_mapping, SeverityMapping } from '../common/schemas'; /** diff --git a/x-pack/plugins/security_solution/common/detection_engine/transform_actions.ts b/x-pack/plugins/security_solution/common/detection_engine/transform_actions.ts index 7c15bc143e0fda..288ff464396456 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/transform_actions.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/transform_actions.ts @@ -10,7 +10,7 @@ import { RuleAlertAction } from './types'; export const transformRuleToAlertAction = ({ group, id, - action_type_id, + action_type_id, // eslint-disable-line @typescript-eslint/naming-convention params, }: RuleAlertAction): AlertAction => ({ group, diff --git a/x-pack/plugins/security_solution/common/types/timeline/index.ts b/x-pack/plugins/security_solution/common/types/timeline/index.ts index 98d17fc87f6ce3..84a007e322f11b 100644 --- a/x-pack/plugins/security_solution/common/types/timeline/index.ts +++ b/x-pack/plugins/security_solution/common/types/timeline/index.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @typescript-eslint/camelcase, @typescript-eslint/no-empty-interface */ - import * as runtimeTypes from 'io-ts'; import { stringEnum, unionWithNullType } from '../../utility_types'; @@ -257,9 +255,9 @@ export const SavedTimelineRuntimeType = runtimeTypes.partial({ updatedBy: unionWithNullType(runtimeTypes.string), }); -export interface SavedTimeline extends runtimeTypes.TypeOf {} +export type SavedTimeline = runtimeTypes.TypeOf; -export interface SavedTimelineNote extends runtimeTypes.TypeOf {} +export type SavedTimelineNote = runtimeTypes.TypeOf; /* * Timeline IDs @@ -317,8 +315,9 @@ export const TimelineSavedToReturnObjectRuntimeType = runtimeTypes.intersection( }), ]); -export interface TimelineSavedObject - extends runtimeTypes.TypeOf {} +export type TimelineSavedObject = runtimeTypes.TypeOf< + typeof TimelineSavedToReturnObjectRuntimeType +>; /** * All Timeline Saved object type with metadata @@ -342,9 +341,8 @@ export const TimelineErrorResponseType = runtimeTypes.type({ message: runtimeTypes.string, }); -export interface TimelineErrorResponse - extends runtimeTypes.TypeOf {} -export interface TimelineResponse extends runtimeTypes.TypeOf {} +export type TimelineErrorResponse = runtimeTypes.TypeOf; +export type TimelineResponse = runtimeTypes.TypeOf; /** * All Timeline Saved object type with metadata @@ -355,8 +353,7 @@ export const AllTimelineSavedObjectRuntimeType = runtimeTypes.type({ data: TimelineSavedToReturnObjectRuntimeType, }); -export interface AllTimelineSavedObject - extends runtimeTypes.TypeOf {} +export type AllTimelineSavedObject = runtimeTypes.TypeOf; /** * Import/export timelines diff --git a/x-pack/plugins/security_solution/public/app/index.tsx b/x-pack/plugins/security_solution/public/app/index.tsx index 0afd945af8597d..69bf2549d74391 100644 --- a/x-pack/plugins/security_solution/public/app/index.tsx +++ b/x-pack/plugins/security_solution/public/app/index.tsx @@ -8,7 +8,6 @@ import React from 'react'; import { Store, Action } from 'redux'; import { render, unmountComponentAtNode } from 'react-dom'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { AppMountParameters } from '../../../../../src/core/public'; import { State } from '../common/store'; import { StartServices } from '../types'; diff --git a/x-pack/plugins/security_solution/public/cases/components/configure_cases/index.tsx b/x-pack/plugins/security_solution/public/cases/components/configure_cases/index.tsx index 43922462cd092a..e2e3a600a95ff6 100644 --- a/x-pack/plugins/security_solution/public/cases/components/configure_cases/index.tsx +++ b/x-pack/plugins/security_solution/public/cases/components/configure_cases/index.tsx @@ -52,6 +52,7 @@ interface ConfigureCasesComponentProps { } const ConfigureCasesComponent: React.FC = ({ userCanCrud }) => { + // eslint-disable-next-line @typescript-eslint/naming-convention const { http, triggers_actions_ui, notifications, application, docLinks } = useKibana().services; const [connectorIsValid, setConnectorIsValid] = useState(true); diff --git a/x-pack/plugins/security_solution/public/common/components/endpoint/link_to_app.tsx b/x-pack/plugins/security_solution/public/common/components/endpoint/link_to_app.tsx index a12611ea270357..66cfb0398b44cb 100644 --- a/x-pack/plugins/security_solution/public/common/components/endpoint/link_to_app.tsx +++ b/x-pack/plugins/security_solution/public/common/components/endpoint/link_to_app.tsx @@ -35,7 +35,6 @@ export const LinkToApp = memo( {children} ) : ( - // eslint-disable-next-line @elastic/eui/href-or-on-click {children} diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/builder/helpers.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/builder/helpers.tsx index f6b703b7e622ef..bea1eb8f0e17ba 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/builder/helpers.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/builder/helpers.tsx @@ -33,7 +33,6 @@ import { EmptyNestedEntry, } from '../types'; import { getEntryValue, getExceptionOperatorSelect } from '../helpers'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths import exceptionableFields from '../exceptionable_fields.json'; /** diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.tsx index 2b526ede12acfd..18d2130dd38113 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/helpers.tsx @@ -226,6 +226,7 @@ export const filterExceptionItems = ( export const formatExceptionItemForUpdate = ( exceptionItem: ExceptionListItemSchema ): UpdateExceptionListItemSchema => { + /* eslint-disable @typescript-eslint/naming-convention */ const { created_at, created_by, @@ -233,6 +234,7 @@ export const formatExceptionItemForUpdate = ( tie_breaker_id, updated_at, updated_by, + /* eslint-enable @typescript-eslint/naming-convention */ ...fieldsToUpdate } = exceptionItem; return { diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/index.stories.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/index.stories.tsx index fec7354855935f..a540a34b706774 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/index.stories.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/exception_item/index.stories.tsx @@ -118,6 +118,7 @@ storiesOf('Components|ExceptionItem', module) ); }) .add('with loadingItemIds', () => { + // eslint-disable-next-line @typescript-eslint/naming-convention const { id, namespace_type, ...rest } = getExceptionListItemSchemaMock(); return ( diff --git a/x-pack/plugins/security_solution/public/common/components/links/index.tsx b/x-pack/plugins/security_solution/public/common/components/links/index.tsx index 4a9ad94d8f36dc..2f7aa1b14cfda9 100644 --- a/x-pack/plugins/security_solution/public/common/components/links/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/links/index.tsx @@ -311,9 +311,11 @@ const ReputationLinkComponent: React.FC<{ ipReputationLinksSetting ?.slice(0, allItemsLimit) .filter( + // eslint-disable-next-line @typescript-eslint/naming-convention ({ url_template, name }) => !isNil(url_template) && !isNil(name) && !isUrlInvalid(url_template) ) + // eslint-disable-next-line @typescript-eslint/naming-convention .map(({ name, url_template }: { name: string; url_template: string }) => ({ name: isDefaultReputationLink(name) ? defaultNameMapping[name] : name, url_template: url_template.replace(`{{ip}}`, encodeURIComponent(domain)), diff --git a/x-pack/plugins/security_solution/public/common/components/navigation/breadcrumbs/index.ts b/x-pack/plugins/security_solution/public/common/components/navigation/breadcrumbs/index.ts index 845ef580ddbe20..a10e4cf568dd14 100644 --- a/x-pack/plugins/security_solution/public/common/components/navigation/breadcrumbs/index.ts +++ b/x-pack/plugins/security_solution/public/common/components/navigation/breadcrumbs/index.ts @@ -6,7 +6,6 @@ import { getOr, omit } from 'lodash/fp'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { ChromeBreadcrumb } from '../../../../../../../../src/core/public'; import { APP_NAME } from '../../../../../common/constants'; import { StartServices } from '../../../../types'; diff --git a/x-pack/plugins/security_solution/public/common/hooks/types.ts b/x-pack/plugins/security_solution/public/common/hooks/types.ts index 36b626b0ba9f1d..301b8bd6553337 100644 --- a/x-pack/plugins/security_solution/public/common/hooks/types.ts +++ b/x-pack/plugins/security_solution/public/common/hooks/types.ts @@ -4,7 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { SimpleSavedObject } from '../../../../../../src/core/public'; // eslint-disable-next-line @typescript-eslint/consistent-type-definitions diff --git a/x-pack/plugins/security_solution/public/common/lib/compose/kibana_compose.tsx b/x-pack/plugins/security_solution/public/common/lib/compose/kibana_compose.tsx index 342db7f43943d4..30d3311a40b619 100644 --- a/x-pack/plugins/security_solution/public/common/lib/compose/kibana_compose.tsx +++ b/x-pack/plugins/security_solution/public/common/lib/compose/kibana_compose.tsx @@ -8,7 +8,6 @@ import { InMemoryCache, IntrospectionFragmentMatcher } from 'apollo-cache-inmemo import ApolloClient from 'apollo-client'; import { ApolloLink } from 'apollo-link'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths import introspectionQueryResultData from '../../../graphql/introspection.json'; import { AppFrontendLibs } from '../lib'; import { getLinks } from './helpers'; diff --git a/x-pack/plugins/security_solution/public/common/lib/kibana/services.ts b/x-pack/plugins/security_solution/public/common/lib/kibana/services.ts index 8a8138691ba173..00f53ae273b4b3 100644 --- a/x-pack/plugins/security_solution/public/common/lib/kibana/services.ts +++ b/x-pack/plugins/security_solution/public/common/lib/kibana/services.ts @@ -4,7 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { CoreStart } from '../../../../../../../src/core/public'; type GlobalServices = Pick; diff --git a/x-pack/plugins/security_solution/public/common/mock/kibana_core.ts b/x-pack/plugins/security_solution/public/common/mock/kibana_core.ts index e82c37e3a5b663..13b3c4b249bfef 100644 --- a/x-pack/plugins/security_solution/public/common/mock/kibana_core.ts +++ b/x-pack/plugins/security_solution/public/common/mock/kibana_core.ts @@ -4,7 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { coreMock } from '../../../../../../src/core/public/mocks'; import { dataPluginMock } from '../../../../../../src/plugins/data/public/mocks'; diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_histogram_panel/helpers.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_histogram_panel/helpers.tsx index 0cbed86f18768b..bb8cc2267249f6 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_histogram_panel/helpers.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_histogram_panel/helpers.tsx @@ -18,6 +18,7 @@ export const formatAlertsData = (alertsData: AlertSearchResponse<{}, AlertsAggre return [ ...acc, + // eslint-disable-next-line @typescript-eslint/naming-convention ...alertsBucket.map(({ key, doc_count }: AlertsBucket) => ({ x: key, y: doc_count, diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/default_config.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_table/default_config.tsx index be9725dac5ff3c..5bab2e3c789705 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/default_config.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/default_config.tsx @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable react/display-name */ - import React from 'react'; import ApolloClient from 'apollo-client'; import { Dispatch } from 'redux'; diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.test.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.test.tsx index 4a2d17ec126fb7..8b3d05ce5a574f 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/description_step/index.test.tsx @@ -23,7 +23,6 @@ import { mockAboutStepRule, mockDefineStepRule, } from '../../../pages/detection_engine/rules/all/__mocks__/mock'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { coreMock } from '../../../../../../../../src/core/public/mocks'; import { DEFAULT_TIMELINE_TITLE } from '../../../../timelines/components/timeline/translations'; import * as i18n from './translations'; diff --git a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/types.ts b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/types.ts index 1f75ff0210bd51..78d2e2a5b0c2f6 100644 --- a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/types.ts +++ b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/types.ts @@ -7,7 +7,6 @@ import * as t from 'io-ts'; import { RuleTypeSchema } from '../../../../../common/detection_engine/types'; -/* eslint-disable @typescript-eslint/camelcase */ import { author, building_block_type, @@ -18,7 +17,6 @@ import { timestamp_override, threshold, } from '../../../../../common/detection_engine/schemas/common/schemas'; -/* eslint-enable @typescript-eslint/camelcase */ import { listArray, listArrayOrUndefined, diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/create/index.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/create/index.tsx index 6ba65ceca8fe9d..70f278197b0051 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/create/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/create/index.tsx @@ -234,7 +234,6 @@ const CreateRulePageComponent: React.FC = () => { } }; - // eslint-disable-next-line react-hooks/rules-of-hooks const manageAccordions = useCallback( (id: RuleStep, isOpen: boolean) => { const activeRuleIdx = stepsRuleOrder.findIndex((step) => step === openAccordionId); @@ -256,7 +255,6 @@ const CreateRulePageComponent: React.FC = () => { [isStepRuleInReadOnlyView, openAccordionId, stepsData] ); - // eslint-disable-next-line react-hooks/rules-of-hooks const manageIsEditable = useCallback( async (id: RuleStep) => { const activeForm = await stepsForm.current[openAccordionId]?.submit(); diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/index.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/index.tsx index 4327ef96c93a7e..016d0c7c67a9e8 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/details/index.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable react-hooks/rules-of-hooks, complexity */ +/* eslint-disable complexity */ // TODO: Disabling complexity is temporary till this component is refactored as part of lists UI integration import { @@ -247,7 +247,6 @@ export const RuleDetailsPageComponent: FC = ({ ))} ), - // eslint-disable-next-line react-hooks/exhaustive-deps [ruleDetailTabs, ruleDetailTab, setRuleDetailTab] ); const ruleError = useMemo( @@ -318,13 +317,13 @@ export const RuleDetailsPageComponent: FC = ({ lists: ExceptionIdentifiers[]; allowedExceptionListTypes: ExceptionListTypeEnum[]; }>( - (acc, { id, list_id, namespace_type, type }) => { + (acc, { id, list_id: listId, namespace_type: namespaceType, type }) => { const { allowedExceptionListTypes, lists } = acc; const shouldAddEndpoint = type === ExceptionListTypeEnum.ENDPOINT && !allowedExceptionListTypes.includes(ExceptionListTypeEnum.ENDPOINT); return { - lists: [...lists, { id, listId: list_id, namespaceType: namespace_type, type }], + lists: [...lists, { id, listId, namespaceType, type }], allowedExceptionListTypes: shouldAddEndpoint ? [...allowedExceptionListTypes, ExceptionListTypeEnum.ENDPOINT] : allowedExceptionListTypes, diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/edit/index.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/edit/index.tsx index 3cc874b85ecf3b..13855a4b81494f 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/edit/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/edit/index.tsx @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable react-hooks/rules-of-hooks */ - import { EuiButton, EuiCallOut, diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/utils.ts b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/utils.ts index c1b4fa3e2b7d9b..f862a06807e6f7 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/utils.ts +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/utils.ts @@ -6,7 +6,6 @@ import { isEmpty } from 'lodash/fp'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { ChromeBreadcrumb } from '../../../../../../../../src/core/public'; import { getDetectionEngineTabUrl, diff --git a/x-pack/plugins/security_solution/public/hosts/pages/details/utils.ts b/x-pack/plugins/security_solution/public/hosts/pages/details/utils.ts index 5c5c7283eee474..9a24c61ae103da 100644 --- a/x-pack/plugins/security_solution/public/hosts/pages/details/utils.ts +++ b/x-pack/plugins/security_solution/public/hosts/pages/details/utils.ts @@ -6,7 +6,6 @@ import { get, isEmpty } from 'lodash/fp'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { ChromeBreadcrumb } from '../../../../../../../src/core/public'; import { hostsModel } from '../../store'; import { HostsTableType } from '../../store/model'; diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/host_details.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/host_details.tsx index 109392cb7a9297..6a0a0cbb1014ee 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/host_details.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/host_details.tsx @@ -82,6 +82,7 @@ export const HostDetails = memo(({ details }: { details: HostMetadata }) => { }, [details]); const [policyResponseUri, policyResponseRoutePath] = useMemo(() => { + // eslint-disable-next-line @typescript-eslint/naming-convention const { selected_host, show, ...currentUrlParams } = queryParams; return [ formatUrl( @@ -189,7 +190,6 @@ export const HostDetails = memo(({ details }: { details: HostMetadata }) => { description: details.agent.version, }, ]; - // eslint-disable-next-line react-hooks/exhaustive-deps }, [details.agent.version, details.host.hostname, details.host.ip]); return ( diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.test.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.test.tsx index 3e00a5cc33db1d..bb6003f73714d6 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.test.tsx @@ -313,6 +313,7 @@ describe('when on the hosts page', () => { beforeEach(async () => { const { + // eslint-disable-next-line @typescript-eslint/naming-convention host_status, metadata: { host, ...details }, } = mockHostDetailsApiResult(); diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx index f91bba3e3125a1..cdea4bfcf9f86d 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx @@ -259,7 +259,6 @@ export const HostList = () => { name: i18n.translate('xpack.securitySolution.endpointList.policyStatus', { defaultMessage: 'Configuration Status', }), - // eslint-disable-next-line react/display-name render: (policy: HostInfo['metadata']['Endpoint']['policy']['applied'], item: HostInfo) => { const toRoutePath = getHostDetailsPath({ name: 'hostPolicyResponse', diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/models/policy_details_config.ts b/x-pack/plugins/security_solution/public/management/pages/policy/models/policy_details_config.ts index 7c67dffb8a6631..4d32a9fbec694d 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/models/policy_details_config.ts +++ b/x-pack/plugins/security_solution/public/management/pages/policy/models/policy_details_config.ts @@ -48,12 +48,12 @@ export function clone(policyDetailsConfig: UIPolicyConfig): UIPolicyConfig { * Returns value from `configuration` */ export const getIn = (a: UIPolicyConfig) => (key: Key) => < - subKey extends keyof UIPolicyConfig[Key] + SubKey extends keyof UIPolicyConfig[Key] >( - subKey: subKey -) => ( + subKey: SubKey +) => ( leafKey: LeafKey -): UIPolicyConfig[Key][subKey][LeafKey] => { +): UIPolicyConfig[Key][SubKey][LeafKey] => { return a[key][subKey][leafKey]; }; @@ -61,11 +61,11 @@ export const getIn = (a: UIPolicyConfig) => (k * Returns cloned `configuration` with `value` set by the `keyPath`. */ export const setIn = (a: UIPolicyConfig) => (key: Key) => < - subKey extends keyof UIPolicyConfig[Key] + SubKey extends keyof UIPolicyConfig[Key] >( - subKey: subKey -) => (leafKey: LeafKey) => < - V extends UIPolicyConfig[Key][subKey][LeafKey] + subKey: SubKey +) => (leafKey: LeafKey) => < + V extends UIPolicyConfig[Key][SubKey][LeafKey] >( v: V ): UIPolicyConfig => { diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/store/policy_details/selectors.ts b/x-pack/plugins/security_solution/public/management/pages/policy/store/policy_details/selectors.ts index cce0adf36bccec..d780828fc88339 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/store/policy_details/selectors.ts +++ b/x-pack/plugins/security_solution/public/management/pages/policy/store/policy_details/selectors.ts @@ -29,6 +29,7 @@ export const policyDetails = (state: Immutable) => state.pol export const getPolicyDataForUpdate = ( policy: PolicyData | Immutable ): NewPolicyData | Immutable => { + // eslint-disable-next-line @typescript-eslint/naming-convention const { id, revision, created_by, created_at, updated_by, updated_at, ...newPolicy } = policy; return newPolicy; }; diff --git a/x-pack/plugins/security_solution/public/network/pages/ip_details/utils.ts b/x-pack/plugins/security_solution/public/network/pages/ip_details/utils.ts index 640b9d9818cdd1..9284a808625a5b 100644 --- a/x-pack/plugins/security_solution/public/network/pages/ip_details/utils.ts +++ b/x-pack/plugins/security_solution/public/network/pages/ip_details/utils.ts @@ -6,7 +6,6 @@ import { get, isEmpty } from 'lodash/fp'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { ChromeBreadcrumb } from '../../../../../../../src/core/public'; import { decodeIpv6 } from '../../../common/lib/helpers'; import { getIPDetailsUrl } from '../../../common/components/link_to/redirect_to_network'; diff --git a/x-pack/plugins/security_solution/public/overview/components/alerts_by_category/index.test.tsx b/x-pack/plugins/security_solution/public/overview/components/alerts_by_category/index.test.tsx index f7f1fbc30aeb74..a35d85d1321f53 100644 --- a/x-pack/plugins/security_solution/public/overview/components/alerts_by_category/index.test.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/alerts_by_category/index.test.tsx @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable react/display-name */ - import euiDarkVars from '@elastic/eui/dist/eui_theme_dark.json'; import { mount, ReactWrapper } from 'enzyme'; import React from 'react'; diff --git a/x-pack/plugins/security_solution/public/resolver/models/indexed_process_tree/index.ts b/x-pack/plugins/security_solution/public/resolver/models/indexed_process_tree/index.ts index 628d0267754f2b..060a014b8730f2 100644 --- a/x-pack/plugins/security_solution/public/resolver/models/indexed_process_tree/index.ts +++ b/x-pack/plugins/security_solution/public/resolver/models/indexed_process_tree/index.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable no-shadow */ - import { uniquePidForProcess, uniqueParentPidForProcess, orderByTime } from '../process_event'; import { IndexedProcessTree } from '../../types'; import { ResolverEvent } from '../../../../common/endpoint/types'; diff --git a/x-pack/plugins/security_solution/public/resolver/store/data/selectors.ts b/x-pack/plugins/security_solution/public/resolver/store/data/selectors.ts index 10ace895b32671..272d0aae7eef47 100644 --- a/x-pack/plugins/security_solution/public/resolver/store/data/selectors.ts +++ b/x-pack/plugins/security_solution/public/resolver/store/data/selectors.ts @@ -486,12 +486,7 @@ export const ariaFlowtoCandidate: ( const spatiallyIndexedLayout: (state: DataState) => rbush = createSelector( layout, - function ({ - /* eslint-disable no-shadow */ - processNodePositions, - edgeLineSegments, - /* eslint-enable no-shadow */ - }) { + function ({ processNodePositions, edgeLineSegments }) { const spatialIndex: rbush = new rbush(); const processesToIndex: IndexedProcessNode[] = []; const edgeLineSegmentsToIndex: IndexedEdgeLineSegment[] = []; diff --git a/x-pack/plugins/security_solution/public/resolver/store/middleware/resolver_tree_fetcher.ts b/x-pack/plugins/security_solution/public/resolver/store/middleware/resolver_tree_fetcher.ts index 2c98059d420e8f..0ec340efbdac95 100644 --- a/x-pack/plugins/security_solution/public/resolver/store/middleware/resolver_tree_fetcher.ts +++ b/x-pack/plugins/security_solution/public/resolver/store/middleware/resolver_tree_fetcher.ts @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable no-duplicate-imports */ - import { Dispatch, MiddlewareAPI } from 'redux'; import { ResolverTree, ResolverEntityIndex } from '../../../../common/endpoint/types'; diff --git a/x-pack/plugins/security_solution/public/resolver/test_utilities/simulator/mock_resolver.tsx b/x-pack/plugins/security_solution/public/resolver/test_utilities/simulator/mock_resolver.tsx index 36bb2a5ffc9fe9..7de7cf48e6039c 100644 --- a/x-pack/plugins/security_solution/public/resolver/test_utilities/simulator/mock_resolver.tsx +++ b/x-pack/plugins/security_solution/public/resolver/test_utilities/simulator/mock_resolver.tsx @@ -4,7 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable no-duplicate-imports */ /* eslint-disable react/display-name */ import React, { useMemo, useEffect, useState, useCallback } from 'react'; diff --git a/x-pack/plugins/security_solution/public/resolver/types.ts b/x-pack/plugins/security_solution/public/resolver/types.ts index 38e0cd04835592..c2871fdceb20ad 100644 --- a/x-pack/plugins/security_solution/public/resolver/types.ts +++ b/x-pack/plugins/security_solution/public/resolver/types.ts @@ -245,14 +245,14 @@ export type Matrix3 = readonly [ number ]; -type eventSubtypeFull = +type EventSubtypeFull = | 'creation_event' | 'fork_event' | 'exec_event' | 'already_running' | 'termination_event'; -type eventTypeFull = 'process_event'; +type EventTypeFull = 'process_event'; /** * The 'events' which contain process data and are used to model Resolver. @@ -263,8 +263,8 @@ export interface ProcessEvent { readonly machine_id: string; readonly data_buffer: { timestamp_utc: string; - event_subtype_full: eventSubtypeFull; - event_type_full: eventTypeFull; + event_subtype_full: EventSubtypeFull; + event_type_full: EventTypeFull; node_id: number; source_id?: number; process_name: string; diff --git a/x-pack/plugins/security_solution/public/resolver/view/map.tsx b/x-pack/plugins/security_solution/public/resolver/view/map.tsx index 0ca71c5bf60cef..a965f06c049262 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/map.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/map.tsx @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable no-duplicate-imports */ - /* eslint-disable react/display-name */ import React, { useContext } from 'react'; diff --git a/x-pack/plugins/security_solution/public/resolver/view/resolver_without_providers.tsx b/x-pack/plugins/security_solution/public/resolver/view/resolver_without_providers.tsx index f444d5a25e1ef9..e74502243ffc8c 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/resolver_without_providers.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/resolver_without_providers.tsx @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable no-duplicate-imports */ - /* eslint-disable react/display-name */ import React, { useContext, useCallback } from 'react'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/formatted_ip/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/formatted_ip/index.tsx index 3384165392dc88..a0678fb4a437af 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/formatted_ip/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/formatted_ip/index.tsx @@ -114,7 +114,7 @@ const AddressLinksComponent: React.FC<{ fieldName, address, })}`} - render={(_, __, snapshot) => + render={(_props, _provided, snapshot) => snapshot.isDragging ? ( ({ fetchPolicy: 'no-cache', variables: { id: timelineId }, }) - // eslint-disable-next-line .then((result) => { const timelineToOpen: TimelineResult = omitTypenameInTimeline( getOr({}, 'data.getOneTimeline', result) diff --git a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/timelines_table/actions_columns.tsx b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/timelines_table/actions_columns.tsx index aa4bb3f1e04670..b0e1eab25e7c79 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/open_timeline/timelines_table/actions_columns.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/open_timeline/timelines_table/actions_columns.tsx @@ -4,8 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable react/display-name */ - import { ActionTimelineToShow, DeleteTimelines, diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/entity.ts b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/entity.ts index c79bcda71de9b5..bcac559d61f799 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/resolver/entity.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/resolver/entity.ts @@ -87,6 +87,7 @@ export function handleEntities(): RequestHandler 0 && newPackageConfig.inputs[0].config !== undefined) { const oldManifest = newPackageConfig.inputs[0].config.artifact_manifest ?? { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/query_signals_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/query_signals_route.ts index 5f62ff426ecd07..3ab4775f890acf 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/query_signals_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/query_signals_route.ts @@ -28,13 +28,13 @@ export const querySignalsRoute = (router: IRouter) => { }, }, async (context, request, response) => { + // eslint-disable-next-line @typescript-eslint/naming-convention const { query, aggs, _source, track_total_hits, size } = request.body; const siemResponse = buildSiemResponse(response); if ( query == null && aggs == null && _source == null && - // eslint-disable-next-line @typescript-eslint/camelcase track_total_hits == null && size == null ) { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions/get_rule_actions_saved_object.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions/get_rule_actions_saved_object.ts index c36f6ca831c575..f469aa8634c5a5 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions/get_rule_actions_saved_object.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions/get_rule_actions_saved_object.ts @@ -26,6 +26,7 @@ export const getRuleActionsSavedObject = async ({ ruleAlertId, savedObjectsClient, }: GetRuleActionsSavedObject): Promise => { + // eslint-disable-next-line @typescript-eslint/naming-convention const { saved_objects } = await savedObjectsClient.find< IRuleActionsAttributesSavedObjectAttributes >({ diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/bulk_create_threshold_signals.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/bulk_create_threshold_signals.ts index e2f3d16bd6d031..bdcddbf2ed21bd 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/bulk_create_threshold_signals.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/bulk_create_threshold_signals.ts @@ -134,6 +134,7 @@ const getTransformedHits = ( } return results.aggregations.threshold.buckets.map( + // eslint-disable-next-line @typescript-eslint/naming-convention ({ key, doc_count }: { key: string; doc_count: number }) => { const source = { '@timestamp': new Date().toISOString(), diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/types.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/types.ts index bfc72a169566e1..dd0698b8d11248 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/types.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/types.ts @@ -12,6 +12,7 @@ import { RuleTypeParams } from '../types'; import { SearchResponse } from '../../types'; // used for gap detection code +// eslint-disable-next-line @typescript-eslint/naming-convention export type unitType = 's' | 'm' | 'h'; export const isValidUnit = (unitParam: string): unitParam is unitType => ['s', 'm', 'h'].includes(unitParam); diff --git a/x-pack/plugins/security_solution/server/lib/framework/types.ts b/x-pack/plugins/security_solution/server/lib/framework/types.ts index 03c82ceb02e68d..68b40b72866b1c 100644 --- a/x-pack/plugins/security_solution/server/lib/framework/types.ts +++ b/x-pack/plugins/security_solution/server/lib/framework/types.ts @@ -40,7 +40,7 @@ export interface FrameworkAdapter { callWithRequest( req: FrameworkRequest, method: 'indices.getMapping', - options?: IndicesGetMappingParams // eslint-disable-line + options?: IndicesGetMappingParams ): Promise; getIndexPatternsService(req: FrameworkRequest): FrameworkIndexPatternsService; } diff --git a/x-pack/plugins/security_solution/server/lib/matrix_histogram/utils.ts b/x-pack/plugins/security_solution/server/lib/matrix_histogram/utils.ts index 67568b96fee906..4a6a38421f42a6 100644 --- a/x-pack/plugins/security_solution/server/lib/matrix_histogram/utils.ts +++ b/x-pack/plugins/security_solution/server/lib/matrix_histogram/utils.ts @@ -16,6 +16,7 @@ export const getDnsParsedData = ( data.forEach((bucketData: unknown) => { const time = get('key', bucketData); const histData = getOr([], keyBucket, bucketData).map( + // eslint-disable-next-line @typescript-eslint/naming-convention ({ key, doc_count }: DnsHistogramSubBucket) => ({ x: time, y: doc_count, @@ -35,6 +36,7 @@ export const getGenericData = ( data.forEach((bucketData: unknown) => { const group = get('key', bucketData); const histData = getOr([], keyBucket, bucketData).map( + // eslint-disable-next-line @typescript-eslint/naming-convention ({ key, doc_count }: HistogramBucket) => ({ x: key, y: doc_count, diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/utils/create_timelines.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/utils/create_timelines.ts index 6bdecb5d80ecc1..dc0caaf67d7388 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/utils/create_timelines.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/utils/create_timelines.ts @@ -191,7 +191,6 @@ export const getTemplateTimeline = async ( frameworkRequest, templateTimelineId ); - // eslint-disable-next-line no-empty } catch (e) { return null; } diff --git a/x-pack/plugins/security_solution/server/lib/tls/elasticsearch_adapter.ts b/x-pack/plugins/security_solution/server/lib/tls/elasticsearch_adapter.ts index 10929c3d036410..ab9175951a8f51 100644 --- a/x-pack/plugins/security_solution/server/lib/tls/elasticsearch_adapter.ts +++ b/x-pack/plugins/security_solution/server/lib/tls/elasticsearch_adapter.ts @@ -69,7 +69,7 @@ export const formatTlsEdges = (buckets: TlsBuckets[]): TlsEdges[] => { subjects: bucket.subjects.buckets.map(({ key }) => key), ja3: bucket.ja3.buckets.map(({ key }) => key), issuers: bucket.issuers.buckets.map(({ key }) => key), - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line @typescript-eslint/naming-convention notAfter: bucket.not_after.buckets.map(({ key_as_string }) => key_as_string), }, cursor: { diff --git a/x-pack/plugins/snapshot_restore/__jest__/client_integration/helpers/home.helpers.ts b/x-pack/plugins/snapshot_restore/__jest__/client_integration/helpers/home.helpers.ts index bff66b70681450..917c41b998dec0 100644 --- a/x-pack/plugins/snapshot_restore/__jest__/client_integration/helpers/home.helpers.ts +++ b/x-pack/plugins/snapshot_restore/__jest__/client_integration/helpers/home.helpers.ts @@ -3,7 +3,6 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @kbn/eslint/no-restricted-paths */ import { act } from 'react-dom/test-utils'; import { diff --git a/x-pack/plugins/snapshot_restore/__jest__/client_integration/helpers/policy_add.helpers.ts b/x-pack/plugins/snapshot_restore/__jest__/client_integration/helpers/policy_add.helpers.ts index bdc2f76224361e..e8528889eb231d 100644 --- a/x-pack/plugins/snapshot_restore/__jest__/client_integration/helpers/policy_add.helpers.ts +++ b/x-pack/plugins/snapshot_restore/__jest__/client_integration/helpers/policy_add.helpers.ts @@ -3,7 +3,6 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @kbn/eslint/no-restricted-paths */ import { registerTestBed, TestBedConfig } from '../../../../../test_utils'; import { PolicyAdd } from '../../../public/application/sections/policy_add'; diff --git a/x-pack/plugins/snapshot_restore/__jest__/client_integration/helpers/policy_edit.helpers.ts b/x-pack/plugins/snapshot_restore/__jest__/client_integration/helpers/policy_edit.helpers.ts index ca53f9306445e7..f009afbb2eacca 100644 --- a/x-pack/plugins/snapshot_restore/__jest__/client_integration/helpers/policy_edit.helpers.ts +++ b/x-pack/plugins/snapshot_restore/__jest__/client_integration/helpers/policy_edit.helpers.ts @@ -3,7 +3,6 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @kbn/eslint/no-restricted-paths */ import { registerTestBed, TestBedConfig } from '../../../../../test_utils'; import { PolicyEdit } from '../../../public/application/sections/policy_edit'; diff --git a/x-pack/plugins/snapshot_restore/__jest__/client_integration/helpers/repository_add.helpers.ts b/x-pack/plugins/snapshot_restore/__jest__/client_integration/helpers/repository_add.helpers.ts index 2f7c47dbf544cc..fa4421988740bd 100644 --- a/x-pack/plugins/snapshot_restore/__jest__/client_integration/helpers/repository_add.helpers.ts +++ b/x-pack/plugins/snapshot_restore/__jest__/client_integration/helpers/repository_add.helpers.ts @@ -3,7 +3,6 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @kbn/eslint/no-restricted-paths */ import { registerTestBed, TestBed } from '../../../../../test_utils'; import { RepositoryType } from '../../../common/types'; diff --git a/x-pack/plugins/snapshot_restore/__jest__/client_integration/helpers/repository_edit.helpers.ts b/x-pack/plugins/snapshot_restore/__jest__/client_integration/helpers/repository_edit.helpers.ts index 4127fd05465806..043b21270cc8d7 100644 --- a/x-pack/plugins/snapshot_restore/__jest__/client_integration/helpers/repository_edit.helpers.ts +++ b/x-pack/plugins/snapshot_restore/__jest__/client_integration/helpers/repository_edit.helpers.ts @@ -3,7 +3,6 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @kbn/eslint/no-restricted-paths */ import { registerTestBed, TestBedConfig } from '../../../../../test_utils'; import { RepositoryEdit } from '../../../public/application/sections/repository_edit'; diff --git a/x-pack/plugins/snapshot_restore/__jest__/client_integration/helpers/restore_snapshot.helpers.ts b/x-pack/plugins/snapshot_restore/__jest__/client_integration/helpers/restore_snapshot.helpers.ts index 0cfb6fbc979755..cfe3027b6d43f6 100644 --- a/x-pack/plugins/snapshot_restore/__jest__/client_integration/helpers/restore_snapshot.helpers.ts +++ b/x-pack/plugins/snapshot_restore/__jest__/client_integration/helpers/restore_snapshot.helpers.ts @@ -4,7 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @kbn/eslint/no-restricted-paths */ import { registerTestBed, TestBed, TestBedConfig } from '../../../../../test_utils'; import { RestoreSnapshot } from '../../../public/application/sections/restore_snapshot'; import { WithAppDependencies } from './setup_environment'; diff --git a/x-pack/plugins/snapshot_restore/__jest__/client_integration/helpers/setup_environment.tsx b/x-pack/plugins/snapshot_restore/__jest__/client_integration/helpers/setup_environment.tsx index 2cfffb3572ddea..c7ee0648b5c3b6 100644 --- a/x-pack/plugins/snapshot_restore/__jest__/client_integration/helpers/setup_environment.tsx +++ b/x-pack/plugins/snapshot_restore/__jest__/client_integration/helpers/setup_environment.tsx @@ -3,7 +3,6 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @kbn/eslint/no-restricted-paths */ import React from 'react'; import axios from 'axios'; import axiosXhrAdapter from 'axios/lib/adapters/xhr'; diff --git a/x-pack/plugins/snapshot_restore/public/application/sections/home/policy_list/policy_table/policy_table.tsx b/x-pack/plugins/snapshot_restore/public/application/sections/home/policy_list/policy_table/policy_table.tsx index 5f0a208348785d..d55bbf0b324cff 100644 --- a/x-pack/plugins/snapshot_restore/public/application/sections/home/policy_list/policy_table/policy_table.tsx +++ b/x-pack/plugins/snapshot_restore/public/application/sections/home/policy_list/policy_table/policy_table.tsx @@ -64,7 +64,6 @@ export const PolicyTable: React.FunctionComponent = ({ return ( - {/* eslint-disable-next-line @elastic/eui/href-or-on-click */} uiMetricService.trackUiMetric(UIM_POLICY_SHOW_DETAILS_CLICK) diff --git a/x-pack/plugins/snapshot_restore/public/application/sections/home/repository_list/repository_table/repository_table.tsx b/x-pack/plugins/snapshot_restore/public/application/sections/home/repository_list/repository_table/repository_table.tsx index 70d83846cd74e6..d435ff4524ea2a 100644 --- a/x-pack/plugins/snapshot_restore/public/application/sections/home/repository_list/repository_table/repository_table.tsx +++ b/x-pack/plugins/snapshot_restore/public/application/sections/home/repository_list/repository_table/repository_table.tsx @@ -55,7 +55,6 @@ export const RepositoryTable: React.FunctionComponent = ({ render: (name: Repository['name']) => { return ( - {/* eslint-disable-next-line @elastic/eui/href-or-on-click */} uiMetricService.trackUiMetric(UIM_REPOSITORY_SHOW_DETAILS_CLICK) diff --git a/x-pack/plugins/snapshot_restore/public/application/sections/home/snapshot_list/snapshot_table/snapshot_table.tsx b/x-pack/plugins/snapshot_restore/public/application/sections/home/snapshot_list/snapshot_table/snapshot_table.tsx index 4910bf909ce3a1..46bd5bab53d2b3 100644 --- a/x-pack/plugins/snapshot_restore/public/application/sections/home/snapshot_list/snapshot_table/snapshot_table.tsx +++ b/x-pack/plugins/snapshot_restore/public/application/sections/home/snapshot_list/snapshot_table/snapshot_table.tsx @@ -74,7 +74,6 @@ export const SnapshotTable: React.FunctionComponent = ({ truncateText: true, sortable: true, render: (snapshotId: string, snapshot: SnapshotDetails) => ( - /* eslint-disable-next-line @elastic/eui/href-or-on-click */ { - const { reason, caused_by } = causedBy; // eslint-disable-line @typescript-eslint/camelcase + const { reason, caused_by } = causedBy; // eslint-disable-line @typescript-eslint/naming-convention if (reason) { accumulator.push(reason); } - // eslint-disable-next-line @typescript-eslint/camelcase if (caused_by) { return extractCausedByChain(caused_by, accumulator); } @@ -31,8 +30,8 @@ export const wrapEsError = (err: any, statusCodeToMessageMap: any = {}) => { const { error: { - root_cause = [], // eslint-disable-line @typescript-eslint/camelcase - caused_by = {}, // eslint-disable-line @typescript-eslint/camelcase + root_cause = [], // eslint-disable-line @typescript-eslint/naming-convention + caused_by = {}, // eslint-disable-line @typescript-eslint/naming-convention } = {}, } = JSON.parse(response); diff --git a/x-pack/plugins/snapshot_restore/test/fixtures/policy.ts b/x-pack/plugins/snapshot_restore/test/fixtures/policy.ts index 435ae27e8dd46d..a293f505147e4c 100644 --- a/x-pack/plugins/snapshot_restore/test/fixtures/policy.ts +++ b/x-pack/plugins/snapshot_restore/test/fixtures/policy.ts @@ -3,7 +3,6 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable @kbn/eslint/no-restricted-paths */ import { getRandomString, getRandomNumber } from '../../../../test_utils'; import { SlmPolicy } from '../../common/types'; diff --git a/x-pack/plugins/spaces/server/lib/spaces_client/spaces_client.ts b/x-pack/plugins/spaces/server/lib/spaces_client/spaces_client.ts index b4b0057a2f5a5c..dd2e0d40f31ed7 100644 --- a/x-pack/plugins/spaces/server/lib/spaces_client/spaces_client.ts +++ b/x-pack/plugins/spaces/server/lib/spaces_client/spaces_client.ts @@ -66,6 +66,7 @@ export class SpacesClient { if (this.useRbac()) { const privilegeFactory = PURPOSE_PRIVILEGE_MAP[purpose]; + // eslint-disable-next-line @typescript-eslint/naming-convention const { saved_objects } = await this.internalSavedObjectRepository.find({ type: 'space', page: 1, @@ -111,6 +112,7 @@ export class SpacesClient { } else { this.debugLogger(`SpacesClient.getAll(), NOT USING RBAC. querying all spaces`); + // eslint-disable-next-line @typescript-eslint/naming-convention const { saved_objects } = await this.callWithRequestSavedObjectRepository.find({ type: 'space', page: 1, diff --git a/x-pack/plugins/spaces/server/usage_collection/spaces_usage_collector.ts b/x-pack/plugins/spaces/server/usage_collection/spaces_usage_collector.ts index 4ab309cc6015cc..3ea4693d9e9d7e 100644 --- a/x-pack/plugins/spaces/server/usage_collection/spaces_usage_collector.ts +++ b/x-pack/plugins/spaces/server/usage_collection/spaces_usage_collector.ts @@ -92,6 +92,7 @@ async function getSpacesUsage( ); const disabledFeatures: Record = disabledFeatureBuckets.reduce( + // eslint-disable-next-line @typescript-eslint/naming-convention (acc, { key, doc_count }) => { return { ...acc, diff --git a/x-pack/plugins/task_manager/server/task_store.ts b/x-pack/plugins/task_manager/server/task_store.ts index 7ec3db5c99aa78..cac37db72202d5 100644 --- a/x-pack/plugins/task_manager/server/task_store.ts +++ b/x-pack/plugins/task_manager/server/task_store.ts @@ -443,6 +443,7 @@ export class TaskStore { private async updateByQuery( opts: UpdateByQuerySearchOpts = {}, + // eslint-disable-next-line @typescript-eslint/naming-convention { max_docs }: UpdateByQueryOpts = {} ): Promise { const { query } = ensureQueryOnlyReturnsTaskObjects(opts); @@ -458,6 +459,7 @@ export class TaskStore { }, }); + // eslint-disable-next-line @typescript-eslint/naming-convention const { total, updated, version_conflicts } = result as UpdateDocumentByQueryResponse; return { total, diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_list/popover_form.tsx b/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_list/popover_form.tsx index f3e96736e40fc9..50064274cf98e2 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_list/popover_form.tsx +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/aggregation_list/popover_form.tsx @@ -103,7 +103,6 @@ export const PopoverForm: React.FC = ({ defaultData, otherAggNames, onCha setAggName(name); } } - // eslint-disable-next-line react-hooks/exhaustive-deps }, [aggConfigDef]); const availableFields: EuiSelectOption[] = []; diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/group_by_list/popover_form.tsx b/x-pack/plugins/transform/public/app/sections/create_transform/components/group_by_list/popover_form.tsx index ba1bf915afd195..0452638e90dfb4 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/group_by_list/popover_form.tsx +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/group_by_list/popover_form.tsx @@ -37,7 +37,7 @@ import { } from '../../../../common'; export function isIntervalValid( - interval: optionalInterval, + interval: OptionalInterval, intervalType: PivotSupportedGroupByAggsWithInterval ) { if (interval !== '' && interval !== undefined) { @@ -73,7 +73,7 @@ interface SelectOption { text: string; } -type optionalInterval = string | undefined; +type OptionalInterval = string | undefined; function getDefaultInterval(defaultData: PivotGroupByConfig): string | undefined { if (isGroupByDateHistogram(defaultData)) { diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/health_check.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/health_check.tsx index ee19b6124da056..009f5824247654 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/health_check.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/health_check.tsx @@ -65,6 +65,7 @@ type PromptErrorProps = Pick & { }; const TlsAndEncryptionError = ({ + // eslint-disable-next-line @typescript-eslint/naming-convention docLinks: { ELASTIC_WEBSITE_URL, DOC_LINK_VERSION }, className, }: PromptErrorProps) => ( @@ -107,6 +108,7 @@ const TlsAndEncryptionError = ({ ); const EncryptionError = ({ + // eslint-disable-next-line @typescript-eslint/naming-convention docLinks: { ELASTIC_WEBSITE_URL, DOC_LINK_VERSION }, className, }: PromptErrorProps) => ( @@ -158,6 +160,7 @@ const EncryptionError = ({ ); const TlsError = ({ + // eslint-disable-next-line @typescript-eslint/naming-convention docLinks: { ELASTIC_WEBSITE_URL, DOC_LINK_VERSION }, className, }: PromptErrorProps) => ( diff --git a/x-pack/plugins/ui_actions_enhanced/public/custom_time_range_action.test.ts b/x-pack/plugins/ui_actions_enhanced/public/custom_time_range_action.test.ts index 0d6e9743f0f4b0..440bbd4242fa55 100644 --- a/x-pack/plugins/ui_actions_enhanced/public/custom_time_range_action.test.ts +++ b/x-pack/plugins/ui_actions_enhanced/public/custom_time_range_action.test.ts @@ -12,9 +12,7 @@ import { mount } from 'enzyme'; import { TimeRangeEmbeddable, TimeRangeContainer, TIME_RANGE_EMBEDDABLE } from './test_helpers'; import { CustomTimeRangeAction } from './custom_time_range_action'; -/* eslint-disable */ import { HelloWorldContainer } from '../../../../src/plugins/embeddable/public/lib/test_samples'; -/* eslint-enable */ import { HelloWorldEmbeddable, diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.story.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.story.tsx index cd8452ff74ab4b..0b0339a625c507 100644 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.story.tsx +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.story.tsx @@ -8,11 +8,7 @@ import * as React from 'react'; import { EuiFlyout } from '@elastic/eui'; import { storiesOf } from '@storybook/react'; import { createFlyoutManageDrilldowns } from './connected_flyout_manage_drilldowns'; -import { - dashboardFactory, - urlFactory, - // eslint-disable-next-line @kbn/eslint/no-restricted-paths -} from '../../../components/action_wizard/test_data'; +import { dashboardFactory, urlFactory } from '../../../components/action_wizard/test_data'; import { Storage } from '../../../../../../../src/plugins/kibana_utils/public'; import { StubBrowserStorage } from '../../../../../../../src/test_utils/public/stub_browser_storage'; import { mockDynamicActionManager } from './test_data'; diff --git a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_drilldown_wizard/flyout_drilldown_wizard.story.tsx b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_drilldown_wizard/flyout_drilldown_wizard.story.tsx index 2069a83ab8ba01..01e2a457889caa 100644 --- a/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_drilldown_wizard/flyout_drilldown_wizard.story.tsx +++ b/x-pack/plugins/ui_actions_enhanced/public/drilldowns/components/flyout_drilldown_wizard/flyout_drilldown_wizard.story.tsx @@ -4,17 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable no-console */ - import * as React from 'react'; import { EuiFlyout } from '@elastic/eui'; import { storiesOf } from '@storybook/react'; import { FlyoutDrilldownWizard } from './index'; -import { - dashboardFactory, - urlFactory, - // eslint-disable-next-line @kbn/eslint/no-restricted-paths -} from '../../../components/action_wizard/test_data'; +import { dashboardFactory, urlFactory } from '../../../components/action_wizard/test_data'; import { ActionFactory } from '../../../dynamic_actions'; storiesOf('components/FlyoutDrilldownWizard', module) diff --git a/x-pack/plugins/upgrade_assistant/public/application/components/tabs/checkup/deprecations/reindex/flyout/container.tsx b/x-pack/plugins/upgrade_assistant/public/application/components/tabs/checkup/deprecations/reindex/flyout/container.tsx index be4138b7a29f36..8f318e8113ea17 100644 --- a/x-pack/plugins/upgrade_assistant/public/application/components/tabs/checkup/deprecations/reindex/flyout/container.tsx +++ b/x-pack/plugins/upgrade_assistant/public/application/components/tabs/checkup/deprecations/reindex/flyout/container.tsx @@ -43,6 +43,7 @@ interface ReindexFlyoutState { currentFlyoutStep: ReindexFlyoutStep; } +// eslint-disable-next-line @typescript-eslint/naming-convention const getOpenAndCloseIndexDocLink = ({ ELASTIC_WEBSITE_URL, DOC_LINK_VERSION }: DocLinksStart) => ( = ({ idx, }) => { const titleClassName = classNames('upgStepProgress__title', { + // eslint-disable-next-line @typescript-eslint/naming-convention 'upgStepProgress__title--currentStep': status === 'inProgress' || status === 'paused' || diff --git a/x-pack/plugins/uptime/server/lib/alerts/status_check.ts b/x-pack/plugins/uptime/server/lib/alerts/status_check.ts index a34d7eb292eeff..8ca2e857a52c9f 100644 --- a/x-pack/plugins/uptime/server/lib/alerts/status_check.ts +++ b/x-pack/plugins/uptime/server/lib/alerts/status_check.ts @@ -36,6 +36,7 @@ const { MONITOR_STATUS } = ACTION_GROUP_DEFINITIONS; * @param items to reduce */ export const uniqueMonitorIds = (items: GetMonitorStatusResult[]): Set => + // eslint-disable-next-line @typescript-eslint/naming-convention items.reduce((acc, { monitor_id }) => { acc.add(monitor_id); return acc; diff --git a/x-pack/plugins/uptime/server/lib/requests/__tests__/get_monitor_status.test.ts b/x-pack/plugins/uptime/server/lib/requests/__tests__/get_monitor_status.test.ts index 1783cb3c28522d..f12f1527fb56cb 100644 --- a/x-pack/plugins/uptime/server/lib/requests/__tests__/get_monitor_status.test.ts +++ b/x-pack/plugins/uptime/server/lib/requests/__tests__/get_monitor_status.test.ts @@ -27,9 +27,11 @@ interface BucketItem { } const genBucketItem = ({ + // eslint-disable-next-line @typescript-eslint/naming-convention monitor_id, status, location, + // eslint-disable-next-line @typescript-eslint/naming-convention doc_count, }: BucketItemCriteria): BucketItem => ({ key: { diff --git a/x-pack/plugins/uptime/server/lib/requests/__tests__/helper.ts b/x-pack/plugins/uptime/server/lib/requests/__tests__/helper.ts index 0eb46e17c63241..878569b5d390f0 100644 --- a/x-pack/plugins/uptime/server/lib/requests/__tests__/helper.ts +++ b/x-pack/plugins/uptime/server/lib/requests/__tests__/helper.ts @@ -33,6 +33,7 @@ export const setupMockEsCompositeQuery = ( ): [MockCallES, jest.Mocked>] => { const esMock = elasticsearchServiceMock.createLegacyScopedClusterClient(); + // eslint-disable-next-line @typescript-eslint/naming-convention criteria.forEach(({ after_key, bucketCriteria }) => { const mockResponse = { aggregations: { diff --git a/x-pack/plugins/uptime/server/lib/requests/get_monitor_availability.ts b/x-pack/plugins/uptime/server/lib/requests/get_monitor_availability.ts index eafc0df431f770..798cefc404e1f9 100644 --- a/x-pack/plugins/uptime/server/lib/requests/get_monitor_availability.ts +++ b/x-pack/plugins/uptime/server/lib/requests/get_monitor_availability.ts @@ -23,6 +23,7 @@ export interface GetMonitorAvailabilityResult { } export const formatBuckets = async (buckets: any[]): Promise => + // eslint-disable-next-line @typescript-eslint/naming-convention buckets.map(({ key, fields, up_sum, down_sum, ratio }: any) => ({ ...key, name: fields?.hits?.hits?.[0]?._source?.monitor.name, diff --git a/x-pack/plugins/uptime/server/lib/requests/get_monitor_locations.ts b/x-pack/plugins/uptime/server/lib/requests/get_monitor_locations.ts index 17d79002e6f7d4..f52e965d488ea9 100644 --- a/x-pack/plugins/uptime/server/lib/requests/get_monitor_locations.ts +++ b/x-pack/plugins/uptime/server/lib/requests/get_monitor_locations.ts @@ -115,6 +115,7 @@ export const getMonitorLocations: UMElasticsearchQueryFn< let totalDowns = 0; const monLocs: MonitorLocation[] = []; + // eslint-disable-next-line @typescript-eslint/naming-convention locations.forEach(({ most_recent: mostRecent, up_history, down_history }: any) => { const mostRecentLocation = mostRecent.hits.hits[0]._source; totalUps += up_history.value; diff --git a/x-pack/plugins/uptime/server/lib/requests/get_monitor_status.ts b/x-pack/plugins/uptime/server/lib/requests/get_monitor_status.ts index 33f18b7a940694..a52bbfc8f24424 100644 --- a/x-pack/plugins/uptime/server/lib/requests/get_monitor_status.ts +++ b/x-pack/plugins/uptime/server/lib/requests/get_monitor_status.ts @@ -32,7 +32,7 @@ const formatBuckets = async ( ): Promise => { return buckets .filter((monitor: any) => monitor?.doc_count > numTimes) - .map(({ key, doc_count }: any) => ({ ...key, count: doc_count })); + .map(({ key, doc_count: count }: any) => ({ ...key, count })); }; const getLocationClause = (locations: string[]) => ({ diff --git a/x-pack/plugins/watcher/__jest__/client_integration/helpers/app_context.mock.tsx b/x-pack/plugins/watcher/__jest__/client_integration/helpers/app_context.mock.tsx index 3db3cf5c660116..7caa8b8bc08590 100644 --- a/x-pack/plugins/watcher/__jest__/client_integration/helpers/app_context.mock.tsx +++ b/x-pack/plugins/watcher/__jest__/client_integration/helpers/app_context.mock.tsx @@ -15,7 +15,6 @@ import { httpServiceMock, scopedHistoryMock, } from '../../../../../../src/core/public/mocks'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { AppContextProvider } from '../../../public/application/app_context'; import { LicenseStatus } from '../../../common/types/license_status'; diff --git a/x-pack/plugins/watcher/__jest__/client_integration/helpers/setup_environment.ts b/x-pack/plugins/watcher/__jest__/client_integration/helpers/setup_environment.ts index 2fc8d430208f61..3cac3eb40d8942 100644 --- a/x-pack/plugins/watcher/__jest__/client_integration/helpers/setup_environment.ts +++ b/x-pack/plugins/watcher/__jest__/client_integration/helpers/setup_environment.ts @@ -7,7 +7,6 @@ import axios from 'axios'; import axiosXhrAdapter from 'axios/lib/adapters/xhr'; import { init as initHttpRequests } from './http_requests'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { setHttpClient, setSavedObjectsClient } from '../../../public/application/lib/api'; const mockHttpClient = axios.create({ adapter: axiosXhrAdapter }); diff --git a/x-pack/plugins/watcher/__jest__/client_integration/helpers/watch_create_json.helpers.ts b/x-pack/plugins/watcher/__jest__/client_integration/helpers/watch_create_json.helpers.ts index 19217729aafd62..caef4b378cf0a0 100644 --- a/x-pack/plugins/watcher/__jest__/client_integration/helpers/watch_create_json.helpers.ts +++ b/x-pack/plugins/watcher/__jest__/client_integration/helpers/watch_create_json.helpers.ts @@ -5,9 +5,7 @@ */ import { withAppContext } from './app_context.mock'; import { registerTestBed, TestBed, TestBedConfig } from '../../../../../test_utils'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { WatchEdit } from '../../../public/application/sections/watch_edit/components/watch_edit'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { registerRouter } from '../../../public/application/lib/navigation'; import { ROUTES, WATCH_TYPES } from '../../../common/constants'; diff --git a/x-pack/plugins/watcher/__jest__/client_integration/helpers/watch_create_threshold.helpers.ts b/x-pack/plugins/watcher/__jest__/client_integration/helpers/watch_create_threshold.helpers.ts index 54ba39ee7eaa6c..c76f31e744f8d7 100644 --- a/x-pack/plugins/watcher/__jest__/client_integration/helpers/watch_create_threshold.helpers.ts +++ b/x-pack/plugins/watcher/__jest__/client_integration/helpers/watch_create_threshold.helpers.ts @@ -4,9 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ import { registerTestBed, TestBed, TestBedConfig } from '../../../../../test_utils'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { WatchEdit } from '../../../public/application/sections/watch_edit/components/watch_edit'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { registerRouter } from '../../../public/application/lib/navigation'; import { ROUTES, WATCH_TYPES } from '../../../common/constants'; import { withAppContext } from './app_context.mock'; diff --git a/x-pack/plugins/watcher/__jest__/client_integration/helpers/watch_edit.helpers.ts b/x-pack/plugins/watcher/__jest__/client_integration/helpers/watch_edit.helpers.ts index 290204d1878ea2..5e6dbd0a40bfb9 100644 --- a/x-pack/plugins/watcher/__jest__/client_integration/helpers/watch_edit.helpers.ts +++ b/x-pack/plugins/watcher/__jest__/client_integration/helpers/watch_edit.helpers.ts @@ -4,9 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ import { registerTestBed, TestBed, TestBedConfig } from '../../../../../test_utils'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { WatchEdit } from '../../../public/application/sections/watch_edit/components/watch_edit'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { registerRouter } from '../../../public/application/lib/navigation'; import { ROUTES } from '../../../common/constants'; import { WATCH_ID } from './constants'; diff --git a/x-pack/plugins/watcher/__jest__/client_integration/helpers/watch_list.helpers.ts b/x-pack/plugins/watcher/__jest__/client_integration/helpers/watch_list.helpers.ts index b5cf3df9509fc7..e511dcdc586069 100644 --- a/x-pack/plugins/watcher/__jest__/client_integration/helpers/watch_list.helpers.ts +++ b/x-pack/plugins/watcher/__jest__/client_integration/helpers/watch_list.helpers.ts @@ -13,7 +13,6 @@ import { TestBedConfig, nextTick, } from '../../../../../test_utils'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { WatchList } from '../../../public/application/sections/watch_list/components/watch_list'; import { ROUTES } from '../../../common/constants'; import { withAppContext } from './app_context.mock'; diff --git a/x-pack/plugins/watcher/__jest__/client_integration/helpers/watch_status.helpers.ts b/x-pack/plugins/watcher/__jest__/client_integration/helpers/watch_status.helpers.ts index e116c1bde36771..b869e55aa3464b 100644 --- a/x-pack/plugins/watcher/__jest__/client_integration/helpers/watch_status.helpers.ts +++ b/x-pack/plugins/watcher/__jest__/client_integration/helpers/watch_status.helpers.ts @@ -13,7 +13,6 @@ import { TestBedConfig, nextTick, } from '../../../../../test_utils'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { WatchStatus } from '../../../public/application/sections/watch_status/components/watch_status'; import { ROUTES } from '../../../common/constants'; import { WATCH_ID } from './constants'; diff --git a/x-pack/plugins/watcher/public/application/app_context.tsx b/x-pack/plugins/watcher/public/application/app_context.tsx index e5cf4c33b477ac..e8546a15170972 100644 --- a/x-pack/plugins/watcher/public/application/app_context.tsx +++ b/x-pack/plugins/watcher/public/application/app_context.tsx @@ -15,6 +15,7 @@ interface ContextValue extends Omit { const AppContext = createContext(null as any); +// eslint-disable-next-line @typescript-eslint/naming-convention const generateDocLinks = ({ ELASTIC_WEBSITE_URL, DOC_LINK_VERSION }: DocLinksStart) => { const elasticDocLinkBase = `${ELASTIC_WEBSITE_URL}guide/en/`; const esBase = `${elasticDocLinkBase}elasticsearch/reference/${DOC_LINK_VERSION}`; diff --git a/x-pack/test/alerting_api_integration/common/config.ts b/x-pack/test/alerting_api_integration/common/config.ts index 946b3d2f2591b6..4947cdbf55484b 100644 --- a/x-pack/test/alerting_api_integration/common/config.ts +++ b/x-pack/test/alerting_api_integration/common/config.ts @@ -36,7 +36,6 @@ const enabledActionTypes = [ 'test.throw', ]; -// eslint-disable-next-line import/no-default-export export function createTestConfig(name: string, options: CreateTestConfigOptions) { const { license = 'trial', disabledPlugins = [], ssl = false } = options; diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/alerts_base.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/alerts_base.ts index 8ffe65a8ebb48b..b94a547452377a 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/alerts_base.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/alerts_base.ts @@ -19,7 +19,6 @@ import { TaskManagerUtils, } from '../../../common/lib'; -// eslint-disable-next-line import/no-default-export export function alertTests({ getService }: FtrProviderContext, space: Space) { const supertestWithoutAuth = getService('supertestWithoutAuth'); const es = getService('legacyEs'); diff --git a/x-pack/test/api_integration/apis/lens/existing_fields.ts b/x-pack/test/api_integration/apis/lens/existing_fields.ts index b3810cf468b55d..92336f2892f433 100644 --- a/x-pack/test/api_integration/apis/lens/existing_fields.ts +++ b/x-pack/test/api_integration/apis/lens/existing_fields.ts @@ -129,7 +129,6 @@ const metricBeatData = [ 'system.cpu.user.pct', ]; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const esArchiver = getService('esArchiver'); const supertest = getService('supertest'); diff --git a/x-pack/test/api_integration/apis/lens/field_stats.ts b/x-pack/test/api_integration/apis/lens/field_stats.ts index 2d394e35725c29..87c9d97be9b60f 100644 --- a/x-pack/test/api_integration/apis/lens/field_stats.ts +++ b/x-pack/test/api_integration/apis/lens/field_stats.ts @@ -14,7 +14,6 @@ const COMMON_HEADERS = { 'kbn-xsrf': 'some-xsrf-token', }; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const esArchiver = getService('esArchiver'); const supertest = getService('supertest'); diff --git a/x-pack/test/api_integration/apis/lens/telemetry.ts b/x-pack/test/api_integration/apis/lens/telemetry.ts index bd6144a2690b02..2c05b02cf470f5 100644 --- a/x-pack/test/api_integration/apis/lens/telemetry.ts +++ b/x-pack/test/api_integration/apis/lens/telemetry.ts @@ -18,7 +18,6 @@ const COMMON_HEADERS = { 'kbn-xsrf': 'some-xsrf-token', }; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); const es: Client = getService('legacyEs'); diff --git a/x-pack/test/api_integration/apis/metrics_ui/log_analysis.ts b/x-pack/test/api_integration/apis/metrics_ui/log_analysis.ts index 7bcea4c17cdcdb..e40a9f77e2c18c 100644 --- a/x-pack/test/api_integration/apis/metrics_ui/log_analysis.ts +++ b/x-pack/test/api_integration/apis/metrics_ui/log_analysis.ts @@ -23,7 +23,6 @@ const COMMON_HEADERS = { 'kbn-xsrf': 'some-xsrf-token', }; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const esArchiver = getService('esArchiver'); const supertest = getService('supertest'); diff --git a/x-pack/test/api_integration/apis/ml/annotations/create_annotations.ts b/x-pack/test/api_integration/apis/ml/annotations/create_annotations.ts index 14ecf1bfe524ea..aff1150997496a 100644 --- a/x-pack/test/api_integration/apis/ml/annotations/create_annotations.ts +++ b/x-pack/test/api_integration/apis/ml/annotations/create_annotations.ts @@ -11,7 +11,6 @@ import { COMMON_REQUEST_HEADERS } from '../../../../functional/services/ml/commo import { USER } from '../../../../functional/services/ml/security_common'; import { Annotation } from '../../../../../plugins/ml/common/types/annotations'; import { createJobConfig, createAnnotationRequestBody } from './common_jobs'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const esArchiver = getService('esArchiver'); const supertest = getService('supertestWithoutAuth'); diff --git a/x-pack/test/api_integration/apis/ml/annotations/delete_annotations.ts b/x-pack/test/api_integration/apis/ml/annotations/delete_annotations.ts index 4fbb26e9b5a3ea..d3451c4d7da0ca 100644 --- a/x-pack/test/api_integration/apis/ml/annotations/delete_annotations.ts +++ b/x-pack/test/api_integration/apis/ml/annotations/delete_annotations.ts @@ -10,7 +10,6 @@ import { COMMON_REQUEST_HEADERS } from '../../../../functional/services/ml/commo import { USER } from '../../../../functional/services/ml/security_common'; import { testSetupJobConfigs, jobIds, testSetupAnnotations } from './common_jobs'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const esArchiver = getService('esArchiver'); const supertest = getService('supertestWithoutAuth'); diff --git a/x-pack/test/api_integration/apis/ml/annotations/get_annotations.ts b/x-pack/test/api_integration/apis/ml/annotations/get_annotations.ts index 710473eed6901a..29ad905bd3f2d3 100644 --- a/x-pack/test/api_integration/apis/ml/annotations/get_annotations.ts +++ b/x-pack/test/api_integration/apis/ml/annotations/get_annotations.ts @@ -11,7 +11,6 @@ import { COMMON_REQUEST_HEADERS } from '../../../../functional/services/ml/commo import { USER } from '../../../../functional/services/ml/security_common'; import { testSetupJobConfigs, jobIds, testSetupAnnotations } from './common_jobs'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const esArchiver = getService('esArchiver'); const supertest = getService('supertestWithoutAuth'); diff --git a/x-pack/test/api_integration/apis/ml/annotations/update_annotations.ts b/x-pack/test/api_integration/apis/ml/annotations/update_annotations.ts index ba73617151120c..bcfb7ab0825b8e 100644 --- a/x-pack/test/api_integration/apis/ml/annotations/update_annotations.ts +++ b/x-pack/test/api_integration/apis/ml/annotations/update_annotations.ts @@ -12,7 +12,6 @@ import { ANNOTATION_TYPE } from '../../../../../plugins/ml/common/constants/anno import { Annotation } from '../../../../../plugins/ml/common/types/annotations'; import { testSetupJobConfigs, jobIds, testSetupAnnotations } from './common_jobs'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const esArchiver = getService('esArchiver'); const supertest = getService('supertestWithoutAuth'); diff --git a/x-pack/test/api_integration/apis/ml/anomaly_detectors/create.ts b/x-pack/test/api_integration/apis/ml/anomaly_detectors/create.ts index 9c2b1046cc1240..71703ed019dc53 100644 --- a/x-pack/test/api_integration/apis/ml/anomaly_detectors/create.ts +++ b/x-pack/test/api_integration/apis/ml/anomaly_detectors/create.ts @@ -10,7 +10,6 @@ import { FtrProviderContext } from '../../../ftr_provider_context'; import { USER } from '../../../../functional/services/ml/security_common'; import { COMMON_REQUEST_HEADERS } from '../../../../functional/services/ml/common'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const esArchiver = getService('esArchiver'); const supertest = getService('supertestWithoutAuth'); diff --git a/x-pack/test/api_integration/apis/ml/calendars/create_calendars.ts b/x-pack/test/api_integration/apis/ml/calendars/create_calendars.ts index f163df0109ffd2..82f4eee8cc3285 100644 --- a/x-pack/test/api_integration/apis/ml/calendars/create_calendars.ts +++ b/x-pack/test/api_integration/apis/ml/calendars/create_calendars.ts @@ -10,7 +10,6 @@ import { FtrProviderContext } from '../../../ftr_provider_context'; import { USER } from '../../../../functional/services/ml/security_common'; import { COMMON_REQUEST_HEADERS } from '../../../../functional/services/ml/common'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertestWithoutAuth'); const ml = getService('ml'); diff --git a/x-pack/test/api_integration/apis/ml/calendars/delete_calendars.ts b/x-pack/test/api_integration/apis/ml/calendars/delete_calendars.ts index 5c5d5a3c432fac..eef8479b811b49 100644 --- a/x-pack/test/api_integration/apis/ml/calendars/delete_calendars.ts +++ b/x-pack/test/api_integration/apis/ml/calendars/delete_calendars.ts @@ -10,7 +10,6 @@ import { FtrProviderContext } from '../../../ftr_provider_context'; import { USER } from '../../../../functional/services/ml/security_common'; import { COMMON_REQUEST_HEADERS } from '../../../../functional/services/ml/common'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertestWithoutAuth'); const ml = getService('ml'); diff --git a/x-pack/test/api_integration/apis/ml/calendars/get_calendars.ts b/x-pack/test/api_integration/apis/ml/calendars/get_calendars.ts index e115986b2f0924..0b4f4a8f73ede2 100644 --- a/x-pack/test/api_integration/apis/ml/calendars/get_calendars.ts +++ b/x-pack/test/api_integration/apis/ml/calendars/get_calendars.ts @@ -9,7 +9,6 @@ import { FtrProviderContext } from '../../../ftr_provider_context'; import { USER } from '../../../../functional/services/ml/security_common'; import { COMMON_REQUEST_HEADERS } from '../../../../functional/services/ml/common'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertestWithoutAuth'); const ml = getService('ml'); diff --git a/x-pack/test/api_integration/apis/ml/calendars/update_calendars.ts b/x-pack/test/api_integration/apis/ml/calendars/update_calendars.ts index 5194370b19e669..65832ac9ca81e7 100644 --- a/x-pack/test/api_integration/apis/ml/calendars/update_calendars.ts +++ b/x-pack/test/api_integration/apis/ml/calendars/update_calendars.ts @@ -10,7 +10,6 @@ import { FtrProviderContext } from '../../../ftr_provider_context'; import { USER } from '../../../../functional/services/ml/security_common'; import { COMMON_REQUEST_HEADERS } from '../../../../functional/services/ml/common'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertestWithoutAuth'); const ml = getService('ml'); diff --git a/x-pack/test/api_integration/apis/ml/data_visualizer/get_field_histograms.ts b/x-pack/test/api_integration/apis/ml/data_visualizer/get_field_histograms.ts index 8b21c367d29f65..1a71894f8423d8 100644 --- a/x-pack/test/api_integration/apis/ml/data_visualizer/get_field_histograms.ts +++ b/x-pack/test/api_integration/apis/ml/data_visualizer/get_field_histograms.ts @@ -10,7 +10,6 @@ import { FtrProviderContext } from '../../../ftr_provider_context'; import { USER } from '../../../../functional/services/ml/security_common'; import { COMMON_REQUEST_HEADERS } from '../../../../functional/services/ml/common'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const esArchiver = getService('esArchiver'); const supertest = getService('supertestWithoutAuth'); diff --git a/x-pack/test/api_integration/apis/ml/data_visualizer/get_field_stats.ts b/x-pack/test/api_integration/apis/ml/data_visualizer/get_field_stats.ts index 92776e297f1a2d..5373da6a794c77 100644 --- a/x-pack/test/api_integration/apis/ml/data_visualizer/get_field_stats.ts +++ b/x-pack/test/api_integration/apis/ml/data_visualizer/get_field_stats.ts @@ -10,7 +10,6 @@ import { FtrProviderContext } from '../../../ftr_provider_context'; import { USER } from '../../../../functional/services/ml/security_common'; import { COMMON_REQUEST_HEADERS } from '../../../../functional/services/ml/common'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const esArchiver = getService('esArchiver'); const supertest = getService('supertestWithoutAuth'); diff --git a/x-pack/test/api_integration/apis/ml/data_visualizer/get_overall_stats.ts b/x-pack/test/api_integration/apis/ml/data_visualizer/get_overall_stats.ts index c6acf37cb9b3ac..d87ab16d71c18d 100644 --- a/x-pack/test/api_integration/apis/ml/data_visualizer/get_overall_stats.ts +++ b/x-pack/test/api_integration/apis/ml/data_visualizer/get_overall_stats.ts @@ -10,7 +10,6 @@ import { FtrProviderContext } from '../../../ftr_provider_context'; import { USER } from '../../../../functional/services/ml/security_common'; import { COMMON_REQUEST_HEADERS } from '../../../../functional/services/ml/common'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const esArchiver = getService('esArchiver'); const supertest = getService('supertestWithoutAuth'); diff --git a/x-pack/test/api_integration/apis/ml/fields_service/field_cardinality.ts b/x-pack/test/api_integration/apis/ml/fields_service/field_cardinality.ts index 647874c1cd5fb2..ced4d937863ee6 100644 --- a/x-pack/test/api_integration/apis/ml/fields_service/field_cardinality.ts +++ b/x-pack/test/api_integration/apis/ml/fields_service/field_cardinality.ts @@ -10,7 +10,6 @@ import { FtrProviderContext } from '../../../ftr_provider_context'; import { USER } from '../../../../functional/services/ml/security_common'; import { COMMON_REQUEST_HEADERS } from '../../../../functional/services/ml/common'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const esArchiver = getService('esArchiver'); const supertest = getService('supertestWithoutAuth'); diff --git a/x-pack/test/api_integration/apis/ml/fields_service/time_field_range.ts b/x-pack/test/api_integration/apis/ml/fields_service/time_field_range.ts index 247bfe89fea1d3..2128b1fe8d9e14 100644 --- a/x-pack/test/api_integration/apis/ml/fields_service/time_field_range.ts +++ b/x-pack/test/api_integration/apis/ml/fields_service/time_field_range.ts @@ -10,7 +10,6 @@ import { FtrProviderContext } from '../../../ftr_provider_context'; import { USER } from '../../../../functional/services/ml/security_common'; import { COMMON_REQUEST_HEADERS } from '../../../../functional/services/ml/common'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const esArchiver = getService('esArchiver'); const supertest = getService('supertestWithoutAuth'); diff --git a/x-pack/test/api_integration/apis/ml/filters/create_filters.ts b/x-pack/test/api_integration/apis/ml/filters/create_filters.ts index c175d3a9a3d9cf..233c95b190f021 100644 --- a/x-pack/test/api_integration/apis/ml/filters/create_filters.ts +++ b/x-pack/test/api_integration/apis/ml/filters/create_filters.ts @@ -10,7 +10,6 @@ import { FtrProviderContext } from '../../../ftr_provider_context'; import { USER } from '../../../../functional/services/ml/security_common'; import { COMMON_REQUEST_HEADERS } from '../../../../functional/services/ml/common'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertestWithoutAuth'); const ml = getService('ml'); diff --git a/x-pack/test/api_integration/apis/ml/filters/delete_filters.ts b/x-pack/test/api_integration/apis/ml/filters/delete_filters.ts index bb83a7f7206923..d0323360400bee 100644 --- a/x-pack/test/api_integration/apis/ml/filters/delete_filters.ts +++ b/x-pack/test/api_integration/apis/ml/filters/delete_filters.ts @@ -10,7 +10,6 @@ import { FtrProviderContext } from '../../../ftr_provider_context'; import { USER } from '../../../../functional/services/ml/security_common'; import { COMMON_REQUEST_HEADERS } from '../../../../functional/services/ml/common'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertestWithoutAuth'); const ml = getService('ml'); diff --git a/x-pack/test/api_integration/apis/ml/filters/get_filters.ts b/x-pack/test/api_integration/apis/ml/filters/get_filters.ts index 3dd6093a9917fe..f0aa7aac7b9e4f 100644 --- a/x-pack/test/api_integration/apis/ml/filters/get_filters.ts +++ b/x-pack/test/api_integration/apis/ml/filters/get_filters.ts @@ -10,7 +10,6 @@ import { FtrProviderContext } from '../../../ftr_provider_context'; import { USER } from '../../../../functional/services/ml/security_common'; import { COMMON_REQUEST_HEADERS } from '../../../../functional/services/ml/common'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertestWithoutAuth'); const ml = getService('ml'); diff --git a/x-pack/test/api_integration/apis/ml/filters/update_filters.ts b/x-pack/test/api_integration/apis/ml/filters/update_filters.ts index eb58d545093c49..87eec99906c348 100644 --- a/x-pack/test/api_integration/apis/ml/filters/update_filters.ts +++ b/x-pack/test/api_integration/apis/ml/filters/update_filters.ts @@ -10,7 +10,6 @@ import { FtrProviderContext } from '../../../ftr_provider_context'; import { USER } from '../../../../functional/services/ml/security_common'; import { COMMON_REQUEST_HEADERS } from '../../../../functional/services/ml/common'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertestWithoutAuth'); const ml = getService('ml'); diff --git a/x-pack/test/api_integration/apis/ml/job_validation/bucket_span_estimator.ts b/x-pack/test/api_integration/apis/ml/job_validation/bucket_span_estimator.ts index be033113032887..c556a6c28554b9 100644 --- a/x-pack/test/api_integration/apis/ml/job_validation/bucket_span_estimator.ts +++ b/x-pack/test/api_integration/apis/ml/job_validation/bucket_span_estimator.ts @@ -10,7 +10,6 @@ import { FtrProviderContext } from '../../../ftr_provider_context'; import { USER } from '../../../../functional/services/ml/security_common'; import { COMMON_REQUEST_HEADERS } from '../../../../functional/services/ml/common'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const esArchiver = getService('esArchiver'); const esSupertest = getService('esSupertest'); diff --git a/x-pack/test/api_integration/apis/ml/job_validation/calculate_model_memory_limit.ts b/x-pack/test/api_integration/apis/ml/job_validation/calculate_model_memory_limit.ts index 076be816e06936..409bd161e601b1 100644 --- a/x-pack/test/api_integration/apis/ml/job_validation/calculate_model_memory_limit.ts +++ b/x-pack/test/api_integration/apis/ml/job_validation/calculate_model_memory_limit.ts @@ -8,7 +8,6 @@ import { FtrProviderContext } from '../../../ftr_provider_context'; import { USER } from '../../../../functional/services/ml/security_common'; import { COMMON_REQUEST_HEADERS } from '../../../../functional/services/ml/common'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const esArchiver = getService('esArchiver'); const supertest = getService('supertestWithoutAuth'); diff --git a/x-pack/test/api_integration/apis/ml/job_validation/cardinality.ts b/x-pack/test/api_integration/apis/ml/job_validation/cardinality.ts index ca7b8c332ede30..ed61f234a671d1 100644 --- a/x-pack/test/api_integration/apis/ml/job_validation/cardinality.ts +++ b/x-pack/test/api_integration/apis/ml/job_validation/cardinality.ts @@ -8,7 +8,6 @@ import { FtrProviderContext } from '../../../ftr_provider_context'; import { USER } from '../../../../functional/services/ml/security_common'; import { COMMON_REQUEST_HEADERS } from '../../../../functional/services/ml/common'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const esArchiver = getService('esArchiver'); const supertest = getService('supertestWithoutAuth'); diff --git a/x-pack/test/api_integration/apis/ml/job_validation/validate.ts b/x-pack/test/api_integration/apis/ml/job_validation/validate.ts index fc8f8377442213..5e9b2d68bd6df6 100644 --- a/x-pack/test/api_integration/apis/ml/job_validation/validate.ts +++ b/x-pack/test/api_integration/apis/ml/job_validation/validate.ts @@ -9,7 +9,6 @@ import { USER } from '../../../../functional/services/ml/security_common'; import { COMMON_REQUEST_HEADERS } from '../../../../functional/services/ml/common'; import pkg from '../../../../../../package.json'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const esArchiver = getService('esArchiver'); const supertest = getService('supertestWithoutAuth'); diff --git a/x-pack/test/api_integration/apis/ml/jobs/categorization_field_examples.ts b/x-pack/test/api_integration/apis/ml/jobs/categorization_field_examples.ts index 8ae4beafa525ad..b99a4965adb9d4 100644 --- a/x-pack/test/api_integration/apis/ml/jobs/categorization_field_examples.ts +++ b/x-pack/test/api_integration/apis/ml/jobs/categorization_field_examples.ts @@ -72,7 +72,6 @@ const defaultRequestBody = { analyzer, }; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const esArchiver = getService('esArchiver'); const supertest = getService('supertestWithoutAuth'); diff --git a/x-pack/test/api_integration/apis/ml/jobs/close_jobs.ts b/x-pack/test/api_integration/apis/ml/jobs/close_jobs.ts index 2bf6c3f29468ca..f411595aca995f 100644 --- a/x-pack/test/api_integration/apis/ml/jobs/close_jobs.ts +++ b/x-pack/test/api_integration/apis/ml/jobs/close_jobs.ts @@ -12,7 +12,6 @@ import { USER } from '../../../../functional/services/ml/security_common'; import { JOB_STATE, DATAFEED_STATE } from '../../../../../plugins/ml/common/constants/states'; import { MULTI_METRIC_JOB_CONFIG, SINGLE_METRIC_JOB_CONFIG, DATAFEED_CONFIG } from './common_jobs'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const esArchiver = getService('esArchiver'); const supertest = getService('supertestWithoutAuth'); diff --git a/x-pack/test/api_integration/apis/ml/jobs/delete_jobs.ts b/x-pack/test/api_integration/apis/ml/jobs/delete_jobs.ts index b93d3bbce0cec1..4976b6441c37a0 100644 --- a/x-pack/test/api_integration/apis/ml/jobs/delete_jobs.ts +++ b/x-pack/test/api_integration/apis/ml/jobs/delete_jobs.ts @@ -11,7 +11,6 @@ import { COMMON_REQUEST_HEADERS } from '../../../../functional/services/ml/commo import { USER } from '../../../../functional/services/ml/security_common'; import { MULTI_METRIC_JOB_CONFIG, SINGLE_METRIC_JOB_CONFIG } from './common_jobs'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const esArchiver = getService('esArchiver'); const supertest = getService('supertestWithoutAuth'); diff --git a/x-pack/test/api_integration/apis/ml/jobs/jobs_summary.ts b/x-pack/test/api_integration/apis/ml/jobs/jobs_summary.ts index e9696eeffb6dce..0a6e1ed75020a2 100644 --- a/x-pack/test/api_integration/apis/ml/jobs/jobs_summary.ts +++ b/x-pack/test/api_integration/apis/ml/jobs/jobs_summary.ts @@ -11,7 +11,6 @@ import { COMMON_REQUEST_HEADERS } from '../../../../functional/services/ml/commo import { USER } from '../../../../functional/services/ml/security_common'; import { MULTI_METRIC_JOB_CONFIG, SINGLE_METRIC_JOB_CONFIG } from './common_jobs'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const esArchiver = getService('esArchiver'); const supertest = getService('supertestWithoutAuth'); diff --git a/x-pack/test/api_integration/apis/ml/modules/get_module.ts b/x-pack/test/api_integration/apis/ml/modules/get_module.ts index cfb3c17ac7f21d..e2a5d3cd425dce 100644 --- a/x-pack/test/api_integration/apis/ml/modules/get_module.ts +++ b/x-pack/test/api_integration/apis/ml/modules/get_module.ts @@ -32,7 +32,6 @@ const moduleIds = [ 'uptime_heartbeat', ]; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertestWithoutAuth'); const ml = getService('ml'); diff --git a/x-pack/test/api_integration/apis/ml/modules/recognize_module.ts b/x-pack/test/api_integration/apis/ml/modules/recognize_module.ts index d217a83efe948f..6634c4e2ed16cd 100644 --- a/x-pack/test/api_integration/apis/ml/modules/recognize_module.ts +++ b/x-pack/test/api_integration/apis/ml/modules/recognize_module.ts @@ -10,7 +10,6 @@ import { FtrProviderContext } from '../../../ftr_provider_context'; import { USER } from '../../../../functional/services/ml/security_common'; import { COMMON_REQUEST_HEADERS } from '../../../../functional/services/ml/common'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const esArchiver = getService('esArchiver'); const supertest = getService('supertestWithoutAuth'); diff --git a/x-pack/test/api_integration/apis/ml/modules/setup_module.ts b/x-pack/test/api_integration/apis/ml/modules/setup_module.ts index 10c0f00234abc5..6c3eda197f8929 100644 --- a/x-pack/test/api_integration/apis/ml/modules/setup_module.ts +++ b/x-pack/test/api_integration/apis/ml/modules/setup_module.ts @@ -14,7 +14,6 @@ import { Job } from '../../../../../plugins/ml/common/types/anomaly_detection_jo import { USER } from '../../../../functional/services/ml/security_common'; import { COMMON_REQUEST_HEADERS } from '../../../../functional/services/ml/common'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const esArchiver = getService('esArchiver'); const supertest = getService('supertestWithoutAuth'); diff --git a/x-pack/test/api_integration/apis/ml/results/get_anomalies_table_data.ts b/x-pack/test/api_integration/apis/ml/results/get_anomalies_table_data.ts index 01afacea645d60..f769d0d878cb27 100644 --- a/x-pack/test/api_integration/apis/ml/results/get_anomalies_table_data.ts +++ b/x-pack/test/api_integration/apis/ml/results/get_anomalies_table_data.ts @@ -9,7 +9,6 @@ import { FtrProviderContext } from '../../../ftr_provider_context'; import { Datafeed, Job } from '../../../../../plugins/ml/common/types/anomaly_detection_jobs'; import { COMMON_REQUEST_HEADERS } from '../../../../functional/services/ml/common'; -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const esArchiver = getService('esArchiver'); const supertest = getService('supertestWithoutAuth'); diff --git a/x-pack/test/api_integration/apis/transform/delete_transforms.ts b/x-pack/test/api_integration/apis/transform/delete_transforms.ts index 8e5d7354bcaf41..136bb85dd5ac24 100644 --- a/x-pack/test/api_integration/apis/transform/delete_transforms.ts +++ b/x-pack/test/api_integration/apis/transform/delete_transforms.ts @@ -15,7 +15,6 @@ async function asyncForEach(array: any[], callback: Function) { } } -// eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const esArchiver = getService('esArchiver'); const supertest = getService('supertestWithoutAuth'); diff --git a/x-pack/test/case_api_integration/common/lib/mock.ts b/x-pack/test/case_api_integration/common/lib/mock.ts index 728eaf88617e9c..cfa4a0ae977f4f 100644 --- a/x-pack/test/case_api_integration/common/lib/mock.ts +++ b/x-pack/test/case_api_integration/common/lib/mock.ts @@ -36,6 +36,7 @@ export const postCaseResp = (id: string): Partial => ({ export const removeServerGeneratedPropertiesFromCase = ( config: Partial ): Partial => { + // eslint-disable-next-line @typescript-eslint/naming-convention const { closed_at, created_at, updated_at, version, ...rest } = config; return rest; }; diff --git a/x-pack/test/case_api_integration/common/lib/utils.ts b/x-pack/test/case_api_integration/common/lib/utils.ts index fe9cb48178633d..a24e17f9e5efb8 100644 --- a/x-pack/test/case_api_integration/common/lib/utils.ts +++ b/x-pack/test/case_api_integration/common/lib/utils.ts @@ -7,6 +7,7 @@ import { Client } from '@elastic/elasticsearch'; import { CasesConfigureRequest, CasesConfigureResponse } from '../../../../plugins/case/common/api'; +// eslint-disable-next-line @typescript-eslint/naming-convention export const getConfiguration = (connector_id: string = 'connector-1'): CasesConfigureRequest => { return { connector_id, @@ -89,6 +90,7 @@ export const getJiraConnector = () => ({ export const removeServerGeneratedPropertiesFromConfigure = ( config: Partial ): Partial => { + // eslint-disable-next-line @typescript-eslint/naming-convention const { created_at, updated_at, version, ...rest } = config; return rest; }; diff --git a/x-pack/test/detection_engine_api_integration/common/config.ts b/x-pack/test/detection_engine_api_integration/common/config.ts index 3e444bcab319a2..bb9b3d9e966640 100644 --- a/x-pack/test/detection_engine_api_integration/common/config.ts +++ b/x-pack/test/detection_engine_api_integration/common/config.ts @@ -31,7 +31,6 @@ const enabledActionTypes = [ 'test.rate-limit', ]; -// eslint-disable-next-line import/no-default-export export function createTestConfig(name: string, options: CreateTestConfigOptions) { const { license = 'trial', disabledPlugins = [], ssl = false } = options; diff --git a/x-pack/test/detection_engine_api_integration/utils.ts b/x-pack/test/detection_engine_api_integration/utils.ts index 102a1577a7eaf1..604133a1c2dc7b 100644 --- a/x-pack/test/detection_engine_api_integration/utils.ts +++ b/x-pack/test/detection_engine_api_integration/utils.ts @@ -24,6 +24,7 @@ export const removeServerGeneratedProperties = ( rule: Partial ): Partial => { const { + /* eslint-disable @typescript-eslint/naming-convention */ created_at, updated_at, id, @@ -33,6 +34,7 @@ export const removeServerGeneratedProperties = ( last_success_message, status, status_date, + /* eslint-enable @typescript-eslint/naming-convention */ ...removedProperties } = rule; return removedProperties; @@ -46,6 +48,7 @@ export const removeServerGeneratedPropertiesIncludingRuleId = ( rule: Partial ): Partial => { const ruleWithRemovedProperties = removeServerGeneratedProperties(rule); + // eslint-disable-next-line @typescript-eslint/naming-convention const { rule_id, ...additionalRuledIdRemoved } = ruleWithRemovedProperties; return additionalRuledIdRemoved; }; @@ -153,6 +156,7 @@ export const getSignalStatusEmptyResponse = () => ({ */ export const getSimpleRuleWithoutRuleId = (): CreateRulesSchema => { const simpleRule = getSimpleRule(); + // eslint-disable-next-line @typescript-eslint/naming-convention const { rule_id, ...ruleWithoutId } = simpleRule; return ruleWithoutId; }; @@ -215,6 +219,7 @@ export const getSimpleRuleOutput = (ruleId = 'rule-1'): Partial => */ export const getSimpleRuleOutputWithoutRuleId = (ruleId = 'rule-1'): Partial => { const rule = getSimpleRuleOutput(ruleId); + // eslint-disable-next-line @typescript-eslint/naming-convention const { rule_id, ...ruleWithoutRuleId } = rule; return ruleWithoutRuleId; }; diff --git a/x-pack/test/functional/apps/lens/index.ts b/x-pack/test/functional/apps/lens/index.ts index 9e04f6e9df22b5..b17b7d856841c9 100644 --- a/x-pack/test/functional/apps/lens/index.ts +++ b/x-pack/test/functional/apps/lens/index.ts @@ -6,7 +6,6 @@ import { FtrProviderContext } from '../../ftr_provider_context.d'; -// eslint-disable-next-line @typescript-eslint/no-namespace, import/no-default-export export default function ({ getService, loadTestFile }: FtrProviderContext) { const browser = getService('browser'); const log = getService('log'); diff --git a/x-pack/test/functional/apps/lens/lens_reporting.ts b/x-pack/test/functional/apps/lens/lens_reporting.ts index 5fa2bd1a049a77..3e3d217b9d8d7e 100644 --- a/x-pack/test/functional/apps/lens/lens_reporting.ts +++ b/x-pack/test/functional/apps/lens/lens_reporting.ts @@ -7,7 +7,6 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../ftr_provider_context'; -// eslint-disable-next-line import/no-default-export export default function ({ getService, getPageObjects }: FtrProviderContext) { const PageObjects = getPageObjects(['common', 'dashboard', 'reporting']); const esArchiver = getService('esArchiver'); diff --git a/x-pack/test/functional/apps/lens/persistent_context.ts b/x-pack/test/functional/apps/lens/persistent_context.ts index 9146ec73346258..b57a9884dd11fb 100644 --- a/x-pack/test/functional/apps/lens/persistent_context.ts +++ b/x-pack/test/functional/apps/lens/persistent_context.ts @@ -7,7 +7,6 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../ftr_provider_context'; -// eslint-disable-next-line import/no-default-export export default function ({ getService, getPageObjects }: FtrProviderContext) { const PageObjects = getPageObjects(['visualize', 'lens', 'header', 'timePicker']); const browser = getService('browser'); diff --git a/x-pack/test/functional/apps/lens/smokescreen.ts b/x-pack/test/functional/apps/lens/smokescreen.ts index 23d4cc972675bb..1e936361610678 100644 --- a/x-pack/test/functional/apps/lens/smokescreen.ts +++ b/x-pack/test/functional/apps/lens/smokescreen.ts @@ -7,7 +7,6 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../ftr_provider_context'; -// eslint-disable-next-line import/no-default-export export default function ({ getService, getPageObjects }: FtrProviderContext) { const PageObjects = getPageObjects([ 'header', diff --git a/x-pack/test/functional/apps/ml/anomaly_detection/advanced_job.ts b/x-pack/test/functional/apps/ml/anomaly_detection/advanced_job.ts index b574c67daf7a44..a8836a463e6522 100644 --- a/x-pack/test/functional/apps/ml/anomaly_detection/advanced_job.ts +++ b/x-pack/test/functional/apps/ml/anomaly_detection/advanced_job.ts @@ -87,7 +87,6 @@ const isPickFieldsConfigWithSummaryCountField = ( return arg.hasOwnProperty('summaryCountField'); }; -// eslint-disable-next-line import/no-default-export export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const ml = getService('ml'); diff --git a/x-pack/test/functional/apps/ml/anomaly_detection/anomaly_explorer.ts b/x-pack/test/functional/apps/ml/anomaly_detection/anomaly_explorer.ts index c23abead458f17..89308938cfab05 100644 --- a/x-pack/test/functional/apps/ml/anomaly_detection/anomaly_explorer.ts +++ b/x-pack/test/functional/apps/ml/anomaly_detection/anomaly_explorer.ts @@ -51,7 +51,6 @@ const testDataList = [ }, ]; -// eslint-disable-next-line import/no-default-export export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const ml = getService('ml'); diff --git a/x-pack/test/functional/apps/ml/anomaly_detection/categorization_job.ts b/x-pack/test/functional/apps/ml/anomaly_detection/categorization_job.ts index 0f8aad36ed372b..1581bd54f5c440 100644 --- a/x-pack/test/functional/apps/ml/anomaly_detection/categorization_job.ts +++ b/x-pack/test/functional/apps/ml/anomaly_detection/categorization_job.ts @@ -8,7 +8,6 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../../ftr_provider_context'; import { CATEGORY_EXAMPLES_VALIDATION_STATUS } from '../../../../../plugins/ml/common/constants/categorization_job'; -// eslint-disable-next-line import/no-default-export export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const ml = getService('ml'); diff --git a/x-pack/test/functional/apps/ml/anomaly_detection/date_nanos_job.ts b/x-pack/test/functional/apps/ml/anomaly_detection/date_nanos_job.ts index da56d96d3d59ef..50622604c4e5c5 100644 --- a/x-pack/test/functional/apps/ml/anomaly_detection/date_nanos_job.ts +++ b/x-pack/test/functional/apps/ml/anomaly_detection/date_nanos_job.ts @@ -81,7 +81,6 @@ const isPickFieldsConfigWithSummaryCountField = ( return arg.hasOwnProperty('summaryCountField'); }; -// eslint-disable-next-line import/no-default-export export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const ml = getService('ml'); diff --git a/x-pack/test/functional/apps/ml/anomaly_detection/multi_metric_job.ts b/x-pack/test/functional/apps/ml/anomaly_detection/multi_metric_job.ts index 945717a694aacf..85477b105abe97 100644 --- a/x-pack/test/functional/apps/ml/anomaly_detection/multi_metric_job.ts +++ b/x-pack/test/functional/apps/ml/anomaly_detection/multi_metric_job.ts @@ -7,7 +7,6 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../../ftr_provider_context'; -// eslint-disable-next-line import/no-default-export export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const ml = getService('ml'); diff --git a/x-pack/test/functional/apps/ml/anomaly_detection/population_job.ts b/x-pack/test/functional/apps/ml/anomaly_detection/population_job.ts index 8084856aa7c6ba..c6de7f8a2bd396 100644 --- a/x-pack/test/functional/apps/ml/anomaly_detection/population_job.ts +++ b/x-pack/test/functional/apps/ml/anomaly_detection/population_job.ts @@ -7,7 +7,6 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../../ftr_provider_context'; -// eslint-disable-next-line import/no-default-export export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const ml = getService('ml'); diff --git a/x-pack/test/functional/apps/ml/anomaly_detection/saved_search_job.ts b/x-pack/test/functional/apps/ml/anomaly_detection/saved_search_job.ts index c1276c158eb640..6f40ec5427b74d 100644 --- a/x-pack/test/functional/apps/ml/anomaly_detection/saved_search_job.ts +++ b/x-pack/test/functional/apps/ml/anomaly_detection/saved_search_job.ts @@ -7,7 +7,6 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../../ftr_provider_context'; -// eslint-disable-next-line import/no-default-export export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const ml = getService('ml'); diff --git a/x-pack/test/functional/apps/ml/anomaly_detection/single_metric_job.ts b/x-pack/test/functional/apps/ml/anomaly_detection/single_metric_job.ts index 58d7d7c3ad3594..58f3960153bc60 100644 --- a/x-pack/test/functional/apps/ml/anomaly_detection/single_metric_job.ts +++ b/x-pack/test/functional/apps/ml/anomaly_detection/single_metric_job.ts @@ -7,7 +7,6 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../../ftr_provider_context'; -// eslint-disable-next-line import/no-default-export export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const ml = getService('ml'); diff --git a/x-pack/test/functional/apps/ml/anomaly_detection/single_metric_viewer.ts b/x-pack/test/functional/apps/ml/anomaly_detection/single_metric_viewer.ts index b9c40d319dea5b..db511c5d75f396 100644 --- a/x-pack/test/functional/apps/ml/anomaly_detection/single_metric_viewer.ts +++ b/x-pack/test/functional/apps/ml/anomaly_detection/single_metric_viewer.ts @@ -34,7 +34,6 @@ const DATAFEED_CONFIG: Datafeed = { query: { bool: { must: [{ match_all: {} }] } }, }; -// eslint-disable-next-line import/no-default-export export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const ml = getService('ml'); diff --git a/x-pack/test/functional/apps/ml/data_visualizer/file_data_visualizer.ts b/x-pack/test/functional/apps/ml/data_visualizer/file_data_visualizer.ts index fc561a7a93c2d6..3c9111c2466302 100644 --- a/x-pack/test/functional/apps/ml/data_visualizer/file_data_visualizer.ts +++ b/x-pack/test/functional/apps/ml/data_visualizer/file_data_visualizer.ts @@ -8,7 +8,6 @@ import path from 'path'; import { FtrProviderContext } from '../../../ftr_provider_context'; -// eslint-disable-next-line import/no-default-export export default function ({ getService }: FtrProviderContext) { const ml = getService('ml'); diff --git a/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer.ts b/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer.ts index aec91536406361..eb76a8b4298afd 100644 --- a/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer.ts +++ b/x-pack/test/functional/apps/ml/data_visualizer/index_data_visualizer.ts @@ -38,7 +38,6 @@ function getFieldTypes(cards: FieldVisConfig[]) { return fieldTypes.sort(); } -// eslint-disable-next-line import/no-default-export export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const ml = getService('ml'); diff --git a/x-pack/test/functional_with_es_ssl/config.ts b/x-pack/test/functional_with_es_ssl/config.ts index 43192d906336d1..5df5a4155efd31 100644 --- a/x-pack/test/functional_with_es_ssl/config.ts +++ b/x-pack/test/functional_with_es_ssl/config.ts @@ -25,7 +25,6 @@ const enabledActionTypes = [ 'test.rate-limit', ]; -// eslint-disable-next-line import/no-default-export export default async function ({ readConfigFile }: FtrConfigProviderContext) { const xpackFunctionalConfig = await readConfigFile(require.resolve('../functional/config.js')); diff --git a/x-pack/test/functional_with_es_ssl/fixtures/plugins/alerts/public/plugin.ts b/x-pack/test/functional_with_es_ssl/fixtures/plugins/alerts/public/plugin.ts index 503c328017a9a3..b612f54120d42a 100644 --- a/x-pack/test/functional_with_es_ssl/fixtures/plugins/alerts/public/plugin.ts +++ b/x-pack/test/functional_with_es_ssl/fixtures/plugins/alerts/public/plugin.ts @@ -19,6 +19,7 @@ export interface AlertingExamplePublicSetupDeps { } export class AlertingFixturePlugin implements Plugin { + // eslint-disable-next-line @typescript-eslint/naming-convention public setup(core: CoreSetup, { alerts, triggers_actions_ui }: AlertingExamplePublicSetupDeps) { alerts.registerNavigation( 'alerting_fixture', diff --git a/x-pack/test/ingest_manager_api_integration/apis/agent_config/agent_config.ts b/x-pack/test/ingest_manager_api_integration/apis/agent_config/agent_config.ts index 89258600c85e1e..6526dc63e212cc 100644 --- a/x-pack/test/ingest_manager_api_integration/apis/agent_config/agent_config.ts +++ b/x-pack/test/ingest_manager_api_integration/apis/agent_config/agent_config.ts @@ -59,6 +59,7 @@ export default function ({ getService }: FtrProviderContext) { description: 'Test', }) .expect(200); + // eslint-disable-next-line @typescript-eslint/naming-convention const { id, updated_at, ...newConfig } = item; expect(success).to.be(true); diff --git a/x-pack/test/licensing_plugin/public/updates.ts b/x-pack/test/licensing_plugin/public/updates.ts index 4604cfe032b0b8..b939bd7a0f9eb3 100644 --- a/x-pack/test/licensing_plugin/public/updates.ts +++ b/x-pack/test/licensing_plugin/public/updates.ts @@ -28,7 +28,7 @@ export default function (ftrContext: FtrProviderContext) { expect( await browser.executeAsync(async (cb) => { - const { setup, testUtils } = window.__coreProvider; + const { setup, testUtils } = window._coreProvider; // this call enforces signature check to detect license update // and causes license re-fetch await setup.core.http.get('/'); @@ -44,7 +44,7 @@ export default function (ftrContext: FtrProviderContext) { expect( await browser.executeAsync(async (cb) => { - const { setup, testUtils } = window.__coreProvider; + const { setup, testUtils } = window._coreProvider; // this call enforces signature check to detect license update // and causes license re-fetch await setup.core.http.get('/'); @@ -60,7 +60,7 @@ export default function (ftrContext: FtrProviderContext) { expect( await browser.executeAsync(async (cb) => { - const { setup, testUtils } = window.__coreProvider; + const { setup, testUtils } = window._coreProvider; // this call enforces signature check to detect license update // and causes license re-fetch await setup.core.http.get('/'); @@ -76,7 +76,7 @@ export default function (ftrContext: FtrProviderContext) { expect( await browser.executeAsync(async (cb) => { - const { setup, testUtils } = window.__coreProvider; + const { setup, testUtils } = window._coreProvider; // this call enforces signature check to detect license update // and causes license re-fetch await setup.core.http.get('/'); diff --git a/x-pack/test/mocha_decorations.d.ts b/x-pack/test/mocha_decorations.d.ts index 3574e717ef649a..44f43a22de1f95 100644 --- a/x-pack/test/mocha_decorations.d.ts +++ b/x-pack/test/mocha_decorations.d.ts @@ -7,7 +7,6 @@ import { Suite } from 'mocha'; // We need to use the namespace here to match the Mocha definition -// eslint-disable-next-line @typescript-eslint/no-namespace declare module 'mocha' { interface Suite { /** diff --git a/x-pack/test/oidc_api_integration/apis/implicit_flow/index.ts b/x-pack/test/oidc_api_integration/apis/implicit_flow/index.ts index 1c2f634f8054b1..0acae074f129f2 100644 --- a/x-pack/test/oidc_api_integration/apis/implicit_flow/index.ts +++ b/x-pack/test/oidc_api_integration/apis/implicit_flow/index.ts @@ -6,7 +6,6 @@ import { FtrProviderContext } from '../../ftr_provider_context'; -// eslint-disable-next-line import/no-default-export export default function ({ loadTestFile }: FtrProviderContext) { describe('apis', function () { this.tags('ciGroup6'); diff --git a/x-pack/test/oidc_api_integration/apis/implicit_flow/oidc_auth.ts b/x-pack/test/oidc_api_integration/apis/implicit_flow/oidc_auth.ts index f35c72ea135c9e..fbfb4df7fac63c 100644 --- a/x-pack/test/oidc_api_integration/apis/implicit_flow/oidc_auth.ts +++ b/x-pack/test/oidc_api_integration/apis/implicit_flow/oidc_auth.ts @@ -11,7 +11,6 @@ import { format as formatURL } from 'url'; import { createTokens, getStateAndNonce } from '../../fixtures/oidc_tools'; import { FtrProviderContext } from '../../ftr_provider_context'; -// eslint-disable-next-line import/no-default-export export default function ({ getService }: FtrProviderContext) { const supertest = getService('supertestWithoutAuth'); const config = getService('config'); diff --git a/x-pack/test/oidc_api_integration/implicit_flow.config.ts b/x-pack/test/oidc_api_integration/implicit_flow.config.ts index a3d87e809f887b..992115d05c5a82 100644 --- a/x-pack/test/oidc_api_integration/implicit_flow.config.ts +++ b/x-pack/test/oidc_api_integration/implicit_flow.config.ts @@ -6,7 +6,6 @@ import { FtrConfigProviderContext } from '@kbn/test/types/ftr'; -// eslint-disable-next-line import/no-default-export export default async function ({ readConfigFile }: FtrConfigProviderContext) { const oidcAPITestsConfig = await readConfigFile(require.resolve('./config.ts')); diff --git a/x-pack/test/plugin_api_integration/test_suites/licensed_feature_usage/feature_usage.ts b/x-pack/test/plugin_api_integration/test_suites/licensed_feature_usage/feature_usage.ts index e16d55f8fad2c0..770b51fb922fff 100644 --- a/x-pack/test/plugin_api_integration/test_suites/licensed_feature_usage/feature_usage.ts +++ b/x-pack/test/plugin_api_integration/test_suites/licensed_feature_usage/feature_usage.ts @@ -7,7 +7,6 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../ftr_provider_context'; -// eslint-disable-next-line import/no-default-export export default function ({ getService }: FtrProviderContext) { const supertest = getService('supertest'); diff --git a/x-pack/test/plugin_functional/config.ts b/x-pack/test/plugin_functional/config.ts index a766e22a34a1d9..40a3b3cf1877fa 100644 --- a/x-pack/test/plugin_functional/config.ts +++ b/x-pack/test/plugin_functional/config.ts @@ -13,7 +13,6 @@ import { pageObjects } from './page_objects'; // the default export of config files must be a config provider // that returns an object with the projects config values -/* eslint-disable import/no-default-export */ export default async function ({ readConfigFile }: FtrConfigProviderContext) { const xpackFunctionalConfig = await readConfigFile( require.resolve('../security_solution_endpoint/config.ts') diff --git a/x-pack/test/plugin_functional/test_suites/global_search/global_search_api.ts b/x-pack/test/plugin_functional/test_suites/global_search/global_search_api.ts index 841c4d2967e21b..146c4297fc2c8f 100644 --- a/x-pack/test/plugin_functional/test_suites/global_search/global_search_api.ts +++ b/x-pack/test/plugin_functional/test_suites/global_search/global_search_api.ts @@ -15,7 +15,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const findResultsWithAPI = async (t: string): Promise => { return browser.executeAsync(async (term, cb) => { - const { start } = window.__coreProvider; + const { start } = window._coreProvider; const globalSearchTestApi: GlobalSearchTestApi = start.plugins.globalSearchTest; globalSearchTestApi.findTest(term).then(cb); }, t); diff --git a/x-pack/test/plugin_functional/test_suites/global_search/global_search_providers.ts b/x-pack/test/plugin_functional/test_suites/global_search/global_search_providers.ts index 4e4f42578d11a1..726115958d027d 100644 --- a/x-pack/test/plugin_functional/test_suites/global_search/global_search_providers.ts +++ b/x-pack/test/plugin_functional/test_suites/global_search/global_search_providers.ts @@ -16,7 +16,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const findResultsWithAPI = async (t: string): Promise => { return browser.executeAsync(async (term, cb) => { - const { start } = window.__coreProvider; + const { start } = window._coreProvider; const globalSearchTestApi: GlobalSearchTestApi = start.plugins.globalSearchTest; globalSearchTestApi.findReal(term).then(cb); }, t); diff --git a/x-pack/test/security_solution_cypress/runner.ts b/x-pack/test/security_solution_cypress/runner.ts index e3bea8b9bbbcf9..11c960389e25fd 100644 --- a/x-pack/test/security_solution_cypress/runner.ts +++ b/x-pack/test/security_solution_cypress/runner.ts @@ -26,6 +26,7 @@ export async function SiemCypressTestRunner({ getService }: FtrProviderContext) cwd: resolve(__dirname, '../../plugins/security_solution'), env: { FORCE_COLOR: '1', + // eslint-disable-next-line @typescript-eslint/naming-convention CYPRESS_baseUrl: Url.format(config.get('servers.kibana')), CYPRESS_ELASTICSEARCH_URL: Url.format(config.get('servers.elasticsearch')), CYPRESS_ELASTICSEARCH_USERNAME: config.get('servers.elasticsearch.username'), diff --git a/x-pack/test/spaces_api_integration/security_and_spaces/apis/get_all.ts b/x-pack/test/spaces_api_integration/security_and_spaces/apis/get_all.ts index 1420cb35de1439..e64f7218250895 100644 --- a/x-pack/test/spaces_api_integration/security_and_spaces/apis/get_all.ts +++ b/x-pack/test/spaces_api_integration/security_and_spaces/apis/get_all.ts @@ -20,6 +20,7 @@ export default function getAllSpacesTestSuite({ getService }: TestInvoker) { ); describe('get all', () => { + /* eslint-disable @typescript-eslint/naming-convention */ [ { spaceId: SPACES.DEFAULT.spaceId, @@ -73,6 +74,7 @@ export default function getAllSpacesTestSuite({ getService }: TestInvoker) { monitoringUser: AUTHENTICATION.MONITORING_USER, }, }, + /* eslint-enable @typescript-eslint/naming-convention */ ].forEach((scenario) => { getAllTest(`user with no access can't access any spaces from ${scenario.spaceId}`, { spaceId: scenario.spaceId, diff --git a/x-pack/test/ui_capabilities/common/config.ts b/x-pack/test/ui_capabilities/common/config.ts index 068974386acd71..477a3f702ffbf9 100644 --- a/x-pack/test/ui_capabilities/common/config.ts +++ b/x-pack/test/ui_capabilities/common/config.ts @@ -14,7 +14,6 @@ interface CreateTestConfigOptions { disabledPlugins?: string[]; } -// eslint-disable-next-line import/no-default-export export function createTestConfig(name: string, options: CreateTestConfigOptions) { const { license = 'trial', disabledPlugins = [] } = options; diff --git a/x-pack/test/ui_capabilities/common/nav_links_builder.ts b/x-pack/test/ui_capabilities/common/nav_links_builder.ts index 04ab08e08a2ba9..886318be8e7586 100644 --- a/x-pack/test/ui_capabilities/common/nav_links_builder.ts +++ b/x-pack/test/ui_capabilities/common/nav_links_builder.ts @@ -5,7 +5,7 @@ */ import { Features } from './features'; -type buildCallback = (featureId: string) => boolean; +type BuildCallback = (featureId: string) => boolean; export class NavLinksBuilder { private readonly features: Features; constructor(features: Features) { @@ -38,7 +38,7 @@ export class NavLinksBuilder { return this.build((featureId) => feature.includes(featureId)); } - private build(callback: buildCallback): Record { + private build(callback: BuildCallback): Record { const navLinks = {} as Record; for (const [featureId, feature] of Object.entries(this.features)) { feature.app.forEach((app) => { diff --git a/x-pack/typings/rison_node.d.ts b/x-pack/typings/rison_node.d.ts index f830adc8974456..295392af2e05b8 100644 --- a/x-pack/typings/rison_node.d.ts +++ b/x-pack/typings/rison_node.d.ts @@ -16,11 +16,11 @@ declare module 'rison-node' { export const decode: (input: string) => RisonValue; - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line @typescript-eslint/naming-convention export const decode_object: (input: string) => RisonObject; export const encode: (input: Input) => string; - // eslint-disable-next-line @typescript-eslint/camelcase + // eslint-disable-next-line @typescript-eslint/naming-convention export const encode_object: (input: Input) => string; } diff --git a/yarn.lock b/yarn.lock index 0638267afd2566..7aff34fab23ceb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5798,23 +5798,26 @@ resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.0.tgz#8b63ab7f1aa5321248aad5ac890a485656dcea4d" integrity sha512-te5lMAWii1uEJ4FwLjzdlbw3+n0FZNOvFXHxQDKeT0dilh7HOzdMzV2TrJVUzq8ep7J4Na8OUYPRLSQkJHAlrg== -"@typescript-eslint/eslint-plugin@^2.34.0": - version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz#6f8ce8a46c7dea4a6f1d171d2bb8fbae6dac2be9" - integrity sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ== +"@typescript-eslint/eslint-plugin@^3.7.1": + version "3.7.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.7.1.tgz#d144c49a9a0ffe8dd704bb179c243df76c111bc9" + integrity sha512-3DB9JDYkMrc8Au00rGFiJLK2Ja9CoMP6Ut0sHsXp3ZtSugjNxvSSHTnKLfo4o+QmjYBJqEznDqsG1zj4F2xnsg== dependencies: - "@typescript-eslint/experimental-utils" "2.34.0" + "@typescript-eslint/experimental-utils" "3.7.1" + debug "^4.1.1" functional-red-black-tree "^1.0.1" regexpp "^3.0.0" + semver "^7.3.2" tsutils "^3.17.1" -"@typescript-eslint/experimental-utils@2.34.0": - version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz#d3524b644cdb40eebceca67f8cf3e4cc9c8f980f" - integrity sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA== +"@typescript-eslint/experimental-utils@3.7.1": + version "3.7.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-3.7.1.tgz#ab036caaed4c870d22531d41f9352f3147364d61" + integrity sha512-TqE97pv7HrqWcGJbLbZt1v59tcqsSVpWTOf1AqrWK7n8nok2sGgVtYRuGXeNeLw3wXlLEbY1MKP3saB2HsO/Ng== dependencies: "@types/json-schema" "^7.0.3" - "@typescript-eslint/typescript-estree" "2.34.0" + "@typescript-eslint/types" "3.7.1" + "@typescript-eslint/typescript-estree" "3.7.1" eslint-scope "^5.0.0" eslint-utils "^2.0.0" @@ -5827,16 +5830,22 @@ "@typescript-eslint/typescript-estree" "2.15.0" eslint-scope "^5.0.0" -"@typescript-eslint/parser@^2.34.0": - version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.34.0.tgz#50252630ca319685420e9a39ca05fe185a256bc8" - integrity sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA== +"@typescript-eslint/parser@^3.7.1": + version "3.7.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-3.7.1.tgz#5d9ccecb116d12d9c6073e9861c57c9b1aa88128" + integrity sha512-W4QV/gXvfIsccN8225784LNOorcm7ch68Fi3V4Wg7gmkWSQRKevO4RrRqWo6N/Z/myK1QAiGgeaXN57m+R/8iQ== dependencies: "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "2.34.0" - "@typescript-eslint/typescript-estree" "2.34.0" + "@typescript-eslint/experimental-utils" "3.7.1" + "@typescript-eslint/types" "3.7.1" + "@typescript-eslint/typescript-estree" "3.7.1" eslint-visitor-keys "^1.1.0" +"@typescript-eslint/types@3.7.1": + version "3.7.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.7.1.tgz#90375606b2fd73c1224fe9e397ee151e28fa1e0c" + integrity sha512-PZe8twm5Z4b61jt7GAQDor6KiMhgPgf4XmUb9zdrwTbgtC/Sj29gXP1dws9yEn4+aJeyXrjsD9XN7AWFhmnUfg== + "@typescript-eslint/typescript-estree@2.15.0": version "2.15.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.15.0.tgz#79ae52eed8701b164d91e968a65d85a9105e76d3" @@ -5850,13 +5859,14 @@ semver "^6.3.0" tsutils "^3.17.1" -"@typescript-eslint/typescript-estree@2.34.0": - version "2.34.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz#14aeb6353b39ef0732cc7f1b8285294937cf37d5" - integrity sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg== +"@typescript-eslint/typescript-estree@3.7.1": + version "3.7.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-3.7.1.tgz#ce1ffbd0fa53f34d4ce851a7a364e392432f6eb3" + integrity sha512-m97vNZkI08dunYOr2lVZOHoyfpqRs0KDpd6qkGaIcLGhQ2WPtgHOd/eVbsJZ0VYCQvupKrObAGTOvk3tfpybYA== dependencies: + "@typescript-eslint/types" "3.7.1" + "@typescript-eslint/visitor-keys" "3.7.1" debug "^4.1.1" - eslint-visitor-keys "^1.1.0" glob "^7.1.6" is-glob "^4.0.1" lodash "^4.17.15" @@ -5871,6 +5881,13 @@ lodash.unescape "4.0.1" semver "5.5.0" +"@typescript-eslint/visitor-keys@3.7.1": + version "3.7.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-3.7.1.tgz#b90191e74efdee656be8c5a30f428ed16dda46d1" + integrity sha512-xn22sQbEya+Utj2IqJHGLA3i1jDzR43RzWupxojbSWnj3nnPLavaQmWe5utw03CwYao3r00qzXfgJMGNkrzrAA== + dependencies: + eslint-visitor-keys "^1.1.0" + "@webassemblyjs/ast@1.8.5": version "1.8.5" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" @@ -13070,6 +13087,14 @@ eslint-plugin-es@^3.0.0: eslint-utils "^2.0.0" regexpp "^3.0.0" +eslint-plugin-eslint-comments@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz#9e1cd7b4413526abb313933071d7aba05ca12ffa" + integrity sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ== + dependencies: + escape-string-regexp "^1.0.5" + ignore "^5.0.5" + eslint-plugin-import@^2.19.1: version "2.19.1" resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.19.1.tgz#5654e10b7839d064dd0d46cd1b88ec2133a11448" @@ -16946,7 +16971,7 @@ ignore@^4.0.3, ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.1.1, ignore@^5.1.4: +ignore@^5.0.5, ignore@^5.1.1, ignore@^5.1.4: version "5.1.8" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== From 549c256390383ee08bcbe3744c42eb226acc18b5 Mon Sep 17 00:00:00 2001 From: MadameSheema Date: Wed, 5 Aug 2020 17:45:30 +0200 Subject: [PATCH 13/33] [SIEM] Adds rule override Cypress tests (#74367) * implements rule override test * refactors the code --- .../alerts_detection_rules_override.spec.ts | 196 ++++++++++++++++++ .../security_solution/cypress/objects/rule.ts | 50 +++++ .../cypress/screens/create_new_rule.ts | 16 ++ .../cypress/screens/rule_details.ts | 18 ++ .../cypress/tasks/create_new_rule.ts | 76 ++++++- .../rules/risk_score_mapping/index.tsx | 2 +- .../rules/severity_mapping/index.tsx | 8 +- .../rules/step_about_rule/index.tsx | 4 +- 8 files changed, 364 insertions(+), 6 deletions(-) create mode 100644 x-pack/plugins/security_solution/cypress/integration/alerts_detection_rules_override.spec.ts diff --git a/x-pack/plugins/security_solution/cypress/integration/alerts_detection_rules_override.spec.ts b/x-pack/plugins/security_solution/cypress/integration/alerts_detection_rules_override.spec.ts new file mode 100644 index 00000000000000..e3526c63e2310d --- /dev/null +++ b/x-pack/plugins/security_solution/cypress/integration/alerts_detection_rules_override.spec.ts @@ -0,0 +1,196 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { newOverrideRule } from '../objects/rule'; + +import { + CUSTOM_RULES_BTN, + RISK_SCORE, + RULE_NAME, + RULES_ROW, + RULES_TABLE, + SEVERITY, +} from '../screens/alerts_detection_rules'; +import { + ABOUT_INVESTIGATION_NOTES, + ABOUT_OVERRIDE_FALSE_POSITIVES, + ABOUT_OVERRIDE_MITRE, + ABOUT_OVERRIDE_NAME_OVERRIDE, + ABOUT_OVERRIDE_RISK, + ABOUT_OVERRIDE_RISK_OVERRIDE, + ABOUT_OVERRIDE_SEVERITY_OVERRIDE, + ABOUT_OVERRIDE_TAGS, + ABOUT_OVERRIDE_TIMESTAMP_OVERRIDE, + ABOUT_OVERRIDE_URLS, + ABOUT_RULE_DESCRIPTION, + ABOUT_SEVERITY, + ABOUT_STEP, + DEFINITION_CUSTOM_QUERY, + DEFINITION_INDEX_PATTERNS, + DEFINITION_TIMELINE, + DEFINITION_STEP, + INVESTIGATION_NOTES_MARKDOWN, + INVESTIGATION_NOTES_TOGGLE, + RULE_ABOUT_DETAILS_HEADER_TOGGLE, + RULE_NAME_HEADER, + SCHEDULE_LOOPBACK, + SCHEDULE_RUNS, + SCHEDULE_STEP, +} from '../screens/rule_details'; + +import { + goToManageAlertsDetectionRules, + waitForAlertsIndexToBeCreated, + waitForAlertsPanelToBeLoaded, +} from '../tasks/alerts'; +import { + changeToThreeHundredRowsPerPage, + filterByCustomRules, + goToCreateNewRule, + goToRuleDetails, + waitForLoadElasticPrebuiltDetectionRulesTableToBeLoaded, + waitForRulesToBeLoaded, +} from '../tasks/alerts_detection_rules'; +import { + createAndActivateRule, + fillAboutRuleWithOverrideAndContinue, + fillDefineCustomRuleWithImportedQueryAndContinue, +} from '../tasks/create_new_rule'; +import { esArchiverLoad, esArchiverUnload } from '../tasks/es_archiver'; +import { loginAndWaitForPageWithoutDateRange } from '../tasks/login'; + +import { DETECTIONS_URL } from '../urls/navigation'; + +describe('Detection rules, override', () => { + before(() => { + esArchiverLoad('timeline'); + }); + + after(() => { + esArchiverUnload('timeline'); + }); + + it('Creates and activates a new custom rule with override option', () => { + loginAndWaitForPageWithoutDateRange(DETECTIONS_URL); + waitForAlertsPanelToBeLoaded(); + waitForAlertsIndexToBeCreated(); + goToManageAlertsDetectionRules(); + waitForLoadElasticPrebuiltDetectionRulesTableToBeLoaded(); + goToCreateNewRule(); + fillDefineCustomRuleWithImportedQueryAndContinue(newOverrideRule); + fillAboutRuleWithOverrideAndContinue(newOverrideRule); + createAndActivateRule(); + + cy.get(CUSTOM_RULES_BTN).invoke('text').should('eql', 'Custom rules (1)'); + + changeToThreeHundredRowsPerPage(); + waitForRulesToBeLoaded(); + + const expectedNumberOfRules = 1; + cy.get(RULES_TABLE).then(($table) => { + cy.wrap($table.find(RULES_ROW).length).should('eql', expectedNumberOfRules); + }); + + filterByCustomRules(); + + cy.get(RULES_TABLE).then(($table) => { + cy.wrap($table.find(RULES_ROW).length).should('eql', 1); + }); + cy.get(RULE_NAME).invoke('text').should('eql', newOverrideRule.name); + cy.get(RISK_SCORE).invoke('text').should('eql', newOverrideRule.riskScore); + cy.get(SEVERITY).invoke('text').should('eql', newOverrideRule.severity); + cy.get('[data-test-subj="rule-switch"]').should('have.attr', 'aria-checked', 'true'); + + goToRuleDetails(); + + let expectedUrls = ''; + newOverrideRule.referenceUrls.forEach((url) => { + expectedUrls = expectedUrls + url; + }); + let expectedFalsePositives = ''; + newOverrideRule.falsePositivesExamples.forEach((falsePositive) => { + expectedFalsePositives = expectedFalsePositives + falsePositive; + }); + let expectedTags = ''; + newOverrideRule.tags.forEach((tag) => { + expectedTags = expectedTags + tag; + }); + let expectedMitre = ''; + newOverrideRule.mitre.forEach((mitre) => { + expectedMitre = expectedMitre + mitre.tactic; + mitre.techniques.forEach((technique) => { + expectedMitre = expectedMitre + technique; + }); + }); + const expectedIndexPatterns = [ + 'apm-*-transaction*', + 'auditbeat-*', + 'endgame-*', + 'filebeat-*', + 'logs-*', + 'packetbeat-*', + 'winlogbeat-*', + ]; + + cy.get(RULE_NAME_HEADER).invoke('text').should('eql', `${newOverrideRule.name} Beta`); + + cy.get(ABOUT_RULE_DESCRIPTION).invoke('text').should('eql', newOverrideRule.description); + + const expectedOverrideSeverities = ['Low', 'Medium', 'High', 'Critical']; + + cy.get(ABOUT_STEP).eq(ABOUT_SEVERITY).invoke('text').should('eql', newOverrideRule.severity); + newOverrideRule.severityOverride.forEach((severity, i) => { + cy.get(ABOUT_STEP) + .eq(ABOUT_OVERRIDE_SEVERITY_OVERRIDE + i) + .invoke('text') + .should( + 'eql', + `${severity.sourceField}:${severity.sourceValue}${expectedOverrideSeverities[i]}` + ); + }); + + cy.get(ABOUT_STEP) + .eq(ABOUT_OVERRIDE_RISK) + .invoke('text') + .should('eql', newOverrideRule.riskScore); + cy.get(ABOUT_STEP) + .eq(ABOUT_OVERRIDE_RISK_OVERRIDE) + .invoke('text') + .should('eql', `${newOverrideRule.riskOverride}signal.rule.risk_score`); + cy.get(ABOUT_STEP).eq(ABOUT_OVERRIDE_URLS).invoke('text').should('eql', expectedUrls); + cy.get(ABOUT_STEP) + .eq(ABOUT_OVERRIDE_FALSE_POSITIVES) + .invoke('text') + .should('eql', expectedFalsePositives); + cy.get(ABOUT_STEP) + .eq(ABOUT_OVERRIDE_NAME_OVERRIDE) + .invoke('text') + .should('eql', newOverrideRule.nameOverride); + cy.get(ABOUT_STEP).eq(ABOUT_OVERRIDE_MITRE).invoke('text').should('eql', expectedMitre); + cy.get(ABOUT_STEP) + .eq(ABOUT_OVERRIDE_TIMESTAMP_OVERRIDE) + .invoke('text') + .should('eql', newOverrideRule.timestampOverride); + cy.get(ABOUT_STEP).eq(ABOUT_OVERRIDE_TAGS).invoke('text').should('eql', expectedTags); + + cy.get(RULE_ABOUT_DETAILS_HEADER_TOGGLE).eq(INVESTIGATION_NOTES_TOGGLE).click({ force: true }); + cy.get(ABOUT_INVESTIGATION_NOTES).invoke('text').should('eql', INVESTIGATION_NOTES_MARKDOWN); + + cy.get(DEFINITION_INDEX_PATTERNS).then((patterns) => { + cy.wrap(patterns).each((pattern, index) => { + cy.wrap(pattern).invoke('text').should('eql', expectedIndexPatterns[index]); + }); + }); + cy.get(DEFINITION_STEP) + .eq(DEFINITION_CUSTOM_QUERY) + .invoke('text') + .should('eql', `${newOverrideRule.customQuery} `); + cy.get(DEFINITION_STEP).eq(DEFINITION_TIMELINE).invoke('text').should('eql', 'None'); + + cy.get(SCHEDULE_STEP).eq(SCHEDULE_RUNS).invoke('text').should('eql', '5m'); + cy.get(SCHEDULE_STEP).eq(SCHEDULE_LOOPBACK).invoke('text').should('eql', '1m'); + }); +}); diff --git a/x-pack/plugins/security_solution/cypress/objects/rule.ts b/x-pack/plugins/security_solution/cypress/objects/rule.ts index aeadc34c6e49c6..df6b792296f9d7 100644 --- a/x-pack/plugins/security_solution/cypress/objects/rule.ts +++ b/x-pack/plugins/security_solution/cypress/objects/rule.ts @@ -18,6 +18,11 @@ interface Mitre { techniques: string[]; } +interface SeverityOverride { + sourceField: string; + sourceValue: string; +} + export interface CustomRule { customQuery: string; name: string; @@ -38,6 +43,13 @@ export interface ThresholdRule extends CustomRule { threshold: string; } +export interface OverrideRule extends CustomRule { + severityOverride: SeverityOverride[]; + riskOverride: string; + nameOverride: string; + timestampOverride: string; +} + export interface MachineLearningRule { machineLearningJob: string; anomalyScoreThreshold: string; @@ -63,6 +75,26 @@ const mitre2: Mitre = { techniques: ['CMSTP (T1191)'], }; +const severityOverride1: SeverityOverride = { + sourceField: 'host.name', + sourceValue: 'host', +}; + +const severityOverride2: SeverityOverride = { + sourceField: 'agent.type', + sourceValue: 'endpoint', +}; + +const severityOverride3: SeverityOverride = { + sourceField: 'host.geo.name', + sourceValue: 'atack', +}; + +const severityOverride4: SeverityOverride = { + sourceField: '@timestamp', + sourceValue: '10/02/2020', +}; + export const newRule: CustomRule = { customQuery: 'host.name:*', name: 'New Rule Test', @@ -77,6 +109,24 @@ export const newRule: CustomRule = { timelineId: '0162c130-78be-11ea-9718-118a926974a4', }; +export const newOverrideRule: OverrideRule = { + customQuery: 'host.name:*', + name: 'New Rule Test', + description: 'The new rule description.', + severity: 'High', + riskScore: '17', + tags: ['test', 'newRule'], + referenceUrls: ['https://www.google.com/', 'https://elastic.co/'], + falsePositivesExamples: ['False1', 'False2'], + mitre: [mitre1, mitre2], + note: '# test markdown', + timelineId: '0162c130-78be-11ea-9718-118a926974a4', + severityOverride: [severityOverride1, severityOverride2, severityOverride3, severityOverride4], + riskOverride: 'destination.port', + nameOverride: 'agent.type', + timestampOverride: '@timestamp', +}; + export const newThresholdRule: ThresholdRule = { customQuery: 'host.name:*', name: 'New Rule Test', diff --git a/x-pack/plugins/security_solution/cypress/screens/create_new_rule.ts b/x-pack/plugins/security_solution/cypress/screens/create_new_rule.ts index af4fe7257ae5b5..83ace877cd51df 100644 --- a/x-pack/plugins/security_solution/cypress/screens/create_new_rule.ts +++ b/x-pack/plugins/security_solution/cypress/screens/create_new_rule.ts @@ -18,6 +18,8 @@ export const MITRE_BTN = '[data-test-subj="addMitre"]'; export const ADVANCED_SETTINGS_BTN = '[data-test-subj="advancedSettings"] .euiAccordion__button'; +export const COMBO_BOX_INPUT = '[data-test-subj="comboBoxInput"]'; + export const CREATE_AND_ACTIVATE_BTN = '[data-test-subj="create-activate"]'; export const CUSTOM_QUERY_INPUT = '[data-test-subj="queryInput"]'; @@ -53,17 +55,31 @@ export const REFERENCE_URLS_INPUT = export const RISK_INPUT = '.euiRangeInput'; +export const RISK_MAPPING_OVERRIDE_OPTION = '#risk_score-mapping-override'; + +export const RISK_OVERRIDE = + '[data-test-subj="detectionEngineStepAboutRuleRiskScore-riskOverride"]'; + export const RULE_DESCRIPTION_INPUT = '[data-test-subj="detectionEngineStepAboutRuleDescription"] [data-test-subj="input"]'; export const RULE_NAME_INPUT = '[data-test-subj="detectionEngineStepAboutRuleName"] [data-test-subj="input"]'; +export const RULE_NAME_OVERRIDE = '[data-test-subj="detectionEngineStepAboutRuleRuleNameOverride"]'; + +export const RULE_TIMESTAMP_OVERRIDE = + '[data-test-subj="detectionEngineStepAboutRuleTimestampOverride"]'; + export const SCHEDULE_CONTINUE_BUTTON = '[data-test-subj="schedule-continue"]'; export const SEVERITY_DROPDOWN = '[data-test-subj="detectionEngineStepAboutRuleSeverity"] [data-test-subj="select"]'; +export const SEVERITY_MAPPING_OVERRIDE_OPTION = '#severity-mapping-override'; + +export const SEVERITY_OVERRIDE_ROW = '[data-test-subj="severityOverrideRow"]'; + export const TAGS_INPUT = '[data-test-subj="detectionEngineStepAboutRuleTags"] [data-test-subj="comboBoxSearchInput"]'; diff --git a/x-pack/plugins/security_solution/cypress/screens/rule_details.ts b/x-pack/plugins/security_solution/cypress/screens/rule_details.ts index 1c0102382ab6b8..b221709966943f 100644 --- a/x-pack/plugins/security_solution/cypress/screens/rule_details.ts +++ b/x-pack/plugins/security_solution/cypress/screens/rule_details.ts @@ -10,6 +10,24 @@ export const ABOUT_INVESTIGATION_NOTES = '[data-test-subj="stepAboutDetailsNoteC export const ABOUT_MITRE = 4; +export const ABOUT_OVERRIDE_FALSE_POSITIVES = 8; + +export const ABOUT_OVERRIDE_MITRE = 10; + +export const ABOUT_OVERRIDE_NAME_OVERRIDE = 9; + +export const ABOUT_OVERRIDE_RISK = 5; + +export const ABOUT_OVERRIDE_RISK_OVERRIDE = 6; + +export const ABOUT_OVERRIDE_SEVERITY_OVERRIDE = 1; + +export const ABOUT_OVERRIDE_TAGS = 12; + +export const ABOUT_OVERRIDE_TIMESTAMP_OVERRIDE = 11; + +export const ABOUT_OVERRIDE_URLS = 7; + export const ABOUT_RULE_DESCRIPTION = '[data-test-subj=stepAboutRuleDetailsToggleDescriptionText]'; export const ABOUT_RISK = 1; diff --git a/x-pack/plugins/security_solution/cypress/tasks/create_new_rule.ts b/x-pack/plugins/security_solution/cypress/tasks/create_new_rule.ts index de9d343bc91f7f..1cce72a48e0f0e 100644 --- a/x-pack/plugins/security_solution/cypress/tasks/create_new_rule.ts +++ b/x-pack/plugins/security_solution/cypress/tasks/create_new_rule.ts @@ -8,6 +8,7 @@ import { CustomRule, MachineLearningRule, machineLearningRule, + OverrideRule, ThresholdRule, } from '../objects/rule'; import { @@ -16,6 +17,7 @@ import { ADD_FALSE_POSITIVE_BTN, ADD_REFERENCE_URL_BTN, ADVANCED_SETTINGS_BTN, + COMBO_BOX_INPUT, CREATE_AND_ACTIVATE_BTN, CUSTOM_QUERY_INPUT, DEFINE_CONTINUE_BUTTON, @@ -32,10 +34,16 @@ import { MITRE_TECHNIQUES_INPUT, RISK_INPUT, REFERENCE_URLS_INPUT, + RISK_MAPPING_OVERRIDE_OPTION, + RISK_OVERRIDE, RULE_DESCRIPTION_INPUT, RULE_NAME_INPUT, + RULE_NAME_OVERRIDE, + RULE_TIMESTAMP_OVERRIDE, SCHEDULE_CONTINUE_BUTTON, SEVERITY_DROPDOWN, + SEVERITY_MAPPING_OVERRIDE_OPTION, + SEVERITY_OVERRIDE_ROW, TAGS_INPUT, THRESHOLD_FIELD_SELECTION, THRESHOLD_INPUT_AREA, @@ -92,7 +100,73 @@ export const fillAboutRuleAndContinue = ( cy.get(ABOUT_CONTINUE_BTN).should('exist').click({ force: true }); }; -export const fillDefineCustomRuleWithImportedQueryAndContinue = (rule: CustomRule) => { +export const fillAboutRuleWithOverrideAndContinue = (rule: OverrideRule) => { + cy.get(RULE_NAME_INPUT).type(rule.name, { force: true }); + cy.get(RULE_DESCRIPTION_INPUT).type(rule.description, { force: true }); + + cy.get(SEVERITY_MAPPING_OVERRIDE_OPTION).click(); + rule.severityOverride.forEach((severity, i) => { + cy.get(SEVERITY_OVERRIDE_ROW) + .eq(i) + .within(() => { + cy.get(COMBO_BOX_INPUT).eq(0).type(`${severity.sourceField}{enter}`); + cy.get(COMBO_BOX_INPUT).eq(1).type(`${severity.sourceValue}{enter}`); + }); + }); + + cy.get(SEVERITY_DROPDOWN).click({ force: true }); + cy.get(`#${rule.severity.toLowerCase()}`).click(); + + cy.get(RISK_MAPPING_OVERRIDE_OPTION).click(); + cy.get(RISK_OVERRIDE).within(() => { + cy.get(COMBO_BOX_INPUT).type(`${rule.riskOverride}{enter}`); + }); + + cy.get(RISK_INPUT).clear({ force: true }).type(`${rule.riskScore}`, { force: true }); + + rule.tags.forEach((tag) => { + cy.get(TAGS_INPUT).type(`${tag}{enter}`, { force: true }); + }); + + cy.get(ADVANCED_SETTINGS_BTN).click({ force: true }); + + rule.referenceUrls.forEach((url, index) => { + cy.get(REFERENCE_URLS_INPUT).eq(index).type(url, { force: true }); + cy.get(ADD_REFERENCE_URL_BTN).click({ force: true }); + }); + + rule.falsePositivesExamples.forEach((falsePositive, index) => { + cy.get(FALSE_POSITIVES_INPUT).eq(index).type(falsePositive, { force: true }); + cy.get(ADD_FALSE_POSITIVE_BTN).click({ force: true }); + }); + + rule.mitre.forEach((mitre, index) => { + cy.get(MITRE_TACTIC_DROPDOWN).eq(index).click({ force: true }); + cy.contains(MITRE_TACTIC, mitre.tactic).click(); + + mitre.techniques.forEach((technique) => { + cy.get(MITRE_TECHNIQUES_INPUT).eq(index).type(`${technique}{enter}`, { force: true }); + }); + + cy.get(MITRE_BTN).click({ force: true }); + }); + + cy.get(INVESTIGATION_NOTES_TEXTAREA).type(rule.note, { force: true }); + + cy.get(RULE_NAME_OVERRIDE).within(() => { + cy.get(COMBO_BOX_INPUT).type(`${rule.nameOverride}{enter}`); + }); + + cy.get(RULE_TIMESTAMP_OVERRIDE).within(() => { + cy.get(COMBO_BOX_INPUT).type(`${rule.timestampOverride}{enter}`); + }); + + cy.get(ABOUT_CONTINUE_BTN).should('exist').click({ force: true }); +}; + +export const fillDefineCustomRuleWithImportedQueryAndContinue = ( + rule: CustomRule | OverrideRule +) => { cy.get(IMPORT_QUERY_FROM_SAVED_TIMELINE_LINK).click(); cy.get(TIMELINE(rule.timelineId)).click(); cy.get(CUSTOM_QUERY_INPUT).invoke('text').should('eq', rule.customQuery); diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/risk_score_mapping/index.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/risk_score_mapping/index.tsx index 0f16cb99862a50..a0384ef52a841b 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/risk_score_mapping/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/risk_score_mapping/index.tsx @@ -179,7 +179,7 @@ export const RiskScoreField = ({ error={'errorMessage'} isInvalid={false} fullWidth - data-test-subj={dataTestSubj} + data-test-subj={`${dataTestSubj}-riskOverride`} describedByIds={idAria ? [idAria] : undefined} > diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/severity_mapping/index.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/severity_mapping/index.tsx index 54d505a4d867f1..733e701cff2047 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/severity_mapping/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/severity_mapping/index.tsx @@ -220,7 +220,7 @@ export const SeverityField = ({ error={'errorMessage'} isInvalid={false} fullWidth - data-test-subj={dataTestSubj} + data-test-subj={`${dataTestSubj}-severityOverride`} describedByIds={idAria ? [idAria] : undefined} > @@ -245,7 +245,11 @@ export const SeverityField = ({ {(field.value as AboutStepSeverity).mapping.map( (severityMappingItem: SeverityMappingItem, index) => ( - + = ({ path="severity" component={SeverityField} componentProps={{ - 'data-test-subj': 'detectionEngineStepAboutRuleSeverityField', + dataTestSubj: 'detectionEngineStepAboutRuleSeverityField', idAria: 'detectionEngineStepAboutRuleSeverityField', isDisabled: isLoading || indexPatternLoading, options: severityOptions, @@ -158,7 +158,7 @@ const StepAboutRuleComponent: FC = ({ path="riskScore" component={RiskScoreField} componentProps={{ - 'data-test-subj': 'detectionEngineStepAboutRuleRiskScore', + dataTestSubj: 'detectionEngineStepAboutRuleRiskScore', idAria: 'detectionEngineStepAboutRuleRiskScore', isDisabled: isLoading || indexPatternLoading, indices: indexPatterns, From e23c5eafa1171bc074d1aa33fa7e24b99cbb131c Mon Sep 17 00:00:00 2001 From: Yara Tercero Date: Wed, 5 Aug 2020 12:10:28 -0400 Subject: [PATCH 14/33] [Security Solution][Exceptions] - Fixes builder overflow and updates ux for nested entries (#74262) ## Summary - updates the builder nested entries so that the children do not display the parent path - so instead of `parent.child` it just shows `child` - updates the builder to fix overflow issue --- .../common/components/autocomplete/field.tsx | 10 ++++--- .../common/components/autocomplete/helpers.ts | 5 ++-- .../exceptions/builder/entry_item.tsx | 9 +++++-- .../exceptions/builder/exception_item.tsx | 13 +++++++--- .../exceptions/builder/helpers.test.tsx | 11 +++----- .../components/exceptions/builder/helpers.tsx | 26 +++++++++++++------ .../exceptions/viewer/index.test.tsx | 2 ++ 7 files changed, 50 insertions(+), 26 deletions(-) diff --git a/x-pack/plugins/security_solution/public/common/components/autocomplete/field.tsx b/x-pack/plugins/security_solution/public/common/components/autocomplete/field.tsx index fab2b1e4a74636..48b24a79bd7c0f 100644 --- a/x-pack/plugins/security_solution/public/common/components/autocomplete/field.tsx +++ b/x-pack/plugins/security_solution/public/common/components/autocomplete/field.tsx @@ -36,11 +36,11 @@ export const FieldComponent: React.FC = ({ onChange, }): JSX.Element => { const [touched, setIsTouched] = useState(false); - const getLabel = useCallback((field): string => field.name, []); + const getLabel = useCallback(({ name }): string => name, []); const optionsMemo = useMemo((): IFieldType[] => { if (indexPattern != null) { if (fieldTypeFilter.length > 0) { - return indexPattern.fields.filter((f) => fieldTypeFilter.includes(f.type)); + return indexPattern.fields.filter(({ type }) => fieldTypeFilter.includes(type)); } else { return indexPattern.fields; } @@ -68,6 +68,10 @@ export const FieldComponent: React.FC = ({ onChange(newValues); }; + const handleTouch = useCallback((): void => { + setIsTouched(true); + }, [setIsTouched]); + return ( = ({ isDisabled={isDisabled} isClearable={isClearable} isInvalid={isRequired ? touched && selectedField == null : false} - onFocus={() => setIsTouched(true)} + onFocus={handleTouch} singleSelection={{ asPlainText: true }} data-test-subj="fieldAutocompleteComboBox" style={{ width: `${fieldInputWidth}px` }} diff --git a/x-pack/plugins/security_solution/public/common/components/autocomplete/helpers.ts b/x-pack/plugins/security_solution/public/common/components/autocomplete/helpers.ts index 3dcaf612da649e..8bbc0221814752 100644 --- a/x-pack/plugins/security_solution/public/common/components/autocomplete/helpers.ts +++ b/x-pack/plugins/security_solution/public/common/components/autocomplete/helpers.ts @@ -69,11 +69,12 @@ export function getGenericComboBoxProps({ const newLabels = options.map(getLabel); const newComboOptions: EuiComboBoxOptionOption[] = newLabels.map((label) => ({ label })); const newSelectedComboOptions = selectedOptions + .map(getLabel) .filter((option) => { - return options.indexOf(option) !== -1; + return newLabels.indexOf(option) !== -1; }) .map((option) => { - return newComboOptions[options.indexOf(option)]; + return newComboOptions[newLabels.indexOf(option)]; }); return { diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/builder/entry_item.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/builder/entry_item.tsx index 3044f6d01b745c..450b48a793e4e8 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/builder/entry_item.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/builder/entry_item.tsx @@ -5,6 +5,7 @@ */ import React, { useCallback } from 'react'; import { EuiFormRow, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import styled from 'styled-components'; import { IFieldType, IIndexPattern } from '../../../../../../../../src/plugins/data/common'; import { FieldComponent } from '../../autocomplete/field'; @@ -29,6 +30,10 @@ import { } from './helpers'; import { EXCEPTION_OPERATORS_ONLY_LISTS } from '../../autocomplete/operators'; +const MyValuesInput = styled(EuiFlexItem)` + overflow: hidden; +`; + interface EntryItemProps { entry: FormattedBuilderEntry; indexPattern: IIndexPattern; @@ -257,12 +262,12 @@ export const BuilderEntryItem: React.FC = ({ > {renderFieldInput(showLabel)} {renderOperatorInput(showLabel)} - + {renderFieldValueInput( showLabel, entry.nested === 'parent' ? OperatorTypeEnum.EXISTS : entry.operator.type )} - + ); }; diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/builder/exception_item.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/builder/exception_item.tsx index cd8b66acd223a2..49a159cdfe6232 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/builder/exception_item.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/builder/exception_item.tsx @@ -26,6 +26,11 @@ const MyBeautifulLine = styled(EuiFlexItem)` } `; +const MyOverflowContainer = styled(EuiFlexItem)` + overflow: hidden; + width: 100%; +`; + interface BuilderExceptionListItemProps { exceptionItem: ExceptionsBuilderExceptionItem; exceptionId: string; @@ -98,13 +103,13 @@ export const BuilderExceptionListItemComponent = React.memo )} - + {entries.map((item, index) => ( {item.nested === 'child' && } - + - + ))} - + ); diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/builder/helpers.test.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/builder/helpers.test.tsx index a3c5d09a0fb645..04ab9ee7216f7e 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/builder/helpers.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/builder/helpers.test.tsx @@ -161,10 +161,7 @@ describe('Exception builder helpers', () => { const payloadItem: FormattedBuilderEntry = getMockNestedBuilderEntry(); const output = getFilteredIndexPatterns(payloadIndexPattern, payloadItem, 'detection'); const expected: IIndexPattern = { - fields: [ - { ...getField('nestedField.child') }, - { ...getField('nestedField.nestedChild.doublyNestedChild') }, - ], + fields: [{ ...getField('nestedField.child'), name: 'child' }], id: '1234', title: 'logstash-*', }; @@ -243,7 +240,7 @@ describe('Exception builder helpers', () => { }; const output = getFilteredIndexPatterns(payloadIndexPattern, payloadItem, 'endpoint'); const expected: IIndexPattern = { - fields: [getEndpointField('file.Ext.code_signature.status')], + fields: [{ ...getEndpointField('file.Ext.code_signature.status'), name: 'status' }], id: '1234', title: 'logstash-*', }; @@ -405,7 +402,7 @@ describe('Exception builder helpers', () => { aggregatable: false, count: 0, esTypes: ['text'], - name: 'nestedField.child', + name: 'child', readFromDocValues: false, scripted: false, searchable: true, @@ -600,7 +597,7 @@ describe('Exception builder helpers', () => { aggregatable: false, count: 0, esTypes: ['text'], - name: 'nestedField.child', + name: 'child', readFromDocValues: false, scripted: false, searchable: true, diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/builder/helpers.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/builder/helpers.tsx index bea1eb8f0e17ba..2fda14dfa04d79 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/builder/helpers.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/builder/helpers.tsx @@ -60,13 +60,20 @@ export const getFilteredIndexPatterns = ( // when user has selected a nested entry, only fields with the common parent are shown return { ...indexPatterns, - fields: indexPatterns.fields.filter( - (field) => - field.subType != null && - field.subType.nested != null && - item.parent != null && - field.subType.nested.path.startsWith(item.parent.parent.field) - ), + fields: indexPatterns.fields + .filter((indexField) => { + const fieldHasCommonParentPath = + indexField.subType != null && + indexField.subType.nested != null && + item.parent != null && + indexField.subType.nested.path === item.parent.parent.field; + + return fieldHasCommonParentPath; + }) + .map((f) => { + const fieldNameWithoutParentPath = f.name.split('.').slice(-1)[0]; + return { ...f, name: fieldNameWithoutParentPath }; + }), }; } else if (item.nested === 'parent' && item.field != null) { // when user has selected a nested entry, right above it we show the common parent @@ -145,7 +152,10 @@ export const getFormattedBuilderEntry = ( if (parent != null && parentIndex != null) { return { - field: foundField, + field: + foundField != null + ? { ...foundField, name: foundField.name.split('.').slice(-1)[0] } + : foundField, correspondingKeywordField, operator: getExceptionOperatorSelect(item), value: getEntryValue(item), diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/index.test.tsx index 84613d1c73536e..4c60f3ba5cccea 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/viewer/index.test.tsx @@ -17,6 +17,7 @@ import { useApi, } from '../../../../../public/lists_plugin_deps'; import { getExceptionListSchemaMock } from '../../../../../../lists/common/schemas/response/exception_list_schema.mock'; +import { getFoundExceptionListItemSchemaMock } from '../../../../../../lists/common/schemas/response/found_exception_list_item_schema.mock'; jest.mock('../../../../common/lib/kibana'); jest.mock('../../../../../public/lists_plugin_deps'); @@ -36,6 +37,7 @@ describe('ExceptionsViewer', () => { (useApi as jest.Mock).mockReturnValue({ deleteExceptionItem: jest.fn().mockResolvedValue(true), + getExceptionListsItems: jest.fn().mockResolvedValue(getFoundExceptionListItemSchemaMock()), }); (useExceptionList as jest.Mock).mockReturnValue([ From cf6413ab2f97493a808ebd16f2a29ed6a5fc75a5 Mon Sep 17 00:00:00 2001 From: Marta Bondyra Date: Wed, 5 Aug 2020 18:25:16 +0200 Subject: [PATCH 15/33] [Lens] fix chart switching when on VisualizationDimensionEditor (#70689) --- .../config_panel/layer_panel.test.tsx | 75 ++++++++++++++++--- .../editor_frame/config_panel/layer_panel.tsx | 37 +++++---- 2 files changed, 82 insertions(+), 30 deletions(-) diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_panel.test.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_panel.test.tsx index 9545bd3c840da3..b100c885466ab7 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_panel.test.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_panel.test.tsx @@ -24,6 +24,7 @@ jest.mock('../../../id_generator'); describe('LayerPanel', () => { let mockVisualization: jest.Mocked; + let mockVisualization2: jest.Mocked; let mockDatasource: DatasourceMock; function getDefaultProps() { @@ -36,6 +37,7 @@ describe('LayerPanel', () => { activeVisualizationId: 'vis1', visualizationMap: { vis1: mockVisualization, + vis2: mockVisualization2, }, activeDatasourceId: 'ds1', datasourceMap: { @@ -72,6 +74,18 @@ describe('LayerPanel', () => { ], }; + mockVisualization2 = { + ...createMockVisualization(), + id: 'testVis2', + visualizationTypes: [ + { + icon: 'empty', + id: 'testVis2', + label: 'TEST2', + }, + ], + }; + mockVisualization.getLayerIds.mockReturnValue(['first']); mockDatasource = createMockDatasource('ds1'); }); @@ -209,16 +223,6 @@ describe('LayerPanel', () => { const panel = mount(group.prop('panel')); expect(panel.find('EuiTabbedContent').prop('tabs')).toHaveLength(2); - act(() => { - panel.find('EuiTab#visualization').simulate('click'); - }); - expect(mockVisualization.renderDimensionEditor).toHaveBeenCalledWith( - expect.any(Element), - expect.objectContaining({ - groupId: 'a', - accessor: 'newid', - }) - ); }); it('should keep the popover open when configuring a new dimension', () => { @@ -267,5 +271,56 @@ describe('LayerPanel', () => { expect(component.find(EuiPopover).prop('isOpen')).toBe(true); }); + it('should close the popover when the active visualization changes', () => { + /** + * The ID generation system for new dimensions has been messy before, so + * this tests that the ID used in the first render is used to keep the popover + * open in future renders + */ + + (generateId as jest.Mock).mockReturnValueOnce(`newid`); + (generateId as jest.Mock).mockReturnValueOnce(`bad`); + mockVisualization.getConfiguration.mockReturnValueOnce({ + groups: [ + { + groupLabel: 'A', + groupId: 'a', + accessors: [], + filterOperations: () => true, + supportsMoreColumns: true, + dataTestSubj: 'lnsGroup', + }, + ], + }); + // Normally the configuration would change in response to a state update, + // but this test is updating it directly + mockVisualization.getConfiguration.mockReturnValueOnce({ + groups: [ + { + groupLabel: 'A', + groupId: 'a', + accessors: ['newid'], + filterOperations: () => true, + supportsMoreColumns: false, + dataTestSubj: 'lnsGroup', + }, + ], + }); + + const component = mountWithIntl(); + + const group = component.find('DimensionPopover'); + const triggerButton = mountWithIntl(group.prop('trigger')); + act(() => { + triggerButton.find('[data-test-subj="lns-empty-dimension"]').first().simulate('click'); + }); + component.update(); + expect(component.find(EuiPopover).prop('isOpen')).toBe(true); + act(() => { + component.setProps({ activeVisualizationId: 'vis2' }); + }); + component.update(); + expect(component.find(EuiPopover).prop('isOpen')).toBe(false); + }); }); }); diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_panel.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_panel.tsx index f72b1429967d25..a384e339e8fbdb 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_panel.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_panel.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { useContext, useState } from 'react'; +import React, { useContext, useState, useEffect } from 'react'; import { EuiPanel, EuiSpacer, @@ -26,6 +26,13 @@ import { generateId } from '../../../id_generator'; import { ConfigPanelWrapperProps, DimensionPopoverState } from './types'; import { DimensionPopover } from './dimension_popover'; +const initialPopoverState = { + isOpen: false, + openId: null, + addingToGroupId: null, + tabId: null, +}; + export function LayerPanel( props: Exclude & { layerId: string; @@ -41,15 +48,15 @@ export function LayerPanel( } ) { const dragDropContext = useContext(DragContext); - const [popoverState, setPopoverState] = useState({ - isOpen: false, - openId: null, - addingToGroupId: null, - tabId: null, - }); + const [popoverState, setPopoverState] = useState(initialPopoverState); const { framePublicAPI, layerId, isOnlyLayer, onRemoveLayer } = props; const datasourcePublicAPI = framePublicAPI.datasourceLayers[layerId]; + + useEffect(() => { + setPopoverState(initialPopoverState); + }, [props.activeVisualizationId]); + if ( !datasourcePublicAPI || !props.activeVisualizationId || @@ -243,12 +250,7 @@ export function LayerPanel( suggestedPriority: group.suggestedPriority, togglePopover: () => { if (popoverState.isOpen) { - setPopoverState({ - isOpen: false, - openId: null, - addingToGroupId: null, - tabId: null, - }); + setPopoverState(initialPopoverState); } else { setPopoverState({ isOpen: true, @@ -264,7 +266,7 @@ export function LayerPanel( panel={ t.id === popoverState.tabId)} + selectedTab={tabs.find((t) => t.id === popoverState.tabId) || tabs[0]} size="s" onTabClick={(tab) => { setPopoverState({ @@ -358,12 +360,7 @@ export function LayerPanel( })} onClick={() => { if (popoverState.isOpen) { - setPopoverState({ - isOpen: false, - openId: null, - addingToGroupId: null, - tabId: null, - }); + setPopoverState(initialPopoverState); } else { setPopoverState({ isOpen: true, From 5c770e5930f3302ded04a62d4f3f0125bb4ce7fb Mon Sep 17 00:00:00 2001 From: Gidi Meir Morris Date: Wed, 5 Aug 2020 17:35:38 +0100 Subject: [PATCH 16/33] [Task Manager] Correctly handle `running` tasks when calling RunNow and reduce flakiness in related tests (#73244) This PR addresses two issues which caused several tests to be flaky in TM. When `runNow` was introduced to TM we added a pinned query which returned specific tasks by ID. This query does not have the filter applied to it which causes task to return when they're already marked as `running` but we didn't address these correctly which caused flakyness in the tests. This didn't cause a broken beahviour, but it did cause beahviour that was hard to reason about - we now address them correctly. It seems that sometimes, especially if the ES queue is overworked, it can take some time for the update to the underlying task to be visible (we don't user `refresh:true` on purpose), so adding a wait for the index to refresh to make sure the task is updated in time for the next stage of the test. --- x-pack/plugins/alerts/server/alerts_client.ts | 17 ++- .../task_manager/server/task_events.ts | 6 +- .../task_manager/server/task_manager.test.ts | 31 ++-- .../task_manager/server/task_manager.ts | 104 +++++++------ .../task_manager/server/task_store.test.ts | 142 +++++++++++++++--- .../plugins/task_manager/server/task_store.ts | 37 ++++- .../task_manager_fixture/server/plugin.ts | 20 ++- .../sample_task_plugin/server/init_routes.ts | 15 ++ .../task_manager/task_manager_integration.js | 34 ++++- 9 files changed, 316 insertions(+), 90 deletions(-) diff --git a/x-pack/plugins/alerts/server/alerts_client.ts b/x-pack/plugins/alerts/server/alerts_client.ts index 256cae24e519f3..dd66ccc7a0256d 100644 --- a/x-pack/plugins/alerts/server/alerts_client.ts +++ b/x-pack/plugins/alerts/server/alerts_client.ts @@ -387,11 +387,18 @@ export class AlertsClient { updateResult.scheduledTaskId && !isEqual(alertSavedObject.attributes.schedule, updateResult.schedule) ) { - this.taskManager.runNow(updateResult.scheduledTaskId).catch((err: Error) => { - this.logger.error( - `Alert update failed to run its underlying task. TaskManager runNow failed with Error: ${err.message}` - ); - }); + this.taskManager + .runNow(updateResult.scheduledTaskId) + .then(() => { + this.logger.debug( + `Alert update has rescheduled the underlying task: ${updateResult.scheduledTaskId}` + ); + }) + .catch((err: Error) => { + this.logger.error( + `Alert update failed to run its underlying task. TaskManager runNow failed with Error: ${err.message}` + ); + }); } })(), ]); diff --git a/x-pack/plugins/task_manager/server/task_events.ts b/x-pack/plugins/task_manager/server/task_events.ts index b17a3636c17300..e1dd85f868cdd2 100644 --- a/x-pack/plugins/task_manager/server/task_events.ts +++ b/x-pack/plugins/task_manager/server/task_events.ts @@ -4,6 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ +import { Option } from 'fp-ts/lib/Option'; + import { ConcreteTaskInstance } from './task'; import { Result, Err } from './lib/result_type'; @@ -22,7 +24,7 @@ export interface TaskEvent { } export type TaskMarkRunning = TaskEvent; export type TaskRun = TaskEvent; -export type TaskClaim = TaskEvent; +export type TaskClaim = TaskEvent>; export type TaskRunRequest = TaskEvent; export function asTaskMarkRunningEvent( @@ -46,7 +48,7 @@ export function asTaskRunEvent(id: string, event: Result + event: Result> ): TaskClaim { return { id, diff --git a/x-pack/plugins/task_manager/server/task_manager.test.ts b/x-pack/plugins/task_manager/server/task_manager.test.ts index 80215ffa7abbad..7035971ad60610 100644 --- a/x-pack/plugins/task_manager/server/task_manager.test.ts +++ b/x-pack/plugins/task_manager/server/task_manager.test.ts @@ -7,6 +7,7 @@ import _ from 'lodash'; import sinon from 'sinon'; import { Subject } from 'rxjs'; +import { none } from 'fp-ts/lib/Option'; import { asTaskMarkRunningEvent, @@ -297,7 +298,9 @@ describe('TaskManager', () => { events$.next(asTaskMarkRunningEvent(id, asOk(task))); events$.next(asTaskRunEvent(id, asErr(new Error('some thing gone wrong')))); - return expect(result).rejects.toEqual(new Error('some thing gone wrong')); + return expect(result).rejects.toMatchInlineSnapshot( + `[Error: Failed to run task "01ddff11-e88a-4d13-bc4e-256164e755e2": Error: some thing gone wrong]` + ); }); test('rejects when the task mark as running fails', () => { @@ -311,7 +314,9 @@ describe('TaskManager', () => { events$.next(asTaskClaimEvent(id, asOk(task))); events$.next(asTaskMarkRunningEvent(id, asErr(new Error('some thing gone wrong')))); - return expect(result).rejects.toEqual(new Error('some thing gone wrong')); + return expect(result).rejects.toMatchInlineSnapshot( + `[Error: Failed to run task "01ddff11-e88a-4d13-bc4e-256164e755e2": Error: some thing gone wrong]` + ); }); test('when a task claim fails we ensure the task exists', async () => { @@ -321,7 +326,7 @@ describe('TaskManager', () => { const result = awaitTaskRunResult(id, events$, getLifecycle); - events$.next(asTaskClaimEvent(id, asErr(new Error('failed to claim')))); + events$.next(asTaskClaimEvent(id, asErr(none))); await expect(result).rejects.toEqual( new Error(`Failed to run task "${id}" as it does not exist`) @@ -337,7 +342,7 @@ describe('TaskManager', () => { const result = awaitTaskRunResult(id, events$, getLifecycle); - events$.next(asTaskClaimEvent(id, asErr(new Error('failed to claim')))); + events$.next(asTaskClaimEvent(id, asErr(none))); await expect(result).rejects.toEqual( new Error(`Failed to run task "${id}" as it is currently running`) @@ -353,7 +358,7 @@ describe('TaskManager', () => { const result = awaitTaskRunResult(id, events$, getLifecycle); - events$.next(asTaskClaimEvent(id, asErr(new Error('failed to claim')))); + events$.next(asTaskClaimEvent(id, asErr(none))); await expect(result).rejects.toEqual( new Error(`Failed to run task "${id}" as it is currently running`) @@ -386,9 +391,11 @@ describe('TaskManager', () => { const result = awaitTaskRunResult(id, events$, getLifecycle); - events$.next(asTaskClaimEvent(id, asErr(new Error('failed to claim')))); + events$.next(asTaskClaimEvent(id, asErr(none))); - await expect(result).rejects.toEqual(new Error('failed to claim')); + await expect(result).rejects.toMatchInlineSnapshot( + `[Error: Failed to run task "01ddff11-e88a-4d13-bc4e-256164e755e2" for unknown reason (Current Task Lifecycle is "idle")]` + ); expect(getLifecycle).toHaveBeenCalledWith(id); }); @@ -400,9 +407,11 @@ describe('TaskManager', () => { const result = awaitTaskRunResult(id, events$, getLifecycle); - events$.next(asTaskClaimEvent(id, asErr(new Error('failed to claim')))); + events$.next(asTaskClaimEvent(id, asErr(none))); - await expect(result).rejects.toEqual(new Error('failed to claim')); + await expect(result).rejects.toMatchInlineSnapshot( + `[Error: Failed to run task "01ddff11-e88a-4d13-bc4e-256164e755e2" for unknown reason (Current Task Lifecycle is "failed")]` + ); expect(getLifecycle).toHaveBeenCalledWith(id); }); @@ -424,7 +433,9 @@ describe('TaskManager', () => { events$.next(asTaskRunEvent(id, asErr(new Error('some thing gone wrong')))); - return expect(result).rejects.toEqual(new Error('some thing gone wrong')); + return expect(result).rejects.toMatchInlineSnapshot( + `[Error: Failed to run task "01ddff11-e88a-4d13-bc4e-256164e755e2": Error: some thing gone wrong]` + ); }); }); }); diff --git a/x-pack/plugins/task_manager/server/task_manager.ts b/x-pack/plugins/task_manager/server/task_manager.ts index 35ca439bb91305..7165fd28678c16 100644 --- a/x-pack/plugins/task_manager/server/task_manager.ts +++ b/x-pack/plugins/task_manager/server/task_manager.ts @@ -9,13 +9,14 @@ import { filter } from 'rxjs/operators'; import { performance } from 'perf_hooks'; import { pipe } from 'fp-ts/lib/pipeable'; -import { Option, some, map as mapOptional } from 'fp-ts/lib/Option'; +import { Option, some, map as mapOptional, getOrElse } from 'fp-ts/lib/Option'; + import { SavedObjectsSerializer, ILegacyScopedClusterClient, ISavedObjectsRepository, } from '../../../../src/core/server'; -import { Result, asErr, either, map, mapErr, promiseResult } from './lib/result_type'; +import { Result, asOk, asErr, either, map, mapErr, promiseResult } from './lib/result_type'; import { TaskManagerConfig } from './config'; import { Logger } from './types'; @@ -405,7 +406,9 @@ export async function claimAvailableTasks( if (docs.length !== claimedTasks) { logger.warn( - `[Task Ownership error]: (${claimedTasks}) tasks were claimed by Kibana, but (${docs.length}) tasks were fetched` + `[Task Ownership error]: ${claimedTasks} tasks were claimed by Kibana, but ${ + docs.length + } task(s) were fetched (${docs.map((doc) => doc.id).join(', ')})` ); } return docs; @@ -437,48 +440,65 @@ export async function awaitTaskRunResult( // listen for all events related to the current task .pipe(filter(({ id }: TaskLifecycleEvent) => id === taskId)) .subscribe((taskEvent: TaskLifecycleEvent) => { - either( - taskEvent.event, - (taskInstance: ConcreteTaskInstance) => { - // resolve if the task has run sucessfully - if (isTaskRunEvent(taskEvent)) { - subscription.unsubscribe(); - resolve({ id: taskInstance.id }); - } - }, - async (error: Error) => { + if (isTaskClaimEvent(taskEvent)) { + mapErr(async (error: Option) => { // reject if any error event takes place for the requested task subscription.unsubscribe(); - if (isTaskRunRequestEvent(taskEvent)) { - return reject( - new Error( - `Failed to run task "${taskId}" as Task Manager is at capacity, please try again later` - ) - ); - } else if (isTaskClaimEvent(taskEvent)) { - reject( - map( - // if the error happened in the Claim phase - we try to provide better insight - // into why we failed to claim by getting the task's current lifecycle status - await promiseResult(getLifecycle(taskId)), - (taskLifecycleStatus: TaskLifecycle) => { - if (taskLifecycleStatus === TaskLifecycleResult.NotFound) { - return new Error(`Failed to run task "${taskId}" as it does not exist`); - } else if ( - taskLifecycleStatus === TaskStatus.Running || - taskLifecycleStatus === TaskStatus.Claiming - ) { - return new Error(`Failed to run task "${taskId}" as it is currently running`); - } - return error; - }, - () => error - ) - ); + return reject( + map( + await pipe( + error, + mapOptional(async (taskReturnedBySweep) => asOk(taskReturnedBySweep.status)), + getOrElse(() => + // if the error happened in the Claim phase - we try to provide better insight + // into why we failed to claim by getting the task's current lifecycle status + promiseResult(getLifecycle(taskId)) + ) + ), + (taskLifecycleStatus: TaskLifecycle) => { + if (taskLifecycleStatus === TaskLifecycleResult.NotFound) { + return new Error(`Failed to run task "${taskId}" as it does not exist`); + } else if ( + taskLifecycleStatus === TaskStatus.Running || + taskLifecycleStatus === TaskStatus.Claiming + ) { + return new Error(`Failed to run task "${taskId}" as it is currently running`); + } + return new Error( + `Failed to run task "${taskId}" for unknown reason (Current Task Lifecycle is "${taskLifecycleStatus}")` + ); + }, + (getLifecycleError: Error) => + new Error( + `Failed to run task "${taskId}" and failed to get current Status:${getLifecycleError}` + ) + ) + ); + }, taskEvent.event); + } else { + either>( + taskEvent.event, + (taskInstance: ConcreteTaskInstance) => { + // resolve if the task has run sucessfully + if (isTaskRunEvent(taskEvent)) { + subscription.unsubscribe(); + resolve({ id: taskInstance.id }); + } + }, + async (error: Error | Option) => { + // reject if any error event takes place for the requested task + subscription.unsubscribe(); + if (isTaskRunRequestEvent(taskEvent)) { + return reject( + new Error( + `Failed to run task "${taskId}" as Task Manager is at capacity, please try again later` + ) + ); + } + return reject(new Error(`Failed to run task "${taskId}": ${error}`)); } - return reject(error); - } - ); + ); + } }); }); } diff --git a/x-pack/plugins/task_manager/server/task_store.test.ts b/x-pack/plugins/task_manager/server/task_store.test.ts index 771b4e2d7d9cb6..d65c39f4f454d6 100644 --- a/x-pack/plugins/task_manager/server/task_store.test.ts +++ b/x-pack/plugins/task_manager/server/task_store.test.ts @@ -8,6 +8,7 @@ import _ from 'lodash'; import sinon from 'sinon'; import uuid from 'uuid'; import { filter } from 'rxjs/operators'; +import { Option, some, none } from 'fp-ts/lib/Option'; import { TaskDictionary, @@ -972,7 +973,7 @@ if (doc['task.runAt'].size()!=0) { const runAt = new Date(); const tasks = [ { - _id: 'aaa', + _id: 'claimed-by-id', _source: { type: 'task', task: { @@ -980,7 +981,7 @@ if (doc['task.runAt'].size()!=0) { taskType: 'foo', schedule: undefined, attempts: 0, - status: 'idle', + status: 'claiming', params: '{ "hello": "world" }', state: '{ "baby": "Henhen" }', user: 'jimbo', @@ -996,7 +997,31 @@ if (doc['task.runAt'].size()!=0) { sort: ['a', 1], }, { - _id: 'bbb', + _id: 'claimed-by-schedule', + _source: { + type: 'task', + task: { + runAt, + taskType: 'bar', + schedule: { interval: '5m' }, + attempts: 2, + status: 'claiming', + params: '{ "shazm": 1 }', + state: '{ "henry": "The 8th" }', + user: 'dabo', + scope: ['reporting', 'ceo'], + ownerId: taskManagerId, + startedAt: null, + retryAt: null, + scheduledAt: new Date(), + }, + }, + _seq_no: 3, + _primary_term: 4, + sort: ['b', 2], + }, + { + _id: 'already-running', _source: { type: 'task', task: { @@ -1045,19 +1070,24 @@ if (doc['task.runAt'].size()!=0) { }); const sub = store.events - .pipe(filter((event: TaskEvent) => event.id === 'aaa')) + .pipe( + filter( + (event: TaskEvent>) => + event.id === 'claimed-by-id' + ) + ) .subscribe({ - next: (event: TaskEvent) => { + next: (event: TaskEvent>) => { expect(event).toMatchObject( asTaskClaimEvent( - 'aaa', + 'claimed-by-id', asOk({ - id: 'aaa', + id: 'claimed-by-id', runAt, taskType: 'foo', schedule: undefined, attempts: 0, - status: 'idle' as TaskStatus, + status: 'claiming' as TaskStatus, params: { hello: 'world' }, state: { baby: 'Henhen' }, user: 'jimbo', @@ -1075,7 +1105,7 @@ if (doc['task.runAt'].size()!=0) { }); await store.claimAvailableTasks({ - claimTasksById: ['aaa'], + claimTasksById: ['claimed-by-id'], claimOwnershipUntil: new Date(), size: 10, }); @@ -1102,19 +1132,24 @@ if (doc['task.runAt'].size()!=0) { }); const sub = store.events - .pipe(filter((event: TaskEvent) => event.id === 'bbb')) + .pipe( + filter( + (event: TaskEvent>) => + event.id === 'claimed-by-schedule' + ) + ) .subscribe({ - next: (event: TaskEvent) => { + next: (event: TaskEvent>) => { expect(event).toMatchObject( asTaskClaimEvent( - 'bbb', + 'claimed-by-schedule', asOk({ - id: 'bbb', + id: 'claimed-by-schedule', runAt, taskType: 'bar', schedule: { interval: '5m' }, attempts: 2, - status: 'running' as TaskStatus, + status: 'claiming' as TaskStatus, params: { shazm: 1 }, state: { henry: 'The 8th' }, user: 'dabo', @@ -1132,14 +1167,14 @@ if (doc['task.runAt'].size()!=0) { }); await store.claimAvailableTasks({ - claimTasksById: ['aaa'], + claimTasksById: ['claimed-by-id'], claimOwnershipUntil: new Date(), size: 10, }); }); test('emits an event when the store fails to claim a required task by id', async (done) => { - const { taskManagerId, tasks } = generateTasks(); + const { taskManagerId, runAt, tasks } = generateTasks(); const callCluster = sinon.spy(async (name: string, params?: unknown) => name === 'updateByQuery' ? { @@ -1159,11 +1194,36 @@ if (doc['task.runAt'].size()!=0) { }); const sub = store.events - .pipe(filter((event: TaskEvent) => event.id === 'ccc')) + .pipe( + filter( + (event: TaskEvent>) => + event.id === 'already-running' + ) + ) .subscribe({ - next: (event: TaskEvent) => { + next: (event: TaskEvent>) => { expect(event).toMatchObject( - asTaskClaimEvent('ccc', asErr(new Error(`failed to claim task 'ccc'`))) + asTaskClaimEvent( + 'already-running', + asErr( + some({ + id: 'already-running', + runAt, + taskType: 'bar', + schedule: { interval: '5m' }, + attempts: 2, + status: 'running' as TaskStatus, + params: { shazm: 1 }, + state: { henry: 'The 8th' }, + user: 'dabo', + scope: ['reporting', 'ceo'], + ownerId: taskManagerId, + startedAt: null, + retryAt: null, + scheduledAt: new Date(), + }) + ) + ) ); sub.unsubscribe(); done(); @@ -1171,7 +1231,49 @@ if (doc['task.runAt'].size()!=0) { }); await store.claimAvailableTasks({ - claimTasksById: ['ccc'], + claimTasksById: ['already-running'], + claimOwnershipUntil: new Date(), + size: 10, + }); + }); + + test('emits an event when the store fails to find a task which was required by id', async (done) => { + const { taskManagerId, tasks } = generateTasks(); + const callCluster = sinon.spy(async (name: string, params?: unknown) => + name === 'updateByQuery' + ? { + total: tasks.length, + updated: tasks.length, + } + : { hits: { hits: tasks } } + ); + const store = new TaskStore({ + callCluster, + maxAttempts: 2, + definitions: taskDefinitions, + serializer, + savedObjectsRepository: savedObjectsClient, + taskManagerId, + index: '', + }); + + const sub = store.events + .pipe( + filter( + (event: TaskEvent>) => + event.id === 'unknown-task' + ) + ) + .subscribe({ + next: (event: TaskEvent>) => { + expect(event).toMatchObject(asTaskClaimEvent('unknown-task', asErr(none))); + sub.unsubscribe(); + done(); + }, + }); + + await store.claimAvailableTasks({ + claimTasksById: ['unknown-task'], claimOwnershipUntil: new Date(), size: 10, }); diff --git a/x-pack/plugins/task_manager/server/task_store.ts b/x-pack/plugins/task_manager/server/task_store.ts index cac37db72202d5..a18fb57b35b3d7 100644 --- a/x-pack/plugins/task_manager/server/task_store.ts +++ b/x-pack/plugins/task_manager/server/task_store.ts @@ -9,7 +9,9 @@ */ import apm from 'elastic-apm-node'; import { Subject, Observable } from 'rxjs'; -import { omit, difference, defaults } from 'lodash'; +import { omit, difference, partition, map, defaults } from 'lodash'; + +import { some, none } from 'fp-ts/lib/Option'; import { SearchResponse, UpdateDocumentByQueryResponse } from 'elasticsearch'; import { @@ -31,6 +33,7 @@ import { TaskLifecycle, TaskLifecycleResult, SerializedConcreteTaskInstance, + TaskStatus, } from './task'; import { TaskClaim, asTaskClaimEvent } from './task_events'; @@ -221,13 +224,35 @@ export class TaskStore { // emit success/fail events for claimed tasks by id if (claimTasksById && claimTasksById.length) { - this.emitEvents(docs.map((doc) => asTaskClaimEvent(doc.id, asOk(doc)))); + const [documentsReturnedById, documentsClaimedBySchedule] = partition(docs, (doc) => + claimTasksById.includes(doc.id) + ); + + const [documentsClaimedById, documentsRequestedButNotClaimed] = partition( + documentsReturnedById, + // we filter the schduled tasks down by status is 'claiming' in the esearch, + // but we do not apply this limitation on tasks claimed by ID so that we can + // provide more detailed error messages when we fail to claim them + (doc) => doc.status === TaskStatus.Claiming + ); + + const documentsRequestedButNotReturned = difference( + claimTasksById, + map(documentsReturnedById, 'id') + ); + + this.emitEvents( + [...documentsClaimedById, ...documentsClaimedBySchedule].map((doc) => + asTaskClaimEvent(doc.id, asOk(doc)) + ) + ); + + this.emitEvents( + documentsRequestedButNotClaimed.map((doc) => asTaskClaimEvent(doc.id, asErr(some(doc)))) + ); this.emitEvents( - difference( - claimTasksById, - docs.map((doc) => doc.id) - ).map((id) => asTaskClaimEvent(id, asErr(new Error(`failed to claim task '${id}'`)))) + documentsRequestedButNotReturned.map((id) => asTaskClaimEvent(id, asErr(none))) ); } diff --git a/x-pack/test/alerting_api_integration/common/fixtures/plugins/task_manager_fixture/server/plugin.ts b/x-pack/test/alerting_api_integration/common/fixtures/plugins/task_manager_fixture/server/plugin.ts index 18fdd5f9c3ac37..0833dd0425894f 100644 --- a/x-pack/test/alerting_api_integration/common/fixtures/plugins/task_manager_fixture/server/plugin.ts +++ b/x-pack/test/alerting_api_integration/common/fixtures/plugins/task_manager_fixture/server/plugin.ts @@ -51,7 +51,8 @@ export class SampleTaskManagerFixturePlugin .toPromise(); public setup(core: CoreSetup) { - core.http.createRouter().get( + const router = core.http.createRouter(); + router.get( { path: '/api/alerting_tasks/{taskId}', validate: { @@ -77,6 +78,23 @@ export class SampleTaskManagerFixturePlugin } } ); + + router.get( + { + path: `/api/ensure_tasks_index_refreshed`, + validate: {}, + }, + async function ( + context: RequestHandlerContext, + req: KibanaRequest, + res: KibanaResponseFactory + ): Promise> { + await core.elasticsearch.legacy.client.callAsInternalUser('indices.refresh', { + index: '.kibana_task_manager', + }); + return res.ok({ body: {} }); + } + ); } public start(core: CoreStart, { taskManager }: SampleTaskManagerFixtureStartDeps) { diff --git a/x-pack/test/plugin_api_integration/plugins/sample_task_plugin/server/init_routes.ts b/x-pack/test/plugin_api_integration/plugins/sample_task_plugin/server/init_routes.ts index f35d6baac8f5ae..266e66b5a1a452 100644 --- a/x-pack/test/plugin_api_integration/plugins/sample_task_plugin/server/init_routes.ts +++ b/x-pack/test/plugin_api_integration/plugins/sample_task_plugin/server/init_routes.ts @@ -223,6 +223,21 @@ export function initRoutes( } ); + router.get( + { + path: `/api/ensure_tasks_index_refreshed`, + validate: {}, + }, + async function ( + context: RequestHandlerContext, + req: KibanaRequest, + res: KibanaResponseFactory + ): Promise> { + await ensureIndexIsRefreshed(); + return res.ok({ body: {} }); + } + ); + router.delete( { path: `/api/sample_tasks`, diff --git a/x-pack/test/plugin_api_integration/test_suites/task_manager/task_manager_integration.js b/x-pack/test/plugin_api_integration/test_suites/task_manager/task_manager_integration.js index 165e79fb311ead..c87a5039360b8f 100644 --- a/x-pack/test/plugin_api_integration/test_suites/task_manager/task_manager_integration.js +++ b/x-pack/test/plugin_api_integration/test_suites/task_manager/task_manager_integration.js @@ -28,8 +28,7 @@ export default function ({ getService }) { const testHistoryIndex = '.kibana_task_manager_test_result'; const supertest = supertestAsPromised(url.format(config.get('servers.kibana'))); - // FLAKY: https://github.com/elastic/kibana/issues/71390 - describe.skip('scheduling and running tasks', () => { + describe('scheduling and running tasks', () => { beforeEach( async () => await supertest.delete('/api/sample_tasks').set('kbn-xsrf', 'xxx').expect(200) ); @@ -69,6 +68,14 @@ export default function ({ getService }) { .then((response) => response.body); } + function ensureTasksIndexRefreshed() { + return supertest + .get(`/api/ensure_tasks_index_refreshed`) + .send({}) + .expect(200) + .then((response) => response.body); + } + function historyDocs(taskId) { return es .search({ @@ -404,7 +411,7 @@ export default function ({ getService }) { const originalTask = await scheduleTask({ taskType: 'sampleTask', schedule: { interval: `30m` }, - params: { failWith: 'error on run now', failOn: 3 }, + params: { failWith: 'this task was meant to fail!', failOn: 3 }, }); await retry.try(async () => { @@ -415,11 +422,14 @@ export default function ({ getService }) { const task = await currentTask(originalTask.id); expect(task.state.count).to.eql(1); + expect(task.status).to.eql('idle'); // ensure this task shouldnt run for another half hour expectReschedule(Date.parse(originalTask.runAt), task, 30 * 60000); }); + await ensureTasksIndexRefreshed(); + // second run should still be successful const successfulRunNowResult = await runTaskNow({ id: originalTask.id, @@ -429,14 +439,20 @@ export default function ({ getService }) { await retry.try(async () => { const task = await currentTask(originalTask.id); expect(task.state.count).to.eql(2); + expect(task.status).to.eql('idle'); }); + await ensureTasksIndexRefreshed(); + // third run should fail const failedRunNowResult = await runTaskNow({ id: originalTask.id, }); - expect(failedRunNowResult).to.eql({ id: originalTask.id, error: `Error: error on run now` }); + expect(failedRunNowResult).to.eql({ + id: originalTask.id, + error: `Error: Failed to run task \"${originalTask.id}\": Error: this task was meant to fail!`, + }); await retry.try(async () => { expect( @@ -479,8 +495,13 @@ export default function ({ getService }) { expect( docs.filter((taskDoc) => taskDoc._source.taskId === longRunningTask.id).length ).to.eql(1); + + const task = await currentTask(longRunningTask.id); + expect(task.status).to.eql('running'); }); + await ensureTasksIndexRefreshed(); + // first runNow should fail const failedRunNowResult = await runTaskNow({ id: longRunningTask.id, @@ -496,8 +517,13 @@ export default function ({ getService }) { await retry.try(async () => { const tasks = (await currentTasks()).docs; expect(getTaskById(tasks, longRunningTask.id).state.count).to.eql(1); + + const task = await currentTask(longRunningTask.id); + expect(task.status).to.eql('idle'); }); + await ensureTasksIndexRefreshed(); + // second runNow should be successful const successfulRunNowResult = runTaskNow({ id: longRunningTask.id, From 4150a234c8f4517725b79ead280285b49890e17c Mon Sep 17 00:00:00 2001 From: Melissa Alvarez Date: Wed, 5 Aug 2020 12:43:58 -0400 Subject: [PATCH 17/33] update empty prompt in analytics list (#74174) --- .../components/analytics_list/analytics_list.tsx | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/analytics_list.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/analytics_list.tsx index 7b5c714c236b39..90e24f6da5d0a1 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/analytics_list.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/analytics_list/analytics_list.tsx @@ -10,7 +10,7 @@ import { i18n } from '@kbn/i18n'; import { Direction, - EuiButtonEmpty, + EuiButton, EuiCallOut, EuiEmptyPrompt, EuiFlexGroup, @@ -147,25 +147,29 @@ export const DataFrameAnalyticsList: FC = ({ return ( <> {i18n.translate('xpack.ml.dataFrame.analyticsList.emptyPromptTitle', { - defaultMessage: 'No data frame analytics jobs found', + defaultMessage: 'Create your first data frame analytics job', })} } actions={ !isManagementTable ? [ - setIsSourceIndexModalVisible(true)} isDisabled={disabled} + color="primary" + iconType="plusInCircle" + fill data-test-subj="mlAnalyticsCreateFirstButton" > {i18n.translate('xpack.ml.dataFrame.analyticsList.emptyPromptButtonText', { - defaultMessage: 'Create your first data frame analytics job', + defaultMessage: 'Create job', })} - , + , ] : [] } From 47b9aba3bf0ce6a5a867fa144701ad1841020f7c Mon Sep 17 00:00:00 2001 From: Constance Date: Wed, 5 Aug 2020 10:12:25 -0700 Subject: [PATCH 18/33] [Enterprise Search] Fix/DRY out plugin i18n strings (#74323) * i18n refactor - DRY out plugin details to constants and correctly i18n-ize front-end-facing strings * DRY out new i18n constants - refactor instances of i18n.translate to use new constants * Fix non-i18n'd breadcrumb strings * PR feedback: swap out more plugin ID strings for constants --- .../enterprise_search/common/constants.ts | 34 +++++++++++++++++++ .../components/setup_guide/setup_guide.tsx | 11 +++--- .../generate_breadcrumbs.ts | 18 ++++++++-- .../components/error_state/error_state.tsx | 8 ++--- .../components/setup_guide/setup_guide.tsx | 12 ++++--- .../enterprise_search/public/plugin.ts | 31 ++++++++--------- .../enterprise_search/server/plugin.ts | 15 +++++--- 7 files changed, 90 insertions(+), 39 deletions(-) diff --git a/x-pack/plugins/enterprise_search/common/constants.ts b/x-pack/plugins/enterprise_search/common/constants.ts index fc9a47717871b2..c5839df4c603b3 100644 --- a/x-pack/plugins/enterprise_search/common/constants.ts +++ b/x-pack/plugins/enterprise_search/common/constants.ts @@ -4,6 +4,40 @@ * you may not use this file except in compliance with the Elastic License. */ +import { i18n } from '@kbn/i18n'; + +export const ENTERPRISE_SEARCH_PLUGIN = { + ID: 'enterpriseSearch', + NAME: i18n.translate('xpack.enterpriseSearch.productName', { + defaultMessage: 'Enterprise Search', + }), + URL: '/app/enterprise_search', +}; + +export const APP_SEARCH_PLUGIN = { + ID: 'appSearch', + NAME: i18n.translate('xpack.enterpriseSearch.appSearch.productName', { + defaultMessage: 'App Search', + }), + DESCRIPTION: i18n.translate('xpack.enterpriseSearch.appSearch.productDescription', { + defaultMessage: + 'Leverage dashboards, analytics, and APIs for advanced application search made simple.', + }), + URL: '/app/enterprise_search/app_search', +}; + +export const WORKPLACE_SEARCH_PLUGIN = { + ID: 'workplaceSearch', + NAME: i18n.translate('xpack.enterpriseSearch.workplaceSearch.productName', { + defaultMessage: 'Workplace Search', + }), + DESCRIPTION: i18n.translate('xpack.enterpriseSearch.workplaceSearch.productDescription', { + defaultMessage: + 'Search all documents, files, and sources available across your virtual workplace.', + }), + URL: '/app/enterprise_search/workplace_search', +}; + export const JSON_HEADER = { 'Content-Type': 'application/json' }; // This needs specific casing or Chrome throws a 415 error export const ENGINES_PAGE_SIZE = 10; diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/setup_guide/setup_guide.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/setup_guide/setup_guide.tsx index df278bf938a690..f899423319afc9 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/setup_guide/setup_guide.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/setup_guide/setup_guide.tsx @@ -9,6 +9,7 @@ import { EuiSpacer, EuiTitle, EuiText } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; +import { APP_SEARCH_PLUGIN } from '../../../../../common/constants'; import { SetupGuide as SetupGuideLayout } from '../../../shared/setup_guide'; import { SetAppSearchBreadcrumbs as SetBreadcrumbs } from '../../../shared/kibana_breadcrumbs'; import { SendAppSearchTelemetry as SendTelemetry } from '../../../shared/telemetry'; @@ -16,14 +17,16 @@ import GettingStarted from '../../assets/getting_started.png'; export const SetupGuide: React.FC = () => ( - + ( breadcrumbs: TBreadcrumbs = [] ) => [ - generateBreadcrumb({ text: 'Enterprise Search' }), + generateBreadcrumb({ text: ENTERPRISE_SEARCH_PLUGIN.NAME }), ...breadcrumbs.map(({ text, path }: IGenerateBreadcrumbProps) => generateBreadcrumb({ text, path, history }) ), ]; export const appSearchBreadcrumbs = (history: History) => (breadcrumbs: TBreadcrumbs = []) => - enterpriseSearchBreadcrumbs(history)([{ text: 'App Search', path: '/' }, ...breadcrumbs]); + enterpriseSearchBreadcrumbs(history)([ + { text: APP_SEARCH_PLUGIN.NAME, path: '/' }, + ...breadcrumbs, + ]); export const workplaceSearchBreadcrumbs = (history: History) => (breadcrumbs: TBreadcrumbs = []) => - enterpriseSearchBreadcrumbs(history)([{ text: 'Workplace Search', path: '/' }, ...breadcrumbs]); + enterpriseSearchBreadcrumbs(history)([ + { text: WORKPLACE_SEARCH_PLUGIN.NAME, path: '/' }, + ...breadcrumbs, + ]); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/error_state/error_state.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/error_state/error_state.tsx index 9fa508d599425e..a1bc17e05dc056 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/error_state/error_state.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/error_state/error_state.tsx @@ -6,8 +6,8 @@ import React from 'react'; import { EuiPage, EuiPageBody, EuiPageContent } from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; +import { WORKPLACE_SEARCH_PLUGIN } from '../../../../../common/constants'; import { ErrorStatePrompt } from '../../../shared/error_state'; import { SetWorkplaceSearchBreadcrumbs as SetBreadcrumbs } from '../../../shared/kibana_breadcrumbs'; import { SendWorkplaceSearchTelemetry as SendTelemetry } from '../../../shared/telemetry'; @@ -20,11 +20,7 @@ export const ErrorState: React.FC = () => { - + diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/setup_guide/setup_guide.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/setup_guide/setup_guide.tsx index 5b5d067d23eb8f..e96d114c67c5d5 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/setup_guide/setup_guide.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/components/setup_guide/setup_guide.tsx @@ -9,8 +9,8 @@ import { EuiSpacer, EuiTitle, EuiText, EuiButton } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; +import { WORKPLACE_SEARCH_PLUGIN } from '../../../../../common/constants'; import { SetupGuide as SetupGuideLayout } from '../../../shared/setup_guide'; - import { SetWorkplaceSearchBreadcrumbs as SetBreadcrumbs } from '../../../shared/kibana_breadcrumbs'; import { SendWorkplaceSearchTelemetry as SendTelemetry } from '../../../shared/telemetry'; import GettingStarted from '../../assets/getting_started.png'; @@ -21,14 +21,16 @@ const GETTING_STARTED_LINK_URL = export const SetupGuide: React.FC = () => { return ( - + diff --git a/x-pack/plugins/enterprise_search/public/plugin.ts b/x-pack/plugins/enterprise_search/public/plugin.ts index fc95828a3f4a4f..66d2ae82fe3ce6 100644 --- a/x-pack/plugins/enterprise_search/public/plugin.ts +++ b/x-pack/plugins/enterprise_search/public/plugin.ts @@ -20,6 +20,7 @@ import { import { DEFAULT_APP_CATEGORIES } from '../../../../src/core/public'; import { LicensingPluginSetup } from '../../licensing/public'; +import { APP_SEARCH_PLUGIN, WORKPLACE_SEARCH_PLUGIN } from '../common/constants'; import { getPublicUrl } from './applications/shared/enterprise_search_url'; import AppSearchLogo from './applications/app_search/assets/logo.svg'; import WorkplaceSearchLogo from './applications/workplace_search/assets/logo.svg'; @@ -44,9 +45,9 @@ export class EnterpriseSearchPlugin implements Plugin { const config = { host: this.config.host }; core.application.register({ - id: 'appSearch', - title: 'App Search', - appRoute: '/app/enterprise_search/app_search', + id: APP_SEARCH_PLUGIN.ID, + title: APP_SEARCH_PLUGIN.NAME, + appRoute: APP_SEARCH_PLUGIN.URL, category: DEFAULT_APP_CATEGORIES.enterpriseSearch, mount: async (params: AppMountParameters) => { const [coreStart] = await core.getStartServices(); @@ -61,9 +62,9 @@ export class EnterpriseSearchPlugin implements Plugin { }); core.application.register({ - id: 'workplaceSearch', - title: 'Workplace Search', - appRoute: '/app/enterprise_search/workplace_search', + id: WORKPLACE_SEARCH_PLUGIN.ID, + title: WORKPLACE_SEARCH_PLUGIN.NAME, + appRoute: WORKPLACE_SEARCH_PLUGIN.URL, category: DEFAULT_APP_CATEGORIES.enterpriseSearch, mount: async (params: AppMountParameters) => { const [coreStart] = await core.getStartServices(); @@ -76,23 +77,21 @@ export class EnterpriseSearchPlugin implements Plugin { }); plugins.home.featureCatalogue.register({ - id: 'appSearch', - title: 'App Search', + id: APP_SEARCH_PLUGIN.ID, + title: APP_SEARCH_PLUGIN.NAME, icon: AppSearchLogo, - description: - 'Leverage dashboards, analytics, and APIs for advanced application search made simple.', - path: '/app/enterprise_search/app_search', + description: APP_SEARCH_PLUGIN.DESCRIPTION, + path: APP_SEARCH_PLUGIN.URL, category: FeatureCatalogueCategory.DATA, showOnHomePage: true, }); plugins.home.featureCatalogue.register({ - id: 'workplaceSearch', - title: 'Workplace Search', + id: WORKPLACE_SEARCH_PLUGIN.ID, + title: WORKPLACE_SEARCH_PLUGIN.NAME, icon: WorkplaceSearchLogo, - description: - 'Search all documents, files, and sources available across your virtual workplace.', - path: '/app/enterprise_search/workplace_search', + description: WORKPLACE_SEARCH_PLUGIN.DESCRIPTION, + path: WORKPLACE_SEARCH_PLUGIN.URL, category: FeatureCatalogueCategory.DATA, showOnHomePage: true, }); diff --git a/x-pack/plugins/enterprise_search/server/plugin.ts b/x-pack/plugins/enterprise_search/server/plugin.ts index a7bd68f92f78b9..6de6671337797d 100644 --- a/x-pack/plugins/enterprise_search/server/plugin.ts +++ b/x-pack/plugins/enterprise_search/server/plugin.ts @@ -19,6 +19,11 @@ import { UsageCollectionSetup } from 'src/plugins/usage_collection/server'; import { SecurityPluginSetup } from '../../security/server'; import { PluginSetupContract as FeaturesPluginSetup } from '../../features/server'; +import { + ENTERPRISE_SEARCH_PLUGIN, + APP_SEARCH_PLUGIN, + WORKPLACE_SEARCH_PLUGIN, +} from '../common/constants'; import { ConfigType } from './'; import { checkAccess } from './lib/check_access'; import { registerPublicUrlRoute } from './routes/enterprise_search/public_url'; @@ -64,13 +69,13 @@ export class EnterpriseSearchPlugin implements Plugin { * Register space/feature control */ features.registerFeature({ - id: 'enterpriseSearch', - name: 'Enterprise Search', + id: ENTERPRISE_SEARCH_PLUGIN.ID, + name: ENTERPRISE_SEARCH_PLUGIN.NAME, order: 0, icon: 'logoEnterpriseSearch', - navLinkId: 'appSearch', // TODO - remove this once functional tests no longer rely on navLinkId - app: ['kibana', 'appSearch', 'workplaceSearch'], // TODO: 'enterpriseSearch' - catalogue: ['appSearch', 'workplaceSearch'], // TODO: 'enterpriseSearch' + navLinkId: APP_SEARCH_PLUGIN.ID, // TODO - remove this once functional tests no longer rely on navLinkId + app: ['kibana', APP_SEARCH_PLUGIN.ID, WORKPLACE_SEARCH_PLUGIN.ID], + catalogue: [APP_SEARCH_PLUGIN.ID, WORKPLACE_SEARCH_PLUGIN.ID], privileges: null, }); From 41e3128ecd2ec33c4823aa98b9ae0b3a31125564 Mon Sep 17 00:00:00 2001 From: Gidi Meir Morris Date: Wed, 5 Aug 2020 18:48:09 +0100 Subject: [PATCH 19/33] [Alerting] Reload the Alerts List when alerts are deleted (#73715) Reloads the entire Alerts list when alerts are deleted through the UI. --- .../alerts_list/components/alerts_list.tsx | 19 ++++++--------- .../apps/triggers_actions_ui/alerts.ts | 24 +++++++++++++++---- 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/alerts_list.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/alerts_list.tsx index 2b2897a2181b11..3d55c51e452813 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/alerts_list.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/alerts_list.tsx @@ -152,6 +152,10 @@ export const AlertsList: React.FunctionComponent = () => { data: alertsResponse.data, totalItemCount: alertsResponse.total, }); + + if (!alertsResponse.data?.length && page.index > 0) { + setPage({ ...page, index: 0 }); + } } catch (e) { toastNotifications.addDanger({ title: i18n.translate( @@ -399,18 +403,9 @@ export const AlertsList: React.FunctionComponent = () => { return (
    { - if (selectedIds.length === 0 || selectedIds.length === deleted.length) { - const updatedAlerts = alertsState.data.filter( - (alert) => alert.id && !alertsToDelete.includes(alert.id) - ); - setAlertsState({ - isLoading: false, - data: updatedAlerts, - totalItemCount: alertsState.totalItemCount - deleted.length, - }); - setSelectedIds([]); - } + onDeleted={async (deleted: string[]) => { + loadAlertsData(); + setSelectedIds([]); setAlertsToDelete([]); }} onErrors={async () => { diff --git a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alerts.ts b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alerts.ts index fa714e8374ec78..56952919e416a5 100644 --- a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alerts.ts +++ b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alerts.ts @@ -5,6 +5,7 @@ */ import uuid from 'uuid'; +import { times } from 'lodash'; import expect from '@kbn/expect'; import { FtrProviderContext } from '../../ftr_provider_context'; @@ -361,11 +362,22 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); it('should delete all selection', async () => { - const createdAlert = await createAlert(); + const namePrefix = generateUniqueKey(); + let count = 0; + const createdAlertsFirstPage = await Promise.all( + times(10, () => createAlert({ name: `${namePrefix}-0${count++}` })) + ); + + const createdAlertsSecondPage = await Promise.all( + times(2, () => createAlert({ name: `${namePrefix}-1${count++}` })) + ); + await pageObjects.common.navigateToApp('triggersActions'); - await pageObjects.triggersActionsUI.searchAlerts(createdAlert.name); + await pageObjects.triggersActionsUI.searchAlerts(namePrefix); - await testSubjects.click(`checkboxSelectRow-${createdAlert.id}`); + for (const createdAlert of createdAlertsFirstPage) { + await testSubjects.click(`checkboxSelectRow-${createdAlert.id}`); + } await testSubjects.click('bulkAction'); @@ -377,9 +389,11 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await pageObjects.common.closeToast(); await pageObjects.common.navigateToApp('triggersActions'); - await pageObjects.triggersActionsUI.searchAlerts(createdAlert.name); + await pageObjects.triggersActionsUI.searchAlerts(namePrefix); const searchResultsAfterDelete = await pageObjects.triggersActionsUI.getAlertsList(); - expect(searchResultsAfterDelete.length).to.eql(0); + expect(searchResultsAfterDelete).to.have.length(2); + expect(searchResultsAfterDelete[0].name).to.eql(createdAlertsSecondPage[0].name); + expect(searchResultsAfterDelete[1].name).to.eql(createdAlertsSecondPage[1].name); }); }); }; From c8597ec84bebcd7c51a760bd1a13455aad8d8612 Mon Sep 17 00:00:00 2001 From: Tim Roes Date: Wed, 5 Aug 2020 19:52:00 +0200 Subject: [PATCH 20/33] Change experimental message for visualizations (#74354) --- .../components/experimental_vis_info.tsx | 20 +++++++++++++------ .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/plugins/visualize/public/application/components/experimental_vis_info.tsx b/src/plugins/visualize/public/application/components/experimental_vis_info.tsx index 51abb3ca530a4c..5f08bea60e5382 100644 --- a/src/plugins/visualize/public/application/components/experimental_vis_info.tsx +++ b/src/plugins/visualize/public/application/components/experimental_vis_info.tsx @@ -26,12 +26,20 @@ export const InfoComponent = () => { <> {' '} - - GitHub - - {'.'} + defaultMessage="This visualization is experimental and is not subject to the support SLA of official GA features. + For feedback, please create an issue in {githubLink}." + values={{ + githubLink: ( + + GitHub + + ), + }} + /> ); diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 7e1ce610a19484..8218904f77df9e 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -4529,7 +4529,6 @@ "visualize.createVisualization.noVisTypeErrorMessage": "有効なビジュアライゼーションタイプを指定してください", "visualize.editor.createBreadcrumb": "作成", "visualize.error.title": "ビジュアライゼーションエラー", - "visualize.experimentalVisInfoText": "このビジュアライゼーションは実験的なものです。フィードバックがありますか?で問題を報告してください。", "visualize.helpMenu.appName": "可視化", "visualize.linkedToSearch.unlinkSuccessNotificationText": "保存された検索「{searchTitle}」からリンクが解除されました", "visualize.listing.betaTitle": "ベータ", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index e82ba7cc1d60f4..21a42362bcdd3e 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -4530,7 +4530,6 @@ "visualize.createVisualization.noVisTypeErrorMessage": "必须提供有效的可视化类型", "visualize.editor.createBreadcrumb": "创建", "visualize.error.title": "可视化错误", - "visualize.experimentalVisInfoText": "此可视化标记为“实验性”。想反馈?请在以下位置创建问题:", "visualize.helpMenu.appName": "Visualize", "visualize.linkedToSearch.unlinkSuccessNotificationText": "已取消与已保存搜索“{searchTitle}”的链接", "visualize.listing.betaTitle": "公测版", From c0bb5375e037e5c1b83d354fa3835731cd3e2337 Mon Sep 17 00:00:00 2001 From: Nicolas Ruflin Date: Wed, 5 Aug 2020 20:01:52 +0200 Subject: [PATCH 21/33] [Ingest Manager] Update package registry for testing to f6b01d (#74341) Many changes went into the registry and the packages recently. This is updating to the most recent version of the registry distribution currently in production. Co-authored-by: Sonja Krause-Harder --- .../ingest_manager_api_integration/apis/epm/list.ts | 2 +- .../0.1.0/dataset/test_logs/fields/fields.yml | 12 ++++++------ .../0.1.0/dataset/test_metrics/fields/fields.yml | 12 ++++++------ .../0.1.0/dataset/test/fields/fields.yml | 12 ++++++------ .../0.2.0/dataset/test/fields/fields.yml | 12 ++++++------ .../0.3.0/dataset/test/fields/fields.yml | 12 ++++++------ .../overrides/0.1.0/dataset/test/fields/fields.yml | 12 ++++++------ .../apis/package_config/create.ts | 4 ++-- x-pack/test/ingest_manager_api_integration/config.ts | 2 +- 9 files changed, 40 insertions(+), 40 deletions(-) diff --git a/x-pack/test/ingest_manager_api_integration/apis/epm/list.ts b/x-pack/test/ingest_manager_api_integration/apis/epm/list.ts index 20414fcb90521b..0b6a37d77387e6 100644 --- a/x-pack/test/ingest_manager_api_integration/apis/epm/list.ts +++ b/x-pack/test/ingest_manager_api_integration/apis/epm/list.ts @@ -29,7 +29,7 @@ export default function ({ getService }: FtrProviderContext) { return response.body; }; const listResponse = await fetchPackageList(); - expect(listResponse.response.length).to.be(14); + expect(listResponse.response.length).to.be(8); } else { warnAndSkipTest(this, log); } diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/dataset/test_logs/fields/fields.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/dataset/test_logs/fields/fields.yml index 12a9a03c1337b4..6e003ed0ad1476 100644 --- a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/dataset/test_logs/fields/fields.yml +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/dataset/test_logs/fields/fields.yml @@ -1,15 +1,15 @@ -- name: dataset.type +- name: data_stream.type type: constant_keyword description: > - Dataset type. -- name: dataset.name + Data stream type. +- name: data_stream.dataset type: constant_keyword description: > - Dataset name. -- name: dataset.namespace + Data stream dataset. +- name: data_stream.namespace type: constant_keyword description: > - Dataset namespace. + Data stream namespace. - name: '@timestamp' type: date description: > diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/dataset/test_metrics/fields/fields.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/dataset/test_metrics/fields/fields.yml index 12a9a03c1337b4..6e003ed0ad1476 100644 --- a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/dataset/test_metrics/fields/fields.yml +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/all_assets/0.1.0/dataset/test_metrics/fields/fields.yml @@ -1,15 +1,15 @@ -- name: dataset.type +- name: data_stream.type type: constant_keyword description: > - Dataset type. -- name: dataset.name + Data stream type. +- name: data_stream.dataset type: constant_keyword description: > - Dataset name. -- name: dataset.namespace + Data stream dataset. +- name: data_stream.namespace type: constant_keyword description: > - Dataset namespace. + Data stream namespace. - name: '@timestamp' type: date description: > diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.1.0/dataset/test/fields/fields.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.1.0/dataset/test/fields/fields.yml index 12a9a03c1337b4..6e003ed0ad1476 100644 --- a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.1.0/dataset/test/fields/fields.yml +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.1.0/dataset/test/fields/fields.yml @@ -1,15 +1,15 @@ -- name: dataset.type +- name: data_stream.type type: constant_keyword description: > - Dataset type. -- name: dataset.name + Data stream type. +- name: data_stream.dataset type: constant_keyword description: > - Dataset name. -- name: dataset.namespace + Data stream dataset. +- name: data_stream.namespace type: constant_keyword description: > - Dataset namespace. + Data stream namespace. - name: '@timestamp' type: date description: > diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.2.0/dataset/test/fields/fields.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.2.0/dataset/test/fields/fields.yml index 12a9a03c1337b4..6e003ed0ad1476 100644 --- a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.2.0/dataset/test/fields/fields.yml +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.2.0/dataset/test/fields/fields.yml @@ -1,15 +1,15 @@ -- name: dataset.type +- name: data_stream.type type: constant_keyword description: > - Dataset type. -- name: dataset.name + Data stream type. +- name: data_stream.dataset type: constant_keyword description: > - Dataset name. -- name: dataset.namespace + Data stream dataset. +- name: data_stream.namespace type: constant_keyword description: > - Dataset namespace. + Data stream namespace. - name: '@timestamp' type: date description: > diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.3.0/dataset/test/fields/fields.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.3.0/dataset/test/fields/fields.yml index 12a9a03c1337b4..6e003ed0ad1476 100644 --- a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.3.0/dataset/test/fields/fields.yml +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/multiple_versions/0.3.0/dataset/test/fields/fields.yml @@ -1,15 +1,15 @@ -- name: dataset.type +- name: data_stream.type type: constant_keyword description: > - Dataset type. -- name: dataset.name + Data stream type. +- name: data_stream.dataset type: constant_keyword description: > - Dataset name. -- name: dataset.namespace + Data stream dataset. +- name: data_stream.namespace type: constant_keyword description: > - Dataset namespace. + Data stream namespace. - name: '@timestamp' type: date description: > diff --git a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/overrides/0.1.0/dataset/test/fields/fields.yml b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/overrides/0.1.0/dataset/test/fields/fields.yml index 12a9a03c1337b4..6e003ed0ad1476 100644 --- a/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/overrides/0.1.0/dataset/test/fields/fields.yml +++ b/x-pack/test/ingest_manager_api_integration/apis/fixtures/test_packages/overrides/0.1.0/dataset/test/fields/fields.yml @@ -1,15 +1,15 @@ -- name: dataset.type +- name: data_stream.type type: constant_keyword description: > - Dataset type. -- name: dataset.name + Data stream type. +- name: data_stream.dataset type: constant_keyword description: > - Dataset name. -- name: dataset.namespace + Data stream dataset. +- name: data_stream.namespace type: constant_keyword description: > - Dataset namespace. + Data stream namespace. - name: '@timestamp' type: date description: > diff --git a/x-pack/test/ingest_manager_api_integration/apis/package_config/create.ts b/x-pack/test/ingest_manager_api_integration/apis/package_config/create.ts index cae4ff79bdef6c..a2c2b99364d509 100644 --- a/x-pack/test/ingest_manager_api_integration/apis/package_config/create.ts +++ b/x-pack/test/ingest_manager_api_integration/apis/package_config/create.ts @@ -100,7 +100,7 @@ export default function ({ getService }: FtrProviderContext) { package: { name: 'endpoint', title: 'Endpoint', - version: '0.8.0', + version: '0.13.0', }, }) .expect(200); @@ -118,7 +118,7 @@ export default function ({ getService }: FtrProviderContext) { package: { name: 'endpoint', title: 'Endpoint', - version: '0.8.0', + version: '0.13.0', }, }) .expect(500); diff --git a/x-pack/test/ingest_manager_api_integration/config.ts b/x-pack/test/ingest_manager_api_integration/config.ts index 85d1c20c7f1554..08d5da148b51e4 100644 --- a/x-pack/test/ingest_manager_api_integration/config.ts +++ b/x-pack/test/ingest_manager_api_integration/config.ts @@ -12,7 +12,7 @@ import { defineDockerServersConfig } from '@kbn/test'; // Docker image to use for Ingest Manager API integration tests. // This hash comes from the commit hash here: https://github.com/elastic/package-storage/commit export const dockerImage = - 'docker.elastic.co/package-registry/distribution:80e93ade87f65e18d487b1c407406825915daba8'; + 'docker.elastic.co/package-registry/distribution:f6b01daec8cfe355101e366de9941d35a4c3763e'; export default async function ({ readConfigFile }: FtrConfigProviderContext) { const xPackAPITestsConfig = await readConfigFile(require.resolve('../api_integration/config.ts')); From 1c428ffed780495a327c15fcd33dcf3759e6087c Mon Sep 17 00:00:00 2001 From: Eric Davis Date: Wed, 5 Aug 2020 14:11:27 -0400 Subject: [PATCH 22/33] fixing encoding issue with \ for enroll command (#74379) --- .../components/enrollment_instructions/manual/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/components/enrollment_instructions/manual/index.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/components/enrollment_instructions/manual/index.tsx index 8ea236b2dd6c30..9efc95b0a04cf1 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/components/enrollment_instructions/manual/index.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/components/enrollment_instructions/manual/index.tsx @@ -36,8 +36,8 @@ export const ManualInstructions: React.FunctionComponent = ({ systemctl enable elastic-agent systemctl start elastic-agent`; - const windowsCommand = `.\elastic-agent enroll ${enrollArgs} -./install-service-elastic-agent.ps1`; + const windowsCommand = `.\\elastic-agent enroll ${enrollArgs} +.\\install-service-elastic-agent.ps1`; return ( <> From 0737241decd6bfc30e3c98abd47344befa856ee7 Mon Sep 17 00:00:00 2001 From: Zacqary Adam Xeper Date: Wed, 5 Aug 2020 13:13:22 -0500 Subject: [PATCH 23/33] [Metrics UI] Fix validating Metrics Explorer URL (#74311) --- ...metrics_explorer_options_url_state.test.ts | 70 ++++++++++++++ ...ith_metrics_explorer_options_url_state.tsx | 65 ++----------- .../hooks/use_metrics_explorer_options.ts | 94 +++++++++++++------ 3 files changed, 140 insertions(+), 89 deletions(-) create mode 100644 x-pack/plugins/infra/public/containers/metrics_explorer/with_metrics_explorer_options_url_state.test.ts diff --git a/x-pack/plugins/infra/public/containers/metrics_explorer/with_metrics_explorer_options_url_state.test.ts b/x-pack/plugins/infra/public/containers/metrics_explorer/with_metrics_explorer_options_url_state.test.ts new file mode 100644 index 00000000000000..8be34b4498c3fa --- /dev/null +++ b/x-pack/plugins/infra/public/containers/metrics_explorer/with_metrics_explorer_options_url_state.test.ts @@ -0,0 +1,70 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { omit } from 'lodash'; +import { mapToUrlState } from './with_metrics_explorer_options_url_state'; + +describe('WithMetricsExplorerOptionsUrlState', () => { + describe('mapToUrlState', () => { + it('loads a valid URL state', () => { + expect(mapToUrlState(validState)).toEqual(validState); + }); + it('discards invalid properties and loads valid properties into the URL', () => { + expect(mapToUrlState(invalidState)).toEqual(omit(invalidState, 'options')); + }); + }); +}); + +const validState = { + chartOptions: { + stack: false, + type: 'line', + yAxisMode: 'fromZero', + }, + options: { + aggregation: 'avg', + filterQuery: '', + groupBy: ['host.hostname'], + metrics: [ + { + aggregation: 'avg', + color: 'color0', + field: 'system.cpu.user.pct', + }, + { + aggregation: 'avg', + color: 'color1', + field: 'system.load.1', + }, + ], + source: 'url', + }, + timerange: { + from: 'now-1h', + interval: '>=10s', + to: 'now', + }, +}; + +const invalidState = { + chartOptions: { + stack: false, + type: 'line', + yAxisMode: 'fromZero', + }, + options: { + aggregation: 'avg', + filterQuery: '', + groupBy: ['host.hostname'], + metrics: 'this is the wrong data type', + source: 'url', + }, + timerange: { + from: 'now-1h', + interval: '>=10s', + to: 'now', + }, +}; diff --git a/x-pack/plugins/infra/public/containers/metrics_explorer/with_metrics_explorer_options_url_state.tsx b/x-pack/plugins/infra/public/containers/metrics_explorer/with_metrics_explorer_options_url_state.tsx index 35fb66b2620d60..c263d0f68a45e2 100644 --- a/x-pack/plugins/infra/public/containers/metrics_explorer/with_metrics_explorer_options_url_state.tsx +++ b/x-pack/plugins/infra/public/containers/metrics_explorer/with_metrics_explorer_options_url_state.tsx @@ -5,19 +5,17 @@ */ import { set } from '@elastic/safer-lodash-set'; -import { values } from 'lodash'; import React, { useContext, useMemo } from 'react'; -import * as t from 'io-ts'; import { ThrowReporter } from 'io-ts/lib/ThrowReporter'; -import { MetricsExplorerColor } from '../../../common/color_palette'; import { UrlStateContainer } from '../../utils/url_state'; import { MetricsExplorerOptions, MetricsExplorerOptionsContainer, MetricsExplorerTimeOptions, - MetricsExplorerYAxisMode, - MetricsExplorerChartType, MetricsExplorerChartOptions, + metricExplorerOptionsRT, + metricsExplorerChartOptionsRT, + metricsExplorerTimeOptionsRT, } from '../../pages/metrics/metrics_explorer/hooks/use_metrics_explorer_options'; interface MetricsExplorerUrlState { @@ -74,36 +72,7 @@ export const WithMetricsExplorerOptionsUrlState = () => { }; function isMetricExplorerOptions(subject: any): subject is MetricsExplorerOptions { - const MetricRequired = t.type({ - aggregation: t.string, - }); - - const MetricOptional = t.partial({ - field: t.string, - rate: t.boolean, - color: t.keyof( - Object.fromEntries(values(MetricsExplorerColor).map((c) => [c, null])) as Record - ), - label: t.string, - }); - - const Metric = t.intersection([MetricRequired, MetricOptional]); - - const OptionsRequired = t.type({ - aggregation: t.string, - metrics: t.array(Metric), - }); - - const OptionsOptional = t.partial({ - limit: t.number, - groupBy: t.string, - filterQuery: t.string, - source: t.string, - }); - - const Options = t.intersection([OptionsRequired, OptionsOptional]); - - const result = Options.decode(subject); + const result = metricExplorerOptionsRT.decode(subject); try { ThrowReporter.report(result); @@ -114,22 +83,7 @@ function isMetricExplorerOptions(subject: any): subject is MetricsExplorerOption } function isMetricExplorerChartOptions(subject: any): subject is MetricsExplorerChartOptions { - const ChartOptions = t.type({ - yAxisMode: t.keyof( - Object.fromEntries(values(MetricsExplorerYAxisMode).map((v) => [v, null])) as Record< - string, - null - > - ), - type: t.keyof( - Object.fromEntries(values(MetricsExplorerChartType).map((v) => [v, null])) as Record< - string, - null - > - ), - stack: t.boolean, - }); - const result = ChartOptions.decode(subject); + const result = metricsExplorerChartOptionsRT.decode(subject); try { ThrowReporter.report(result); @@ -140,12 +94,7 @@ function isMetricExplorerChartOptions(subject: any): subject is MetricsExplorerC } function isMetricExplorerTimeOption(subject: any): subject is MetricsExplorerTimeOptions { - const TimeRange = t.type({ - from: t.string, - to: t.string, - interval: t.string, - }); - const result = TimeRange.decode(subject); + const result = metricsExplorerTimeOptionsRT.decode(subject); try { ThrowReporter.report(result); return true; @@ -154,7 +103,7 @@ function isMetricExplorerTimeOption(subject: any): subject is MetricsExplorerTim } } -const mapToUrlState = (value: any): MetricsExplorerUrlState | undefined => { +export const mapToUrlState = (value: any): MetricsExplorerUrlState | undefined => { const finalState = {}; if (value) { if (value.options && isMetricExplorerOptions(value.options)) { diff --git a/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/hooks/use_metrics_explorer_options.ts b/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/hooks/use_metrics_explorer_options.ts index fa103ce15e3e8f..299231f1821f08 100644 --- a/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/hooks/use_metrics_explorer_options.ts +++ b/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/hooks/use_metrics_explorer_options.ts @@ -4,19 +4,29 @@ * you may not use this file except in compliance with the Elastic License. */ +import * as t from 'io-ts'; +import { values } from 'lodash'; import createContainer from 'constate'; import { useState, useEffect, useMemo, Dispatch, SetStateAction } from 'react'; import { useAlertPrefillContext } from '../../../../alerting/use_alert_prefill'; import { MetricsExplorerColor } from '../../../../../common/color_palette'; -import { - MetricsExplorerAggregation, - MetricsExplorerMetric, -} from '../../../../../common/http_api/metrics_explorer'; - -export type MetricsExplorerOptionsMetric = MetricsExplorerMetric & { - color?: MetricsExplorerColor; - label?: string; -}; +import { metricsExplorerMetricRT } from '../../../../../common/http_api/metrics_explorer'; + +const metricsExplorerOptionsMetricRT = t.intersection([ + metricsExplorerMetricRT, + t.partial({ + rate: t.boolean, + color: t.keyof( + Object.fromEntries(values(MetricsExplorerColor).map((c) => [c, null])) as Record< + MetricsExplorerColor, + null + > + ), + label: t.string, + }), +]); + +export type MetricsExplorerOptionsMetric = t.TypeOf; export enum MetricsExplorerChartType { line = 'line', @@ -29,28 +39,50 @@ export enum MetricsExplorerYAxisMode { auto = 'auto', } -export interface MetricsExplorerChartOptions { - type: MetricsExplorerChartType; - yAxisMode: MetricsExplorerYAxisMode; - stack: boolean; -} - -export interface MetricsExplorerOptions { - metrics: MetricsExplorerOptionsMetric[]; - limit?: number; - groupBy?: string | string[]; - filterQuery?: string; - aggregation: MetricsExplorerAggregation; - forceInterval?: boolean; - dropLastBucket?: boolean; - source?: string; -} - -export interface MetricsExplorerTimeOptions { - from: string; - to: string; - interval: string; -} +export const metricsExplorerChartOptionsRT = t.type({ + yAxisMode: t.keyof( + Object.fromEntries(values(MetricsExplorerYAxisMode).map((v) => [v, null])) as Record< + MetricsExplorerYAxisMode, + null + > + ), + type: t.keyof( + Object.fromEntries(values(MetricsExplorerChartType).map((v) => [v, null])) as Record< + MetricsExplorerChartType, + null + > + ), + stack: t.boolean, +}); + +export type MetricsExplorerChartOptions = t.TypeOf; + +const metricExplorerOptionsRequiredRT = t.type({ + aggregation: t.string, + metrics: t.array(metricsExplorerOptionsMetricRT), +}); + +const metricExplorerOptionsOptionalRT = t.partial({ + limit: t.number, + groupBy: t.union([t.string, t.array(t.string)]), + filterQuery: t.string, + source: t.string, + forceInterval: t.boolean, + dropLastBucket: t.boolean, +}); +export const metricExplorerOptionsRT = t.intersection([ + metricExplorerOptionsRequiredRT, + metricExplorerOptionsOptionalRT, +]); + +export type MetricsExplorerOptions = t.TypeOf; + +export const metricsExplorerTimeOptionsRT = t.type({ + from: t.string, + to: t.string, + interval: t.string, +}); +export type MetricsExplorerTimeOptions = t.TypeOf; export const DEFAULT_TIMERANGE: MetricsExplorerTimeOptions = { from: 'now-1h', From 057cab725c1e5c09d2a3aa531221fffc826e7090 Mon Sep 17 00:00:00 2001 From: Spencer Date: Wed, 5 Aug 2020 12:05:17 -0700 Subject: [PATCH 24/33] [Jenkins] run CI when plugin readmes change (#74388) Co-authored-by: spalger --- .ci/pipeline-library/src/test/prChanges.groovy | 13 +++++++++++++ vars/prChanges.groovy | 2 ++ 2 files changed, 15 insertions(+) diff --git a/.ci/pipeline-library/src/test/prChanges.groovy b/.ci/pipeline-library/src/test/prChanges.groovy index f149340517ff0a..0f354e7687246a 100644 --- a/.ci/pipeline-library/src/test/prChanges.groovy +++ b/.ci/pipeline-library/src/test/prChanges.groovy @@ -97,4 +97,17 @@ class PrChangesTest extends KibanaBasePipelineTest { assertFalse(prChanges.areChangesSkippable()) } + + @Test + void 'areChangesSkippable() with plugin readme changes'() { + props([ + githubPrs: [ + getChanges: { [ + [filename: 'src/plugins/foo/README.asciidoc'], + ] }, + ], + ]) + + assertFalse(prChanges.areChangesSkippable()) + } } diff --git a/vars/prChanges.groovy b/vars/prChanges.groovy index adaacf952b5b6e..a7fe46e7bf014f 100644 --- a/vars/prChanges.groovy +++ b/vars/prChanges.groovy @@ -22,6 +22,8 @@ def getNotSkippablePaths() { return [ // this file is auto-generated and changes to it need to be validated with CI /^docs\/developer\/architecture\/code-exploration.asciidoc$/, + // don't skip CI on prs with changes to plugin readme files (?i) is for case-insensitive matching + /(?i)\/plugins\/[^\/]+\/readme\.(md|asciidoc)$/, ] } From c655f50950693f3d0ec32dcf8167135d0c9781ec Mon Sep 17 00:00:00 2001 From: Jen Huang Date: Wed, 5 Aug 2020 12:51:58 -0700 Subject: [PATCH 25/33] Rename agent configs SO to agent policies (#74397) --- .../ingest_manager/common/constants/agent_config.ts | 2 +- .../test/functional/es_archives/fleet/agents/data.json | 6 +++--- .../functional/es_archives/fleet/agents/mappings.json | 4 ++-- x-pack/test/functional/es_archives/lists/mappings.json | 6 +++--- .../reporting/canvas_disallowed_url/mappings.json | 9 ++++----- .../es_archives/export_rule/mappings.json | 4 ++-- 6 files changed, 15 insertions(+), 16 deletions(-) diff --git a/x-pack/plugins/ingest_manager/common/constants/agent_config.ts b/x-pack/plugins/ingest_manager/common/constants/agent_config.ts index 30ca92f5f32f39..aa6399b73f14ed 100644 --- a/x-pack/plugins/ingest_manager/common/constants/agent_config.ts +++ b/x-pack/plugins/ingest_manager/common/constants/agent_config.ts @@ -5,7 +5,7 @@ */ import { AgentConfigStatus, DefaultPackages } from '../types'; -export const AGENT_CONFIG_SAVED_OBJECT_TYPE = 'ingest-agent-configs'; +export const AGENT_CONFIG_SAVED_OBJECT_TYPE = 'ingest-agent-policies'; export const DEFAULT_AGENT_CONFIG = { name: 'Default config', diff --git a/x-pack/test/functional/es_archives/fleet/agents/data.json b/x-pack/test/functional/es_archives/fleet/agents/data.json index b3d49199b0d9eb..c94b87f6ad1ec6 100644 --- a/x-pack/test/functional/es_archives/fleet/agents/data.json +++ b/x-pack/test/functional/es_archives/fleet/agents/data.json @@ -203,11 +203,11 @@ { "type": "doc", "value": { - "id": "ingest-agent-configs:config1", + "id": "ingest-agent-policies:config1", "index": ".kibana", "source": { - "type": "ingest-agent-configs", - "ingest-agent-configs": { + "type": "ingest-agent-policies", + "ingest-agent-policies": { "name": "Test config", "namespace": "default", "description": "Config 1", diff --git a/x-pack/test/functional/es_archives/fleet/agents/mappings.json b/x-pack/test/functional/es_archives/fleet/agents/mappings.json index 1f0aa2f24d6df2..acc32c3e2cbb58 100644 --- a/x-pack/test/functional/es_archives/fleet/agents/mappings.json +++ b/x-pack/test/functional/es_archives/fleet/agents/mappings.json @@ -58,7 +58,7 @@ "siem-ui-timeline": "f2d929253ecd06ffbac78b4047f45a86", "kql-telemetry": "d12a98a6f19a2d273696597547e064ee", "ui-metric": "0d409297dc5ebe1e3a1da691c6ee32e3", - "ingest-agent-configs": "f4bdc17427437537ca1754d5d5057ad5", + "ingest-agent-policies": "f4bdc17427437537ca1754d5d5057ad5", "url": "b675c3be8d76ecf029294d51dc7ec65d", "migrationVersion": "4a1746014a75ade3a714e1db5763276f", "index-pattern": "66eccb05066c5a89924f48a9e9736499", @@ -1797,7 +1797,7 @@ } } }, - "ingest-agent-configs": { + "ingest-agent-policies": { "properties": { "package_configs": { "type": "keyword" diff --git a/x-pack/test/functional/es_archives/lists/mappings.json b/x-pack/test/functional/es_archives/lists/mappings.json index c1b277b8183a33..2fc1f1a3111a7a 100644 --- a/x-pack/test/functional/es_archives/lists/mappings.json +++ b/x-pack/test/functional/es_archives/lists/mappings.json @@ -61,7 +61,7 @@ "siem-ui-timeline": "94bc38c7a421d15fbfe8ea565370a421", "kql-telemetry": "d12a98a6f19a2d273696597547e064ee", "ui-metric": "0d409297dc5ebe1e3a1da691c6ee32e3", - "ingest-agent-configs": "9326f99c977fd2ef5ab24b6336a0675c", + "ingest-agent-policies": "9326f99c977fd2ef5ab24b6336a0675c", "url": "c7f66a0df8b1b52f17c28c4adb111105", "endpoint:user-artifact-manifest": "67c28185da541c1404e7852d30498cd6", "migrationVersion": "4a1746014a75ade3a714e1db5763276f", @@ -1210,7 +1210,7 @@ } } }, - "ingest-agent-configs": { + "ingest-agent-policies": { "properties": { "description": { "type": "text" @@ -2488,4 +2488,4 @@ } } } -} \ No newline at end of file +} diff --git a/x-pack/test/functional/es_archives/reporting/canvas_disallowed_url/mappings.json b/x-pack/test/functional/es_archives/reporting/canvas_disallowed_url/mappings.json index 1432a53b45461f..1fd338fbb0ffb9 100644 --- a/x-pack/test/functional/es_archives/reporting/canvas_disallowed_url/mappings.json +++ b/x-pack/test/functional/es_archives/reporting/canvas_disallowed_url/mappings.json @@ -2,8 +2,7 @@ "type": "index", "value": { "aliases": { - ".kibana": { - } + ".kibana": {} }, "index": ".kibana_1", "mappings": { @@ -38,7 +37,7 @@ "fleet-enrollment-api-keys": "28b91e20b105b6f928e2012600085d8f", "graph-workspace": "cd7ba1330e6682e9cc00b78850874be1", "index-pattern": "66eccb05066c5a89924f48a9e9736499", - "ingest-agent-configs": "9326f99c977fd2ef5ab24b6336a0675c", + "ingest-agent-policies": "9326f99c977fd2ef5ab24b6336a0675c", "ingest-outputs": "8aa988c376e65443fefc26f1075e93a3", "ingest-package-configs": "48e8bd97e488008e21c0b5a2367b83ad", "ingest_manager_settings": "012cf278ec84579495110bb827d1ed09", @@ -1149,7 +1148,7 @@ } } }, - "ingest-agent-configs": { + "ingest-agent-policies": { "properties": { "description": { "type": "text" @@ -2213,4 +2212,4 @@ } } } -} \ No newline at end of file +} diff --git a/x-pack/test/security_solution_cypress/es_archives/export_rule/mappings.json b/x-pack/test/security_solution_cypress/es_archives/export_rule/mappings.json index 2cfa0bde4e9772..dc92d23a618d33 100644 --- a/x-pack/test/security_solution_cypress/es_archives/export_rule/mappings.json +++ b/x-pack/test/security_solution_cypress/es_archives/export_rule/mappings.json @@ -39,7 +39,7 @@ "graph-workspace": "cd7ba1330e6682e9cc00b78850874be1", "index-pattern": "66eccb05066c5a89924f48a9e9736499", "infrastructure-ui-source": "2b2809653635caf490c93f090502d04c", - "ingest-agent-configs": "9326f99c977fd2ef5ab24b6336a0675c", + "ingest-agent-policies": "9326f99c977fd2ef5ab24b6336a0675c", "ingest-outputs": "8aa988c376e65443fefc26f1075e93a3", "ingest-package-configs": "48e8bd97e488008e21c0b5a2367b83ad", "ingest_manager_settings": "012cf278ec84579495110bb827d1ed09", @@ -1222,7 +1222,7 @@ } } }, - "ingest-agent-configs": { + "ingest-agent-policies": { "properties": { "description": { "type": "text" From af358c94a3e17aeb2c78c0edd50c233a4e3558c0 Mon Sep 17 00:00:00 2001 From: Melissa Alvarez Date: Wed, 5 Aug 2020 17:58:40 -0400 Subject: [PATCH 26/33] [ML] DF Analytics: adds functional tests for edit form (#73885) * add edit analytics functional test * adds edit test service * update edit test wording for clarity * check flyout closes after edit * rename testSubj for consitency --- .../action_edit/edit_button_flyout.tsx | 4 +- .../components/analytics_list/use_columns.tsx | 1 + .../classification_creation.ts | 31 ++++++++ .../outlier_detection_creation.ts | 31 ++++++++ .../regression_creation.ts | 31 ++++++++ .../services/ml/data_frame_analytics_edit.ts | 71 +++++++++++++++++++ .../services/ml/data_frame_analytics_table.ts | 6 ++ x-pack/test/functional/services/ml/index.ts | 3 + 8 files changed, 176 insertions(+), 2 deletions(-) create mode 100644 x-pack/test/functional/services/ml/data_frame_analytics_edit.ts diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_edit/edit_button_flyout.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_edit/edit_button_flyout.tsx index 86b1c879417bbf..14b743997f30a2 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_edit/edit_button_flyout.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/action_edit/edit_button_flyout.tsx @@ -133,7 +133,7 @@ export const EditButtonFlyout: FC> = ({ closeFlyout, item } onClose={closeFlyout} hideCloseButton aria-labelledby="analyticsEditFlyoutTitle" - data-test-subj="analyticsEditFlyout" + data-test-subj="mlAnalyticsEditFlyout" > @@ -297,7 +297,7 @@ export const EditButtonFlyout: FC> = ({ closeFlyout, item } { @@ -179,6 +180,36 @@ export default function ({ getService }: FtrProviderContext) { }); }); + it('should open the edit form for the created job in the analytics table', async () => { + await ml.dataFrameAnalyticsTable.openEditFlyout(testData.jobId); + }); + + it('should input the description in the edit form', async () => { + await ml.dataFrameAnalyticsEdit.assertJobDescriptionEditInputExists(); + await ml.dataFrameAnalyticsEdit.setJobDescriptionEdit(editedDescription); + }); + + it('should input the model memory limit in the edit form', async () => { + await ml.dataFrameAnalyticsEdit.assertJobMmlEditInputExists(); + await ml.dataFrameAnalyticsEdit.setJobMmlEdit('21mb'); + }); + + it('should submit the edit job form', async () => { + await ml.dataFrameAnalyticsEdit.updateAnalyticsJob(); + }); + + it('displays details for the edited job in the analytics table', async () => { + await ml.dataFrameAnalyticsTable.assertAnalyticsRowFields(testData.jobId, { + id: testData.jobId, + description: editedDescription, + sourceIndex: testData.source, + destinationIndex: testData.destinationIndex, + type: testData.expected.row.type, + status: testData.expected.row.status, + progress: testData.expected.row.progress, + }); + }); + it('creates the destination index and writes results to it', async () => { await ml.api.assertIndicesExist(testData.destinationIndex); await ml.api.assertIndicesNotEmpty(testData.destinationIndex); diff --git a/x-pack/test/functional/apps/ml/data_frame_analytics/outlier_detection_creation.ts b/x-pack/test/functional/apps/ml/data_frame_analytics/outlier_detection_creation.ts index 0320354b99ff00..5b89cec49db3e4 100644 --- a/x-pack/test/functional/apps/ml/data_frame_analytics/outlier_detection_creation.ts +++ b/x-pack/test/functional/apps/ml/data_frame_analytics/outlier_detection_creation.ts @@ -10,6 +10,7 @@ import { FtrProviderContext } from '../../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const ml = getService('ml'); + const editedDescription = 'Edited description'; describe('outlier detection creation', function () { before(async () => { @@ -197,6 +198,36 @@ export default function ({ getService }: FtrProviderContext) { }); }); + it('should open the edit form for the created job in the analytics table', async () => { + await ml.dataFrameAnalyticsTable.openEditFlyout(testData.jobId); + }); + + it('should input the description in the edit form', async () => { + await ml.dataFrameAnalyticsEdit.assertJobDescriptionEditInputExists(); + await ml.dataFrameAnalyticsEdit.setJobDescriptionEdit(editedDescription); + }); + + it('should input the model memory limit in the edit form', async () => { + await ml.dataFrameAnalyticsEdit.assertJobMmlEditInputExists(); + await ml.dataFrameAnalyticsEdit.setJobMmlEdit('21mb'); + }); + + it('should submit the edit job form', async () => { + await ml.dataFrameAnalyticsEdit.updateAnalyticsJob(); + }); + + it('displays details for the edited job in the analytics table', async () => { + await ml.dataFrameAnalyticsTable.assertAnalyticsRowFields(testData.jobId, { + id: testData.jobId, + description: editedDescription, + sourceIndex: testData.source, + destinationIndex: testData.destinationIndex, + type: testData.expected.row.type, + status: testData.expected.row.status, + progress: testData.expected.row.progress, + }); + }); + it('creates the destination index and writes results to it', async () => { await ml.api.assertIndicesExist(testData.destinationIndex); await ml.api.assertIndicesNotEmpty(testData.destinationIndex); diff --git a/x-pack/test/functional/apps/ml/data_frame_analytics/regression_creation.ts b/x-pack/test/functional/apps/ml/data_frame_analytics/regression_creation.ts index 1aa505e26e1e9a..a67a3483233479 100644 --- a/x-pack/test/functional/apps/ml/data_frame_analytics/regression_creation.ts +++ b/x-pack/test/functional/apps/ml/data_frame_analytics/regression_creation.ts @@ -10,6 +10,7 @@ import { FtrProviderContext } from '../../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const ml = getService('ml'); + const editedDescription = 'Edited description'; describe('regression creation', function () { before(async () => { @@ -179,6 +180,36 @@ export default function ({ getService }: FtrProviderContext) { }); }); + it('should open the edit form for the created job in the analytics table', async () => { + await ml.dataFrameAnalyticsTable.openEditFlyout(testData.jobId); + }); + + it('should input the description in the edit form', async () => { + await ml.dataFrameAnalyticsEdit.assertJobDescriptionEditInputExists(); + await ml.dataFrameAnalyticsEdit.setJobDescriptionEdit(editedDescription); + }); + + it('should input the model memory limit in the edit form', async () => { + await ml.dataFrameAnalyticsEdit.assertJobMmlEditInputExists(); + await ml.dataFrameAnalyticsEdit.setJobMmlEdit('21mb'); + }); + + it('should submit the edit job form', async () => { + await ml.dataFrameAnalyticsEdit.updateAnalyticsJob(); + }); + + it('displays details for the edited job in the analytics table', async () => { + await ml.dataFrameAnalyticsTable.assertAnalyticsRowFields(testData.jobId, { + id: testData.jobId, + description: editedDescription, + sourceIndex: testData.source, + destinationIndex: testData.destinationIndex, + type: testData.expected.row.type, + status: testData.expected.row.status, + progress: testData.expected.row.progress, + }); + }); + it('creates the destination index and writes results to it', async () => { await ml.api.assertIndicesExist(testData.destinationIndex); await ml.api.assertIndicesNotEmpty(testData.destinationIndex); diff --git a/x-pack/test/functional/services/ml/data_frame_analytics_edit.ts b/x-pack/test/functional/services/ml/data_frame_analytics_edit.ts new file mode 100644 index 00000000000000..fd06dd24d6f8be --- /dev/null +++ b/x-pack/test/functional/services/ml/data_frame_analytics_edit.ts @@ -0,0 +1,71 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import expect from '@kbn/expect'; + +import { FtrProviderContext } from '../../ftr_provider_context'; +import { MlCommon } from './common'; + +export function MachineLearningDataFrameAnalyticsEditProvider( + { getService }: FtrProviderContext, + mlCommon: MlCommon +) { + const testSubjects = getService('testSubjects'); + const retry = getService('retry'); + + return { + async assertJobDescriptionEditInputExists() { + await testSubjects.existOrFail('mlAnalyticsEditFlyoutDescriptionInput'); + }, + async assertJobDescriptionEditValue(expectedValue: string) { + const actualJobDescription = await testSubjects.getAttribute( + 'mlAnalyticsEditFlyoutDescriptionInput', + 'value' + ); + expect(actualJobDescription).to.eql( + expectedValue, + `Job description edit should be '${expectedValue}' (got '${actualJobDescription}')` + ); + }, + async assertJobMmlEditInputExists() { + await testSubjects.existOrFail('mlAnalyticsEditFlyoutmodelMemoryLimitInput'); + }, + async assertJobMmlEditValue(expectedValue: string) { + const actualMml = await testSubjects.getAttribute( + 'mlAnalyticsEditFlyoutmodelMemoryLimitInput', + 'value' + ); + expect(actualMml).to.eql( + expectedValue, + `Job model memory limit edit should be '${expectedValue}' (got '${actualMml}')` + ); + }, + async setJobDescriptionEdit(jobDescription: string) { + await mlCommon.setValueWithChecks('mlAnalyticsEditFlyoutDescriptionInput', jobDescription, { + clearWithKeyboard: true, + }); + await this.assertJobDescriptionEditValue(jobDescription); + }, + + async setJobMmlEdit(mml: string) { + await mlCommon.setValueWithChecks('mlAnalyticsEditFlyoutmodelMemoryLimitInput', mml, { + clearWithKeyboard: true, + }); + await this.assertJobMmlEditValue(mml); + }, + + async assertAnalyticsEditFlyoutMissing() { + await testSubjects.missingOrFail('mlAnalyticsEditFlyout'); + }, + + async updateAnalyticsJob() { + await testSubjects.existOrFail('mlAnalyticsEditFlyoutUpdateButton'); + await testSubjects.click('mlAnalyticsEditFlyoutUpdateButton'); + await retry.tryForTime(5000, async () => { + await this.assertAnalyticsEditFlyoutMissing(); + }); + }, + }; +} diff --git a/x-pack/test/functional/services/ml/data_frame_analytics_table.ts b/x-pack/test/functional/services/ml/data_frame_analytics_table.ts index d315f9eb772104..608a1f2bee3e10 100644 --- a/x-pack/test/functional/services/ml/data_frame_analytics_table.ts +++ b/x-pack/test/functional/services/ml/data_frame_analytics_table.ts @@ -88,6 +88,12 @@ export function MachineLearningDataFrameAnalyticsTableProvider({ getService }: F await testSubjects.existOrFail('mlAnalyticsJobViewButton'); } + public async openEditFlyout(analyticsId: string) { + await this.openRowActions(analyticsId); + await testSubjects.click('mlAnalyticsJobEditButton'); + await testSubjects.existOrFail('mlAnalyticsEditFlyout', { timeout: 5000 }); + } + async assertAnalyticsSearchInputValue(expectedSearchValue: string) { const searchBarInput = await this.getAnalyticsSearchInput(); const actualSearchValue = await searchBarInput.getAttribute('value'); diff --git a/x-pack/test/functional/services/ml/index.ts b/x-pack/test/functional/services/ml/index.ts index fbf31e40a242a2..fd36bb0f47f95d 100644 --- a/x-pack/test/functional/services/ml/index.ts +++ b/x-pack/test/functional/services/ml/index.ts @@ -13,6 +13,7 @@ import { MachineLearningCommonProvider } from './common'; import { MachineLearningCustomUrlsProvider } from './custom_urls'; import { MachineLearningDataFrameAnalyticsProvider } from './data_frame_analytics'; import { MachineLearningDataFrameAnalyticsCreationProvider } from './data_frame_analytics_creation'; +import { MachineLearningDataFrameAnalyticsEditProvider } from './data_frame_analytics_edit'; import { MachineLearningDataFrameAnalyticsTableProvider } from './data_frame_analytics_table'; import { MachineLearningDataVisualizerProvider } from './data_visualizer'; import { MachineLearningDataVisualizerFileBasedProvider } from './data_visualizer_file_based'; @@ -47,6 +48,7 @@ export function MachineLearningProvider(context: FtrProviderContext) { common, api ); + const dataFrameAnalyticsEdit = MachineLearningDataFrameAnalyticsEditProvider(context, common); const dataFrameAnalyticsTable = MachineLearningDataFrameAnalyticsTableProvider(context); const dataVisualizer = MachineLearningDataVisualizerProvider(context); const dataVisualizerFileBased = MachineLearningDataVisualizerFileBasedProvider(context, common); @@ -76,6 +78,7 @@ export function MachineLearningProvider(context: FtrProviderContext) { customUrls, dataFrameAnalytics, dataFrameAnalyticsCreation, + dataFrameAnalyticsEdit, dataFrameAnalyticsTable, dataVisualizer, dataVisualizerFileBased, From b001301f5ad44757fa83bffc7f4dac1f007c18b6 Mon Sep 17 00:00:00 2001 From: spalger Date: Thu, 16 Jul 2020 08:47:23 -0700 Subject: [PATCH 27/33] skip flaky suite (#71390) (cherry picked from commit d0afbd887dc547ebbc564f77edf2ef04750fc653) --- .../test_suites/task_manager/task_manager_integration.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/plugin_api_integration/test_suites/task_manager/task_manager_integration.js b/x-pack/test/plugin_api_integration/test_suites/task_manager/task_manager_integration.js index c87a5039360b8f..ea95eb42dd6ff5 100644 --- a/x-pack/test/plugin_api_integration/test_suites/task_manager/task_manager_integration.js +++ b/x-pack/test/plugin_api_integration/test_suites/task_manager/task_manager_integration.js @@ -28,7 +28,8 @@ export default function ({ getService }) { const testHistoryIndex = '.kibana_task_manager_test_result'; const supertest = supertestAsPromised(url.format(config.get('servers.kibana'))); - describe('scheduling and running tasks', () => { + // FLAKY: https://github.com/elastic/kibana/issues/71390 + describe.skip('scheduling and running tasks', () => { beforeEach( async () => await supertest.delete('/api/sample_tasks').set('kbn-xsrf', 'xxx').expect(200) ); From 4b3326d6fbafb09bb6eb8552c0a17505af50aabe Mon Sep 17 00:00:00 2001 From: Lisa Cawley Date: Wed, 5 Aug 2020 15:08:38 -0700 Subject: [PATCH 28/33] [DOCS] Add Kibana alerts to Stack Monitoring (#73762) Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> --- .../images/monitoring-kibana-alerts.png | Bin 0 -> 113426 bytes docs/user/monitoring/index.asciidoc | 1 + docs/user/monitoring/kibana-alerts.asciidoc | 36 ++++++++++++++++++ 3 files changed, 37 insertions(+) create mode 100644 docs/user/monitoring/images/monitoring-kibana-alerts.png create mode 100644 docs/user/monitoring/kibana-alerts.asciidoc diff --git a/docs/user/monitoring/images/monitoring-kibana-alerts.png b/docs/user/monitoring/images/monitoring-kibana-alerts.png new file mode 100644 index 0000000000000000000000000000000000000000..43edcb45041400ea128a9b6ee397df9188dff82f GIT binary patch literal 113426 zcmZs@byQnj(+658MT-=7C{l`3w0Q9X#hu{p?pjKV7PkV$ic4^ZAjKVu6C8pB2^u8G z<@xS?@A|&?=^t6^th3MAXZD`iW51b1sw&H2W0GS&d-e=l{-d<|vu7yZpFKnBMn`?R zgH=M?`gDWLR!U0MUP?~N*}>UO!^PCxQqI!J(#_UfT~6}Zv-dGET81{1T7+V4?$-1S z;~EaU-#kjhu^F+Gw0ZODTZ30t_?=Sa`IqSSEa1oEKZeHN^R(UPsmQ1Xyn|*E_I5UX zrhR*f3l^*AOu=ManxTCwR(~C;x))t^kS@%VZrfV3YIz)Ro(0SHKW?#xz1V9h(@jkv zL?X_pWGCU?bPtb<5M_=38lFpnnx~^i#cEjk37KC7%ew)vCiUCjcyV^+AqUtbOGQNM zN@G^HQ-T!{hjdb`HR6Tjcbh;X4%MfIo9#8d`_Rkj*Sujq-{US86k}_(&9*rm@j^?( zE+P#tZnW=O_9fz7^_+38lHEbs9^{uNN*pzQc{QV|=oL)bpaP6m){#>HY>0XtwELC+ zoNbdmVnSedSfhKPyez5jXSY{x6QBOsnJ`LMWGf)!bifVasF8iP3xV=wjQIOX-`%$R zeuM|Q

    __2kf1HO=U;BD@;ocCF%{02+ot0fbVWT)GRCDJtwmxhsXzWBbGt`RTTl!oGeI)%JANlW3=SHH z-ZYQbvsi?SeIc$Tzl*IPp0+$K|7KuLARfdffGqxoj23?}bi#;R9-iRJjYQ`gC87jR zqO2vbfZZ-AILH`@2+ZBLf9Fvz%9L3VtZ&OTdE{aFWS}u$!G_ZqMnA%gcwq>->o=}3 z*k=<^YuqHuYSkIPF}^vtIdsr<_tqkJMBO4jnM&`A z?4vq&J>Ay9l?_TAO5d%zFci^q=D?AyNPBT>ccV?F93x$E5qc3`&jw-&e0$#y8Vei_ z919!|>^4MB5FW|e>e%3Lp>a3vhufW#>#z9}`;sVD7>b3AfhIA`^~?hX3BlW z^b*}%Qf(n56?lLk&f&}!rNS|%*(pXCbZ}@RMIvgDFO(j%v^4i!l9{Qrot55qNDzEy zkh1um%&&RXtaF}6m!bkux5d*C)*vXYnUTN^uPgG(bwozoQO%Y*)v81Pn6CyR>rD$e z9bk_Uc`N=&G9$0zXGzU~?nRW4h7Ep-wb2M)a@41I0b9L@yU65j!zBQ4$o)jT?CKCd zJw$M9#@0VerTiQ+K<`94F^snQ;{Ey8rCM+|Rl>&rto50zLwM&cw@=Xh%>Ht(d&MsM z=LP}ctj;x<$DG)Q$MR>^F~LZ=IRRSF4X|KOy5ha1uDq3!(leH)YxHMG;kM6Ep01Fd ze&kQTXU~vxk^gfC<$Lb)|6C(=|1$^>6qbGV?87s8X$egqq(hMPcLNZZ4_}39UQn_c{Hk3FW|M!LeOhZemhWhX6{u%9m z^?{2#Je2c4PyXNcr|e&UR8g$^$T0S2I?+Dn8bJ5Xj-Eb$e(A9BE;T#*7{N~=e=R0g zzw6I~p~Rc$l>flFVIa$yi*ZQ#Gc~4w*l2)RI)DPg+$&JK;%N~$QeJ?lk!k<*5^>qQ zs&O`ZFC;|M`BgF>rV!Z+@>fcd^MP~4-_CO8%d1_=nc^ z$DjtiKQsGOQ3FTIi#&6alY3NaU$wNf7AqF(*oB4tf6L@&A3K3t+;he<1qOD;fjGZM zKwjMifxVmbUS%x<3g>kd?Od$rES05tk0#4Yt!TiCw_r>+9`S^uYdq}QgzfyM+XsUtlHU6JDJ!#pLu?{3oNOgR8SZZOPKyKc7y)k zoW^TrLYIEHR(ZIffOf?x)yD3@XsV^cal!pDnGVxC-VU(r=c^c%O%Z^HQI~F7{Fqjv zz5%KrNWyLQ?aw#%WT5`-D$nF#J3YJ1nTM24ZSmmB)rb9@hgpRY1&5);7v1{wwkrws ztCP3G^p^^OG?{A)Yw9;^))Grh7qsu5&VX=!1l zYxdqWv?Gg6ut=$@e(gG@s+n=%aDANcYTVD*IHwI68!*#Xc6S%RjFm?~b9!%iUHb#z zHP}ke!^2aNKM^TSrz;&pl=xfOxrb&A)E6e_xVFy$_NpElKI1+-R~f}x`Vc${tkXv< z|FL<0XiJ-2o&8|i#7kb|K%#I~n;$f~-wi5vHd(k0$LEJS>0deqO1O}_5xcolMBI2~ z%Po(kp4HK(!nEb^DK|SR&!Q22!%PCgJ+*g%l8G>tIq5(UXl`bPkj8%1um#nTnxM0_{zl1>i z1tYA!9;|`qVG!F%%Oc*9@u9}{WrIfxey&Ma6%r>J#+r31Z2DU{ZKKj)dfbTS{PA)N zYPqmKf3oF`BHV*%q^|eZ&!3bdBO~YMG>vuEcRyF?s(>KTMBqhOWea>%c3_kP*L9=r!DjsRKSkcHq`jU7Qp2n>~OS?X?NRI}2y$RWn%oxf9-V z_>s7YJ&mq8ZY97mT$!?I>;aslBDzueUWTM15su25SlDqt!r4iQ@_F8P%?5Er<1v!= z$E0*-b=5Q{@N&A*t&iLL%GT{5Ch#>3GLi=747w}=UEgVF^OPWxp^Nc{{% z2Ad`VA9%F)oRsC_sNL<;kO2*LEskp)(>OGOX1KuMNn#EI6aTAY+|A$lablYY*7I1z z?AG}5=!*oIxb`wPw_n6$W7S)`tqv14Rsc}0hy_!E%%dOLCcMAW4{;;6%f9h@s(n}l zu^cAYXyz2j*LVq55ihH2iu2TMF^*C8HV5pFSV~N<^4T~Cc#Jnv+Sk>AT>Tv+BJYh4 ztQQZ51Hj&8Jr7&=JjcKJZM6Cp;fGK%_+bW%tqrsJ&rHF>a%cL6HwE=w7ii+woK1vw z?(aBwn%TxHGG2Y{OXsm(S`9=T0h{>IT$!i8b+y**Iwr{Am{W73LKQ?(I8DnU*Iaa7)~8O=u0IO`^Yk7sF>JK(nmjrQ}a z>*NB#4*`fx5^;N;fHiy?@gW%wPgDT}2d+qDL2D7dzyTC`R4k4t%o6hbGxDJk2xyu! z@`Vs}qSpRWYyvvPc5g+o#je?VviFjeyK8Vln8;HrH?7%Q{PBu)EF%+a%H3 zy|76#j&oA>a_!3MI_rrSHP$_0atLU-1DZ5Szyh|gqHRMg>KLVh>! zXlQ`OU9o@{_TIT^x>yAfWVN)fQGE0x8U*py~pR0Njf- z6#SM&4L<~eu#dl_S|96@Y?AE?XRAXdDZF?Tjr3WeUKN$o)P@G8D%%#Q-VHfzCl`g-vyBHX`9xMliy5=i z>|?mUA@~$t5}%NondpZ8$UQPz#5CJ4s&y*k%Vq~3Gnc>RJg;@>RsLCmJ;&$o1@lyT zyU{6XjvX`Bcoe$Ak7ozUs3dy+z*Td;qlKCtyPa|DRF~TC`YmpH)$R5kIKtjX^@WOQOZF53ZJtxP zpp!eEZplyD?tYfdDa2pY5_y7O|CbB5evIGzNj~A*@QI5^uX#dOJ`6va7o4^nlZ=Wm z*EZ0!sk0vQAgK)!K9&qIh_|!bLAm0@Ky{l)7Xyl*t0*b4=h3&@%_<~yF$gs27zJ@O z)Ay}deliPX;~H}}Ukb|G}92is#dSazXl#9CliBgOL z*4HoK9InB%nH_`JYG@T&yv&LX0_>ce8q$pXhTPoG47!>pw>o3msg!;UIZP_4>}V3{ z%UJdD9|N0$5xL`YZ7K0)FR>9pxIbZyLEeUlGXi(f_g+Ou@Bdi94ojO>IOr~KVOYcN zM*`U;7-kct?o_62*{iS1Mb~VZ$o(q(^g~j1WREI>Qz@2M?ZerHSk4^s*UIYV z@t?xLPnp`b-;8i9i3HS`x7jO$Vj3t~o&A_y(5cZb4u$pyrk@jRb%t3lJ4feeb%m+ zC*E@JY}sYBM^68kl?ECC(;n zqFws^q{BdqiBXd1W#-_($+EdGqMc*pII|H?r-s?AE@!NF)K9F;w2C-Keqdx|lpw^E zWnUG9o%`^+8QR14FbC+P6K#2l!1colBo6r9wN{;I8rd6__UtQ{6R&9=(&;COkB@^xu%;@Pn0bKt5HSaiO@M~vCCg=g&>&Z z{*-FY_PnmXK0Y+wTItKb!nS2kvxE~{1yIICtj44)D#sdDG>0A zR08^vQ@6S+c+C<9>YUZC(uYuO=&-G0_1K6B?eOt(y#gLYR2w}8g2Qhcgm6&|d^k-8f8%gVQ-wlacbUJK?_GNK!gNM$y;SEBGYtQm4MAe%QFEBVo(bBvQaBfCpW8AZ~t%XM$x;sReLvam%|k^j;XBl-GZWKCYta@!T6+QBg6tMaZt1 z`-4`}M;!d3NDa{7S32vv>%Wzm>9C(DKPSD!tdoLf0Qt!6`GNB)P_R7w-vP@7Tj?)7st1Nrf}{^0g9b8eL2Or zKv+!v#ufVj_z0s(cB#5{xRK`S^Bncn9tl7N&HfkFfUqRj;V{1UJNJ7J=7$YKTK?v7=ve5rOA4k3%(u;H3upPzvLQ0gP!j zcZUDU0O5V^0!h+3(h}2PBX|9vPuv}=M&oz#I*45H$NAbdTiYDpFut6TVS>ScMH8u* zQFs^-7>MVR$_^kGI$kj}^t!u_!@Cp^XIkI2(r3Xqvz4mmZx05p zJ?FRYum5$&CcL37GaxFKfD-!sCmTStYShZ#R%~`WH)4f4>kKiDSb>A706NWZ) zQ^DP3TBE%@iQ2ks75JUEubnNntbF(DwRVP*k}FVurB$vjfrx};@hoK|GzFY3idZ=+ zpMEYaS1|*OC7dyE`aX2#fwDtk~Rs<2&<>mMU&| z!Gq+T4#FYOReZ;=4gO;s;Azn{;t)x*l`+e@!p$sE9u&cV-vS3wkO|bojyVsa&)l$ET%-vkB}jI+UI+kg|N(gS!hE#VJ{h1s|d3h9njv z2Xm}y)r1ox2}57*(AXHpfr3vwZGn$$?VTF+Fy~I4th}l^ll~fHv*4N!Ds69wp?gm~ z^6{NpeXK!_#nCTaZj48zx>n|F<<{N23HlCWV6l1nAV)J>nOUeK!EpPeBkPUbb)K_61J$8Zw?a4k>zf>lmIIs} z^{ABOU2S0&cl<%k$}oac6UZAyfs~ZUk3vR_7{-Pir1FQ;HG?c1S`Un=mwxxEKPx12 z(p7$?8(fB&NtpsLe!9tP1kmekGpj_F2%)9iP~r||!+gWspu2K^aRIPUDp^Piag^z# zGd{(NlqOZY=QnR_fbOB@Np{BUpV;~SXc!UD3O35}gWwDGlboq%E9i4{%Yzl!6c{ny zFuN*@&~c~^ev!3j5HV7+3*I2TBh_&AxG?m!1I-9Mxc*k}z1n>h5MWFLqoYh37j=>6 zh?7oKHb@jm+)Xh!&P4d`Mowr#gWCPXWeTr;FG$%x)p@?eW_IEbq`Ggk^R z8J^b!3n+0*h1n)o)~f#Htk}d02o2+1xy{Xq4dk1QAw) zEm=cv3o0e-jJKfSH0Dr|1_LHij`Cp5fWjGPl5+y|0lKLqlz*q$($E8bnRswgu?-;q zYw(}^HrFYN7(eXCbzlwJzZBp<9##nA^Rq8gfi4N}rT;eW!h}Ifx+1@Hi1oj-=l_Y- zm(fu0z8{B1_rCsb7yW;x7M6e3y{G)g%J@Ie|8GmZE=K#=#Dm6w0q50Ur`?D?a_?3$nBF&?naoIjVRvmEk|};lJnlM2&1K8dx)x%$4YuQ)}wD z%*VNLY}3<2Pf~fZP57O#>Fr8SmK^;nlA-M=0bfjB>%WLV7m(m1MMR$=mx6NYo6ro+ z_xXT{Td^_IM13N|OS@cRLn3VP|IL>F7ak~L3E5j9Nb}-?#3N&O2qpyhgj z!Jrgfv>xd`{I@-QhOG1EiNls0Y~TL1vZpU-Gmp~VJ&qk{eJe#7fO=oYL1Mr^I01I)}&9Hti$M%zCXD)7!mU(-;khj zuWaEO>2F8zlhHqva1hILnmN@E`A-S*{FPpI(f|F*AB%&~aG zrOcHv$~4>}@o$NG%JCS`JTd-Yt5^STB4sj+_kk;eJ1v9YuOc=7gxu}jzONzv8_Rxh z|06V`g*(!J-Mh;t^sZG*x#Gp&v}n=GC!(0$O9j>by7EAjU-L~%M~1BLxXtn(qGai; zY;Bta+}%RE0za5|cwB6%6&aR1AF|ZX-kJU4=lTkd=D)XQJ(i$3|I5^g%kPZLOkiF4 zw5$Qw@c3}eK2MRJkyGU*9InTZ=+yFXV`uB*vk(>*#wIKb{xkh9ww0VIbq#^y=kE`! ztDB~qD$&x`)SX!agTYE>c50@1mX?-=^YSnI&G-{P8q}>C=*U)}gxKRv-uoSj>TDJn z;qzC?Ew@iyR=K{tLkXdvbK$X6ffz!BHmHn(`|i(>kToJcL*>rWbA?hUXO!mhJz$-( zmF4Unj0QSo-Z}uzhC9C{!&1+xi|l3VKUQ1X=dJ1wY?%Ql$3IL86lP~;EIP0I?B^yI z_NcbMpLF>_AS4c}?d1MfE5OvWG;0;n%O92&7P<yxCY5ID4 zdd=jwqO;Z0Z5@g~q6WePTAVXeY+v;j4(YhT&Uu7`6r_fRLO(-QMZ^wc1o+kyvo1jh99Jxq-A?N!$XE>3?%N5_YD zQywNJCf>^95REOoH-aGv32GFir0ABM;^J$Vn3!Ux-#ynH?d{KNGtBSrpPM2C-FLns z0accN5Yf7zp_fcAEidDvW`q&+dp3L9pvCNg|oC(8;8*=Ir*>#Wt#j=LHxNv=4M8mhE%Zf{Z9c0wD< zEXc^zMlSisURDL)itv|aRXWb#bf)IcEGes_FjZhp<0RhzA;!CnV^VLL53(9}{m+i?kmE!LP1I36!&Ofn1l9sU44KJW`0 z8#~`{FkH6C^dC64Tf*8A*_OK&ZNh*s0ORGY>zm*2vIPOwq0d7lB7_2OzdNp-s^JyQ ze9#OJi#^9SVAIZWL54Zqbgc#)II>=xwJg6-6?KWF6t#Q4Dv_?IWx3CBedzwqW*|0e zqgzu`b1y5K8r&J&nRRv+czdxpX|jC1W5szO4C2tzS5r%%67>^tpl9tshAp!iw3zXz~k2LQU$dA9Bwa$Cr?X&qL$7bEki|GWy?fi{?+8X%&&PaKTUCipa&D-h)(HI z$);S5t$n)#CVVkB4hh1%M{N!Yun-b9Z9ipNyCFMV;w=Ca{3&XF1AA=np?!NJl z9Y~i2w%_Nkz{i~LGja8Sm`5&DI}<^tVe{ea@JXoyNh$@OOn~p(Lg?pV|6%fpv@nQ% zY8jf}d~4}tPyby=SD@^NP+YlK%7(20m8IZ-N2W$=SkTCD#8>{-CD}6Ly!*}F!di}r z^ygylm$w47E~OxXE;W_kO9`AiZW;sEJ+DLfSf!}t+5Ez;M-J-#RO1rU2>Xp*h(t-# zi(Mzsq!vSyp#{+O66Yj+{zjazl>4~UeZi(R1PRnwF(9!<_RN>B!>G7%g9@3B%Lpgy z!y7+ZBEoGw$D{Pg(=5?C7LQ~tvetlYz0O^qZmr$?z83}0(Qv{sU5}SE?ij=2}kjGn12~vK{pM36r$;-Xk#t4GnqUNr;ITcgA2hHYU+yB^gec z?eskUa0fuMNk|GI$<5#gD^iTKZ-3HxiXGP;o=d!i9v?TDuf`iZPKKIOf0*}-cv9Z3 zD7=`3vcomzOcl+|3q}DOdNi)bO@5qB?_kX(pXRegY{PM=aUfSnP4VR=Z*gN%dx9Q; zKvA+`A7kU-w{3PP`yCt-9$fr3<=Vh{@}_mt%h*US2J^m0_2mxRss<(Pdn2{xcL?a)Fa91MJb`eq=v+iiMhQ zO57{Me8SuCV0SigY4>7)T8kQXKqEsv5AUSsXe+_xep?0xg> zL+GyH{9J_*nRa=(@b1kK#-+trhL+Ll?l+<0Zg78pkx6=iU$x7|7tO|Ysr3%}T%@WN zcl$ddV=HGTzjQ48o|%-z**XWvFj2S7#?yJKi4!eYEYAt*n>T#5 zbmk8~#D4xi0JGItSuH=VoEprL4U(V`8Y<ix_FuRo^i@&rL`ds+v`pm=;?3VG7mPgbi(eKJb-jdh4*xf`y(8S0Hn~x zf_vC%gTRHLcB@2q>b`+I9;xDbEQYL`1fbp~4=A`sItubWTBVTwh1Nb@LCWFQttOJM z=LBCmq^D0$C)>Ed8ToFmyM$Lqe*kyPOtFKwvIQa zXBQorK#bZ)dwUu6H`5}F2a-%$Rx52G*9X}^|LG>sS-IK z-i=1Hl*$fkiSH0=)`Vu4op~JxgaW#bFheyBFAYt5-$V18$$up3uC1=_YZJr#2A07T zLAc_so6>mFq6a1$c_Q@=9=xxFb_UuLs&E3eWv$-AYRfbRKBI(yWj-YJ@A0jnX@rM| zw^O-xp(!ceQTwszQk0J^?_aH)onhL0k|?e?7pvs#Xk#)RZV&M|K|0~TEW7*6&k(-B z##N>HWbW^b=kTehj#6QvE#$ePK6??tFm$tnrxcl#@Ljhju1_&sI)Za)ah6Kt#mwT& z{oNBBpE5h6iKwF=fZv*YHb_e2Fr+-bBDoquLtkb>(X525?khiA#m#z!YR%^}IX`a= zZVa|i!dB{5+|AGOuQ)acWjEqon;6}qDwJ7fdAkzxdTCjBy&gBY?>CRt6KwZDsYjEo zLT0yneJ(BkoT|<12*=ScQb`mf`ud^j7FTHuXiD`B)5gID-BVOtd;;x+e3_1a$FsJl zHPGbdW;f?lBHC~@6?z)7PnJj3FpVIJ3Ht8$#!glGms{Gr9(L+XmN3b8esYlx#e!_ngxN=&#&FCr=GmB3-TI$rjIVd^;gPBL9y_l|<1p zRzYPS$}0RyUl%JB4Ch1a>c72uMPh9|_7jq_h}9ZA7m@pwfp6y{UNZ@L$tRjK+4)k9 zV$f)D_%-R1$~?vK)M<_^Ux#i?udcpw+QES3vKh5^Q5e=4@{%|FIpYSbOC~|%oZw{? zezwVKR=cyuLa#@JUQAM-BzO)#fLvx_=jJE=rQ{4bH>0d#Y7(hf*@&J!*DzePO3b9)Ofb& zZocVC9)X6Y!QR!QMSCUUCv|x6JO%?`17Bd4)Cp!&cZpkxWqGzeG%bMwEHB48iXzDl zooIs)Fb8lm=DAnr}>l|M?pBE)nWsZ!?EHhE4%+R|V zIwYo>WCeA#tmNGgXxW@bbEK*B{0J3q52CYn4sbxcV7E1*57H}<3SSB(bXzlb$2wrn$WWVdBzl^A+Z0H5ibGpm zQR$t0{LE+?H_)irMZ)GS`-K{x9!2S^+JMEg^(FdO9%I9h?yrD%mVT`Py=?h{+pNX` zkWP;wI&cRFY!~Puyy=_9&e|<`{J zpr%>a7|2NvG*|`#N&aIk;=$?1P2_L?fCR`6g0C6ve9rU&${P1VAB1f zu$@V2wU=txPFl%n;qZu9xk_$m`)#*x7U|0*h6>%9UaJY(BnC#HtnAwfn$~8YUzZ#Y8V)ek3>dacQR-aoh=C zqJWD(3{-{V3tsC`&n&EcUy?c>j@*8P=!9xV`4`Oj z(j_d*5;)pel@jNSy&0K@dA|Nw^bm!Wx9CdT)&`RG_vFmkIqoAT^w}>Y0V(sM2{dz% zeC#}fa4KJ7b>FNZBaOu~G!ejr!w}YTayol&%cyd3Hp)^)9L~X+p_!wfXp*%Og{y^< zrrQbpXI2=zeTq*@nP>$1nAN&gUvaLPYs|18U}8a_VywDvOM?iBh!D9S?5j0P;5est zut7T)lUQ%*!1=tRTJr%8|NfPDNI%`dAGI}(V}#=+**u{b9U#g1`X2PFJz3&&P1ns+ zC0{&WcE!h(?K3u4S#2M`{SM9vvOfMlwAIIt3$&WDFOxcR3;o- zQXfcmKH0r;lrLIEX`(5nE7p8w2aXpeHOyB=dQ+e#PkVGfU|0ugrbj0=d6e%W4Gw|h zHe}~!R5K&6Y!@N?tq5O%6lCYrsbK)Mxb8KQIs$QMQsd-_;e5C2sh-3$9Ocr&Y-)Qo33J*UO3m z1+ey~31#3n%*^S0lAX;Y7*NUl@&NZo)0}wGu-H<(roe0h_W$-lCCwj2mw{5bv}we$ z?`rA5*>AbhIIQtr0aun?g`~m0sb8YMQfG1O)bNJrnrK z#lGRYJ0a3iJM_mU(V%Lx5G?}y~CL4uOf$*|2- z?XqTUnoyWP1>?{hv0`;q`+L)p1QLkMm!~3x4-g&5*`ET4f_bn8)nuqNRhs>*REoD= zurw%%O6bbzSBArh8k`d{dPTuRTW9m4u`(S%V1T#$ihDH5>ttQR-=io0IBd%`0*4BN zm^|Z`Ruajerr*NIb_WP8l%~UMys)LDbNv38(ZPzBVUmG05y~ENF49|B1q_y*F@xx}+jB5hqZK^0w{J7R*9)C3HSj;kGsgL>OV+hZL zB`j2taG_tKlf3!vDj}yWjkPmzHEt|FsLsIwFuX9RF>CS0v6sx$J)pUW z-Jp*XA+12Q$Ya=$HH)(nO0odz>?8#z3X+;HSAp3j&9V-Kuyo;GAMZM4xZ}bJmF@K5n05V%6W<7-q_@x z%!7e^#e~#Q*W|Qvd_T?B^k7Wzm7w< zo?NFKfE!%-(1A>tu>%@mbeAOg-VXiDzm3Wnc zILCCIA&^+FM3*ISrQ62%AArI;?K8QM-4BC|fEvzDk5bf`%Jv6{eJu(yfyxK^T70lG zuUf2gGU>q@W{7`H`;ePT>ZjH*#k=|B^^E1MQl=dAtVw{NapSix3p(0U0meV8ECB#3fE2Wo?YCWa**Y+7}$;Yc1GFL8*$gZ&n zndGffP08aJchFKG+=+TcS5Y-k`-4NDo*E?yJ__y0yO2n{=w!s@DoJJI>TGIoz;-~! z@IOe*+3fD}|3+e5GSS}_ZBlvWEXyFH%X+^OYYY2dVBJ4N=b_iw za2u+Pzd*+O@&C^U6GlFJH>Vhhx)|tv^WNmYz?v)UClm* z=3&&-nK<3|5LND)MehCNY4TJ2zwx7G-VlTlS7L)qlZskNX-;%h6q~qs4$g%V2^xQU z5{m4mD}{|yePw94<3e%IsAtaO7nx}G^6RtxG(ORb)K@}uBfkO>@NZ`;Q&Xl-9T~CF`TLDlV;LCfzucFRPAnA&;!PGIzpR3TJ0Uwe zsIFq7_x;5*Ie+j3Z`x!(XatpmauGHX5)!1k3RK@wGoQ`}I}gvaf`S5@R;783?t<)Q zdnylDBZ?IE6uk^rANRH59u(FBxhwqL?Iw9W16rM*y#27tOF^y1r*O&Aufp?ea#D3r z?uI$%@bHj}tFSe%eN2{}o_-n=3rosS{zwW|Mz5r#WSY>Z)X>>r;79~1^(%(x&+R(i zhlD(w=uyLks2$T15?-B6@-JEcIaQ$j4oEZ$}Ae#a$j<#z`uWuc` zlIu%RqbNDw=xQ#oaTc=cijP1&Xh)xVZ@LvCD*TWZY}@mW&w;zb{t+pdra`2Mm*uJ4 zaM@rxKcBwwshS;ezxH^q+R@~^_SD)zgA38YE~tqqk^df}(T0UG^Xv&7@xWsRFD-rH z>U3D-e##NPiaBX>5nX`9yizp}e0;d~I$WrkRMP^l=Y><(nl)`#JY^L+OY6#Uc860~ z9Uty)@}@eU&Wuak?CQ>Fy1D&)B{p~xwfWscMW8==fly934i%>5O@bUX287$wc`kSV zI~mX6Q>v}rcDm>rf5=kR<>loQEYUdmptYz~>;*qugzu{a-~Kw8{__WaY06HcMD*R$ zMgc&64Os8gG(;!G>Okz3jn$2Y4R%@!a?sJ4pohhYAY!53IPnJ`ys&y2>^*8>uNg42 zl(vQjL8FE+z&HE7>*&@yg_jCfTa~p>Va)p(PDp7;&DKENx80Ew7rN&4D&xm^cBA(9 z^})T81MS{0qjDhd@_ewGQ86_mThVT}^JYi3>fqkg-}4U%n=T&eQoS?O8CrH4l#epQ zd3Vx-3v6iM>%~uL==`daVi+m?lnKM!jE9B~|IFrubs(JfqP4ZOzICtop6^ToNsD=uD|<9xE&B5l_y| zCm$cGr$!fkr)5$hX}^y_$L={;bW;aaozza4e(O-A+o!#oqxL_nIr%{8&lV8YHHJqD zJ*@5sJ2xd{OH8u2oq9>}RM~{oLg?#=6NZT@=tUK;CUIo`F8)qZ!Auf?vGikG>_K<@E)26uI4ty_bG$7 zfX>TI3ErjVQza6U)t6sNmqzT2gSRNws;dHz>`D4a8hRS;c_u{6IYAfd?^%z|Cm!!6 zqyiI83Xm3_n%v%?Yh?;J!_8N%@SR77hwtCZ^}v`Zv9Yl^NVCvy4h;C-{@glZXqeK{ zx%7wrcxtg*9xmaDP%?JKa%{M{Y-eF-$8rqD=)?c>u#WrCmC9)xG!@0%z`6R`1%#p* zrWJmnPPN$LZp|ed?;V{QhybtQnC&}1!ky8chr)ucgdaZniq@xDU|b#6O)SA4j$vWl z7+*&Y3djAPdh*&>NVDvn8({5^l}AGU{kP_!slIuk%dnyXgu#c~hj4&{m0At3qLOSt z@k@fN(hOd5WV!4MEwW3O@3Qn8-TC2Tu~foeo)t`WKXLUDGe4SDy8^waF8Ev^c#G)D z`%q5&*45?%RN_}`0(lsD;Bu>{z0V}OUM<7+Iqu^LuIX3lHF>;dEo3zs;K*ARkDgzj znwZ_pe{HK~%7EIf3Da(o1+9&;qwcPDbArY0a>rw+b;+lupGTvFMAFhG*`@HTAT;L~ zipskyalQ{{$woX)MuJfSq*dHZGY%5e#VB8)RYcbl6S-P;7u#$T@`$n&JsmNApi6dd zV64wJn6UsR9B5-?t_6XgN-LzmlJrAQcG4CZpI0lJ(PVg2Ztm3XyzHnfjcrHM=@LvI z=Yakt!JxrnpVn2*Z2up-jW$B5w>fxb1h%KuLXJJV2d>=$t8pV0$RnWp`=GrCcpqob zJKgKMm9_hoK6vAtTF24R(E}7c%Nj#jNEt(TLJaX8c+y?v6EN6U0Yj~N7Fmg3T2^L- zT24!qv$VIwF&h~KEiFC_L8C@@JfpealarW9!DFz04Pl2Nv!_{xe>H}9Zx1H8u*t(d z`&94v-0l}2`L7|2@J8zmz=^ajbto1}7o{qJED=>@)-3L|UE0DWmB$rVa_*qjf^a{^ zytAhk!IqD=$+lm}F%)WRlSq)Byj}W`wl}1<76ns4Hm{#T$1&AEAkE)oZoetJ&1}{7 z-d{DX{MkD{plU1juFe@L?Pv3p;#qC<5&6;Gy&bBFEzF0>M_xHxmVlXFVAm_N zIXRUtceLL9+^KMen%c>4Z$E@iO@0SdkxfMPpZ@|VTPFXe_FUcS8@@?EB#ddz09DzM*2&a z^ea_*dAiooN5((pTfdt1%qgx38l2C*J>>*d!?mx5NsI&Dy(AxEkvKxt(;XbU8)C}A z{C~)MtAM(eYzs6H+$C6Wcemi~PH@-Y65L&ay9NvH1a}SY?(P!Yg1^PN-F;7YbKl?l zdSC3lS-WWn}RX7fz<2VKDYRXGzgj+ImdD1om{88 zDLSa4avWPWsOK8b`K1y-{Y0S)J&I|H(#+NcuBAX@5B&$z z4t*E5i@zVr4fcE%g_n^T(T@g7R63kpcRJUxdC+HrJJQK)=fHB1D{TFF568C<;V8=~ zE5+Xd-ibYOT~U4Ceb?z$<-T(S+rIA=u#bb;tE=nmcNPR^d(8<+Y(|UHU!6^fhvA`z z8s`QV)X9K9y}s+cmsv9Nq392SgT{B&-ses zZKq99>~X^}bRN?t^?A~c?j${x*cxUDV=%|BnL5&UkQN#gRfHcjM#miKAcHCi4{$lU zRY2s;0^~lpUbNzZT}i77X&Wn#c_e5;XCBfF^(fxTC0Oy?Dwod?s*17BK*(?D8tbSy zqUKaOy#*_hx?M;GrUSB@eWa{eX5Sa*ZkK4*W$-t;B%>DV-|_c>8Xq0%dZnMyVZ`} z%bVjopD!~Jj}OG~Jz1bsIfHbcFOmf2W11rmO%7d&1SHN4j23R)+i%@}jNmi1pNRph zw1CRb(9ih|q92#XZOkuAtcO_Ta6NZ&wxo9W*ywqM*4>~B%f&G#bD61LD%$SNDe8-{ zcXrSSX+kq_CEZl|?c}aycI?;Mo&@%lS`~4DdEiC#YSSwR?{|$@F6uhIj)OI`_%xIg z;+fZ3DasnwfveHYEJfK8!>(5o@B$+%07sKgyrj!tYPU#^_s$3@isZ^vJLT|@F#Gh? zuEBUDK&^mN+^kra5E-ih5us%JfiE?)5N>~Zx_3B%FU(v%0(-gOx4Vll-AAHuxS>?RBg^@pge==Ll?g)? zoa-p@(^%sVx=%B@;IIgeb&YGQhsyd7-$}C~3kNME*JDItK#$EYFhaQ7FS*)LISWyE z$1+vJyMK)DCiLepRos*8|6qA_(CBDx)vez>7o~rE%JK9zbtwzgPzU&Fg*VMp9xCXV%+DWlF z^<(5J%R!D#%TmVup>(Q@jLD-$fHM4dWAarBnuVo)Pk0HF=SCpLulKe?iMN8J@ej#( zNEg8>ct8=&Bhv`Xup_Z)MEESEsd)*)to1Q*Din*I!&11=$COK8J|T`fcXN~5oGMHJ9-3IY3`j~`6TBM; zlror@|CENJTazB}0eo78N5Q>uNqc+8{PUJR7R!2ZQ#L}y^19<%k`GB3xnnG;=)m>S zoYyh6K)g(PrXas~|D;W*CJBgymF)~;k8XT)$yWSM6gS9p#)J_bXK%bn5a+z^{bW+_ zPRUK9)*i`kNwBz2xw0+Y)FHxEAE#X@z0>2C{Ya=nu>7%$N`5_zAj$K{r%%31J&d_e zql%Jro4XXa7TnCwz;GKaw3dWR_*T-OMHO6RWxb0z4*}{N#=poK*zui~S z*$I=ff;E?Qtz*fbH~^Fq4mORM6d1%wa9`?P;FoWn`jxfY>`}V6gqLGf0^Y;XZe}52 zCV(@ms%rdO1r648N<5lBCkWNtAsB^h_~M5uw{ia1Mf8u9Dg~;iH6UbS3k~>Vf>zs$ zi>N0E)ui8usluq*tI8#uRN|}|QM9Hd68c|i`tBy4G!wI{W)-mT-N#h!62tO2>rljJ zR?9C&%MCsjU6u?OvW!#tN-mk5DP0%z_K-B@No*@HSdGw8bc#y2N-`*>Va$-u&{~zq z)@%j?k^!@x#m-faQ{Aj?syxb1aSbKO(&oRUFk?+wZ<1#+k^)PX{Txo*5Dr>MNDkOT zOcyKe!4_qS5+Y^#MhW_!)GkgV3}^NH4a_Oq(ii!uK2y0%9+DS74kjqJOMoR@rR=FLbyu2aPi{$&Q)_%Y{)q@vcGE3grlL zn9AL22kQrG0=)93`495M3Yf|rl`u$tn(`z#?-cDU2J;@VLyHaSzAr7B7eLAR03(=g zKw4H}5_Iu-Rg$xJx?1Qi_b^?U@>oh@D8Byii@EKs`L*nwx#x_6V@GX9B$sl5@|+{i zy^QN&-qT+WsM4+yoie#nhSI8{gt3gV!j7!5#xu<&P0f&%Z$CLPaIjkt9 z>B>p$EZ6wy`PRxUGx=?3Wtig81;W2oT`%K;9zqp#Q$Vw!#QYCkgW(Qpnc4ZaYndA( zq?|ZWsqY2Q$eHkqdM9?BB6Asv+5gKB* zK07-`8YG@+A<~54P8w;K5TUZ|_dTm4F*OFjAzezkAkXvW! z6ju>VNl~C49;+1BXzJ1a^bt#DP&5u7(&WD-qFxOV{g-4|Bg55K$xtEU5M*pTtjZXd zE>XI9EYB8%%(raz4vdW2cZeoj@x;B!U{{pQ)2X~->Jj1=BiC4dXTqoXKwxtA=o-90r~r=S5=_)60YZI4l?x4xql(y`+g zQ^ATErrAXsCK+Z&OMO|TTpo`&^hWOi8{2KAdZJA6&dxIwQ!{yj1C zPuq5o0{^80=~8{GOAIrwOVBk+$K4x5v3I^wPyi(hG@#Au+|C30Yf&q%%7Lww6Bbc9H)+YeTNHl8`#rnl%*f|I5_*_-60cfKJ+ z3_t!N;6NDsN)#v2Vz3*4ngP^Di2qA{;S6u-0A_rk!yR%o&)dZA>p2xwA8h=(X% ztcgBVzu;U*(aJu%Ya>2<$7iNtz8VPZh#y&&AcWNw+$L*Sm4gRrAgI{%t7! z^>U8L77X%kUh=^LA+Mfgr`K72m5oNI*-(jBNNeeR>qBmKY|spsv1wx!Gpb zerjUNfF5~!wz0+5{v~o}Z%4z%rd?CH2gr~9D$BC_b&iP8W7#oxYw2&SBr3X_0P^$0 zTU*sK(JMA9aTje$be<28Jj(2;{Pows=GBvHFFzBzWAbz)&;WvdX+5VK&XmW^wl^8ILzLpd4iUedFhrcwe z=O#;4eYEq>)!V2sc_HNTdd$6c#WS|{z1rSFY@ShwgjIR))HV6V`P5l9;%A$;#o>@U zyU6YJSwY_yRvj_mj|?z}tL^uWR=TJRl$rAvh!M-|byDWGqc`7Pi5ieWo#hxVa^m;n zY$wFC<*x*3en=teWXFJIi<6*iK9a0dmz(Q-U`u*PUhdLa`%^a{S=drK4JiNM34g!2 zk;MoO?HwRLssNqr2lX!34N zVWgS434dO zu{8dq)vg-HTRMxLnI5it4;cw2Rlx1cqgm-u$#d2LQ}R`c;;v|*xTw6mQ)6-Q*VjSX zva+&~9@^?bGvm&{ieF_vwpGY8+0%1e0-Zf)5%0bA7cc`n0{*o&|80AklUXlU$CRjv z(Noe;`GSn04X7DH3W%4RAv-rq=1(BW-)pVhA+?Joa>M{$g(hQc;ON!C)bF0XOgK8r zK?@Sbk6Jy7npESp&y-M(fHvr_6KgU?$`i)$52_N?MFWndEkKz&92y#$n&{8p=fjFA ze;&TU3JscU__=nD9JiKnc|6E!))}>Fisq@4&~7s4kvejK-^sePEk>0_KL+Qz?A(ca zOfpK49A5LU)6&I8+*c|qkJu*FgVwvHS_LEER|^G4s>Nwak2u9hE%jeWa>k6R2cw;L ztk|W;$&;4W+UVP^*Ap{LIc49O@5; zD9P-cm;ZSfgA^Ngtin?sEl$&@5i6A%5U2Nbi<)#zY=x6@Ws;sIX*`?q6s@DFxtSg6 zGbyPEoBb|a)aROMfTQZUTW1}G`r-PMP^bjSIcf5ZM~kNVWdmmJBPm3gPUG-sM%gXF ze6!_UEI8Y*mBkwtoGYw_Lreb7GPG~*=b$C294iRTM+*|pBGmRJMfdkX(e0oPV^=OR zFypN*6OTxb8h-Jcv^@srdNH{R%aP3uvj>TyRD*35i)fO! z?;PBnJgz+zL_Fa(>*ZcW>QGSsfzYsuvT z`DaomN(aGn;pzh>!%b(ZOSthAWRdhqkl@`thMlb8?bRRQ|(AtHscF*!+RjOJFhvi19QYaB5 zO4m(UIjT)zJm7S(6lyhE;|Bik@wo59$Ecio4dIm+V|&85ZxnQFA)9IBFic5$P4k(+ zYh^VcNaqfnRq54#8@Xg1`abgx-C~O3-SusKaJ*ZcS|%#!4|;Ur;^JBnp*`7D$k=Iw zBDrn+F|XGzS6wz>-iOH1kl3S@tALXuow=*SoDAQH#JXM?p53NX2djDCT2j(?8S!w# zp|Z(bbKvpd?(XlCaMnV~Btnek#qFAiDHCu_3TJ$G(_>AVOEAZSCskBX!Iu{GMGh4k zS`T2kwb7tx9S~*MOt;_OTm>194GxGhG?n`Nd;|UQl_Rp1gA&~!(DsQzi**kN&%uPI zELxvN@r2N3F~8IsM@gg_Tp6TbJ}N#@sd|o~AU?{EUI2$F+L7oaKlWSS{u<=r$_f)lrWpQuIOSh0O$mm<~6u88xavR4^8Dlhk`Akl(n z&G?fnuFbp-Y|ZfJZ?)S;BvC6Ee@tHRBSo}oT9Zw=a0?<;_i~P}QvO>62Jq9Z<2zO& z^jU69{pT4s1^ea$2gXp$tCo2zXG>EsM6xV;c4O3H4H+p2=Hr;yd5(BpodP{1`d%X4GQz3R$RE(Codb!(bf? zpkOk7hHu7j4C=2T=q&Znn=k|Ly8!4Hw>}T|md7Qn0*cBjm6{(C1y5@ENydJt;O=Pa zV2zwwY4mO3n=vplB?if;ejmya2*@Dmu9zC4?d*rf2HW3%+sOX;QW_i-l?u~Xbc!}M z$(SPrIgA{IjnmJ71q}vm?+q}j<4NWgT3 z0$@Zb?NB0#%;+$Y4Y&dWoZlLJ+c6aWu0|7jcu0u1{Eia@0P|`7mEQU$rskdqXk+ED z@M*RFUpQdY>jg!@zRYi;T1eu6!iHqb`kS+dp8$yRvkBftG{T92Ie`GF`__bc2VfEu z@BcZ_|Ni|g0Cb4>)rs-eP`m>HBOZLq`2ZwJJ^>KPmhBl(S^8E0-1&{^jc^-iiXjr1 zoS$$!-V8loZx8O@yZ6u5|NnJ+&QTrv`}-?P9PU9KJmNl_UlDaaARLsVHYm1^S5ecp zXZW`+9G8=yYO3$)@RVzEkk_SSf~rzcYdGcY%-Mq#S@pG9G=CpCb-Tfu#hQYXK7MGb zPtQWjL5)9Ut)3aUy}k}qb#-kNAwmx8F#v*Ai-Q9*6-7k@Gc&WfVSoJBtx{SPw27}b zD5$ixY^18Xx~#B}VwrgByaDj5HT3m=?Ck7l-xg8xofOPP9F>=S;^xLFKkex7Nk~Xg z2dZ8hted;H9h0JydQWDPEJ9dMH$PI zA1@v(ZES2zA4^tJGDa~E%g&6JxPCpijOxhTI?!EWN0q2YcwD~g1T&Q3KKFF5#~mPeDIo6DE6Rd>3}rSy}mdnJ-C#V}@cycn0AJ zNMi{Eq6zFGSNL<7Irq|t@5^f2+eSol1VD-SS$sVEdv872)7(#*_R`!(IW10cF)<6R zvRZSrADR~O$CBc^&? zErPpug)A7=F34(BEh>|zwY7_}9dS@WLxXH!Kmr97^)hg)qq+5Y1@DC)ir5J>Ffh>W z&l$2SP#s0e#U;hno+B0o>L9mJz2|y<)#843db4}%BGiGz0Je(_>LC%I7(e)M+D?zo`Pj}IBgcq&AvUOs{15azYsCdvA}F%j1)I%!hl{2 zeW2<$CEGRzWlJRC2b6etDt`VR5H! zv9%U3B-GTO$tP~_&}{}YPT5d2Ng@ml4a+=N10tVnk=C32atD3i;~V~FAw%6l<=kCq zvZ6k`On$t-_C{l`fpk8DeQxurLa`!cW7AmmxRj~+K2!B&g#^)VcbNllacc9k_?w!Vx92Oj zV%u5pjl*K%$YmuR9c#HOFQEbPW)($h^neL}X~ZA~!2(r}GBvOJsm%TNe>M=kDROcQ zT__5AriMN{9lHr~j!UqxvQb(j#m3V3>YZ_({k$JnN4P?yaPjhL+vkSt=!!7NN-L&5 zf7Di0C2!q-Y`E_RVNrLK3i2V;gW`sRvgQAC?kl&wverUvW_Ey*8C@8lpsD%2<>}_T zOAM)`wRHxHctk|R=IJSYO0uv*#Pm0yXt`BJmA@fXQB8^D^tY$#tc@D^n#-NBV5zL6_w;#Tq&xDSTC`zER6ZN z7fw&8m7rh?ulFppR8WV9pbx5HapUJQ8PJGj%+qr1^-r;$tKcwUD2HOoH zQZ+$01I{A_)mMF!jM0#XuoCd7O~KheEwy&UD*1j(i#WtAxwzyTDV z#BsdkhKEhkr=TzX3U|Z@o#X2Zl8$L_ml_vW7J%G`D=t(W*cA6BO-D;=t#}CKG?HVJ+uP=kpdwkc$73Z=iR!Y(I8r6neq*Kaa_JixN?bZ| z5hjaW!sgY%XEpV&s5h0U(dj_({Zf-+1J3(CT&}vKb-Omhi^8O+SQCWuOc#UTQXOpq z>@2$Mly?aYN~x}Tj^U>r>+47qbaeY2;L0GUqsH?4Uxtj~;$i49B%u!dlIoMvItDqiu--e&7Kub1Wc~NHLDI^*swu3bN zTSPT9o@AxfK1sHenu@vxclf6)FYO8x?wpK`|cYv)UC#W|`Au#7IK|n^G|E!J; z4knUkE|=LCl&Dq=K0iS+#NbSV2L-~S_uG&0RiIAHF@{)o3r|9ZNvx`UDgcK>m5|4; zA(o>`vWUyvPYx~4@bS^J!nOp%(XG~DZb4Ymq&I-d&WmJss*mx+3iAeX~~0*-1?dS$dK91c+eK3)_!REQHVH+B%iDkYa% z*_+;wumL~!ke7z$qT%OHdF4FshXhrlUqSF{NNvtv(h!IB+)?4HM>IbyGn~xqcHKhq?*wwWxSPDUrbC zbjd2sjQz5BufYTc2O^}`M%=+$l3ypPk^0>T7eY5a9s>>SFf`v;-B0*FwUib9#&Ix9^QCMwYP z)yTL6qt04**B7)slBYnS{`PVGYU0az{mbWaG~GDcmOrp66|ul+6v%P@`zMelbz zItU60>jXfM=_?F(!b?WOFz9>qcCbi8Kp)==FzHMws~1N#NJej4Eo35|@Q z{mw3d`TL3kq|yj#m>uks?cU(QmuUVp{^uUu$2HCghrT}y6rbeDLnrpfR4TOc0w!I> zAE*V;Wu(K0vPEExxu9~3i;v6!z36G0B>ET<+$12SA`7{TfBYh@qTiG9B@@TPo_i4F z6FF{UBS#g?@hEnjF%|PC-#Xy;Ai)Zm3WZxEdkr{7hQw28G-|}3&k$cCjEqgFK&C-1 ztE;LM(}z`5l!c5xvanM2;!4K|wP0XCGar?YpUmH+1?U#bXZdY%56|ph8e>gk4(XxD z`Gp!Hj~siH8mJRtYW2-=!D>#RTHYPe9LIH4~eu~1VTq6Uykk#73%gpabd26cb=QStz+Y?^${`=4LoUt+rgDROUsa{Agg#5Th}4=ihr}OGV;wtI z>tV!G{*3jLjiSXvJ*r^grd1kISic*4{XJap0H)2^{)FM6*3^mZL){3|yT&sP2Xy%8 z$)xy17%cn2=9Vm!LEjJIUbr`HPl+yuOg+k~oavnK`~w#g;bpMJxf0Ul6kNOScYGFO z0VfI*^b*&XuJqeDSPnLQrah+kSLLy>ImFOx6vx@VizvOovb$+#hT4Tyfsd-i*e z9I*6BN2axYhM_lkg9nQepi<_QS zY7FvqIT~$5%@Oe)n6nDyCcA99pS=)9Ky_XACrA2NyzBf5RS_w+_G}}gLU&BAM<{`JCKic zdIuA(K@&7HqcTLE>5-jp=a4TGhMf3If<-syvwofPeP&1}XmC;z`ALxo`4*4q(%9~f z0I5~}G{TptOY*W{H9m-Yw*m})b#DpNDs9^zKHgU;(gu{s=6J>Hrh=m2)GHgdojz$` z-fP{(vLHkE15b|*hldd%*aSJC4mdKh2BhfpF4F7`Fy7M^k(~#c;oD^u^-_vS^#L+Q<%7$Iv9lD#*q z3dM8XgWn_CVOw-*;hlJ?3tgu%xdcR%tN=$x7Gkcc1A_-c{5KI15d*~?_lmF8kHDJV zfz+@EHC}! z_aCW3w00Sz$&(U_ghXY(E$PL{eZQVE8Qq6LQ%2%hNmo=>_ce)>+K7rXlKkn((6HxT z`5}zfgMCsJ_6U4#3}w?m58|injM+}KqVBtc{v!_mI4-&xTvMoJF|bc(`3B!)rOh~n zNaYQQ#V@1+HFP-$vl=ClAZC^1e|pu|@JlE;pyl2X4C`L#&$`1ckvp8>e3Ni863#7W zgQSRAEsZlzJ)B$ve^9K;86Kt~{lW)+AiO53sn^@_xUdIoe|RjQ9u@Rj4f4Fte+cd^ z<&rgJA?S-j3p8LDL{SN-a=+X}| z&hlq{aVq%Et6o$ULJ$yNc?TuK&UWcF)nhBGGfH&d9{SW?R{?l%WAH&yG?5SJ9Q)Dp z5@~Z2G zJFH*b&L4WHwEA-vFrX>u=3{NIJ3y_~TqqWO+anv@E7!$zW3O&!rsuQUS{~O`f=_9w zasiHYbWT`&w!d5Gmp|Vhv@Ju9455(M#?@+`rzY4>!@_zz>KUVkW5}b|wJjmyPn033mac9v^aY3`lH_L#(SYnNZCO)l2Ger?_*82B%C8gh zxILY0d{A-0B5vG}>nqWRNyLMTRgcD1C{DNVXXjnrdop5S@#OXdot=C~$dIH0YCf;d ziWt~FO%ibA#72_ubz**$@}wvIxhb(dH}ncW^X6f7)oRmcO$j%vhOpmhwe{bGOQ^w6-O zX)t5kpZFktoM)rA_Q<>p%=tN*oV$76sN|Krdw#zOCAy(3l(uMniZC(K=B<+pfB$e@ zVoV;AXPpN7JjzQWSW2np?<|{^df}p1B}s}$-l$~tlc(|+U{1-FxyR5em+L3@p=ndb zADK4u5R|yIAS$7gG}j5T4skaWc81X5>Q0HR4GV9E!tlqcumm3Yy9Ep)6|-Uf=>)0R?*T70i8xIi=G1kXKHHl+(0Vmh26QO#)B~$_E#?S1d%PBMBbOu?$1F(%I=(MyD%Yn zkikA}u;-SsKkD*Y?=ipqQdSdL0k!v2vfLWPAg@vquystP{!DjWT0&<#J|@7vwiccy zS``v=)xg;k!f3UaM5A3=GLrVeo`_#D7C{Ua2IflpVf|#a+!AUz^j%*rCx5SS0#)Nl z1|D4amVI2Ol}`k{o>Y%{hl}M?5f69@aCI}SHC|QLVbd=1(k%H{JqA*voftkgAq5n zx3SF$eLeTyF*8i8^oYbLP54?KXHgVs5q`vB9$|kiFgHdhl*xu}-kve!ICxMMLMCeo zNml8gIquC)@3)vWTun8?}LNz2wShSf`)l&U5RzH7%G8BlkMXtB`lJk`=-gK zRQK*biew;qsnX=_FOG(V(wRO}j@)7-NFi?^%P*BTg@D;dR?7+bTz~iSJX;*ERAA{x zhY(O}cA`D3Pm0ZUZFJ>)b{scImlAf6Y18dzwJjYEtaFrKA7g>Gk1QzC0E1GG<=*}v zPFERuk&cRrdZc*IZ@jJ10zU_Yw9X53rcDFF%!(IS;NT^dJW3K8C{mXG!%2ty#Q?EQ zjs~44b^^VcAXOjFqrJy3d?z{jlqzG3DMYjIIFX91&Wf)5gCFEq)$QL(<96kJ5G=6SVSKCxa??D2y7yQv)h`!5jir?|ddOX}LoSj;YmG(7 zN&sgVx4_PV&tmNEkYwDt>MZkyTyj@NjID7D^1}Px1-^S=ZX#YM56No0=Qy#ig}nWK z$g>1_#Lc&Wm$ud-R0n_KKgzZ@W#<1lVsY;AiY^NIIA)xJr4Iazbo*JJJ=(O2Pbbz| z`imKLrfAE>*>?F%u=``;4Ie8`SJ#euI^(vhbxf*M>!AO1+|?pTesy~vnQkP{J18b#-1CQC1uk4w~hDq zv-E9-^IBR~(AUyQYrJCdu9s1+9M|J_BRMV^QxLp-L(1)UOUe+c?v8^!Oq|ABjFuRq zHW1EwM?0)8+(Z2qXY6tI_{*an2)LXiCdgpHx#(z~Npxrf-j7k<2yurIZjY_^d%nn` zw}%ik_6JPzn*R2sU>>Y8swxN+lVM?c2(Iy9Za3XOVXQ$`Syy_Bc&?t1! zD|aOYb;4`MYlf$*AQ6@9dl36!nbVn-kNOT3(KR0bZ0H~Dz5a2rM79Uq(ZQ+XjAJ_lyx6hD>^a3V?{*0IQ|L=#d!Q9{9Ez5z0 zGc;xHYpnkL(|^B)I{*q({|bqhg}UmmVDQZ=Z&7_84zJu$%A0ML8wlg#*iZI&)c#)@ z#RR=Y@_mp54(f=Iuvz;ChY*$Bf3;=xm#6Z#QT$&U{RP9=>OvF83gh9OY#tmiu6_M^ z0SwA3%>VBl{>M9M!q?03ZR9pGUkCs1P5u3yZ!jc?z1!0nP&8Wfe>H^(stXG$is?zq zuq5(^t^d)qiwhD%*Zzj9ii+a@{d;Zbz=+>#=+%Y2+3CMNJUb%*O!w=uv^4kszC91x zSF_Z1SYj~#Ya;*W$gOV(bQrAiagPm3n*aA8bqM)(bVpz_aWWABYwG6K7I8*K#^&zs zjePtH%$+F_1Ba^+a8|_*#3697Xj0N#j;q1Nto}c>0CH~6%7M8Ptf!&!Mkj%ZMMh4} z`an;ln`XF6)u*+`(Kl8rXQY@<=L)-VDYAEcbJag%F_&ALC!$iWMtFXHF8OgpnQZ9` zl!r2y8pd9Ed*&WD0|N;lvYZHPMe2YO`S$ji zHwz2NuU|qG@!$X4-ydc+KaA*zx-8GnC&R%bmNfOj_i=`R;sYt&r<~1T$*_qDg^{Ga zyN8F8i>?$Gdmw?y7l}1t0S*BnD>vx6y1$?7;^OixGqb`zgi z020QAhDxS$b3J%?v={@Y_*Pjhsf2`v#>U1fy1qOi=GN2*_xAMxFmK!M#YQP~T8&)P zv)EV^*R2uuyp~d}i_4@z07VzKmSy`^h<$Oh>TEk20EE<{OiYvMQqta$zVhZaR&hYG zi{Zyy?~e*u($4%5>!aYKN&OA4{L-&z4}YU<2j-i zflh{w{GZooUw~s!F1GMr)W|0vWl;9Fq7cO$Wg@zJ`Y6pD z9{+sh@P2M-Iok}o7_4stw`WAWJ8FOS-tG=TZ5Y)U5SNQ9Q4KZj2~Cg`Pv>!0L6f?6 zbga5fceZWSTWHX4B_Sah{=8kP7R3Y#$lF|ua=9l!8EXTXX|BURUUz-ok75g9bumdv z)CULkRBL#~(kFebSTpW?^0nM=JZ%k-P~lzO;UqHBmT4bK>7s#>CkbiE_-g`-$EWv7 z3KO7xld{=W!OsyyL_{QPY$`;=#4~aeXod6!nW^K@!}mx? zOVjY8>T&LtM;52ZIXHyZ{K7y^z`n}-fV5sgGF22uZv3msvC4c0X0PhT49cSnYWjyv zwD?M`MUv%mgTm&ffxyS(=#}QocmVo^fhN6YuezFfU6V^TOibR`DQ(w~vallP1$~^I z9i=qgn}N!PE@VgiZ)pgBkUm1jFjEji>3TN{XYWn!4A~*Z*Ub5<<9yFr+2<(|9+~M%5R8Bo$vL$0h5^BOO0o{E)on!L(V1!1kOInQG3N6UOR9hTL>+APGVm2t1 zLKzoyjD{me^y#R*jWW~ANgf79We87L5EcPpR!AHIkp5CblWxDCIkMa6B6YnlB2Oqa zFsl9e({>@G&^%mH1QbXHo;ecmduxXO>0{yM_AB&6y-&}it6j-GDcEwB(uMa8Zc>hl zT8qwZvZl1aiq@7gAe~+V@(p@5KE4}_=kJ&gj^3X>IXm98@+D6;CXNy|%Fj?*@d(9Y zVUSQ)Wp~dlDNj&;ciRy(E`SSPjov9DjE(z1#jAt&b0jT3G@qA4b(PM~T_XjHuBcLA zGs5$|kfGx2IB_8B3d-gYWr8v)k@kB2q#oew$JgJ*Clv zS_#L8tXvUDNiU7$0LX{pmWmu_wb4XJaf{n%qpWbLsb8f1Yns+sk24f~JxAJ1EKGE; zv4TclH9nPc;nyDO2EaCVj)l6vhgxf!XLj^Tw|oT>!*Kb44@zX?tXBe zK#e29&Hw;OieR=W4)PG_dw(O)T~pNxtr)!kL_|1;hz%1%Wd$8NfM|it{)gCLx^Uq~ z?-GzTZe8;tIBkFNEmdoiZo53BKBRGR;>8yn5&m3LGp$4#x9WCeb&h!E53L!2*W}^K z+fS@|#kQv>QhtLm+HnZjp;9yHb>xQ}o5qFz22w zd$J$a(e}%x4Pvy+)mRUOPhuO6FC-K7>G5$w;w&2$4(7Cc7zqcNwKN4*CqmCkI--qY zN>^4Ee?MMMey%b58WPtS1QHE~fScuL1WKb+mnkS%A8?KrN$RYRQ6nz1_oedb7=5hj z%2STrnWBH1U`miEd2V?lBE6r4dLkO3_Ple=PX*Z||L~LsLaVaYO?VFa)S zjPJQsKd^Hn#FaJMTWZ)us!;s46=jkhca_o|ZX(6A*m35sBL?aoKS{vdCMf=X*q2V9 zc0iQ!3H}~VY_yl32TgU%rMyf;UQsJaJW37P_T-;)(R~4ih1X1YnrRh1L{J;VUzfmk zBe~Sk@LM#a^*yoOnP6*L$;qtA!t4aO&Uz>ls!(35iJGjISE z#_0u~!TPJmc!|v@izXp@Vh{x*?eTh*w6$q7Hy1%b+Aa>Abz)*INDtpV^zl9a04f?l zZgl4;EPpV#Zh3@KMZG4`&ru6f;t+0&Z?C z;;Zz4M$)6ls=T|i8ApkukLj)U?KuqD?K$`NoQ21ulArCv>N2~!h7MVP%5_ME_d@Z) zsY&ejKCsvPP&ri>Fbvb=(+X(HtVS&oC<6OA!oT2=h~oZ?!M^~7X#Gu&;8hL>v6@-g zA87elr8j>)l0t>X-;WA3g5(W?ealrq!Uk#6LBZY)3*DsC_9UK!pBcuyxCu_BfH6<` z5{>EY{Zn#N@R7vV8`+CMm@F3yY!HgqQy@D4{7zilryfoaZ3=eM=tD8!I!c^_qoSZ5 z!Ul#HM7x+nR(3s+c!@jNW3YsT0l}>s7>{ZcB~01}DUJ`zduCHpN`xZzvA0Jatgp@t3Tla}@(o^g+8^QTXy+&t_D0hKFS=AS-eYZF9A9u`n~bH$wZ8;=N8ikF3`!?$3D(_`l{bzhXwfc;hV4;P|1`V&l=1-q2cKr@e zXS}v(?Z-+ryX15njx2$yG&fsx5R;HPBy~TXQLo!RhF3tK-!di3EC@F*XGnZCyX7Z6 zN>nBtNk#I@vqT0t9I7+kz%bdc%`AbflXE$<#q+gV$>ZUS!rhf~eX_tGMTKH9`ESgr^ zwF3n8Pf}_Xjn|V}N{4@of@te3XztrnB6<=FHjW_*$Ip*zZeCBWo!MUx6Rpzy2ZMPF zGYFMiI<`5zGtD|q`xVgz0ZyMCkCRt+R)wogj_W$e{OEz>7qdbj>K zzGDZ-IG~Hk>Boc9u%22pL%j)^z~YGiU4UzC6V`_^L(?*`A&ZAM2F8E%H>BR?FO1ex6Ntfx z8AGhvftx;)cB*6zMkO83BX|ucv{72^Tn1M1(C*ArXGn%TnjuYmmtUkC4wENTIs{70 zB1vq>T(*ti7^RnBj`56d(!Kd%o+SK`vE(4N4wZdH0WT6JcY^&CUixq@>eX-*vXb-9 zypLKq0TUH9RbH@?GB9jNW}<|c+gIq3)bHhCZLZu>>sp_MEd?t*-R@V7I>iU0E`7kY zY7Cx&s%Yzn?|l}NCx0;{!1M+>Iy#eMCj_);D5rYamjeWJ z^=9LIDCuGVz>e7RutVr=A3+Rr8!YW+ak`(FQ5{F;I8GQD8L?&$*|pJ{fF1V1US3R* zh5mZY{y81@Ck`xJ3VkjXODzmYzS7)Y)M&JsiFca?YV>zYYyOOPibMtdA1X>M8>YTh zI?SS^#;L_g7(d9%PNWEyk-jp4qL%ysMCMrFkTPwE*0G35RD}?*G-!$Om_@8 zAk9sdy?umSIi7b6R#>nOhM)$=l(sWhYS2CnEMYze3x^k@ zI2QxT>#Y`LjpUO61q+B6U@SUB?;zh`BZg#J%6YWkm#GTr33vT@8XC#np~0@EpOHuL zL%LHZ;l3d0keOu48p(AS5=7=ZcKF^Gu-Zf%tZ(cZ{_guMH4n(08^OG*XQ&6EiYEDX zbPixEe3RCX$Spp7EAvIBF#y&!jCpl0LqZ~3_ET>68LDvn!`IiCpL{_5tjNv5UErUk zADC-kAif?R-_iWHB&A!f!lXlRG?~?6N_>1iVl>esLg)FTOC8c=nP&di{Gw0qt<=mV zu0!!L?JU&ifzx`<&WU($vh$z{A$QY%)DS1UJe4bA{9&^^WK<>nK6>L00)bq>a|sP#y_rM2DM8B`bYjk z?)rV9SceOJfth7COv36S%qBufuT0-gj*TUry*&R}*D(iJq2~@Hmc4H?OITcScXuz8a!$hv4aY!!7)Dv1USy>(Fu)Tu7xOvl&(OM# zXNVnqfuEG(E|^%TVbn>aeK1EHki#BHm1cAW7L0wdBa3&wy(>6md;{1uqc#GH+ZT)H zBqQy8r!CsT0~A_ebcNW6XD5q$NxQVF;K<~rpBE1!jwsyXk13)inKC-v7+9xJ3Z{sD zSfS0jD4ZL{e*K<;)4FJ8kB5_%*5oxQz!J)tQfa@RqS*MBGlwjZFrKBv@t3k@V~e9S z)hqSwaF@3dX1G-JDwS4*Wou4;!h05*-Pta^-b&gEpzd-(V9=1Xrl3H)QCZzO zHXq7XD}IB)%s^$^h1t-=5(1g86Pv%~^bo%r+wLg0%4_xUUdM1=xMFL{@zd;sFqcP9 z%2Na5@zht&HsPDK!mSpNV-;xRe!A810z>C+#Vcv3j1s;4{FXI{VxbK} zU0f2L{q3xz6pbf=kuX08rK?qMKG@F|8lGiB~_&XHg)Y!-Y72az=h%AogKoXxfGqE*@`ga6y z2%8K%eHF+3DX*-;)zg<%i{~VgnqOG708xu`VnzO@SZd?yq~;YLm<&EarjGg5SfLst zM0fR-H0e>$R1qbP!J{Yuue8EPOGjb_p#baG52tUHTa2vAzu7PQdYop4fs|*|)!YqbbJw}OM@4y|Yw^ptgowl1R+M29&;=Xa zMaGLC|28yEIp9I5glvY4=!9%N`iJPqEPtAbQ`>1cV_qF?Up)GD(0>(G3Avy%q6C-> z+=Wn$0GTymh})YMMH7EQBujfXHaiW}4<9PtJG;~s@CSoQ0r{g z(zOXpi6PHH^yfL;Bd5=}B;ke(R5Uw2?I_y-V1gHoB+>WUa`MB&Fjh>glB^B%{gC?W zi?Mq%Y4j-V!Ev|r)PztP9_hmH5Ig$ax5$#A(yBTQd9%G&#~S7+`fU*2Kvsot5`BVX zDfOq1iAm)2iW}Kkv9%)SBB=Cs1*0@|q&8&A<<%k7AsYCSJJQze%jY&p=GI#pfB*%7 z8V;<|_XnH^wurqh7o-3-##$_i6@sV>9)-obMZ+%=LLB{5)5P)>v~(wRILs9t4b-iX z`ycZN8+!ucIkKJO!02O5AWY^j1IFp&*JEX2%7XrV#1rOlzToi3k>7@6A}sjTEG9ej9x@KRV2$Ms8<=gaTpnSidOcnT?;%)e%61#UW>GmrU zN->oqi_F9adQj0TRumQblMwgxGoe=9I=rsQrG^TftV_*8b{*erlKeVosu6@?b@rQ>xVfkKU5D*$9+3AKZx4LBU6aBnKC*l}yKYP~stT;wT z&kvT3XfJLnHH62B^_>}Vo7v^NJm~ty8s1X`15KgI627%jy{75T6B^ROzN1)~-xR~? zi!8NF#)wmm9`C|lO}m<4z2$n(3<0A~FRhiSEL%A=dha;HfXCBt=lYC}8e8bs3e>(k z@wXdg*#0iaQZiB9)hLlP*n%aL$ws*Yui!xH?&;X{YSbn`oHhzG8RW?HBTh{g_=QAC zm!@dPgJ8)$E%l;o4%-NY5x1C8a2huCaGu610&d(EL&j%!c1UV-?EKgR!-gU%LV8^j z%^kL?`6xUN&+xd&4ng0HM-hhhdF3p&W(|2fpNZ??1f?tUUH=<)F&2&0)@9}s$4!F| zYY;0t+KY<|-O*UgxcaMN4p#|*Z!YG z1so%hcPQh`>7yxb(Ia<-{HPaSC5l_r^^gl~v@M7MvN8OKq;`+E6}qDP0SP>mE;tV&o%)ZaNW(#%M~(*f*;)RBc+5;{)FDN~%| zx7F2{N|B**zrKSxgo}SbF5V`=N2r4e zocFPAmvSX|^(c zPG2EQ-C5C7%|;wDn1G`sZG86k*5#BKi)*}sCS~}?-R+Ds1MCib4g==oA2n)-Nh64H z9tdZqw?B@K`!)eZfw2Wq;gSL%#9fiq!}8=_rgBr@7ilqKUY;5=z_J4(Op+=r)_rZ^ zfuE3Y%jB~xd~#DB%*%?;yD(||u|i)r zpYy1IyO-^ejjf8WER4Db!5hYz7Pf0}BswVC zKR`PB&DHXW`qG575=|Bo4Fg-xwwd0plC>_%XcLo?TD{kxY%fc>hme}XVQMNG?hW6p zKT<%uheScxNhF9f_>l3fZO2ZXG9Wn=cuKs3}y1;X~PYP6zUvrN36AYOX;uj@OU3(E-%|XdQ=LYK_ ziaoM^k_OMar)9H-hb+__TzQ`1@<)k6Z%3TO?|-TU!0uMm@}gx%T3%hP3UmITMXG!^lF3)8&8D8J&yFG{!V0s+(SR{x zV`7x2As)73@Cw^IJMt2}%qI?D#A)8_vEuz)#_yJn#_}+ElOG&DwzJb6NUa(lqRR94 zCTY6~!3s+8@cImVbazc-Ywc~;BEN8M;SnXJq_%g6j1u`O(QyV3mAUPRVIJJ-C;(m{*Y-Wi<0-53G2mQmnz7Pxs}*_wCN}&CM{ZIE z^F#WV@i zr4|&g!kd5|7(hokwH?Q8sRCO7}u9`SIc%KX?DA@JXSQ4lUrz2I46@Bi_ z0}NP3qQH9i_{`%#sS@%fl?Kq70PDz)*(|hZ_fRAH3@ztxTC_XyzRXNa zQqozpq$O8HPkF#amBdf0$!voF*uEx*g2T3_&9ie?hhp>4%?)4WIO@bnh5n;W>B6Nn zIN>8n_|xS0_g-DZ1XGi~Q6w;fmuDb#gn<}DU3Pt^R%^MjxmnT0<#m&XNW@~uI>y&U%X&7}V~57XAx?6lqQez5plyHO7*hFN zDpmMpz#&`1tzXIdRk6bxtz@^6KSm0++iUFd_#BJ^PvZ3Y2f+^6H|L%4f=x^< zlS?C)Aib)xV%VlBAN{lx=e1B6*o|e9DQweC8uF#B4H@%ZJn?gaH!KzTgAZ3`sG6Tw z2;TXII__3}rZ2tqoMDC=XTF`qkn1T4Yn21V?nYJ3kD5-VfBm4Q^7VXmIN|^MJlE%q z^O4)9sDF;}`7Q7q#t5mp_*+T%2l%Upf;tckCC={i5LcJh)W^mVPg0AHUq(d+&%g*~ zCMxC0f{tA1&(w|@2sjHkp;Is_Cww{9rV*QOzPfb-N~!Ieta--c{S*(A=_af(TD)Eq z(nSzTsZA#}rRTTcbWXY|8wq|ot>)?+7-%f-b-i3{f1Di=2hSgqYT_Qq% z+ssbb;#?a5gL;O%Iy!`1 zbUZv#YjC_W_96GY%-oVNgjjOCUD$#p^{l^1WQFx8PC5rb&2c)Y?Y*8J>NvFnSW!6z zF#Dm@iItz1pHIP9oO(#ib|^EI>VkQ+Zk`Z{z$CE9;zJq6$90z7&(cx{29}E45y}zB5E-&Ppc4 zAZ0P${E4x*5Cf}%p_0-{FoOe&NFd*^6p|DeB@iS;OOWot7}=jZXqDV>kTb0%;LdHg z3oO1C5w~2t2W1M<)VuxxI8rB(zNTH%YnCZW)oyC+$s;4cL%%c!D+nvi+EcVRic7g< zBV*i%i8`vKwDU@l$>jis^K(NeVuVM_;gvM61I_S{055KSA&HPFtSL3@{xXyiW)*4} zGTXHehmf)Yq@kvkkEiXO4+CgVd_>gE>+I+-pRY2gGu=@*2vePaNx&ZTg$Bm1e=O|V zb2|8D1#|TR)c8=6QU>2SW@HQd=^#*m0w)Sa>7FJGx((TAZJZYh7^dGWK)97Jw-OVb znZn0-G2pQI?R6_dp?uqJch0zxrT&-Q0l%dCCV6(o?$33o5CTeC z0Wgfe9IoIf9NKlAFpkp-f_C8YY4YB#NPngE&|UqX1z2Yy3Mc=iZEIK+ZItT%kfN_} zcbYEBjqBU~*lQS#N7Zb6_j{eq+?X|dq>a|SZ3kc;W@@3WKz!Y&Jqe?XUI`5AfDHQ2 zpVRf?EYm{n1VPC>{?3bVadakw)IfV(*PPCPo3jP4spd6V;_uB2raS-0E{qA`v#+p& zdT0t}(4EWuaBxW^&^U!bIUg$5XgbpOaRP)lScYx2XrQyB3;k&%;9~A{GtM=;-wA3Y zG4gT?k(sSf=49xEh6K*r1e_94h(_>ZG19>FW{vTeGb$Xh%r7(!Y8adlsX+L6T{}ii zvRFtcwt!+c8N9#RpEn8Jk~+KF3THp431kh=kHW3Y&j-2R0llQ?pk01cqcDlqVuZuO z*<=E*>!r11L?yxsTN}5&iE;}q+QFfrNHL|+!jFX@f;$amUSYhV$-n~^PR4WzY^yQ+ z!mjwu&5vOwV}Al3A>^XI1T^1y%wWXK8T^peF|#F%pogGWZOrq5O9vws2BDckSgV$q zC0uoD(2v8eKe}LWrzaoK^1z}IG0yI=K>%V;c@a)dWyO(jz`P%JeTGnW ze@ID5ahgyjg@y{Ua^Ln_+F=K?xB|ss=nTLQxOcRy*bIx0D%z|R(=LhrB9hkkg*SsZ z=|Qg`FADKlmQx1F4*pv*vxA~^A_uGVm|bMp6q3o`Jyvn=onY>IEUNbM0!sJ z(tM)T+R;oHw!`4Zr=*PC>S&;lmTs9<)k4zPAtEIeHmJILG(T0}pV!~anBeXXc=s!3#Kke3AqsQ%wnITx7w5+)Aah6T+ zj1St8Z|Bpito2WD3+)}^3OeqJqM+zVT8cEcK8sGxnDFPk@qCNIW8XgWuv?o7gAE%$ z!_1Y%0CnZq2~ZtbL% zDo?KJo8x}m**H+L7!Iwl=sU&vpI!P7_&_>jQAjyCnpD?;V<1H!5rr~z(!+HexGh!4 zNVc>fRZ&AU4+%cB^6^bhrZ!yy3-r0 z6k-=~D3F_-t#)d{T;9thXni+s1>nc1Im-KfR(~k+if2U&v|fy*SQ>~Jzo>mR0C zdl#L(i)q9T{Uyu8TN)M_o0@TO!AFdt@tGc#-1xWtvpceikrw-sC16<*v4L%Z7<(mA zU%;P&PPi4`ktK>&0mEQ;0ht2?Hu{*p+D)1FU@9~n6 z-%b{_>ku@cT?+RY2)4HG_ZtO6oNtc3T0g%+x>DT(-JDH{UKS&BmPY{HFt$*cH4!)^ zx||SfOygxFIG0Ap#s)Tn<7SO(3mU%}1WO>Mn5?E`C9#dF={rszf$$XN;&R0i`%UMU zQ5AFuQ2f<9OFHV_8{Tyir6j+N7=0`m2bdxbetJc}2BUn(U+!^KjKO*aWM;EW3vK53 zvEQ3Kq7bV5R&n9`)s|xl*%{~<@}DD6Q+}l7r?bec$Ieyij6`u9L!0pM(d!i$H*yAU zW}r}1AR{@Pl<5^Qo&YA`D`$|qrj|bAJGJU3Ka*)}jmtrz+!-#sH7SstSSVEo?XZfx ziViYCWsa2`Mg?EcZ}pn52JOhhvSVZpr%1oIOU(}9qrarG8iIyBu?~fXHKU!gQp2r| zWr>C2c5d=OJR_z_G$5Amk%UjWofe3Eq6BsP(O5&;TJAQki(n=$lFoRXwCb>o)};J` zlMQMm`VpOozCHN*jT`ow^$=Y+?14k(Cqb)c9@Qa_#fuwYA~K1CLyf=6CbPCtfY_r5 zA`{vEr#%J~TB&`t(fs<$T`uzM`b}5k#KAYMpU)z&1VM;*!G75pp5&K%hv`(4A1RY- zxC-UOgg?4h(db_9^bA9;dgpw{mOMFvNa=qLKKy?FmXiy$^b4SBm`IX?c^l_^y%-4a zm;ID4hVS=a4|szJ$bUJP?G~4tXR_))cA0E+Q=Hmw2@Ux=8fsMV$<=k0SjijO%6HR_ zSI891>&ZonRr>LCGej&x9*8OtAhi~{WwW~lx%B)bh#bPy5=$jtCXPcSQM-{Cx^~>( z2bD`Ae@{h3!?LcFg^TY+mng4VHZ->YwFcg7kA4oj6%eUi z%Tw`;KveCVZ$aZ1`Au;Q%A`JzgPdWg@WXOnY&5vUyssf2i)e*YGb+i+e{sBzN6@%* zk^7mwY`@T{Hj#Hwi z=irc6;SE!Jxbkz_8Pn!dYgeOi>xug&>vafpmk<#lhOW5AE7`Kdw6@U7jYi8^O#1l=~kAr37 zjsgI+C#kh4Eu2{)Bi^_?Hk!G76?JAQQ-=sPVG(U*P`5B`Xsmr$= z9+8#Q>}OW#vg>t-L&$~oSU9RRBrSr5pQqs6!zXmLEPuWVfq>PP2pJ(<()2-UM+wUo0 zDr8ja>v^sRCKAvFmAI$wTUFdOV+McmIiGCn8qCg*xm1*9xQvWn~iz9tGS4iqh8P@?ZsiSHkD~ zI3GEyNwy$bSO`2PDmjVDVyS*70ZuL+L&?l?Yw%EDeB6MRLBpcb9CK3YSOX4Rn>q|X zePY$ZZ`IwW4E&;(7EgU~2FfF#f!}q#Eo7&?IPJTc3<+GDi4vl0SvxzLe7Wu!pLutu zXhvK`An!|0zuqB^2!Nv@h~t-ji6Mw{G$K;^G4jDt^t&&Z()_MOQCLa5RW~g=yHJ`1 zCWNx{8YkLSUQsbBRPr|g02c-I!v!{K3$hTFL-Zb#O~LJs2^c$Ch#CglT);frVVj;` z;>aNR;<*uVSYbf`GW{4I)u`hxzA(c8G94*ymJ&@(CaA{F8$g{CXx&dwx6<^az*A^D zH%9pd=cAXXzOf%_#d3tSD~y3%2FD75q-}3Yn-h4kv&_7jmAj7l?o6_Gyx5hHrClgX zSOd3&UY$G=Ye(kVeu)jP*xe=k0tZfs-RHt*bfLZ2`~5ZAY^I)DlMjeOJEx|u{bByq zMFm2RIhwGyw6OTE&9-}bhBzOD@j_hQ8+4xuS#9fteH&8(B-e?JE0O6RKyzc&FF!YX#{L!nCO8lUJ-6}| zWRcZ5F|sYNZ!8D|u=tIB!)ZdR!coH5>2r8}Ms^|{EgkZ_VqH#ie7UJEM0qYEUt>*0a`btasr|~&zbhA7lkZ(9E2Eqnu69kMqoc{HlJ%5{ z0I1t`tZZx&ZOY?1Y8Yi?G=IfVRIk{-v&nBT%qpq;@cbd^XrTxPG{We z{UqpEqDtcok6&Kh&{u%!f&+YUVo<(FO2jK6{9HIzab%_1 zfOgS$=AC|OS-BW#PCL~TrXCRujOgKCzt2_+LVm4ULLFO2^QoW_mo4%h+C^$|ks5gc z#Yjdcek_taG?B-S<^-}(z-^jBgFgud9sX2_+tt-NKd&Ym%Q@n6t9$iupcsUx(OY3& z)2*zPqRb^vkZC0Zxf_&votzvW__`QJ$nORiTd8guR>y@W$om8X2P+ejPk9R~_x0Nf zlGi3Ie+gV+yPOV{kSG2GtQWV?rsha>urRe885`qF;w94ri&2V7>8!SJeXZkPyr{dp zmXRqY5vNi*wGsd$;j=K2DDNt!Ccmyi86eh{*K65JVM$d`cFQ5ZJuV0F(=PK_m}<$? z?o$GSCSG%Awm?IxOG_zJ-1Jk~gAdW>3okVTZfQ5(noGsJ#*2=xBdTVsH4lYOlv%+L zMqa_<^5rch=40CffJMRgcdUI@7EB8$f(GfA2gi9&593WD4`)|1qic8BeyeOtt#BM# zf2_)RYQ00S9B!Cymj0KPc!~%&fkfP!hzL}I$ZLh7plH|Z zhr3{&Jq1@&Wg=?*f!$zNf=Io|=9c_3xIvsfzU-MF%E$&GAo`)rb^%r;QqJb_(7euT z=lcmEHvvfvkDE6~D(f{LDUA?yUr=Zo%D=Y63h^K6679~{bd83L(&8U6LewW`^qS?_ z6EI48LarMrPr|QLE?u!(?BrEc5+xX~ZNy2nX}PIUwb~$HW#t@t-qt|e&^rMLqXXk3 ziBhOt55-=RnJHO5JQM2WgLnf%MU?#Z#o~z?<=fu_{Mwu9Cvr%6xUxnX0i#WW!!jWd zGM(!mO0C3H@N+^Z#wGQ=cy%8^Swu)vn;^;0CJc%U>R`@cXS~tO9pmy*`cx@lF!ruB z=i85EGA^9qq@rH;*%dyp4`{9hnwKb;c&yLV_-JHoLursv<}#ca!XN)tiD!J|QvTWfr_$^_6LvuvXo&|Mo{VJrK&WUR0kY^s@WA2Nte7A)UN&IA887# z_n)qO{+=oShsnC`A!Yp32G7T_1xioI?s_^|OR^~k3bvLg1ebDT=UZ5s_Z3gP4ujyo zt01$Il)B_pY0C5S79cmAmn@jAvapV>1J_eB-wQ%5tenD`sALVb5TN?s!Msy?9iFw5 zVelJQY4mUO5iM66HrMrID`+b6V8+GyTA#xK)I{hnBlve*=kTLncy+DRMkNM^m5jV6 z-HvB)S}5SZ_Un~ztv#JKb6Qrto97rUH@f;gC>`udv51CB`I8InEqS92NDwLD_NDOB zcTG=0Owj;DI2XP3RSfhwnJbaxq#Ufc zm)~tkNk9d9j(#T^Z~=y(UKFC<7D$KmdH&Vzxs6i>v%3!KN4ed@&=C;(*my#vy?MMm zKNGF$kdMW*6>l?ZoJ#@KyF4avrZ5DA^}QVEUS$GrmP4^ zZ;6RIx$+t~Q|hgWT@TIL%?2gk4oj~YDP@CPPUF+kDlcEN*N8yIFe+FC<2Iad4L5Z2 z<-{@cry!5Tdqw1LCSPaFn5*}WHn~uaveB0*sXW7odCREq+2fid(!fZ!M7LiVA6UR> z}f|yQ1U(~X>}!tmoSE2Cl}-5D{~gn)6NaVd~~wU(-Q#OOrH_`;o>A(icJzz z7Sn6K6T#kQ+&h|BvVNy^?L;{VL+~1M+~Yi6dW{FDh2`*Z6k<}-eYmn~pmj*PzcGO( zO9$_{Fh``aBR`;&P5J`NW~@ICDon4g(v_(gh$mw>c-|USCD!<-e|t?xSfnvf&_ABY zp6+14&ipgp-SFIbGV&G3KvcCJZGhsJwB!)DgPw}tj^=<>1j&4Ka!d`cg4p~klEgr4 zmQ&eBYekGO0*YQPQ$40f03Tlyb;l|^=kF@4g&o76Znz3Zp0ya9r&@2JzA=-%P7>w^ zU>myiHt}EtJ5PbF$1Y!p+nC+reU!t3J+!zU58qWlrlOy3@mi zvtwfP3*Yx_W1i}ayVls-$F&SE->$hX5_pf;S4TheuOr=D-B+@_mSN=V2g|&@WZ9!m zO=zvtt`pDETL^tbsPkmb!Y9kzz2m&8Jb^!gMn2$!z?ezsdc4gTVi8iQeu;SswTvlE zJ%(nMIJavWTJ`9WLpMW$+BybyugT)Iw=|*RJfrCqM}zl{#+~B}jkIt(h7Ko|%KFf( z-1MeQt4*pl;vk-gwD-Q{K%91v&U-koZxan5X;sBU)N%;1 zP;9XpL$)774~iD!m<)NPE$P+!0U;w==nAR#oo&FeyTm`&*1ro0{N0Sx=K*ij`XZIc zDU2-5I9YSX6$P82X==W{(Tn85`_Kn5JEyI}{sELvjV!JeiZW6tHjfnHR>mx;96^}C zoNp#n7llIa_{rrp3#7s@{gBn&q}F7UYq`8hSr>S@6qZUckrd#C=64uq(+}K#fw;Mh z@I->B{WjMlz7$o;byhtD-WJq<(-+Lh4P4NF14_?1A3EJ2Vf^xC^w0$|VGdthteKYl zYGkV%MzWwVx7VkMl*wH=7Z||tH#xVK_5~Wpjh0)lth_yBfzU8|Q7y}A@|W8G!k8)3 zK=Ty|i-;(@{YTOea5Ccr^}%9$SlNl?)3-@v_U-??k)9E?&7wRM=c@MdB?x%lO@eJo|!;_o#N*d6a+x!fJ#fH$IRWw1H+$Q5VVO` zu#Q?I;}-@dCtPy2a;7pKvd>&j+Gp%0wo*TqjQ}mzl-dU~<~w%YSnj3y3g^5W_owF# zN83)Viaq=}xybO#e&YX6{fD5ts8=hl*>64I>=~HN4idv)lxc-VHDk#57|S;K4HwMT z(~7q)&1f;i$|7nO?yS+)90tgW!)>*$WPP8`kj73l3KNt9z2#GGvRf)vudF6a>(O(+ zR}O_@>Pk3rPmVTDN*P=Co`KS>ge2<9i(#6X>(*S7MAWhUMw4;=^R4l#k+61`FC2VB zhmhArLvnIzU*|ZcUZ;1-*Y}Oii`VE!<&~#xp~REEIoC;UY4%RP>|xcJZN2y$O3LT= z9$sKd+e<5=+si~w=hxq#`Tq0y{;st3?Pf}o9@QLSmbtk`QrCzCXtp#SBNA@WesyC* zgHn|~TQ0qAW>(hD2y_b&??Q4ak}9Fj1uBZXImVnPckS_^=+fjMA_SUw#xk>IznSZ{ z4G@zI?T6LWJ8_^XW2G=7x$8XAIL^(-97GS|qK`!tH|y7YKd^w3GP1ILbHjV;-*S9U zW^isR0Pzi9zkEq?+2a^JHCRdkeXFc|2eevg<5Rfd+y|r3F@Wi6Zzq zmL`5HcYSd&aKptXaTz!rjHsq7pI%&2Ebpk6pF}rH_)$Yon+XNWm%oHO^G8QL4-fAT zmFK#W^MuT=7H>OB$&%&6!rtMwFlvD5?;ZV2rd+&FT}xpt9T@-r>iSwy)gcZv0Apx* zXWqlHGqK6Vmz(OfH;IF(?(v=<0v^K>rGNj1YG6x3x)M9{gNtq>hhrpT-f6iau^UPI z-^X<)c4TY)cFs$VU&ryf&sYJZzP|j$5~DvEb=oUc&-%Yf?!Rrer)==NTrBKerJ_n{ zyBrCuh`$P2qu(zp8GJ4^;%&4J$}4PYa?g=Y5*H5GNaW?^AB8bG6VtLFkVfo6DWB2l zk|O7!yGk@Qy|30C)377v)5R@ zzJIvi*BV0oO|n31EI6-NoX>@fn0R*d;h*oKMmaj@Dmn};lIA!hIM~>fKfGJWmNa}=zR+{wq2pRjqTBFfI3-WLtJe1=k97EU_3+7NpZ-1cCsuv z4_5bNoDX*xbjuLo`1$|RUNBw-{(vsfQFU}v?HY-?eq~nXtly}38GFrQ|2a?}#fa5> zXD2Z=l|BI%*M`*n_!pD44bY?kxzuK7dU`S3??ue#jDlj`%lwXVTXIs!G7$7C(U_jj zA|a7Z507psk!^{seI@rGWB%y-l~T9Y7SYeIH&hO#^M_4KmF;%TOX|H6Lh8i>)LeUr zc+`+=7p$<`8__|a1Rzl!0s?IMYSf}N+ds~EILtMl2|Y-gsAZQX5Pjop!wSNgMaDng z{i&0Ymd5~NT9LjUkl?A5vNX3e_U=kfL+NpBS4COQ!HH5(ROGUv8hW#u*@mA#mxsTe z1rsz)BHrM_!2KNJamn3g+dltwnadl;%i9|ab7>^>A`Q}2DDprn6qISGmDfTpT)t4# zdqbEYiBO(ySYsRnqKD!2-%?rMTL@yTwpR7LiukIlL9IymdVfvnV7rZ>%x_Xbt=YIt znX?TE$L_Uk4}chs)))rr!R3Vi`$y1{M4+MM$B_&YN|Gd5t76iRHK##X}EzK}^H#<|%#-$-fR z8GD;g(^kOG;OHUak2@CkgXbB@zluD+cduZplx^|N%nuD2z%VUw*l02h6ipV0_Iz-q zI(2b*f?f*j2F&wadpkQ!3-W1NDDIErW1GG;RCNxqu`xDc?lM#{h9~`3Yn#06sOSXMKd#<~^ zDg@pfKgp-E>S1&jB3`q6mb}N*bR_1(4dSi;D~yb=rEYEOkTwztfW*Z9ydozx5W%Hr zFx}xsMFS+G2f@8J_)PzEm9yXCqgH%gb)Mk4ad85NMu4DN8Ey^s&$GBlU@1Z^Ol=~v zf2}|gA7#}aODx9!LXseokJhmgwPtN_P}Wu&3XYWhX7?>IXryg(Qzo-YNR+G8j~~Y` z>$0x9F3$U*#yKya3I)=?aoF7}(fbZ#1tB!oQ0dQA#K@sI)ozDNrx%8>96gLQt|Lns z|6|DMxAmu!1l;W-^Ac%(#S1ZfQZs`y)GN+gts9?KHL%7i<~ zSra}UtQAvJ7z^8U8*vHejgfG?`%sW0Ak|jt3JL(Sm>R=RSbbj1B)w+%92YllO%O#a zGhhcrrw34S!93*-4^D#C397$XU5S{c@X5Mj6bh4~?0hXI#KVjHY^`sv1qAkKOV=gy zJ`o@1eUJ}Kkhr2Mj3eZWZfVh#UTVD;eR%5^`#wGx>=c>uqwNR7LH|yVkear^H+Apm z;-lk3$xMsTdym%2doJg=FR91f1o6AhJiS)z0r&35|2e5ANa1G#^nvl?M3J)dr_*cM zlf5Udn;2_b`HT2L@Vm2JSqYyhCc>fyN{nZsEvB3U!wHdSH^|aiKiO;7XZGJw#`-Df1!16^*d4p(`fXKQAC#eCblk6xm45-?YXX0q6iu92Wu2EdE64C>ezdym!%h8a zo_&Uo+v0L;b=x~JZ4vf=U)TTpvps(k7J6boIM1f?|5^0^{?C7G2d6Tyh?S_k3W}uv z7SiRjyTe+w}R3`CVRdX>v&^B*hqU)zySLQkXj z=jM%l+2NrbOCol}T0TPrLtiTOZ`to6uzc>WH1~(c*VCJI2{* z|DTuq_l>nVrN{1d^laluztnj*-+vnx;vhZAo{Hk{iP&TAGym<;JU+wTn8)V^yW#&9 zQ6CD6sNW8$Tj7QOf8SD14$wFlngg_3;`(n9tTeC)*1P;q0x|y_ivM_Zj%9#!W7jhI zCHH@QJN_er6Vfv<5PI$;z<<{6RQ4(F{}E^Gj=z6&mUen-4}ruIQc>kC_;EJ^MBg8te!?JnwpwS{lA}WnG62pggl1Km9 zZh2*rTCX%RpcG$j-0SKU@BD;pkB+i`?=-UC_RIG}-heojnJ zXMFbDZSA=%ZK_fk8Xf}i@?xCP?fWdB-`)z|do<5(JoOexprWEeT|lh7SNMNy%{-+^ zGfCY#R}EM3#xLoG6{ZS$duhH@R}XuUL>_Q$o;)2Sj&t6;#0aeZ@PjeZJz!!i z+!_-b3o}(h*`EC}lm3RL3&-oPcHi<&SLqXLe&QlUpIKs`%P4D;QhvV0` zy|m^{=*O=few3K0b* zV7I`TY?;Hsp?WI&kIIze6Ljt1+tSVdV@9uQqH<<##sxeUJs!U6PQJKsmR63IdUG%S zJiPY&?Rc$O6{RZaUC&5?-vjoDXrwH;u5Aze07bJZ8p=FDi2qG}-e@K9vWD>{H%I4f z;^UR2m|UoIh%7_r@7)g?Awf-f{RK-aqj27;acIibUH26Y)SsDznQbmgX%u3{4|ptL z&KhfdzI5r`?_hdFYzv(}aScsP1_ISjCWxXOa5p=@Yn@IUe3hXkU0ph>-j@_!4tw?o zlFVj4J`s;Fg|*7ZTRAb=HQPD==Vz3&@woFpu#vxB_H=mgx!`!Ym?C{mKtN1QG?_NS z@qA5mL4VIW)jk>nJQTV*pnBO78_RO&2-`2kH7Q;}=jaS|xfGa=b%}v`ig=vH!<@17 z-*S))4$Sh%;{U$BIyr?fXLbY-n($_XcmC(Mu?Mg$gD5z{D)WBcP?~qbs7Ac&Vc7*Q z_KH&$?x|nw5g<8ft{h|Ho!M?(K{AlNT@1P#d)Ecj)62+g*a~ArE?pM<|Hyg^wm9Nv zO&iw$g9Ue&;O;WG4o+}QaM$2ExJz*N1PBCo3GVLh?hfz#_w4Sq=e%EFuAc7du3uF> zbw9*@favj&VuiH56C;0VQlCqTqRB_IfK^tSbieyk-J!9OIj-#0EL#R<#zeD$SUEE@ zY)TI6Jt-uG8$6uBk})FD&*JPH9Fg_h;k$biNeH9|pU%pvoH6Wuh1H*-S{%^sFh;1<>?%WW_1Xk}UtLLow7$z6=)T)Ygg?e=JpH`2K(9k3fDI zW278)0LYc1x!(1zk-ufEpW4q zh?p4XndIu{yOfAX2O|!os@l?pKm~WMJ^UX$4qw;-#T~2=a`(AG4(xY8iL$60URTS*)(fbOShXw~Vf^ABMvIISpA&amf&>r}0I)A9K{w-pd<+YQQ z+i^|A4v_!co`Xmcxhbu#w)ptwm zOXr7@O3lxf-IhC#*5;z=Tb1#@UO?nDKQ7u4r{+}PXVHjwW!>FlQIt*cDZtZ}@t=#T zLVIL8P-ri3bixzt_c>z7+P$G5mUD?QH?-K>i5Sn^D^rC7yD;N*$;ldWV3m02gS?Vx zj*Rok{N8KYX@S;+)TcqJxC)F#jljF(;frZJ$icCgEcz_<|95ZbLLRo3tdN&_IY zS%FoJ&EZ1}@pAmd3yB)+eweByCxn+w+4^3JBZ=WA2Fzwd`HL1M-wlpbw^jA1C@OM= zL$ zH@@d{WKYz$t2qB2eoS(ORA%wpmAC8j){9}$w;55ZB8UZFob=ojU35Xx$=0%sw?F%@ zF*_xtna4E4=k{kR;o#Zv#}GaZ+^R&U+o!^TSSsIN`paMSb_F+{VukKzd6W>_Ne27{ z7x*jTsr-C;d(Ak4qEw(}MZilBK%%hL7o<;ZK3j?BJHBUmlNTWuF)wmYl6o?R}zR1Hx}Plxh20C_9510#ih|T?4e}3R41(vl9J$w z=AJwRUkF~U)34uTp9@#Ty&Q%+YOq$@tZcu#@Mk3P*L=9vdGMZpOkS3Gnr?X7&i~K6 z=7_oJa34Fa{7E1;@#A{oLw9EQkl}X0|ILVt13WjfYGoB|oR`-p&glQZ2_G{POD4+l zAKGV3RyIQ*fy9~0s9E*sSS3Xz~xKZ=5VKGOTH zbXP@n2HmSu(f5H)jjL<&=W`6dOW3>JubqDFLLsxmsq>cnF^5Gnr7HOn%R;~fDe_-+ z+HcK^1EoAUaS;2v>ywSw&j%a2TizYFlflPIz!?uMDj_{*t${u-{-2Ab5?SHm>e_|= ztpoeS1v58;Zx8jH6J33}!W?8ol7_ZFa=F|;4Hi@#PS9|<-eDACi-&sTsgF6DF^oLN zibE>!l=pm0WOP?qWm7QR(@S2RlB|V7=j@KK16V>lA3BkQj9DC@9Y#Jm`}bbXP9gVE zEF>ZdC9&vG%t?&+n1DEeQ1RmM6c1w;WNG{}{SpcnEP$BT#B)Dryb-Us*G=Gn0r6s(mqFmsP;Ew$x;46OO}i6F0RW` zEg~Q>A5^wbv+{3SbD_JU!k?o_t)9r^pcdNx11$ACv|XC0QxoD7rYxY(%R*Spwz?t8 zA>Rr7x(d_dZa9`hPc}p2g3v^P2E6ZETn@mGCNuL#ku;M+tc!J)&r^4xPumPJJ*xjaJqT`)-MLZ*VR85i<=9L5+!~2Bo1m`?!bt8?%Zt>&e?%C_=U&Jn7z4^o_EoJ?;EGli- zoSRWFG&Hs+1JSQN+ z)O5#usz(Ztb!;5J=2Gm#C&P6phRQekC*$111h zT!A8llgeV)21e>Y!c`|CJl^YvxTK1{zCT<(dh3vSZbHw&(~E$rEJ83f^C8FIVaYO) zrnmMpK>d2qf==W(5kf9CkCuvAvYMM)u{6ds*(sz#^L`)C6(u_=?GV^d{BY4mlGfN> z_xcu|>Q;2}SQ2xh(fz{AcZ!+-keJ5g-q~WOu$arK#RI@__+V&!pbhpDX z8j2beS}^-(p>uZAqRyBn;!=(q{GP%+hKuTJRsLW}a?2mrJqNZs{P%v;xh4!TA0!lH z5&K%*FB1P#Gz)Y<)>r4D&sy$Ij0Lyo{JozniXusXG$ozMZEgB;Dk|aPcgjG-Gi({L z_)oWPU1{_>kgXS1NPFX&ry%nEip;-CLLILnX9{}=F%=7wt#!TLt4=5?aW6XHvDE+l zo6?!r>D55J!0g@#9_Xz~xv`(VL>3G}NA%yy)N!r8?{2+oBHT2%tu%U5gP(cKh5@~7O^%3ySKbf_PCi3O>sB&mY^-cF3R-qZ=RXQ!tb z82}y~4+s9}tTkf%PS-`Rr=_BEvm*m!{`xcQMxI+a2yqm@$vyuf0zWH zTEd9ki%V?`Hqk61T-+3hq30_crXmHvlK05#pKG2_!zoFDTZt|kY962x2BNNhI= zy8sl1EDhJ^$Wq~RN8i}=wr1eGxoJ}71DhC!s_)7bf~#MH|9mI6rL%)gIvsLbhI-eY z2%WHx0icnlXxr^ako7&tYxAnmeK)mf2tjxpVtvpWrr#_Ld#0GH(AN3_4)x>;nq_@_ z5Q8Qr$qpdrqNHPKkY@;qyM%J!2dz;JoV@H_70Wr-cIX)j>a+fw0tZ}Y#ABx|11vb{ zZKAM>ppT4OF=?oF3c>N1ULQWKJ{C%mz;M3ZF)Fv|4N>Z;z;(5V+iJohi?uk59&%SD zd*y@lWJ%yqBx+*HjVXkREEbL9ePIqeJ@%|A#xNco?}oaaLNGJEE~N9t!cBOX9d-ow zn@qVj$VD&L^$vZgTuq=p3Pn{)7t_&}Oa|pAt6G;d`QmNBT8&Q~pYAm|09OoY&F!~b ztfreh7hDM&lH&-#DH(n$W(pL3xn4eECyR@k>{`_NWjH#KxF{JUTX^Y$>=SEfn}+Mf z{>R%dD`e+U;71q*54QquNCP%EUxTdw(ZK5*AXkl&m@y<2ZX1sSyk(%9<-k>V-*bOY#TK*CaZN}7m+}?8iiv5g> zTkI!o1ZfShl|&}geVZ_g-V9+K5%R?Qm5R%x^Zqiv9R8b?9=4UhtHD6XMi8^f}Z zSjx+~n%a$|NWFu8Ndd76j}O0T=%|ug0gOq|!~3?{ew@}0a8-=|vT`&k$TI?xJI5WM zxBvT&FoDw;DkXJo@EAeD?+kb3Ad-P{u!CK6GCVk#ELFzid8F1{?@_Nn3s+?^k`~EI z`FftpV}>a`%3XA|{FC!rzI7udR}~z82qecagkE=kzrYP*lr&=p zf$SPrjR17tPJU3M!vIkVBL6v>d?|NGbyidW)=waU-Q^@07p%dI?cjQ+M{fnw`szMO z;s{i?G7Jp$QJ;8uT(r2{5XbN=JL}|%k+VO{Up{RQ01Cj*7Eaz}<^u@BnRJAEV>3z| ztio#dS$2uaMRs4tVv|iywFwH$(p%hWTd_eZB#Bsiar9*Xe!p@9!`GUxiP)QK!M9&Z z(qhEQ3ch1SB1+{Xr;CB*eqYv!iK+}CJ@n!QsRNoqPz7BG3>X}u{f+~nX5j*92(8R; zzT=noYBXt76}DCy9g~0W@0p-S_Y=d36}nXMb`9X$#MX!dSK1?~1zwVF_pf1WkMhB_ zG_0Etgz|z!LW%>J!dAAr(OthgG=CD0%8?|{@hA6*SnR3UU~o0)f^js*elMt(&BcaZzzFZ!%-ZaGLD6X#jO-0!l1|-6;((VW%Ew? z$=vGunA=VFKWMfAg!eM?z3_`urw=DD=M^53M}#iyurJ6tY#XopyxbfN_?QaB_%7ta zf1M2KpH+?U+Wu=e`)tX+9h)F1e#w%tOy98H=pBlKJDyfjVu>^AY>k7JR;U8d)6z=y zx%lCqZB&E<{$zWoE|$9Lij)C(&6 z;F2oN#_wx?+CenMDBs0nIMo!|q?+@5hQB-J+bd`0U>rUU@ARaMELmA$@3J zM#g>&MhPF4{y$Z%YJX2+lhi;gcn~-Uh*S_q4*<0pTU2`jC(FnZq7{((3Ly?WNc_rR z=A1u_O!}$&Ksi78CSnKDhAWyzGexbcPX?ZFVn3f&j zg8xPG<~xeKFPPR^5=Bo}iHYk%@c zNC5t#X?>^VUwmT8iEC#ld^4${JDTj(^RP!S%YeWBh>5Q4*0HHJPua+^koLC)Je-2t zPNs=-H`B8gQY}5A3!)Tbe79<`mTYXwrPxC5KV;?hTY!_qf?&Y8086_pRS^&;oW6#_ z(PEBQ%dHL)dT@dFS_y?O=543ZWfG?%36^i&JI4Vw;BTgpgZl$plLS#w_^gco)fLE9 z4(PyC8Ut&bAJ2Ew7czJ@&cDIF&7?JW#B{aG1;A>Fl-S_JKc=sGjyJ{l(5W1psOY8r zSU*ZV=t>9SoYPZ3w5jI?t7d-@WmUK)SONCs5JuY-4EAMo8b2}i5(?@aPFxO&?L(GW}wlyWyV9p{9fu0*oPmE{HMG zR~f-Qn_%qE>V?i=dce4BK?aO$=w|nFx62rnah*hJKo*uvxedFA_S$+=`1+iU+eV-B z*yBT(vnSAjEVhffa00Cfo&Z09+@u$vx58EiD8EML;P!qGT8rUo^sY)9@iY}SGK_ZR z1hRTj3Nw+4h!z6Mb>L$(mnlJ-Rk&8BXW;AnrrBWGvVZHKD;XRN?e!?xY)mky>igsr zCw)GkaGTscyDWqZ&~w;y1`46nD(g#j#(7>L#0>Yq0fibFwyoD(J@HKX^T3d8spGx|{ zfa$Z*W7Yi3Or>Q+Z*SRe0%H29CZ_$46(KiWzu&&TzR$u#nbgGb;af6sFDxswPiGEP zZ0d0MXioR~5k56GarM1zX?x%(6jbByEpStx7W|qfX5W|GAqC^3EljlE^FQ941cYyY29L78M}%6y6|_p+q^r8U>Qu1M`fOyFHgN5>&$DO=WTm+h*DLeVWx7DX=uT z?#dVcRu*Y$9Z1Phs2xFabLzuYo|gw|NOlH`hLFNTYEUvDWbJMk1Ys2#_qw(k--cz? zI~EO4prM1rEZD|N(k8d2KU+z{Hz20bjvy&kKltj6;OLJayQ-%!xU9ZZF@ot9$YsL;rD>M+M2#;)H08~)IR#}HI4d0>;XPlDf9Tg zQu)j*iMV^GEFtb9FW>9|lar$0di%hxH=(^luQB{Ea^c96IK2Hpdmp=>3^&&k;$WC) zpCau{L!8o|1Hwap&zW#3MNMALz342Irap1xgDc@gm%e*L;^Zsimx^u9>N=Am8z5bMo3tStxGwSB0QWAe-x4&rcKn5jg4IPwx+%E(>dc?MK1&@X=kwS+p?dIPI>E|Z)h3v{=AB6!+UK5xpOnJ< zGe#B-2qy0mlT46(JbjexGTD(D8bG|*aX_TBR?e|XU1PH#?T*`LE)x3n6_0i65_&lc zo2B}^G9|Z7i_yp+lky~Tdv`CG`+B)n;HnGbEc$qgI%=iTQtj+DXS^pIyetG^)QH`Q| zBD}0ZVP4PK$H+K}oD|M9=gBk;qNxHkT$%QR=J1E-(I+4~218H)r2B$C(@d(HL(O_t zoqF(oR0BteV(sJ%#<2i?PpKX6z`XN(CSAuqy?K6OzlMrshaZq~$j5s~9vK-R>c@kb z>s7$AxJjfQ-Dl8?H+*=BtJo!5Z=;Ve;gfDli{p5R7Fcc~m(JNxXAt#kRa7f@+e?tT zN`#K1)vBtrKTpbS^95yXs>TyDt5nGi2nAld5f7XoR_uy?Y^TSDZmo#4|EccMO6a@(*K|QvJi@ zlv(3l;DF3_%Rw>h^U1+OygM-Kw8|zSncQC&3m2i9qmSQ|oTs_jziVrnHW=_*)Hdj< zy;plb6!GMB)_d`{UM#1Pl`;;?_i&05*5BViI_E7c!s*0%fxU5&lyCl!6V$q?x zjmM1r4Rst-9Lxg?dM;mvjLZzSFB&6kh*TT7`z2>*B-^1EGk(%!TXl+J$8maMrdIno z>mqj@VDWK?*u}9Gd9uM6LIP6L)@Jg*)BYgx(Q___kdZ1XtQ|QkbSuYp4-VGO*J|z{ zO=U+^q$dAwt3jGejF1^bIy4L?BmPw^-3@xK=Qbz=Px4h(Ibk>w<@NE`43;}ivdAwl zNqzbdHmo>V+!7DrIvx_sA?QbOX7Hxd;Iw{f{Y^3w5=P~g4Gv6hfeEnN-1z-TCl+Bm zQ}xRiIQzYh$NVfL%)Rm#bsAEb0jRdn9#|i0f&wKJwN^HiAbuCH7GOu!issYrnRpId zXbL(M2JK9Wvc4YMOegf%=)LkhB@{nKUF_=)8Iuj+^ zzz|ymS+g|t=^C;J@l9m$5M`u$NCcYmRrlH;@3g}M68>CX1|n&IHL8(`T`2cU7pDJ= zI^sIwM`#4>?9!j%PzL&#Xta}(O6Y>Cw)0F#;qq8}1rIqG8{v)DQ^4}3kwkGOJ3Vkk z^qvLQKh-&mlgCi(0>Mx>;j;IOf2eW82?4dqs9V-F73J`o>G=GA2`II2q8kta49VdS zC>-qR{kN31Q4HRS?1hIstPDU7EJ?SYDK}>Q7`ajm6>CnLt@r~;5fA@05OT!K8=r}k zkE6+MpBCj{JOV^z0bt#E|Bk3Vc1nrkd+?%gYL@Xm?IbcTEle^_?3E1m466RrcL)^S z#4n%407V@5q~~J1lcpv8D*KL4NY8Hqaf~|hUHojBM6OTe>m*!^uQ(OCl9xd9aHO(_ zh7~o~SN)C7CPnhW&*$_fo{G&3ma(^vg+gJQ_P1`mufVIwx0|NBI2xI*Lk5dum0sAgeari#5&7a%d|eBkF+^H&r$Lh%45~g&vK@ zU}m4D6%-_HA4R(>0B=Whcq@EW(5^p4~m zyPIDmb2Q<$nRQ{!AGn@RWa@hO@^c&ED9(^y@o~T&ZQ)h&3SNl}otRFloGEF86~$>w zgEKj{5-Q<|R7EBKbjAMHi3~y@WCm6sMm?psB)>tFa8SsX%VG&7fACUpDVRs&kW%}g z!e`9_jDlnfk2}OQxI;ehfh3VDlZg6gtk0OxeHQ%L-e?;;g+w_PFM#sdXg5B`FMIqg z%(S0w;v{rrZs|e_)QWC$>@F~k+Q@=!%qW1RBWrJeFeo)m^E#;!1&S;t87^jdH4uMU+a=t@+;PD9QHWD;ux$egox-y!eP8WtYq`|~wA@k^=5$jAUs4O%?bRI0TvXPjfC4(Eq<_Ee5B zP%rMR1rx9^@$+P#y)?6SEoiuD2YSuOL>!b2tw-MIiirt^5I1$$mGd<9LI-RBAX`f8UmR46LMNe~y zD8(#EH$@OA!rwKOuFX7UJ>S03M~BUJwiJmawA#*lfFD&j1xHh!Jy)cg8% zO7tHHc@~%AACmqvvh!MpNXH)(i*MT1Ul}g^YxM3ff*Z-zrU(f$i}>=9B-Aoo3p!oh z?(&5GRFe193z}ocbbTRbgZU8z08e()+nw6ujK9IY{&je`ziXvise^R?$n)M^9`EIgfv7d^+DGg|?@yH@89r%OnqT+r|PCL3ADuzed$=UDeMXH;os9v%}r z$1j%oY$=V)=~clkvx7F-~b93iwmO%a|EUJQFuy4hz90eH0TK~cu%j49(F z!bKgh&dF01B+#3ihr$hc+^8p5p3rg2`o17_$XLmm=>Z5RNp%8GO82=2Op-(rpk~IL zw-c#(88p4)_Xk`h{fh|3qasph2!56od9{}k`QyVQz>(iAX%kW$tA4tEc#x6z2SVr&X6Z$y1PvdzYFm3h4@7uSBjIxId^2gn4R#zc)&vEz`nh~(&Nkq zmKi&&y2dTo@XaKxEU$oC)*}v87QX>ywpuP+?pE`|4P<0WZ+i-3c@cF21&|H^op`jD zEBSSG3K_+Fxg4as{5T@we~IwNN>$VMMZ__BMg8g^VfVFt4yTKZ9pOJ82LHAJC$#A*!#Kr zSq^y!EfVxCy)!Qg+AX6%j7HtsogG$;24_iz8r!DNt9WD@;Ti{0f-#izq6vV7R7oKo zvQjul{uZ;pgqgnI<(!PK!|kk?=H}3!BZ?82JSh9*PwK5N!sntUPjs?5gh!!=ir0Pf z1uc|BRnf}rBBouYz262uVS*9f;K!>hm7Vt*$qJ=QOOI>n1o z48ej-6qR~Wg?1cX2mY~ibxWI@uy~|9SDV)787`8!;2C?hRA%^YgQ`&f2KV-U1q< zXUFY}XgSn!to-T8{2CpGz3-+qHReR|*@{QkO)a#9wW!aJH}e(jxUQF4X_%`OM(h+z z29esw@E1$MhY{bx7~hQQwTmkuV^^{lzRb#vxFaqU)zjsyeZMmSMEs@Os}1*-pw`pe zrP?$P0ETu9cBhkJ1trPF>xF9j!zEbzqm@Sw$&oL{Um@HXcXXR))kOq=aB0@sOd?|y? zUVCsNLZRI(VUsXarFavJ~sbz?-r?PZPgulr*nCl`@ZO*|?iBhwRHWr#R`b>*ZMweXG}?!6>% zX*-6rN)Ih9%Nbc#(qO3dTR*l;kPKIqz;1S7rPOZ_M_MIYB>bibF(>v{kH|p%oBSj1 zwV?S{4`s~oNs!~PELD!mm=2x)0}z-8*6?mADlRs}b;sWumbJgPDRq(E#?}YTKeEU`Z}((5ihqwPTASujt#8RMd;XAjl;GBs-#E?{!xxmNa|IH ziiThUCw7tYisn)0Yg;`An&e_n3tJ32^11J((7b&X)LY~>IsVm^ZVaqVm=0?Yps&^T z6`Cxl^NA`PLSMoD@IHj#SBS=PMKL4*C=#29pVFkXyW?Cnu0u9)LL$Fc#sB+v7(@T* zQ@Y=0tk29QvQCG+Bz)3bQ{*cM$B{$t%`tHFVfKqP=)r-OPap3KAANDp{m-x+u$cA_ zYaY27MjQXeRw`n;4CDfWIDZfcJiisyFWSetECgws|I1in*0`}rq)561cBN10hPk&Ids?YvZH9^6iTgDg?8b1@O`91n_2FV^S82KwS*sf74#f-^P9Vd9( zX7=MiB<*<#c;{}A^F|XUOf;6YwY_En$0r60k;gH@s7wpRA>v>U%t|}8*{WZXxfo*$ zT#CQbI#VhtE4i|BZ!SHs)u+?#hrqcdCA2`>fy!??`BXA@C3=u8YiVpW@hXer@hHGo zPEO9wK0p4!=7T|M!3;EEiQHY>jRT&@lFhng_6)N9<8ydPSiJNil{ zQSY!Yx!`%_+uBH4nffdegNuu4tynHxx6HT@EcpC^=J@wZDw3rq$AsKM$)b}uX9fb8%w&wseiqt4jy(&Z1r>r3834Y+kPhY@{(@q~PtJ%;>Jt z`}Xr&vEsZ4?yu9EuINyYu(?}a=A%cu-GaTVJaI``5|Y7x8DqWF6iXbcA)x|<8b(bD z#UfuUf`6g%{X|hkBHR*;W4|vGA`6X^3(_y7)ziHmH-l;u$q5()=2AUlfd~rXci@Z3 znc#520I6vV3@S2xo432I(BW@@v_t<88)f=+m42RP`*EUZ)@f?6oYW=b^*@0oG%d>) ztcIyzvf!-!YsHqR$FV>I6FAIHy3&R&%8#w=|HA_4I`K86f2>i$qu}z&$jyb_$X+(aY<0O2%U6-`%s>i}HDt-N=8AsUPps*}jBRKVXCDOKNR@5(~QP z4+s+rl@=8t`JQ}b!!IpGRZru;+;19e|6N-PB2jh8N<_u1M6)_Sv%^amP72&W*qILP z=JZVrGclfU(!u!0*sAL0GBjrZ>V z#1g`MlQ2DRU5h*mF>f9-&365w!}(*s!I2ORY$*1dZ+L7WSaBy z^D~lW^ZQB{CU`;u8)JfKeBy@f%NHs4woZjVbsXgHyK+`bQVi8)ld`82o|m=wity8A zf~^8hX4L=zvHG^C3(iPoBHrIg-!)3Izu5hQE2Jn=nJr*G4xLuG)V)lA2Ozc$`ry}18!|RQD+|qRVm=>5Q%4#1{_Fn1t-E=(f8X-N8jK0n+0P{p>0Pe9 zwuD_DL)>lM8$2Dsp;*Ji+*CT+0Kd&T*jy$C^;$Y6CZ+5AQx!!|$)Rcu!(P65<4^aV z4*@SdfJUrS-q1$lRf4>3D<2=`>z_=J71f{4yG}FYtmx&4yLv%8gpvf`P^4b53ZMqw zYAqpW7e&l~)p++u(>OJd-N}!qLnRPw<6e!H261@+ zhVqE|ZU`ITIezrQUs?R-Y${#)PfaGhsg48(k1zzANfw{Nq*Vb?P;e4kakSakj6p`# ze!pTXwNa(=aG6rAG>+ci5Xs-O;w==?4x4+tmQ51J*n6gFz|{R0ekCKxCXOSsHSBF< zn54hUO^8+ci~*UEvu5ahnV41yNDgh*B`J{N9AcY1i=-7x^!WEYVuOaAel#Ae(RdoI zML0dKX1j~( zrp0j~_5L0eyJqBjrgXM+lo!W0B~)2pim3Gz6Ri;EYM6teK-H6bfXJ!1mWIK{=Ka#YbfEAcsU?cx(- z?;^Mgk^{ka`q4q5iqm1R**UNRgV*?DJFbOUx<$WV3_9N;E?iyENK`^ z&cFWhj(pwH#`=0WCSZ2V$pZOwnNp#jr}kfC@ti-Tef@`vLoQ9m#XW~#Btuio22>P~ zMB?jc@MuKou=CBzGX^|Q`v~&Iws}gnrIHIK--8E=khhZCYHFQ6tR2}6>a2firFp%q z8F=TL_d`W;*k(N}4%ImmuNbyD28MNkh#A{G<#0!1Y_v`M1&h!zg>eVdc132Y8j$j> znwJP#FxpU6wKu3qkU%5j@(Y(ONu>&0`kXBDxLPta^=$=T3u7XqP%%-oSq>b#4{n#2 z5pY*Ne;x~OIWirVEg4DArJQ`LOjD3Mk^-CHQJ{Mj+%!t~qIJKI4+spq8fcj9>?pEL zW6Zs?!*Ggq!NRcFe=Ezc9OnH*n6zZO4qVem0uYCZU+C-I8#$r+^X}{gc*Km@dLr6G+7< zjY=l&1fPcIynvZLy;?%WLNmp$Q5`@iPVH=G_l1(CMZ@00FWs z_`tKvA3^K7T)+4EyE9P~1Jqrhi2C1G!|4@<_hS6_cx|yjL zhG>u{lD@T(%ptn`;Y>Jp?^l=(7WG`3Fqk;qh%PhRMEp^Wy`+p|$}chz{JsCpm_`Dn z25k~%dun3Egko}bwgMEiI56na^%Sn_)~>c>^o4C=9POiId*zbSux_H96y8_cDuEFxHf8VX z`50Y73957qLF^evSQVcidlvf07$`9x#c{ESqp|7aV8;d=~c}9WB|ov?i0&YNnXJ| zceZu9q}>{KwL0y1lRWxC#K86ao9Vq@KG#wv_ij})jL&*~5ACkSA0TU^m=OPg!puAD zNc9rO+8MhiL<4~Jkw!6OW?DFm=C;uqaRN$mo05}!{#P5n)|3Mgu1I^NeP)*%q?VUc zPCdx|fQ9+;Y<~7u398z`ocnC}I{{>4dJIzt-3z8M_zmg$?h;}V!mz22tJJuL!Z=h&{b5STd@{piujT>08kue0!@@q^PW2y><|ol2Ih;C`M* z^JKNA3_&gQMiM^laq;_ZSBpdg{rhC|>tq6U;?Eq$qd^i^-ijy&h6qMD5@GkRRNng& zBU7kUy>sc$_uc2dvQ{T^UzD@p9@+UKRl53qZ@i|h_c zi*v#}!6k-*th9K3>A*A}BS9@ZWoU2;v~sR6YrAZm**c4G82((}Y>hq;bXB0^T}xb` zf-CTVGD?;Yl4#rH=wrd6R6}jLw1*yu*;-8V!=L6R*R(^LNE@jnuW+OI%R(ei|EY5` ztxr`&nqo>ecFqBxR>mo!s=P-4^RLui$_$HPMSNr9#q==(hH#BxkmKurq&Ml}5RXGj zBGS)sQcShjZK+MaB{`d98o$r*eb(<2a@1C*EVz0$aom*o#Ex3Z}+S;0d<-ZT&qeBZW48%L<-gJ0L1h#ogEoC?u z{q#Ra=v>HXXuVIhfSn^JgN39O(t&2&NT+tudlP8Iqq;mjxS?F%7hM8zSImQ*<^e7q zX~`+Vu$bj8+v6KZ=EeNnj~e7U#GJKljU%L-+YS{-15b9zO{Lf7D1cC^ zj81aiGodh`uZG8?)QNRukN&e0sYsa+q$ZTd=$Y^oH-}T9zW?a~XA1ZQWCtTSySjW^ zXYXf^6yQoP>`|`MHK3bUfKT#M#_@8F@0p)mEHKH<2bA&oQ&XnmYxdW3!5CL8@yVOE z-cbHr9%u#Vld0g7AJ{Jc#QQuNJfPOf)!4AD49q3XgsdJcL6&m_6`>Mhu}D}+Jt1P% z|1*e)?sA17ZFZZ83W-h43huTbs0qvakk+Zu=On^`FG;9$szT1Zv2=eD5;^~}w*=F6 zobOkRA5~29H-ll|sig^(?1@jB^wiV}UW$c@{-b2@8?+@6q2-NzIhdHp6_PW0c`-U! z!2v#{uhNTMUCG5zVzfuC#{642mo^z(+n;E4KW{Dtc{)RIduwkGYwtpZL6}>r#vrE< zMg+pbC>@5F1hJ7+7B!2^8UC}&ge3a@#e#BM6V+aR)^_jo-%{{35F^jRIDD+1VNuwH zq0g9GE^wAhPFL)*f+KS{RqAX5me#t$a3td+Q3O(u6=|-VeUVxx-F<|*76O-G0;#^U z=xsNq0{?V@0ra7NW_fJAGz=VQ=%3`EdKSt!I6M-X+nvCv$Dxn2Q%k?fJ<-b^MGV&$ zX)F5kuXXW4IJ9(7Cue!^h)U+1JjybhjquxXA|st~f_yMF_ktN^l|!cCxA>Y^dz)ap z4vT?VP!O`Zs#YbJcLj>(c3FK7g|_GG>PAqI5WbIQzfb1B@fM(vN2`oO zM&U{lpCsW-LePlDN(3m%%)gabMSf1gqqpbEQ#2%q&Qag&P^k@v=vkegUl0wBY-Gm@ zFuBI+2?+lkcr)W6{H<>LgMgr(JveYSe^fpc0bagJR`Y}c6_-v*gyxuJM87+gRyvVH zA4UYI_Q}$SYG9jsd22D4C1Z_M6L9x^LPd-XEYZ$#Aof$#Z$Qx8Je&enlN&K-f&tAC z_ItXcQI`wO{?P&wr53p{#Af2jD;SYzp?8ql!IK^|S|BL+5V{B5+)Y{~N`yO`ZvAhz zA?LRtu|jlM)7Z#Jf;s*DU3%`z(5y&FqXjueQi6Q3MQJyFiBT{tVb1VbYbfhl)7$^~ zqW!;A4aglEwSqAeee8U{_*lp`m2wJW=kSG926JI!VG@>^_McJrxiU!~vyDZEsa3iE zlO-%Mn%WusQZ#9iMLQ+l9Z0w(2~C4v&2V1RLl{a-ms)&@8E^;ED5yyU`}Eb%QWHpp zpi5y%KQSAqg~*cl^A$goMey`;9hm_=-Z#np)4$Oicd!+JgA@fT>aO0lrKFBgx!@38 zr7797qJuCW5)38t!QR^G$5gzB7Gzwjur4j_Q2sQOkN zH|NqPZh|I}IAr4Lxba>jdT-{b-iRYhoS|ta#U)(=#@H$Ch!QuUeMPW@4_gL!8?P`P zUpP4Pow{!Jv)7@{q!T$eFp8xl4vyX-1B9zXJsIo9$II=AqJ7Hh%B&;7hp#?mUE?@F#OoU>} z;iUO?{NzZrV!W{@IdH=}b>U#X_Ao3&8a$qWoFP!_1;v%!OQiRMONo(*hVat z)sx-Ds489LA4cSnK29)wMU$xOxJ+PJg0Sst<~D+h`O_%I&+4BA|D0pay}0BNw=pec zj+f(qr@>&uGx8|kNXz4w*80~F5;TfCP(3spVRIGDP3v@z8O^LV2^*FjNdl?(&x74H zs*>>JSw?(aDGg%F%}1+u1)fMtT?paX#s`jk{HKy8)2#YE!vFmg#Q-pxULj;acb^vg?c&fh^VJKN2#Ab@Il13WV!S7 zn~Jzj$zxmt;!^`FFFOMRdtO57aS?3 z;6zI}m$SMZ_@% zTXYjg3kF0>^Fb|pUmEHLq3yQOPD&$d8R>NBFadP0nGoq>k|q1S9wc(keJx7b2ahv= z=cEiamS9dAjjcK8KjdlGRPp|547h{1!(|06ELEB|6lte|5}&EaF9wy zWCWxhyLr`M+>+Gk)g%k!^OUqS5KZG_!eE43&N$=HG)hxI5PyIO zg-Oe(XlUdGs7OdqdMWpAHD|;gTJ3i_E5&@zbqZ735oDPOm+(~CE|#69p`nmgQA*EH z$CnE(ys(njMJz~v{q7mKbf}TUf4B)GNvkQQ7B``VHf%AHWdU3bJg3CX*G?Zj*@NUBdKsjn9~T~perdHk#}cQm(+u=Q`6>i@SJt^%N1--=48$StX*TRd9!`>qn} z%qFE~puds37TSwVmsM0~$tuP3GBbZI4An3W6|5>Y!QS61|Fr|I9hFBS{*hO~Ru~@u zR;wV6FJVBk9`t9VIt&RYCac_f-GxREvK2K-kmH3XSEkRXM;(z#a{kuO8<$3k(2#R4 z{Fr`rK2dA3w6&c!r}pUo+dh=wmnc!T1y2xOvA;osA@Ni18RFMg(x0-&P{|7$8$ufM z5&PG`lOjaN^ z9f~5i-wY1jeuk5fOE)GqHK2j3tdc%&U^e{SNl|1c*^7|5(SMp4{+KzbcS&J7M}S}1 z$4Ag{`7jbVgjd|5FVB)}7PPiU)4}JPU`m0V z9t_7|L5et@Rr$7A)}zEtMlbkk-uYZ(?YT2*={OF05lVbMdlW8@zbGT_7NqWLY7C`1 zT2X1mNmd9*0?3UDwP->`l>i!05NU9zYLoIWR-(S~lALwp&n{Fe`TxRQOE%O33nbwQ)*ab2-+*)7N zTZ29PLs(?^VAj@7ydG%s=P+gI9F!PyFvZOu!nYPBM$cpsvC}eMo8SScFU*BcJQq54 z|L`qD4Q{%Y1(9}32NsC(`P|fH>qRn71pXJCAuf4WJGGi5za^(_se*;^JsgA@K{nG?ccpgM(jtS)jJQ_1UPb!S%Os zP?X@h7#kB{nY6i1&FT6asY2d-F8{W- z|8Kw`C)S0j#W9Z0^&e?_lKQr2EZyd|KIblT|8pDt)4)H9|78P`;d%D{51aqr4uDf4 zz?XBnacV65cWBdpU8Rc}xXlsz^b-Dmx=UIngd9soW^OCt@Beu^|MO1-^=@->H?>c#FU3DMX?OhF z@3(~h4R-SX?sskq*7$|x`sOO(atZ`scr*dtNP5s&=70LiQGWlR2&Sf%LbyHQS^lSm z0yux-U2;ForbA6y|0DO1PoxW?kWXZ}!Qfw8zWviZ-8DFM-D zHr=uEzkQD`1`-y2egAUcF+u(W)!oaXZu&f4SdBhMlf`A^jRW%GqY3z9(!Ru_x&&BKYqjmrpV&( zuP#>s_2}#jC>3p{9{N7CC1ue!t7c};uhs(A@a<}O;(xJ*O7<2O7Rd_>>f+J}k-gh- zeSP8pcn_7C`DZLC4lZtYo6XG10#%{g*#$8PEbLX9kOseiK=7x@tu2y;WikL=({mIV z27qD1!{fWUgxiEj0T8x|sw#bZy8v1YO+MgaMq})F>cp&W-2*b+Pkf(@AI{gWrvW0K z%kzodP>1(R z-}Xh^K7EQ}cK>^hD6j=+g-;d#ZT-8}#r+H?`XjOTT_-y!JY6p0x3@uIk&se=erc;~ z0N7N9!oj;9xuXKm$Jzk7l}OE#5)|ocP>96nV(0r8_oIA9Ga~ZPpxxv?Ls*xu0 zIwIwDcnx|zckM*Cv$G2;{}x|UQ**-A1yBtTHS%g|faaqmlFG#@ETE^jys9F;Hx%jf@Y79Q zky|YXccb+CtGh~@TRee)hn!Y?h`O?}zsQpvB|Ew9!jE>}mGAYf7{zA`0^)fsEn0fs zcbwtT(eXB`4Z{(b^i$OA#o*;}cAalnLGxb#*5i48Z>LeHVZbz@m<|5Fzu;>Gpe4Ql zmWgzST6Sh;=CVa?!|MhShTo^oc3o?@i)5MDhv9s{oJdj~P@fS=0jxHbETTj|KjG*f zIDvV6e>>yhIX}?|GAX=80Q1N>oyRA)L*3uDq0u4yEjzLpd7d33)1N$phoV7k9Ker-QLikY~M z22Am&knpPa|6H1LU9ekn%RmRt&wh&w3#8*!Dhk=3Xm@wfua632D~@`I8x$imNh42i3Qi}L`DW)e8hc@Br74GkD8;CV^LWdin5Gy9i|V< z{QMVbAwK#@Z0wV3Kzy0-(`Uajt#n9be9iCdDF!VMg@c8qjOx$vae0^{{K8piP>?K| zSCktP0>W)2Z7YD;JuPJIK8n2hRs6q1gvnh;M`2k!4q&JPn%B4NlS8wLzVZOllb*Tr zwN4V9^*PMKa`yN0GnD&oG`Bv&>kpu86dGy zwOJIahZ=Lgw;11Dt*u3~$c@-S_@D$ga&``Pot-x&?X&px@Rpx;1c)zWE}~;j9M=e$ zcB2!62RUNgrJjh0_I5oc`@=72g*pz8NjqBBk{@ck&j)GlLr(y+Kj+@$voVgdBe)}Q zPW}))`b&O8$~*QY_BhKGC%=ZDiR_R==-Z;%!8^iwE@-E9lfnb5zPi=F8d7})v@JU$ zWN|qq4y}6gc>ahAb2%w^MEKMeH?M5GZvc&htL7^dd=C-m92@Ws? zS=pH@2=Y{bB}hq64_`2a98A>%q(GRc6#?veUg|#c`;I4GbN3Kc3L~Jx@yp`#l+1BI zz%N_4Z_5(&mIWrHnye-&7Sye9-3e#Bf*$+qeiicFJ+WG}H@Id1&{0<1G2V`gIPV`)jLj%pNX2OarkBMqz|31(bk{uUEU}Im@xW zUIHn{F8)&Zo4dYd-5y17I5q^3JT5)uTcx08{wwqre}ZaxSv$Ua!uy za4)SVTekKsjbyl1gzj;!;dXe!$XR7^h8do%XaBtbA{_DI>-IUr{Z%i!{0uitV*8r8 zW~BF(|CZYF9OKI*=Vxct+$aNZP$c5z0HeqOmxmmSq=X72hb^ZqSc0v~g!!A@A`$^n zFbA*y;XQWgPe>@HjIE9gZ0uK}$fG@{hUgWY~B7tOSIN0(uHr8OmOeXOV+mSro0QU-T^Y?;116BfR&+AX%z;Y@MR; z=Q&?4U<~F~Rzh%=*(|IsE^B?7c;vV96au$P;HW@GaP?}a@}y;C!%~3^;O=SXWz8eG zgppdBd>aXywZ@?-{5%VDu5H57rIP!1-5$a-Hnp?*?})>lM3srkD54JW`62usCr3$Z zzXX*tgh>dQZCN8oxx;c5C%DD#&}ppL1g>QqGP4*g&||^-&@Nx*r#+sC6awyW9LDQ3Njq?7gYpv9WMK zB@B_4p1c&>e3$iUqSg%=DA^|#{DDU8p`a3_%fxa2`K~MImD!WMsM1V&LulO`Ni2w6 zxmMf?vESl8gKCTN^GdWhV$#o8+t*x;QqaEQgsQanng5n9M{ zRBlgcXLku4Oc*ml)da4J~diS8lLbXHdXV zBYr-u0XpPH-=WVri)JF3-{{ADeJv1b8|^j?dIl|pZ+Qq@V8xgI;X6hzZn79yt~T09 z0XpXNDTUAY{Lye^3nlSGr=+ z3gf#}3{i66qpp$$4Iu3P3OjawP89S#Cp8w?%g`;%0HyGPL_E>->Mv1vF3Fg4u%p|c zjXX%%#DtScDV2hZ4U9n_8L3E!Ne3wo#-9Xfz_`qFNypX=gc%zf-_gIEfPP`N1b=)EC`B+lK0^sNL!$XY6d$|j&ueeqs;b12E!4`Mlukh0&|`?@C| z4;DfM4P}e^<+`94n__q{m9MDXN`s$7U;#L=6jahUc3n-_!xGsT1Zpz%g8;v9H_Ft)pa?6rK8!k>bOvy-t3&PL37})X8z_i5ka;*bdJpj~Uj=9uRh`3wv4B7wi_zgj!UH0go#rJKQvfM$T@Ydp# zAYn0P!SKzL#Pbjg?7E44;1 z^ZU1>cQ9-5sJy!GHVyjAznv-__G0hFhq-i)42_J&f-lyZBSVxlTTPR_9;XMx+Rs`# z_R~basL1I4B!Fs;M>|XMeJ+v=FxDba!vDgBEUi_gtHO^|re%G7KkUJ)vqA~l?O#W> z%t))8uL22Xo@XcLK_#`PB9?0{3!getBKWi=8d=|f9J%hR@|Yf+)#`q+XpwE}GQbQ@wxG zPOv*dU@I9g0f$dUh>mS7U(x(=-=gYNdnn-yd>;0sMwN$jCX-#Ip@wp7j%|k(5fY`x zv{Uh*q-t5qEl(3w_p==*wSsz!r3|!1NFsXnB0g z(zyP!Wuc>C`&fa?N4w|#P<-#Dm~7HZoD8E^%rWP1kreR;b8n#c^`h@O&G2JZ@8@+BNxqt86-Yzc*dd@X^aDTjL-yg{5ktO zlH`nd=bFzh)~j%6w<0n(Gkdy&*;wlELV&gIi(}Wb&dA8vTKd2;H2n$;!2KaE;vn9v zq3O;$fa#Nva}dm0XA=|o(R1MR%1Zv;6m}&VBFr@$?mGHQX<#m)&woZ6f|tHy+F0ULn{R7m*_A5YC+E)P-5p^oQbE-N!iV9P;i ze^XDApKKjE6;*wH-%ivT{v3nC{K+`Wsa+mTXrP8>)i;q2XPt#=BSXiW|AjKKf4%u$GER6|A_o=ak z)uEJ?w+Lg2Seu0L5y9Il>_G3B!i+FgYSTD;MwdfiRojJg&1?wMP zf-My2rV)U2Oy~L9&C-a3WZg`VYk`F&Xe75wNem6~iAEzV=3S2orsiU>zkk?iQh;7j z;I4`F$)qe}oygKl%MD4%=4vld5zh{r>4W&a_rst~=TUB(Ps&Yopc*F#2{8b-yw>B6 zZpjzW=NXP=8I5^h1-LIX@7#F+-G|rA9FVH9v z{g>2V9eIYzgpE8TKFIlC;vC{|#!kOP)zBo6Q(JjZVi-@Lz{HTmQ7@AeqUF!Y#5hPJ z2vXxi8$)Q0j(n2Z1C0~LWl5y+PmYLd^xuYkdK4!dtAs9s9#~ml4^)}wG>poB$*bp$ zK=~Q@WnF30FH2_KWJS@s#1s<>gM_tjEVd8v-AtVw>m87kbs1 zhLSoGq!ve=IBXy^_QQ?4R%9zt6E#R1KQ&O5j1P^QVh91Weqw!& zV4Gr<2uqTMVXo(u<4{Fo`Cdn^v6qDgHQePm<3F|_R8kQc#T5RUUOs2zF8&jdI1%ndK?bTVfMJ(t|O36yQ_&|_35(% zZlEIWH)5R#3Y|lv#$xZ+RudH!m8JwP_;o^_enN0#Q;6h@P?wE|$4|t*=BnOa#0D^U zSQ7fpq{2NRDTJ@u8g9DCB58OZRifxy%yj&AO>5C9`^`O0rncMOA>hvM>t!_pS65do z6YorOL=O>*C)tY)_|>JenEsg(enpfY9c49&0|Nsi$Q>W8lJVHEwQw(;DU(tF%$Wm{ za&qVhCoB{<+|M1~$bRsWgk_o!wkIsaLay_Ox;IW3sdqisdiyYicd}WK3}QpFEid7F zS8o9LNcv!dyZpkBfd(HpNN4;6BNKH5uqELszqhV~BD{f_kF#CN<(Qh9_LGD@NKSe9 z*Cc5_d-Qy+PZcjKroF)lBe+(x1RrS^WkbZ+3+3ssHOxMj%8s9*hRSbw8mmH8jy9$( zXoIL{Fxmp^P!>2r5suDw>mmKJk>j~gzNkSpXOqr=Ynsa}rk&R9_QY}_2+NBXp2OC# zWGl%9=L;ZEzm&DBnxb6a>qfy0=IK<3P}N!Vkx-M4MU8SfBgy7)&%_D$r!~S=a{XjJw#sxRG(?dSxj+lpFC*h+=9*D9-XEPfHRPA?~^Hz>z>gJqy zpMP4qq?l7}8#3%VFv@h!Gwpu+BE(BV)Z<-OSU4MmXD>VsdJ_%RtCPd}I;PGZgUt!_ zxw{z=TJbZuZO#|KFi=8B+b;CvJphr*0DGD|FgFAgpyp;S_HAz~KLID-{;%G_DA}D* zp~sw9lztVt>erq~=27~e9cIrhqsL|luDMU=>^&$DjDVYac}LdeiTZ``br!fVB*YT+ zp$9%=Fc;$;*BWZi5b^P88d`$*l%1Z3vWjZEB-%m$chB<5f~a_*!hauL|5-6wuK5r``?jg|O5 zSya~}D-I9TgYv?%pWI4U6cW_Yvcu(k_P!p;w;VbJ+b0a_wYhGggf><~eGN1J^Y$LD zg`!XPGutk>QKi7T@6$!Djp)H|Dw+6Zd>9gtKR+A;*1{FOAU z8U@AcA8wvMZcE3_Gul|=VG{_WB#r|c)SYhOE*lRkDU&fzI7IhnG{42-=6<{vQeyR)T{AEllyfFWzDSlu}n|kAGZ%Ln5C0e1)hO z7^6<;gDzg?r%SG7bWGTN$<9kee0fD6p!y8!zp)`$bSFr`+AVhelaWwl4qX@VgdsSKcI+cXV^m>5aIQVva7gsgT*UJGtAJ&e;y(DeYZBX6$J)a!c}N|jEUju~ZO zQ_pqrQU@Z$oGUkVdX=pKDJ;${=?QKaX2>vWK5Qy06xMq9;O!4GO7EZa)I!rDlj`Bm)u)1;3YUr4q zNZ09=Gpq`1;Gen{CU)~NRvUQeaws->AuJn$_?Z=3SjgdDq`c~AsBqHXis3omND@#y zp!?GXiD>w~4&WD_HAzEzWrv82-3?LPQ+(L!RC`Y)s37c8Gw7Gg6B+92iIOukd@LW`vgON578Uy31faAkbK?<@I%rh4&4R9At-~Se87R-AAfzVV3$rYv z2>ulGVyWxh4tr*>1XdcmBj~j+o6dsBCgyu&6`!4L!cSZFTwPJoqu&M{XobwSU6dII z7D+K@R0`vz3!@Z0ArvxPM7|8=t@T59-)oT^oh&vraClf|Xa~-j?We`B;00)6;1FMM z8X|t}zUZcB*OnH2oBY;E1C5mJ*CU{HzuCE{r6Yv--)S^`RETpJ1Mxa@f}*jh%ed3E zT5X+erEFocZ+d#LDy8tq7kkML2$1J`fW(uSjTzav(hQb8izS?XU z^rWUJ;gWXN=By{uQqB`f zzjDH=(2f{`Id%1=2UcOkNe$@WO_FEoFJy(HRKXPee(17aIfF~_K#}xvlPOq4jcUL( zdp%Y7DPywD@ZykF!VhiQFfk6`Nb()eI1OZXc7ENtKJKX(T~)Fjrf0^MUy z0A5eMi|XQcKcj8oTmlUdw;m@-&?}HkU{RNeTCWQ^oq&H4*FyEk>OVCs7a^>X&OG3R zKUBw2wFst|KkhElMKPA{mRrx+ z(xMfzr*-JxVCB*xpiAO2^c*>W&$xuj9B4)(S!XF@?!8d*iWTLdRV3B}*LZe_7Km!R z{!mh(pERKy{-lT#b?U&FX|mOClN$rKt-_d1fS5?1t66XWt}A~Siyo7Sm%qcA4ReS-+d z`b{HW{(yU-@DB~z@{l>!2wG@&^57Y}q4D|}R3y43Nkw{H-qd!%+CVg1qu9KvV2YVB zTx#Q=!%svZ5e~#G%pl~w&7^P?+G*iY!K*bZa%9w?xPyiwOb#n+&(=y1O3~s!3xjXM z#MI%`WP!#O=7sl~cO~P>?Zit@^(LrO$T}|t8{U-YTPbei@g#!$qgj6q z4%=a|GgV3ex%3~TT~1aIb}K(`5u|zM5-p_3@u0w(pi7>Ty}?!1g($e<__v$R<6r$z zhI`ClNdL(K&=ET&u`3YSyL2+h&p09z;W7z4|Fg+7$=j5$G=W{< zAwHcvxMmF}lgfza^S-`nC`Gey9y!Gic!=KG2Bt#U6);Ryiubf;wDBoNbeO0e!KJBb zrou~ixV|rJ7<-d6N(3P8PQ}fjqyx)0FytX0%D5OXXj5lk7P0%9Sqg3DAQs}tT`~7A zMH$%~$0_dO8}5hRn$h(`3_eO%F~a$M^>w{&?!8sTa-D4kyHLE*alZ?t6f>;(FWMjC zt8_H|IL7Js0JJt$A2sx!LK1`nz`giJ4JPtykJY;t(=gH4{`| zq|^D1|G55A{OYUw(&MrghS56R;H9BgDb`5~7SVMF6D8u`V_z@Ns)Rzem%Qe|p(c?C z1J1Xwf(Qm3#5R}7k$j+eBBHVU!wnfjOjn6WmoN4yItXoECXghWtv4&g{<(DKli0Jp z56cftGZBhx>x*~>?xd*8Y|s1(87gI0{2t|4eNW#b*wmgf77JXwc%Gn$q5?u(l5DrT zEFtS&2*z(=Aecr5Fxd{m&Amolo(073qE~z)+W`?y?`IjIa|j8wrx@qO>gj!~gu#{! zP~QHd;!>Uz?CgZN1yCX&{b?^n<(c^D0xE5b2{jKM?WW5iAy9xQN(4uXn?GS?@7hG@ z`1mY1q7br!8L4frxk13H^|}17@zn8@Y`el*Ds5g{Lqq!goT$i8%lvx4_>`IZ2Bw$Z zTGU(%Y1u-4H0kxOw)vyk?f7BezYF3OUM6p*BXBvpsupPylpdVw0udg5PzT-3zw6L7 zrn>5`iD1zvTisj7<(x}{+t-QE_G=_rO%jU!2jQT5cc!1B$k|DudguO=em437M~>72 zukpCH>`VRJ3fl+lE!S_R$3{7C*UXHpd1$21csVXP@Zv@_{1@@mY_Om&g<~4!_-=T@LIV;FO$1P+2mcd^0xR5p zOJTU;fG==cLxi-PC1_CI%@XFP6^N{)Gw7OILASfxu@sg7mHS8dv5V0NGYBs|ch z{Jh;JHw4g7FyMAiB2_e%DdUI8+&u?QXWa?4j6^~0(VB6Iu^-9lmIwH zQZD_tfM4WvZX|`!1w5clyICNRpmBhF79!_%%hdqnytN-&qHVwg}H<_;(z}9iGtSidVOsPq zfNQO4TXUlr92me6o%@8%^o^;T7lS%D`01d3#m4r&Zgq{2G%AHqc18amNyc*)Fp8*W zVVvpSs6ubSz4)R0TvUNzs)HaS{W@Bm(26|XUo`C;Cm7^y)$pV?$1t3QBR`Q0Y&hm~ za*EM#h)%`Bw24I5kL)m@9chHtC0+nOFS$R+z$x0QolXKtJKf3VsjiLH8 z4ML*&2m5iq3Fp$X@WJLo#hLrs2`yDb6SAy%en?c=(y| zWj&Nn?z~@nH^)SuW65g7QMa~QYHMW@(2OV;=HYVAutn{~+kW)#D=bu6WGtth9Z+d$Lv&YL;&Hwd)vvfP0P!r#)a`>Fo-=9_7h| z#ihqnoefnD8^c;H{$K?+d0uOOTi|ot*>iYu6?%fjs8lt@&Ecbn(1Gz6ij@o8Ceb!B zGWuz^bjrok`ydMTN8^{piA>)j6w;|(k%A$9^*vJyXm%OQ8i@bG0vGS&v6Gi$^@zVw)f6X5{Q z;BOEq?$=0W%6|e%y9=Q_8_i9H*$&PY5&FrLqlk_M$Ccncr_0fa`42|16Cu8>`L72m zRbsoaLJ~+1bGK;Pd=l~p6sh(}dreWB|X&LPGekb~MU%%)_&Yi5`DuI6Z zQDxs${SAzfc6gL^$11g{Wiu^A8Jkvi3h6Se%uoX_71ygv=!OQQ$o>=_juJ8%zM8Uf z`0ef8_PAr#n(KvLkT?0Zh;73a&kl)ZA0l%B=E0exfk6%|qmf3y>VCji{V418I?bKS zhGVl%%Q8da=>nKFNeH*`9q`wA_+{tS``|G- z`2@5(OtjoXptXhR@w-iszo(C04y*mg(JnG2_NJ2)TeZZUDyqgc49j;nh``mpAPAYy zpX0%Ey{JNwi4z4{U2y7x!_m`t6SoK9;lneE`ot+1G-xR)zZOBkqOh^eh=2u)RI5>^ zMn*+^-C&|aV?O*;f8Tb%{q~@uf>vBrg(h19Vf4k&{YrCnN>O6# z289H68R_Q$fN)-}vq&6n66D|rGE))^eojyQ)(%rjjEf6}%3*`yMiJ#^cS*wj!eUJ% zD#F1@E+dT&qe68@!itZJ8-BM<%F9BdEZz2-hO-ArW_9}0NiRRXN*@fWH&ZA=~G`}!clyLg)jM%HTk39T*= zka%!;>qhy*j2jt4CJsHF81Lg)Lw(#d_WSK>MPN5et_x&(_nYM!%CT>}d_)&J%l9X4 zx@M&3uva~ecpkTU*isR5)5KdZiHl#IR`<1UpZBpBCZI`uzf)Dp6;_Wy^|f_dY`cRxSPITLm_{wx>@t6Iy))_wmXA21l1*0V91ZL?*sG*(G`3m_e%STM=;6r z@dk#_%j_{X*+hm15rL7hh{hA9K{1rwj~NE01hUiEp$67gg+0Zn=}63C7RJ!!w{hGG z3EBBD6vF$U(y6oVth=RW09E`yjP zQErsKU@D4Z&u6Ui3B^%9d@_5g3Ln;feFc;kMp&iT@y^Hq9B_S}jsOX|F2R<)Gm&LW zLnAF^jgD7ZXhI0fv_e+#M$h}il%?ESyRu zEiOtw#-)(O6YVr>I$$=*|7H`^mfY*tfnD?^L#M?{1{mi`RF+*(T>-p#kJTtRpxeDH zW2nX_l&pKgGqF5nTL}qhQDo-;HV7=8myEU63zv(0eSN*8^QQkRHyTOM_7fE?Eo_i- zWZTU-^nnE48(zA(e?*I|mn-QnQz)2Rls1;#W;Nt5#J^k;Sm2Q02HK19M_SEqhLxsp z9wlS8gExm0%^cnz6F99kI@ML$^>|;GS&b;W$9^Fo-igPjsq`E^lCa&*ST#M@pV`X-5!P}7CCh8fHq4=JJZc8~#nI$b(7 z#EC&e9L`)Xci)1~w^i=9lE1k|Oi(>0QIXfZ5IzTiJ!c0=s+BYWD>&0x(mJY7V8(IH zMPuZaO*!buNs7hPI5!@d{(l&as&Ypj!Lh(Uv$10B{|iG!v)if~kaCP;uhASM0ebNAceKJOBlm&b#6 zJWUD%71mesb05%xfzQPzgxS<-bSZXUs67Dk9_P!{25y%^9=A<^&T`_hA?P@J!Nk`{ZPJk5SD<17BEauO#r}^^6&45ok^Y-XDNiM zjYE|`+ev@6-{Xk}-)D^F+!6pKi8TZ;46C@B@}G7|jG2pKsE6<}_yGmxi!o;`Wip0}HE4?K%p6Mx)%FvbeK*N~PUp)bt9aq4+w@Lym0IK_D1UQrK;u9CIpL9Df! zwYI%K<12|ujFiZqh;a0;jh$~yn_Q&zgh5BM4H;2S_~$tcFN~kaG1y3Xrs~jjfGN>H zf=>s2FUw?MMm?~Vipd^OOJL|#iA$xlQpe1Qq(-H9`u_fEQeIKcJ_c+SAVFGocHb1}?@;Cta2_=?lCgbc5&Qr(=!n%_*rJ z%@$r_b4No9-^{xP?z?gi*}+~`%Yg~O%*K7|XRuQ55$aBpWE*bGhQ!|yU8BAkB>t}e z{_zY|KW%gbGnkF{1*FqnzG4DbPq>&cTs3lSk23s3#Ud5HpCGrrYzRK^PZ;xVJq_3> zB4|h?AY)%ckp0EVG&C}nMk(kpIUtbY+lKthUWtGB2)b?VSS$>8GIEf}UHaP55$NAw zZ;Q-SGD2$kEGx@;UY5jTTw{uLLesW)etZ@mG9X!&hQ=DxLNYEt4m|9av98oRC)KtS zzI;9BPuY*(GqBH@ypRW*Vwn3fGcv|-B7F=G+Jbfha&5B$1Hs>vh`$UaDhk-b&@Pk% zrs`Bdm~WDg z-5m;$@#qckM!PWcp^t&SYA9DZ2A^K6DftI!I`o(DDqY0Nwu6)c3y?SLpit0ccj`eq zVwIJy6EC&|=y--q2kuhy%T^n_p?UmSHhB#=ZNq&xSbNM7xX($Ak7`L7>q(VSs6XFl zy~8V%g_li`hNDBMP@`S>w;d_-CT3>BrV!*KBSx#hYf>(|V1-!xCih_>bZAd9PvECz ztON^8Gd9kIbYG^rzn8TLP9o8BfyA+kWZCK7^PdDEABw!%LK@;OvZBO*$#-bDl9$)O+FI((B_MQ4D8e}?A>^P4vW2;!R3CCPR+7_!x@i5VdHYP;eVCF>_OTk zq$KK)Q^Q0@+2keb$TlE_8s>4tMJfayrlbEB^4jeL{Y4g`bsOjo7{9kb6rE&^SC9G< zf+{#TX1Ok~J~KN{wp-XsWo1ydPU?Ao8m#q)V}KJ<@S<(s%dh^dkr4FRP{NNK2jptj zFK+kv7%Ckq7bVv`7(bCCcpmW-j|VAsATqd&CKjW2kRHW&N)v{oOz+Oki_|g^=ftVa zE?ew$(g{7(9-4QO`)tK^VcdkZA4Sqz>1G{FT!I+SgbT03pjcV8zte zFDcwDR*XoDbTESbH7l+{1w9Z#5uA~+DnF#nF_ho697(@jK$=WA zP@q$SRM$X)!s6AGcJd^4L7t$AOHwq%Q`eq_6?`8=&hZ1WL_5i*?viZ6zM-hkP3DFw zUBjTtuMq^4N+;R_1lo`cS6xyx^2`JVA3nU+;*n=soF4M32Ynaa5ekmhHu1!*omEMp z7(W;-ya*I$yo9P31bGij?Agoao?VW1H+WS9kCUT*>(^{qH4Qyb?gxAhWYA7Gw;}6g zdiJ5XelWqKkl>=|*e1;=sFrO@SJMy+n)fSVj}wuQWZuOMzFCs>ivQC5`H|JMp==4K z>|(@7m?y2y&Kl|Is3KxmKEw;ixGh@`3MU5}!D@ZCZ%ar_1h~AoZf;+kc*t5sFqGp( z@Zmk$8oF*%DU?JE{Be(FN`nQN)mR-eZ=E%P-fWDZ9gW~!rgxXtHOXKRl`!X3Yf{sy z-5NgmM?7z%N46a18sfDNzu|gG%mGUZ>#%75kL}`7HaH;)TeD__97crOn+dWmR^~VC zM%!hI_ASJvP&l}_DUwNSi(bKz4q~AB1cc%9CP|1Q7N%~`QWGe@c$Vfy_?0ut!17o< zSMVf9P~}w{*;ip!SWI!j1dJ?D9ta;~NV~4XTN`ce9&Xx!wmJPUO`aeIg4SP~lYV7} zrkV=50YemMP%DDFPi&8r!FYilIcB5zYpgwC;xW*9iPfgkY0V>JWRh6z6)hV&dxl+5 z2{Z=zYE^g#R$o{cr`R8W^T>wi^4BC9qDjW=-I z#971_%cayIkzsIfcUd!z<9q!D*PeEiEe@5m8VwW6QlcB>`g%Gfvn#?8^H!D zUHf|6n~RBJF3>X@HT$o`RayX-;-lfEA2504X zUiL13LniZ5GtwYC5S=jxf_xDJB&P#79a#T|wYQ9ltIgK6kpc>LDcqf4!QEYh26qV( zAh-p0cXxLW!QCN1a0u@14yWEedw2IfZ}0Ed_lr@C8f&at>yi1)dEeKZO7R~z36li& z{ z)>z`{v!6s}g#;oo2UlqBfc%Sy9ez-HTjEWKVp;_|4)lxXCG3zUp7_HHZA--C@>QgE zqdKV+NJ@_n!~(FB3ca2KgT55xP8Ay0_xv{cUmEKU{M`?<9B0-llEBp)*8zg`Ch?p4G zPKnHgK<-5oX_W;y>55PQ`s`60hea{h2Prdj6Z||Vjvz{P3i(>gY=wX?Vt7U<_ftb2E7M69qS|E>knE3d;*yAm-%J~jTP9Us~h9^jBbq3-1ee-bpUDGMF6Sz9V7dY~NB zy;32|ltV@hJ0$i13%zJa*&!d`4S!9N3HDpjpgA%h@*up+oyaH z!PuDx4+M4YkER8pAsEc*3arQ!-oce0og>e;9jk1!RN**c5CtU@Q&kXT)KRk@J<)mx z@fL%F&9`sGjA4Jn8{>*amWN&+Zn8(?Nzex$5cIpPe5UozC-0M&9iFTvHffw#+ieH@ z9*S**Yzzq}Hn%h}awC`%wjrT1>$4Pkjg!npg3_Ttk2M(-vBHYvRK673#gHKkPIPd` zsg9AM^^soZivArh7CM^2N>6vD>FHV07*J`vm`3y*3%s^TH$lgpBoM(PY#5^w*|GvT zfCjLZW!b-`FFtOk&K#r{;vVObxj<1CQ@M3 z4g3v1orrECsz|%jYA*-d4J-4obOL5MX3{QZk$BKMscx1G%38T-{q`vGsdR}Qh2-x?{Ho(Tsmkg zG^%2kmwD-aYEfEQ=_fp8h+~bANYalp$^Yz2StQJ4zY0Ldq%6UcF$x$u{>aFEz%Yh; z{pnM}PSm&;hPLjVMyGtv%7@o#Aj|c7Pe9Jd&P|~_MSie}g}Gvk7$>_d18usYkXgAW z!Uyh{*F>3$1Eq1Zhb)=0Vg;cbHt!S+0en*()04I68$AiUwNp5qdxL*1=>N5fB$Gg? zAtWUyjqS>58tP3$62yqGlQ!Q4(w(HuSq(+c1tal(J76CfmJX>e1<1JKo4rHdlYhF- zZ6u9DW9OXJ2rxyfVki~PXS1SE!x@nY(?}XDXhIxu1sCb$d%i#nGhr@xlqnAw*;d1|Gwp-)+tx)-;Il0Z5YHL?Nyk|sivRg!mNaPaFEqjh zV|F~;{W|L85J~nRg{rO>jJG!ye1kO3qx58+_82I^6e0X)-6iXx*i3ms3H>H~B&8;4 zI(aVzB^Q^c{#}pGuM;!vAPmW|t6Hmqf61l(YbI>i34e!P1Eb1#JkR*q=x9=H#wblK znN>&gv*bc7|7|PLi%z^QzSj7C-s$b=pCYqh3goK?P%8_*9(;zJ60N738mK_}( zC5zGft8_fKzL!2>SW-`2o$9>(Id753MU1qmu~F8@C%dt!g}`@ieEeJB&9{J1YmQq3 z+Mh`8bKHlP=TO>-2nLI8@IgvdI1(Egfy#S3}SxrdxB3c-u6i znZ`zc%riyWH!`|A7$27}tFS2Evs!Afpus@6?UpOkdt#xb$s6$F3d=(#m>&)I_iA;! zjE4^}S+V6@$?vSxSOMp_e`o`!scD4W6w^D$f3e>AmhT3KcyGoDGNgmhl369;Q$kHu z#w9!RSx81(+#Yvp^kbXnQA)ST<=2r>P!iRLyE{#Wa7qvSV+ku1(?$HLsi|p=zBRx} zrD*=A-Sme5@LTuJQ_*_6-}r>0jC5#%Io|7XZhWqvGp%$Xgj-8&cOD612~RF8uj36K zmT(6iTHC-bN)kUUYkG#x&c)`ovi^;%3nwu5r-x~p-A8@txj7C;^rPI{FAKxLx5vu% zKrrqHO#q!`F*+)YgUr@w(=H4uPkc_o!lHyMHZ?0PD0o3dMP<;2kG>o}tLn z7rZWq2?IkFbZQmS(?27Fr<5n<KZ-p#Z~hOkXtRES6qk5&|yMgDRVQ$4WVD$+62)tBk)-h-%^QlE2$r?WJ%^ z3`^;$Bg<*<%ClIJEKx}W>9x~9gX^J^^X@<%0uT{Lp5@0!1t~2punIDh$MX-G1flZm zaj1{jcp?tY9-H>`k@az2sb!ozZNd*^bPP%0iQguNOb(sTmOaLsxSFH9qI^1JOOa!G z;8q{oa4{Ux!Zu026gbA$iT;kbFOD~yJ6KH3~zz1=#jLizQCIjTuTDoX?Y`_&~r@*ixgkY$Q1W>ENZCxp?|9sYTiS_u85*kT&>0*?k&PD4*3dot$Uar42b!4XCXzL+HiMj@>fxXfw397|7BX z0!CZIJi(EwO|0959IJ$hb6|=Efitfy_~7n+eHW)-${@$mv$X1!uHj~TSQuTZ4l17L zM;21$;Az*Tm^9X?edLZNY5qDCj2yMSB@vJKS3{wDvC(~rA)&BWq|JY#oN;-$D*mTny=)2rk}_d&qb=jKxa&a(xmuOH=TW*H{{3a z+ULZx4xO0xvzEW#03W!QvN5iY0V51|iZ-{mQRzhQIu0%3@w@F(PV2F@GdMZ^wE|tM z(q3of0zGMAQMQXG?vvAViG<~3j*G28MQ7XXtc8_t%UQ>NxcWc6$>H73K=2|*M9C}i zx844~U$tKw0VGxA+1YlDXAL-=^tbKcA9LmZ$Ln}iY0spN+QGg*Ixd&ZJ~$s71O7Jj z{+Vt_CWSI!F#5>DLl;1?&BiGRKO+raK;`z*B=eu|^DoK2Zbv_plG#akoJbY}Sfyig*`XU-5=g7W|U4V{Vz!xyXs zG}!%Hw&uUz@qbCf{mcTsgTtRaWh=4&{WpR)KJbw7{5oItzYPX(IB$dYEA#$;yO5S3 zaD04xcxR^&00YC6Bl$%R+mAU6;`w=aIJB{;DQvDoDzPYF_9Ya!Xo7fIc4?L7vktGE6nnqS(`fElpw0=7e8ri__Q%z%|3 z$zz4tKW%*mv4@3LluaLIh9wV(c1UCgk^99d~8RUgiv5lXiAY$6|b6 zOu&4ujx_q@)p}VxrdF|hWYxb15QgCTsfh`=WjOO32M1f2pOvVnzo~^qSl=eVirrWH zSo71T1~m<}(e91!V7{`non3TbP!K5I0&Uj%%W+{-(*)9wR~EPI>}dc)+4$aGD4Qvx(0p(~>G1FnT}dqw+=5Ogqy1^brSoA+&hfI>{gLZ^@7{E1 zl4z^{=U=-@5JVUWM*Q5|+|0@f#pdQ_e0Cg}LtS0)hVBm{47u0WSJh}Ie|pk30kxTS zeX*lhq}OsY4-ZLLI5-FWx$mUTqX!3znpIcPHScpOt=nz6$p4(8|9Wp58DS9E=!83+ zmwP%_VA;Va7VJn|T-?ms8WWgy5idpJt%ZS!xqr$JH~1HPL({-p0-u1O|L~iPlvGHi zUYCBh_mdS;`D{@|1LCbWWr)x-($1%R5PwW`bT}@wWyvfZ85t*!<4r2KZ2dVHHiVL% zegFD>K+O6tpXqYm^?B#V3rP zX9w0RYDyRayl;Dh5U-fK-Z-Sw$s7WJL?T^Ch^Ptso%aHCw6v+X2qRA509W+w68Al{ zb3JO8{8tTJWbeVs`dhTkpLQ8hF|jV|hVdu0ZSU;SLvT5kQ{B;|YTnlRyPf2JT5Q3Y znZY5N!pcfreYZClT3qX*uM&Bcx~(&`wE8}~X06{2>s5f-UlI(D0HB*uhMM8D1`DbW zg8CXY`c!0jWLNaXM1mez;RPaKEi8v@=*S2>ZA`t{=`zQIPK0tgA(|?>B%Q;>h6rY7 zLQ)bHG<1OD%YzJ>@Y>a3kC>{C9)n%W3YyG(^P|ih+=@0N_R#Qf?KtU8NmYk}EP6TE zEew7tRl>PNMH2eH+X`TM4x@vELp`ynWg?AiII}^rSco7y}GpE=gQYl^(CH0MTYi6_yoXfx2b(o z0b3`@Mux{921`Heoz}knpa8Nk&f*Y~Px+klxIgr~7RTfWcq%?U!y@&_V(Vh{QdNN& zgS6^Ez3XdKVP9WyVxI@HGRV56l?4V8p9?=S_NDu&EHNU|6gNSRkG~6i`AjF$=Vlfb zEMCIEkSqn@9$4r}$;5tq4}gc??0zk&-DDkfiE<=v zsVyg0amhx`Dz=Uj+^rR)FQs{U+7oRWS-zXWkRL>yRe#l0-rcypg3@m)~o{fy?F;kT%tB(`{bL*YaIiE4n9hCg}-%%o!Q~(y~_Vx5t#OLKHGc1>qTq*k7gK-srqV!D7&j17X z)UWn*&WCmEJCK`{QdV8py-6)JrsUQpYSTZI`VlI&1WJkPstd;sU%KV*uDJ^NIp)I{ zStynC%7BsMZW z{xQHZ9ftYl%jQRd=6zI*@Y8)SJKs%5*Vi6(h|Z5tA|fIzmZ+jQT{1T#3%k212AqK^ z8XD0rmgjai3!(1L30iBdCVYvmQc>^o5zHNoVtr!9aAePLUGLBF5G1v-ZiLftbY!eO zHxBfVZ#nNz?+9Y-z83-KV+Jqh?-_(Vj`BWl*9Lf7&TBuLWbr1%w80|izs;~*;3_&m z8q5Xtluv(}VW3b&urHXO#{p+@a!N{b*TcJ5|8x}d8wb3iN3-+t+P!g76rOaw(% zFK;?llrjbZK?ARd__aCp(%#EvH8vwJ4@E{kJU)tGo*;?%wfAS6=hsOyX&?Pg9#<4^ zkHy#`6RrIW{p6-z-~uU#FfBH2S|$tu(GLr=!>kqeWVUAu>|!u7sslCS!wG)4C6XXhIi06SxHqeU*?FN1UGw|~{&{{3xzy(cpSon0kl zGq$;$Cbqxu^LXw>zPt*(Kx3gwiQt)~{$kG;Qyo5Z90B8e-(YK?ID=UGN$W+as0O9w zpW&AzKjOb5|TV*W^MfT*Fv?h!-v6NXs;VxL)aeg;NjTc|FOu_Y4MMR^N>j4^lrq zY(pQs%Ul5xosQ9{WiY|*LEV+22?ZHfn(a6?ZAC8XHla^;;$9$64WL=8ANp zI_}U)>zAncS+xFgs*^!!7fZ(Vsn}t<%JK+~6_b{3Iyyu9_KS9M|72J^ik0PQLeHfP zJPLerM^Ih-h65hdp|DJw8rQvyT5K1<@z0T47$Ry?b*BoC<`Pv=RL52`jP$oaG0r{7 z2sp~mwkzK=nQT)!$Q==I>_tMn6=rmKvMSPfZ}aj#fmHvygY$R-;vE5*5iWiS8-)`K)M za}ur9-mH@BTAJTmb@hWYx4sBz6E&3oP8@PrJfT_2d^H(e`C0Pvok$%Ftn}y1PxGek zNDenm5LHS4^t%1m#2y1c7XK8Ax!L64XsXYT1(cf zUP%NO$DAq6mq5q-uCDb5RMrk}hf6A2Dpg8w`_Az2@Eykb($nQ8#I)&pzhIJKiuT{g zdy9znein!wv44D?Z3~tcU8e-tf-0?%qCBw%dpM+`yJrtly^eL(*>>VFByp^t9-S$K zF|MIg)p0j64F}oHWg|i(KW-+0p_?@`QE!5fCN|}#;Ml#Wp-m@zb0{e#gF&aohJ*Tq zGBf>abo=w!iZTgD_ZY2Fvf)+Pwi|J5X_k&xdFyeBgU;F_?3BbjU+{HvNy&;EW$W4p zF`J1hi&ig#%&^CFo%O}vWMg5nLD^y0t zeY|$RTeQe}W)^uUNwRHO*tp=ZxTB!GXW-^0TAGVx736Zf+&Y&|bjsPK%MCks9bm#5 zNEM?~T!!H+GWuc3=~nlcEynorC=n9p4pkgG+rh!>gKz=3HbBPEq{y|D1QuU;ziys_>Y{zApnpGIom9 z{Es^(7=YV8cT*=YW=R~j0dVb~wUkwEwAJQ(Y>p23LK5eB-k~%zJ5$)%sW`eZmK2{! z{vow7B{@k(#-VN`ch8?ZT6?10sMqIWR;g$#mPf!5R#t#(k5zsGH9QyGj5zXfsQN6N z%-4`o$<9A$bpUTNLgr;}ah?8SAJ`VtNGMur&K23nP*IMy{8$J7Wu?)oVC1JcQ(LAW z7&P^5Z(O_eYo0Wx?JDU!I2lCxVh{WlQKRc+5C40eG8ki z8Uiy!5m2tMw} zwu$?fYNc)Az+rI;1Z=CSt}sErQedDFQkKDQ#-s1Y&u5dBI>VY_;GVDscE?H6Ly&Fv z+)0V#C+1bp-$9B=OGxsVsedjctFT@PDTFkgLhEhBlT6OQhj$DjGr8Wiq98R47d{jB zKUn%9sG?!!v9q1e`M4y7U5`h8@@D=*E84*`RM5`TmFzBEm7!ssKK$ge&x5y%5MfGdzm=rR@NC9 zm>D5&tqJQ896dRn_QioAuRzoW>!dJ zCe^;l@*MpH=3Ch2%Qa(*J_6K#KkujSWHm6wXJL`q=e}NcALZS`!xmJnaSxILb%Z&w z=k9yHO?~javdnIDi5Xt+R41QX)R%0RBkvQf;XC_V!t93*nxXV~GE>IxtP<+zW?v3@ z+b8%?{C1=>%MdnN)UwlakdwP1Roa@9VW-_k7O}a*^ z(y`HFyfGCxUfs||3S9VutcwSFr>l{R&XXyMp56J-4e_X-cdn=2BVK&pPwj(V9q|Qq zk?O#B?wmOA;ViJYBf@C|hRo<%%J)Xm4QmA3hqOC9 zIN0)=wpZ&jgo0C8Dg@Rkfvz%fQWL1m6xQGUe6=?`iRl z3q3xWQMkqIe*OzN;EP{uO8MaXx*#+Z#2^Qz4=Dw}PsKZOC*<(C_Jop>xVv?^b^IZy zclbm~IEu#W3?-Wuh*$FRWEl_{6FE|SB3-I4xvMHx@bWn8x8?V=+tsP};qJSYcEU-# z6VUhSzMx$`5*6*!@ep#3pq{J4rk)$Wbqf4BX6d1_$+xsM7zqM%l)%K|>68Vv_ zdW)BZeQ`f&Vx%k;jt6rbi?ujyI@dfMkBrfl|0vBICjCfh1N3N?IhuA^YBmyiuyvtV zpr0P#@>4WRBhd3ZrQ{DvLP`zV;X3EExL_9g>LYO}l=wLyRRmxO%l}s!V`*4-gADxF zFF{)eVTs_?F8rcN8FU|TRbr;>DDt$^3Ps7m_Peyy5v_L~@^+ePBRP8`{vl1( z9)ac57LHD$X!@qI3+u*O#nzF^nGY}$q4f1DOpF#wiRaR{n=U^X*zA)(b# zM%>f` zWd60?ahG1Z!My2`=QCckWbg3Hgo;rr@-f)I!z4_Kv1tM3xKSqBw_YriC!pUL#0$`s z(W!pF_Wz@!vnhw=C+`O?czK%FXSLExmd1K5N}qj+uQx z?>j z@kQ7HwrHa{*dyrmu6p&qn^8vlzcqYx1vh9M&NZj?ith`EN)HA>s|vTvlgcweS{I0; zQCKNs#6c{@;xbq%Gx7)<|Gtfule;hdm=_I-{REoMt0$v@4NqgS5>lms`|@nc9Ga>0 zp(O(M_(UI_W_F8)2^i=95_-Tmr#p}tCSHM;} z4hu~m8Ytux3`qU@;mn?PnFv|+9!CxWf|FK8Ttv;$nsC!$qXo@zk3FoIn+~vP8<4<0 z1J@M8uxLPzo-N7G&5W?4tT&s;qQ*?j&3DS_R7ZU_ZPepG%yCF8ytvl?v3JKG$!`ZP z(?Z#Tc{me2@N6IuHWXPL2T^Rw{}&Dh_cW=Wv^-3Jwi&#{K^mqwDz=_p>QpVChiIC+ z){tLpqrUvP)UeJN#8!So*=YSp-I#4d@tV(8|J5ci$Ry925h~9wY2uX)h@tR5PEcSM zI$WXGuU3`K(px9iL)?>XkA1Bx*6?&C|SL=s6TkBx!5grf2<;?iWi)3i=d$EL=_4wmqW;c}-|6yEo)_;FJOV$J7HS~zd)vo${{qXq>& zNRz~i6BwoveRt+rr>_*E5YY3v=_5(y>>nEPWAs3?jcmlxPR?-+WXTUvbaJXtOVr$e zN`}o1*uB~{X4%6YBn-zDC(Z?2vYv3~;3hp)T( zR}Bp?iyF~<+)A0ai0TIw{R~+jvNwxIcCd%J8UlKDG8`3(oX=GxnbKrp<1pTErAsQW zfh6={RAS13cxYyqy#E0k46e$Ff9o);5igBWuA&Gfj?feO*&f`M8Ak53Zx~F4u-QkZ zo;P+<3#h^`hO)4d7AEv{t1R><;Y?V{gsxuxy_@(mZXS%Pg;vOPvT2o4FlZ2{u}qVTQ35l;UkAIs~|tWDI2eZ zxUOf0oB=p3hF|tw2|)7lDL&z{mb&7rHH?O< z*AjU*0C5r+Oqnf{p3@Uxj?fVW4!#oP11_+F(qR6?HZ;BFS1&T3R@50F*Z| zhSAfUu}5HIC>)YTbv}>J?&)J;1_Y{(wU0}kyPQTE(R#toeT+(%9L7O~g@he4+F6e42hM|}V6rZtlzizU0y)4F zI>55@+aPtV_X%qAgc289FwA$3Fh>|UBrMKmL%x>~Q3W?p7+!IzQmBh8GFwWK=rk5e zS5CE`iq&BVE@o$&$Q#neJ!w=^ou0>wTkg$e@A%KkBK6N6gLO=C4rrVfBK?a!)icax zO|Ie}7H*|Q(&0`64xLxf6w}d0Bo1`=_*3vdKT{E(9>CRM1FoxYLeW_AIjs(IV)X+P zsElI1)XLMSiE7JiTBa!c5nLdLS;CBubiZZk>-6U((E`ON|3tSsK1jJcV@X)5!aZWB zZ?_9kSl#3tHYCEpg)!l$Ez4I?f?Jm4n1&%t$U79tlbZvE7E-7S05_fRed*h2 zZQtMTI-hx}879u4g?A(;d1(BBl#qLj;o*cd-F0mz)^`nbhqi~)T_NjJc#gJwQMT!O7EyH5f z61T-1$WITft%;6~&i9{%;qmuMdUz0be=O=#=5qs5V2C?AYhJ8!r5E*PhK{8i@4P%( zKZ5;-mE}O#*!sq+fryk?Tl9#9iTw0gx}Bfxg`+?|u-rsyVlI8MA(LduXcLA~kZxWo6D}Wp##r-OC9I z5YN>fc)ZD!8R&no;)1z@3*9*@B?#q0&0qD-#!7V>Z_IB~vT$FkA{f$Jf z1H4C(BbLeal^E1$fHCwt*qd`~5c!3qeFk32s*d;=8OO0N7h75K$=8DXtJiM)FcK&g zMYdzWkn|CzbM?kCD1AOi$09tV=|h=KHhy?Mkbl0#B?t#FN)Rh4q6{O!Iu2SAQ8YnyCQtNV?NnOr7K+4zqjQ ztHIqlsC;ON8A05oQ$-?Jtvk}^L1xHgHmA^Xuyui7EJ%EX-9bY}Q5tqolQ|~LNP^Uw z)?KX0f~mtmj1(2V^3tA#W3yJZMz1E?*{8}ta}+@KuktOI>l7t*<#Nndgl;)rq#mLC zyx1uzd?$rXgb_A1AG~qOq>YY&yNAkP(1-+azfJ@;;&{!2`HXZBVNz}SFqPh#U%h_3 zQ&v}ZcQ!kDx1&oc?$>rH5ke)}$B+irbhbz>OTmg*K1WU8oq*Z$K%cx`r;!9pc2 z0D2!}`r!P{#SqFwV|0|WEZskWkn5tYdwXKZM88o}uXO&`jId2t!R#l|WKmWbCmsUG4QY^d4VA>EE;N~vhFo%;uPI)?Rp?-lp1KYx7O&rwPGWQ9IF z-=EFLt}6*X>Iyz=U@pRQe(|k=Rrz*vu&~@>;I&!%?VI!P`P;dDUUMh_()k{tee&+K zhRhJS$_Lf>ysFUp?Odms2@fi`J3w?}B{h}9+ZQDm=c~%{I@kBK+=z>D#gXPJvviwD z&`jK>if(QAlT%7E&VWvmfa@8C0Vb?51v+-K<%Db$eDc@D@gJFmvH%;4%2=Fmvk9?R z$3`DzTh%36)c4Q&nZc^>r7WNS@Gn!71XMn>Oj(R5xs;5yVe4H}og77DbG$%; zfV{EXSn|u8nPyY1bGu;!-__ir!yJaNxlwDnIg*A7h{8TLV8FL zwAobgi(6~psHFjkRUDP!OT;UvzJgZ7&&N!v`~^9=%e(v&Cw0hh1>Yy50mM(oi^n<% z!n)4Goj_#0?zD$@oA*GQunciOZcmB}@>4^Ilw={%uFUJj+XxU)SmVhP zcR@*<(eyG-3BO*={h^D;Q}uHQ9OWNudS-0<d6V}Xd2vy zspbuDH)>mDvPl-K900=h)yX2%9UTxR;#CUcM}7TGJAPL$bdlQN0rbATd1`5FJdkSh zdHoq5s#Xvb6l6W8np|b3MZdd1Nu=GAc&x(?n8$$pJT0wZUT9&6F;?W_8o#aRRPcU} z8a<+b!Tvtt9T`Wqi zVxQN-^KJo+1%L!8)(!r1Cf`3%0I(~_W&8Htf%s{-I%y8^4A_iTZ5N`|nXN#T~N}qr~vqj#JWwOv| zwfv3F5k!cmp?(Wh@=JzwkX$)S8phxU^umS-q&H!r&LPU+cbelhGn*6Ft-c~*NkE_R z&^p_Zh79S<3Fnb|a0_%nI4h7=8tKNY7}Gk5YC!~R<|kLF>_8i({1(JPBoA4VwbL4w z%>BA0__Qs6Cp}?p=-QWb%(icdrNOd?2D8~fDO}cPLt*EJCo=aEnaPSGhRtU8h3Ldi zO)zTf8hP!75dDJzRmB5ggZ~5JoJ4zfOaO=cI?4SbVMU_CCi^wda=)~rgHUOuvD-ak zC@p;qxls|KUktT8e~X%d>z=QovxR?_hC)V-1;IvI+Q+8#g+!gMm zjS*LTI?e7BlTGMXA@@S6{)VQOT1>K)ZmP%wGeR$Y>jk5u*Xbg$Nm(#_r)vURO3MyE z*K=HnaT=W_7IwPc-!xU%)`GqY5|S{E#YCmN-}W*%mVRTOTw|~`*V9|O%2iySn3A-8%ys2xg$RTi;GYc66<9wvl|}H-n;NMS5b$fj{@~%y@cw^ITviRfS4f<6lH`ZUx97>YiviYoBD zu?(m~Vi$kQM%4JwXSmn>_PWjsEgm0${nO3F1Se)zYi`VS?bJ_!f0*=-MhhwJXE!JO z1+vE*=BBS``0YGQIQ@zzr-YIgb#}+kHZcrnA^+Hl<$to{=%zzOg< z0LE4lXW~hz_c$!th>ZFdnmaB%thRr=xhLOv``KR&cwEh?V-_kU!!`ah*OB{{H;xg_dPhdDZ27nQ~Pi zsNnD5?f$PF-j(7)x%w?ZdHDlA)dj8hzVP6zH13+uH>W(=NNtIU^nZL!2`qv`2>%)s zDn!r4xcP<@8VHlvi`?^ibAU(tdPdm^s#IE8guUeP z1Dh}gu1nG29m{G-m1bsUKOUFn<)H`Emr{$&8^@8>{^|3+%c|^!w0X7z?B_#S#I^qlW1L5JO$650c`mCI|&k71mhArWx zrXdaFyL0_%)P7=;##+ZY^-I==MagO^u3j)>TkYm6S+*&fQBD_T7w{AVDa? zTKtV+B*VU?OjhShj0UBKa>#R{^C#xDwW3W5T!sBRh|H%HuEeCGf&WvQ?g2{IFAMcJI2l%T#4GW!$*?yVc=K=i~k9a0Ll5b{a zxBJOBtX&SI6n_NnB3+Aen+x>|G%`9mBjRgjmUI%p8w#>POf5q7JEG;GQ-lxZp-nb6 zDG))EkpA)|!|Q2D^Xh5JK)p8%(2oIY#k&k;O<1d~qXT&P%9@Z6OIu^JOfF^pg+FiM zZTjll9}m-?yWRO-G%5#)sOXR=(a+CtJ5^lk ziNS-g;8s5&Co64oHLOcY9qli_TQFrA2^{6ij6T=pn@$N6w7x(0R?0U=zx}o1gMa(TA)GFusf&5s#!`)o}H=KBI z0qFX?U0JNS%At=68(7-+Dci7M-0lmGF?nWFE5DhifO>`kiMc>0<);5#mdPD}C^GZhWN z0!LRvL$o0t31$~^a%Fyqq$xGO;4bt{qpg@utmv-B-B={!A3X1aqS||E_3-_|6x7t8 z;n0Kd#DB1K8&c%;3-+aPe+lmHll;De+E*p?eDaCM^A1VY^*lkydmC9G#$nxZEJ{hb zx7$eLGzkPclud4KYLOEcZwxlNb_PH6A$Z7mp+?w+9-qgXPjHkxJcl?&-*#mSGW(tE zT6EO&UVI4o@knh?iPH6?c3Jn45B4u4s3v|c^YZv?B_`%8ONxu9e*5-KG>^A>od^yS zb%eL18m*jzyOtU>@cj`+{^NyfFgb*sCm}YX#lHC*^~4sCvASo^-`ay%)=Cg%@H~te zYZ`nX&wj!NzFl6AbF3X7Kq6)vpquH73+0YCff#bqcKySXlld>DNNA!)%4-cu4e#}f zh+RrVM5QxPT|UhG73*1Ov@hBZ6ui6$17f0IZN;~S*?WY|Fv95W%*vni9j8NYw2L zEf;~Ef0zm`T-Nmd3Hc$--wcS5*cJyX9x`*eQ)uc=EaXyERW)1yO2}Mgbl)7X5W#Ts z$$a3|7}y$EOM3EX!mqPdhGn!GS3n5%C?qizla%~PuZ~AKM#8Q!U9XLk-*Ok_(jOQq z?e0G2qD{&Q{o=mb`eGM_OaAEY{<)*Fs!E|aPN~sqRk)3nd@oxLR+W$;Do=P zaHkkN36=nFaltIr3G5D?JACZMe2M%(L5O0pgFK^aBbk}3_{a!u$` zX;l^r2_Z1r+4$mnjtr^cZ)V_o8Dx>zxYHynwyhq^HY_vPuSr}TxA+cP=`MwV*HiUR zTHsNeo+$A34X|#|to|*>``g30NwW~S|B!T8V^0jM&=f1v%oV4(Pb@s-pnXWc(A(xv zGZfBM9B&m#h7F)xgTTh5F*sKKT38Z;j&^**8&#-6amPTzMIe5hkCgkFmFC>>!rP5- zS&Sxta}gJ+yj}oy*9Ud zP2Bo=wL9tYGWNP56IZj_D+=sESz*w3MoNPr0$;obvF@q;sC&cc{;J&ruNxY^u{z#A7W#1h zS_C!M4-fVxy=lfnEr&~Qr&Ff);COVyh@$(vnFLF)-8*N{35jYi4t=x5F%n7`|Drt+ zY5<;~>mA)K8=L+yK%xmAo7Sc%wzT1f*B2rsCxyGOcW9m%35qi8MFli#(7EnFW0e># ze8jERw|$NsLu28&^dmEBD5l0Fi2Y5_;V$wu!q$rJv#*?9HGli0R0``5J;EL5+oYY>hq}BI_gsH^En4WVkxN=6_jZ#vrU*!0hBJFx`etqF-XAUiqWY2c9#i~T4 z6|Rqa*-pBW&nOidG?diR+fC+W{F+SfPq;Nkq=JZiu@+w^Px!g8u+=&{um4Cb+NEl= z6|29ECc%2g=#f@Jv2-_^16P>={v!ISO&aRzOadLRvXRuJU*ZZCr7URPIJcjM3|!7u zi!qJV5H7Dm79`ql^U^Pz)mF!QT>}B=Is2}KXiG7KU7Bi{vw{=*;N9?LcMRMEEj`1G z0pWZ5?c{T6CWA70;yPw|xU6ir`W!w8lM4AZO8G2iq|@8;2LJgXY?kdKOW@0|-#Q83 z?hzxJRwu=XV8;C~k54bve2wNBNu@i}yT2~z+9~G;LX-Lu?!2_yRF%)q|DlW0%(yZB z(fC8Tfq?Lmb3U$??~1bsB&H1JHasgCRG`wy z9>*H&AKaiG_(a@GMq9l|6l_95TBfSg3)~jt`9B5-SB~B7G}S+VTg^kH@TX!!h~|WX>wP>-7IfXb~-Fa0uD^}x8oLQ0}k)sDU}tCIgy-Bm`#v8-DlxZB_^2X}WEbOHwpOb9+W z0R{*X26u<{u3dW@ zpsTsiJScIc#zf!yfpNN;6BZX1AS`R_G0NpH(!$o*AZqr8j*iqHu*(cR_p6Ds7&FO+ zwbrQ!sP=XOnx=-SdG`(0rw2AYTN(`dR0!y}sHBx&OZZbx18f>g@Zi(=GIjA!b)V+~ z7iCOu?<~naEr(z)34^;6`yy$K)j8zeh_cP*#)|y%uZpNjp;uW4a^Z52D^1-OofOG< z>53^?1>FEzJR5s~V2$Y7VHfUwIbUVZjEsz`NU|XYj;b8SEMi?2a+Jz7E&BUqovjfSnWjPM`9PNg0ugs_k+|DfMzDp{-k9|bP{dyYw zhAoy6QF2N5+17UnsmVKKp?~g<9?LGto7T}0aH*J`8JSy{7q(ai8u4vZZE5x{?((D@ zdF#|d=n=4Ctpw6BsFm3&Oq0D&f?ZwTUZwKfGu!sw!$ae$dlj#3t;VGQAaMtO+Bv_5 zN+$Al$OOOI@qvqz6YxMg!<1AtD5cdC=Dry^C7dpt5T7^$!uVP2eRs`+?R;3Bky7}< z@dziZ6&2Ul#G5EQr}`X)=l{9dWRFA>>X{cN8?L6(Bpcl*%e=bSqV}Q6q5kRmecVOB zvh8v;{_agj@r^ZIE`Z~yO#KZZzc=7vnADG-)cPlg{R78$VvoRuWEK8JS+lWmZ?=Nu z$m2ZhDt3+Co1!0T(ZWtYH_kWbkfL=Jm6hPt)XkQPK(QXZ!eUolmNp>gAb+-9ioPvN zI5yX72@)YiMa%bmm@%8|t4P0uu;*+%GM1wzfm=qot8fNd(`D5ZV>SARmP)G2o3fpL zdb@d|L>CPo!=gv_(D6K04<*uKg+$|^M}3Sat#;H%|R6+=;ISUR?Pee9)BO-`V| zt1kh4!E!PZJhSz+sS8`T%Q^Iq6~m2@P`z^5AHJX=?$hzUKEcVKrQ}NFwoq~qhimRz zwF3j$;5My=Z@}(JC-ivhd%5P=gAoe;qJ?>>;K*Mvr${nP2pYUqgqa9#1C();22oww zsljOCn5KwR??2(ijB7u}_q3tcHzrZ7Vd#(L5)jJgZxS`+6yU^rT;{I;+1s_N%Hx)h zLD#V?&#&v?7Dy>_6)|^2f^cRHO8WbS;|-TL*r21+2w5^XJ(ohlg{-jgX*11l+VisH>ra zh_i&F(+_3RadCAZ`#tN_q|6pd`w|{uo{%<4pI|(@urP-R24UyUMUzugC*_7c9^wK# zNk%e&xY#}dc+zJ<>PF3 z>2m0LWqJkeoV0%Vv6>bG&WF(zyx9dS)6LU+$0f0ojOg&x!FUP|<{k2|^e|r_L=Gsa z4k<5^)ZNJ3EBKyPb^Yqor1_2w>7qa^(U?MWL z*54L&Wy;i-kKLtC*JdPWCUs$U`m{>Pnksu+fwb@allSP%SKh$J^ zbK9(rVyZs_(0$lSLYnG|6oaV3PDU2P)5Q727z2S_M#ff{p0XH2v)q3$kY||GMD5^0 zL}c+U@eq%^3N|`@5A878C$JJzpDB3IaBzWGvCYpnnog)ZBU9gljoF2i0rQlDY=r&? zFC#YbR>g;lYv0!P@aH}|np<3{>s#q2O*B{eB_#MU6ycVxFL8qk-t8ohy3Bv*{&m01L z-O}xJSe}9l=Mnm|vzG`%o7_upZegblR#;Qe19;hge?dS5BNMZ2RD^)O<}<|4-8~U@ zh;n(`A~f~XQfn8cWl8{jaZ2>;V!^1=tPb}CaK8h43n z!KOjO(|kLvz}DNPvD&r0vuz#a+V{>+&G-Cc7#q_AS&yOswV*{f=V=~db&Q1)a+|G6 zBa&=yH&_!%^k{2EdOvxfRl4vzEGfxT@Oz;!$(%vkTv675q2hi@CQVT62L@NoI-n%joO7hy~ zcwP@Z9WH6)NpstK<$>nzWob9S!zK5q6YwSE9Tcq55geVj>i_k48RT6|yV4f$)^)SP zAXfvL9f?-~Ic0F1wwjSIYMiV<_}T!HzZgrr*j?t4Pfk53S|Q0a=s@JkpRirifh7@< zQ%@}n)fav$tckN%5!v&@fcBQN3^abc!8ulgrzQEPg!U(V4QF9}5EyYq?T;Tpnawsa zdq2}>p5cU7l~?KOEn6`u2&!7ki_N9^yy7UcgdNFDa+dNQca!vl22N=fDm6cS9FL5U zx3x5kF~>-yWMX2o$8ECZv2Rt}m6wS$fIZ_0=8zx10imX|f9@>(wZX(BgDDLz>j-;9 zv&u)iKZWO*CTC>kVUv3&GqQ&%?Ug9KzkMGbudr$>UA$K=GEg7XAn5q|t1L8|wQmY7 z*OpIk$EtSP9E{+(51#T06cTil6rg9Mnb6w%;+o&PFP$*nt`yjfqRE0;dKJ|Hqz~NZ zO;(2WeLb3c^befkj0n=w?PM9VT}MZJO`NO>t%h4USnI+~lP?HQ9#IWkty2pBUwy_{E zFmlmuj;tytU6gaJCSJm>{Jg+}`5Lf`GNU0@9>&umi9Yyrq4tugwISG~|An%sNL@@d zV;lfm`~BsYr@KHOfpQ0=azD$vBrbuj(1PL+Yvo5xD=I3G9DUr)a&_u?C&{>I2dV8NX8mT>?}w6duThv%q_+k&x}%g9%& zhg$EOASNW;hk>pTdFP|Wc#z`pYos(Q-02uSb#OYrAh*)_B4g(gvjDyI*YwXxy$m~c zPzLV4I8i*C>23#UV7J?v!wpz=?fQE+{Wm@<2>h?F`LE{Fta9k0csFw64~v|HV{yII z@HJvW!S`#Tf(N~~-~p3}I1n@Q4lo4EB#bN0<0 z4Vxb)8@syTqFzq09a#=Z*CAImITol9` zMR&KC7(K>zR^J0F08hA`%gVhytWB=!t;}Npi&fXG5H;SI!QkPYw ze}@SF!l1v0bmc#9gjI@xF|9lf_*mg7kg|%z7h`E@H%y{9g^*sk=E%Zv@{GxbJ1#JtpfC!DaQ_@Fj560 z4Z|tgSkXHQef9=Xx*Asw_vm`7YPJvZNc z#=~9%iS9ohFqVHGiFwOCT1iAS4QH(=DDmcilPg2*SuW!1wjQuHC$vg21sRxZ#x$Ot z4Iq(b<|E8(VT&s(k8bBtawr`<95V69z)C3CrBfX1^SD{O^?3p|lM!8e%2i?A^Xj$g zKRj=TzCj=*9dM3z6g>J*ee{XtLSHOVtEygyBjOEk0N5N^K)=LanL9kF7OsPDXiV50 z-W;CFU78k+Nz@&Krw>Tgr$vVV$4zk3et`HJ8m?#`tu>0y6=UShleT)Ms8s)v6@7)c zW=zv(o!!OSe(qsCva>OyDAFs7$GVW33emb_9`4w9&bae1RQ7@{Q-gxy$uX?l7>c_! z|D}pfxri;|-A<~HT4Vg;x|T!gIw-P5kP3jjf94N?*v?2)xHPX175lFpYn-zitGiZH zYRYhrJCQ#^q}q_Z%M2fUIksP=bNu;eF)fo2VN1hk?`yH4KsT0&VUr{+;J&UnP>)`z z7Fus>EamdI4!JmF>%FAl%43vU-nh+x@dg%3()Sb^(3nRrdh2Z2QO>sa>QE0y5BQPn zvk9~nY`8s)XM4I1;CX(g5ReVjLvfN3YN20;8J^1h`1a5v^>E6M$>Zh0lqzL%^x=qAlUUzrcX4~%#e;qimN%83oopRxx7Znm(ZjftiJi`^-i`4yIurX_>GYCdp!2et@W1Z(me%!k3MaOGB*TVs;F<1}KBM=|u>{IK z!NvG-{kk+j$(R~Zfr_c%&}T3w*g{~&hwhY?Zg-*LU<@VQc>9!BNG_=q@`6kgk0*#B zgLf6Oae&t}1AXYk&N=800rC83znSMT%$J4eD@k4QZoo z3xcJHlR=pF4wb4h3l((-F4#CR27pyfU+AVFYl$Fdl9Qb6P}RF-CxP4frKMy-q{d3O z3m5jNWm>CGIUW>aAtYnEg00CN=N6hAMOs>=C7=W__tfJP|OWlQ7CITnN-PT%$u zLv#M9C@j7V{WeMHOTw@Kc3{22F~&9whTW0S&4dB(S513dB2zKf%H zF~kQasGCagTP-SAryaLrg#`#7cxR>xorR_ zhw^5AZldDQhm(UM7|PKoqw&*glLejKPiD@0e=Khf!{{|=6s9z%Z#Vvi)q-bmQ-n)@ zB$ku$@puV$bzFW`mOqChrUP%Wf7-6KxO9FWVFECgVBjTV~GB0!w z2T&s-?FcDFxr6bT6xC%GGx9P1GDR&SxiF-ZBL%}~@o{nW*J$3e2g<|w+1(CbXlp0b z7h+Xyb7KvX12o?7@YH)zjfz)4=WkYj;2`)D1``08nI&5V{oExCwn-S4MFolzZ zJBk#Lt@gh)0spr4`K=J3W39)%ib6-~e%ZwnI94T>m!k4ySMf?OgH+h@3j6j!TRm+X z2#H8kjJKkJ+-g*$-U^bEm8{DH1MDx(Oeq=@J5nD+y}Z6?%cc;=Y==jFs=$S&J#|u2&qGkvt)V>n#E8K0@Me8oK0_6H8D*R< zsjU~XYvxx%2g?96+})9c+KcIwUgj)LNc&`C%f`o9b{>8l>8U&jXXL zCG?J!vLM&xOt6Rb|M7OAtQRJ%y`P-noRb8;b&1>N|778b@v5bJ*oqd}JTikVOOmp1wqpsh*$L$3EP{QY~pF2uyt zBA@lwFeB3b2=6!4AjlD$sZdXfG!)JKqpA_l{WWa;phtveWsWQ>4r86=5=m*+RmCn_W z!pI2QqRTKg<<1@P({zf%&eONwb?cP^R@3;4;d7QpozQ|?m0SDUAl~ccO^~bqj+|&f z5Ew(buu-XrmyX_Q{O1IIsGjVWb7bmk&6W3mE7pJGCZx#fXIxJ3|F2v4NQL{Iuo!Ot mnzjD-2ABQh(f^l++=ukk^nL2|EP9THxYPCS?@c#nx8$}5K literal 0 HcmV?d00001 diff --git a/docs/user/monitoring/index.asciidoc b/docs/user/monitoring/index.asciidoc index ab773657073bad..514988792d214e 100644 --- a/docs/user/monitoring/index.asciidoc +++ b/docs/user/monitoring/index.asciidoc @@ -2,6 +2,7 @@ include::xpack-monitoring.asciidoc[] include::beats-details.asciidoc[leveloffset=+1] include::cluster-alerts.asciidoc[leveloffset=+1] include::elasticsearch-details.asciidoc[leveloffset=+1] +include::kibana-alerts.asciidoc[leveloffset=+1] include::kibana-details.asciidoc[leveloffset=+1] include::logstash-details.asciidoc[leveloffset=+1] include::monitoring-troubleshooting.asciidoc[leveloffset=+1] diff --git a/docs/user/monitoring/kibana-alerts.asciidoc b/docs/user/monitoring/kibana-alerts.asciidoc new file mode 100644 index 00000000000000..1ac5c385f8ed50 --- /dev/null +++ b/docs/user/monitoring/kibana-alerts.asciidoc @@ -0,0 +1,36 @@ +[role="xpack"] +[[kibana-alerts]] += {kib} Alerts + +The {stack} {monitor-features} provide +<> out-of-the box to notify you of +potential issues in the {stack}. These alerts are preconfigured based on the +best practices recommended by Elastic. However, you can tailor them to meet your +specific needs. + +When you open *{stack-monitor-app}*, the preconfigured {kib} alerts are +created automatically. If you collect monitoring data from multiple clusters, +these alerts can search, detect, and notify on various conditions across the +clusters. The alerts are visible alongside your existing {watcher} cluster +alerts. You can view details about the alerts that are active and view health +and performance data for {es}, {ls}, and Beats in real time, as well as +analyze past performance. You can also modify active alerts. + +[role="screenshot"] +image::user/monitoring/images/monitoring-kibana-alerts.png["Kibana alerts in the Stack Monitoring app"] + +To review and modify all the available alerts, use +<> in *{stack-manage-app}*. + +[discrete] +[[kibana-alerts-cpu-threshold]] +== CPU threshold + +This alert is triggered when a node runs a consistently high CPU load. By +default, the trigger condition is set at 85% or more averaged over the last 5 +minutes. The alert is grouped across all the nodes of the cluster by running +checks on a schedule time of 1 minute with a re-notify internal of 1 day. + +NOTE: Some action types are subscription features, while others are free. +For a comparison of the Elastic subscription levels, see the alerting section of +the {subscriptions}[Subscriptions page]. From 9ef04e7fb21306456e182c4feb422bf09a7113a0 Mon Sep 17 00:00:00 2001 From: Jen Huang Date: Wed, 5 Aug 2020 15:28:03 -0700 Subject: [PATCH 29/33] Rename package configs SO to package policies (#74422) --- .../plugins/ingest_manager/common/constants/package_config.ts | 2 +- .../services/artifacts/manifest_manager/manifest_manager.ts | 2 +- x-pack/test/functional/es_archives/fleet/agents/mappings.json | 4 ++-- x-pack/test/functional/es_archives/lists/mappings.json | 4 ++-- .../es_archives/reporting/canvas_disallowed_url/mappings.json | 4 ++-- .../es_archives/export_rule/mappings.json | 4 ++-- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/x-pack/plugins/ingest_manager/common/constants/package_config.ts b/x-pack/plugins/ingest_manager/common/constants/package_config.ts index e7d5ef67f7253f..48fee967a3d3d6 100644 --- a/x-pack/plugins/ingest_manager/common/constants/package_config.ts +++ b/x-pack/plugins/ingest_manager/common/constants/package_config.ts @@ -4,4 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -export const PACKAGE_CONFIG_SAVED_OBJECT_TYPE = 'ingest-package-configs'; +export const PACKAGE_CONFIG_SAVED_OBJECT_TYPE = 'ingest-package-policies'; diff --git a/x-pack/plugins/security_solution/server/endpoint/services/artifacts/manifest_manager/manifest_manager.ts b/x-pack/plugins/security_solution/server/endpoint/services/artifacts/manifest_manager/manifest_manager.ts index c20aaed10f3f88..9d15b4464c1917 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/artifacts/manifest_manager/manifest_manager.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/artifacts/manifest_manager/manifest_manager.ts @@ -237,7 +237,7 @@ export class ManifestManager { const { items, total } = await this.packageConfigService.list(this.savedObjectsClient, { page, perPage: 20, - kuery: 'ingest-package-configs.package.name:endpoint', + kuery: 'ingest-package-policies.package.name:endpoint', }); for (const packageConfig of items) { diff --git a/x-pack/test/functional/es_archives/fleet/agents/mappings.json b/x-pack/test/functional/es_archives/fleet/agents/mappings.json index acc32c3e2cbb58..23b404a53703f4 100644 --- a/x-pack/test/functional/es_archives/fleet/agents/mappings.json +++ b/x-pack/test/functional/es_archives/fleet/agents/mappings.json @@ -28,7 +28,7 @@ "application_usage_transactional": "965839e75f809fefe04f92dc4d99722a", "action_task_params": "a9d49f184ee89641044be0ca2950fa3a", "fleet-agent-events": "3231653fafe4ef3196fe3b32ab774bf2", - "ingest-package-configs": "2346514df03316001d56ed4c8d46fa94", + "ingest-package-policies": "2346514df03316001d56ed4c8d46fa94", "apm-indices": "9bb9b2bf1fa636ed8619cbab5ce6a1dd", "inventory-view": "5299b67717e96502c77babf1c16fd4d3", "upgrade-assistant-reindex-operation": "296a89039fc4260292be36b1b005d8f2", @@ -1834,7 +1834,7 @@ } } }, - "ingest-package-configs": { + "ingest-package-policies": { "properties": { "config_id": { "type": "keyword" diff --git a/x-pack/test/functional/es_archives/lists/mappings.json b/x-pack/test/functional/es_archives/lists/mappings.json index 2fc1f1a3111a7a..3b4d915cc1ca5a 100644 --- a/x-pack/test/functional/es_archives/lists/mappings.json +++ b/x-pack/test/functional/es_archives/lists/mappings.json @@ -70,7 +70,7 @@ "maps-telemetry": "5ef305b18111b77789afefbd36b66171", "namespace": "2f4316de49999235636386fe51dc06c1", "cases-user-actions": "32277330ec6b721abe3b846cfd939a71", - "ingest-package-configs": "48e8bd97e488008e21c0b5a2367b83ad", + "ingest-package-policies": "48e8bd97e488008e21c0b5a2367b83ad", "timelion-sheet": "9a2a2748877c7a7b582fef201ab1d4cf", "siem-ui-timeline-pinned-event": "20638091112f0e14f0e443d512301c29", "config": "c63748b75f39d0c54de12d12c1ccbc20", @@ -1274,7 +1274,7 @@ } } }, - "ingest-package-configs": { + "ingest-package-policies": { "properties": { "config_id": { "type": "keyword" diff --git a/x-pack/test/functional/es_archives/reporting/canvas_disallowed_url/mappings.json b/x-pack/test/functional/es_archives/reporting/canvas_disallowed_url/mappings.json index 1fd338fbb0ffb9..3519103d068148 100644 --- a/x-pack/test/functional/es_archives/reporting/canvas_disallowed_url/mappings.json +++ b/x-pack/test/functional/es_archives/reporting/canvas_disallowed_url/mappings.json @@ -39,7 +39,7 @@ "index-pattern": "66eccb05066c5a89924f48a9e9736499", "ingest-agent-policies": "9326f99c977fd2ef5ab24b6336a0675c", "ingest-outputs": "8aa988c376e65443fefc26f1075e93a3", - "ingest-package-configs": "48e8bd97e488008e21c0b5a2367b83ad", + "ingest-package-policies": "48e8bd97e488008e21c0b5a2367b83ad", "ingest_manager_settings": "012cf278ec84579495110bb827d1ed09", "kql-telemetry": "d12a98a6f19a2d273696597547e064ee", "lens": "d33c68a69ff1e78c9888dedd2164ac22", @@ -1212,7 +1212,7 @@ } } }, - "ingest-package-configs": { + "ingest-package-policies": { "properties": { "config_id": { "type": "keyword" diff --git a/x-pack/test/security_solution_cypress/es_archives/export_rule/mappings.json b/x-pack/test/security_solution_cypress/es_archives/export_rule/mappings.json index dc92d23a618d33..bb63d29503663a 100644 --- a/x-pack/test/security_solution_cypress/es_archives/export_rule/mappings.json +++ b/x-pack/test/security_solution_cypress/es_archives/export_rule/mappings.json @@ -41,7 +41,7 @@ "infrastructure-ui-source": "2b2809653635caf490c93f090502d04c", "ingest-agent-policies": "9326f99c977fd2ef5ab24b6336a0675c", "ingest-outputs": "8aa988c376e65443fefc26f1075e93a3", - "ingest-package-configs": "48e8bd97e488008e21c0b5a2367b83ad", + "ingest-package-policies": "48e8bd97e488008e21c0b5a2367b83ad", "ingest_manager_settings": "012cf278ec84579495110bb827d1ed09", "inventory-view": "88fc7e12fd1b45b6f0787323ce4f18d2", "kql-telemetry": "d12a98a6f19a2d273696597547e064ee", @@ -1286,7 +1286,7 @@ } } }, - "ingest-package-configs": { + "ingest-package-policies": { "properties": { "config_id": { "type": "keyword" From 4ae6746c0bd5ffd34d70720b641506088d768840 Mon Sep 17 00:00:00 2001 From: Kevin Logan <56395104+kevinlog@users.noreply.github.com> Date: Wed, 5 Aug 2020 18:32:22 -0400 Subject: [PATCH 30/33] [SECURITY_SOLUTION] add z-index to get over nav bar (#74427) --- .../management/pages/endpoint_hosts/view/details/index.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/index.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/index.tsx index b22ff406a1605e..69dabeeb616a0e 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/index.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/index.tsx @@ -70,7 +70,12 @@ export const HostDetailsFlyout = memo(() => { }, [error, toasts]); return ( - +

    From dfad75ff1a9e9849c413dfe665229c7f7405d5c6 Mon Sep 17 00:00:00 2001 From: Brent Kimmel Date: Wed, 5 Aug 2020 18:46:56 -0400 Subject: [PATCH 31/33] [Security Solution][Test] Enzyme test for related events button (#74411) Co-authored-by: Elastic Machine --- .../mocks/one_ancestor_two_children.ts | 46 +++++++++----- .../resolver/store/mocks/related_event.ts | 36 +++++++++++ .../resolver/store/mocks/resolver_tree.ts | 53 ++++++++++++++++ .../test_utilities/simulator/index.tsx | 22 +++++++ .../resolver/view/clickthrough.test.tsx | 62 +++++++++++++++++-- .../public/resolver/view/submenu.tsx | 1 + 6 files changed, 198 insertions(+), 22 deletions(-) create mode 100644 x-pack/plugins/security_solution/public/resolver/store/mocks/related_event.ts diff --git a/x-pack/plugins/security_solution/public/resolver/data_access_layer/mocks/one_ancestor_two_children.ts b/x-pack/plugins/security_solution/public/resolver/data_access_layer/mocks/one_ancestor_two_children.ts index be0bc1b812a0b4..94c176d343d177 100644 --- a/x-pack/plugins/security_solution/public/resolver/data_access_layer/mocks/one_ancestor_two_children.ts +++ b/x-pack/plugins/security_solution/public/resolver/data_access_layer/mocks/one_ancestor_two_children.ts @@ -10,7 +10,10 @@ import { ResolverEntityIndex, } from '../../../../common/endpoint/types'; import { mockEndpointEvent } from '../../store/mocks/endpoint_event'; -import { mockTreeWithNoAncestorsAnd2Children } from '../../store/mocks/resolver_tree'; +import { + mockTreeWithNoAncestorsAnd2Children, + withRelatedEventsOnOrigin, +} from '../../store/mocks/resolver_tree'; import { DataAccessLayer } from '../../types'; interface Metadata { @@ -40,11 +43,24 @@ interface Metadata { /** * A simple mock dataAccessLayer possible that returns a tree with 0 ancestors and 2 direct children. 1 related event is returned. The parameter to `entities` is ignored. */ -export function oneAncestorTwoChildren(): { dataAccessLayer: DataAccessLayer; metadata: Metadata } { +export function oneAncestorTwoChildren( + { withRelatedEvents }: { withRelatedEvents: Iterable<[string, string]> | null } = { + withRelatedEvents: null, + } +): { dataAccessLayer: DataAccessLayer; metadata: Metadata } { const metadata: Metadata = { databaseDocumentID: '_id', entityIDs: { origin: 'origin', firstChild: 'firstChild', secondChild: 'secondChild' }, }; + const baseTree = mockTreeWithNoAncestorsAnd2Children({ + originID: metadata.entityIDs.origin, + firstChildID: metadata.entityIDs.firstChild, + secondChildID: metadata.entityIDs.secondChild, + }); + const composedTree = withRelatedEvents + ? withRelatedEventsOnOrigin(baseTree, withRelatedEvents) + : baseTree; + return { metadata, dataAccessLayer: { @@ -54,13 +70,17 @@ export function oneAncestorTwoChildren(): { dataAccessLayer: DataAccessLayer; me relatedEvents(entityID: string): Promise { return Promise.resolve({ entityID, - events: [ - mockEndpointEvent({ - entityID, - name: 'event', - timestamp: 0, - }), - ], + events: + /* Respond with the mocked related events when the origin's related events are fetched*/ withRelatedEvents && + entityID === metadata.entityIDs.origin + ? composedTree.relatedEvents.events + : [ + mockEndpointEvent({ + entityID, + name: 'event', + timestamp: 0, + }), + ], nextEvent: null, }); }, @@ -69,13 +89,7 @@ export function oneAncestorTwoChildren(): { dataAccessLayer: DataAccessLayer; me * Fetch a ResolverTree for a entityID */ resolverTree(): Promise { - return Promise.resolve( - mockTreeWithNoAncestorsAnd2Children({ - originID: metadata.entityIDs.origin, - firstChildID: metadata.entityIDs.firstChild, - secondChildID: metadata.entityIDs.secondChild, - }) - ); + return Promise.resolve(composedTree); }, /** diff --git a/x-pack/plugins/security_solution/public/resolver/store/mocks/related_event.ts b/x-pack/plugins/security_solution/public/resolver/store/mocks/related_event.ts new file mode 100644 index 00000000000000..1e0c460a3a711d --- /dev/null +++ b/x-pack/plugins/security_solution/public/resolver/store/mocks/related_event.ts @@ -0,0 +1,36 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { EndpointEvent } from '../../../../common/endpoint/types'; + +/** + * Simple mock related event. + */ +export function mockRelatedEvent({ + entityID, + timestamp, + category, + type, + id, +}: { + entityID: string; + timestamp: number; + category: string; + type: string; + id?: string; +}): EndpointEvent { + return { + '@timestamp': timestamp, + event: { + kind: 'event', + type, + category, + id: id ?? 'xyz', + }, + process: { + entity_id: entityID, + }, + } as EndpointEvent; +} diff --git a/x-pack/plugins/security_solution/public/resolver/store/mocks/resolver_tree.ts b/x-pack/plugins/security_solution/public/resolver/store/mocks/resolver_tree.ts index 6a8ab61ccf9b64..21d0309501aa88 100644 --- a/x-pack/plugins/security_solution/public/resolver/store/mocks/resolver_tree.ts +++ b/x-pack/plugins/security_solution/public/resolver/store/mocks/resolver_tree.ts @@ -5,6 +5,7 @@ */ import { mockEndpointEvent } from './endpoint_event'; +import { mockRelatedEvent } from './related_event'; import { ResolverTree, ResolverEvent } from '../../../../common/endpoint/types'; export function mockTreeWith2AncestorsAndNoChildren({ @@ -109,6 +110,58 @@ export function mockTreeWithAllProcessesTerminated({ } as unknown) as ResolverTree; } +/** + * A valid category for a related event. E.g. "registry", "network", "file" + */ +type RelatedEventCategory = string; +/** + * A valid type for a related event. E.g. "start", "end", "access" + */ +type RelatedEventType = string; + +/** + * Add/replace related event info (on origin node) for any mock ResolverTree + * + * @param treeToAddRelatedEventsTo the ResolverTree to modify + * @param relatedEventsToAddByCategoryAndType Iterable of `[category, type]` pairs describing related events. e.g. [['dns','info'],['registry','access']] + */ +export function withRelatedEventsOnOrigin( + treeToAddRelatedEventsTo: ResolverTree, + relatedEventsToAddByCategoryAndType: Iterable<[RelatedEventCategory, RelatedEventType]> +): ResolverTree { + const events = []; + const byCategory: Record = {}; + const stats = { + totalAlerts: 0, + events: { + total: 0, + byCategory, + }, + }; + for (const [category, type] of relatedEventsToAddByCategoryAndType) { + events.push( + mockRelatedEvent({ + entityID: treeToAddRelatedEventsTo.entityID, + timestamp: 1, + category, + type, + }) + ); + stats.events.total++; + stats.events.byCategory[category] = stats.events.byCategory[category] + ? stats.events.byCategory[category] + 1 + : 1; + } + return { + ...treeToAddRelatedEventsTo, + stats, + relatedEvents: { + events, + nextEvent: null, + }, + }; +} + export function mockTreeWithNoAncestorsAnd2Children({ originID, firstChildID, diff --git a/x-pack/plugins/security_solution/public/resolver/test_utilities/simulator/index.tsx b/x-pack/plugins/security_solution/public/resolver/test_utilities/simulator/index.tsx index 2a2354921a3d41..ed30643ed871e4 100644 --- a/x-pack/plugins/security_solution/public/resolver/test_utilities/simulator/index.tsx +++ b/x-pack/plugins/security_solution/public/resolver/test_utilities/simulator/index.tsx @@ -220,6 +220,28 @@ export class Simulator { ); } + /** + * Dump all contents of the outer ReactWrapper (to be `console.log`ged as appropriate) + * This will include both DOM (div, span, etc.) and React/JSX (MyComponent, MyGrid, etc.) + */ + public debugWrapper() { + return this.wrapper.debug(); + } + + /** + * Return an Enzyme ReactWrapper that includes the Related Events host button for a given process node + * + * @param entityID The entity ID of the proocess node to select in + */ + public processNodeRelatedEventButton(entityID: string): ReactWrapper { + return this.processNodeElements({ entityID }).findWhere( + (wrapper) => + // Filter out React components + typeof wrapper.type() === 'string' && + wrapper.prop('data-test-subj') === 'resolver:submenu:button' + ); + } + /** * Return the selected node query string values. */ diff --git a/x-pack/plugins/security_solution/public/resolver/view/clickthrough.test.tsx b/x-pack/plugins/security_solution/public/resolver/view/clickthrough.test.tsx index f339d128944cc1..c819491dd28f0d 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/clickthrough.test.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/clickthrough.test.tsx @@ -9,14 +9,14 @@ import { Simulator } from '../test_utilities/simulator'; // Extend jest with a custom matcher import '../test_utilities/extend_jest'; -describe('Resolver, when analyzing a tree that has 1 ancestor and 2 children', () => { - let simulator: Simulator; - let databaseDocumentID: string; - let entityIDs: { origin: string; firstChild: string; secondChild: string }; +let simulator: Simulator; +let databaseDocumentID: string; +let entityIDs: { origin: string; firstChild: string; secondChild: string }; - // the resolver component instance ID, used by the react code to distinguish piece of global state from those used by other resolver instances - const resolverComponentInstanceID = 'resolverComponentInstanceID'; +// the resolver component instance ID, used by the react code to distinguish piece of global state from those used by other resolver instances +const resolverComponentInstanceID = 'resolverComponentInstanceID'; +describe('Resolver, when analyzing a tree that has 1 ancestor and 2 children', () => { beforeEach(async () => { // create a mock data access layer const { metadata: dataAccessLayerMetadata, dataAccessLayer } = oneAncestorTwoChildren(); @@ -79,6 +79,7 @@ describe('Resolver, when analyzing a tree that has 1 ancestor and 2 children', ( simulator .processNodeElements({ entityID: entityIDs.secondChild }) .find('button') + .first() .simulate('click'); }); it('should render the second child node as selected, and the first child not as not selected, and the query string should indicate that the second child is selected', async () => { @@ -107,3 +108,52 @@ describe('Resolver, when analyzing a tree that has 1 ancestor and 2 children', ( }); }); }); + +describe('Resolver, when analyzing a tree that has some related events', () => { + beforeEach(async () => { + // create a mock data access layer with related events + const { metadata: dataAccessLayerMetadata, dataAccessLayer } = oneAncestorTwoChildren({ + withRelatedEvents: [ + ['registry', 'access'], + ['registry', 'access'], + ], + }); + + // save a reference to the entity IDs exposed by the mock data layer + entityIDs = dataAccessLayerMetadata.entityIDs; + + // save a reference to the `_id` supported by the mock data layer + databaseDocumentID = dataAccessLayerMetadata.databaseDocumentID; + + // create a resolver simulator, using the data access layer and an arbitrary component instance ID + simulator = new Simulator({ databaseDocumentID, dataAccessLayer, resolverComponentInstanceID }); + }); + + describe('when it has loaded', () => { + beforeEach(async () => { + await expect( + simulator.mapStateTransitions(() => ({ + graphElements: simulator.graphElement().length, + graphLoadingElements: simulator.graphLoadingElement().length, + graphErrorElements: simulator.graphErrorElement().length, + originNode: simulator.processNodeElements({ entityID: entityIDs.origin }).length, + })) + ).toYieldEqualTo({ + graphElements: 1, + graphLoadingElements: 0, + graphErrorElements: 0, + originNode: 1, + }); + }); + + it('should render a related events button', async () => { + await expect( + simulator.mapStateTransitions(() => ({ + relatedEventButtons: simulator.processNodeRelatedEventButton(entityIDs.origin).length, + })) + ).toYieldEqualTo({ + relatedEventButtons: 1, + }); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/resolver/view/submenu.tsx b/x-pack/plugins/security_solution/public/resolver/view/submenu.tsx index 6a9ab184e9bab0..7f0ba244146fd6 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/submenu.tsx +++ b/x-pack/plugins/security_solution/public/resolver/view/submenu.tsx @@ -233,6 +233,7 @@ const NodeSubMenuComponents = React.memo( iconType={menuIsOpen ? 'arrowUp' : 'arrowDown'} iconSide="right" tabIndex={-1} + data-test-subj="resolver:submenu:button" > {count ? : ''} {menuTitle} From f5c9aa8860f813b88d910370e735a22ab988e688 Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Wed, 5 Aug 2020 18:55:23 -0500 Subject: [PATCH 32/33] Filter out non-security jobs when collecting Detections telemetry (#74456) Our jobs summary call returns all installed jobs regardless of group; passing groups as jobIds does not perform group filtering. This adds a helper predicate function on which to filter these results, and updates tests accordingly. --- .../security_solution/common/constants.ts | 7 +++++ .../machine_learning/is_security_job.test.ts | 30 +++++++++++++++++++ .../machine_learning/is_security_job.ts | 11 +++++++ .../usage/detections/detections.mocks.ts | 15 +++++++++- .../usage/detections/detections_helpers.ts | 7 ++--- 5 files changed, 65 insertions(+), 5 deletions(-) create mode 100644 x-pack/plugins/security_solution/common/machine_learning/is_security_job.test.ts create mode 100644 x-pack/plugins/security_solution/common/machine_learning/is_security_job.ts diff --git a/x-pack/plugins/security_solution/common/constants.ts b/x-pack/plugins/security_solution/common/constants.ts index c74cf888a2db66..0fc42895050a53 100644 --- a/x-pack/plugins/security_solution/common/constants.ts +++ b/x-pack/plugins/security_solution/common/constants.ts @@ -140,6 +140,13 @@ export const UNAUTHENTICATED_USER = 'Unauthenticated'; */ export const MINIMUM_ML_LICENSE = 'platinum'; +/* + Machine Learning constants + */ +export const ML_GROUP_ID = 'security'; +export const LEGACY_ML_GROUP_ID = 'siem'; +export const ML_GROUP_IDS = [ML_GROUP_ID, LEGACY_ML_GROUP_ID]; + /* Rule notifications options */ diff --git a/x-pack/plugins/security_solution/common/machine_learning/is_security_job.test.ts b/x-pack/plugins/security_solution/common/machine_learning/is_security_job.test.ts new file mode 100644 index 00000000000000..abb0c790584af7 --- /dev/null +++ b/x-pack/plugins/security_solution/common/machine_learning/is_security_job.test.ts @@ -0,0 +1,30 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { MlSummaryJob } from '../../../ml/common/types/anomaly_detection_jobs'; +import { isSecurityJob } from './is_security_job'; + +describe('isSecurityJob', () => { + it('counts a job with a group of "siem"', () => { + const job = { groups: ['siem', 'other'] } as MlSummaryJob; + expect(isSecurityJob(job)).toEqual(true); + }); + + it('counts a job with a group of "security"', () => { + const job = { groups: ['security', 'other'] } as MlSummaryJob; + expect(isSecurityJob(job)).toEqual(true); + }); + + it('counts a job in both "security" and "siem"', () => { + const job = { groups: ['siem', 'security'] } as MlSummaryJob; + expect(isSecurityJob(job)).toEqual(true); + }); + + it('does not count a job in a related group', () => { + const job = { groups: ['auditbeat', 'process'] } as MlSummaryJob; + expect(isSecurityJob(job)).toEqual(false); + }); +}); diff --git a/x-pack/plugins/security_solution/common/machine_learning/is_security_job.ts b/x-pack/plugins/security_solution/common/machine_learning/is_security_job.ts new file mode 100644 index 00000000000000..43cfa4ad599640 --- /dev/null +++ b/x-pack/plugins/security_solution/common/machine_learning/is_security_job.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { MlSummaryJob } from '../../../ml/common/types/anomaly_detection_jobs'; +import { ML_GROUP_IDS } from '../constants'; + +export const isSecurityJob = (job: MlSummaryJob): boolean => + job.groups.some((group) => ML_GROUP_IDS.includes(group)); diff --git a/x-pack/plugins/security_solution/server/usage/detections/detections.mocks.ts b/x-pack/plugins/security_solution/server/usage/detections/detections.mocks.ts index e59b1092978daf..7afc185ae07fd1 100644 --- a/x-pack/plugins/security_solution/server/usage/detections/detections.mocks.ts +++ b/x-pack/plugins/security_solution/server/usage/detections/detections.mocks.ts @@ -41,7 +41,7 @@ export const getMockJobSummaryResponse = () => [ { id: 'other_job', description: 'a job that is custom', - groups: ['auditbeat', 'process'], + groups: ['auditbeat', 'process', 'security'], processed_record_count: 0, memory_status: 'ok', jobState: 'closed', @@ -54,6 +54,19 @@ export const getMockJobSummaryResponse = () => [ { id: 'another_job', description: 'another job that is custom', + groups: ['auditbeat', 'process', 'security'], + processed_record_count: 0, + memory_status: 'ok', + jobState: 'opened', + hasDatafeed: true, + datafeedId: 'datafeed-another', + datafeedIndices: ['auditbeat-*'], + datafeedState: 'started', + isSingleMetricViewerJob: true, + }, + { + id: 'irrelevant_job', + description: 'a non-security job', groups: ['auditbeat', 'process'], processed_record_count: 0, memory_status: 'ok', diff --git a/x-pack/plugins/security_solution/server/usage/detections/detections_helpers.ts b/x-pack/plugins/security_solution/server/usage/detections/detections_helpers.ts index 80a9dba26df8ed..a6d4dc7a38e14a 100644 --- a/x-pack/plugins/security_solution/server/usage/detections/detections_helpers.ts +++ b/x-pack/plugins/security_solution/server/usage/detections/detections_helpers.ts @@ -15,6 +15,7 @@ import { MlPluginSetup } from '../../../../ml/server'; import { SIGNALS_ID, INTERNAL_IMMUTABLE_KEY } from '../../../common/constants'; import { DetectionRulesUsage, MlJobsUsage } from './index'; import { isJobStarted } from '../../../common/machine_learning/helpers'; +import { isSecurityJob } from '../../../common/machine_learning/is_security_job'; interface DetectionsMetric { isElastic: boolean; @@ -182,11 +183,9 @@ export const getMlJobsUsage = async (ml: MlPluginSetup | undefined): Promise module.jobs); - const jobs = await ml - .jobServiceProvider(internalMlClient, fakeRequest) - .jobsSummary(['siem', 'security']); + const jobs = await ml.jobServiceProvider(internalMlClient, fakeRequest).jobsSummary(); - jobsUsage = jobs.reduce((usage, job) => { + jobsUsage = jobs.filter(isSecurityJob).reduce((usage, job) => { const isElastic = moduleJobs.some((moduleJob) => moduleJob.id === job.id); const isEnabled = isJobStarted(job.jobState, job.datafeedState); From aa75f80afd853960ace1cf2b2e526395635828dd Mon Sep 17 00:00:00 2001 From: Matthias Wilhelm Date: Thu, 6 Aug 2020 08:07:19 +0200 Subject: [PATCH 33/33] Skip "space with index pattern management disabled" functional test for cloud env (#74073) * Skipped due to occasional flakiness in cloud env, cause by ingest management tests --- .../apps/discover/feature_controls/discover_spaces.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/x-pack/test/functional/apps/discover/feature_controls/discover_spaces.ts b/x-pack/test/functional/apps/discover/feature_controls/discover_spaces.ts index 767dad74c23d72..f8dc2f3b0aeb8a 100644 --- a/x-pack/test/functional/apps/discover/feature_controls/discover_spaces.ts +++ b/x-pack/test/functional/apps/discover/feature_controls/discover_spaces.ts @@ -137,7 +137,10 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); }); - describe('space with index pattern management disabled', () => { + describe('space with index pattern management disabled', function () { + // unskipped because of flakiness in cloud, caused be ingest management tests + // should be unskipped when https://github.com/elastic/kibana/issues/74353 was resolved + this.tags(['skipCloud']); before(async () => { await spacesService.create({ id: 'custom_space_no_index_patterns',