From d75890a3f1d6ccbe33fca0498cecbfb5edd9a8c7 Mon Sep 17 00:00:00 2001 From: Kway Yi Shen Date: Wed, 22 May 2024 09:17:44 -0600 Subject: [PATCH] Adding logic for creating and managing DAG invocations Signed-off-by: Kway Yi Shen --- .github/configs/wordlist.txt | 1 + cmd/config.json | 3 +- cmd/loader.go | 28 ++- data/traces/example/dag_structure.xlsx | Bin 0 -> 127352 bytes docs/configuration.md | 3 +- go.mod | 6 + go.sum | 13 + pkg/common/trace_types.go | 7 + pkg/config/parser.go | 7 +- pkg/driver/trace_driver.go | 336 ++++++++++++++++++++++--- pkg/driver/trace_driver_test.go | 25 +- 11 files changed, 376 insertions(+), 53 deletions(-) create mode 100644 data/traces/example/dag_structure.xlsx diff --git a/.github/configs/wordlist.txt b/.github/configs/wordlist.txt index c24bc022f..f0cbc79a3 100644 --- a/.github/configs/wordlist.txt +++ b/.github/configs/wordlist.txt @@ -151,6 +151,7 @@ Ctrl currencyservice Daglis DAGMode +DAGTracePath datacenter Datacenter dataflows diff --git a/cmd/config.json b/cmd/config.json index 3fbfa0f83..85de66dd7 100644 --- a/cmd/config.json +++ b/cmd/config.json @@ -21,5 +21,6 @@ "GRPCConnectionTimeoutSeconds": 15, "GRPCFunctionTimeoutSeconds": 900, - "DAGMode": false + "DAGMode": false, + "DAGTracePath": "data/traces/sampled_150/20" } \ No newline at end of file diff --git a/cmd/loader.go b/cmd/loader.go index 3c062762e..4821c5e02 100644 --- a/cmd/loader.go +++ b/cmd/loader.go @@ -27,10 +27,12 @@ package main import ( "flag" "fmt" - "golang.org/x/exp/slices" "os" + "os/exec" "time" + "golang.org/x/exp/slices" + "github.com/vhive-serverless/loader/pkg/common" "github.com/vhive-serverless/loader/pkg/config" "github.com/vhive-serverless/loader/pkg/driver" @@ -101,6 +103,14 @@ func main() { log.Fatal("Unsupported platform! Supported platforms are [Knative, OpenWhisk, AWSLambda, Dirigent]") } + if cfg.DAGMode { + cfg.TracePath = cfg.DAGTracePath + _, err := os.Stat(cfg.DAGTracePath) + if err != nil { + getTrace() + } + } + runTraceMode(&cfg, *iatGeneration, *generated) } @@ -188,3 +198,19 @@ func runTraceMode(cfg *config.LoaderConfiguration, iatOnly bool, generated bool) experimentDriver.RunExperiment(iatOnly, generated) } + +func getTrace() bool { + commands := [][]string{ + {"git", "lfs", "pull"}, + {"tar", "-xzf", "data/traces/reference/sampled_150.tar.gz", "-C", "data/traces"}, + } + for _, args := range commands { + cmd := exec.Command(args[0], args[1:]...) + stdoutStderr, err := cmd.CombinedOutput() + if err != nil { + log.Warnf("Failed to get traces: %v\n%s\n", err, stdoutStderr) + return false + } + } + return true +} diff --git a/data/traces/example/dag_structure.xlsx b/data/traces/example/dag_structure.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..eb243876ec0651c13b4affaf5ba8c891510dff4c GIT binary patch literal 127352 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

q0|nw<@u|NAwaCH)29Xf3&xe-`-{Gbu8bD zu>BC(jre-IFJQJ5EW3ZRsyj`A_QA6{i$y9rdIc@QZA~pG?i|SjQBsPOfE{_sLD2p>M9DUDj z4-W*@_+@0wj<54Ahh4)#vpks-6v=59%Z-PrWPGT9)>*qo| zb73tIv2BipUNFnmVVUf-(4PAJCPofK>@^8K-*2^hm+R$d%I;CMD%V2Wii3REPiT@Y z=N{SlYN-URBQZd4p+&2G*V%Z|GfuUB*81qwxyRd-jltoX5EY^9@U?snXi~7JIwK7{ z-hGRN@zF~2zTXJDb0$SZfxLJ=WX4{RrF8%05bOQL7C<2@!;c&JS>Zn=pnA{C^cvLP z8bWBg%ts3B=mFr{e4xn(A9-*Tt@l;+um_=3L0RlLOn<}R;s%FIW*O&$R&o!XYc-W| zJ;r}1VcmXM(jWH)3c&kHr7JY!ZI|;SH+Oz~`c9z#f_|5fuvQl@jQ0fhi` zAmG{*XQF_Ym8I+1Fca;MQb}fqMYD3@WDVRq4P-9j`9B)004N}aLVgZp?M~7g0%0zz zL?k_8nQvMOalgMmvrW$~3*79e^h)w{+|nhb{A<*_v^mVxz0@OK!}WL+P$U41%2E5% zqcX`!mSKBzfhc}<+~PB@eJwVRCsE+#**F2WHlV}@iLnujuhr8yE1jn{iudm_&qnEv zV>*Gqrq|vW`?xO}<$L%G0Bz`H#I}z>2@n}$piEJ@Arr#rqC~wuS_-k`n+M#GFYRA4 zrzE5;p6O$i0xTq`SLw1)-x-|`RX)}HMI)>nkr%f1=Ads?ge}4`DBSapgY`>op{h$W zY%g3YD#AbPd!A(xNI5&(nr#5!gRk{DBfU~&}3{KYia)a*&&Z)zIGRF}a(AUjn zQmBMEJ=6@w^OOS_o0YrrGdBeqC*X^|1L7HjOw0TfI$C>z{u1;NAmcP(@vSi^rimg9 zJ9Mw@a=7O9QrUd|rW6w}CGpE&%Pn5E^o?Y!2mxFl=I(2~1@klFXWwcq!@ge`fR6-F zxjY#WzLLx|O8Pq>UQm&7Ls4l=8FDV$~n5(Z5 zycb3tM>prKg+0Bm*pMX7)j!lAfqWUO5Mg<2mp<-sv_W4y1r zZTaNUK~XCHf4I7VZm#v)`4*vny?u25ty$cz$?Y`MHAPwi6c+UfdVJbG5Z63@n)I{f zVKvPoi)~2q*^;d~;@eP*p4C`_$Xf$(6^v))zEqNT0fxIm@yzNS)n5Ah4R`!m zY2k*a`CitYOizWg9c0P1rn8R$y(QQ&l!+RssA8(IJ313PZ4TL zx_W7WDVBA9cK88nt%)GgO5HO20quS{|J~|f$Jm*sXx$siwyid}h4kz@pIIG;Nm+m$ z1aGmB_caNZP+(pPzWACVP<$UMh||MG1^|Bq!^wn?TwSn7=0Q6>M6ODqEW(JJJUqG2 zj;e~iOl1?aCRn(W_$HGW7yO98Y179(14Og?DHFGCPTcF~Dus)&d7oSFd~6@gbKK3! z<8t5Q@~s7Ze$cZdbSOS;fJV&`&xdj!yc+S{9-T>TzeiHO=i8Gsk@ep4XwAPGz4G~4 z2hDiA8yRz??WyB!Zka5yrv^MSX81JFx|@$1pYKP?99hx36C{=GXx+OmEM+NlpO0=H z_@KR+37pno9yvy!>M5lQBhkbEB1s-qIs0GR=XDG?e@bIG*Hvwd%(yT)$jUW7W6yTs znACl^X)*$ciL*s7b*Wj5O5x}!UTQ7HPG{}_-t4${@^ea>pQt^N%h_$Yjgp}O z@#ZaG8Gqk0y8hz=5TVIYn@BwF{*H0yuEtR%3q&-!+U!2W{?hAs+VzAFO}~xn7XJ|I__3=`&ZkPFu6#CZ;!pW{@BP5FiS*|f3rNrCjuB` zaI*k5B>%69@@gvQvfprAqc)xSP|p=t_}w+f39gq;7^W`C38S}Hh_&id-@BPj1xrpm zYwXxUqSh}y&4qFia(r#=dB~W#OdOSEy<6{-7lKWH&D0GL+$W&Z)Z|{E)B}B zB+blDGU7b;=rnlHs*jwD?jZPwF1nA_eVFGI`GjiWxsbet$GmDqRu3D%BO$}p^C)-J zwv1*RL5AyjeAPU+H6Tg(Sd@cVI5ZpJZ5!KBrl(FFSIUh+X_DdQ?nQfG((5j_>ILzB z{wLqpe&3@2#~SFcm{`n@q&8gZk(O-4>b*8J!$1SdckIE!AmgnByXeU2Ctn)z7|e&> zECmy>fj;T;jqtlWW5Nr!ND8ObKofx@vioqIipik6;k7Y`$9RM|&T%Uo;6@4aE8zUP z&IAqXTbJlh&hgrnkTu>}p1E!JQelBb#cYu?QV&}RN*3xSna)dl;Ex__!&xHOrY|b< z-K2+&%`0;qW8XY9HMq~>EN~c6TGzuy*aNzh01$OJNpaM@829M@i)A%9`2qC!Q)U?^ z8y)=0(H1uD)vuYZhAPaT@|WC}+=w=6rN~XAT(P7lSAH z;l1x!+4$qz3_b8wSZJ2Ke#d(caeQ^|W2l1{Q?d|*;+Y)zIofoE+>g0s5m9ko?2ou# zYEqM<0l+U;6EhTgPv6BVh33U>+kHWUM(;Ts*se|aOdx9j8Kb8jKwp5TTI^NwWZ2`| zm-}}Mo-TBAX*^=Nt@J^AA@EMwM%&MJz+1T5wwKGYa^0aTG+!v%YsM?O4N%~qis;B+ zT_x2TBKJ|h|Et}Qx0w^onK@#9ORe}Svp!vaM{nDNJ>$JQTp6IH0)ORw`Rhtz&kS@o zJP9{V;P(*7)xCAH9lG|_64ia`f5Y4yug-VSQdy`+9tTp%Y-dhp!0K$~O8Jn`T6JJL z5%D{t3Jv@MQ+H;$+(?;Jx56dB0@BKF#sO6-E3%cG7lM_a^Pn(Fw-${vCi@XpAAR{_ z3*isQtgL{?^nBwG$J(L6I_@r9WEON7xF9`9y%+Deb)XX+eEWLhyU@RMXx2Wq8q~Cy zJ2kQ6A^^?qdUlvsvG<^>Xv*=(E)kC-O{LX=p|l-D7o3B4@^5?VZN4y3hOZ6S_l)n> zmst!_@7Jd`=USHmv`Kxc9TBv*oY3O~kFIa;f`nALJh%G~T14smtFIs1za*~Qqc@U-{1N5!ERzEz+vgUAuliM zT)qA&_Z?!f9P|?MB73FgA2Ffh`)Ygdwp(N7C?oKHSG)f~)3GN@>;n{yLy4cGf#R_e zFA3#QW3~d{nD+Zq%f`_%0)cTH1=W^;^Tf+rK;NQ9t^!Z)J!YS}qesRJEucZjpnh8c zzMQ}Y*-JICb%V!^rU2mzsz#<$_{uEq?Pb(^KSCDhAZW~9$DqV0B6FIg|}N*T#$Ta5_wMYK&{CK%T)FGnk7F! zruI*O5kV3DN0n|iZMoac@U-DkBneV3J|1E5QV`opD+G*|hU2jq_f9)Itxax5NY}&h;qWy+Bzs1W@O6{#Z zKSw}4E^L&q%@Wd7C6X!Cf`)yQL1Nn>vpuCP5L1Ph2hEL8UKNgIT|&5Xi7er-i0_qP z41H1pChzLRnkE5?=Du2#-Bli@Ch-Ba_f~WjL$(b~?wL5-?VBT>yz!Zem#boXOHGGs zHPXk7Pc`tPxsek?S!P97i?SKtig(*fh{6lKtP9kC&g}s)4v(DU2{GtgXUq4qLf|li zTX9#}1_X*04_!eA0_2;&BK{B(*mK#YV2zi3XsT?q!&oy}(Vd`dpPhUj07aCSw9o@m zdr^`V)>YPBYwqv@ZO^SKT_Pa6M%bLZXaB&y@}Qooq~PWE;|n)j4~LljmH6KQv^3=y zAH}ddXH=E;hKTnuB9E6!KbvDt(BEZ)2g$Al%FHSa?@>RQLtD|{0tD~LG zZ40=I*t2A#@VwiTj`vbxN4L}gZ3W_sj0&>JqQa?Xqw{L#xw&8=ezhltW#%)vdUY;_ z1$(GP(F@&2=l_6?DooH?d4XX={XN|R?~~qH=c3j14B(DpR)&zQza3~r34;bU#2cB) zI?Ehw^VKEKV=xC`+8Nm?J%x`quT{JwfK=8i0nye&6i< zX!_jzK5BrlL~!zKS!U5{?&Pa3lN01y!95*|>f*qyt*1u3izPYSm;dEFS$Vs2VzOh^ zn0la(0rA#O6nFdlqPsw!IIa-PCbYn8;!FF}!K)lb?0JZs-)o%NA8TLO@tGI;IAesR zib60g73`cOOaMVBgkp%$c97|#z#(C6w@8emumf5#LvdYo5GuMthRO-{nF;n>AISuA zB-b}>Ka!}y7 zw`vJSas{@J>&F)q|4XSvX*f9j*o9>HFF*?tWFzycyg^~3XO}W{Ln1dGjjN+m5?hfw z5$y|cMPok<$yt8?i%T&g8OA=csY7@My_#4D^{IJwgT#-mLGJ67FT~XOcX}_$iT?}@ z(O-3Rt&S&L#nGZx!qhwlpxrn$&2{q??u4|w+ia5=2Dp#WEg-Hgh73#JRf~dF!<&-i z7_DU@Y7mlfP7opJ5I($jXt;epzEapa1_T;Ng@m`N!ZKF)9N3Ygf72qxWZL3w7R(P% zP3OLW33i+ulhbOvW9bTNQ1cAT+S^6xyoi6hi{!3T>$u9CEj4+P z2Tl}-zS0KxY!Oz4i6f_4wJ+9HTieo0!}Ulp0?&oao+dP0{J5U73#&F2-pYeah?v3cng04r+^ysp0RB78bzm0n4s1SkhP# z+)8pj`@JQ$80a0H)pucgG?E;``ePWKk-JNUu^bhUL_U_RwjBOPk<hF~G2w`W$^lb)4Jn;H>94lt~cE7(BUM zMm}34;4Okam*xh8zEeZOU*44eq+rxbH-QZ$H3G>hBbFm*d@AN?iKJJA{LlW>SET<7 z=Q8-!9~`*WfsP9Rzcqs&aX2818?7B~%qR!6FTz*~nLWgR~JZf0j-MZ6i=l`CT zZHj5b=qV_KFPm!eX&)y6knY9!+6Ab&IJ<4HIP1UtDF%>FhnVG5l_wA;_xX{+UOGQA zk(bn5Lt)tZpc3CJ{Qls*PAy>3W&@5n#PK~eSa7rrfVqoQfJTCj7G-0ret5y&M&*`b z{9u%)HYGtz@jAyyGXB{t8uATLx8>dxM~sBn5s;kV=U@ zjkXsg0Kq$JYZ|IVLCnm4eR~)>sk(zk@j~7;vD(toyuXaM-e8Ka6>$nhJzz*@! zPUIu>fd%*ue*f8?+D(hv>ki|Hz+PO}SEphPDYK^;_df*#1#OmJ&>@oQI~#(gIA4nG zfh+^oJ+EUM)CY=p3fshgEgw?0*$rdM@{g0_Zbbfiy!;5t34s(iOhbbhCivLD{0w= z5t5hFty4l;O)QEQRsz1mg&(oAhib>4Uy}n3IJ-Ga zn!dza}+isRKUKu7^~Ub6re!a~r1PD~azx%Igt zgr@P*Y8c#*p{rbDY*?Trk-`U?FP-4?1_F^+Ts$$%dx0abYcvQ0z!+F6#mCnr zjAOMevnQb4l*9TQUGK?9Jir;yLRBZ}ozl4-7xD=t({1Y75@h#f{5kJ-7R32I_@4ln^!BnjBbF5A0YAojPKf)jw8#HWoGt`KOP!A0JeGtDs4u6t~q^> zl)9`Byd@XJ?N~LR!Y<|xVa05@;}Fz9&;k zkb6`OGzaM4uxp|#d($PZqlfNaAcl9I>naJhf;RJRflUT4{a4jrT^v>l3wbXqu08{g zg&@ljIi;fwF3-QabsscSs}v_yOAe(?TN!T@ZhM*YQ2nQ6z{K#16?&!MfMXeMRm@sS zh(N|13<_xq&oVD_kkz$(mi;zm2_C8jz~LaYFR&EBsK&+plq*) zmoMmVQ^^?zdfa9_5QH{WZ&d^SmgP%OJjQ|VGGV4*-4l7xlI*bp`n}H#(X8h1#sR-< zcWSYO^q^8faELSY;&Hm7^$TphResQF4D~32iQcfPlH-IC4kA2NH}KTR`?-aqYqIK_ zQivP!ktFG()zf3|!vJ)PVz4tQ^&@5u{27;RWYccyA42`4)c5bbH_qx6Lm9%e&W8DO z^$>{958tc&p==X&`}^vqcY|b?ufA7by@;ZjRWA1ykrY^G({xh&-aT` z=eP8MJ|b8rBf;XtxE+iZ{RUbCU%2LESVL{CCkMS+mw?g^muZUty52r@XIM+SMM-TV2Hs-}W^r+yWastB$6OJn_S2}X>EpZaBTg}D>$1v@>VFDj>u?_v>K zLV#vXolRwFq-_j__9iWlq?X)8lkUal--|XBBJj{FtD)eN{*0Xw(THW@y>X^leHJ3Y z?z=&6{e<7tDMig^-s~B|sXySA*iX#q(2r+N2(Q~{KA((con?uXSn$x9h&neu^enX- z{c~LCbglZDL7jXn>4O!dz4`Zu7htkPy@HHZDb3pMBwLZcsVix#mwMxZvXAZ~n-cvM z`k1If;_|zPF5P_=hPo_E_TnpsK$*K(UrRm|$NxgF{G|K={0O5Urg<}s24j%hbj4fT zfpj9*w~q)<9n5lqh%LNSJ~7dpZ#^7E;2e47h!*CN4`%GiV> zTluMnLk(7;5Y%8*L+|2SQEQc6$5dNBxEqJh z+yI?RM9Y|?{8GMaeYA&D%aK@iJJEZH``^nwJe-UPr1Z#=ELX z9=QGz+i^B)zVO8$AsKcL;>G87#j1o~zqW-#tv^CU3d=joUn$h}G0dl^Jytw0)?!=N z>N(Td*%RSN+|A1p`J39`@PPF$l=cG!3vp~isyiZ9@=e_~54yPF z|Gjlh;d^vDU%fA-p658u*bXVPHQCo_FRjRq$uh~*(l1FG6;-18{`ZAf4n46!F2{j) zo3ZWJx`2EEj(2MQMNO1;5=D_A8G-I?n+NoJ>w>q|+7fzs;-j1$eKx*9S1EGM7XziH z`27iRcAk$kbYHXBDrAH^my<0oX^(4st?lLXcu;_rfIS=sMi1nDQm<< zQ{RUX^PAdxb=~B;Z*JjCU>9sXnkT^=+|n_zbRIyT&p|5+k|Q-u;T=unpRmv8s=_a{ zivC(1FIGN9c-qkkOZhKlZjZjyWron5)j3YY!vqF)g6fyKUZiuVj3%0JB4u#m%ddOo ztTEr|CR5-;Ki_soqEs;N>$LEt;e}kK3Vicx$`@$p5>t<5tVr&)rKAf^u>wvqW zdQ~rf=6mwy2iivJmfpeZV(jQx;;DsM`0PISUyl{aUQ?^v51q;*L|#81sMfKPVZ=Qr zA3Hp=5;P!0b`nhWHNJo)jpdYn%XMA2YUn{A>4jjwH0>tLyJI15AO~~fG8eCP748Ke z9X>Nr-L@&vjIl(#SxAw-lY(u@UY_bxqJgDeg^7ne&aBqgmWuD)B{m zD1<4y=Pk`vpLpooe6T1jI8*+V5W|L{!KUiQl$(t}S;=5z+)j*{`*)MId|`mpY31iM z>=U-Hv8^JI^Ywa3!tbh$A}}aHdW+1*oJ3!>+xyNrUfMn3(wtyFV`Sr<`9YO)GZA^tH?=N9s5B66wYQDbyVer9mEFUItFLiQ`-!Y7G zBN9$$(LUHm=06`d@Y9((mVO~aK?Tz!PWlft{7B7Wi=0?&J3Ue|YwYQ1?Ui+8Nytgf zWTtS3c`h)&_Dfb+XNV!hP_T$B32RHdmpxM(`Ot}1Q8=~D%q%2<0(=n`bPxrW4S&FBdM1?ca099Ccvm7Taw;?5k~T=giJcEmo+My z$ly!W)!~)nnWBlj8`G2o4m-@Vd(XIA>W&2(us&$9Yvm85DyTwy<2IR#OrM#RJDe7p z{`aU8IxRXihkY-9b~6tHJFS51qbYe_Mn#u{waC>6N#4AwDFfHO{H_Bmqol?K^lK#^ zb2al8iWh13h573@*1{XJK8CE>upG3KG?u2izl>cjXzYo(_@(6dhB)J=ZJysLr|P1l zBji@jNm6Wxc1H?U%|f0s(n>4ubS+Odl{9xKH{nIc)R$&-w2W(Cdk`$!p>yztH{ zOSYOz^zW(?%FVU*Xw^Y@`D%Ak;s>@Ax4W)O7-QZmhQiysEQe~vwFQqe?jGwOe4#P` z=E&7~{o6J6BphXhU80EF`v?nk{M|8&;^yfM!txM)@{kHn#WK+EZ9X3)hhNC^jJLLlQ&SSPaw0AekiRV z;2DfkiOUsMRP2!~XivA`g*F(`wWY%m!R(Z}jr#z@H)oB5*7=`F=kMO@-(Kn2<=L z&ck1Q+CGBFzhz-!Fn67!1oDc2%@(_$gLwgGt#<{N`bKJ)p>d;+Ogd%8hM0*Kvh0yo zcc*_BYrLNJUNkY%OQofqY-81sA0n6Ou-~D8KcFnTeguzS$OG$QJx9KWG`S6>jiw9x z6i5=Mgu8JR%Knna(2l6|6WxKDq=J)%_bz;JkZmiFZX>STv^IR@5x7gj(KZhb3UaUq zbG;YxN|D`a)*GhoDx1SRIbSn_01yHR^xRyaL|X9vSdNcY##q;B5_cy3w~(^54a+N#cpS zs_sVj|Avr%t^c(PHA%2u}_9|#As?DtP~mWut#*+)HqY#;)D3KD%c7r?7)SF6vyQ`{|L#u zlBRbNzkn9~TKH!z$j_j6a_oH{#73-cYV}nhHt|BvyKeZ8&3@v%;@XIgd7makl~FO2Yoe}ISb3|)QEB%)jt`&Fh;CO$c#FGqgAXN0 z(xDJoO};G4Xm$Zcds=*H`B@LD!VwuTuAfB(2ZyBe~XBHu~5>-0uF)>y^ zs6Oe32~b}UEi_mUz_Qa<(@K%g)UAmEW~EQF&1wrUa~fqD#KNEIVKym}^M)qX39 zyjsHXE-BymX*21F`UEIViVxk7ZftlabT#m)+=<@In6#W9NfKY zR&Y(~PZLyuj;Xh_byaJgLsQ(uQ%X4XcduNmV*^TpPCj0I3vF*z^8gW!DVM@~P`*7# z;HR^A5$C8bfRB#$kvZ@O!iVIQU!*;Rj#w3@2yie1ftGK^dx!j;aChC`sJ4=2jnhgY z9y0UzMp?oUeV&$A*);Cfknm3o592mqhbqbgBoz^Cx{3Ebqb)9|_X^Uzuh1F?%&ClN z6EEX$_a*R9GeZ)E6d&a@Yq4>EzX);)(Y|oyDta(dv)14QSBE`K5 zB2}|~X>Nq84@~BEaZvM7vXZX^%&9gC5RB={M=ue5dB^?!;c9R$ zI0s-o4R@)mQ{ZfZ!GTX7?RcA0bmXh%yT4otJR&pk4)|16U^_l3ROnkUiDscJPs!aR3bXbO(y|la0BZGyL zMdAEX4C?OFMHGojgh3zybby4H$8}7wf1!K==h=Vo$?vp8O^iBdgT=+L7_y3UajW&- z=Rov@c-F=g7k&qFmNGREJq0}ZZa03`2e#dQ&Feg_NVC68n8G`|ED&>;fJUkM&I)bu zJfqPCRIu>*gE5d`iJJ81v^-dMZv^-GoGk+O;7LfZJM&R<;LrYlpZFf{5}o`*)aS0X zG(q6lWjQiO2*>k%n|`dhgrDGolrfHHE8rsQil_1E(a>RS4*SvsTsGuxA#R-zE zBYG`DSU2;;$CZa2mU&lytjUb`m3ZAR$B9!|URThj&Z*`~%Snt;uNvVO-HhM;`7;C; z^PYKH9FM$2;HR*gmYSjbh#4nWKdCq$lP1qpH}MiK%dB1G>$V5XiS4M9?L&s_=*gpT z)y5~`W%{n&HQy%`B=(SW^YP`Tr{RpUz@Osakg#T7#Y%`Pppy67sFGEzv7AAP?{P>%^(>=t&U4)@86@-2oZvnX7nCq zwXV`8hTOGhA{CNvAwlgjd1#4z3My}Ouq(lY8XRv}p1 zYoCXA$o1_-Wzz-Y32u~3GsPIAp&S-d;E2JXE>YBK8=YP>)Jtf;gq0xW=@83aAySBo zE2brTtL2~b%E3w6cAtAfYAOyX!^cC29+s&Eb;#WE1{%(-_XuY|Oh(@xQnA9|bC_l? z34WxTuHs2>^5>svmhH^1+U`R>a3B3L5-~O9KYP~NbVE< zhI2lQqo=2vcp#0nJ*bi*6b^M!+YM1U@QPjAG8Ti^5HNh79!%|dd&@HNE1iC3IG@jT zhr!6qn{ufu)4Dr6G+W|7`KEpSHMk##p4jS}iNSN&{K~|)s1``gmP>x94_eS+pnUUC z<&}R;U3ruIrfa?D_p({7`+tnxsd7iXBY5&H9RNk=-7pCwv=r~$UTE!nUhw@V>sAnK z{ro(zH67E3Wj_HGKSKbbp&UXcnAInF;`!J3x^icik;#FJXQ^>^>@3cbTX-VaJn3AO zWTgqyu8=7L7~P@X6F+8=o8{}?*Dwp}I@_ICMhG5i%bd@bkl*$aerT3N!`12Z163zDP z4BSF*=9wNf4J^buw}1hoh#muFp07p7%`2PrGfMibLXh z*_bQ+HjQf4^NHxEySt4tr!O0H*y2fs`YvmTwPZ$qEDai6;4a=a+{aGKDs?8odO+TQ zK!p12YOGO>iBp>2jd~r)(J%?6SR3rS zEW%+7bkoroDqpT*O%0k?Rh1bI%`+u0p&;#9($bI@jD zr(&GNQY$Koa5u_#K9*$2nte+2Ln=#L=|nm{O9|C}(%0LDdRtfhXRUuV^wk|sj5k7^ z4b%qi3+`-qyhCBT_6Y9wWSbZyg~nG^Sy1QgJ`pz-7{Gmc5yShIhKp+3*H8=|8d7cH zMEOT)Kv|CSx$s@fnjeHw z$u(takG&N!98%Y68{hxdO4SkKX4vDhw!Qodwdpj8jN9>ka&Sg*jf#s7lgupoNlQb- z1IW?HmksYzbrQH3_C`b1EYsFVXrsmSNQpEXQ0gdE2yH?J21IYYBg1x(l{Vqe#-8wD z5zMkd=6EB1%`RcA^!fiXX~Phy41$s}p&?~s3mr%MpzOQXBTJ8?hb|A8UiZ}x2&)U!`A{Bp= z*oT4Lf|C$v`I!zy1F}eB0cL{Rgkn!#xF^`^uQnhiC2Bs3pmGi>%1HBwvq69WTVFgK zl_nO56n#|jtPAsg>8Q6YV~p_!!Z)w2BA!WjE&lWQ143>m1ucJJHs%Cjtf409$3Mh7 zj8`sP^)}OU!-fmd1SOW_XPzCa%s3bEXg73 z?2ET=hgJ(199f9|(A)C+qs9l%IXAW{Ehww#LLgD9u>2f(qHOr8=|_W{Q~r46wm{DK$G zhAx(@Al(==k(}-sB4BHE#JFeP_^v?)VhAF0cn$&Nxk^e~n8PNdC zE56P8!RgIgm$7$K80{UM&t)w&WgfaP*)9~5(u^i7f5I|5idP85=N}pc2|uBie*$6 z&C|1bRd!?V5?QvXD2EkgsOwzFY2r%Im_)3Uf^!uzV+)~Yz%z@u-b}?aCAr#dtCOG4 zxS=8Uc)xq`%rp8~&z*Ggl`KQ*N+IgUu8a@5HtfFWi;gWjzkGEq*5DkAZ*OaJgJt7yD2XxE-dN<0y2IJS zN&mn~DG+Qyy2C_+TG={TTrVs zH|^z)iwz|jw0VPvzwf;}8{IjBGZC+FB0-q`Izgc%K)v$?u&UmO^hgipyUh`l`y&)fn>ggqQW zWT*5asx0x?+YuHn_iegviJ6^XXE6Uw0K`kROktGR$C1tQMe$J%etgI{t(CrjC4m^_ zG;N;Glkr87QP(_6k*^o76DnuL?RoEK42E~KEIktWU25~XAr(cV-q@^+Ce*@J#Y>$o zKKkX!?n?U?*&F9F0a$q0esayu5&k?JmFse)ZuHVHMY!gpm({ELX=(OQ$skBa^`uY0 zLkcrX6%()qoA7^Y(wMt%g|gMwx+61|V9?~K2V5_eTX@?XK1tjvi!?zonKZD@eH#pM z2mL~$J5|qS@X>vnaVtC6_9)LOEVNO8e;%Bxr}3KSrOwq(K%i(3*&V)NUgT?d*KCcZ zu1o@$X{O`AP>b!cvMkobNRq{;vYZes}=i)hGb=I8ECkAEiJY zT!|NesE*UIp6JNxR)b8$Co2k)U;K8qU%S97G(XUm))q*ZZ7u1)PJelQer~5c5DOW) zEox2X{1KejS^MHI+Tt`30xCl`RqD8D%5nNGXCy)Xg4E zQ#XmVEIutluhEC6F-!HoP7;&)U&dXT;T-Kdab3sKqs5?|?&c6%foc?bS0RiLM7Xfl zkKG1e6t{RJH!XSUJi_N-2yKoct{T4Y_>f8622*)Z!ckd`JMmO! z%MVLk1MZl~DA7YF&apD1;(_8FWkoLI&Kf>#8le?RlJc7kMU|!LJ8IPl^Gch*gk0Sp zM6BVojbv$CI+<0n(I(-iZ7=n-CP#~bC)T09xg67hbuPD!>wTnTxTdacP}TtEryVAtSA1oI4z%HJyY*|t*XvP6n+Q&}gswRC!H?4&q8^5^ zD$};-v)@3^Tnv_`f3)lF9~7BaYn_$=T1eTbdH$VI9F9P@rJ9;|Nh_M0juUIpaI#V^ z>-g%NL&xEM9??o--SmXkKGq^G90WEOhIpY~6}t2jD8_xtUyh$UGRiXrZV=NCzx5ok zZ1~T3%g@dxRJk`Ng5TsnPKKjyn18BBZ8sb8=CV=jDq)VNE02>k#`N!M(UU&|!b4`y zMH98;B6ek{m@fHnPe`!$Y!XW^y93jRH~H_XX8O5O@UW4OvU|)IZyQJytM@k)scV>~ z5f;VK+dl{U^tNP}G0ZhX-F<7){zCS;>x=71Uan3q>>DgXO=CoTmntD`CXoTkhWFCw@#lr4DaZVS77*lkHC zY`hS}BS%4xiNq&Cl>~cAhw@h{ii z5C5{HB>&FV@B6Ibclaw}rwnm;7r(#NhOrJ?)}0-i)#-HMU)CnCSbI!= zeiy+AB-ry=Z!@^%wbj`#*zr|QTa;=lTuHK?dB@O9_gv)4l!vWui(x9hAn!E{4^M0V z1Mho`-d>OIZ!g=xXpjsp^yS71xiopz8tdhi31uw|&9`T*etx^tmFKBR5A?2bfc;UB z{Yaj}(l|@4?qs*LP8wPCa7n%!tB>oCtTuH}YE$-Qvn1rs(?kM}cN)4-`QDxjn=|pA zW=Cd}2U_caGIy@~Abz|*6rx8cpffhS!R*g3%J8P%=DX)(d`Y?Kb$^%S0SOMzN-`S@ z6Aqqc=O>!#Si@PlF5+=fDKPOs1?2qKtOxhGeidnd4cyKrus6}R*SWpkFTda`LmPF)I>v$>buaBAAfAd)5yG1u4WN+Eeb88QeGl2 zE&^?1zZM_JTl)J5@OV}tr@=v_^Vo_N!tj&{zTL+wmFIy>A1!fsP)vph7GTg}k}M+I zoN`?+5p$_n1C<%=3tlV84^odA(VJy{S4z`&(3h>+`Dfz>5@L1QY~+k_IQd~$wR#0J z;RiRlv`TgRzwHcE&#bECd5g&+_KRtj->i8DB-#kO#*-^w)T$1JAVT5F8?n5?g42!C zM7;B@Ij2VN^kJD~%A1eT-mF}oPMC-{O?@&d;5D5_Zd|3$@Q}(suc6e2vGgl)#IttH zyn?o_M2(j{UOSydjXO+4bEWeKR^7v2@B%TX6Tci`j2KP4NU0@eg=n`O!zpOAN3+3x zWcb15g>*`uB+Ati0ECU-L1(d=e;mZC~Jr8c#)%7ft8z*NUWrOw6QK*v?ur$%zfh_XB12$t$l(GYoM~X zr1)*+wsIZFfA^2iQ~evsG*92_pCvz>`;No+N;qgM~Tjh#}Lo-LN(4YyP$6 zgJ5%>7CLuLH$#LoS`*V|rU%3GB|IhKw-h|twyIEoO#%5;G8ekY46CQAD)(|`LhQjMm? z9~RjkDd3rFqk?n=R-@p0v^^3J3uv@E((qI)*WJG41BD@k?M#7|ier=OcfqIle>VXE zdZo+Vt7#}>I6U%)3wlC^onigmhQ8u*RFa{YuL)*QiHeh($s^W>8#AMx{=I+UG#!U7 zAfH9VLsxM0geU5gxM7vemWX-dRO~XY!Z(iBWQ>n-LjRRu5AMu^&R zjPhhZ ziCxUCjH$I!J2;-;UTU~6?BcpHVrf$A5`AtuJ&qf22$Dt=pzhLmS@v+Ij;6Ri+%0Ne(k->3s5+wftSe!3iZ2Yw}n{9%px{SOw(?Pj+Hse#oNHolqx@7L4-J6nK$YK##g$+z_z-`Jv9au1x;@k+ljVy0Z-|Qf*=R#>CWD(W2iHtI zhtm-3R+CnYv_AgauS6%Tg)A_vis%t6Xqf18`+fC)JbiUsQ~&orAgBXGdZH*jav&v) z1_?)ZgOU=8u+ahvf~3@72yEn#P5~JuB8`kLr3FWKNT|Qd`}2ML{(s%qy{|g2bDq!V zIrnvyFu{vygOYC4<{$=@KSf@#Vbyp)^TCA-lQovxuq>Xet(ab6ECje|5R*N*i%Z zDr-=)pkG{$0oH%!RJ@HSDp~#FEGF%+2C<=7zajL^&;x@6O*(SOBlP zQ;G~B0jjhgle&F#nY_vpc!L77V=c9I?k5J1q`7h6{b69>yv(PGqJZ8ew`;}V zO4B>IW!Ys=rbx-#X}MuB^y>7zhJyN5mdz)oc=REStHmLPllj0BPmP&zEhkc+d3(|O zS2T2C*}_7tHv;eV!^e5=eiI-j&xJz1&=*+oKP95iaGds!73Jk={VNbON1c<8nykgw zBnXp^$*xK;9#`Ti!X90@Vrg*{?Qru2bLMZu(g#0C=;TLJnP~f$o+L$(L^+Y^hX{ln z&BVtP7r2{fN+0ez4_oJdk5kLE7uUOK{Hv^7FC&HDs3RIIpF=qH61Cv8KV7XUgB=3} z8a);qS@`KlU*F05k0pN{<+R-MjXug`XWm=WhST2Sb}6z#my8pQp*dk#?@Mj-mHeV^qs%6GA-9#|M68v$8@?)Dvm3>HxZ_A@%Q6Sv~#-nvjls?tC_OYZUfhTxh zS?5ZNaBWCj($t&Jjb0To(Q{O%1-o)_|fxoT-jA@H_MH6d;31u28q31^(p|4U(;-u=XK(f;W%mc z34Zj;vlqItHOi!k5*x2p0&|=d-|Ca&Pdi)IeJ1}jG5=<|z`cqNn93{(Px~L`%lj?x zkUM=$(w$rhl%sv;H$A;pd58_ayf1xJMWQ&q7G_tZ>jnv&(+H^F~KD`*7)-r3_kdk`DU6IDv%iTk%B>U%TmP z``gX22LrOZ))9*)!G)A=K@33f-Wd?$GQdc;!)eyxE?0@V7VJ~~*(6J_;8i{7a#d%G zn5|zg*w78&t_T*J9~Y$ERhrhKl>asJm!7U)-qU9}D3VIf40cTdbnhuU5ChYc$z{86 zov3@=l;X09EwxnH&Z+cJub_;6F?jQ`zm}h1?3Go}{MC%9yfu!0)RPTWiY4eek{>FmLdZ%gB~W)$9XLK_pwYVd&P)>z%$R0H8)0J6^~2yuDwE z229uD;5sI|?Fu)V0aPs~*0iQTExu;uFIJ3TXdabpb>JDJXP}y|lqN0!JGU_!nL5k6 zxRe~P`19Mq@~22J83gSYAJ5FGlh(dnZz{}D{mlKpduBM*>-Cngd=8l6qpT2Dx=Lzy4 z6c8LYu4rXC98MZ!yIc7K#zr@WaioVXreN0XtuX81_&|dR|Dvi!h~K|^5}d`2SuVC2 zDLT6ifC|MGl`%-};)~)D%x249-HkDxKzF7s+3=hbk#?62EtLFOUj>ls=o5~RuXYYSoY z_wB$%kmp;e$l{m?*=wJF_hz-dIK}#o;P&m_l@)tw!S7N|xeVsmiG=Hxz^z`cSc`!s zQ5(;TBQpwmlW+F#SZWaRsYrkI^>~HSx!&chz86^z*+Ro$X=Cw}>OPNFcr!UywG@Ot zyZckFTF;z3FV51#NWgmtxNY+Ye(|2EJ!mKh_g}5&#D=Ze0(ew<;%5*=d zv()z(R9qkrf7pa1f`)m=>6L4SGZnsNMWbA9%B#mdG2p5NT+(2L}H=f5WiwLvw2 zzyW7CYRxdFCjG^1*4}oUF)E&=CAimi->iI+uiyUaO)J*W$O5E*t_=0|V`qJRdPb{O z@F`mD2d6FZN`jaBxvEYdx9;lfN<{)?m+qn*bLM4Z%&Py#Dc%*ZMFM9HWtTomIrm!b2QS0z zCCIZ$&g8%EC1851+cr|~#{%gE><4g8K6!8f`4GG>-c6l%wv(p$j#L5Okmq?nyzT4X zL@K8@`A=n^0|LWKy85loW_6R?*S|k3@#Gyf4*fl_;XS!rF0)zQh$2dtT#pgu{9*1? z3F`_Yl5czL8nY{iWn--L@Sbz^XRomeQXY<}EoEQ|yYCR!x$i#}93v;ghQyvy!hF9J zAWQx?R4i9j+sM^#JVLxNQ3Y2YJ(cMPqDp3N9C!1A#{txR^NSV{=yG%qKriwMuZ^4M z9|hcd6_@Fb0=$@+3a!Q`g>g@fLkbGq1$gGHu`>ac`&?$EG9~zmv%MSEq}4nBt;t_^ zgG`Oh=7#m3>Q&?&BMrIz(Gj`?K!s!3DXopjjZr&n>}~xthSLtaR&Er82TwlVmxXHR zj>E6DbF`2RFmzi7g}J}ff`L_dm1bS$I4woF1Pz2Qzp&Y2b=kRkfMc$- zFMq;*t$R$Cb4nv6U*RyjDDFnu?huQG|=t3~K-{GhFH8SZkWUzi* z^BLJ;*UOkhg7L%ia54*rw;};5i?hDsOYx6vP;LYA67qLUR;Bxt!C{guMfjkHesA7d zAWgLHJ_r})lL#|vwWQESU)h12&$ZWTFIyyf_JonO3_jiEfuQe%0!(!l`3FJ2t&uB_ z-u;Q3?LJ^@4MfRZa$n{K%LYlM$cALj)>+v?V>8ZNNG1b>*-^9*FQR!PuxkI9;_ubB zS-K)8V}t;e0)abP<*09cUNHRivVSkRnNv%CI!ELaLD&?Z7{S)ggK?&l6u<$m8g@xO zLDRWPR>D5+!|DPGl)g>sGDp`|V4SFv7Od-*wqPP65ms`f3l zfdDY6dT(iNG|d=h z^8tWh&||@e_dX=Q89PxLroJ`~$fJ7yfNY>feC4oD9|1PKC&!^EZY5Rs(*L(LWk7wHbB)oPVcuwYtrOZdgN}9J zHw!O!J?e}r1m!CMou2@6;M@y}2sM6rjC*qT5nRjyZ}FQy<>kPVdvuJN%jzZiUu3T9 z6(PG6b9aq5SeRmx=<~y2v-fV zeEZ~@OjvwNWyu{x@QAjIN6Il~L(;7G>xLEGbWDUUeXdKfZMDubaz`-R(d2N z-d-G-&UA7S)$&OZ$tV$w)jC5#WBd4C64hDwi!T`i`wkJj68vkGE9=}(?BRA3b^V)2 zt18a=nkaPVvT&3j0u<93?XJW zP|;_eASw8A;+WYN-;q_W>q=p@;|VlAmQfri7so0cdoRN-LFyX*YbOBLoG|>CV&G*D(cxTW@dz=WPw4 zA_mnn>fAf64zNLneXhqzLF?w9G&aUfmOLDGY80%3!`Wd`JnMX?*q{^Tzi2X|cTBDOPgjvKuG? zmV6+`A#$BS=kN=I;^ZB0oVOSP-hKY1d<}Cy=AGQHFKM_bzs|-y%jaB=%*}-T7Yx^A z*215;iBF%P5yCxph0lwuRG$R4cmfK$6h^JwQduzB-DPwU-Ko=nHsSxkP1x#~$&GOt zMUO=QEPYw8s|7HbWr9{DUoILG9~1#{9j_8%!uq!1WGl%?*a2+9%=Xqqgn~hpVEO|# ze2!j}pnk~pExy#J5~z5iV7)SP+b5K_1??{El`RAqojMU11W|?agQnXQ=>4k{U6{uT;OE7}$k zlHY&P8CFv!Z%`|UcVWXP{;-ohQ(fDS7zxYEE8G#Tv%HEL=lvS4G~aBlkFI7=YZCi0 zgQu0veVdvRl&bpH-$`nXl4sZ+)^2iva`LBHgSuAd*m>7^M-`*fIeylZV!P3aY*zXp_75RVX!=%-k&po*dGvfno zS?0LhHfTM4{B^(wMPn?lw+hj#i)X1YX{slX9wsIsy+1+sCChE zLjOHAcHUf*Rx9-8xQ>kBkzDTReqq}eitMa90H^D(C?}jkvRtaA&E9n~Zd_fQ(GJ0@ zz#$ggrSE7GN6Mfgj2kK;{4=R4N{^u^m0S*tzck%mt!0S{Fg~4roc=oVtq@_FQit_* zm1+;n=q=5Js$_3%PqW6^(wuiZJWxIW)J}0p4*#l{=AUKO&m+ogAEB+)jm+ZpW{5O< zBzvWNl%sZ1+jmu*D=n(JxdW5C@b7a}u26LK=J$2XizU!bUyngYn^WuJ#DPbR5vCtM zRAJ5NaK_LxN+=BD5k>#}AVbXbCuOf5+?cg~P4u7{L_PcM;Z9Md^GF-zhWTg*R zG{4c3ELo(oam1k}c?46f?UHsw|$llux)|vjn zS{;K0m&ZNW)N{Fe1aBDn7+stGK>OVtXm>{^WE_jgp6Ncr>~9dDf{sl4ZgRT_VRAXX z@?7cqzHSs!=g|MIrWlCs)A}{OpYQu$iEwW$Rh1-~HHEces4TLUw8xf?)5B^8a7c%I zxC{?%8qVaYGy951^TRttO~%0g4h&! zO#x2v`H3NyBaxqiWZkcvS$Z^6lff_=mM5Ch>Vrm#da07-nJ${0&lu+NtsR|OPMqJx zM4{c~$8}ieS1lbw3X+T>mUgFH_DdIHysKIp#=yd>9+m=YOaV{1(jHY(+`Ps>rq0XF zHqNcmm7LJK3>LYg$h_pPurIV&ty-CV0^4BtiPgfH1vY@zA9q@2T{l1tn#YaOzt^s* z_RMrh8n%`G^lcw_HOu=~ADlQ_Ow|HS>PRzpEBSNIg(J@TWF zi%7{+ZRlVI?Sj*JvWg_!^7~3^qWf$jdOKp z$$Q#UAK>NxMM-`vJMog$E86AM*zLNfQCcFI>Vx_tefT)#80whcZTyHL{CW~b1oPu) zhn;KX9r6(|0H7dQsEa)GWa`=k{e(5V-JxYw|PeQGN?1wdkQ(_Yx z1dP8FKH+5}6vMl{=UN>%GWZ>Dcv*Vz-I>&MTm<|^Nc>u}#k2YF=|`aZO^>d3XWg99 zLs$=t^B^DeE~yq$l@%G7a8jia;9_r^1cH{6W$b7Sm_QZ%;>b^xyC;&{7sL#7FLzq_ z!|hf=>sQNO(%?1BIs@>oOTR1jSL`#r>z#qhglmKz*az{9j#7d24{sNMYqc~bHC@pcAbM;l@T9JjF;Ro0eW-=waowEUJ~KkYud;@` zUUGSAMyStH<$msbRRYy|Z10Yaf^c-^WDFOJyO7y601MW_8BCYO7D?nU|3Iy zK8bd{@Ann-g*grvkBPWNV30v@XSA*-x6>+$qL}TYAb8cJM24k}^q2{7N`ZpGlwhRV zW9Xar>{3c=EH=iWgX(t({j(9l!g~(W7VlTMt%$T&M59(}jf3|+qW@-gDnQ|zw71@t zr`Lx;0)#YZbxft6Ml+1i80BRL&H#W3FUBe0;}o{ENgDq4<3VFh^Qc|nY=OEkKVx&# zb~NVnxc1=|#%M|~S0)n;I;P~ncHsq{9(eC<30};0V4VZ9hIB3(`>4LioG{QbTgepC zF%|+F4doz(kHchu$~iNBm=9gH~UX*|Y@9g`V%+b9{6$6?5Nof-Wa{1uzSR7FoRC zSxVf>i%2mWLI$n$X`ZkI5ZftbjI+yQtB zboqI{#D?aoZHLGrX7!46?+8S2@88>IIs*Ulrad(ui<+Sc#VTtZqPi5(?ENb`5x*Ve zK}1iU9t8Oj1y4$C)p0WP>hFUk)>iJG8g#ELQKJ7K{2PZ@HVNZzu|XmVN&fE3DZ!mIkyflA3nJre=bkaJTd&=D=&^#^7 z@XIoB*STf~8fPU28YoIZnz+RMtY7Y?zhOp{3rl`dIXR&6TZ1P-67P+=gj7`CM$*u} zrywU1sSeH4eccQ89lq4RuhFhDi!PB<-}1*&-cbgS?EV9dBP>_O)w7eP?|g;G-^uK;h9<-d)-2CT>1(sm6K`Mp zi~gs+TemN@2y^^rKCLYi0E3!nOEUp5*9HS0hcUa+0;^${pTcI+05-*X$C?kXh7B?d zBa?hJ!K)P}boZ?of`&#;Z|gYCRQK- zkEdz2s7)%RsuN^S1fYS!En!In2j4@eOhz(tz4THKYY--McofkQBqw007USKLN}lKNG7s?%~zx2u7yV#EneB`b?>=u!({T-GYwUiugZ1l-gzsh`Rmqp;nN+{G+jND$?RHJ zHL(ZbUhOTM|9(gR^W?7LpQe@p?_Kn6TZZ1E9XNPU1uPgue=;bcNilam97Xcy_VVeQ zicLsxLM(*z?C~@nUy?37IICG)WhQp#xRqy0@TV#0^zmyq;f&1Q){j+&>L~pks#I!^ zr5(rB7c*jkd2N$7uMLIP-0Z&{`=A)2N%!W^4RZJHdz}%RMM3_3emfEYnB4#Y?DFx>BASj$E-tx`APmtA$5!%xO?q>36PAY5?LZqQ zZAjbq{&SsvTKO+9HwhO^`pYxdy2q_Z0Upe-@5iZe&=C2^;_j7)(xzW(>z|{MaIAiJ zo1R+tXe^-RWGLuKo;;-BfrAVYyD9o`Wh@X#(u5l@*gE8`7X2!eudak>x#l&S-F`Fk zkz0q-ojO&}Cq;R}AMZX<#e=GCMsc%Wmtk8*U$=Nvyssm(7v|}-)IvXS9;Rpp(@5xi zfFj)Z23fpoL~d(_jazbzPK-#cB%Hb>`&UYLvozN*aX=@vWu$g5h9P=<$&hP`8JnM5{qA(0jm!Mt8@Lnv&We%Oq-J2ce^5pfC#jamB~{{XN%%12o@8zY z*4}hNP(u|dTx}bDMaeM##VoI*`0DG*A7-2M7`5>71jngn5a7pR8djcf%>K~sRShiI z4wrW7WNtSEkgo;7%y3!dNeQ13q{ItQ!b(RuA)sC~(H8F&Nu#kn#!aWr9h?AGJ5_&2&IleAn*65^}Ej3la95tC|hY*yiw)h(e4OA`;2qRT*~l zu4#t;UTlXxF({1+H;IT>QXNltivrXIa#;r&R#2+N+4;t62c4!>)L1^bttbvK?}=wUNv78{o?Ry%`|T!pA-Bu;0Z7#C$H|o@;F)}n%);>w!`ua z-(~d;kK>BNGSKjB&s*%ohmT&|!}G|Y3(T+wC~Ni>H1hr!k-3NAKaDI(hwtR`0<+uA*+Sh^wE;utf|?sxUHfhV|q&MZxoZsD%p0uV(A zJhVCZsjJkz^gUb8?Js}AjZh9r*9()0KGpn{IOR|tyB2Wz5|7OBLs+GDV0MZyqz@)A z7^8Z(hRtncMueEBpqy#!)P>w_1oGnDG+>qYn`dDO*ad5l^R|!nWnVY`tyoib>#wNM z#`G)wGWrd~6RLVC2Yq#i+twqzN-3+lYMQte)hl8&ca{?Gs8AbA81-EB+}OKu)&R}t z)eQJU9T%+>Q110c%Iq|O9Wc7W{%$kLGQeMer4y*!oQIpqyTvFRVIW+XQUH|LO0_h% zc&jXB;0buV0bN!7xr}RmGxJa*PH=_(j@CD8n*$y8`?mdcCBrr%H)mI2YeZS#i`S2LDUGBn?&sA@UR;LO^)mRLhY0vl{o zsG-%>E`eC|y)mk(srK)qZ^#_FV(l}(kd(n$E!`yNr>z=buDX`c+-eE#BKLbERN<3| za{q?qG8IWVk zc1i|H`%sCGEODWz*qz3JSqV@2v)@-l(ROco9x1)2jgopH5IzxZ4FeZ|c+cE2f`k)1 z8r|V>YU@21>hf*U9ZSL=lF33^f$;RqUZqla$CSNT?$X>wl&B5>L!qnQ$`G5B+M1TE zXT8jDxwOt6kSmoCI){hnrfi=IBn%n^l`LQWB%7(Tz7nnRvg0F}+))6Kbd)Q~&me*( zzm=p(CMtsKO$KY}KkOc$s=G2%hbesm?(|m9kU(L>0nv6IL(NMUXPP6V_G(zQFq)yW z$q@3B3tRxNn;DtIESL>AzMvN(8ZO}6hTy?fS#beNJmP4HmN@HGtsAe+x~S!hQ*VdM z`Ze|nxA)^yrbwO7uGUgBemAG8bL+BknUO%yei>;%%)Z{dMk|j@r=^^Zz-!c z+Ew4VuZVf(y`CH#BD+OWxx%XRddMk@X~99+HL&|uf1`vz{B5%UI+C3ER*Yt79>-U>lFdYeq>?*hYe z*Yrb>ceYzQq+M1=Yed)l@4Q+6kAs^^po2VFzbt=U8ZjswJAR}Xdi+DjxBBdH-e~A; zEs}RnzDuJ+xR?Pg&T?5U}_6~BTO7BN^uR4;;N*M!3zz&*4!JsT6jxD&C9epUp`fJ>u* zbZwK?c^iTa020qwuRZ2|Khs(GJ=w7zu`DsN2z@OT8@%i?(^?|;@b*Q}LY%dt^O!7{ ziSo}oT$W(ggH0qW%YPw23$-Mo_%IyE2GPW}Zxsb9?0OQCi+h(%?*8fWCD94-t$6Tn zz^$0F!0aLo$zONH=&kL$Qg_R=$$xT}O)tHBOn!ZGsm0SO0ktlGozp#x`G*iL@GZ*C zsiq*yVlx2-OqhmbX`_)6)>V;%H%6O5055;@;co8<9>7=gzBeLd?(2CxUfh{j`-VCQ zpBPWnDfm?I>)e~BkizXUoY_ffvZ$qq$jHX`cLs%qb zK!MzV`u5*&0Y*nBp7fqx3;g7kpxism4)P24=zdcNe3l;Oq|_5Bj0GSnsF_r(0>Xz% zrtn@ue)df{b;4?XuOm!@4~$9H!od6;0w#R_G2{n2CQXmV_d=?A~8RaCM+3E8)6 zI$J(U+FN7>m_)5V4=DpVlIm2*?Z6?6{$avS^ew-E3ZC zL&JV;lq@W)TH+1$pAktW$XufLN0-=TJ*JLVuL{IVmh5|fY*cm@@mLFuaT6l+hlw;~ z1WI5{-v3q`m5SYFU6KEmLoy=E=HL9RB8@?qnJA#z(+T}}-(tz0gRH0j*B?`2^l=So z``@qFbkgn#oshF*W>BquJNrTKM@(G1V{~kRuQvAJE_;>D#=G;sd10yFc^+$Lz;~7u zU)8oCm%l7{R+Y!SJfR0`Sw6;6^~0&Lv|B2E@Sn%iO_}f=3ZRv&*}K=QE5NY?oSYv= zuxDO7e{$3g5TA9l0_&rxlc2{fP3ecWy8szanR?|e%k+Z=9^qr7=?YU*!gla06>L6J z_4=B$|0zpd`sUL!OQ?~F(0iDnB_odTbc{zBy`E2Wg$s@O;kk9Bb!^KA2EhgLADm*l zBu@JA#z87wr1ir1BXH>oV7R=^e$=}y8zP8**!n0ImBL>#1KZDZ=nC@+P{(e5_kGmY z5pT%~wAK@$ZkxNX$IvUYsb8;4O+F+SFbsu@NW%ZrJzq*v*7{?|^vB>t_P>S})IJ2R zz|d_=!mwgL3+t_L*}}ZS{NP*oZ#inOzmDV&x!uDTs2DVsuDHENliso-cnxbp`Fruq z@Aj0Cjzc4C${@-;6qxIBa%P#hGoXC`HQIoZ$1%E?q7t=(EI;g{@_LN^nfa~j00X{{ zzIP2s&x*d*C`edj60KAroYp=YzP0fK_Nw;z(u|$bB8eGaeBot7qgZKTIg}V(KiIN2 zLDvrYV>-ail&gT?_f}D$=^&?k#`*~WkgSCS06FCd?{eE>yVo4Zsv%?9c)6lriJ?6O zw<6Gb-{%#3iQly>Sv*joAUMFGf52XGm)%2f;2+b18S%=~v<;4SOTl~v4k0}&vMoO& z26iT^OWncm*{aL^CsS1cJwDMHk7l@){6*y!gR(>Ma+!>7UxAE4z2KIe0)M`Y-9pd$ zScKKKb!?~k4`}(shp%4oP8kK{A0`^QpGm^0Gc`S zt`LFQBN$~M0TH@=DbW5RdR1f*79!c}gRVDKeV<&3Jyy=&FC69)X$g&V53DbaCe~X>|O^f9&m(*Je%? zHc_ixz-#RuHpfvb1*8~Q3o)hEU=G8SxsgwrCUDDwMt13%Z^yXL=DMM7sK6iBv;X}m zxAeCI#TMkjZ9X0+9H^pf!nI+dMqTT@q>}KfeKxV*!=-Qg@Uq_j6KUl)-)T|1-@Fdn^UCdFOtPDnjwd?h?DH4d5kf%xdMa|ihQj+QyNHB?Xt z-7=&h+@)K@+$P@T!DtJP@kxp|Y7mq&Vgp8IPGXTtK?osx=r#iU4jN*BO*F_&OPdW& z`KDznbVGNaa4H!Om<)nRIs1?2G1wwFRp^qn>JaC9e*64BH?*ym?Pg)SP4SodB&z1A z#%?mwN74^gt^)?+DqsrWA}TIwIa!sTmZ0-3$iCP=`|hkSn76QR2-+gW3)6!DNY}z9 zm#!*drX_keO@z`Rt=W8^Uj`a1c-?dIHvUCl!t~8B8CRgu#lWg{9FGd%)0=D`ML3bf~&mQFT9P+5V6`gDThAZcuR!#w0JVY0j0# zNZHN$K}PK}Ahi$x-f7skLr{xoN9i1#?IUXMWt^QW+_4=s|T$uk`fl5fSr zP9bxR$Sjw0)(EZI+#&CAGAG70Nz@!&mNw#k8GSt);j+Ijy%d)I@jD6#gIs;4$DhKl z1zufad1vYWMc=V2S(k_PtA&qa0zKR87Ba@)$xDhzCSJd5pKT&*>;56+HK2QXiAi*2 z5v`3VePWP%;djx2*^!CZqXhi>Z@dP89?&Vj2k4LS=r+8z1d8iA)GUd`%51bX7xD1qxzt+lC^1^WW95gxw#~l1Vk%gx9G3tjR^tpx zb1IIxAM=`I`VStS=Fe8Qe>KK<%6$+HsAde=`0=YmY~LR5pCSKRY>@W08{{QP?FXPH zidv8}mA^r8aIQI+NV?LAFeyr~E|JS^dh7OP{Ud0{imK=L@!f#x6iJnU(vLfG(6sNs zf=6BP6Lw{2CI44pm{j$(_`zP5E4gdbORsK;yw~6W-93?j>RRvqTIv?ZB(PSs2#0jZ z=9>qukaL|V?f#zF727yUnxwC+U#o$0k_7P~7!@NR9MbxO58E1C+Wn7|YA<@G;qDtxq z0pQ3@Kzs(I!btphY}D8nG9`?ZTK!P+{x(0E9e9nY5r6KzL**;r^~++R){7P4R2T2G zs!@&qZcMIsithm_0KYw8;3JU1wP%R7_gE`uzZ9@m)Ho1QEK?1s4cmW(Risnv0CQvY z>_TAprH9}qP%%M|aYqvwEek$^GdezhV_RAV43zDN^Vh$p;;LduHDqbyTAtw6s@_{<3#C^x3ITmV?g4#8MK2AlY`(zUK6IZQ z%znmk)o^g^yMp9e{qrZiv1;HLhmgph0V)Sq#^u6)bDsUW<1fx)`2|>|J4>a~G!bGY zeZYM5vH1`jQj>0J4MLqb$B{c6ht4%bBe#OMb)0~KYuD`q8Sp!wkGgI-`EOpjN5+1~ zZNE{=4i~f=yrvso_0*`Z&Nv{fbEEwXd;_E9C{)@IZ#6}p_h2#EC}wJR=w|VNqYHUL zkNIxUH*Xaqc?D1Arhz%hd%&TSHOK!y($_~w})-=FN^il1yzz$KZ}eVGVgll=KTHl z*W+33x27l8-$8xpJ^jN>Ks)Up_V}MjI|jM@2<00ZIgz}=1uUg zy?e;_tSB}u7okEO0K*DX^5-eiPs_NtawPu_lR>?;O?SJ$z)?uwdttz!l1Bn9Amc+A zyh3+7wxZk}MCIVRj!QqhvjNCM{3_T_t>x5*SX0YHfY*DHO{yxP+1F2yaPnM zXCc-E9v`yV=+f~iausKd(CV4N6*RZfZr53F#Lz}r%J8mtxMlub$@G8!=J~?SO6zfG zfHN^@A<8+DksCEGuM|yFxqq;Abrx^q9ND~i@Zibm8G8**wPq|r*vYrYAhA7%V_1(IkYOi%tiS?M?t%N#dCwLn@0j{V zPkMzMQ2DDO25BMqa8g$s&V@^`?%RA4ula**;@cXvZrToFSrtp`yHCMmpyzfcCs%oU zy&)}r4yb|lj&tA_p`i8dXPuUWAG%oD>SV8t@(+@L)0mt0){)`{Qx|{_S=^hcOPOBu zR(_i;Tqx?>4yk69qGM1p37W}M$Q1(@iLJzZ_%CE`IC3<2P7Y+C%%w9*f0^Cm)(BV{ zferH-hczM%vd3tyeVrMi2U44tGoCL1UUPSDK4^1fUuGPu|G3#(XAIPQ%MV(@pvq%$ zYwEk*jPdTFvB5hlV_u(LmXc@jSWoGBSYeepCHx!ydaRRdUVY)D%ms09Ye(@$rWX%D zs7yTyGcY#tTUBUPveE)Fp=0D6p?k+&2dY1=lq`i4a);m(+95s)f?s|A<z)c8=pyu@_P)~nVNjS@5*%^ zsepf7j1P_|lp;tqJW2NAN@|aym&0PMC{eM3=O?(I^3ca8Kn?(A=`RNr19w3N?xNdw z=SdAl(EqO1Kr@vPtQt4!2s^EMJsFTE+f8ENOMhQ-fZNdu@V>B(x89?^j>ZnpHx%4A zzzJ@o?2sC~r`^dDjcG_M6_x~{rfjqz(Hr{?CcHa9=2p8ZtXki52G6Jcq=lK9k6ge) zIlGWdN}vhZ%e^C#SXENY0wi)UX#KT>6g+lCWVxV{kNuQD@|-q5PB!EW%2VJQLy+Fw z(6B$Efi%qap9}>Am^%{QS*dn%{%L56tsA*w3rGR{3cO1?0#sf>RjP7W`4j>dXT+Z6 zIht9H&ERi6;P|uu^?B7AUk>E6jAdF9Rh2p7tEzp>*0FW%JQ~F#bi6@$E`O&1oSV)2 z9fzBwx_)!K)D$(WZJAYs(Mr0NVI8Vs@LQ_1k4K1^9w^;vTNs?>Lg1L*a4Ss&>TSWF zO(W=^RQsF?;9DB4JcXn~-S9zxjx<5M49u(8$UK|!dPABza zcaT-WBF{eh=4u0ew^4Dp`^Na+o6U>0m|CHv$fi7aS*Tt>NW}ShJ#_{k!v^id!l^SZ zj6cMHc`^(hf=XCvM8Pjd*;85`h~) z?q(`##dW4NEyuk6NqUN{D4>uB1k z{bKX;*JGU4FzUL^MSzS#Ppc14h0`Pvje{>U2Os#RKhmcj#(Z}rw4kACco z__#_K9@@W}DUVrZWYp^X_Y*f`XOTnYlDoTUD&w zq}I01ryWfuYX<4nGfQegN+KG%M{vdasMCgg$0lS4tj8jMs+baCTY z@HcZC%!C@HHNIjYJxCdj2)nzzg|*>N2?%XW>Rs@A18f<$-s&ud-xuxBm1u-L>`TK_ zxR$5sThZPdg+JSFmwYpYbo|OH95es47HOn1{No=cU*6#+z;a}We7W{%uO#m7zP8Gn>RG-G(;o{x$p+rvBPZYrr#jL&EXe%;#AIxeSZxIT5Ko$BK; zAc(fB?it+lu>~H7;(1V4uZq3NdIrR4iw`n!o^iK0h-UzLk-{6}Q>Q|H9Qr8cPsQVO z)-Ons?PlZv?gZzIQaxO66@F5ZUuB(azoz-}9;~%muiqGHXy(1UjVjqSmB;he6v<#ao(!q?o`1W5-)JKt14Xl&JGo#{1i37Y+NTYRvm7DkRmEt{Ho}XXnLb# z=SX@UAs|D##(wx!csIz8e7p<-dUn=RAjWJA&QzVvkanvCB(m{<()v@_IfG23G#zbD zUL{YFvm_iDB@4d7SBuZXWG{Vz1|jUs!A+Pjo9vgwodwql&YSjOH58Wad|=I=ADo2b z=}b{#>kJ)qbS;JLL?GO$&NnxsDx1(u$B{?f{;v0T=;_L$rlf0h6#}>;DiFMh>N{;k zx`3H)FP7nvZv_f62thVUB>o|;o@6jc_SW$#@Hn_d8aOQ>HsJ)q~FzOEMn0)`-8ey-@QR*IYFA6i&*tc44x<&Jx`)vgzRJ8%g zZ>FjNqgbs?`gU3KzzMETypZ#Jl~<0!4N4pNcA8hXE_B>UA~3im(r?W-jy>5P=a6k> z_!i?$5%8ps+t7Y3=@3&ox{RW1l}spEAf1G+|Rfz#j!611Q4qeTRov>gZgS zxyQ1vsXsgFGGNv*{iAmGAepW|-AujWr{gVrPgFrg)Zw+(2!KMH8G6PA*0C=qqw?uo zlz^tinLAcWgWaY$x$4`DQ(TOw)*@`(=*LQA!Q*fPJO903FPE=B+&YF)G?Fb1{;`xKs-wsxdaA}Zr|LJK+=dM>o$4R}4S$cpS}6DHZ*s!CTETf3b6qa5O0I>Hz0 z&ium-(c<>Kq&R=@XVFhKNlH{3I5(937Ep6lb;8N!m93)>I?jCeh8TkIL{?A21U?qi z5~W{|fXP@^QM`kX!t#8&=C-TitR35%OcxtyNDPVurmYeE=0S(d?$mKP1Qdry!ZXJP zl*#XvG$Xu$j0eWmnAT6JzyOA0CT&x`D~#csvZfdF;KDM*vMXRW(^PPX&mMt)h>5*L z7W`4>kkzct*X>*%)xi#IH~5?sx%kU3m~jg+dpa*M==n%j0K1qyzcEg<>$}WKD+_ofxS@??KqTJS*oaS zSWjeAXUK-eT}fB@(iO`wUK6w4ww9vbExVBES0@|qVgs;^`=E;nPY`jRXXU1#vWPkzZ%*TZXNr7JbiUoRNoUfDcxPdN-VK}bP7_^-LQbHgn-1- zEh4p)OMmG`LcygQN$HaA1}OYfhKM!6@Q0$0{EevpPxxc-ztx+hBTAef6&Vax$@%slu+m^YM=`k-Qakk>hVGtqTlGb>zcYe)+NTLHZ1vu5lSgJ|~(^bJNm8)Q{)$%SQ8-t?sJrnnD8 zVn4r-cBz$`zht`k*3TMW>X{hc9iLGPi!#$l6a{@A{Tf#kyL10Nk&Ix=H2d5=0}bdS z5$v$Ci;Z{nK`iO;jH9(+V86LUGiHdY@7p+_WsEwztyvtv1~}ICU*LRwfz^?LHNFW1 zXKKE3pG^_ zaOin3C+kYs;dW}RdUimw_RoNpt>u3zA`ki_8b9!fo&8chq0*CXK9n42iMY{UTpbw+ ze12Hjn^C2t->ynoCGEj713)Xp9z2^Z40BFBSjAgP0}R`aO6@7O0jozPQxP-JBYrv8 zI0i`7#zlL$K7AdPJl9-DB`-IkvDh3u%nrFyQP(jsyBq!m`@-|aope>L2xA?4F+-G3wWYIZ&Zsl(3 zN{+8=1+Vz_Dahl(+U9(eg8=u4{KjBcdXiBBCCivrVSucl4*F^kv@t7_ExV9P;cLmv zc#sQLhzS51+p+ogHU*2|;NSDt382hXzuxUkG=K(Q-z02$1p zR%JSGNi&#aKbvGJhSc=g60pfs#NCb9L84shTA)W*#P@F(0G0k2gBt5c04+y>YGkQM z`=r`b4`c3&h0XMk=BCGrR_THFfX6!hA{ZBcY$%&VI;*DWji_oL>JkGVv*c1!co#q& zICJ(oOg(owFN<(@nvM?zctt`tX47qwl&W_$y3ifGUDB52tot2*VHKY%n(JJ1)Hc^J z%;^G|wc|qI7S|fp>rJm3451)N3OBqP00s}8^t=6+*nz;`{+RghK=SIFS+we)c%U2t zKfG1aEGu1RdwY-4O7b&)are+r6B{@>K*@)@(^KjsizLfu)SRtamE5@KcK)ajlSDBD z7=w;~iiW|qTYSG(hZ*JKVVF&xqdy1DD17_4j5cTz9d>LE# z8O?7$zAq6%uNZl(x76BbGOdk6n;~oCZNvC2tD_@qF~vXn_xC1(BSWG9~evc{VCcC883%0DJ)*`8Gx|LohL2vuQ0H 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%0A|0(u*uOblAirqg3NM}p zW<=zQEDRhlJ7?kzWf3A-Jz>U9&(kpE_GZZjB&#Uf1kPg3M6kmJ}#F+=df2 zw%F!QI}3bTgOFA7fQS4qG_9YG_FKfBOo`emk&vHy&`A2kLF$4X?|{A$6V$y_1#&I< zl))F)>u$W`B43Xruw(C~2d)}b*JUF9-At@AQT=ZvVnI;_6|Q^EFfx`68oOPnyTv$n7D1ydg$Nt|>GY^eN1$>InK0utS`WuP zo|zaQPq#xTW~eq*!ZB=f_0kyvMUzR2Kmx?L(hYgjf9LH1p9AY48qU{74hZ2A&irOP zh7-v+#ah|1D0x45sZse6IKF&MDqz7x66tz4t!(z!{-o4@&EzE53IJ-JHPQ=)^h8f#uQ+Z*%Tdy`OZ(j#V^DJECew5zh$+m{>eqY{k~MJ#FfBwR&p4t zjw$H+$E||=NA{b&kZ)Rq`p%PA5t3MmqMhJ-57xpb+lQHm99hb%@s%6?9?C zIDq0RD^DZ!<`V6++Q8Wes1VH-aSp@O8Go-)rjjc525cCar=_2eYhE3Ou zMN^b*(2A!@Rvkyn2GUEevR;u5`>3nuOL;!r$p&Zh@aYvJ%0Am|4843Le14e#AgS_s zRxw8@RBt8*_LC`>pL_4vwNnH#SCrhJ5Vjp4WIVQ7bZx2l$|Q>@X|fT8aFrrVnFj5! zrI|5}t=Hln1)4HT0)H5R)M$&CA@d#^k9ym~nutfLIbGzI({6-XcdE#h`6pNDbcIdD z%x`2@M_UpF3_kX&m9f4Qmb1*Qu{A<`#HOZ&Up#1EE^6=}<0)+R_+StY#HqI@MT_b& zpfimg!vQjPWAlzfdk!*1YZC2wuNl!I>AxT7)_+&En|9CNw-if7JTmEV`nFZ5|9pHI znM{3D<;vHe&0mgSUbT7nN@o;gI(nuhKI5r?3RrqfY-kdt#!%K}m+M9LhhHgmpTPjXNu~BlP${~ zyr-LT_DWE}@qM+_DL(3lUU z;GMHzJSz1_1-rPd*sqdwKt4=O|0mR+UFUG(Ly4KWsahN{XMdv;k1A#&(Wz1w>3sX0 z!rJRv;!9QQX7@o8Xk_Y};LILjjMMA$FBYBeaVMO}bYwCAm)-dwW$0r9b~$Kgi(F8A zj`9jyz)O3MQf@dWsa$o!9<0;$KKqjE=AhC%Zcybf{&q2dF*Mja@c)o>)p1dDUtbC7 zE(xVs8U&Q?W+~}zB&1;p329hLSYQF^?hZ+Tr8}g%Yf(A`^m)hM`~UsS&d%I9_ndE> zgELRI`*bgnYrjdoNURlEw$=nbxgsM^X{JSS7{2V=n(q5q7mrLdc_*OWtb9oN*Le7< zi4%)Qx@VxA;=3>u`O?1yZu^pW8GR-;AX*US2eiR*I0p1gcfaK_+bZUJ$uhY`|0D2k zi36|fvAQs5*hM^CySkLAp^<{&ar@cNj-vS$tu&ZFeNsQY!QiQ@5uV;nlq$g{0T;## zcI<0rV*b0oXBv41iJJFsD{b{#PrYud%)Mt5z4-G

y@(Ss9LTfcfU6h+=6@Fl|S~ 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 0 | 15 | Period of Prometheus metrics scrapping | | GRPCConnectionTimeoutSeconds | int | > 0 | 60 | Timeout for establishing a gRPC connection | | GRPCFunctionTimeoutSeconds | int | > 0 | 90 | Maximum time given to function to execute[^4] | -| DAGMode | bool | true/false | false | Sequential invocation of all functions one after another | +| DAGMode | bool | true/false | false | Parallel invocation of DAG with each function acting as entry function | +| DAGTracePath | string | string | data/traces/sampled_150/20 | Folder with Azure trace dimensions used for DAG Invocation. | [^1]: The second granularity feature interprets each column of the trace as a second, rather than as a minute, and generates IAT for each second. This feature is useful for fine-grained and precise invocation scheduling in experiments involving stable low load. diff --git a/go.mod b/go.mod index 20e73a13d..17f7c4956 100644 --- a/go.mod +++ b/go.mod @@ -35,8 +35,13 @@ require ( github.com/go-pdf/fpdf v0.9.0 // indirect github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect github.com/kr/fs v0.1.0 // indirect + github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect github.com/pkg/sftp v1.13.4 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/richardlehane/mscfb v1.0.4 // indirect + github.com/richardlehane/msoleps v1.0.3 // indirect + github.com/xuri/efp v0.0.0-20231025114914-d1ff6096ae53 // indirect + github.com/xuri/nfp v0.0.0-20230919160717-d98342af3f05 // indirect go.opentelemetry.io/otel/exporters/zipkin v1.8.0 // indirect golang.org/x/crypto v0.23.0 // indirect golang.org/x/image v0.14.0 // indirect @@ -46,6 +51,7 @@ require ( require ( github.com/containerd/containerd v1.6.13 // indirect github.com/openzipkin/zipkin-go v0.4.0 // indirect + github.com/xuri/excelize/v2 v2.8.1 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.33.0 go.opentelemetry.io/otel v1.11.1 // indirect go.opentelemetry.io/otel/sdk v1.8.0 // indirect diff --git a/go.sum b/go.sum index 54c19da35..e2276a2b4 100644 --- a/go.sum +++ b/go.sum @@ -124,6 +124,8 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -145,6 +147,11 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rabbitmq/amqp091-go v1.1.0/go.mod h1:ogQDLSOACsLPsIq0NpbtiifNZi2YOz0VTJ0kHRghqbM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/richardlehane/mscfb v1.0.4 h1:WULscsljNPConisD5hR0+OyZjwK46Pfyr6mPu5ZawpM= +github.com/richardlehane/mscfb v1.0.4/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7gK3DypaEsUk= +github.com/richardlehane/msoleps v1.0.1/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg= +github.com/richardlehane/msoleps v1.0.3 h1:aznSZzrwYRl3rLKRT3gUk9am7T/mLNSnJINvN0AQoVM= +github.com/richardlehane/msoleps v1.0.3/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sfreiberg/simplessh v0.0.0-20220719182921-185eafd40485 h1:ZMBZ2DKX1sScUSo9ZUwGI7jCMukslPNQNfZaw9vVyfY= @@ -167,6 +174,12 @@ github.com/vhive-serverless/vSwarm/utils/tracing/go v0.0.0-20230926064847-68cc9b github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= +github.com/xuri/efp v0.0.0-20231025114914-d1ff6096ae53 h1:Chd9DkqERQQuHpXjR/HSV1jLZA6uaoiwwH3vSuF3IW0= +github.com/xuri/efp v0.0.0-20231025114914-d1ff6096ae53/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI= +github.com/xuri/excelize/v2 v2.8.1 h1:pZLMEwK8ep+CLIUWpWmvW8IWE/yxqG0I1xcN6cVMGuQ= +github.com/xuri/excelize/v2 v2.8.1/go.mod h1:oli1E4C3Pa5RXg1TBXn4ENCXDV5JUMlBluUhG7c+CEE= +github.com/xuri/nfp v0.0.0-20230919160717-d98342af3f05 h1:qhbILQo1K3mphbwKh1vNm4oGezE1eF9fQWmNiIpSfI4= +github.com/xuri/nfp v0.0.0-20230919160717-d98342af3f05/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.33.0 h1:z6rnla1Asjzn0FrhohzIbDi4bxbtc6EMmQ7f5ZPn+pA= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.33.0/go.mod h1:y/SlJpJQPd2UzfBCj0E9Flk9FDCtTyqUmaCB41qFrWI= diff --git a/pkg/common/trace_types.go b/pkg/common/trace_types.go index 05bf3b06c..a1c5581e5 100644 --- a/pkg/common/trace_types.go +++ b/pkg/common/trace_types.go @@ -24,6 +24,8 @@ package common +import "container/list" + type FunctionInvocationStats struct { HashOwner string HashApp string @@ -98,3 +100,8 @@ type Function struct { Specification *FunctionSpecification } +type Node struct { + Function *Function + Branches []*list.List + Depth int +} diff --git a/pkg/config/parser.go b/pkg/config/parser.go index ee78140e4..a8bf9adb2 100644 --- a/pkg/config/parser.go +++ b/pkg/config/parser.go @@ -53,9 +53,10 @@ type LoaderConfiguration struct { MetricScrapingPeriodSeconds int `json:"MetricScrapingPeriodSeconds"` AutoscalingMetric string `json:"AutoscalingMetric"` - GRPCConnectionTimeoutSeconds int `json:"GRPCConnectionTimeoutSeconds"` - GRPCFunctionTimeoutSeconds int `json:"GRPCFunctionTimeoutSeconds"` - DAGMode bool `json:"DAGMode"` + GRPCConnectionTimeoutSeconds int `json:"GRPCConnectionTimeoutSeconds"` + GRPCFunctionTimeoutSeconds int `json:"GRPCFunctionTimeoutSeconds"` + DAGMode bool `json:"DAGMode"` + DAGTracePath string `json:"DAGTracePath"` } func ReadConfigurationFile(path string) LoaderConfiguration { diff --git a/pkg/driver/trace_driver.go b/pkg/driver/trace_driver.go index c9e61b037..b1c6032de 100644 --- a/pkg/driver/trace_driver.go +++ b/pkg/driver/trace_driver.go @@ -30,8 +30,10 @@ import ( "encoding/json" "fmt" "math" + "math/rand" "os" "strconv" + "strings" "sync" "sync/atomic" "time" @@ -43,6 +45,7 @@ import ( "github.com/vhive-serverless/loader/pkg/generator" mc "github.com/vhive-serverless/loader/pkg/metric" "github.com/vhive-serverless/loader/pkg/trace" + "github.com/xuri/excelize/v2" ) type DriverConfiguration struct { @@ -100,13 +103,232 @@ func (d *Driver) runCSVWriter(records chan interface{}, filename string, writerD writerDone.Done() } -func DAGCreation(functions []*common.Function) *list.List { - linkedList := list.New() - // Assigning nodes one after another - for _, function := range functions { - linkedList.PushBack(function) +func createDAGWorkflow(functionList []*common.Function, function *common.Function, maxWidth int, maxDepth int) *list.List { + // Generating the number of Invocations per Depth + widthList := []int{} + widthList = append(widthList, 1) + for i := 1; i < maxDepth-1; i++ { + widthList = append(widthList, (rand.Intn(maxWidth-widthList[i-1]+1) + widthList[i-1])) } - return linkedList + widthList = append(widthList, maxWidth) + queue := []*list.Element{} + DAGList := list.New() + functionIndex := []int{} + for i := range functionList { + functionIndex = append(functionIndex, getName(functionList[i])) + } + functionId := getName(function) + functionIndex = append(functionIndex[:functionId], functionIndex[functionId+1:]...) + var totalFunctionsToInvoke int64 + var additionalBranches int + var listElement *list.Element + var child *common.Node + // Using -1 as indicator for dummy node + dummyNode := &common.Node{Depth: -1} + node := &common.Node{Function: function, Depth: 0} + totalFunctionsToInvoke += 1 + // Assign first function + if maxDepth == 1 { + DAGList.PushBack(dummyNode) + DAGList.Front().Value = node + return DAGList + } + + for i := 0; i < len(widthList); i++ { + widthList[i] -= 1 + DAGList.PushBack(dummyNode) + } + + DAGList.Front().Value = node + queue = append(queue, DAGList.Front()) + for len(queue) > 0 { + listElement = queue[0] + queue = queue[1:] + node = listElement.Value.(*common.Node) + if listElement.Next() == nil { + continue + } + + functionId = rand.Intn(len(functionIndex) - 1) + child = &common.Node{Function: functionList[functionIndex[functionId]], Depth: node.Depth + 1} + functionIndex = append(functionIndex[:functionId], functionIndex[functionId+1:]...) + totalFunctionsToInvoke += 1 + // Adding into the next element + listElement.Next().Value = child + queue = append(queue, listElement.Next()) + + // Creating parallel branches if required + if widthList[node.Depth+1] > 0 { + if len(queue) < 1 || (queue[0].Value.(*common.Node).Depth > node.Depth) { + additionalBranches = widthList[node.Depth+1] + } else { + additionalBranches = rand.Intn(widthList[node.Depth+1] + 1) + } + for i := node.Depth + 1; i < len(widthList); i++ { + widthList[i] -= additionalBranches + } + } else { + additionalBranches = 0 + } + // Populating each parallel branch + nodeList := make([]*list.List, additionalBranches) + for i := 0; i < additionalBranches; i++ { + DAGBranch := list.New() + for i := node.Depth + 1; i < maxDepth; i++ { + DAGBranch.PushBack(dummyNode) + } + // If it is at the final function + if len(functionIndex) == 1 { + functionId = functionIndex[0] + } else { + functionId = rand.Intn(len(functionIndex) - 1) + } + child = &common.Node{Function: functionList[functionIndex[functionId]], Depth: node.Depth + 1} + functionIndex = append(functionIndex[:functionId], functionIndex[functionId+1:]...) + totalFunctionsToInvoke += 1 + DAGBranch.Front().Value = child + nodeList[i] = DAGBranch + queue = append(queue, DAGBranch.Front()) + } + node.Branches = nodeList + } + return DAGList +} +func printDAG(DAGWorkflow *list.List) { + DAGNode := DAGWorkflow.Front() + queue := make([]*list.Element, 0) + queue = append(queue, DAGNode) + var printMessage string + var buffer string = "" + var dummyNode *list.Element + var startingNode bool = true + for len(queue) > 0 { + DAGNode = queue[0] + queue = queue[1:] + functionId := getName(DAGNode.Value.(*common.Node).Function) + if startingNode { + printMessage = "|" + strconv.Itoa(functionId) + for i := 0; i < DAGNode.Value.(*common.Node).Depth; i++ { + buffer += " " + } + printMessage = buffer + printMessage + startingNode = false + } else { + printMessage = printMessage + " -> " + strconv.Itoa(functionId) + } + for i := 0; i < len(DAGNode.Value.(*common.Node).Branches); i++ { + queue = append(queue, dummyNode) + copy(queue[1:], queue) + queue[0] = DAGNode.Value.(*common.Node).Branches[i].Front() + } + if DAGNode.Next() == nil { + println(printMessage) + buffer = "" + if len(queue) > 0 { + startingNode = true + } else { + break + } + } else { + queue = append(queue, dummyNode) + copy(queue[1:], queue) + queue[0] = DAGNode.Next() + } + } + +} +func getMaxInvocation(functionList []*common.Function) []int { + maxInvocation := make([]int, len(functionList[0].InvocationStats.Invocations)) + for _, i := range functionList { + for index, invocation := range i.InvocationStats.Invocations { + maxInvocation[index] = max(maxInvocation[index], invocation) + } + } + return maxInvocation + +} +func getName(function *common.Function) int { + parts := strings.Split(function.Name, "-") + if parts[0] == "test" { + return 0 + } + functionId, err := strconv.Atoi(parts[2]) + if err != nil { + log.Fatal(err) + } + return functionId +} + +// Read the Cumulative Distribution Frequency (CDF) of the widths and depths of a DAG +func generateCDF(file string) [][]float64 { + sheetName := "data" + f, err := excelize.OpenFile(file) + if err != nil { + log.Fatal(err) + } + defer func() { + if err := f.Close(); err != nil { + fmt.Println(err) + } + }() + // Removing the first 2 header rows + _ = f.RemoveRow(sheetName, 1) + _ = f.RemoveRow(sheetName, 1) + cols, _ := f.GetCols(sheetName) + + cdf := make([][]float64, len(cols)) + for i := range cols { + cdf[i] = make([]float64, len(cols[i])) + } + for i := 0; i < 6; i += 2 { + for j := 0; j < len(cols[i]); j++ { + cdfProb, _ := strconv.ParseFloat(strings.TrimSuffix(cols[i+1][j], "%"), 64) + cdfValue, _ := strconv.ParseFloat(cols[i][j], 64) + cdfProb = math.Round(cdfProb*100) / 100 + cdf[i+1][j] = cdfProb + cdf[i][j] = cdfValue + if cdfProb == 100.00 { + cdf[i] = cdf[i][:j+1] + cdf[i+1] = cdf[i+1][:j+1] + break + } + + } + } + return cdf +} + +// Generate pseudo-random probabilities and compare it with the given CDF to obtain the depth and width of the DAG +func getDAGStats(cdf [][]float64, maxSize int) (int, int) { + var width int + var depth int + depthProb := math.Round((rand.Float64() * 10000)) / 100 + widthProb := math.Round((rand.Float64() * 10000)) / 100 + for i, value := range cdf[1] { + if value == widthProb { + width = int(cdf[0][i]) + break + } + if value > widthProb { + width = int(cdf[0][i-1]) + break + } + } + for i, value := range cdf[3] { + if value == depthProb { + depth = int(cdf[2][i]) + break + } + if value > depthProb { + depth = int(cdf[2][i-1]) + break + } + } + // Re-run DAG Generation if size exceeds number of functions + if maxSize < width*(depth-1) { + width, depth = getDAGStats(cdf, maxSize) + } + return width, depth } ///////////////////////////////////////// @@ -185,6 +407,7 @@ type InvocationMetadata struct { SuccessCount *int64 FailedCount *int64 FailedCountByMinute []int64 + FunctionsInvoked *int64 RecordOutputChannel chan interface{} AnnounceDoneWG *sync.WaitGroup @@ -214,8 +437,11 @@ func (d *Driver) invokeFunction(metadata *InvocationMetadata) { node := metadata.RootFunction.Front() var record *mc.ExecutionRecord var runtimeSpecifications *common.RuntimeSpecification + var branches []*list.List + var invocationRetries int + var numberOfFunctionsInvoked int64 for node != nil { - function := node.Value.(*common.Function) + function := node.Value.(*common.Node).Function runtimeSpecifications = &function.Specification.RuntimeSpecification[metadata.MinuteIndex][metadata.InvocationIndex] switch d.Configuration.LoaderConfiguration.Platform { case "Knative": @@ -246,16 +472,31 @@ func (d *Driver) invokeFunction(metadata *InvocationMetadata) { default: log.Fatal("Unsupported platform.") } + if !success && (d.Configuration.LoaderConfiguration.DAGMode && invocationRetries == 0) { + log.Debugf("Invocation failed at minute: %d for %s. Retrying Invocation", metadata.MinuteIndex, function.Name) + invocationRetries += 1 + continue + } record.Phase = int(metadata.Phase) record.InvocationID = composeInvocationID(d.Configuration.TraceGranularity, metadata.MinuteIndex, metadata.InvocationIndex) metadata.RecordOutputChannel <- record - + numberOfFunctionsInvoked += 1 if !success { log.Debugf("Invocation failed at minute: %d for %s", metadata.MinuteIndex, function.Name) break } + branches = node.Value.(*common.Node).Branches + for i := 0; i < len(branches); i++ { + newMetadataValue := *metadata + newMetadata := &newMetadataValue + newMetadata.RootFunction = branches[i] + newMetadata.AnnounceDoneWG.Add(1) + atomic.AddInt64(metadata.SuccessCount, -1) + go d.invokeFunction(newMetadata) + } node = node.Next() } + atomic.AddInt64(metadata.FunctionsInvoked, numberOfFunctionsInvoked) if success { atomic.AddInt64(metadata.SuccessCount, 1) } else { @@ -264,11 +505,11 @@ func (d *Driver) invokeFunction(metadata *InvocationMetadata) { } } -func (d *Driver) functionsDriver(list *list.List, announceFunctionDone *sync.WaitGroup, +func (d *Driver) functionsDriver(functionLinkedList *list.List, announceFunctionDone *sync.WaitGroup, addInvocationsToGroup *sync.WaitGroup, readOpenWhiskMetadata *sync.Mutex, totalSuccessful *int64, - totalFailed *int64, totalIssued *int64, recordOutputChannel chan interface{}) { + totalFailed *int64, totalIssued *int64, entriesWritten *int64, recordOutputChannel chan interface{}) { - function := list.Front().Value.(*common.Function) + function := functionLinkedList.Front().Value.(*common.Node).Function numberOfInvocations := 0 for i := 0; i < len(function.InvocationStats.Invocations); i++ { numberOfInvocations += function.InvocationStats.Invocations[i] @@ -284,6 +525,7 @@ func (d *Driver) functionsDriver(list *list.List, announceFunctionDone *sync.Wai var failedInvocations int64 var failedInvocationByMinute = make([]int64, totalTraceDuration) var numberOfIssuedInvocations int64 + var functionsInvoked int64 var currentPhase = common.ExecutionPhase waitForInvocations := sync.WaitGroup{} @@ -343,13 +585,14 @@ func (d *Driver) functionsDriver(list *list.List, announceFunctionDone *sync.Wai waitForInvocations.Add(1) go d.invokeFunction(&InvocationMetadata{ - RootFunction: list, + RootFunction: functionLinkedList, Phase: currentPhase, MinuteIndex: minuteIndex, InvocationIndex: invocationIndex, SuccessCount: &successfulInvocations, FailedCount: &failedInvocations, FailedCountByMinute: failedInvocationByMinute, + FunctionsInvoked: &functionsInvoked, RecordOutputChannel: recordOutputChannel, AnnounceDoneWG: &waitForInvocations, AnnounceDoneExe: addInvocationsToGroup, @@ -364,7 +607,7 @@ func (d *Driver) functionsDriver(list *list.List, announceFunctionDone *sync.Wai InvocationID: composeInvocationID(d.Configuration.TraceGranularity, minuteIndex, invocationIndex), StartTime: time.Now().UnixNano(), } - + functionsInvoked++ successfulInvocations++ } numberOfIssuedInvocations++ @@ -375,11 +618,11 @@ func (d *Driver) functionsDriver(list *list.List, announceFunctionDone *sync.Wai waitForInvocations.Wait() log.Debugf("All the invocations for function %s have been completed.\n", function.Name) - announceFunctionDone.Done() - atomic.AddInt64(totalSuccessful, successfulInvocations) atomic.AddInt64(totalFailed, failedInvocations) atomic.AddInt64(totalIssued, numberOfIssuedInvocations) + atomic.AddInt64(entriesWritten, functionsInvoked) + announceFunctionDone.Done() } func (d *Driver) proceedToNextMinute(function *common.Function, minuteIndex *int, invocationIndex *int, startOfMinute *time.Time, @@ -560,7 +803,7 @@ func (d *Driver) internalRun(iatOnly bool, generated bool) { var successfulInvocations int64 var failedInvocations int64 var invocationsIssued int64 - var functionsPerDAG int64 + var entriesWritten int64 readOpenWhiskMetadata := sync.Mutex{} allFunctionsInvoked := sync.WaitGroup{} allIndividualDriversCompleted := sync.WaitGroup{} @@ -571,19 +814,28 @@ func (d *Driver) internalRun(iatOnly bool, generated bool) { if !iatOnly { log.Info("Generating IAT and runtime specifications for all the functions") + maxInvocation := getMaxInvocation(d.Configuration.Functions) for i, function := range d.Configuration.Functions { - // Equalising all the InvocationStats to the first function - if d.Configuration.LoaderConfiguration.DAGMode { - function.InvocationStats.Invocations = d.Configuration.Functions[0].InvocationStats.Invocations - } spec := d.SpecificationGenerator.GenerateInvocationData( function, d.Configuration.IATDistribution, d.Configuration.ShiftIAT, d.Configuration.TraceGranularity, ) - d.Configuration.Functions[i].Specification = spec + // Overwriting the runtime specification to account for maximum possible invocations + if d.Configuration.LoaderConfiguration.DAGMode { + originalInvocation := function.InvocationStats.Invocations + function.InvocationStats.Invocations = maxInvocation + spec := d.SpecificationGenerator.GenerateInvocationData( + function, + d.Configuration.IATDistribution, + d.Configuration.ShiftIAT, + d.Configuration.TraceGranularity, + ) + function.InvocationStats.Invocations = originalInvocation + function.Specification.RuntimeSpecification = spec.RuntimeSpecification + } } } @@ -605,34 +857,40 @@ func (d *Driver) internalRun(iatOnly bool, generated bool) { if d.Configuration.LoaderConfiguration.DAGMode { log.Infof("Starting DAG invocation driver\n") - functionLinkedList := DAGCreation(d.Configuration.Functions) - functionsPerDAG = int64(len(d.Configuration.Functions)) - allIndividualDriversCompleted.Add(1) - go d.functionsDriver( - functionLinkedList, - &allIndividualDriversCompleted, - &allFunctionsInvoked, - &readOpenWhiskMetadata, - &successfulInvocations, - &failedInvocations, - &invocationsIssued, - globalMetricsCollector, - ) + for _, function := range d.Configuration.Functions { + + DAGDistribution := generateCDF("data/traces/example/dag_structure.xlsx") + width, depth := getDAGStats(DAGDistribution, len(d.Configuration.Functions)) + functionLinkedList := createDAGWorkflow(d.Configuration.Functions, function, width, depth) + printDAG(functionLinkedList) + allIndividualDriversCompleted.Add(1) + go d.functionsDriver( + functionLinkedList, + &allIndividualDriversCompleted, + &allFunctionsInvoked, + &readOpenWhiskMetadata, + &successfulInvocations, + &failedInvocations, + &invocationsIssued, + &entriesWritten, + globalMetricsCollector, + ) + } } else { log.Infof("Starting function invocation driver\n") - functionsPerDAG = 1 for _, function := range d.Configuration.Functions { allIndividualDriversCompleted.Add(1) - linkedList := list.New() - linkedList.PushBack(function) + functionLinkedList := list.New() + functionLinkedList.PushBack(&common.Node{Function: function, Depth: 0}) go d.functionsDriver( - linkedList, + functionLinkedList, &allIndividualDriversCompleted, &allFunctionsInvoked, &readOpenWhiskMetadata, &successfulInvocations, &failedInvocations, &invocationsIssued, + &entriesWritten, globalMetricsCollector, ) } @@ -641,7 +899,7 @@ func (d *Driver) internalRun(iatOnly bool, generated bool) { if atomic.LoadInt64(&successfulInvocations)+atomic.LoadInt64(&failedInvocations) != 0 { log.Debugf("Waiting for all the invocations record to be written.\n") - totalIssuedChannel <- atomic.LoadInt64(&invocationsIssued) * functionsPerDAG + totalIssuedChannel <- atomic.LoadInt64(&entriesWritten) scraperFinishCh <- 0 // Ask the scraper to finish metrics collection allRecordsWritten.Wait() diff --git a/pkg/driver/trace_driver_test.go b/pkg/driver/trace_driver_test.go index ee8515bca..e3926cb17 100644 --- a/pkg/driver/trace_driver_test.go +++ b/pkg/driver/trace_driver_test.go @@ -123,7 +123,7 @@ func TestInvokeFunctionFromDriver(t *testing.T) { testDriver := createTestDriver() var failureCountByMinute = make([]int64, testDriver.Configuration.TraceDuration) - + var functionsInvoked int64 if !test.forceFail { address, port := "localhost", test.port testDriver.Configuration.Functions[0].Endpoint = fmt.Sprintf("%s:%d", address, port) @@ -133,10 +133,10 @@ func TestInvokeFunctionFromDriver(t *testing.T) { // make sure that the gRPC server is running time.Sleep(2 * time.Second) } - + function := testDriver.Configuration.Functions[0] + node := &common.Node{Function: testDriver.Configuration.Functions[0]} list := list.New() - list.PushBack(testDriver.Configuration.Functions[0]) - function := list.Front().Value.(*common.Function) + list.PushBack(node) for i := 0; i < len(function.Specification.RuntimeSpecification); i++ { function.Specification.RuntimeSpecification[i] = make([]common.RuntimeSpecification, 3) } @@ -152,6 +152,7 @@ func TestInvokeFunctionFromDriver(t *testing.T) { SuccessCount: &successCount, FailedCount: &failureCount, FailedCountByMinute: failureCountByMinute, + FunctionsInvoked: &functionsInvoked, RecordOutputChannel: invocationRecordOutputChannel, AnnounceDoneWG: announceDone, } @@ -184,7 +185,8 @@ func TestInvokeFunctionFromDriver(t *testing.T) { func TestDAGInvocation(t *testing.T) { var successCount int64 = 0 var failureCount int64 = 0 - var functionsToInvoke int = 4 + var functionsToInvoke int = 3 + var functionsInvoked int64 invocationRecordOutputChannel := make(chan interface{}, functionsToInvoke) announceDone := &sync.WaitGroup{} @@ -203,7 +205,12 @@ func TestDAGInvocation(t *testing.T) { Runtime: 1000, Memory: 128, } - for i := 0; i < functionsToInvoke; i++ { + functionList := make([]*common.Function, 3) + for i := 0; i < len(functionList); i++ { + functionList[i] = function + } + rootFunction := createDAGWorkflow(functionList, functionList[0], 2, 2) + for i := 0; i < len(functionList); i++ { function = testDriver.Configuration.Functions[0] list.PushBack(function) } @@ -211,20 +218,22 @@ func TestDAGInvocation(t *testing.T) { time.Sleep(2 * time.Second) metadata := &InvocationMetadata{ - RootFunction: list, + RootFunction: rootFunction, Phase: common.ExecutionPhase, MinuteIndex: 0, InvocationIndex: 2, SuccessCount: &successCount, FailedCount: &failureCount, FailedCountByMinute: failureCountByMinute, + FunctionsInvoked: &functionsInvoked, RecordOutputChannel: invocationRecordOutputChannel, AnnounceDoneWG: announceDone, } announceDone.Add(1) testDriver.invokeFunction(metadata) - if !(successCount == 1 && failureCount == 0) { + announceDone.Wait() + if !(functionsInvoked == 3 && failureCount == 0) { t.Error("The DAG invocation has failed.") } for i := 0; i < functionsToInvoke; i++ {