From 0802f184c5a7b21cfd87e8f818e31ec7df50a0a7 Mon Sep 17 00:00:00 2001 From: Jan Waller <jwa@informatik.uni-kiel.de> Date: Fri, 23 May 2014 16:17:15 +0200 Subject: [PATCH] Experiment for causes of overhead (SPASS-meter) + bugfixing --- frameworks/SPASSmeter/benchmark-causes.sh | 164 ++++++++++++++++++ frameworks/SPASSmeter/lib/config.xml | 1 - ...ss-meter-rt-mod.jar => spass-meter-rt.jar} | Bin 1365280 -> 1365396 bytes ...ss-meter-rt-mod.jar => spass-meter-rt.jar} | Bin 539274 -> 539390 bytes 4 files changed, 164 insertions(+), 1 deletion(-) create mode 100644 frameworks/SPASSmeter/benchmark-causes.sh rename frameworks/SPASSmeter/lib/linux/{spass-meter-rt-mod.jar => spass-meter-rt.jar} (99%) rename frameworks/SPASSmeter/lib/win/{spass-meter-rt-mod.jar => spass-meter-rt.jar} (98%) diff --git a/frameworks/SPASSmeter/benchmark-causes.sh b/frameworks/SPASSmeter/benchmark-causes.sh new file mode 100644 index 0000000..8301d7d --- /dev/null +++ b/frameworks/SPASSmeter/benchmark-causes.sh @@ -0,0 +1,164 @@ +#!/bin/bash +# This file is configured for linux instead of solaris!!! + +JAVABIN="" + +RSCRIPTDIR=r/ +BASEDIR=./ +RESULTSDIR="${BASEDIR}tmp/results-spassmeter/" + +SLEEPTIME=30 ## 30 +NUM_LOOPS=10 ## 10 +THREADS=1 ## 1 +RECURSIONDEPTH=10 ## 10 +TOTALCALLS=2000000 ## 2000000 +METHODTIME=0 ## 500000 + +#MOREPARAMS="--quickstart" +MOREPARAMS="--application mooBench.monitoredApplication.MonitoredClassSimple ${MOREPARAMS}" + +TIME=`expr ${METHODTIME} \* ${TOTALCALLS} / 1000000000 \* 4 \* ${RECURSIONDEPTH} \* ${NUM_LOOPS} + ${SLEEPTIME} \* 4 \* ${NUM_LOOPS} \* ${RECURSIONDEPTH} + 50 \* ${TOTALCALLS} / 1000000000 \* 4 \* ${RECURSIONDEPTH} \* ${NUM_LOOPS} ` +echo "Experiment will take circa ${TIME} seconds." + +echo "Removing and recreating '$RESULTSDIR'" +(rm -rf ${RESULTSDIR}) && mkdir ${RESULTSDIR} +#mkdir ${RESULTSDIR}stat/ + +# Clear spassmeter.log and initialize logging +rm -f ${BASEDIR}spassmeter.log +touch ${BASEDIR}spassmeter.log + +RAWFN="${RESULTSDIR}raw" + +JAVAARGS="-server" +JAVAARGS="${JAVAARGS} -d64" +JAVAARGS="${JAVAARGS} -Xms1G -Xmx4G" +JAVAARGS="${JAVAARGS} -verbose:gc -XX:+PrintCompilation" +#JAVAARGS="${JAVAARGS} -XX:+PrintInlining" +#JAVAARGS="${JAVAARGS} -XX:+UnlockDiagnosticVMOptions -XX:+LogCompilation" +#JAVAARGS="${JAVAARGS} -Djava.compiler=NONE" +JAR="-jar MooBench.jar" + +JAVAARGS_NOINSTR="${JAVAARGS}" +JAVAARGS_LTW="${JAVAARGS} -javaagent:${BASEDIR}lib/linux/spass-meter-ia.jar=xmlconfig=${BASEDIR}lib/config.xml,out=${RESULTSDIR}spassmeter.txt,tcp=localhost:6002" + +SERVER="-server -d64 -Xms1G -Xmx4G -classpath ${BASEDIR}lib/linux/spass-meter-ant.jar de.uni_hildesheim.sse.monitoring.runtime.recordingServer.TCPRecordingServer baseDir=. port=6002" + +## Write configuration +uname -a >${RESULTSDIR}configuration.txt +${JAVABIN}java ${JAVAARGS} -version 2>>${RESULTSDIR}configuration.txt +echo "JAVAARGS: ${JAVAARGS}" >>${RESULTSDIR}configuration.txt +echo "" >>${RESULTSDIR}configuration.txt +echo "Runtime: circa ${TIME} seconds" >>${RESULTSDIR}configuration.txt +echo "" >>${RESULTSDIR}configuration.txt +echo "SLEEPTIME=${SLEEPTIME}" >>${RESULTSDIR}configuration.txt +echo "NUM_LOOPS=${NUM_LOOPS}" >>${RESULTSDIR}configuration.txt +echo "TOTALCALLS=${TOTALCALLS}" >>${RESULTSDIR}configuration.txt +echo "METHODTIME=${METHODTIME}" >>${RESULTSDIR}configuration.txt +echo "THREADS=${THREADS}" >>${RESULTSDIR}configuration.txt +echo "RECURSIONDEPTH=${RECURSIONDEPTH}" >>${RESULTSDIR}configuration.txt +sync + +## Execute Benchmark +for ((i=1;i<=${NUM_LOOPS};i+=1)); do + j=${RECURSIONDEPTH} + k=0 + echo "## Starting iteration ${i}/${NUM_LOOPS}" + echo "## Starting iteration ${i}/${NUM_LOOPS}" >>${BASEDIR}spassmeter.log + + # No instrumentation + k=`expr ${k} + 1` + echo " # ${i}.${j}.${k} No instrumentation" + echo " # ${i}.${j}.${k} No instrumentation" >>${BASEDIR}spassmeter.log + #sar -o ${RESULTSDIR}stat/sar-${i}-${j}-${k}.data 5 2000 1>/dev/null 2>&1 & + ${JAVABIN}java ${JAVAARGS_NOINSTR} ${JAR} \ + --output-filename ${RAWFN}-${i}-${j}-${k}.csv \ + --totalcalls ${TOTALCALLS} \ + --methodtime ${METHODTIME} \ + --totalthreads ${THREADS} \ + --recursiondepth ${j} \ + ${MOREPARAMS} + #kill %sar + [ -f ${BASEDIR}hotspot.log ] && mv ${BASEDIR}hotspot.log ${RESULTSDIR}hotspot-${i}-${j}-${k}.log + echo >>${BASEDIR}spassmeter.log + echo >>${BASEDIR}spassmeter.log + sync + sleep ${SLEEPTIME} + + # SPASSmeter Javassist Instrumentation + k=`expr ${k} + 1` + echo " # ${i}.${j}.${k} SPASSmeter Javassist Instrumentation" + echo " # ${i}.${j}.${k} SPASSmeter Javassist Instrumentation" >>${BASEDIR}spassmeter.log + #sar -o ${RESULTSDIR}stat/sar-${i}-${j}-${k}.data 5 2000 1>/dev/null 2>&1 & + ${JAVABIN}java ${SERVER} 1>>server.out 2>&1 & + ${JAVABIN}java ${JAVAARGS_LTW},mainDefault=NONE -DSpassmeterNoWriter=true ${JAR} -f \ + --output-filename ${RAWFN}-${i}-${j}-${k}.csv \ + --totalcalls ${TOTALCALLS} \ + --methodtime ${METHODTIME} \ + --totalthreads ${THREADS} \ + --recursiondepth ${j} \ + ${MOREPARAMS} + kill -9 $! + #kill %sar + [ -f ${BASEDIR}hotspot.log ] && mv ${BASEDIR}hotspot.log ${RESULTSDIR}hotspot-${i}-${j}-${k}.log + echo >>${BASEDIR}spassmeter.log + echo >>${BASEDIR}spassmeter.log + sync + sleep ${SLEEPTIME} + + # SPASSmeter Javassist Collecting + k=`expr ${k} + 1` + echo " # ${i}.${j}.${k} SPASSmeter Javassist Collecting" + echo " # ${i}.${j}.${k} SPASSmeter Javassist Collecting" >>${BASEDIR}spassmeter.log + #sar -o ${RESULTSDIR}stat/sar-${i}-${j}-${k}.data 5 2000 1>/dev/null 2>&1 & + ${JAVABIN}java ${SERVER} 1>>server.out 2>&1 & + ${JAVABIN}java ${JAVAARGS_LTW} -DSpassmeterNoWriter=true ${JAR} -f \ + --output-filename ${RAWFN}-${i}-${j}-${k}.csv \ + --totalcalls ${TOTALCALLS} \ + --methodtime ${METHODTIME} \ + --totalthreads ${THREADS} \ + --recursiondepth ${j} \ + ${MOREPARAMS} + kill -9 $! + #kill %sar + [ -f ${BASEDIR}hotspot.log ] && mv ${BASEDIR}hotspot.log ${RESULTSDIR}hotspot-${i}-${j}-${k}.log + echo >>${BASEDIR}spassmeter.log + echo >>${BASEDIR}spassmeter.log + sync + sleep ${SLEEPTIME} + + # SPASSmeter Javassist Writing + k=`expr ${k} + 1` + echo " # ${i}.${j}.${k} SPASSmeter Javassist Writing" + echo " # ${i}.${j}.${k} SPASSmeter Javassist Writing" >>${BASEDIR}spassmeter.log + #sar -o ${RESULTSDIR}stat/sar-${i}-${j}-${k}.data 5 2000 1>/dev/null 2>&1 & + ${JAVABIN}java ${SERVER} 1>>server.out 2>&1 & + ${JAVABIN}java ${JAVAARGS_LTW} -DSpassmeterNoWriter=fals ${JAR} -f \ + --output-filename ${RAWFN}-${i}-${j}-${k}.csv \ + --totalcalls ${TOTALCALLS} \ + --methodtime ${METHODTIME} \ + --totalthreads ${THREADS} \ + --recursiondepth ${j} \ + ${MOREPARAMS} + kill -9 $! + #kill %sar + [ -f ${BASEDIR}hotspot.log ] && mv ${BASEDIR}hotspot.log ${RESULTSDIR}hotspot-${i}-${j}-${k}.log + echo >>${BASEDIR}spassmeter.log + echo >>${BASEDIR}spassmeter.log + sync + sleep ${SLEEPTIME} + + +done +#zip -jqr ${RESULTSDIR}stat.zip ${RESULTSDIR}stat +#rm -rf ${RESULTSDIR}stat/ +mv ${BASEDIR}spassmeter.log ${RESULTSDIR}spassmeter.log +[ -f ${RESULTSDIR}hotspot-1-${RECURSIONDEPTH}-1.log ] && grep "<task " ${RESULTSDIR}hotspot-*.log >${RESULTSDIR}log.log +[ -f ${BASEDIR}errorlog.txt ] && mv ${BASEDIR}errorlog.txt ${RESULTSDIR} + +## Clean up raw results +#gzip -qr ${RESULTSDIR}results.zip ${RAWFN}* +#rm -f ${RAWFN}* +[ -f ${BASEDIR}nohup.out ] && cp ${BASEDIR}nohup.out ${RESULTSDIR} +[ -f ${BASEDIR}server.out ] && mv ${BASEDIR}server.out ${RESULTSDIR} +[ -f ${BASEDIR}nohup.out ] && > ${BASEDIR}nohup.out diff --git a/frameworks/SPASSmeter/lib/config.xml b/frameworks/SPASSmeter/lib/config.xml index e1aeb1f..ce8dd68 100644 --- a/frameworks/SPASSmeter/lib/config.xml +++ b/frameworks/SPASSmeter/lib/config.xml @@ -4,7 +4,6 @@ <module name="MonitoredClassThreaded"> <behavior signature="monitoredMethod(long,int)"> <monitor id="monitoredMethod" /> - <Timer id="monitoredMethodTimer" state="START_FINISH" affectAt="DEFAULT" considerThreads="false" /> </behavior> </module> <module name="MonitoredClassSimple"> diff --git a/frameworks/SPASSmeter/lib/linux/spass-meter-rt-mod.jar b/frameworks/SPASSmeter/lib/linux/spass-meter-rt.jar similarity index 99% rename from frameworks/SPASSmeter/lib/linux/spass-meter-rt-mod.jar rename to frameworks/SPASSmeter/lib/linux/spass-meter-rt.jar index 9c90361f0798d84376215f2193444ac051141bc4..57c4e1d11f799a416cf7288d83231a67f667d68e 100644 GIT binary patch delta 4030 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 delta 3960 zcmbQTI(WgV;D#-XWheRae7CtIL~Xpt$j-nJCNNpRM}NA)D@M`jCr&a-)rVfb>>y&> zy>!ZhcSpO$wm<skc=3_ktyVU#ph+U-ATYO4vf^>0`47oI>`!u<M6SOyxw*Ic`>UI~ zx7U9B_A!{@?MDY^!^Xf&$<xu#dU|I1dYdbs{b_i8>c*ejQmeKlM-?ae-TQRrr_r+$ zQ{FD|^sMT8c+zrNNpkY<eyPWkm)3u7+~wlT*?985%GUQf(<e_cFIc!`&-$m_Q;ObR zv3bcE;&aASOv=!^YU2|BE^d+SpJP^vu9;Dm)9_GI`E#7!`@ja1XUBK$Z}&8=nrMEj zW{*SXzp|(-4ebd()K}X}%}`ly=-#$)@t(d*9PNQJqE}Z;I`HB}eW*~rogGi3meney zdYu5h)aYqGm2W3siqw#8{KR>AlJcj|>7MCp47IgcwN&3snJAlYv20eo!n6-Y%d`!i z-Ou^WC-G=$pmeF}6+wv)w>P~!l2hzAPsrzX*H`^HFITkxVp_OJ@Z`o?_b>7q1~0zn z{_DK6qm8ZST6h81<sWWVQj0mAt=+3i3Oe3aO*5>IH+pvQ8RLmfY^5r;OSRUOnOqih zEp9B>kUZsWh252|Lmdm29&*%f%(|FwE^aCxKkH=9;>9XnqU>?!L#%JTv{^07QW9R} zS*;`cQ7}%)t8D8%Pxthag�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 IFfcFx02%?96951J diff --git a/frameworks/SPASSmeter/lib/win/spass-meter-rt-mod.jar b/frameworks/SPASSmeter/lib/win/spass-meter-rt.jar similarity index 98% rename from frameworks/SPASSmeter/lib/win/spass-meter-rt-mod.jar rename to frameworks/SPASSmeter/lib/win/spass-meter-rt.jar index a4aee236d16078d8d7853fc250546198d3b009b4..f45b55cdcb301eaa00ac899edd671199a5fec188 100644 GIT binary patch delta 4151 zcmeDBs_^ftLc<ouvXgve_1j%E`GtO!vNJG<2u>F8(Vu?7j!|SfHzS8+{o07DyDmEj z{1f-qJb1U;`smsn-WQvzGsHQjEK$*X2L?rlS<632>|y?tAJk=i|K~2V&5w<(E%oo) zRxmAKotJ$=-9SZivE=DFCU<>Qms-cp+Pr9;_TtSsr@!PJ-?GegZqL)1n^Ue#<h<?q zN#%SokH4SsQfb+H$tMi{M_Apgzx-2*i=*eS`l`FjcHB|f6IZ<CX{~Skf{05cy_%Yq zrwnc5L<EvqxptN%E&Iaabu3+?xMzjx-i&$mBEl!~(>Yd(IQUrKy8NN%prroXj~<~? zo0In3zqll4ZfErVgC31cwr`eP35Zen=fA3EidFxPV<wVrhEuKtvQ$a@42)WPild%q z?f>|hN2Gdq7S3^4xo6A6U7MGv&vi8GJ!;v*wPMLarL#|NE2T~-DZlOKdH7PGWGKs_ z%S)!)3Ti~#&pRBPbHe;uLQWz_$mKwR)<ZF_C082!wyWfvp2WG{bzaFc5BCKXceXrP zaAu9>CCPPvTst3?9rEZkkqLggxt(>-%VpXIZ|d*oe3<L8B)t1srCZW72j#b)wR(PK ztXSCSaQ^-?*QLv5T{c>haVu=g@#ogEy%!=BuH*;Y`;gaM^+o8#-``e$TJn6HgQMQB zHsA~Xk!Ce(F{`hyeBi@<+g?W=)48?5=P%oRE3dm5OBb8oy0H3Suj01HKNauk_o!to zf3$wD!_M~=JL}_{C!RWMC@bakv(bF=)!uVfyB4f&c;}^mUe3?;&l#<N`7gNc#k%u< zS@I#}du0=6$cp<4)9d1w#3g=li|4InvHHL5<FXsu#Q(l{cdswE@{-r97w!K_+B0{~ zOH|F6x^DmbzV|_2bS17E3N+6!=vp^<=Fv%4=2sm#tGQ3{c$?;bfqGeI!yYdy9=GY0 z*UrkG5t*Ua`^5dP_O<`}e(}0#sU0ru3GnG+UHJFornbO(q1DB*%Cc`YgNtS@<a+$P zhAWxpSZ2b)obR`v)XZkN-hSTSTlTSGqZR)v)0hQ^<!5~po*BV0S)!kJ?wXC#ZH7W^ zT`p1~{|<Q7pMPupHG4^$O6}MB#m5zTSe9v3wyk8Dv2L-!p;PY0C1+f`7CeXv^<rIh z?f)a&pSM=;In9;0`c%XO#+MbXhSKZU#EuEgKWQ@mp^^8;1gWWK1!bH(?Jr$2a9{A} zdREDKjbIDKGs)XnMU|9fkC!RQDkY|DaLC;7fnBs_$)Sif$(++ZJvF|RnR!vk*RI}O z)+UuLyK;@=ANHQ)t|LXV+99@Fm1PV($)eXXB6I_OMTf3<7Nt6AT9~`0cFWf_7yhoX zbUWqawrul^s{y7di~D@{T@}*2JykJBaK&AHD~r{4W7-;eGz4zC?s;h>Wb;Q>Niiom z@mI@D#YKt7-R<jFE#CV~H6?0lB=7DQM`TLsTTCx+dLFfA<^08O1XuhMZCvoGwr|UO z<I>-}=NKczL#K+LNZ+lq>3)AsnSRh#HTy}EIIcdn7Y+JqzK-jJ)W>)asne}D)EzhT zpYz<OD6beV_D<<CulCGIb^2-({%j9h8t%1<>6KgiUjeb;x8WA*(#Fr`9O$V}{PnqR zQ(1icewq5i26_)BwRJO1{@404KV#M7O;xkJKdpT;{mH#KS!#dS96}eYwpzDxy4jQP z*>%&FKiReL@iHw())=)MiS)wg)St49@9*FFRLor)=iKgJ{$}T@>7VX~1h54r{t^Cu z-ypO{abkM<oR&9dzoZA%FTb0;YKh1S8=VJ7b|vjnQ+=Bjxvl>B?W=!3?w*>k`~GRe zn3pcS{y#1*2sI5}wtUygnzW#;c9C_mdt9PKWz6>a^-posS`z<fbw*P5nJ+9qw3kYy zt^2gH&+F`~#E*(jwE_h?r(&btTDnWwxok8n4}7HOWvUbUP43ivx2tX21HLkBX)6!> zyQ_Y)+Ho(tt6@tHn$1y9t-mm9ZjE$^yY&?%7ycIu&0ZC(lb*9jJtD(SMgD#2&ga^_ zP5ZX2&tDKXN619-@(aF2f41)F-nRW>BU6dS)sK8uE04;SNLMiLja$Gd$o9rPFi-0K z!3UdH9BAJ2SL3IE@^O=WjTe`y-8=fEamjRv%Rls<<oaa0FkOCkAg6+T^Eszu_4x{a z1!fv9eRl6?O<Y_F`{{QHPa}B(CIr3yQ#!rkK<VMgEmA)|9!iVL_;a(>%Q7f>ze1@j z>&oyh{!eA~as6}u?U`L)T_ACM!}a_24`gnXvS}5*X=QrR{ON@|H($V8g;_}ox;7HB zhAn451Z=B6Y`{?|aj4S5Ezu}??Mn&wsK@m$&vHI75tKIQtWleMS>%(~1B*#dOhow& zdDkcWs*`%=e)RR4`CJo@)tR&@oS$dW(0sx@>uEv9ch;A!JFE^}m8*KM(N|b{r(I6{ z-r+Z18u`J;E<~4H42VD6Y4kqu<oDfD+xjnVC~j!G`(CpBXT^!7Qs4HuAC<XuuSn#n zh~MNllJ%-${^x%+R?Wy3)zWQRkQ20sr?>W>Mwa&ZRZnGOPFDT=6)7V9Lm>UQ$&&B+ zwtM}gq(axtHZC>Ika=Dh(;yUa=0mL4kD@Dwx#~Ww`F2*Aa|i3QkKyHo{7n`Q9dhF% z|M@3twT8uC|Ni$zT|@hvZo!X&_5H^kcT_Yjx8c?f?fA~Z!)nLS{_p~0`@;)N?GG<7 zw?DkV(*E!QYx~0sY}+4RU_Y&oR)0_3#Ze|!`GCQ`zwA8Yt>Wls8?s>ZbT>v09j4HW z(;Yvv+fTQ-$S5#9OPhmt`UOS~M<%Iz5aA#uj(DaAk06`_FBw^;pMJzBGX32nc9H3F z%p6usQ=cNqH9TeHoX&9>BBwC@7Bhzw)6JJ~1^m;uKZnUxuy9B*MZE{fnM^;y!jZ+~ z^$EhsVC9HpGW-eQH2h(dn(ijep)mai3x~q=KsF93rX_#iathP=BsoMNa@Fiie7q_Q z5YWKD!0>Ro06WJ#CR48Ig6tgb)4#KGgfN}v1#wKL|FdFZo4$^hi3{Q+OHK}j>Bl%Y zq!_<Wf5^cxiAm8Ku1;k7K28olCNEcrh`KA2$n={R*+r&jb8%QP&2fVW-{ImYWxDGD z=O|9U?ZLz|eJeMIAJbVMxUk4{KOT+{rhlOjk)Ajv!Rc>8nM9}m=i%^Uniqp4+!Mnj zG`;&CyU6t2yc||c>*FADI(!@rOgj@HoSrx)f$5+5I6|0$azP^6(--73u}!by=kQ~i zj}VcZ&L_YT%5*j#qGo~sM-$VAA_!+eK9l71IYmqYkVvf&<gjAODMga|BghfYw7C*4 zA~Ah|5Jw2p$2PbK-*g304xZ`v+L+j<>q&8lOkXX+p)kEnm_v$5r4wD%N&yaihypbc z4k;$C9#jSV(;N0O@j~3PT7<)j>0%$Mf@~(~$*3aS(>WwLq^7?X<*;H}vH&i}K7GA7 z2lw>O1xzB-|FUz4PVW`tuw>e|994nTbP;imbfz_{P=)iDChUcauuTt;;3#4;KZqnE zaF9t7l=%FZDvlrt_e*lbGOauX5mC6u#5-M0iX)7P`z(^kHjqgDc_fke^GrO`W!X4H zrl(1BSTUJiMUuNE&5^)ld=p6|yp&03I<F9i$TS%ah3UIwIHZ_-@4@ATL9T*GdB}1| zF<pKSkpd@-HSd{(AW`He$DuI&Hb}v$PpAsGr}uqgVxPVb6p?;%99B%TzM?Cr`wB}g zU}L!CIi#3Q{6JO31&I}~g4rMiEB}ENOygr_pWdLr!8yI>9}~~?fASoDOjV52FDi2w zfrMk35;;H|)9DU^%<R*p6*<C~thtdy)`LWJ`H)0v_A&`V63l5u4u$C*N*q#5$%1eN zyx;(t4wjQr=8$3v7YE7NPq!0i2HP(Jk=v@wA;oxU`UPc<DNGOKK}yV~?~`Yih8V4{ z!J#nywF-w6Q?(LY4(dm++%rRFzUlp{96U@uMj!=-)6c1LL^3Tfg>a(OIFgwvEFhc@ zY8>&5)29chbF?tN08wVsxivWAn6hoB2dZ<JPG11x2s*+!oYU<zIU<-Axxz&_reD?M z2w{?mfQTe$ailVRi3FK0G5te6GyC*sS{!~%`cX(C-y)esK_$E&Q)L{IutOZP<aB`x z?7Y+eYjZd<zM1Z*!%@Pdn+R9JJN=FhM*`FJ6eN))Da<m{>vcK&m<$Tw!m85~j5v6w zOX_hrGHob<2p5zvt3ibSYjdzqU#G`m#k8RUDp$d*fh1?A&tb(RS`Cr=kk8CJeZD?N zHWOn#lE}F_W(g!M7xXz4rq>#9NHN`RfvaMlzQcecnaQgUBC=pIGskpWLymN&oBc>4 z#|$|VnC?%6h&UK=<S{*%4B;%8%&al}gAs=x)BP!M5sv8z#vJKP?$eM&_@^<;AUQ_T zgu{x-aypWNQWK7Nrt%p`A`50QvrqqP!jZsqV-~8gG?Gc{OgXHWlII{P(4GVHx4s#N zBje@ig=QQ*OlAv^l*pTNq%nmpL=ur(h@?q<`e$<vDW+44APT@~M9+dFok?~zstDWk vJr*1(OgU?&D_L?xGnP)Tv*d_pd^i1`B}WvK=<(@RRvcbzYmT!sFfafB&4_@( delta 3651 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 S9-F?-io=V|;y6140|Nm4YQO{l -- GitLab