From ef665cc642d18691dcb6a5d5b86326328b45bdc4 Mon Sep 17 00:00:00 2001 From: RomualdLemesle Date: Mon, 19 Jan 2026 19:36:21 +0100 Subject: [PATCH 1/2] [docs] feat(expectation): improv documentation --- .../add_manual_validation_atomic_testing.png | Bin 64497 -> 0 bytes ..._expectation_validation_atomic_testing.png | Bin 10235 -> 0 bytes .../technical_expectation_validation.png | Bin 10897 -> 0 bytes docs/usage/expectations.md | 156 +++------------ .../add_technical_expectation_validation.png | Bin .../assets/create_manual_expectation.png} | Bin .../assets/inject_expectations_list.png | Bin ...l_expectation_validation_animation_tab.png | Bin .../assets/validation_mode.png | Bin docs/usage/expectations/management.md | 81 ++++++++ docs/usage/expectations/overview.md | 103 ++++++++++ docs/usage/expectations/validation.md | 189 ++++++++++++++++++ mkdocs.yml | 5 +- 13 files changed, 402 insertions(+), 132 deletions(-) delete mode 100644 docs/usage/assets/add_manual_validation_atomic_testing.png delete mode 100644 docs/usage/assets/manual_expectation_validation_atomic_testing.png delete mode 100644 docs/usage/assets/technical_expectation_validation.png rename docs/usage/{ => expectations}/assets/add_technical_expectation_validation.png (100%) rename docs/usage/{assets/expectation_customize_expiration_time.png => expectations/assets/create_manual_expectation.png} (100%) rename docs/usage/{ => expectations}/assets/inject_expectations_list.png (100%) rename docs/usage/{ => expectations}/assets/manual_expectation_validation_animation_tab.png (100%) rename docs/usage/{ => expectations}/assets/validation_mode.png (100%) create mode 100644 docs/usage/expectations/management.md create mode 100644 docs/usage/expectations/overview.md create mode 100644 docs/usage/expectations/validation.md diff --git a/docs/usage/assets/add_manual_validation_atomic_testing.png b/docs/usage/assets/add_manual_validation_atomic_testing.png deleted file mode 100644 index 0ebcb6cb153b3c6610b1f8c9dce6d30a371b8be2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64497 zcmd43cR1UB^fyekMq9Ls*6va@N^9?3l$Id&YO8ip)E1#yYO7f@W^HP(psJ`DTg})b zMhFoSNuKzA?{9zieO>qS{QczeN0Q6+`JDF|uXE1poKM05+Um5ISuc~3kD; zyVSy0F3=TaU-;wrycs5SAk{HA{SO#$ZR zr#C*%V%p(ynRQb$xG3CxyOVWad7T8giq?gYcAOc!W|9Clx%7yJB*ouXcFviCFU8-F zq&JFp?_^*2-@XW<{1kM4l)o=l#tVFZKak$o1E@*I`=3{~(*NHs@cZ_q!5O`6uZ>Zu zOn<#F!JFa_+j!u!kRZoBCB8W&;A4-B=E^(oOTT^KKqpFc+gRoC=RqHt!Us~9sw=;k zAKgxJwNw|8Y25L6;#prEtVt3DawTG~fv`|$X3_|irz(|Yc%A|T zuKxZF&!7m=@}TYbt(DZ)lk+D!rzylul)ibz`dM zb#CzDu)=+g4_sq^yrNGIA%1efv-?Q_>@zEUw_6Tr%}2TU-#w zcu!&^u%r-QDUjRIH3Kj3DB39x0eS~;C0XscLxq$t0l7t;Y%V=w7jljLzzAR(6wE_) z-I!Qmyy5W5mt}A{5OB<*Czb7ftkSu__E&CbE!pR|vuU@UniR>~@eLBSCln=|G7rCd z(%Ur5s-DWw>A6TafJGLvHiP)+^qm;k0bTuHgAE$pcx?D_uScTS%VxFLu27Pct-E*C z<0>~$Z^l@pDB$)bV4&t&P+##AB<=m&%um z9d~q=5SfWBZ3}rFzIncry?6U&A6mj3W2@%d#4)|y^NB6LjhU-_p4+gC-a)sgvUgER7NVGs5nV=9}#Kj`}4Zx%ve7RJmr@5Is#or|+^g7FRhU)w_H z0FPR0-m)|G;@;kH=rR)nde50t><@GDrN2ctu!uXuRUw>A$B`o05gYnzJ$2n}E9hGA z_P1-~N$i#^N_{fvUZdoP1Wz#;`>egZC}ZylLi7jyR>?qGu0Gv9<1P!!Q(H z)m8y&@B+6THMZ^OH9C3_X>S(Y#GdEXNk<|0+T5ZKC3FdfOKt9oUAupv zVeSKmHQ$hVKi22>Y8n%{3Cy|+k*b%jq_BV+zUnk>*ZmX}C+@W*T&|x4xEQ(k)7ZpL zzc|HQqA&!>$~&WD>|oz_jY~jwBPPDg4b2F!2;L9-)_~PmMU)LYDRc3 za&gC0&6nTn@{-9#+loAd)uWs&l$Q>-sE)s-97SV@$=hl5-PGxK z>5D$oLF@FaK76jrz}80sR^(Zy)fS^6F7wpheo=KGTq zPSaO#{#!GfJ(ClF3G)gA8d}SjAK!hU0?yO~)Q9yIvegNiK-1~QlxD=A2GkFe8+^A) z8A%VTZI9g%naxArYk;}5OfI10YKgRYkm?A#Tb?HmZv}>4Ejmhl-|~qSnMa=$`^H4| zKbw+$w!8vTi(*$K``8Idf7g#MP*=2hgtWsuKRTRJk=3RvGSpjG_v>T3!zrRoAAH%C zRm3QY1*mL4?o7obS)r@krCnci`=lZ#_TsXoTO~2zjr}@tL9PA#y;Dm-SDFMvXHqVcLGisB)(>x z6YDbPH|)FnI*@tytO?chV2>)tRhbf4dTjp`uAbzCU9a0kNJ~(Y-(kiaIa9G#f zYE@eJfywe!Sh~ZJ@r0V6eLhr9bEOn*LyTJN{Mw=Fi3WO$eg;SFtJ3Oakbg0wUU84v zkVgkRv3H~WNXiYSpnmzg(%&hn*hF`+HXoC!_5zfqG z>^!rqYO~Yi3^FxCKXBZb7*6m1b?w$asu0!-s{6L{Q$*DH zVVGD|E&Ao|%E~Ep5-avNDD}f%^>mm53<+C(jWUY)Cx;2^ zM%rRkqUo$~-|U;giijT*v16erT!jayV?c!6uqY0s$NU7kcugG#3hr-`j=jxoVh1>o zays7ZKYL+TpN{yrl7WeMPnp#C2J&9WQXIKS3buA3{3;ZvY0TQpjZYBlb-$ zPt)h@$$kEIAROb~{!f*qsP=oEyf;YdcJWpD?y$;YdM}im`5tXFJsS452yCl@XJfd) z_gM!^GOylyl(6^ifcJyx{oM@L^Z{Y=0rB|c90S@5Ug%#uV$Aq8=6`pMlqe=08O=ma>;H=w1 zNmROfa{z6yEni>zQYCpSG6hgg+&$zl$bl=_Jj|ny;mXHD zCelTU=a4q-A&woAeC{Bs31LuiXXiSuO7mM~p#*&#D_{%hxg3}PF$2}#ZsIaky9F40 zynydQUcgBL6(o^zO8$lw2Ld(a67GuJZKYTKai3A6>?C>n-*B%KD#jcAClBP?Ea1QY zb({KI+hE6S?eTnHe;o4X`UarJ@M)jh0swpwc&)OQzG(bf@9Tk=mqSI_Pi|#0%!%vD zw1-~yO}^&+CldFt!RT?EZY76}qQT?O)f*FlAiLWKXo)Gn-nCd3Al^$a*iv-qEXF3W zp>09X_9b4sZ_hr{y4C{fwP63sun&!Um<_S3lb8u|{6fg$J*8kWegmcA^*_??Ye>Es zP@aXlnf&ym{KJzYfQ^`(R}EAygQ3}NLVE`M%Y5bqPU>vUh0kN4Bu#^Vp(Lkyo>u~{#B`lMC{$Mv{ZTP@Hz z%Y6&r9>!fBvxJ$_PqLDb}-GMuHBTd@&WmrU#Tn=SNp0!%Es#6#%lzx2<<-=3c>`(m-8f-7>bH~ai=bFigMWcF`V>iy=-JH@Us z;Qab5YbvpBf;iPQp5XO-?DoOexo?6~$;R-qlv$ea;D2DQ=BXa>hl8EI8%&Q?W{I-d zW@h*O6x82gBt)TbEw&QN*3`d}Jfq}ieGDt>OS z6|2AG(DAtch3#bfC7ZQ7*&qHKZ19v*@M&D5Ys@l7&V6eSL)>2T@{p3(>r5WIVm3Jf z^p*KHO9geE)k8N>FV+=>=^wI%4CM4ujH3dRp8V!;{4rxn$>-5-08#uW2t~}kVkKP1 zQU!Np;wqZ4YR&!xP;DR{8%KiU1)&z#r4Z4BZr=C0ME;_uvlV@KkxBw}(QSDe`XW=$ z9H@yCFEU0faXwdLp6kv<;4?LdT)kIQEjh2& z?(a}Lb*qTxa%Cs8V3KEVu$Qd{_dUlMf-YneQfW!>a0dbFM_D|1ox#c38>}ZeLJ1T; zZxNgvejHVT1IP`su`)JnZ<1B1fTuN6)0n>WD$Qvw-iyFqH7m>S$rmP3VQD|q99We8 zy(^i*MIT-sOz<;Mub|BjN$KV1)C7wKE?SVo;}kChMG`q@(R*Kc>hl|uRB}a^=*1zF zeK4h+tIlPXb5Z?EghY1rJGRD0a}Sy_w=9S!7fKSEk8+?)U|@aE-itoRk(j{yjv^V= zkfOR+-mh}Mo2(>0yIX!AY6!&a@3>2w$ZV``5!c+2CW$;85bq?fot<_zu!68wi_sIC zaxczK=jzy3v+duYPN8GZ$_I~=26E@@%8l?owO=ad4;>E0lyckkwRLt`DJ+GpPOaS> zkXI`84B@Y9bfiamDU$UqlbVncLL;%KC%YXhSJvsKV$z>CP5cz&Ona`t+HB$&(m>La zueZE2Jkn0L7kBS((|eo3=FnX`hJ}t26kh(|fcAmeGDIn-dcpHvLptOW?g0=j}o!VAq5oh97e6PniHFjW6cJUGnDkj>;T7s4QqdXk zBvW*mn{Rm5Tql?(d91g*vS5yO5@bGeOE7ymF!156ao%0flEW@%K_dE)n5*nEd+f*8 zNHml##>@7N%^p}KdMNSSF)uBg%Q0=iNmDdH4|X?uFoBQiI?Qq@O3EfJc)>#=i4q=S zHVr%Zd$HI4YxjeqUPJ9vITx)_FW*5Ko+v(wpRJ?^qN;T+ZHWW6c*YfKatNt|tppC( zqa2xyv*$FQmY2L0xtHtR)7LgMDzQCWfXul=cdYI<-TQdM$T@%hBB_id-X*2bGQ3XdRcN{SO6QfuZ0&v{_9Ltou50XCuLq zNe$#%!tVFpX6^5-rxNeoQ<=Uww^t<0i{o#V&d=5zO4<9{3ulU=h1L&DiSOMV%&18b z8SvphKI68^8!A(M?HuXvr9u#<4F+=;206t+=k@x2SSRc^j86glO$9H)hJZ{%5emzF zr4F9ctlSqPjP6qKb^r5U3G(Pzh3vkps`$%+t&qTggIjnc7luve5|db8)fYD!*TA)v zt0fbdv1gM_^z)iL^ZQxvUG9@li~+wdabw-KdlPXHZc+ELQCHJ`;Tmg44rN8M{XSBB zdo4Xpm+l@&-V9hMtNYcD zvuSv!hf${{XZkms6)AtaolZiZ*zXX3)N+qdj4O4clQzcMUsN7HeW3jBspb&yf<~c1 z{B!{K$$?fb1>Y3~3WdnCfMP2!_yQju2`8qzZ?r4&WX?wij(@wcHg~|tWCqrOkaC-dik8vOipDoJnh#yVU!qzI4ysRz=%2sD(b2rvK(0guR&#sk-+RFzMF z<(ac;{%uw!Q<lBAv1q_^RZRbjEsZ$qXJlUBj>52^3<6r3u4Tx?UyQooon>kQ)$o zJdayZwq<(9>X-kXEX~7gw6_v7@Nx7V#W-c)gHx%RE3*&rUmO77IvrseMCI|b2X3Xr zB%>EcYjXNIqCmy26O)tF)s5%7SR4nyVEEZ?WC;0$Q%{nIvIpgJmzsjPdf!aschF6n zx-Tj@+8sam`hrT{$%H9)eX~5gfI)Ujv_9b%ss^%0JByYQ^-smt=o*vV z!Pe}ZA~n^VV##Ep%KRzYJ{s>8le{;^j$3`0lb{NEf7!9oud!RZqXh_6b^iq#RYs$0eHCD~s^nEoHxbFpRF-wX!7`ohnis z$tx*d`ZsdoLRUL_=O}O8UiaS=5jECV*(Y>(eO`4s39m%5=f71kA+M_(z5c(fwH9%G zCGlF15EQzggKQ4#j!M^1QI9DkPl?TK!-oQDk~wy95>5uHtwJo%@q%pHAz{%4{FTiy zduiT6a`+?ZHNU_mT)r26g}&&Ijv8D$_(fPEe#C>u_2^o0Vl_mJ;02;e0?|Q)km*l- zv0?)l0ja$nt$CV`34WyR(C5*`rcqp_xk^4QDYZ!z-LU0lav`RnDp<66>clJcg=0~c z-+w+yu{&z6AL7oQc_q+asF3cnbDkQl7F-0Zd{9AaiALNOu^|G^3PM{v@D+6lD9^kM z^e?htQGwHsBF6F8mH+C;mZTq5+Kc=(jIZ;B`X@x6)X1!g+e$oJ^Nv@gMAOI5e#YX| z_hyZA2!!};SjQLkggAz}oz2El4QqDK|3qFZUfJdWT+n{Z!QB=dDFr ziN}LI89DR>8>$nqSn#AaR($1_{N!m2E6<8$ck9~mub-ZAGX?beEC?hmI+g&LaDH~bIeP8Zz$Uq3lb-ip~SR6AD)8A%MAx;@QP zkE|SMYAJ7v4UZ@I<23;JzdoB!&Pm2dwRmPKtYvk#-}>dut#?tx^v%h|f&dT)tjKKR5=w-0(C<8TWm$=$bgf^%S60Ju$}A$ay~ zgOKSQPqD#yiv;;ULj+~|<;3~D0%c)zLH#(n$_g8*9PMAS`&mCb>51_cYS6D#&Rr&t zTS4FJZdP7L4&h5Yga+*$hAm{U!}nN-JfpG8_1t#$)@!-z*$uRwfXx1Mj-O?Dw3j|! ztUzja>HjM^$n3A78enTm)Ap;VYEwaqk5cj=GkHC16j_SvgxPMwEC+25nT@6ZnvoU3 z#W4;iieaxsD;zg?$Vs=4B;7UYKn24QA`OynSVpqFkrRm2?xX|8+A+hA$@{YohtZ#Iq7$kOXTC5^MwMHmg(^2DPP!i5%Ldau2aHM7xn z5Mpu>_`jMU-cT!q3;jTMW33S%y*4Sk^?jv6d@{K|*MI`W(;{3I@w&w4mBdTjDSSCv z_w}SQs(+(5?BXFJ40B=6EQkU3^0CicM6hnhylD@}IJHLE*_U|H^`vNWa*GAY{5 z(@N6|!z6R%r|vu`e^`0Sk_a!MRU9}G`32!VJ^UvHMGKjA3VAkA*;wDo_JaCzKc(V% zbhdZxz+@R2EAGeDk9o#i)P4iOg*?n96q^&bMC|y3wImZ;Ypu1Af@~8r5HnL4F#1VC1hN;Srg$k%O%f0nLK)<9JO7-H(vU~t zBvv~nzo+f*gfEiu(EskmXo$s-`&%OTL)Y5aDe9k{aWaoveZs1fqrHg#x_Z#xhtPX%#LZxruSdeeDQK#F_AYG(Vge|SynFQmyU4s8Wu>w zhrfa2ijH>#aS72z@V;N`Zbu{rv)E&PpeR)#tZ`w8j=r45ioH*%u{t`wcEyp%M+tZ~j5Hih$v$)+QI z=sNYt^KtP)(yz{`+&1d6Ia10zmGtMgPlUp~_ngy@`;@HjO^l{r(KH{5{Bh(c{Z7_r z_pUFPn!4!jhC!*Sd>Fd`*@+S%qiZ)>u^3(ZX=79uatchW$i~hjc$mD9V;TQ}`60 zEnF8md%i5v2jhxqJYvDr1>n0$^8foslAlY&C6}T4qp;oHJc|)H(6)(7c}f1oI+h~8 zltec0%4`Nnjkgh#SOk^SY33Upd7RCdtmER}?cIrMP!dIix(UKksTZ92S-nJ}BfQm2 z4C|92_x52v}S!=GK^Co1rr;fcCSbi!{HlrF{Y=Fh!qaOlY=jQ+#h zhOcJGUB{y=n_h%$Ahd2Z&E4aWOi_$ro2*hMB4A4k|vVZ;Cw6ESiH7F{X8|d(({%Ot|sL9PciCP+p2GY7MFk!yZ zIaM3_&!9y{@9%l=o^222t_|Lw$9^;z_BrI0skga(V*TtOE*dFgvi*=VsYpYw9(myR zy&H0Imt{`{*9MKBHiZ-d_J+;S@GE@_Qy8W){O4*|8$gQd+-6r%4V`Np6M*sHsUy65 z+?jm5Jrybw&qyT7?c5w!5H4ybMTt4zICz-JI`JKM;w6kw-yiH@O+WtnWsI}%B-ias zQnz0|V@+2(H73)a%a#x0%ThXLHl;m^rEnYew5?5=S&U8-GY1O0KFKtTUYdsrXUZ|7vVwatLvtm`9~J)XU?K!< zb+GKs-UIBS76y|tF|m`+w30bRb92XM!J|XC)hh;a&y)+c4%<;QR;XvP&>c$cUUk`*iub>zwE9KZ49yN#aPgWWkxm$cNvDXecJ z^C%|m_BLHi5zId{S6`C>+oP`Z8+XFhyfjY8R4peA1fsUj}3h@D9zIQz$B!V zEcg6UVZD|HK3&vR{cv36lf=Xhwps zo|^AFt(+YZDi_I_tTys4r+tGLexwvC`iA!k(p53I2eMCh+I$jLZz4pIpwev9vioBz zM9k32|DvYyZ~^Rb^>z=eI$WN~aZz0{Nv!%qeXB4;lf5TpSb(2;G*I4{X>Nma$A`rJ zNe9L)n27W=>TI#|`Ahu4oatlMwE4zDCWgf#>su{hyI6LwOggma#zHzwOQ)O3v>%~oNabnh=6v3&XF=zG{ z6nncb-$KkaJFPgc&-E}voUB$7*|2);H`Panqu)}azs^{~1J_?~pIkRJQyaaO;z2vV zsqEHXA(UCX>qMyO5Irj18~-JLEKok!Sp-=SUr9Y-3E8kvdx{^lp7qWj(xENL5sDqB z4Jf%;$0vR)*6yvbfBL+`dAHa;+E;G3Db&firUE>Yah!uwndYc}0SvW&x6+&7x;@{;0oc+ct%%^L zl59qgxcqs=4*z_asI`LY>Ts34H)DP*xxypKra>JxXB+<{n~C*$}gK^?oR&f&WF@;E_05b?!W#%6`$PZ6dF9| zdW@c@C}84BWs98x6hO^6*jy)K&S;8cFIDmkQG3vOL8-|n2+^p;#>b^QC!Bl<@;Xm{ zHpTqtP4M?`&6-6^{R-;4KBJ~i$IKAYnSN*7GwuXK&5BwE@U;p1WZcVUki5W7XJPnW zKW4;YI*hW-Skn$IO5B_N6wx21i*Z|aV^?(O`Msf5+fLyr$n^~5BBMoY37<^v@Aud9 z@PHh$JhjseD^$~K_m|OAB;uY+qmQ+=P-632iH1uT_?DzY{6>N{{8BL@pAhuERxpoZ z^)70Je8-wGq!&{2`J$=rOOHoP0$~05!d?z=toFjt1=wER4-c?@{dsNqrg}$lAAe8Q zhmXFQ%kox--K_&$d6L20&QZPuXD&8QzVsJR1&={6GqP10M{cr?iO zRaITvhJp6S5yAyvXcPw+^pB^U-T+KfjucT%>Q9*AGPEG!IpK2lRytGzHUk-sACM{4 zA-5~v{a$8>qpk^-RS8{w;kCHTS|;gJ*Ri&6H-`fvU+EIr?97>?KKXm`fU4fC#`%NN z^Z5#!pXm7+0a>`Zjidj2Zs2LEZEzJaz6BAEAZ&>@EOm4Ls)!v89bY!}Ync^Lb#?z9cgx+!`V6$-46W29N_U;&8{=qbWiKbQHBKmh2i&LFFKn$Yno=4d78ua?Gx2i!@7n z%O_oz*=4$-0cVvpXPVpKp}Su^2-mD1jEiA-aX))otfK>649(ixF{%-2 z-+^IXCAU9y{#2m_OchuJlA3YHoDxncw|8{sKPXQ&qC zRU-ty(`L|RwCh)_*@=bnnJYHp%Zf@U5E>i1WPRg+kdu8>Mx=;j<`0fY@x{z-_~U)O zM!w7}_NgL4`?}`DdSBb!FfM#o+kyoAEV7vqqZ<>MRYULqi(74R31Jp6ivL=X9S}}A zQf5T5n24}S>}YgHs?sa)GEEV)nTX!ph09v|%@rLHJymX0z=PVsdq<1I1p$>!{if@% ztfYHf+mq`yUW&_D_6IWN2Y0ghOuwrbYs2t7Psk1WUs^SRvgRBOuYvqqXBN@yPZRn# z2U%0RUvre_I7i;|X)se-p#)k`Wj?bLY)Jkcc{e*gxppk2*=Zt6I;91IWPA|hZno_D zf?nD{ay?Os0&R1lJQYaUz)grMAU|{+o)MtZy3p{r&pF*raczccU0y26y+!T9Z%B>C zDqW)zeX4tyw$X9bnZH%;*{KlUEZU=IP$Zdh$3Ll>o@Ace`qLpcxW>TYRfMRN)p#fAfFm*NZE+#=)E0Ch`W7IE5MI&#nMi9^w@%jgC}7zc3X`rlB5@B- z0yP`XXT>Ho`pQk%=JbGaaHM$V=3!d+!w$|S|@DYJiA(?yt{FHRea$d`lb4-mb0i2s#L%V{8ANcm-XMU83X5D z2Sm5&PxlZRNC)hJ47!=9(vk(Ok8-`B2-9ov!w$&T2 z>!nS!zyI-=TZ5(m!yN)DRUozyR)#FrZ!_tl>vv}6A4eeJhuVv*>#u2q?_^`&Cb(tb z+lu`B?5YBwH_!2sIgT3Xi?wfcVpBKpgKqRD8L`dnJ$iRVX4xTKee;eLX5Vb0!`pXS zi(oQ0%N{_LgtdGyfAXRh?$|)ecFBbvzFD7I%1o4$(|4yW#DLsXLS1{iS8nb|e%vX% zb)n?e%=ScRQI?7i(rBNT4(deiPf=gk_O)im3>~ej}B7C(0VrKouc9c26(~sL4V*^ImuG`>f&JC zvXj}}*ODC+uz5doe{#{x4o-JWn0SeaqyaC`nyl}0!AFe>be zbw!O+cg-eBN7s%uV-}zL`9et+h;p;%onkmvhT9t7`tISKKtbq!S}Sus3t~1X0vDDKAvD3Ke^`015cc%~Wz!Ai7e-M7f=3fZ-9=A` z&zn!h*S;1}qg`imLrC_V6ZW*#8|S)x1W9L4a0RD1J~l(Lw_ zvfdUBw6PIVKL$*%GHi%N+6|BH$`p_K*(D9}vsX7>y2#zZqI%X=+R(SDCi9**hs|iW zUWIzY*AhCj=;a!0_UF3JtgJG<*5j+yf#w&OV#RMx--&vnW&a7lW*NAbsWK_{>~c}} zr4WsB3uIZfa=(&jc|h#GfO7gxV|=c&+3i3|$`NImAJ1}w_(G5U>N?O;5p{(5?H!NI zYXDzZ{gwETPru?i*-nu)MVzU$;n6WtDbL` zTI3}TAsh(vHCLEY==1h&{95^W5s-7-u&cNsC-Jk*axqko6&1kcSWNX2B@#aLE!Qe0 zKM><33J>#qkm-jjcz-J7Kg@e3L8Zfn)AcW%-<3gNw%p3!XZlc-WNqlhM!dw`ct$Fy z^Y^b_K0AJVDU0Yj<;r$&m2WCY6Q^)?A;}7`)Nj?2^-o0|UVX)yBb%Ah*f(f&ZKjHW zqNJ@rML94*o?Skr@|A_q_zydQUp85&+^@mQKH%8?x8FnKqtINBeQGT#`$Nr(;jo#W zj!xg3<~v_sbdvTJZ=zd%%I~3G8Fit3<4L2bDLCy^RLVhO=R=`+f3#7>7wRn_I8Y*< zJ>SQ7KZm<*g0!+lID~X4DFtq11Vnwdd+v(|y8Ov!7h;tS$N=pS&tSntZAXi0WyGIU zoO;;a$P>WwW|Q+ zG9Mjya--+mPpAYo?r|5szFNYo!W-P+2mJIUA;{(lMWT3wl=GQd237!iac6e$Sf!%xIG< zs^yamK_r@KIV|?yi!M0ILMRQEn*aon=FI_a?~X@`^@Y9#3OQ~#zfmdb0Um;$*Iy$~ zY_;;EN;(zf&6+rG^OlSQ!zQUciWM5X0sl5)kuv&Ig`o(TwXD97V*%B>&~*>Nf?ziF z^j%I((BAIz7pwKYmw=Y|J9{hgzHZ;O!1qH*6cuox%!;-DjJDZidP6LP&wEwCdVQic zsZXASGeOUjEPO)gDaxvda8H->xwmZsMm>_`A}~yl=4N|QvW5q=ou_TBYWd4sv_i|+ zC9m?(=;oOxH$pK70uQC4UglijbE&*#f8e=l{rVFYX9gCMWz#E@Ag0T&>>M5~MjRly zZ_>N7cPf1g;Ak(<$LG-)S3pE38nA~~dxhFg!sKNQ4n|!Q@plQxj&>s675@i(wgN5! zZE#}S@f1{1Zk1T9wI8u>BiwS~C?Ze*F0z1049825HpVm+e3#m^L$MTZJ~Uq7v#y7c zo-T=#b?P}=3O=*g{xq%h;lSp|HoC``^t8#ua`?{!%cZz3{&ypZLxm-+f*7el0Ax$w zfs(1u_cAGuH%fTW$~><+uj8oGRAxWaysGop6mfr_Gb2mdFt663?)#uX<&`uNowSZG z2#Qd+QX}4!VPvE-%luXtx$)LxOLk?(qoCO$8ovk@=7wt6*S^&7;v@9~(uz0GhPL+rIdc ze0HcO{lz7tCBBcJ-+pV3MYLpm?G_g!ZA+@{qsq?}&b0S=XS>l+1%k)E+YYZ(VZxu) zUYMxaU_mb5I$U1a>OFh!e~J~cUrKucJpOSt?eV~)mq!n%{$=<_7N_-P@A2)oxLVlh zP4`5%Mv`WIz!Mx;f2eCE34gB2)B&jqPfUR|B2*UxBC!c6++rZ;?R zHik<<`_kaDnfqhb*Z3x#)j-rwQ07%M)$fahOF**W&Ho5G(s~5CXejZzo!(K~iMzi{nEs?!Wsqi>1T4S0-g{@Je_=?gyB8CC34yf2Ke8le zf_+VhMc*B&xUmFpPcSBuR!adN7=_MR)K_SFyD`^>KQ#rbkQ8x(p_KfWUsw;)tyVvg zv`8xFXwFA<*Z=eLr(QTq;5&G~7l3=&29Mgnr&Z5{62EbfL{@yTj0yWgF|Iq9O`Vmp zc1UK!cL{j5W2m4iLeX_f#|kDOmyJnYPIZ;jd8*emA{yzrCTYzk)Sm>_eCPG?mOT?j zpswLi3Tl4Kb%R)!jB=bgdy6~qfy-H|;6bJBpDJNBTgFp|xEV2-2Hex*Cvv!}*?|=5 zlKbLL3SiE%!xPp?^vMhgzZ|cIwrWDraBCdsNxw8EnNFM3f7nmWBKxKp@opP}=TDTa zoqS|Kz(98~2{-q)-xQIOmg4y=@IO;=P7e-!%UCed(}q+v?_5#WGaL&|UpQ~8;v(EX z2J6{e6T5gI+up7O`5lC)HRMRbAG{mL{%jj$itJqUMR~Gm3QrJ8{VbaGz`v->dATL; z7fhMNVjO$*r*eF-(p*V3ob=)xuCI@6L->JavvaJIa6K2$m`Z{R)V9|`d{wi603DnW z8cM!`vCQ)!IU~f+v5q0%XA9K3Myp2zG%k40x5n+AZJia_PMtn0Q^17J=~y;aCgc#v zQpw1f6j^(n0z(-D$$o_>=%Y5Sk|ZZ%HGCH*&_|B=)^S*UWf?pT-Ao*toek*+39^*! z#4=lTHgm#qzhHVoAoF{j-*k_2hB5!11nvh*yu}%gyn)c0>sc5Q$zBawUM8sQ;seU+ zEUs3BM%^lOT}d@S;jM$QI3utGN3*&8)E96=eb|*E=+L2=^aOZtrjCR{YabRUSn~1CoS0ud(#2q$h}}c3HZl=s0s}P@RBZ5yJI$poEeYa!6a$ zczR+&%=jc?0k?P$`(grVztzd_u=$%NraN)LtqR4T`U==N)nED*u9`MIN)8`kGw)*EM z&ejm*Ert|AO|5ikX{(j_WR=bA(6Lv8iRpnN9$(tt#h)Ev`yf#=L^E+Xh_7p#xSCL! zc)Kg|gpRL$8@Z0{Z5W-hBI*b3CT_rttT?irDj>P$J+80udA?Lk7*FBzGXL-HfyV3Q z+o`fatPzqScMFG!| z?h1g|U_LbqY+dAek`ys2B?~vLDpqdy&kXI>T+pU#alahR!bxg+YARt6p;JQDKZ1Ws zIaxJ{9Y{Oq{>1`3L#8jmF#FSArjmMB*E}iE|BL>gpk=`zq=GT zHxCX{N1pjgoX0Z{c+mu;_CeQdz@ebxu|N2WHX8r|n;u~%77zxqf~7Fm$W@H`@eEXAF~Hzn*twbz7{#xDQ189 zCcy27gY$;d?G9+K>Pc(CNjl;r8B)iw}(L4q|EAs8Q-#u ztRl?uxc@EZF8tjnc_uJP?r59Yv$~C4BB6!_RpGrZk#A*(ICEj+X|8s|82LCHPvRT) zY*HC`xIpbIK(-5h2X=OOxPXAy>x?7~c=lG+~^I4CG-NRWX&xVG>mWoweHzgX= zLJ%O)5?&Uk@Nxr*ELsPSPNLlRn5xgj=xcV`D2BMnCjriCYg7lk134H8A}>wkxF44lCmJAoH`+tzMAi z&Mj&85AO0e;QCCJ?@NhsOGdm(5h*+n^EETPP-_4q=yc7<@9R;&Crs*?`);=1x3ej% zSDW1yY4Ph=RkMP)601;r^uOo1e?uZ};1{`LO7J+qJw1XVG5nOd@kIWPrE`n2jD-CmD;$Oos}RxKU(U*S(%MGSXWQ(X%)7A)cG%)o>Az?;Xd165^Q zEhnR|j-Q;h1hkX34a1AujTF0@(T%E7mffTQgvl9g(P$|Fq)ElEr1|g+ZlHjGiAm|1 zm4>O2$|{Y`_^78F$(xu(t~MSbMpgcS-fKK;H?WFCM7*=&d5R|&Ci`zCE-0TFCv4#R z(>L62L`JCBrd2({LilB)wPAFWUH`rWs(i(_SJI_4AcN~9wR|JiE68-mqarw9H#8vt zy)o?yol7xLq02uBTz+!KvX~0U9NI3Ymu?^dD}yD%!NZGcA zzAv1O;#inOpS8tUpPC<-7PSi)6Fr)b^gbj4TvDaS8n8kE?^5MfwlWov$93Aw1Y{qM zi%^#*l*BQ5vDA`k)*TKA_HE*+?QV#%f_*$Jyy*85iD+*rE^ul z$7_7cu1MsLWd1eyt6#yYW9xSOJ*S;g-??^oZm73kB27ig-jpe{gEgYzAy)_%fmAG1dMMAcge)}pZI>qZ z^MmTM5vKD_Ul@;%6x!Y2lrU)5j|ry=n=-3+X{c-`9oA_t(UQXWyvVtcwF1GDtrUWyn@OAeS4~~ReM^Q}}pHp!2#BRIo&4ISn8Bc5Q(cpETZ4uU*VmgTW6rN2BR8yENW z{7E(;S#`>)TjZNEULweD=3qzWR2E#|ir1pLs(&E~@Bl76KZT8Lv90E~e*oLVC`4^% z0@-beYb!dt+jtzDI0-l4;ktPaKlH1CGzF{6{Rt(c-59$6mM9f3U!$5^C7*cbo_3MS zqNV^tb{gGDN$AEVt&DeUjTl)}3Za=090q}lc2|#6X1JClDc|3a?7zp_Yf1EaIxna4 zP(n6DP*>>^LP$Ypd0S|CZN`U2{a{`%DkMsED6Kl*1Fz#eAD-pA&cY2msP^+@AvK&? zmFNv({h7yA!>*k8z1qDD{$Z0)0@X*DTgc8Ylrv`SQ#-O zKH+Ke6w%IG2=E~ZpcdUUiLqNIW`U34xZQW*V3*8O{WVFUF;~d8BxXg2pqbf%CQXYz z8G{48niQ1($q5TaWY<{#LJZ@g`8xlxk`ZX}QC#D@?5c45uhl?mb#sPjIR36xdsQ~! zixPgGwATCV6E>F9Ka-*CWA({~)(t(d5q7(%S zMO0Keih%SZNbk~nfFK=|-cfoB!Gb8#TLgpzX(2S}omc^Bp(9;N2puUQLI~WAdd~U( z?;CHtH{QD+?uW|<7}@OXz1CcF%|3tYu`vc5w*^FbV~WbrN4z~*f#_A)RlDn>aJcnG zJV-sRfroGPzew~Xh}tI7u{CI{xFn)Wen3f1Oz-u#_N~_PFQ!PSDhL{gggO}I9I4^( z_nxFa{5fUv5~YYq!=_hm?>!Xe2uR(ma{F?iL2MOngJh-vRc-eFXfGqx+P^xwXLe!K zrk@z7ZG8uROw9HMVm|-%LS&cW|59xR_gP)nuD=*v?`K^w^mnmVas$AQ|2CpTU!eYO zXTGQtb~RSv3{3rL%JzW%)*e0ZtazYuEmVc{Nrj}MlYao8AlY%>Ka1-u=5f*`?VDq9 z^ijk+>A=Lx{^gAeTc>|C=-FR;=E+ZMM64e&&h5`u4l4*EMiR{$G?J7^)`%kp71C6` z9m#o8LF26X#|Fg0Ky|sIV(#JO>_b~%(~%D_{JVrV!j0w9%qetPyXOM~I)Ez9Lw&|A zpa~}Snf;zBXE0hm{-79iyo5MHflHu3A!90n`wcaR#oZnY#{B=R;$#F^IPTwJrre7o zZ!mK@zi{?x#X*GCIT8HlO(O=N5l%07`mZ-t+ClGYQ+?nIj}Kk}4~JjH2Wn#vW**_J zwZC2L?J@S!nE(o8zG7JD2oF|H6v4k{_w8QThhoaI!~|!yygAN%IjLn0+q{oW8Xzd; z$|goE_o&G7I2$5tOaar3$$F?V4ph)-h4*Sclb0SDSIZ8_>jKHsQ9Sj zx$&g)WFVh8G~&*`?Ph8(by%@&Qkq>r)69J4f|isfA8jYg5bot=g87ehnZjz6Z$z@EExblB=Lb}e^}hr&d3-PKL!+6q;nLF@y(~(opzO<5 z!)&&M8OcwWiF?6unnhK-Ne`7ISchzZ4>?CZP{h%;d~!DU_-mc6>D||wdX2#{SV>s{ z#}$kxR-y~Tz_(GHQm&|!0mK6S*hrmu-l<)b75xd+o_OU>b(`&%)LIR+K238>G0wdo zzAiAmhy@DoFP#(w7jott6=wCPhqpSUUu;u#o0cc^OIwF5D=qn`psgXfJ_0Ycc~e0nd62z^w})C` zlP5qb>!CoWG){P+Jh`em`y7W*a+&pAX@Tkh!J)Y2x@3xv4F?kIuh$|!>`@IH*`S$H zh|K|;Mcf}&@l#r-$B&+*&p(+MH*ueEyH%GpboJ#!{CxF;i2#&@XV3xO92U)Bpw@BkM5$73J~BVI^4ApUT%apUj;PNs~* zq1sr%OH8P#k(<`Kxxd~y>id>w+2D9{{*#SW3{(VB)7g;We|~MAs1JS9S-R&@RB-iP zckbg6eE43;ycwnKU_H9kwzc*pF`Xz{uNPEHXYaDY#b_bh1Id&e99J7eCPV0};`w2N zAnddoN5kG=S`YZBW9@rY5MGu5H*$VVI;33M@R`1+9B8}HT(|1$Gjj$`9d%UYI#&K{ z&nqZxBXiPH{&#cnjm1$T+bg4Em*qfX5i_EJEU$;)B5~%I_IC1r4%mneDas(BE=Z^w z!|F_--@A()s`h|(?)x$~5U6zz>cvuL=oNUUJ|1vO$%@JzQKAAEQ_%U@=dP3$mRxD} zyx^$!P49I1qi^=?VpY%2!DnXW%G>GAc}%HD_gFBK54UBd2-#XXp8~6!Ij%Im+^!oj zp1!b7U}!1=HO0+OI<3}_sQK!mYV_Q5*%eO5_fw*V8HEXAgqJz6k)!voYA#=>vql?0 z3Z7lO%jlcQ=5pwE7S9;xe+qm<{_{gBa9MlBt7@WWS;4lNq@e+wW-nYx4E}A6pbt4ptd%|TJIyZJha0FrcP`4C|5!DbX!neL~(DyiJlXx2LjZxo19W?#&$1?iMnO^}n-oci-&S zMtkwPddOIA)3M^#W=)1Sx3v#-E!Bzg~a7atog#UCja(3xk&*L3~J2>vCJTB37v2z?yvj2r`P(lY!)$A)80=S zVr;6(O*9@*G1h&k=!Q2m&ooPa6n{&DWbGoP8Xl!VQU+rta;$Sjyv1PTmsKjB8LKb~ zfLz3U*-T7I3%)KIJq$ku4x@GF`_T7`V4ot{bz7R#B|H*gf;9f5J`6%fRf$owzP~Iq z3olz&%AzN9$yr&A2_*gTB&^&}>rEpMc9q|`6H=nRihIzzlR|8=iSp0=Y5;a8X6Hw3 zyjCY2_$BZCLUdD-8&X#APms8Bz*!M2A57NoL}#`wxmI=F@)CLoNV4KTXh1FuerqGf z*w>d{FLRzAjOXrp9VXI>o`e?B;R!r50L@r`HLDRBj4HTwI0^*RV{)5~d;N-x?N%^^ zlSU4px$Q1p;Q&y>UW8(xM9roUt2LDJ(L`6c{Jf^^qBo>wtEs-3<9Pjmj(^n(76|ez zt(j5IpLaYe8Pn_B4)5kdByGAzIqdLls)Pwxf38+f7cyN-g59 zCtBYl{)emxtV8TG5Q*bWi|7p2YY<71X*jJT*QE10y^Rp^;AKtB+ji1anf?xwjO zc0{%l#qToa_lQsB_s)!x(_9|qta(fwGyFjny(RzCW`$(WMgOc|=lji-^1CF!0Oyr$ zIC>NXW~uFmPtT}?PD3-p@k1AxWqjna2J>M7>%K+Dd8hqwdHq8l4He7RpX^b(?3SFq zl_exu1O(Esh7S91L#IFSle(AdS3CFJI6nzgeeFgS?TY zJUk#R@Dg^qI*nl8-;MB*PlN3j7dA5p#bWnayNI{rBRbuwOdd0-Pl?%j7t8PHGzEPB zdTyTm-nWtaz$Rw6wTmO1XR3;SdlqRGFQBQUlz&R(hHqMbqyMI664}PWW_1)76!rG=#YESfMMm*dzUN~Hso z+T`?4sMv)O>b`U3i_CsGp7@Mbc6~M3s(bB?D(UIM9*}oeCM73Z9h<43aHu0CIP1^s zUAR59D`rywzn(fVlZ$3Y@ycvbvdJp@Im{IAzE723Dk)~qnb|1jma#GLZx1F)KtkUM zu_2ESX9l9eyyQ8I4dBNQ*m}@-FVwiPPJ28@;U!-EzB(v0z836}H>xPD*&YYcv0a;1 z$23%nTs%`qmSmet1!ib@s_iVe15t1HH{s5*GF{Y-MW4u=@)b2hKHMPfaH zjy+a|&js0nYVVz%;*I39SqIl@?9lNyL2J;GV0WmNuP z)Bnl%n;FXkkNT-!JDzNg8)!XoOBhe;3W{iWx!)u|@$uTt5!mXSXIL|-E`&|daqfHd z>0fQyLo*lsHSq%h2S188mp{L>-(4s0K8tX>L|XQaTK-(|sX7qHGhXd0!ln@Lgsv6+ zwDz!F`Czu`IA?UUx6l$E^i<(^#(sBZB5kl<0cLpon9Jo`ipKIVrZty?E?kMlR4^ZR zyc;O9_o)uN^Obk^OTWF}&#J)X77RMy{+KA;(zJR>#w_qjE9uaB+-P>7^$h153QgKr z7Enzw;!p?=e)le>63@L!WjOL|3j8BO?7{%h@9yr7RI&nAg%OnA?mfOPmkn$HWX@sF z_I9}7^N8qA$Wr{}Z!W@Y$oW76*9nRAs+tAgi`ukqDM~p{Z%-7sRWaH5z1AqM^(biP zA@I=os_zIghmPpJewT|5K=%w+?`5A==Nx`OqX)685?yU8wHD3KdP`R~Xm2u6bja== zTz?k8=y}-i@!_bq@6>$tV;H7sjApJEoxLG2dVuJ*;s*x{E z?lqx@2ahsjKEGZcc3qGQ@pwA2VQW^^J9IQWfx^3*JR>*Byk50@yHw=KX1P)MvNm0s z)aw!py-}_9tmwoBg3sT*QjN!Ca=jU&)?tNZo-ntTwU@fYHcU1{5kIu&@|(ztE?_heWS*0vqh#_fW?RB_qTp2(GALbfy%`rMRbGldFA${X zzL>l!i)6i?w!a}@Ghk4k9X>rG&;G#T$&wg+D3Fft@som{Zhx>NI=6@$pVgXS^UW^1 zY1X_kw4^31n<3yy-tP;}x)&rr$zQz(UcC+rQ-lPhGg&n#@Y-s$!p0Om zpLgfBhqHNjr_NXX_PWB8srg9ZXr1i}C$IYtfl?);BCwd2uM`Koo9JVwkM}bHq9(3O)2Vi~*9v zD=vrsw*T_W_Kn}Z@0>s#U<{XYzsvDvC>sdn=srCth9qhILg095N#e5EHlRZSNv(1@ z4NS|n1mrpfaj~vT4B0wb3&CIaoCnHus1E@SnkG_@yG+N!Xym|wF|DNbtA1w0nWyk( zozP?dm{y$cM?pNV$Z{0mHB$W(v1EGhnILMNcIaa{aQxL|{Khz(!6BbV9`&y>$ih@%p`W-0t3{#K0<48i{_ovZLtTzloppKF*6WY>x|5 z-)!x{K@DsnyS3qT)YcQWKCUw%1a1-t8Zq?vZvt={pR(Z7QK*=_Y_t7pLRc}rH7|Lu zq;tnv<`4c&{*lmlK>njq-M2uBg8Q_h(*?C&4x5jgQ`VdPS2g1LUvk9tS8(X}RdB%v zL(A_OVFO_6XlUv*iAYdACdfnZNAA^l47@+5@si)%>ww9Zmv+|`_xe^vGL>HkpzYh~ z2A!KE2Fq=OGZl!i0Np9VcuidY2ZN_oC4!SqUb2dmK)j~$pLmVKwcvyScBFpd2REuh-QY=5t9I)tPz`FSQUkpl>}Fn~)=>9yz0dEqc%pfBPRTMvR%u^v7G* zTk701*;M5Tnd`fI)Xko;-;1lw2YTw=&Rm*q}EK zV)tc|(!U9*eWnw-_CbsNHBG%7y(;xTz*i&dy}98q+QQ7jN%eR^sP5Ugi`f45dwtbR zRW9$bxmK`k6(Ed6{dX9Ntk3ak_1m?(>_{-$P(*u3^nROv%Z!MDGRQxP2ePyD;A{pT#K1^OI%U@g zr|*lgE6o^%UO8AfLkP&?la92j=Ui>k`e`VD$#jC*l{k$4QN8DnIh^Uq|J)x%^GP~ zc`nRI%08rO6`Fbd2VYNWbmjj7JZnZ@C6oH62=Wfn zAH=p_IyhnF0*G6>Vdf7c$FFNf*4^YL0O0hmmf>GlfM2RYi+@X#-8CHCbNLR--X_x$})#i-;J zzrsN+^p0G4l;1GQBvrrE?H;7^-tS3r7X8P-6Ttth9{?o4|IeC`k=9qn7kW*<39ie3q}loW19fI9RF)yg9=beMZeRO@G_dntFJe!&6r`i5?9q} zbzA$2w@}*LRrZ87h6x2u9X4#8*Ax$nX?GI4>9<#>GJF zkg26jkD{ds4~Sw{gQ7u?wEw3$@!3JRXTjIb^3l*FqcPr!?Z*N269x9G?rB%;%7zj*~vcgSY)Ewm1&8(o@q$kB2Oew>Eiv^jW>ggqoqZyTW9rr#`xIEeJ;8LzTx_h!dWT1&j@>KCB+JzshY)l6@8to9e<_~s*YfDm7b*^-L z`b2&2nUDe`ubu+cxrbfI;4vutX(>G=9T_T;Ug?x6n2A=ESgH6qY&iC7kj~MHz6U`X zOuu#};=t`D!tMBn#hBD_Z=ZV>eORg7uv73TTU?jl z)9NKj?Kb)5jyKMS_%XkmC&SB2;=~|O&5C|%nO008Gxnm;bqT)k_1nd^3!@s*ya<$s zt^S6grYS+Ju-{Uqz%I{tUZL&L<<(orK5(dEaD1*hF?++F@EeK;Y)g9z+_ErR^To&` z5ZR4R5(qdfoHCz2aBs*bjAtd^8WcRWA+?_xe^*x7B=uy~BJzCV0Q_5h%d7iQ{^SQL z;r`ZJ2tl#huD~+-Nes#(t4DrY;4|;S)^i!<6@q~2Cx`*uK5*wq@MP>yw8ND00cV!) z3ahc$9rg;<+SUpspRmqMs8C)0TR=h8m^yT>`;Jm)`c4JYFw7?RKQgbfxe~v8B}4md z{yr?=OBY9q(}w5CKoBGKPqHQGJ1d3U9ko9rIggJL_8!^T9!5-t)!-W+?b&a4?lFpP z$TUrRR<1o3&ME5kPGHT2*VNnxFZu6=kVZ^eMW_ur29?`{CU^u2SMG%NuM%Jjt%bO6 zEq~ZbCrBw(tWHy+x5q#AYbx)|yJMN2seKo|I*f>Dq2oIlb)kF`M5mkYXLOx~Zw3Y$ zl(;HFwDK+Uwg7*%rLbVGV{_J%t$<|ioBFeu$_YLFH0W?b1ttC;ajI^&U286vzvdC@ z9!=eiDqFg-e||KBlvO$oAFsAxZ^>1uXWwaP_WlOBk+sn~#=AXYxz)@a$WgWei44wG z&WGF%&5*~n+S4Q5nm3nsXi%}|+tt?Me@S^{>%U4Jc-zDOtuzFGS;R`EKshYUQ>LqD zJyhGN-R6WQpmG;m4WisQ;SnLq?HuVBx8T#KFo4>~&nl2GmtR1+PiW5zSn53ODnF4v z5g}?snQ>fytAXfU{sZ%qXROFJ!A;g9vHRqp7B2Cu+^Y#Bvq>I=cdhnSw zJ>>YWh7o7$`{rDZE54E2E3Yt`HoS1W67z2>=7j7KjV`YRL+W%p_dFA{%oVyud$z}@ zl<<+`_tN77Z4+9vw}Jg9>rLNLChnW(Zd}}*=dX;JjT;~wNsESqG>#!*KU&vr*$5a< z)YnlCT>5Q9odUA6Lu!nYY=rVm?$W8Qv&e{3?p&h*D*|kd%hwAuLYSTVqt3w!io1 z1)zc&bajjiN!M{yNm==zO(?PJ6S;}yvh@CG^VWc;&2DB#lY+}*lV!Q(3q5`4=bIvw z9HC=Y=-rCMfrD*{B6C=dmD0Y0bB_HBRt=rL9!m0(!B3e$ zLMz@Pt9-%6iycD@5H@Vdp17--foq@B>lpZLlY@ZHR4p0Wj6xxP4NJUhpc1}b@e-IN zy>Z&Cwn{0)X5$<(!}Luq!{|@1T*s9dim`Wvx_c!ef3?E7f~VH7k(Ie6x&eZc$`r1}2gr+G-Scs}{)qaG_H#8(E+7j?jV!WYQKp7;e0WxZ1T#C7t%NDaa z%rp1;#wxiH%YRaRPp@4%sqPTMCosWN)m?OCCCL?fxg!qZ-SzzHd4~~S7Kc&lw#Idg zrfC)3YWZ}Jp&7S#S6mi#_hz8y6c15Ric_{0EfiWEW^NeNSum0;`TFsedmado2fyL;+mj?Y^KLt|WG! zRo9W{-?pc23Bfl|m{;$4R%NvS$g$avSGLb0Gvd;)+#{lF`#2h8W3Oay%iIlfnPXS; z>J9lFu?OvwM+4uF?v7Py9CLoW75Y75i$ttEJX-zO)l)=CXz>oSy)`dVrzjA!1HnlI z4=c@uPTGM_jn#CIIkPPA{C)@%|e-h>f!2RT<8ce0IYW+naBZ;(LZs% zAQw{APm?_<$u*&QsogeHGCjvQ*)!SP>AS zF}H;23k%S$7w*1=8>-GTij7$aq*@y|{_nBG~8(1K1zlcE1?zFAe#cSnSZpVyDx2YjN(^NFKr#-oY zI2Waiil?yz3ljIdlE$3KF5g5j3+cRy6=jK8uN6+-n8h}1e=c}h={-32!f{8EBPGe- zpc8*EPJ^6I;g$0rZziG@oa0JF(>$TB%{3*PMttM8{Aw7z#Ep>dx)|7)K!Da)o7`#3 zDg24uXLAayWWB(~=QuSf%SogM3rfP)Cpe8m{i=^BM+hXvR*5yrMl{7h5^#dt=qR>_I9f+&GpOVf4zeCGO!s zFc?B{BmOY860*sY?nR~6(dSBrbM8WGo>p(oH&lVU-z8zp0-S~L+Z;lod7@) zQ*pE!mBKxTIJe2aigPP$yq7oe6Oy2Jh6RV@xc?)fHu% z;qpLu0#8exijhcTbp^Ym1c%gqGv0HI*(C%yH7q=#3U{`(fXeiNh;FHA6Jwv!QGi-X zF~4?br=G@+df=CBo~P#=qNGdVj-!ipY?zqs>6^RLhp(EIzvT^r&C7_i!_Fi7a}b|Y z+|P&*K?^0u@Hop`L6xv53Y0Z)hzdk)V(dXR+iE)4^QNy|&YDm4a3%e8a(?c3$jL74 zbdFR}QyNx35FRp&V8nf2Tu;Q@T|HQ+jdnl2OEl!2<}6YkfmFKqx@0I-l@YMR8V6C? z+*r~Y0OO7H9*{w7%RS|vOEV_9yz~5C{$7 ztp?+g#%jtPo~z4qe>5?N^WI<(=W5!c`+4;}^J^-~ zR0{i2-Y5yV44|CzM+1E!?|rLLjS&ZerIaXb4ba#iajaZr@KF4m?X5Td3!0x8u|8u> zSM$EQe;El0RC4T0q++v8Q}>P2oG--=EPOxhDu<+d24)5|P`*vFGnW|D{{ieF-p~+5 zVvT%{ZMZ|jnuskiRKd<{e=e0*GxlBV-8DqDnp{FUUYNtCJj<*I$pyZ-T4mUm)2rgvHe zB{_J>$uy}?ffXk1xL61>$uxcy*YNrT>&(}hO}lkMuADehJtfLAdwZ?$!DIW+Cj74i z5S62j8iJc;x%u7B`qG{1C$A^0eG1PK8XQgSY}I>}-(=0>TTR2l985EdbBP7qZD1rp zze9gYb0-3B@czKp4xHhbI%_h|tm_d9$#nx^aVs|9#hu`t7k5?^MuM_;QbL-f7^UF^)0Bu8_UFQ=eu~!%gR^_uGnKO6~3%R5ulW$ zFD&N{e>0~Z-LpOX(dn;2bB>z|ap zPeJBOm4EFk;D!?do!qZP_SdA!{~uqk_mJgFw7t5}M*;U~ zjmE0#VlU~&lMWfuaW-^_b2^Ug}aHuF-$ zq+FDNc4E_E$3FN#d zlF%jMysz;k&D+eX`&nK6X-#^9^3K(z$v)b>nqM_XLu3&L%Wu};%T|)g+WN1o_~R!v zKD4(z;fVj*m>%4=%KFt3e1o@_T9%Gec#p$l2^THq7kv@r7^z@f$=b#5d0t5#fX+Q3 z>4~MA`cnL1bWPZkFV{ehjBqV4rBv%1g<)Q96h%B17Z^Q*^9mh~>2JWx*#y4Kym}*) z#nzzU=X;#cZ&OXeMy5FnDe}OC*^}p91XP3QNVj}Y-^8EfL$h~x*RE>*wIhbDXO%C- zZ5cCmK`2qIRggC!&L#HdjGpAk_J93(gy{5pzSXUZ(p$Om!}l88Q9{Ls{e-xVu|7X5 zm_AJUXj{(UoPrb=Y^|tKI6G0Lm>0Z;X=V!2)uw|NBhh{@=ga%&r&^zcqAGt}cC;Vu z${EB0y(WrNH!gi@hjZ;{W5BxNSEkXSA$Q;jz4HEcQr9v$Bcs?92jklvr=BuO&R4Nd z-hfYR)@}J8tzJyOq>$Z5veb z<{4azulhoiX!??s_sk@R>l?J<1Td8F1Jhx}{Y z8WSHAi^T>Ds1$~Q`ot!oP(oz*YyY}w;5J6kGA(x7N80c(MLOiV`%h-+U6qD6B30fz z?!k#wQKOnRwKYdbUw&bGA_lE^Lxgtp{Y?#?l`{o>J+i(n(=><6Z&)o9?p6Bnmt)%( zn%$2dd2TMI&w0O;wwOPhg_ZU*k*-=8$3YG&YmSz=e2xmmj6A3`+m1%rlP@_klAEP+ zA;SuOW|{^lFSK(R-JcG_Buj_Jz?bK4^PMSI)i=WZ!!Y3I7JI+MxjjZ1~_FJlPj#hAYFbeWZ z)_60~M2UI<|5DLS_n|v#iiKz?Jxud#5+CeU5(vI&=(63)w)PFc( z7`LDoWinH~B@#k0>@B0@k^!6_D?e9IY;s-S1RUwAKSrf*;zBILD$|BC`eR3Z46m=$6 zL0ehVjl-;Z#|QUQZU0&+s~=l}+E0CD1DSInK5y-qDH?ydjYEfbe}l7YxU}eFuPQhl z6J+PEg?Z&sn7q8As%FVvV4M+|q49Z?-cj_E@VpGKb4vCrvrXwJd7r!=gFYId^FtR# zowa{j;jK(<({it3z80e$uGFl0CGUd@kil>>F$sc4wH8OYMfr-D5&##JR2LlW}=f zVK9QY?Zo_%A*a2bP=a)Ni|RSn+?+|=Lrl7X^my1p_#~0~Vkap*$ul;D)I8)*w<^7U zuy$tXzlAJox3j}H%9Wez4wM5XaCF5v!13RF$7lldy?3g95t{}LEinpzqPr&-(;x`gCv%o%YG3)0Pf zZ+P_J#kCuTkXozk1w~8#!cH~)7JI$3XNIm}oICxK>h|-*lZK_w{dnrjh~d9;+T*_k zcjC4wM{?DOpzn>Vn2wy`OE*TGFHq2eD;|bYnUW$IBpWTP^Q& zsCjg&aCtrXQUlXc)|^P$`cyXy_5drjSh0#tXrZ59JzVB8k{X$IdUBavfeY7@nLHN^ z?Ph^3M!QJPh?AWkW@#n&9(JAjF~peYzlaWRwu3UqmDa|M9i$)5cvJ9y7O=RG-$iQe z-sx8u4a>$j#kE#XI5Fb#aI70>P&B#~)UWR6)*~;HdA%Xjk~2pR&gb@oNz}v&=iGI~ zVTHL!GY+g?$p{6Chx)YE_wZlIXfXXR;fQjyNPpuWlXv?5bp#4Gxp{I3TExn)AhDAF zYp%DgW}D`8c}*6;VH3a)LikVk_SG_y1#S5CY%3n8|l|yH@&!S zJ_SA;^x|sq;ghhVgJ&J0zgF#h4#f?aK1brmij5FZZp_Sw9F7vg@n;D*-hT*F)~dD9 z&A}TS7@Nw|GafX;YxxOoEkdG-O_-o5V*ZnW{%vG|;(KJR7(Bk&0^0Ozvxm3&P21_k zWS^qLm=r-~0dpAcYmD7|&6{MB*t)2+(NDDotAkeX;;y6(0jeF17P`9Ms=6JvQe6Iv zqOC%^YIiomZbIU>+2qgs)u2tf?oqA7vW$E?t8L5Yf{^QfV- zg&xdCQ~m~S&;OJ-{I;}*?588#p4gvC6^Bgj8;n}!q{NjS)XG(Rm8876vL9AjW1TIn zo!4yVfEk}(yyI&QD^JY5+J#;65dbak`@Ky0Cb^fj%LCol;tK(FVLLw8FiSC&i!Y^{ z^EiuhhRA{2cL3w#xvkSJhsfK`^yP_RS#!c^A=ITX75MXlw!wG&yEd=eB`Q_*UCErO z&P$6Hu2}_*H#6n85ukj@(u+qsdEe*H`z*i0j|8xYmq_t)i{A!+o6r*Ai0J{MFyU6o(;<(y6@R&~ob$#l%O^p4BRGo4O=C@V2kYUJ3r zYq8H_d~Y`UTKozBir%sI3O>dEInBoV>#V2DCni2v1vSA-`t7o1F5PlBOn)OJIo;(M z$Kdkl6c|;Rfbxno=FcWWMth1sB<1Mx$fPYxhcCywmyB-gd@*GtYLb(pV(w7F6LWbx zv8FRi=5V(R35;mGNqhq)Vm2FJ^QYwRS6U4Sy4al>?y!^IO5UMroCXEzaTH3^A45rJ1*M^Dh`A_+?#&xJL>u-aY~g z!~CMr7f6*9*fldpGP2MTEmdXkYconzbjbSh`A>Mant+b)l22A%2_-R}gQ^x1e7$ht z@QZ?7LFJgEJg%WD>TwD>?=M5cubWJrFHDgn8pU?0Q=NfoPf!u@bO)&@K|LF@V$uDNlVZyVVTg$>ur8d|UVg?bNtkU^hMSe1h zvdHa?a@@+i4_|Z3Q(m$ctjgHnTCiCOxrthfdEi0LNqL;&K&{9{!_fiyItsD}Z?>-*(U-Zq6 z%T^Fx?RHkO<~5g@Yu{9F-K=^Wv+jpJpy9W-uCR_$IL3)+vm=Horc(xPQ3HW#ppB#jn5LcH0JU6fUNmX?MYjY{mR89|!#{ zE$QRr3Xt`Qpd`ke8hE!vGx0LKtR@J?9jS~@l&wDQ^8q2KUA()7Xg)O=W z*-zzg+$C0_!{q?d7=kb5{rJJukf#{G<-aV_ez%L3C6>grsi8%a3**1!A1&j2&5qUm zYaJsxSEsNm4}q>LJLue$b~|8%3|ZrAYYI>_jC~BAET!){t!%ZF7`qgVUW(;)vZcvf zHz}WZUf>~>|DU>8sb@#`3ygEPBycX&d0}mqI}Rt0)tW8DG8#9MyS}F@+TLImfZ0NF zogtOtp4r^{xjY?H_B{Cx|MO#tof5$LZX=dIBgH>*3p971LmEMb&L_B-+9bPDnQUNd z^3^hheWvt^nDqI6XR?3GAJ7hp>843hBR+2G2K?Ae7}iO9wG@hhTJrCNWow-#llae@ z$;i$iginDt4t|+D1r0=Q<$v9xlWX6x8?aMHDrJk+Y}~3Vt?Hj^wwq1raO# zwYi?R(h|Wk7OLJIO)$!3-HB(lv;-eAvdRDHD_L)KH6GW)D9`9mB-C;fwq5-4&Tth* zXpZw#djglqzW<2}{o;q3E1=~bC3OSxt$vBiU9tX*q$Ill920TEtA8`5zm=dTUs|P-OpYf|4)v$6TqF>E z^A-g^BJNeb&=;dCn!MGtWJ(wQa|w7UQR=4ENoVPM)AB`1MW_5Rl-Z(6jW7P(f7X>n zNJeX3tE;(-oD5GzZi2t#I-+e+w=O8@-%XWNpx0F9Gh8DX(yKA#ZF+b})o{J|6)ud- zEh*bKWTOECTvc=rcv@YblUwaEcvdsR-LeK2BVfF9e0Z|O{Dl$B5mje6vo9<(mwiT=vtJK$2Fo?NX-vDj6A`lH6pitX0AIfR^osJk?%u z87YKZYp@h*yByli*^py>6%+jOpa`qCo^LySe^~)h{%1IKOmP1Yx<-u7kin?cjQ)7Q z8sF&DH}j0T4YHeh#hFc-MBx@}bn!$`Z`b%DASFx+DNwV4GtSQqvDjmH$*nLw^?3M= zOB@+OnRTt6!pDlogtygSS7yiPkeENqqIGw?t!5otiMP$TZZa?J9W+WwwjxJ?`ZhIw z9I!lzyXOjB6;j&9uklcBGV{}B+#$TlL_!ayZ=1>Nu58HDN8If5HNYqnfC*?Q8p})# zn3gpz@*wWHC}oVz-orGQPfU`M5G%S${#fz!ZAHux=kccEv9ZjwPo^_zY0J1f!3{G_ zneAWE2zl5lCw^>hzWwo>`N5pFx!Di9QhnfXa1r*D28>{0Nw0Lazw%N*W6Q|Ajp+=2 zDOms`7_Pi=O`)x-to7I0OJo4)>m&$~UfWQ)%sFfHvU%+)q6Ch!v6+3TN9_p2#Ivz! z54Jx)H}ZuNC4|zb>`goONKKAo-}(-My*pd2%R8=N0+c*1_Dg{0i;BA=I%$g7t-Xca zzmbF+JZAEL0GrJ+5JDC)bXSS7iTqPkh}RtX*CF0Ogmh0HaZ;5uu;eV%!yvdZqnMyu zH3L;0ZC}99@pbKNU;+Tt_T?gL9{IyRoVLo+qhhqw@d{?>c1> zsn`>ATb}RoBD5))&n>0I{hDkD-9^waR4=18iKVJBn1Yfs-7iCt@bBWAyjyS-3+rT) z7_aIr$j#n$UwUC1G;&&ep|{@&(O+e2^Lcyxjm%#o5pKIbf#boiZ$zLVqpd)ur;D=7 zmT!XKm9z|jY4;ylSNhc(q@OuCCd?)=EA_PgMg+fcd~wpY(&a~Wv~~B!e8%<$8Ll&u zAvU-W(QM?5ZY<;`A)JW2{G14F`cq)d)2F~pTY+zY>?o4_Rk(>nwANE<5;Nf70#x^3 zmH$k0$8Tt8SZE@6M1ai%|GipzdvXUYT1fV$?%~T_roZHxZP25RjrxUW-$*-WOEc?? zjy>pC8RQTn*i#!w);5_qb%*oIl_I>nqa2t8myyDuEgOL!pH^YFi@kSQGpUSqY%LfI zCK?ILWr`h`yblO{f8=U)Oxm#L6OYw}BlERB-9nQgYyj!N<2I2rIzKc|2vsa*7Fwi1 zrUb|25Zb~w@jtURTiB!6*8ort7$FHn0rO7mIQ+zNWy0LD@;63p}P4hGvo(^CMpbB8(403>y zoY9EKRC^i}2n<{M0r9Dv=e#HOOeC=0}V zB`8q4N=lJnC8bpMGsuKYkTW?Q-`Y_W{aScAbjO`bfJ%a_p zs*E)Dep!SQK`wt)-tXU8)MTNR^V>~|qZoh=&*9QEbWJ6Fc2&iG^kExqH0;K%N6RW1 zZd~}%!?yBscvjff+-1H@3=j;tEqDGJa9o+yz-0_xq#7H6cx*&yQ_2Z>dwY*M!&bAC z-KoO%TKyf&12D>u!|xG7SFeIxuN4`eTY0p48G6vf0$3=xzvYA1;%<2M@*Z919&C-! z$;h7mhCKCn2k9n(7#MAPv>}|Dlyoj+a_`Xv(6CT%0>2?Zp+e771H0;9%}5oDMpJ~6 zKzTBRKH%s5-wRY!s2Hd)Kz4r${oETgZtLwa?nHI)@qSP z-p?-~oMZieu=n0kO|9FbC|JNo6Hx&H5dlE~r70anMLJTYZ^clBNC`+H1Vz9~he!vJ z-jp6f*@{v^uaTCBl+cn0fdm31ZvlGF+2{PuzGJ*`$9?aO@&1FAwbnP+H~ai%vARQ% zD@y79)W?)l7K{cTi;2kSo7)1YCvVa++|)et4XUdkNbE9O;NqXsLmuNAuljmTXecr) zCn4F;C@-tn*ZL|-9rixH!H-dNb&sU@))r19AV;HdptOHeUJK-vobz8LmI zp%Zt}IWdm^Dk!cImrLZ_Q&8Iy6p;c8P%XeI-qQp`8AR}J8Kb*XGnHr*5giC*p zwWO|3c3^0a&#GjU$-lsZKavLg4C@Y3u1{^Z_%mlUnUxhTMJYHVHn`s0~KS# zG?iubF>|w`_+vrw9t-~4M38m%mo{!V@fWl;SE~q0AFrf@{sr@~-FmriQYW&35&c@^E=P}|-yk?@wh_<(=-1mf4L= z+WNM~XC+kNhpU}+?iO~zYgQdH{%s>SiImN9_o_W6Y{wr;UF5_=yK8N&Dh9bOf(+x< z`TcDA83d{LcX&i?&MLoHzvVH#HhXvIpQ-LATHigoX*?|>xA()#D7TkDf?9!!t@D&R zl^~e_k_!*rEyNR8VA|P)s$+Uq zr&9-Rj$YI%s7$}pzcs$~9&mS0uW}lHjR-ze`6gIWjni0|htoJ4C^mh+XHUWFH5J23 zFFDS<$lvRGRK5wbtd4IF+R}DEYmW8phB9fo3ICliaa(XYZH)WnjmC~V;Acw)=}uae z>NL5RsRI5~erT|yACMR3vCnJ{2$ALo{{srp7o1l?C*aEl9{sCJ`Y$9|P-;i=?4x1R zygOg3i)}U7$$*v2{`n!>ulV6~I_l&vckWpgGt+^m|GJ>0Ut+aCB8N24#_dH?;n*IGn0XY|-lpE{g(OKS8SvXb`ii{9CkUIx9{}fQe05gbt zvg~=m^&fEZjG2=?$zx}$6gF2ijRN**?J&|kpQdrOY0}HElPr4WEgQOpm()akH2qBr zKi0n=j@_CfDRM+N;;!5o8G{r$!`4K0%-v6_@`T&Hr5b@=W8BwokV|vv7vNh94xK;0 z+6kTEGX9%S{WN!rg)NJ(^yF#Y#)6+5;3F}NDiKR-T)*6B1OJtu1I#iz`jN-Bu(y7y z(L?AS3(jK$LN2PFJ5b27z|w~E6gcB?lhb7X)g9=c2DoAG$z|}R_*YldWyZd)!8d$Z z7`angT3?cSA2JUL!mW%XgRpYliKAocv(iR^&#!C7bHQ6){AXCA;2W3me&@&x^gMq+ z(^?X*QW}@}Jlffl{12F38xH3_F>O)^*<*mq6)BK^-xqC0E0Ux_ub=s~D{75@9!U;6 zQm^gp*)G>u-AH3Q=|msR9`#uMig0MFUA-}*csK|-U~8ypuCPne)f`<2Am*@qft53* zO4vh>INke@Tkxm$ZZrhos)Fx}TxNjVLLiKv(KdQB@4DaY@PRxarm^jIe6rngaUj!r z#Ts*+?c_0$B#>wSX6C7G<=+rp*;~-TUX5OMD2`_1#{qenSnPV*DaQOWr5N4n#KwmQ znawqKJ(t>5!84dD;*=Hp=_?*uBMD>eS-lqvm*R`n+MoF5c$`VdIKdRvup@(cY%93T zJe6NQ;WGQgwauUffAEzEoMQ_j1g2Z-FG{i53q5cPfRkER)lh9X58ew1DWUJf?9n^s zy!pj02|ARDYTBgFk~A)*D}WlY^|@y18=HE_+8Z`L{5flf0ZJF4N0_$rqjV$Hk+0wF zDbN{>*x4OOuP@<}rnR#l`2uTSV%0$pe&RF}Qw`U))R4TgryyyUED90^TWbAm6&fAB zEc1us_>@9tZIIrRJ+01$cJwjAa`kA~qxtJ+cS%h@D!9O=^vN;_zAm)f{`3S8IbeY4 ziNTVmcTrT}k$Z~Ff{NH9oVVv`Z`C`Go7=!pX=r(mG*HB`UjF6R@2}PND`t3H-HEM1 zcVcURVBkp+Fjj!QOIKn;B-=@!GQRZH;q;DVDR85yN|5=;kG`&6SAh3yq@a$+ifG?f zfT5F~n&qB?U|t>Cxli(BqXhkdRVp-*QB|A&YKo0tO3z^}zK%@vEC(t#FYaRQfig`i z_gp{!GujbOrucpUK(T~qQ$whTz4oh~nJ8ifn~M$5fQAW(_3qMBuq0nSvS|9`RUZDG z9Wbx-tM~j^B5+uwRNyi@IU=Lh)g|(|tmWpipAT|qqT~e6Z_II-(Q36xpJrzB{Ze7t zaqdt;r^#j{sSUn`fwyJi=l~LaZQ6D;&KR*H%_VDc$VFU-ikm4hL)4Wc{k^8ObrVTX zVwMV-`@a2wz3;Toe0N(UPm+~P7wSl{>LK$&ibrHIKnWgbEu1YRd!i6a;C!(w|0Yje zh3IuNdlSdtZ%Y}g1L-2y3J73=d{e%TsZ;w?2WioaL(g{zh{!CdZV0f3K#LLO9lw4YF;=q3v9?a<+oi2rM73!z2KSQ!Hn*#-a+Yx~6HMbKC0GrnQA>|mH z2qdit?=tJGStcCi@m$_k?$!vUJcq4Ve}*ugJ>ecQMXEXyT~+PnQE+I-)jibAo`-I4 zpWcA0fmkGKH-}O_IsE~lf8Ou2l@%#-04zsJ#2?7pb0%ZkAKvMb0|6KraG9TqWEAl3 zl1@zmH`Jy-j1JAXzxpDmzW1SS?qHmT=;)tu# zOnJ5>e{V1#oVT&@tx|BXKc&GaL{j681xFnJGI;et`0TF*iorxl7#2r5m|3ul9$`zX z{eELd*dN@+$^22^X)fc;s@)g4%?G?1d+2ZEbId&U1g(8qkJdiuL(@%09mpvN`HR|L z#vI*#{^*x++;fh&u;6UhJfyYDxh*M*6>atczE6&ywZ+@7Yn zL%ZgXx%iB2?1rl7{BI5Om)}FK2}XxPQaY#_j1$G+|EkPu($(+ z-LFaRfG<2e0wGBfRQ#flK6o^?9+q8Hq>l~23na?Bmff%NASr2cOOd;7dlze^rfN7<4bK{N3mP$p%)zIm!JzE($UOY}v}7V# zp|=Km77-MtpQbvzso#sM3~HWrHn2cZ`WCIh!At{y4tf1Z*>Lw1!Ht#K+?&f-cv#t= za3(Y~bf#0QdjH|$w-yvV)bOtQ#~aRTYtVqqzYWB45-jyD5v&pS?&rd7la)CR@A*O* zHdc_Qv;X?-viYq3=34OdfRJD70Xs!#_^B~g&sYVJ3j4jUZOvG<4aoAV zN1LVx-4krFIXn(=6G(my%(KqoUj(T`uAkqSy1Kr2zL41GpfQ_AwMg9HpS;2_8~zxE z4vXx*Lk-8Az3liTE=^r3n_RTok5veo2|QfaVi(F{V0|lLQhAenym&e@TyS|aZ7|0m zxg(=5Fo@|OD8=!{jT>oXqd8(N;Xc-$ob(+jee!0JTnU@A zMt+T7vv0kZ1Lm44hCgd8(m}V^&O)t_{_qpZfC*YZ_jX)n(^^AiMefTM%z~EK-w-Hn z^xx2sIO0b*+Z4t@9a9C!GP_W|rUO>eTrisq&OSFO8UUv1%`AMqp>qFP*hbir`|@x) zRsp=+wM9UfD1Wu<{v%OwQk}ekp|4~k$Fo3w$ZJZpUiS5kE{^sJ9cV1oOJb`(e2DEw zu@E{_d>k?y*7gcah|)g62dWB72$+9#2TOA)T`Dyi4rr#{=%Ou_sZ5m{ImjWV8#Z1b z;oTocMrW5oKc8C&gj%rkYA||@{BL>UF&+HG@Su&N?vIv48b7MF*Ps_pW&Gq`UI-Ia5j|_=?k#y_T%Fnl!ik>-4)qMzegf8OGR=+SAK# z)iBA3_X9NvQ_zyj*sW&)C6`sEqL#>k7EX(>uq7W}jV$M6CS@mTyg~DZ>N%1iSx!qs zWek8U)1N)o2~)N7?0}|$FrYwkC$H}^tsl@m1}Hp;$@jpsn;08^M|#c5J1yQpmaKO6 zl|e>p>Q=}7mn|0jr>6W#cS<#AcM?uAq%Y9}&)a%NU0DCAF*SA>*Opj{jUHBCeJcpn zj({&k=s*7!lz3{rtH88}}I?CaiDAzlp}wsg89T?1%YtTg}fYPfVYy0FwECRK%@llI8F;m9fZZ{!V# zbv?AwcXs5fPa4yU417YGBaz(Y`X^IXVAV@1)Ump>pyaX<+6K27?p1tg#BSDlqPWoG z%W88;Zg!TZxmWQcL;8AQ>2$h3!@`h0>RdMCmrjerL$fdqq^Z_d(7=~<*z2dt@lZJv zF;)3KRYB@%GhCw<8(9Cb%Fb~hVCGdMsPmQj=)Rs}yoX6eK=^~vDpN6yD+bLGTcLRB z!uxc!P8;m(L9XDWYk+Pv`Yr1TyR!bQsqCHtY_-i3^eZqNu`Qexp`py5>fn%PyInV2O{n)*dt}O(SQj!tvU*vCvXB@vZ{di?m=`V zpzV=BAXZ;N<7>Kl_f*AW3NhUK2Zu7-VAC=%fEu0Y&w)PZb4c2K1f_LYI~1+qt`3`< zMZu2Guoz8u&Z1@;dgqd5O5s3g_2ni<0A?cho zEdfii>86@sZNp<%bq?KJbm0or2gAPJ;nI=~Hm~RfNDz6$0iAE8g*oa`u8ui0j=zl> z_ixBSFLXW|*J#ZyuMM1~aW{miUbrC?cs@6%?zHn82uZ5G84oRQ`__$;1^$@C8m$E` z+k$N|CsJ=lNzjcsw*CHouiX{_^X13uwI3xQ_e+>^AIOV&6?~{|2DHA{KBpANWJQnV z6u54;ftvO>-fQ_`{flsWFd&f*Hx6~PZyoVsq{Ro#RDf}9+^3low(ZKah}{kYPm#2t z2{G#O$UsrcMLAp7VR2l!^mt_luW*)7io{_!@|N|~b&iac`hHoeVOru!#>-vectEK2 zR{-;Mr>a;|h~w^9)yMc$|NF~RZ85`DKy#@Z<9?=2Do85!b{Wvbj_e=!{ZHlq%CK{` zBi^u25mk=gWIC$TeMt?olG49@sI7KlHD$o3Kd|AQXMcB;POMmRx&#e1)O~WRsLc&y zpJcbd#u=Qn9jW-upuGx&OZwJSeu-3{7F|R7Ua>8E;0Viq{eDkW5#i6Hc5`BJl!<;gG<%67wvQ>u7%2HV%p#bj^TkwMg zX;af(3{_^^Aq@LInu^a2WS8HsTsVzz7##BndKXl)iJs|GEDZ5g48jN~L*gQa?cUo_ zA9O1*5A6HPH~FUL<_WEoUkA?XeHYIXUc*blsdER}gYTdI7i}OTpwoZ%=gB#RAN1#( zx0D>Jg;cGRsI~3ofd(?lnzF@sj$i*Vq`tzFXNY2RP7#*}bbI z`d6zefS>SQnLALBPA!5CBq#80^jz>sZb?s*!HBwE=i9NuGOJek`W%wv-KUi<-)@wr zS?O&jMRb#dZi%U}uG;#hr{@8`dWc?jf{^#IXv+Qz`D*TGONJh4lsU!Zx|SvK!1sDY z#9I?uy|fR@jd9{B%gL+eGk@Nm*sA20S3Xtu?NcJEPS>L6T@qFB?y2xq?A(FU4rXf7 z3QVP^A2`-LsuOYpHZ|~^H3v4dPyyc}rnz_<;d2{DQR3 z9}kv&Q(}N~m~iS>h|TmEgNDn&I|TNd=FkJQ*cs`sydTBG0@y|ZZ%z#`lYq>gU?$HR zf~TB*?;Lq#EU0?@wYWcTG7zw)n8B0@=_vhoV~;k}X4IjPH5zAp`$(|JpF&r&CyWh* z5XlWfe$QueNX4kf@7NmQNxT=|1UyV|P9?(Wa*gtsQBwvom)y@N$6Y3H`E2zpnW{m~ z?(VjE$zXx)`tSqNvYDUhr_-)?dYZ~r&3ApR?=iz+g{acnM;<_q@mwZgEXQ)R&ZW~0 zDEbsD|4#j3piF9on5e!`FnMGBd$_km;~IGRlN=GEKoFYdUpK4@wJ+WLawWpZepSLh z_5y8uzY+s=LaqHgVwNfiw0@EOF?U5&CIjlR0sBFx4f2Bn(AhxH<_u89Ck}puew6)4 z6BNfr@iEKngRZDu5gAnl@^>^P`{pJVxipE8-ftq$+$4j0qfPkq=YTTk1ZnrgSfNXO z?J^mCTz0jo5pD$+T=e1+0+*Yz&}HPHyA3juu-Pj8WK{<^@^F7F%tDjkh}m}oi8aYCkb z;w#Z3^=9k0VGbQek2{-lgG9+49OFp~Xi;91BYSLDv^Vf79BV^--A1vX!-=Ra65pO!R-T+xT)1Jon! z%nJ)F2F)T%XviU287){~aiyLpja+MX7*6*mjGvIi9Cf)9uN1Y^P6{r#--)5!K%FHH0wwr{DskwXa@w(S}`clbP;Ua!%(x*i{O_}YaXt{H$6MzMLnOi^rSr9bE8?3 zy6l+mXt?$>!_0%Osi=%hYi(eYC0Ke25FNz$8<#1C(Jz;gCR2k(dkfHPW!{!=%5j+Z zdJsqoh1{#%i49UT68WjQxvhCark)T0h+jR%HxRYn9{tSolh;0thZ$(gK48$NB` zP>fYOpHz3VD#+YXsJ)KZLH$yX5V9D-Q%hi9+Iy+Tfk>bcfbDwuHD2%J@#Nh8{X=D= zKIp@#n?A;_npvYzyTEcg3z)-P8H?$zY@Lh_808JtQQs@1#PHuZ|I;zN3^o4Pcc4& zmOb2YV4G>>*9(d3s`y`nE?ZK%gv%AB zrz-y(=~lDE&+Rj7b$BCSEFibx7>%w5Jr5eX=+>0M2BgC^? zi}iXZNw;nQ-N~DD@*l09_*AQY&%;QWbjwt0({Am3QBehYVf_N|&{^#NoN`R(24 zKs%KLWlV89_&s9MHdmVUTAqzV43&C^r+hwjjPbE(EDD=2_o#Bb(9u&W{>?_cdtpLx zsi7|^eyB;g%YiaqGNeS+U7ze#L-GMp+znekLpDHXUs+vGV@y6iT$KK@+n*I`qK5h& zKcGl*MyH5AaZGu%B zOI90CkJ*gAY%Yy{39b_~&jQVakD6}qboN}#HPIc{ytP+ynEXW5x3E&xx1i1=H~@(T0d6N0S&CSho~UUm*HSOGK3-g7}nWgmIJ2Q?l(m(pJnQV#ZB z5LyfjFB*|5b1#l_u_{!T!xTm9SXV!v+*j|hb^GUj%aN>t95Ei%Ve0!CJuBC6mto=y zY&+jDEyriPOR=za;W(1&S8R5Rn`*I_DT4=H9X$Wd-g2Zxo$)ex5k!DYaXj@!Q8G-h z4}CRiKl7S&Cp*kNJr6Dm$H+yFb1GA7(Ix%E2s?0k|AHEX^5=r7TJ}nLiApD1d4={{ zV%A1di@UyZQYN}Sc)rNN;f#mF ztavW}L>v(|HYTKp=TDgytX@ed!7ANL$0-?&ia&mmSh-b$cwB$6gdk49Q;gE#ci^sa zx#@N-rn&5KRovr&#Xi1?CG7x_%Sb6_lr?~Hy?>0+#yrNdmkAQ}{i7Wu`6^7&FHe>rqT>ns%C6<)shb1k;~7^lylFd2q^`kCDj8}4t?GssYYslU z&|DUTC7-zLf`sIoox+|!uRUM2K|p3JcKLQIkR5e$B1qh`SIr+_O7E?2buCHPIoOY8 zu0r;lRA>AO1h`>vbx_uQ)p{rJC zaA>Qhd6*LGx*SxADK}X7Xo+r7UX==fe$`n-fR4XK!S) z{m^N&IlIwNRJJ$oh1^VN#H9`RrnVb=>w#zY33{;GvoK{F2Iq+VN4Jz`;cKXI_M|Fl zHlh9t?qTXTz{IXAzJSXB(f4_-!RF2WAnG93#{TY0<`zWm;hHa&H({E9N^r7Hf3;HM z;1T6Yh1EC73bfqcXQo&6YH>sJ<{H{%iyCM2<{JiX)B$sqj*JDNWXElQc0m}46H3g+ zc6$nl8h&Bl$ur?@w_1>D85PuM>Ga!+N8<6TX|yM$mVHVgDW_-kt2=l-dD&k0A}`@h zm#-<8TAFpA2kQ>%X)FM9uFdU;9`4$jgB8|hnuEF3gMQ}{Vp*=VQ(oPph87i91?$2t zc6z~1OZC{Z6ZNK;fo3s3jw*dsb&wIiGXJwf)cg7m6D46D>HUz@2Lj+O(Z2O)b#L^C zw7Dn=;`%swp96)(!JGOh<4!~6*?N-y@gs5IVF-KUky28WU1w-;!NrQHU^IJ-;6p?u zbtdN3w3*BW#YX&$e;+Y^WpcpZ5+<*NTea^CxVmB-O!0q26YW#HWURb(rq0gwPHBCj z37oq^9AU#j25ZttdH|7Hr(gBHJ`aBVmDrm};(Yh!9zhXAFEc<_CFa2#b!Xa5bz;k>@ll{Nd>cTGfIW^=RI zqX+UnlO1_n@03r+Kle#YF-E8P=r$Ehwa8MhIopga=(C#97cN$VRP1Xa@<9#{PhOdE z5DS~{z1Sq^1njRmBFwaDzZv>)e#b*}e_)S+?DvF?sXiNGd^w9U8zi!X0cVgJO_}3^ zh9EPSmY-;3ygcOGH`>YhRY+`Hnxo!I!rTFKt538+P&0Fq_Ea2p>(k!3E#FquYv%Yc z{f~PjbE^@voIzMG!tFgFO$>9S2&)C*PBI@|#tg$GlF>&CoKy+7fjcuEP`}h6X3Dq* zn1Sw_O8KSS#;KDO+6yh%fjM>Mx-_JeC6+S~U#phWb%73aqp)HOfMgzfqpvirxn9g} zw;po183_{9u$w0MaV4Q zBXfT>JD>WlCLy?B;TWO#`zrg-`n+P%4CT+tGrS`zpD;F`1|~;Y?eP;$ zUfra$+^S&79(NHfB~U|3m;XMq(9EwaW_}lmM}`sXh(H|1dXFSqU!$DT*0=#2Q_gCJ zOByvYY^-mr2x!Cj^ofrr%hz>o@^flr^xZwu)FP5`O|O3qFl-+$uJ@k@#6XxyZOI+o zYM@!u7nL&c!BM>E@S{hi7f^%aGMq2vuWM#&Z7MY_1!zqazvind`Lsu}@WDM)YnA2u zZ!~9b(|nc3_L~c@fdOFK2nUAzBobn3tbxY3FH4YW7b|c`OSV}2@p>m}iY%N$Wa#F| zJXVnHK#SjKOgSq`eCSs|SIc`Wj5cQTY={Fq5O$FfVKef5tLkGT zHllSayhnxdG>nw_o_uR=)6`z(tU#5~0)92GPtby|!KL-beq)+dyUVwnb}T1+Bnzh+ zRN|YbuEy9;th-}B`~GgKr>Xrz{C+cQ3u>>&%o1M`Hg)KE^IPni;1A3+Ar-X7@&s$9QdmKL}fE4e5fi5az%rh z(xvx}OvwD8tQsX)&|cW2V{`{3$L)3F=ZAvvju$89R$&4nWzOZd** z)x$V|gCb6pI6{$C!oV4Jho6qElwt;LBEGthm2qlURKoz8F}+nh<6My}(wwdDqeh2__%_HGB%TmQY?pyrQ~>r_4~|w3W}d|116FwJ0rFBV{31r{jEk@W~+AP zitM)E%a%Rs?aZEgMeB!v|HPo*@VifMFo#A)#G4TNktk**cYjlNXJh? zO2paHjvuKA|KPUqSYuAsEBMsX(~Wxpd6ga|l^#o=1R=d#uC7<#G#}m%*F~TYVptY> z2$&OqPXxubPpOb!P4DwpFQ`q?I0aPIrZsdBD|Wzict$N>W?{S!<33rInQLGh$-_2|u}H36Rmz2ye%hbC)MBxsri zpl{wt#Fo8)k9+=uF_N84<%7V%RMe|rv{RMd54VrZgERx0f&t^gqd;Um9qvj0Vo%@d zi>5I8bP!j3seK=2WQ=UCOsX?DEQftEwipfrk9( zmmG}Kq74K}6wCp|Lx)xut$aol38M+JnUAa0>QV*E-N>>59_0}B%ld~x)#<`?d#toM zF{sT>sMVJ6bvjfNav(3P?zV(-MXtXg_@oBPaLCBJ`*`BQs#7h4!=#}d#d^kk6w|5& z2#1NuH7n}(^UjxLR3*3L0ksQL$suKsLECC=^D5Xqte#Keb~CuJcVrdUs6Mr3TODVI znIoj!`j8F}wy*qUM&U;XK!kv)Pz~i{nPJ!X=(DHHY7Jp}so(H!s3Mk2wZsZNzTBWx zm>meyg5toA-LbZ0`x<8n7D(tpv5#w06(SMm3B}n@(yAY?zwyt3>I~j&hi+`mzD%Ba zfAeHn@AYkgtgjhr@oL+;8VEjA3{*hfb%_a<6ng#GhH_H4J?gSw&fe4V=l2v)kn$;f zVj0Wb0@)f2bt?RNNjJsRlnf^X=5*@q8)D#^!nN=~b3M(;-b~td1VgRDzAEa+G5;Dh zfon!E#l%tmmy~DAVLjxqul;c7!ltjwHSn!^%`LvWk2I!NUjnBnp=sxB4M~xWmho=0 zN_ooE2Hj?LS$o0MpKtAC>~evWa3e1lt8wk7n`+Hklg*cPpU-R?qX+VOfcnuxKy}VC zP@Qx4+}mI@@t}DsQEi%%Aqfd@)*_$Da7))~%D=lulDzHgMlZN;^akcMtigOBvyXvH z4i{TLnQY-|9a14UVN%8yDzXmjFyEYy$A@YY$7QI&Y6C6d&oKkOoD_xc4j$qTarW?+ ztLvZLJ-y};qW9Ye4-N(X>>{z<$kW2FhieZYQ!B*dJ^N+t1I96`_9Z2C0nf(y-M-W- zL$5x9dB~@n^1|(wkgtjnZV zT#jdt&aDrY|FZ{~F2Cve+Fo;bHlQA>t*oEMqT$5L)?asbOFqS|D0Azb%em>*n0cQ! zrY%B8BtI@ptd_Vf3hMAd-|)!|vA+#tN43)f6G5^-Q>byT$a+#ehw3q2eMR{_1vx+h z&CE?r^OL|aB*#B@b=%w7fuyxV=#VQ|Qs%A68zqvN*a!?Q7}Qf7!aj%ZTz$_RRc#-> z>fVuNn&{H%Ljhrind2=_$P^Xm-HAKARsWh-rHef&45y+zMAB($McsV!k&0w|3g27b z%f}5EfoC$V`G{ml9swLgpaJ6V?Ff`++dUq=?{9*0H*La52z)jSUz2NB;9-OMK3DZI z6fZ@XRO`VlN+$?>FI?$pn`zZ)M0;$u-T z=g3aD28-HS!TYxZvA3w$vK6s@CKI4d)X@)@X1=1sfB*oH+J)r$$ICtgB{q*WchI?e z^4F8}b&ha6SKsmUf8u@@j>_)riC_5&0i4DPQhOxjF9X4{-534F&33$W_k^=Y6^QX3 zXXZ%)3IXo|$JXkncXqLJ_9OLu0ZlFO4;h?DyW|bY1T42S-n7=>zWbTFhHQZH0Iv9z zU`75PV5vw8p4X8mJsy4EB!)HiO!$ogNnC7Vb<#9n`}r~j9>uT64&-%3{jeb+V$!e2 zk%cqdl$}s#fix|ErI_}I{O3mW)b1&8lYn>FG~5*10+pVn)`?I<(TYzGBXn;>Fq@wO z@X_)B@nyFUK*k^c!a3aT@qhPMmg>CAA;&P z_^^ZxH}x5%P5uk+QnfW?WHn9yP~3WGU6qIgk6tP=-&z@9Rwc!hqMLVH$Sk3JueM3A z=S~INwf|HME_TfE&(FrjsJ=a>biu@YJ*}f|&~j#*mT)5_pqRn3)xj4g$CM3cfFJ{c zUeP~}`=LQ!9SRz9jb-&mqqRF6>DQbZ7I47HJ9^YvE8k99Ks{CXh9d%P;b3>UVQSxP zx@^l>t(jyD3^aX?{8$Re(A+r1Z)lPAfiR4C#`pT~U{hn}u?F&8C`iQ=!F6q4 z;~nKRm5T!pcXB1e-g&Tlz+Cv>H;|1afZ8s=L;as*C6P@Wb@$uEKBaf#AHBc$t5`+s zw9;T1YV-7Q0X(4XUMYh>h1@GV~7nc4hhcHl!|R`Shoc15H2vX0cos z`zEgKo4r9*m%X(#%>mE*FRJXfIIEx7{t6~3AT@aWzeq=F*iOD}#o2vk5TLf|e^NqY z{D#|a>4^cV_{Os>?F6AuSmm>WLRbLF&BV69hQCpsMYPC@BNyQa44XNW*DL^wF*^m{WBs;@tD6(JJ6L{~=$>aH z_Y^F(q@6<8Vgg7fw04)G%6@et1<26&#LkMEK(XBRO#ol; z%s<^BzgD1nZ~GEJh1cwM!5RKd(d);J-^}^G^Sx4VIB6Kq)yTgCK*sNvXf^CN%Th@_ zCiyC-TJDGcZbRsSe|g`r-TQ<7Nt@Sq8#&JZ8V|I+=>N%^&gBKq<431j&CdulM;rvB za{I7Dbo@+^&-<-I(IO1T`U(ZAg#CE|-*nc_NzwOP1#YgEi_!}L4mSKFjf5}rv#Y@L z8k_hyKg>z|!dguQOsXJ)t+au8a5kXu{<_UwpJwY(l-g-IL`jTgE|&Kje##~-))Hqe zX*6zfUkWE-R4<5yBRv~?M{{qnU^h}asOWm+HT%G&gS>s6R63*l;J47x@Ye_6C8KAxrLj(6j{P@1H6c?%=ciHQ zTch3w^W-^4&lA$B=j8%!{(LNTHUqjk_XpE7#;460J8r#s67Nul?EIT0-n`W;h^W8crDx7tVDxLv+gA3s|BRoBvXKy1zu;-k+ zxU{rFi;nl68k1co9(G#mw`|xbqD1jYc!-Nmx8~yaMFOMGM z{=pLy`_0_5i&^x}SLuxQ*S?1uRif%%RVeH&Fg%=!)yMn2V1K$B>73P$6S+r~?t^p+p)Zy~dq`59e^W)}g+LRrn8Xcp-eU@V{wMZnsi zLl662rWoG}$u)a8c`*DMv(&|mz6sWJ2^&$exINGi2Kc68p|};dHOq3IcHWhbgM2zB-aOQ~D5*s(HazU2lWGE_1Jqj%M~m zXL4yfH-i@3VLQM7GM4i2+%Zn)=Zz}Pdc(=&DMT|=<+=4{+{$ZfA-RkKGAEo!i6y0q zgY=4(Av>b=pJe)(E$_m3uI^~s9N|eY`ht71FoE85;$$KK;OG>JT!|T+|3ec}B5jHG zhjg9CEsdy4%?WRI7`LC78y0$385TS*7I0=Ft~YawrXCYD4Hlc4VBUeJk`aTWX%$NY zv6oyYby2NatMt+&F+Hqq>$6u+H|X9&l2+;qPkJsb95t>)`lp%W0%T3PCuLMLL&|rE z)jKa26Ym#XdB1N*djwnj7SHEqgV9m!d9)mSo^1Qt-YjFy>5`2s%H!p51IPE{_uR+F zc>1a~{&4Njzdkbd0XuS8f>7$yRH6^@fjKDER{Q)0$&n^!seKHt+6^T?!K66c2 ztNYTc_lw2Z%N=>i?{gt3f_sSx2M=4Ug&p?2R#dj%sI7A^O()qiWD0$|e0s3jqO}9| z>RL;osU~R9e??Ud^MH4~|EjllOHiNxH*Q%xgrVU3;y~UQL=R#J`1jkw?N`fvKy&Eo z?Kk6v$_)bzGK_WiX5|6GPKxbg#}-N^&hJ%WzZP|F%(C%RI#yikbi#b)st;RPN-+A= zo{P}Nv8kiR!#;Yvi&4(MIjtk(dywDT$xv;>bN7itM<6fnf8Qzxy|C<3o+*@3pIAv- zj!^m|MYa4(DqdI0PSQt^*NHkJyKsuvco?#riqr5nufDtdvja0dc)6Y|6TfbxaeD6- zKJrjr5p+~*-_h-6eHCuMl&{v+{btXL8+NGJ7^sEYX4Gwq^8aDw_?NG`R82#_P>YkUyW#w zy@`Z(VaEr%3iLEXbF?|OWogFWm@%zD-V6s$1?Q z2Lhmw-L`x8e~mc1ByXt+Y3mhlduu5EF4UEO>BzQ=aqGABmvnwxr2?$;{2!Ly&i`S* zCU^ku*p5rm^v_)bZfDAv_%FukFW<-I_k<6?mfXHy{?`mgz;8UX{XgHYi66gx8Mc4g ze1E^ZwJu0#Z)O&bY^;Rl&hKS8naBCAyrR0{BCQtSEgpO zed&kVo^Ck>PpD9#4fObJL(m$(`$(iMP=EMK9Rij&4Sq>5(6+h)qhHY?Z*zFvw;B3&X2z_WGwB$`RhY|ZSqrZ*O0%Wi8Jnh4N~x>RKvKJ zlSbzbc!-qX{^Nn4#<|=e%t7&E&-}PB;Qs*QbjG3ot=C$Q8NX4XoSl1Uh5#n~JYV>= zSE{>2e%e$sd!e&T>TB1({{l4o_>X=3fBChZHJ}8fAqAU-NU zv69&9teq}QM!MbFXZG*J5Zs)V`IO~|(@&;>aCN;mJZ3=Si+?97z7`2*`nh8lnb@wT zOOXTG%}rU&pls){^zuaa>$G2i4Aq@hqCFpc4=Bp%Gx2F@u~RW|%!4EcdWgU+DHxeBP+3>+ z{ifcNSl9P2Pg&G34^Eclps9`S^G4>`MTtr#wHxg`Z{nQW&u7nnuo1J80+J`=v6++W z5lH9CF`hf=QBq|FGaEyzK_B$17WHzBw$`DE5N!u%*j&{Bl$=|zx%4yORkPkbpUP9q z^EKe)I0L>#75~a2UPNX|{@&8~kHjh>l^?QkKUDvMAGN=B9bGl|&9XVc(gt5K#FK~z zq5jb#TkZMP z@%|9&;9O7VfxME+1P+2tGW!Q6rgIP9^upXm!Wo?FIXB(ti4?1KUnP=d`!q>GVYwQ4 zIR|a8G%2EFY$^PVnZc*v z`QbNb!m-J2i=&oK9!IEA1qvBx;}(=yXVhK4t@-1|Y&H`pdfX*hua~3c9Vd)e)28g5 zb=GQ_n2t#XPI$5$K=%DH`)9b!v!TKXu-UCn4UGgO9}8RHRV<_6CY|2w;*4T3R7uEf z$61KM88br5bU9)fa@OLKJ4%Pa}-k6eRxbh%9%f@pVE7`-2D zRl>Wbm1Zjs(yVl8J5Ny*_(2L+lZie|V~eS#SB%(ShTl$LP>O*`Y}*>6)p4I$Gwq;z z_WXBfVo|zQ)9^aAI6;B?-O$3N4RkqwtoLjPFY)0Mdaz_ufYdm5yx*0n#mPKikM3w2 zjqj24QTn2ij?Ha?a@1j+fQXVp^Ut8f5MfBxg%N8J1;*-2Rd9UaFip3h#q`|6+VA@V z7{RSL1n8TmH2<_5Myq|WHQ{UJ>bYgs8?^Pq0SpZ)N)1VA--uR=32Sfdwf_mp=RPB_ zb}J_oZ6_&$fC~fdQ$+UUyv6r9vX&{lpg z)^ZflevAA~$t~|L9T;j{KxjGd-#3SE!`5$fbo!CuDqjuIDZIruL4~?jY3uVF%}hEv<;uObYvAew36@Ner@a zHB?u^Nwd-c>mR<*|4?F3PBM$1puF!|&EcGO2Y=*5cL`*9(_=;*as@LMneEh~J+wr> z>oEF6V0v!S_2+xC^A^e;^G5bDQM;@g$KUCQD2zf7wmjo*Bo{k$lz8(xQy(TvlSt)s zm7i3nE$^)El=V|X+5ig`ELf>c6XM;c3QG&_Gw3n|teJSa)iGtKe-ZY)3;gd{CzV=CMJnDJjOSuw%%`ska;D>G0{4Ml^!`wDL1!@AuBYzfqlQV05q2zzZ7{;sY8CVYmZ1`Z47V zklLFjMgG>T7UURS%4)N>EjJh~BN^xR%XNwZ=8QdE;J?paFmS1OI#9yBzN+xFN%l;YUwV*!+^fFdP;MiC;tND-n40V#rjkrDzr2si>psfJKRilIsf zJun&+r3Iyg011Ogq69)sA_T(w;>#gPGGJ1eWz#&jQ((X`EhvvOKP?7o-2$RG~aaVcnBc6)nvffzg5T_!j{NN9&`zvKe9 zT5a6rhzNgaTS-EH<>K}a?qU%I+XBYv z#d&&=Rc8T-+=&Z2!;Boq*$mC@dEqKI*!9lP`@q*qP|fW#hF49d?n8iGVFDmKD{9?w zDe9Mbzn$nOUaC)1S~7n5Xu}*m1{1OCg*(X6RD-C6T>z(cB+YpW{-w43V13|`DT*YP zntRRtHK^{P_b_-rD}1u9@8u?;V?f`AFZ*`v3Q1Q#Si^9Ku%#n`B@OZ!=O}3~+9TBI z6)35e0DhXpZopa8Md7dV^}}kfa6BSh7;i@AQ*7(xHx2fEU1a2JJVweuMM>1!-#zuJ zk?Gn|xp>2m*cib&$><3=Njfz$5;N{SXGok{5#QKFaoxY8U}k9`AoYUx+>26A-Lob| zf6mx#4(l2ONU@Q&{pGf$N`Pm^EzH|!p;s-=k=Cqw=d@4MUPb=t)(Uo6m3e!|F}##!_dcZP3Q92PRjM1@>HCa??$XP=qHOxQT0YXQbXy=+DAJCLYYO zDc<*0Ak-Ln*~qid|tvE~a= zb7rMvIeQVQ*~&M2B1Lt5WGBZ%yO`;illdBpR~tBJ+W(#$B4y7ygAh+?L)&7zxC zko0awwUM-bzLtA*kNDyOeItD}sCy)uzZ8pl9{&5|zTiI-{6dS)6T*VLS#sgY_?0cs zbOz?5u_w1+M-#@CH`d2DZi-m*fF>=8F&kJyC9saz!vIF$m6ULIEEYRkGaj{+?8d8N z&%LnzBNmDHo`A{sIAyA-@-qa?&b3RHvYDmf$P(GPF%ybty6Yba#9?DE0K zG%x4vj$*@q^|66C?O*)v|9>*{W^8ar?oqi%(;p8b<%2S|A-m9c9gpQ`;dW+;B8j7}h0hl3IKKFR;{^2`!J;HzUq1???hPFU!UBjF z;5=tPR<~34e~X^Fu0mC^!(V=z#a#M$Gv%AkaRb`1>gwX>7I%)S7L^~pe#PI@5Jk+G z#kUG$KD*%D9oLp_Vbx&*=K3C~B^jt=Z4gs3UWw*Pk7QT!PUI z{jd0*+fT|lRH$K09|ZS67$y2xrC@sJvh-2znQ^I~cg)F3RlRXfN zTHf#aAg3>_5%61c2_4N&><>te(i2b_?5VI;LJ#c-edo$+(Nd+D$7xj6j{8Hpm8&gj zL0gYp?qc=f`rM=!atBr-blN2G$5c|~wmPu)2G8Q(uS9P#0q84#&rHNg+u)^iZ0S8x zs)Q(}jv-o?vp5ja_Ht>eF?dgGL3-!jY3E9W)*;zQU zP)5yvaf$AKlB^JeGqhcOmNZ?~)ws>Umg$(;b+N1TiYA0yaTy64GJQf-HFeD^>1>KU zEaSaekJ0>$+vZ?JkyCYgml3P)mCp{Xwxea~oN<2})d)3oq+!jP;x0%ymZ$qr$5SN? zZg4)KzvWhCI=z>5nH;U3E{xMEKjxgNuG*E|)WDcA^1#oOhJ>BTPLrDo{XEhKFI}kd z&V%RdiDJ$)1*Oz*Io@Y{Zo)%Y)F$1bP8MNNwVeex@u!^ga*zjw=BHdAqC+x{_Ks8F^eaEDziaMTtZr z;cerQEW&tP;8i`xNK6OUE5f_V(!sT@i>*aL#KW!Xo=0oeww`RA!-JYH9Dxm89DIc+ z;A-~c$&=A2^(qM?1f3m8$|6v|H5V8|bGmuLLQ+Wp{0xBL=g!`c30^P$ky-=45_XWQ z$_QSfcRk%iTb$DJu54U0kczenk}~paO_KRMN)`)>>OOH??{K0#NqufZWMr8#;+X7hKb+xnv}hYZW3`wF!~;(9~h2>4b(vN(#DjQ5*lDhLf7Vh zv8?fAi%FGhK1ei$e6lysGuCORiMfQGIL=gRWQ_R8VaJdQP(x^^%G$jQr_4dEl~+%+ z0-S%nT@O}%BKPYPPS+YMtosQZQ_=KoOYvSpFU0&?y)U%_fe+*y0H=s-WogX?vNKBLBcj?yVC#;jd2f$FlnGthJsoc;j*v0Q$zj0nza^tZ%9?)n4S;UpwlanJuJH#Rbf~LS5tZNe$LT= zu-Jn16D_3&)v-nqt-QL3)NaZ90qERDjo#2tRWVP7NQmMJq%r;x92HuHxB@G)8*RFu zdoh&4H=4OJ=axw;qgXY388qM#oF)!2-d5JJdRp;XwlNBN{t04wcsyyMS3{Tj&nzH z-FbYLi)t!71{tVhfjyR*B1VQ*@#MCbwlLu+TSHTN&~hay%<{!t*FlEt5Wn{n(B4Gl zM;_J&DADf+s|NcthnxEM&hJY*qH)>v^KM_P|%ua?7CXmIQIpInAo^#`sN18dMIsI;YNYQGH{ zyq3&+5zKmON908?$1>M(-SXQ2uKX_r@y&tvngf6u1!`+hMN&;B{-TrJkY#Xv&sZ8Q z?BO1$C1~)C&(<`}ms?`x zg1!;A`Q-F7d&b%lgC&VvkKu=eSJm(2_xI>CVqZ;qNtXUXE+9~K8qCts`Jii2+$x}t zI7^*tj!t?gHL|S{wBc>g*8fVn!Lj_-77=@OlIJzbG3M0+5m(37?YU4i>4{8DBhdm2?VM zqB~0co?a=v>pB8j5s!{l@k3Jezy%l9!!>zC%>d%W`7D>y1dUUfsS7pry!-oVU{~!V z6xBu8dAo-L+uZ69X5SKShN3*zhk4;Mw#_Y>{kHJnc%#wzh{$)R5jUEEm0b)}+I?W~ zPEf{8E!E38HBw=vz3K~)YbtUUhnUVpyTmaYk=4l`$+ zhUl0VQEHOqBZa5;?)t+9lyNli?b2>+=A3iNEE>KH&7VrC@n~|<#nJe4h?}Iqf%Q|U zePd9rK=%a*#_VK{@~5oB+)YC5=|6A-0X8gOXT@;*7{j+>ap-aSrU)&?8JoAFHz2U! zbKqyL@o$(1B~qVlmfC0vWv#gXygjS_#3517K((c(b`@uD2A3uJei) zYt|;>x1OuzebyUyyG%niH)qD=DM^&h6!g8;d;qsnV8GfmFq#2{+~B7$B=az${0x{i z3#DT=-bG18k^CqXpr(h^g6(s`WPj@i<(kQb)4K=Ov3fNV`Bj0N(DeKrx!MD5?%&QM#HC1%mwzJ5>tCGDnxWa{WxSC|sT}gDOEj2E z>yL%xv6mk|wQU1$fXZem$*i-3&BF?hcvS==E=Jx#sBi3VAWfW{jo!WYp>61+IG;xu zp<{44o$Lj5RRgoE$dWxmQ@{xzplh{;_48p`V-iH2FUQk6;u~IN)(}r_xH(UFjsTsA z^oOW82(0t(o)2f+C2#kpF(dGPO||6KjNeY(!E*;aBy!{(+-LQBt?a>XUT}O6O{t>akFu~b($sS{T`@m| zo{zNxmGl~3LR8EW3sHG&G@(ay=WImDT3$b+hl3>XXCk?}Adz%J%QjaBQi+yd)=gVF6{t2fuvQ1|3B(wJIrD`2+>XY=|%;4Cu z$(#s666WjBA!6e%p_Y1Vu`28Fva=}H4h*ZCw-0M=auu+Vzg?a%W&_jrnQ_ z$XOH7dvrl^l&*q4;;)k3^c5wslN&G{CcE&A5;D7tuOXI=PCTDEmN$v9@5nFce8v9y z`)^3w9B13(2`!<~wKnl937fiIOKw%~xqNtuUDV8f4#jfQZGXLKSH!i90Wv&_Cyn;K z_G(M`iF?QtC?BTFMUr+Nx0qPO3p)&*N*d(Rp+wdo>|W&8zC``o7_L3O(ZaNdMP<9P@n1DROMu2(vHW#lfKCraQi{6ptPcmXlX4Y95UyY4{3VX9B4N;#K zkB&rnMvePN+&PsrFm62!of$ofW6ej$O!!xk)+K};ej>{>=uRM{TE~U%Hof}+>h6s) z**1I_$~wJOuGNwe3+XW*aDaI6mCY#&@iOvzI}`oH52d8rd2`Ne-7Ni;Cn0ph@ox*s zR)@QO*$0O1NUCg9-?TJmjO#Tx4Ox7-0>C97!jG4g)$T75pvD^;W`6w zeZDk54le;NT{5Cw9#{4$?Ib~3MKQMEdurmr*D#bS-od`=I#E}_*-t)WdcER?SmRsdSNdsiUnJ0jr8Z2c~f7u@ORp9O;D|J)kT(7&M&ClTyi8()4L zge08VE+lj-$eY(KtUrF?<{jXyulZw@5)LHIHdKPOv4#X-k1-6z2zReH%odXa=-%*Q z*_OcsV&-HQ$+!cRcNH}!Ij$iA6w*UfU+altx(;y;1 z!wF@pQ3B&0(%4FHx+@MfpOPSFfjz9 vOkjV(xcq$z0w2nE3nmIMod0)kv>}wVSh}FF|BA2R&&@Abov%E1?U(-oJ(5Vu diff --git a/docs/usage/assets/manual_expectation_validation_atomic_testing.png b/docs/usage/assets/manual_expectation_validation_atomic_testing.png deleted file mode 100644 index d252be218c02123537421518665ece99e6061ba7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10235 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 oX2-zzAAyo&W#< diff --git a/docs/usage/expectations.md b/docs/usage/expectations.md index 48e78dcf..bd41be69 100644 --- a/docs/usage/expectations.md +++ b/docs/usage/expectations.md @@ -1,149 +1,43 @@ -# Expectations -Expectations define what is expected from an [Asset (endpoint)](assets.md) or -a [Players](people.md#players) when facing an [Inject](inject-overview.md) in terms of -security posture. Each expectation has a score representing how well it has been met by the target. -## Expectation types +#### Why use it? -Expectations can be categorized as either Manual or Automatic, depending on how they are validated. +Use this mode when **every member must succeed**, such as: -### Manual expectations +* mandatory training +* compliance requirements +* baseline security checks -Manual expectations require validation by the **exercise organizer** (animation team). -They are simple, customizable, and **user-controlled**. +#### How does it work? -Examples: +* All targets succeed → **100** +* At least one target fails → **0** -- **Team response validation** - Check whether the **incident response team** correctly acknowledges and escalates a phishing inject during the exercise. +#### Example -- **Player task validation** - Ensure that an **analyst player** correctly follows the playbook and reports an incident in the ticketing system. +Group of 4 players: -### Automatic expectations +* 3 succeed, 1 fails → **0 (Failed)** +* 4 succeed → **100 (Success)** -Automatic expectations are validated automatically under specific conditions. +### At least one target must validate -- `Prevention`: automatically validated by security integrations (e.g., quarantine event). -- `Detection`: automatically validated by security integrations (e.g., incident alert). -- `Vulnerability`: automatically validated based on the presence of CVEs. -- `Expect targets to read the article(s)`: automatically validated once targets have read the injected article. +#### Why use it? -## Validation Mode +Use this mode when **a single successful response is enough**, such as: -There are two modes for validating an expectation : +* SOC detection +* on-call escalation +* redundancy testing -### All targets (per group) must validate the expectation +#### How does it work? -- The result depends on **every member's performance**. -- If one target fails, the entire group fails. -- Final score = **100** if all succeed, otherwise **0**. +* ≥ 1 success → **100** +* No success → **0** -Example: 3 players succeed, 1 fails → Group score = **0 (Failed)**. -Example: 4 players succeed → Group score = **100 (Success)**. +#### Example -### At least one target (per group) must validate the expectation +Group of 4 players: -- Success depends on **at least one target succeeding**. -- The group is considered successful if one target validates. -- Final score = **100** if ≥1 succeeds, otherwise **0**. - -Example: 3 players fail, 1 succeeds → Group score = **100 (Success)**. -Example: 4 players fail → Group score = **0 (Failed)**. - -![Validation mode](assets/validation_mode.png) - -## Expectation manipulation - -### Add an expectation to an Inject - -1. Navigate to the inject's content and click **Add expectations**. -2. Select the type of expectation you want to add. -3. Define its score and validation mode. - -You can add multiple expectations to a single inject. - -![Add expectations to an inject](assets/inject_expectations_list.png) - -### Validate a manual expectation - -- During a simulation, go to the **Animation tab → Validation screen** to manually validate expectations. - -![Validate a manual expectation from the animation tab](assets/manual_expectation_validation_animation_tab.png) - -- For atomic testing with manual injects, validation can be done directly in the **Overview tab**. - -![Add the validation of a manual expectation in atomic testing](assets/add_manual_validation_atomic_testing.png) - -![Add the validation of a manual expectation in atomic testing](assets/manual_expectation_validation_atomic_testing.png) - -### Validate technical injects - -- Users can manually add detection/prevention results for their custom security platforms. -- Automatic validation will also occur when connected to compatible collectors. - -![Add the validation of a technical expectation in atomic testing](assets/add_technical_expectation_validation.png) - -![Add the validation of a technical expectation in atomic testing](assets/technical_expectation_validation.png) - -### Update Rules - -Expectation statuses propagate between entities as follows: - -| Action | Behavior | -|--------------------|------------------------------------------------------------------------| -| Update Agent | Update its status (0 = fail, 100 = success). | -| Update Asset | Asset becomes **valid (100)** only if **all its agents are valid**. | -| Update Asset Group | Compute status depending on validation mode: | -| | - **All assets must validate** → 100 only if all assets succeed. | -| | - **At least one asset must validate** → 100 if at least one succeeds. | -| Update Player | Compute status for the team depending on validation mode. | -| Update Team | Propagate status to players. | - -### Customize expectations - -#### Default score - -Each expectation has a **default score value** at creation, configurable via environment variables: - -| Parameter | Environment variable | Default value | Description | -|:-----------------------------------------------|:-----------------------------------------------|:--------------|:-------------------------------------------| -| openaev.expectation.manual.default-score-value | OPENAEV_EXPECTATION_MANUAL_DEFAULT-SCORE-VALUE | 50 | Default score value for manual expectation | - -#### Expiration time - -Expectations must be validated within a time limit. Defaults are set in the system but can be overridden: - -- Manual Response: By default if not manual expectations are set the expiration will done after 24 hours -- Detection/Prevention: By default if no expectations are set the expiration will done after 6 hour - -| Parameter | Environment variable | Default value | Description | -|:-----------------------------------------------|:-----------------------------------------------|:--------------|:--------------------------------------------------------------------| -| openaev.expectation.technical.expiration-time | OPENAEV_EXPECTATION_TECHNICAL_EXPIRATION-TIME | 21600 | Expiration time for Technical expectation (detection & prevention) | -| openaev.expectation.detection.expiration-time | OPENAEV_EXPECTATION_DETECTION_EXPIRATION-TIME | 21600 | Expiration time for detection expectation | -| openaev.expectation.prevention.expiration-time | OPENAEV_EXPECTATION_PREVENTION_EXPIRATION-TIME | 21600 | Expiration time for prevention expectation | -| openaev.expectation.human.expiration-time | OPENAEV_EXPECTATION_HUMAN_EXPIRATION-TIME | 86400 | Expiration time for human expectation (manual, challenge & article) | -| openaev.expectation.challenge.expiration-time | OPENAEV_EXPECTATION_CHALLENGE_EXPIRATION-TIME | 86400 | Expiration time for challenge expectation | -| openaev.expectation.article.expiration-time | OPENAEV_EXPECTATION_ARTICLE_EXPIRATION-TIME | 86400 | Expiration time for article expectation | -| openaev.expectation.manual.expiration-time | OPENAEV_EXPECTATION_MANUAL_EXPIRATION-TIME | 86400 | Expiration time for manual expectation | - -A default expiration time is set for technical and human expectations. Users can override them for each type of -expectations. - -- In the UI - -![Customize expiration time in UI](assets/expectation_customize_expiration_time.png) - -When creating an expectation, users can set an expiration time. The system's default times are set on the form and users -decide to override it. - -Once the expiration time will be reached, the Expectation Expiration Manager will fail the expectation and will show the -result as `Not Detected` or `Not Prevented` depending on the expectation's type. - -## When is a Simulation Finished? - -A simulation is considered **finished** once all defined expectations are resolved: - -- **Technical expectations** → validated through **Detection, Prevention, Vulnerability checks**. -- **Human expectations** → validated manually by the organizer. +* 1 succeeds, 3 fail → **100 (Success)** +* 4 fail → **0 (Failed)** \ No newline at end of file diff --git a/docs/usage/assets/add_technical_expectation_validation.png b/docs/usage/expectations/assets/add_technical_expectation_validation.png similarity index 100% rename from docs/usage/assets/add_technical_expectation_validation.png rename to docs/usage/expectations/assets/add_technical_expectation_validation.png diff --git a/docs/usage/assets/expectation_customize_expiration_time.png b/docs/usage/expectations/assets/create_manual_expectation.png similarity index 100% rename from docs/usage/assets/expectation_customize_expiration_time.png rename to docs/usage/expectations/assets/create_manual_expectation.png diff --git a/docs/usage/assets/inject_expectations_list.png b/docs/usage/expectations/assets/inject_expectations_list.png similarity index 100% rename from docs/usage/assets/inject_expectations_list.png rename to docs/usage/expectations/assets/inject_expectations_list.png diff --git a/docs/usage/assets/manual_expectation_validation_animation_tab.png b/docs/usage/expectations/assets/manual_expectation_validation_animation_tab.png similarity index 100% rename from docs/usage/assets/manual_expectation_validation_animation_tab.png rename to docs/usage/expectations/assets/manual_expectation_validation_animation_tab.png diff --git a/docs/usage/assets/validation_mode.png b/docs/usage/expectations/assets/validation_mode.png similarity index 100% rename from docs/usage/assets/validation_mode.png rename to docs/usage/expectations/assets/validation_mode.png diff --git a/docs/usage/expectations/management.md b/docs/usage/expectations/management.md new file mode 100644 index 00000000..23f330b1 --- /dev/null +++ b/docs/usage/expectations/management.md @@ -0,0 +1,81 @@ +## Expectations — Scoring, Expiration & UI + +This page explains how to **configure, validate and operate expectations**. + +## Add an Expectation to an Inject + +1. Open the Inject +2. Click **Add expectations** +3. Select the expectation type +4. Configure: score, validation mode, expiration time (optional) + +💡 You can attach **multiple expectations** to a single Inject. + +![Create manual expectation](assets/create_manual_expectation.png) + +## Validate Expectations + +### Manual expectations + +* During a simulation: **Animation → Validation** +* During atomic testing: **Overview** tab + +![Validate a manual expectation from the animation tab](assets/manual_expectation_validation_animation_tab.png) + +### Technical expectations + +* Automatically validated via collectors +* Or validated manually by adding detection or prevention results + +![Add the validation of a technical expectation in atomic testing](assets/add_technical_expectation_validation.png) + +## Scoring + +### Default score + +Each expectation type has a **default score**, applied at creation. + +| Type | Default score | +| ------ | ------------- | +| Manual | 50 | + +Configured via environment variables. + +| Parameter | Environment variable | Default value | Description | +|:-----------------------------------------------|:-----------------------------------------------|:--------------|:-------------------------------------------| +| openaev.expectation.manual.default-score-value | OPENAEV_EXPECTATION_MANUAL_DEFAULT-SCORE-VALUE | 50 | Default score value for manual expectation | + +## Expiration Time + +Expectations must validate **within a defined time window**. + +If the time expires: + +* the expectation **fails automatically** +* the result is marked as: + + * `Not Detected` + * `Not Prevented` + * or equivalent + +### Default expiration values + +| Expectation type | Default | +| ---------------------------------- | -------- | +| Detection / Prevention | 6 hours | +| Human (manual, article, challenge) | 24 hours | + +You can override expiration times: + +* globally (environment variables) +* per expectation (UI) + +| Parameter | Environment variable | Default value | Description | +|:-----------------------------------------------|:-----------------------------------------------|:--------------|:--------------------------------------------------------------------| +| openaev.expectation.technical.expiration-time | OPENAEV_EXPECTATION_TECHNICAL_EXPIRATION-TIME | 21600 | Expiration time for Technical expectation (detection & prevention) | +| openaev.expectation.detection.expiration-time | OPENAEV_EXPECTATION_DETECTION_EXPIRATION-TIME | 21600 | Expiration time for detection expectation | +| openaev.expectation.prevention.expiration-time | OPENAEV_EXPECTATION_PREVENTION_EXPIRATION-TIME | 21600 | Expiration time for prevention expectation | +| openaev.expectation.human.expiration-time | OPENAEV_EXPECTATION_HUMAN_EXPIRATION-TIME | 86400 | Expiration time for human expectation (manual, challenge & article) | +| openaev.expectation.challenge.expiration-time | OPENAEV_EXPECTATION_CHALLENGE_EXPIRATION-TIME | 86400 | Expiration time for challenge expectation | +| openaev.expectation.article.expiration-time | OPENAEV_EXPECTATION_ARTICLE_EXPIRATION-TIME | 86400 | Expiration time for article expectation | +| openaev.expectation.manual.expiration-time | OPENAEV_EXPECTATION_MANUAL_EXPIRATION-TIME | 86400 | Expiration time for manual expectation | diff --git a/docs/usage/expectations/overview.md b/docs/usage/expectations/overview.md new file mode 100644 index 00000000..91e67b8f --- /dev/null +++ b/docs/usage/expectations/overview.md @@ -0,0 +1,103 @@ +# Expectations + +This page explains how Expectations work in OpenAEV: what they are, why they matter, how to configure them, and how they +impact the outcome of a simulation. + +Expectations define what success means when an Inject targets an [Asset (endpoint)](../assets.md) or +a [Player](../people.md#players) during an [Inject](../inject-overview.md) execution. + +## What are Expectations? + +### What is this? + +An **Expectation** defines a **measurable outcome** for an Inject. +It answers the question: + +> *What should happen for this Inject to be considered successful?* + +Each expectation: + +* is attached to an Inject +* has a **score** +* has a **validation mode** +* is validated either **manually** or **automatically** +* contributes to the **simulation result** + +### Why use Expectations? + +Expectations allow you to: + +* Objectively measure **security posture** +* Evaluate both **technical controls** and **human behavior** +* Standardize scoring across exercises +* Decide when a **simulation is complete** + +## Expectation Types (Overview) + +Expectations fall into **two categories**, depending on how validation occurs. + +### Manual Expectations (Human validation) + +Manual expectations are validated by an **organizer**. +They are used to evaluate **human actions** such as decision-making or escalation. + +Typical use cases: + +* tabletop exercises +* incident response drills +* awareness and training scenarios + +### Automatic Expectations (Technical validation) + +Automatic expectations are validated by **technical signals**. + +They rely on: + +* connected security tools +* or manually provided technical results + +They are essential for **technical simulations** and **Breach & Attack Simulation** use cases. + +## Validation Modes (Overview) + +A **Validation Mode** defines how individual target results aggregate at **group level**. + +Each expectation uses **exactly one** validation mode. + +### All targets must validate + +* All targets succeed → **100** +* At least one target fails → **0** + +Typical use cases: + +* compliance checks +* mandatory training +* baseline security requirements + +### At least one target must validate + +* ≥ 1 success → **100** +* No success → **0** + +Typical use cases: + +* SOC detection +* escalation workflows +* redundancy testing + +![Validation mode](assets/validation_mode.png) + +## When is a Simulation Finished? + +A simulation is considered **finished** once **all expectations are resolved**: + +* Technical expectations → detection, prevention, vulnerability +* Human expectations → manual validation + +Until then, the simulation remains **in progress**. + +## Go further + +* [Validation, aggregation & propagation](validation.md) +* [Scoring, expiration & UI](management.md) \ No newline at end of file diff --git a/docs/usage/expectations/validation.md b/docs/usage/expectations/validation.md new file mode 100644 index 00000000..825294d8 --- /dev/null +++ b/docs/usage/expectations/validation.md @@ -0,0 +1,189 @@ +## Expectations — Validation, Aggregation & Propagation + +This page explains **how OpenAEV computes expectation results**, from individual signals to organizational outcomes. + +## Manual Expectations (Detailed) + +A **Manual Expectation** requires validation by the **organizer**. + +OpenAEV does not infer the result — a human explicitly decides whether the expectation is met. + +### When should I use it? + +Use manual expectations to evaluate **human-driven actions** that cannot be detected technically: + +- decision-making +- communication +- process adherence + +### How does it work? + +1. Add a **Manual Expectation** to an Inject. + ![Create manual expectation](assets/create_manual_expectation.png) +2. Define: score, validation mode, expiration time +3. During the simulation, manually validate the expectation from the UI. + ![Validate a manual expectation from the animation tab](assets/manual_expectation_validation_animation_tab.png) + +### Example + +You simulate a phishing campaign. + +Expectation: + +> *The Incident Response team acknowledges and escalates the phishing email.* + +- The SOC receives the inject +- The analyst follows the playbook and opens a ticket +- The organizer validates the expectation + +✅ Result: **Success (100)** + +## Automatic Expectations (Detailed) + +An **Automatic Expectation** is validated when a **technical condition** is met. + +Validation relies on: + +- connected security integrations +- or manually provided technical results + +### Why use it? + +Automatic expectations allow you to: + +- Measure **real security controls** +- Avoid subjective validation +- Scale exercises across many Assets and Agents + +They are essential for **technical simulations** and **Breach & Attack Simulation** use cases. + +### Available automatic expectation types + +| Type | What it validates | +|---------------|-----------------------------------------| +| Prevention | A control blocks the attack | +| Detection | A security alert or incident is raised | +| Vulnerability | A CVE is present on the target | +| Article | Targets read or acknowledge the article | + +![Add expectations to an inject](assets/inject_expectations_list.png) + +### Example + +You launch a malware simulation. + +Expectation: + +> *Endpoint protection detects the payload.* + +- The EDR raises an alert +- OpenAEV receives the detection event + +✅ Result: **Success (100)** + +## Validation Modes (Detailed) + +A **Validation Mode** defines how individual target results are **aggregated at group level**. + +Each expectation uses **exactly one** validation mode. + +### All targets must validate + +#### When should I use it? + +Use this mode when **every member must succeed**, such as: + +- mandatory training +- compliance requirements +- baseline security checks + +#### How does it work? + +- All targets succeed → **100** +- At least one target fails → **0** + +#### Example + +Group of 4 players: + +- 3 succeed, 1 fails → **0 (Failed)** +- 4 succeed → **100 (Success)** + +### At least one target must validate + +#### When should I use it? + +Use this mode when **a single successful response is enough**, such as: + +- SOC detection +- on-call escalation +- redundancy testing + +#### How does it work? + +- ≥ 1 success → **100** +- No success → **0** + +#### Example + +Group of 4 players: + +- 1 succeeds, 3 fail → **100 (Success)** +- 4 fail → **0 (Failed)** + +## Result Aggregation per Expectation + +### What is this? + +A single **Expectation** can receive **multiple validation results** for the same Inject. + +This happens when: + +- several security tools monitor the same Asset +- multiple collectors report results +- results are added both manually and automatically + +![Add the validation of a technical expectation in atomic testing](assets/add_technical_expectation_validation.png) + +### Why does OpenAEV work this way? + +OpenAEV evaluates **effective protection**, not individual tool accuracy. + +If at least one control detects or prevents the attack, the organization **did not fully fail**. + +This avoids: + +- false negatives caused by tool overlap +- penalizing layered defense strategies + +### How is the final result computed? + +1. All results are collected +2. Results are ordered by **severity** +3. The **highest result always wins** + +⚠️ A negative result never overrides a positive one. + +### Example + +| Tool | Result | +|--------------------|--------------| +| Microsoft Defender | Detected | +| CrowdStrike | Not Detected | + +Final expectation result: +✅ **Detected** + +## Status Propagation + +Expectation results propagate from **technical entities** to **organizational entities**. + +| Entity | Rule | +|-------------|--------------------------------------| +| Agent | Direct result (0 or 100) | +| Asset | Valid only if **all Agents succeed** | +| Asset Group | Depends on validation mode | +| Player | Depends on validation mode | +| Team | Aggregated from Players | + +⚠️ Validation mode always applies at **group level**. \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml index 16a2d8f9..203b62cc 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -152,7 +152,10 @@ nav: - Search and Filter: usage/inject-result-list.md - Inject result: usage/inject-result.md - Targets: usage/targets.md - - Expectations: usage/expectations.md + - Expectations: + - Overview: usage/expectations/overview.md + - Validation: usage/expectations/validation.md + - Management: usage/expectations/management.md - Findings: usage/findings.md - Dashboards: - Custom Dashboards: usage/dashboards/custom-dashboards/custom-dashboards.md From 533c678f8c8b5eed668e9c159b60d7ebf95e0931 Mon Sep 17 00:00:00 2001 From: RomualdLemesle Date: Wed, 28 Jan 2026 14:53:26 +0100 Subject: [PATCH 2/2] [docs] chore(workflows): Check MkDocs URIs --- docs/usage/expectations/overview.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/usage/expectations/overview.md b/docs/usage/expectations/overview.md index 91e67b8f..d1b0c1d1 100644 --- a/docs/usage/expectations/overview.md +++ b/docs/usage/expectations/overview.md @@ -41,6 +41,9 @@ Expectations fall into **two categories**, depending on how validation occurs. Manual expectations are validated by an **organizer**. They are used to evaluate **human actions** such as decision-making or escalation. +⚠️ These expectations can only be used in the context of human-based injects, such as email or SMS, where a real person +is expected to read, interpret, and react to inject. + Typical use cases: * tabletop exercises @@ -56,6 +59,9 @@ They rely on: * connected security tools * or manually provided technical results +⚠️ These expectations can only be used in the context of technical injects, where system or security signals are +produced automatically (for example: logs, alerts, detections, or telemetry). + They are essential for **technical simulations** and **Breach & Attack Simulation** use cases. ## Validation Modes (Overview)