From f9be8b89acc96509b8bbd6b4eb60b8c878f49c54 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Wed, 13 Feb 2019 09:37:31 +0100 Subject: [PATCH] added functionality to set additional json header key value pairs for prototype ctb, server fixed for eiger compile from ctb integration --- .../bin/eigerDetectorServer_refactor | Bin 280179 -> 284275 bytes .../eigerDetectorServer/gitInfo.txt | 8 +-- .../eigerDetectorServer/gitInfoEiger.h | 6 +- .../slsDetectorServer_funcs.c | 28 +++++--- .../multiSlsDetector/multiSlsDetector.cpp | 23 +++++++ .../multiSlsDetector/multiSlsDetector.h | 23 ++++++- .../slsDetector/slsDetector.cpp | 63 +++++++++++++++++- slsDetectorSoftware/slsDetector/slsDetector.h | 17 +++++ .../slsDetector/slsDetectorCommand.cpp | 14 ++++ 9 files changed, 161 insertions(+), 21 deletions(-) diff --git a/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_refactor b/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_refactor index 309c2a2b55c612bca4ad151ff69e6269705ca922..74a53b486a67d2e65414ed3fe30f2450b1adea21 100755 GIT binary patch delta 59963 zcmb@veSA$<_CJ31Nswr0kmp2l5fKD89x5S`cxta+4?(n4a1j+n1woLwHx*AU6*dmj zAe5GtHWH65ZM4kLGG&Ho%~0`a&FH60<6EXWL+|gs_Sq-*+(c*Q^LqXM;O?{b-fOMB z_S$Q$z4ksQKdx@}f6gc{|eiV|j&s}v>ND4$W32%~&KQ6i1bJEI)0 zDDg(wswnM^a+0ESFv{tm-_dxmDN2G-&QO%jMtQWNbTP^fMX?&?97Rbq%DIZt)hOpH zN;jkIQk3pSd8MNCFv=y0@|0elldcW= z-vWrQZ4$~3^S7JCv@Q4R{dIXjT6LhW^IAIjaNK-H>9n7_|kLtVZW z9oGM0fsaqVYr7I)^LeWoI0}$$gFNuvKid@Lo`hRX@Ed?%mGA*3_*oki`;@F0ZK^nc z4*Mj0h6%m}@C_2~GQo=gFOcvJCipbKvn70w2|gU~!30moXpfsJl2OrJcDP`Iw*ov$ z!oM}a{dr*b=hWRyt7*hieSF?LpjrJ`oH{U`UpSn|TQ+OSDtPZ^Z6;O(I#(%5`Zk@* zM907!AoDHohe-V^{N!W@>I4Sv0Wm4wf#o~Wl%!GZefy-Q2l^(xbo5eT_SpP_20r

vqpNhpg^k}?(FJ|tM1&yKqUN4pN_8xNd*1-?G{7)>B>kE1%07c^VUIAmGTOgf^?l6D)00G6V+YIM-S{ z&yMpST6Dwzk&%(kio8UN!UUsOYwJ2z3(?;W5GXwkJ|VjdJ{WVMlvD=_=;WRXBNU zeqk)0p@TM`?R;%;jI$!228Y?oDQsiUPqjc(SDi>9{Y$C>^NmEyA_z3l6{7^|+TLKZ zQN~P`*?hLOqM42#6ns|#9Jo>D9I+K4J+Mz+|dGz5e!rF9r zCaAuxmN2uec08TO9bpkql}^Muyac9ItK;dFcK1&wF(9%Iv|cTC_di-ejV(Y9qo?ZD z*70-+FQ=}s@M^K_T86H((N!#4bd9&W?_WgMc$?1~-=STWY`159c*Ik0oCHL-ppK`@ z(X$nLS|w2{dKRIl6+L0fRo%!ro<7PmsOxMjt#2i=D)4s^U6W+jBy>$g*Cccugm%Ye zyED9uy23uQ4H5*?^bbeUDItozxf&MX2^Ecyaru=a}gk#T9VRjbWKE8 zo9t>s*LCP>L)X1%7bV->|N$9)iIe=$awBW}s_dbj?85F_5`}wrBLV z&-kM4A+*huZ8Om}7;Q7rmcJhn+42Z29O%xLL8N~LO6S}Hj4u@nD|y;+{(67*l8IIc=MhA&?Yjn zIax5b8zbfbwEy~Cg= zovYhq2}}#;fA4}TESz=zI#sSxiEpRy~%*XkRR3!F;f_ar+7xKH1Oc zLOptkgenADcDUN+vuuhe!|6G#k!o>YUfnyfs~(Kakm9AKZfJ0hg!$Rs?tvyacU#8} zt)1@_Q6n5!1^EnyNs2eMHZU8Lq#9n`)Fyyut&C{-Ls4B+h#XfF%&NdoC&sX&+?^Qt zU#XhCnx}V-X0PxGU1MMooLxschs4+SBNArzBg)_ePo(=wC#*gx)xoA1{*~Zb8>kF+ zc-j{|0{kji#(rXOo(X=_6!Q;WX{tDn4*O(>QWN|T;2R{o+yvhWc!7kUGQpPto-N^D zncy=4A58ExaCF;LF$xvk^$tTstU$}c=2MgkIB5Y!FvPUWDdJCde_kzWDMNnec|GJG zGMZoL-cNNNAgjo`^ytl&@aa9e3>>oA=HuLNtXs?@sR?||5Uj*s7Gfnv!FV(P$tXn7 zSFjSJ(7p-Um;*n4y+^x0jo+cc@5X*3w(U6Nv&*RH7q z$xb$RBt;|_Afl0T>lo@nP`(@T>n`Qj-R}Np1IVvCC?cW}a;`;Mned7sLM>Yhq}XN23;F17z%jhh8z-UG)+-fwO4#;&#`VQgn`~$;uT-n%OTtG4^!Hy6*;`> zek6CNKm*Ag3WsWSRq!sUUAk7}3Y%Z5L-lQmfF-AIRWb>UTtK<07K&gpa(GEEl;%dh$?Z?@>!}@^3g=|h1aQ|u3wNZo;PyT(oWl>+*Fp*N(!vZ9M->QQ zqBAz2d{CAtb+AX4kD^>E%jZxok>#r>7t8W(lu68l=YegyqRh}AhSLa0TBsNvhB6JA z$_Xfw?5UiNa*8aEM%gOM4wPeMxd3GnEVVB|IY5?oY3ZF=7zQ5a9O0@zXbJNg^zeJ= zFZmnci?ZZzL?FtNzY!LcC4VD`SIOUqB$Oq8BWx&3{zhclLTecuL5xcVN8}m|w&2gC zw{SjpwLX&)=EdZQUD($g)dx8O31hjjQbwFXxlF>pMR|i>9tovZSIRQ1tXd$;u_))t zvK970&6W=-s2DBF87L2yWiYR%%W^Kt-DTN@a=a{K2Gl57hN`H6vV0t6Us=8YqxL|S zt5Lp9Wv5jc3GuUPy&@Cp!7j-%)PtRoWpFLGW=dvvl*=U?B4@i~ISb{@vYdnRYFW-h z*(J-xDCf!Y29%vS@?jqyvSj%v${DhJ2IT>={1wVcvV05W1id^;LD?e9#B`7>Lr<8W zET=;S9?Ehi$~Ah~IVu|u-^z-7l)sYYl_;N+UdO^9Y@$PVe=9bPVx@B!ZN zS;mM-F-&-JH_P^ez2UP{Bs_!QSn$T&&-+$ZkhYl+EeMeC(cbWdw8q#1B zo+Srm`)m{3$&%X_mCA}7Qw89!q)Ye=Z}`&H5}xY~FV;ocQOWa$FVB~9Otl1J#5)y1SR?hSv- zA>jwT;d>G!{AeAx(@?tO-W7Wdkyd%b-?2(Wr@Z0s+9dppH+)~2grD<<@0a+U$_4L= z_Y4A;>cAgJL|=Ks->;JJtKRVPl@ea<4X->U;opia7r$s5m#U{Rx>Y?d24w`C6m}y| zX{57}Gdg<7dFn@*k)N?p;6-X<`k=^$(??-{X3;FySdtiL%b)7b$)9*+`$fwp&X46k*E0G2HfijzZHlLTy@(XRd^Qu;UJmcBMNH2_i zwx_d#lIF3L0KslIK_@agz77!!h=jS^f>1a-P`qrH@$2ngqS&8KD!|YWH@zA9`#_zc zY3Gx9Gy4#5GQs}5&PjsgBt=rlD?+GWg#C6=nqn!Mpv0yEYf?__@Z$@o;)G-6Wb9n0 z-2`VzvR~Q%p`X}cTVn*Pf8XKF>K&%DnzM?#Vy!%VRwKT4NF#rJS3vol?L$Jtr{0AY z(D|7kIIy5Ym>9e3DF1wLn}MT+GLyczo~X!8b%6irI2o)xmB~5pk<^`&ARi#74%xoj zt$+>bjj6obkjZtZzIf-?sD3e|&G0b_VfEI+|0gn%sTN&zM0O! zi@g8P72X^qPC1sGhBHIO=N6qL;fPJq&zYv|NKW$&cnq9J4(qLs*~Lc>i)K^!f?@3% zj6s?to4+|sYnDy>@Pecm-vC-N1hr>$W7*u95vgWh;g*buK9lc23&JRaNc1R4hy?)Y zOg`_)v$%6~ezWfi-hd7gSCgiXsp9uCTC>SKbU61OMw3ZbOrqjn4xj2>-*}Rqf>6eM z#mh^BdEtot-VM}=W4LQ?9G^3CN-N5XMS(* zRcqM`L3CV*&dA95kkEr{%9`Q)*66OoD*`Z2Nl6ObY7pn>u{uXDSW>0#$+^S%bJj-C zcFFd?$oAc3`x(?exjn4on8>zc*Pvy(Z23sGw91zIOfCJ#4gpl0l72BJlD)vcAJY-m zMYg<6ElmbA0JbeCsoGDm`HbBm`@v>aZ^SyFY#*J!A=~%$eGCzX_5~a%EBhc0aWYDG z1Z>L6M9O~v79_YTRdNWAFy4(3nREbcLmh=tr+(Tbh`l z5}>?nnK5q=R}f7E4;tIG@hc608o9Kw zc|2omMDUo|z*2A8onuE%6e*DzwS$1^!Wp;_V4`L0K@2p>Y{o#}&%^&1lR5jE%$eyV z@*0^loJ5Z1-Le*Vt1Ww;f1WitBx`ehZOz)u2aKEFHEXrLmcGAPM^h<%Pq#IKNB|JT zO*!~Lp6iI<4aeKOD24g=5K>Ua<#X3tUHLoX2eKZ#W_;XGV}#>UFv6(Ej4(i-q35=G zX6P?;+7u|&B+%}@au-bCEO699UiEeaUoyd)cxc1S6Jk0pWVPl^9c{yt4PG%(%&k*f zgUrX1BKwSBl8hh741NrmTR=5WqP3#jQkJnyb`$@_vx*a6WZ% zJ2^h9GVW3;7Bm@&?UN%DhmR4g2w(nXu=nb@JP-Y`dNLjfR&deOJQ@ zo|e-S|{fGQY0PG(=8bQjcDgxyyLeW++E7zcsCnqi_0bBC)E6i*xsK z*GqL83>vh>?moSjged2-%BHMsU#o$XEpI1==1UoKm!E!s2@ANHhMQ;^zd;N|tjDhW zyIDP;;2%zpR0lQS8Mz_+@6+oTr9rkKcK0dIWvy)r(oC;E`Y#BsmIM!a2$GHY*NjN@ znbU$;=b3ehJ=4VQ{#2}VIXWVC;{QNQ?)40V*8Am1_334T*vl{1A=Y%@c~6kMHXO2U z%^S|D(`eAZ9(MQ1f!^|d_4I$i(Z7**Om1Y80V1A|kw1SXx30_U&#&i($`b~wurq5; zuiqQOBW7oMYj@-R!6ay_G6CoPvu8oVesj9Ae!TabNc{i&oHW(Pk8hqc3@7}z<_z_y z{q5BHYM<<__I*8SKQ}U@FVvouVUhb$P~o~xLEQ_NdFk9X>;SKtJG8OBqPn>z#PhJc zICafUo}L%29%#lLc@gTGz4Vk=e!1Y)Hu;A5Xbb2p{wCkK`}=(7Z-2}$Y-i6ew2efB z-#1)n4OZOed66M$_p!3ly-AOm#~lQDRV&yme>jcrnm58*{A!7%064|?#xx1O$pI(0ZtU(l{^ zCvViJg!4t7Kcz?pa1>c$+(CBtv1YYxx3Pyw4!7H;48P0wEQoeG^6E!V5+=_*V4=k6 zIJ)d6G_XQpL;~k<#ASX^+nxIq*S;7h8%8T87aUz9b)R(N8V6V|O zmT6N87V^RQouPzsdFN4dM4LmnOxm~Tfw3v3v?>k-xP=dYKR+@qg#t90IyiY39>}yI zt{RSMgFEPbh1cZwY%tKKEZ)Ks7Dl{mn0iOLL}fPhiQZb!dyR>}Aa8H_@m>%>kkLDl z92Uy)V4ZH~8ajgOU`Mdun^1Qmd(ERwVCT1o*UnBUDapxHdWHxeLR5aWq7pNCxChT& zv;a3`ZY_#y?RW@zGrRi>+#ok^AtwgvO7#0F+`2dh*Bvt!n@Ok52xC|H(ZyYw?e`}9 z@fQAIaauEvRTu1hJc!#0x-|2cUmfbtR|0y?8^cFu`58dB)`70#eudAoE!zv@jlH*;m+;4dLGwwqtF1z>+w1=Of;INjr9#XDx|?`Ji|;+1b#w>3L@5$CorV zEr*X^4)Z534?BmAZOxKy&1QR(K0c0jcXnw)ibeNL>3(Ve&vo_>-a_qQ5n>G$w)ylJ z&d)ewg7!n0ex#^oM*roEYPF^oH6emd={u)q7YhASp1sSHTu-YL_Hmahq*ISXOrAv= zjX)!Hqpy#%l(!&9;A3HtEyP-CI<}qiN_b&gdp?Y7puV5zF5HBk zDmzBoPE*8ngtncCxVjbc!9|e`#F`b?r*IM;mV~|B#KEu#EzyY*e!dt4Y}k=PbV9;vp4rbdH|Wr~YfBhhx?keQ zt@A@(-p*=8SW23H^bS2k7_>puBf3(rJHf`qtO3N8_g%TJA~Gd|fqA8Dfl;qoT^XZo zK3xy2UmDS;LhP%p%Hf(+3+>?#i|mTcCy_FL827&KOe10fOI1YN)8T4#!jSeS@{AwaaQD(S-klm+htNvquIjdYW^qVck3}w}ZigS~ zl3@F&6$#Ale)kdIQyeGL5YUS(q9j+25&i}O2IZfKl!9@{H?bI+7i88Q&+7!%{eoMu z*EvLaOOu^ENO?=x$u6saYo(w?`yJ;Kwf8rEotT62WfR42n-taVJ~U9;NV@ri@m1~y za@fc&odg5Q;c6&&t@{9c3N#?dct^nQel1n#Ctyx=e2hVTx4qy{_n@@A={DW~YHN3I z)NPEuTa%Z9HnpPmkc^+6hOa>0Pzg)*Qi{$u%s6$kqwp17J3$8;ap&?nN!;X4q&$Wm zn3lskL(F(cMJd%FU^-9y`tp$tE0FF)@~(Pw6xN1s5>?|CXf?eD0W;xacW*gOGB8#~ zdMU~ApwJtn&r)Y1S3}eR;l%fIn;tV+2jpbwC%tmz3X=wXh!PWC&oFhEV$zcUo-rhv z|Ie$j-nOK5`Zd}~_C2`cwa~t;Xk%RBUm-^!1^79BEi52_q>s;2SVul4IEdgauqY9_JIAXXC{ z%0EpMW_Y)4ca!I?mK1X9R2|^ER`&}L6!Pm-jo}Yh#|;%#1$Cmk zZWni7wkt8(@!T~bA#vyJ?l(R0&NiRTHYImBFI^Myf)O)LEKh~$KnlqmGg`f|w-Y8u zchdW=L4iyc-``Dz=?Js=#GS@kjA z6r5QtpIo~Yg6AS7rff5Vg+;dco%6tmY;zp;W7ZzVc4{5)tgFQ{DFOX@pdTfOsh39*@?YkIl?nAo>gr?$xhG{>YYxU4Hc9xIW@ z0(ml!$J%__;@Y3}CJ$U2f;3CJwYKipjJ;lgk?tlMx^)!R94n+)pOi^1qAx;_ox_}z z&U)uEsF-rZdwYNia>TJG;JM;;kxkl+cKgvT0o;%i!qE3NLAwOB)BS@f5dz;)4D}Yi z0%GvwG3s&`@kDLrBvTMlCLK)GHG#iY64@_yoM2Ws*muZim|l(9LxG|dh8O39(@kq$t?Y#kzhR_kjiR@KA1tv7iB-&u#SWp^FI zA?cSfF1wz%EN>2CMBG$nA|1nd}M z#4ctt?G+Jp_<@XScdzs$5ruy2+^7%R$AQ=>un7Io*W;hJDP_7EOkPRpmLkj+xg}iF z6<2hN+9BSeb>{R_0?;vR9c&aBupq(}>0ON1V1S|?VxWDkJaq=dv?4;OHVq&ixUit# zpGf_UK%C^HE37t7XIiCGHwu-R6ZYh`r&GZxN`Vc6^FPdwK0WCm zGysHbAT$`Gpxj!W=~*u9g=blmEtEtD$c;+|_CVx{yr;!kP5Z=+XJz9s6NerJqR|h+ zw9qt6#pp?);`M2P6i9zYgTX8?=m3M+U~qJO2AAC-8Xg9>3#;OUV(v02P!5pI0H!yyktU*!Bh+^<3oFSl*0F44B}48A zE4frmfk!-B5Amw4p-9z!wY5*<$w!GJxbYj@vMrJw;x*Ij7~96d7j-^xRlrf!EBcjn z-qJ2D)Mr?EV0W)u#(lRx)mBd-nB5)Jay4N|v`juDWQO#@gzaOa$+!RJ4kTwXiCcz1 zV32N*KD2f0F+2se^y0~N&6}s+7+Qxt{o0HCXxXpuB$f(zsy2AqK7)=zp5PffItbpj zbn@m+Tch*VB3OuhZQuI5sm;gnu$?h2J@Ha0dEG6Yq?oSS-LLoHnLFbQF_E$KoX$|_ z12JVQwJhx%CRovqd9$)9TxX@(4#CQr^T-=_(tcjWT5#K2b@CT#;0?av&2}wMc#BEf ztMkM**xjq44{ttKdtjO!mI`&J1Jkr!k#T{m1UDka*+lz%QxahV?en4Mft|Q(*Nf5F znOO9+KQoqynDY%YAqEYMs40Ss|UWV8OpHx3)YJ8v8bM%6X-m|z)%qlDw@*vy8xg|3~U4f&P zdO=fTOb~*m1^(XMOMn$Y)3Q4VnnHNRJC?@Tr*tW7Z!3^3`?Kin6gF1=ExGnvSSx=82N5$PI}NZ$z8yFX5( z4TVUf=hhMF>iZt*zZuR~zZb~{J%)ILDLnA~c6ANKYQs=qI=8G6Gf-4ir*~Re7~3k8 zVYYC_9%X-Riih;(lcKll7<#wSu2-`lKCAr6I_t{kGA}D{7b~2R2hFQnbu?W1I?p{04bD%iiPa;Hy zgGH;hL|WfVuRIG(CY!UOJut!MsN!7Gz|^Q>K`mQT91dI)tBj^^%*c8iM=Zhi$A&ZP%XPiQNF)5wp6TRhJd=hLx z&dMOMY6|ATp?(i+ z!1BIWYJ$`C#;X$UdA(P4A2PiY`J(6jUe&!79rno%Uzrds1AK#o-!{Q#0$!lQrz$2m zUB}3laL?<#syh|%!34)UkyGPM9onLzyX=r+f;R!2vUM2Q)C>>&m-{^M@N?=fcj%qS zKI)^b`YVxBH{jDi@2OKSao3SJ^-%-9=SZ)X%XSxRLt>|p5<5x)g5UT8#U^msaQ@{! z5*abGt&y@R96vI@Fx8Gd6OsjN*{JnLBXFm6*wM%i#bR9&2Y@#-+M`_{<{*d??}bm} zl$9pRNJ5LP@PesPyZ;>8|U_0NNNL&2uh5~0oPeJ^(Qeh6CQs3_~ek69@byw zFFoX=PxOfnZ%Kx|AlfItcNrbFD^~hVt5U)zf2}s-2T#1*FmyLH(FPxe4)y=2n_5v0 zwF%*`e`HnfW9#ry$kWqlc5&!7J;kQpr&uQd3Ft7=QrJE>E``84+@B2&@%xV*qOCGL zJvohej(^mD^yN_>M}+)?d;yl(^mLjMnm%-C#s_~K(Q5htU=8$2u&VdOEExuW#m7$P zy_tx|=)7@&F0JWeq3gW;cv0s~v3c`$FHz_1{zOTQLqpi3a--W)Jq~33Zov95KwRg_Z__TrCGqQVo`N68zt?#u>hM%D7M9cJ2 zbRFP5${$ntgQ^$8EB2s?SXfKSC0>#W!V;rbCSt5UHG>@@je+giQFTTsuNU`BZ8;4k=%nevZ%hG|qW9oak5`)2qd=P~Ms$P>?W8fW@RBVK%j9KgNaM zyVo$M7SUdr;b$lak++srl%t(6Pf{I?@zS#OrF;&?Tb^p6>o79{3V5?qE!CPrZavl2 zIm3b*@kU5PD>?x0Wt0&-0vdP+o$=h-z`Clsb|U=cH%!I z@r<(#)w|+Ofc8Z(i{@L-wvVVNGf0DdE3uzwIYL)c{IuL}SnT@GLhugc?75sv$=EVG-WGZ}WKzwc?WQ$cKHt zR-GBet3QucZ|z@yt~0poa&9bvR-cP*c8hLs;Fy+C;xY_tmw$MUJ}2{+bN#7_<$SdI zx0yWsd`OdubHt4?+mp{fgI4dJ?~VWecK%4n%sus;&CEUg;P2xI+3(wRs36A8vBbZZ z1<&{*B)LL2Y8ZS`N4-A@0k1K|36#v^7J%h)uGr}fX zzl8%RT(a_R7sj$gzV<>I{{P|vMm&HAUF@KKgArfsh5E%8?fkc2bm#xP7|WwCSa_d5 zL}55%|A3D{CH%^80?bp(_qD(WBmdC6)Blb8C;u3#&dlTSe~eadOyRaaI)iJkNdmhb zsyb%g;#bk2`T&3U$N58EmY=k`aR^#Zr+j2kU|_0)F|QVzS{?3+#=4~t65kUOGl|`~ zt5HRX)V13Jre~q}$CqN%m+>W+OUpZ79|&YPzG$=`4PZE59u1^K#I$$1PDEg>u7~pt zmpiC0yLi>*5cT?H{?+BU=3noZ2!ag+Jn&Bu>eod);ZI%Fm&>_>o)US%pC&=J*Zx;`X2l0rF<5YoYt?qIw7&xCZaP5twC{M40R>a5l4|J+*r^GP22 z=eXv7o~ZX%&l>%C)}JHPKlkAIf1a<-y2oqK_R2*b^q08iS7z&N*_GP1gZ~ntUKv=K z^Oq4UxOT>b0g(%We{ppIr1#9VHX#+?qMNZ!zfHA}=gE!du4~avzic9^^fmM??ij@I z>-Soa)US0>bCY=B*AY$sRAlO2#cP)LOviY0Ga)z#@=Ka|+RT$6aaHM0H1n9AKZV1J zg$Y$E)lIv}Z1MNM{#4D)<9XLxH@h4R4c>*u@!$-bfCK#P>oMx(9{kMpXNi#;!IkmV zaZJrE;~6(1)Iav+Gj6n2a}V;88=ciZ+~HL>qD8ZA;{Ood{(p8izDT=ZSn}B!{Hy{lC3-t{rt zY*R1nKya{{7LOn#f`;E;=9Zfw9ljuCg8(i}ffrd#)rpqb-O;>G$cpBUn{jM3UvV?0 zdD<4k7zuoi*-8B9%{cY<=Xv!_@;2@M+7AB@`)eBhU;Ee4)Y-Ri*ORo(l>9hP+6H%a z{yP|O?9KJhh><$LRvraj<5Zo0^Vc?wD-Na#MVJF8@we!f=XDF9dtcnC*Eed0F4_O~ z4G4F+MdWAQnx)Q(=he5O)z9~@|8AQ)$HvRPiwOCQ-ebjO+#Aaf{{@L*RL{xc7ruMC z@#l2Pu3G8Q^1pZ-C?3n^=GdMGmzT`ytS() z<;+>hEw?*2IWrEOYezEncFb@+c*IFUfGdX4sheEBbH3Fz^6W;)iEbj0hT;JEclRNu zSeyF0pQY~&D2mbV;0RgSEBMEE+ORwPhue`DuKP|;_9O3qr(1*<9XhtGrNc|^L^u2G zqgphOV$mRhM!k(B>FwZ#Gzm}W$o?Pi`S*4qwT}O>-l5fh^bY)szdM;9ANGT@X~l6N z5q;{8V|{k#fi)e}IS+VBO|*In@jy*P>xxp$Db0%6;g*^@mg3GPb$qhD^d@uZQY#kt z>4Dx0{L|gKet){R()aEQsya8GJAUlY^kgd#pm-9tVQwDZ{9^~T3TE%eICX9nzx`u` zTD6<|-Fr%%`+%q4Ypqrd;@S6JS1ZD>hYZDa)Npz?(}-$Blq2JcuvDR@c@{lCUv<-) zn~w+T+~8_*`L!tSy8j+2>OVr;S5P=F^aR>}73M|W_JdDAnJxeUF@?K));~rL&r7nq zKc?)RX+52w>>bwAiSy7Cy2rjpVASPoILRDS{HBMWx-AvqXZ%kTe%gPERP!=<&QH+| zPqd}x_zsj+OCQMmw5m$x+sFu@zW9m4tRKYxPd>1tJoW*4=JWgq(G8CWgY5urnH|HO z_nZ0Hlz;Ir9;C59@+W^DseU;P0cLl;`RAr;-Uhzs=jg5IcDm^FO<)^Q`>bKO;IHJ1yl!0TDII#fuR=K%cHC`G9^DE*)(hNKmFNB|gx%#U{uL8F4~e1= z>KMbL(ik57jy^#a%&+__j!j$taHu-3if25GXm+%(F>xS<9qbXl_+jLrigMb!7EKV_ zM*Y+|r^38S%4$PQJub2o_D6~i-|425n|u!h*^|5c`ooSdRg|Sd#geBT3C#2l>{ZzD z*`Q>EBhly!`v57aWM&|&{mVaGv#Dr~QRYWmmOCbvHlsMV-Q z;;(!(U!C{W`d=cNA6_S?U^Fme3g#<3;g^W6ho{h>p~-S)=Ho=<2*pZtXPh=gLAZWQ z?kmWq9!^Hv23pM%4ELUYiBRXq@^imLJa_0c^e{e|j==@*gpT=2Du| zv z5ifT~H?I(hWt;NbnG(l7UhR%h4<67g<5>5NR`#+w|H8&H7NJ(&-FTdJRu@<{-lnJB zNBkIjk3}!Y!BwJpQY&dyKr0Vi2D8x016Q<5D*HXFIP#_sJEA)C3+e|466Td1Utr3D zzcXl$Oud@#H6%@EihsFu{=>&rdg1Y(<6cB$WJ26MPxq zQ4&#(2|iO~$M;Xsv*Y`M_3U{5K725+o#ymolUwKC)+gYX^K!Y<0Sbc2N1ZSsh^5}$ ztGPO|crC%7bsf4e2-!r{roKadz4kOUy;SEZ(X!A29%O`Y_yWak^5i9q7ATNyl&hc^ zI1;se{w%KPJBg&WlGqTf+Mk6qT!X8z;eU7aI*WPW)y0IhL^`@*{@R1VSs!YfC1#N;?u`G^gkx#NVXpx2=v;dx8 zAkj>7iv>@zcI?QJ?ewF*c}+VL$cCy5GqkW~ELweYo|e>%O>!>EsIRUP=B2I+O_TR# z50APooZ*?gH(P>*dtd?4^um=Ucmu$tx-K*w^6b20QrCqdy{N0%&dcZ^)peoikZ0!! zz&A(&UwH`Z+zohvgx@y7*8ncnb&=_iXXiY?4Ru{)I_23p4i(*XM2q50hz0^K)pe2S zkY{Hnp{_gI>grl{Sy$IZE}^dYlx3u|(s*;=0nnP}zEbgiu6XGETp6T4`x@T^CczpT zvwMh1Sncc9>JD+)t=8QLV_Qjv*0;bZ)TI)sBAHRsD+9fWRowC>RvG3YRvG3^tV~?^ z@FrGK<7r<}W2W^aT-I$&tSLT zd`wdFAuUr1voTKt1UcYDFsHo{%(S+ZzNwbAZvD=%Jgw5J#hmDA)=KU95Y~lNYAZrm zOp^+)no88DmA+cpRTh$586@Np9oWklR?#%C=6XGSF#)m{ZA2coQtKAV7PAWN{ZNL# zjbI{BQ6mkHFTHYukG{8si-lV)6(`flxPU4B`7P5ZOMiuW7{w1Bs=#gf%MAFy{7E4_ zZAchv)<>UqViW1|TOwTBs=pK^Q_r{ReB1pN#EZ<0&n+(*A+cAb;TK!glNqF1aE3D=f}V}>fU%5c^b6ZL&K z`w~x|MzAhTy!vbI2-Xn|-fxA^TlM~$`D+=GtTO=4NHzgIu1CVSRvc*&1q+JDo-J9I zPF@HCp?y)K+UK^O(%$9Gh)|nKjkg4bO6_+o*<}25#0Or(D@7(Y6DI*s53Ex)DAj^J z!?emHA4W5csT+oCnHKhXM8!SG^cSdftg!0R6ImULsx}4`R)XMS z{Rad4(7E_ReakIjUY2{&C666jKgDCY7nuy@`XQKDGBB{*i~UUPVd)Lay*SDQZ)vjJ zi>;;#GWF7OFCO55ue$^I21#JF2~L*2K*CL~WF1+0X}K4hBBga?=?%-hc!LQMnfmS$ z(H;|=OnsDuA2-2qhYH8=>qhC8yQG0`xeF9wx!1S=cj|Y0^`v(<4b4P_>08t+**4oEJ|e(HTIZ_N{jez^QwEppO|@_)xfPpTQ8$amj)GIBPBYPou3^%)2V21ZJ&(W_$A^W<$hP4i zMVx!3NdKjOl}#LR-08cVJ~PMTGhe_?mXnXW{b4oPm&Rfu@>xu#u6W>2>U?>Kpr zuUmx)I=UN|inHiGRznm%r0u6=^@5_p`SoJYlfL$1c09G|&0fRP`@P{;KGDAE&3fY} zCPh4rOkw@;r0Gwer--^nsiLlTs?g=RsjSPS!VEpn_Scr+mC^#FSV#+eOK*iEewqIr z#ug|ey(Hq_?*98RlBYi3g}HkFn|0oD`&NI;O`X42^X2=04ER!}eoqgzEX#tlwWB5e-p)YIGa;~^(q^~mSVNS{*c0`kUJyH#v zt|#jE`1CP7=3M-DJ-YN0Gq<=Oi^1%?q5pi?53^IL{nU?jiTI>ML#ulgy0Egec@V%Ms8VMy0<2e8%+bHi!9X&1s-a6?@&waNjkf9pz%(1)!sL}ERf zPx31*R_HX6yz!LrB;z`Hpinw(pcv#I2eRv}m&|~YA^&o%36zeknaooDWhN91Ig^=J zM3yk^_l>nqTiFv@z%$s1FL7z{&p-k*r)aikSXXt)9<4w;L!+Ky9YE=K&tR8~seT3# zBFwl=&|PZN<4F4XMEi^W^cOpeOkQ#oTp$npXL@79^n&JB^uk7%O`SfChKCIa&KZ<= zv%4KTNDx{&ND%sFkRTNLteMa({ppQoS)}R=)Q&#OqFYY8Y#_v$V?kY{KRzpvM%o3^ z#dd-8eY-$P{HjiyhAeS(c#gQOLs729Fa^Nqh$_ZpHRp#lvS$EgW9>F5dD-)-KBDqNu;xFU^~EB!4`=NNLRCM`H{cI?ZFr#)tU)Hz;a}#8(cu`0OaImDzxk zPH6mW?NkTODbyS^@)q){xo*Mw1Cs8Mh9(VhNyI+UUp*~ED_0vB@nAX((6m5d^iOxrh#4IM9nle&Fr z?2qdUdw8BK5nbINx!~%?=VXa+bz{7+M9`3O53fbtwb9S9XyKF*BhgZnE2N?nl^W7Rk1fFT7_BHOv%Aj?N1Z9Q{pI*-V@PdaOaOrD7@`U)Hoho(1;J|hkho@E`=N9A)1&whArk69CYT9mhH zfuo_{S<5u*XcpOkCh#jQV>F8h$r7hUct1ba)O@4n8qJ=1b}Sty6Dnj%eWHZ$MMl9B z&3RaJ9kshZy8+fr?&WM>^oM&HyMNOdqMB%V#aFY8VQm^<&AsBM*~UNv#|{*TJt3~m zkfE-DFVHCteP=6*R-%^%mW_c1zJRc5jG=*b`_BB8zR;>>L2E4rRE4+;PH@uu7Ub@TGfN=V^#7lRZ zI!5xM)Zt|;!u2t2lheeu7_0piv85pm#!4S;Q%A2O3n}DPyCPn}5!RU|pkul{^xK)B zgR_9qSLBND(=uvUPo8FPrp0El<}k=Tv)D6;CY)I;ht%ekZ0&XyLayhbQRCP)c3gXZ z9J4y9#)XxP6?6I;Xqa^S6otpo?dSIDG*lPnGPa}ZNjJ_2lBlf9_?3hD3Or4g!KB}x zl4XE?KPN4Nnr`Sq-))S(&lc3uqKzNV{J`bZ@ggc%J6`M^(i}*r`AiV;rzodQfO|sp zJ3$0UODBlN?@sVEj&T@`DPK0%!QKYa$cdu)GZWG7sJ0zHAr;o5G$o8OVtw_D7>)m1 zEnpIh?l7WA$}*nxI?-}qFnA1$!XH|va2I0{m)C6Sh`n0*ME%biMl?rEN`JswcX?Pb zBd%!2C$V0LPJWuirm9N=HOFM=*YHHGU^06JVE1I!t@YA)UF08=`k2<;2~rCk;}Vfd|qUeqn94HyHAWmQ!>Bg7NATYoP4_NXfTKC@UE1C-#UWkcBOcWftq#p)!f$l%h0C?bhGbSWhmQQ{!kqMq51#BB@N$b79r9STvN@J&T35{{(*G zxCjFE@rzS&yon*;CkvM7f0PW*T3Rj(ZARb^FPp(rbJ;M=%aL4$n|4~4*$Ams0#-QAa_ivuSal|^jSsW63ttTpXP{l z7&Di3i!OH9-Q}|(Ad>-k?;->Q1JXBD%bhE>c`MLVEiTiJ&t(ze>9o~Q5ivZ(I`cCl z{y|`@#upTJ0HbNg{~o21u;Wjksio%$jL+u*oKXJ`7BLM8KRBOXD_v1 zHX5(VGce~TBO)AJ@0|$d5ES<dBqgpZ0w|=&uXs!#oIf$;t5=tN~0vYeWk5k%sM*t+^wDqIdHqs zq9g&gYVK>oo15vcd}6B0MG|f_lC}a`Mdm0yTWB|TAP#ax{kh3Rddno=EJKep- z8CM}3Y^C;v{_{g28`i8cJ=5Q3lfgaZvxY5Up%Ino+5TQT-MfB@28)ILIi8eNTQVz>W4#))Vn(1vrcAnR5 zNRMR6*Hx_mcsln8mhL}6!tbGPOZ25HV)8Q1&O-FXWt{Hc>D$eiB`ikBLA_vNP{^T| zkOPg$PzpJ|6_}eh3%!@-j%)hdbRUGV+|$aIun?!{Z+T4r6!hunl z0bK1iN*BnJ0W4hGP{f+YRg%@DDWO|aDa1mm#m_i@A(jYhwRVnrcSVA`h($LRXFGte z^wk1iA$XCN@CuUZwQvL$JIKipoARJwJ2@Gc+^(q@x{K%}TX58;FAIYQddpLCywav^ z2F}Kb_jMjt=4n+#D-nUoE389Ar6b$lS0OwG4%x0mvn*v1PbZSP4G{IZh#i^!VmDd0 zJ%XaLiQtuDFXGi=cW*lhUJ-jGcG6r+*$8K4Uba6o)5?R)#BK@v#+qoLo%CV)xbnb* z#as^_J`>Nf-h?L*aO^Zz(wRCfBP!oZwIF+vHf@!7ixHnT^$pGjV+7CKa_wBeIgxKWOLsRPf`D>I5-!}D}p`JIRlcNO8UK{#Lu zroU!0f6<;kab$)dfJQt27tQauqdyp#kwDZw@ zi6<;V3@WT3@D$h9MS40&XQK0H7_E@h_r!StWgGBX{axdD-h@PqNix?!A||6xhDL*> z2yMUr5KWszvGp-1Wb>oiEHoeQxmJP0MMq(K&#St4&a3mBYdo7cBKKp6tD)p5NOEM= zES!b3trdZU3(+=`ZNm)iV>k;9u5Bv7`n*?YcFtm+KH6QhtU6jOKV$%1Ts7q}I(ik8 znutj@B}HCehe?KGwmhOkq<+t>LEp6(rFzOYb6-!?)zczw4Uqm|*=7(;ydJv&4%biI zBSAK(u4176TdEhY&uTL^u%^LBHkcYE=|eoCt=)h$SB3WW1{ULgWP?7OBia{uR99cs zYBoTtV|M6!Fz5Xi+Or#31{UQT8(AfOhHb*8zQU#jcEz>(>U+(B==vtMR9%B3Fb&qX zWm|2f#-38wWN1|yFhwEY!7qCLq~Q<_*UL6zueT;gb8V(tMCqH^v(ald*xj#Q^On}C zR9#w;dyn{TL9UTDpT7a|H5WA3Z_qcQnSK<9H)y!!uMJWCx8JbI>Y97n;5SemK9H(Y zv|Vqo&e5+2;LC$|fuEuexl>s_9QYA^gu(8-!AA6Wow8+!npcovHnm$uhMC&IF#FI~ z$-R_fK`CgyUaVa$1#@hx%hWsLcg!ANr{wH?=ccS+D4|zWAihN%S$9jN(@41CtSg#LzahT^p~Z&~L~n zZS*$QFQmdoQ!AC%mP(=6w6!T(`8F2aC-@pPB>+ax6tb=z4L)vwM!e(;yPBnaK_lL# z2JZ*|@j7p7bG3l&ETUoXvLr=e>x1dNNeX!?l4QuU9coaKUK{^3*FMbZ4DG=V);hR3y+J~j8%K)_{Lt?kT9=(Hbm$xP&JU4Kr@!HbSJ_^1tEq!t@Yl8t8yzJkrX4e_ja)v zAQ!nC!QBciZMVqpt=-L51kbO1LDPd~lh*MqmKHpJV0{XkH0N8eFQ>Ix`&mcr6A(lB z%eRpD+N8PPVv*r%YSYY^bMc8$q5H}vt=rp(377ZKr!^1KVa3|ow{Zn6Py6_7@Rg^1 zqyIG8gQw+M$2|y?^R#F5r|J6BiakhBE&EPO*vlgQ#TRGrcl}O7){$DHz38?~>xdt9 z*+c=Fj#ld8W18h1$YAGQWVeg&h_2f8y{wU1e3m9jeRZBTV=vfQti`;;R;aIhr?Xh~ z4&v{kg)}!2TFAT1Dg~$(`4jAEedICCmiDnsVMF?7TjiYvy2qQ^{%sN?L zoF(B}!dt9Q$gG+5>(=5j!du8s3R!mxKkWbk<1Hdu*trI=4>1*OU5|;&N7TZMrcb=b zB3o7@C0q3GYS5ejj0Vf>FZNX054d#CAYMa_gVPUY6B*i6WQqk@os=L zTn`8?4V-r-U%XJ}eKGWh_gTC4ryX|pEOA{xqR8=}@NS+~4vjsnO)X~~hp&U5o=d*m zbcQmUd^yfgd>-jsD-Q)G{Y^H>j649)H}GD^3g771pE$rGBfRLE?mXcGRyE~Ny3^X& z1FU28I-A`+huntA1>}<3fD7>Pr_;8MdUi86Q&IZqdsp<|mlS|4O#qoyu20?HKEGcKDl zx;92larIUm#r`{N%JcU@zx~aQv7*6)4XJVPR-v4>NmL!ZXh}d#n8tnSRx#ev*a1X2F-Px(Dj-Z%n4o z83gZLE%Q(i&h4%f=O8cv(Ns3amXiL+pICl_4DJ zM{YK$3NF2xzLJ`~k?Lr&JX^MP7wqoov~?v_qzEq@A>T{%MrVMHJ=`G|=}Nq&c~+}A z!eYiH{|b(Uz+tjZ)9ABe_>R-Vff9wZPV4T09&O1@QQS1zk_Vw}cgeWNBy_W%}KY2Po)2?|7 zDJNAI(m(e;hM#K!U+YOCzasguNPbG?kv91G=K*c?F_yv4{l!n@B=ynE4mP;JX+CA# zq|j!s+w=hoQ781(T=;dazo1_Z$e|e76uVEQ7#YZaULzT!eWFjIWj&pk1(H@$Kh&T0 zpw7K1wKjWG3(VWs7`M~U%`uQR@>G(M9eyh!7NB0Q)wKAsH{rtv*6k8khe$2acR$Cp;i z|AV^YEA}4WgF52_vlyRt`~&uaa|2!>$0Y`tK_&TE6$$ga;sY4pCA9(r`{@|uLQxdK zkDK5y_u>^Ff`4U#|9`E04Omsh*8iT_ha&>wfG7xvN4^9^JsK4nCMtC?DbY*4T9jy5 zcts_{q%L*nMnzpyZ=r*VMqTUDjS7W2_J)QZ6(%YsDk>%w8Y*6~v?xFJ`p;S!>P5p1t=${NJW#$>04+5c&Br^AjJ@X!pmH?u3 zPe6IGERS+&AR6WQvOK}1+y~{EvOKlB{3r3OBt?`bqTx&z!Z#oo<4P&kPf8GKX!xhy zC=Zr`mbvh6!cSV=tCFAI5#RWXQ_1C-;v*ltD`hVzZoqdwQL9Jdbav`iJd0n&c>Y$* z0jtMpM9+%!j7NSu<(rS;tQN2^vU&rzuLgf zFG8zI1#ax-s!E|}_ZOk$;(KD~37XD>{@^*FaGJ?q0Uh<(LGDi~4cSKD!CNE#kvJOf zYD}N-WMf-;G&bRP8Y^*WtfWU{D?zi4vK`96716b7mCHZNjWJ)!aMwS`ARSA1&JHpl z=Aw8ENaXArE37=orZfpbcID7A^JO2LP@do&G1%hc>%1M}K}0!>8pq2bNiQC@6JOh` zs^vL5VeJb;__CekE>h(@vJ1sb-S%=~?xZ|!PbLi?QZr?5N*}Uva63G|u zCW!{`t^Dk65)iT)t^BY6t-73RckD&0SQOiEOz|a|6S6uTzw~z=JTCj#j=RAV44yth z@CLfNfG6%jL*Gy1>3a}otBZNj9^CSOk2f#&kVok18qVrTV9e=fF;?WU#OfCOV&E9a zb$OHMU*b_gcrrPS7oFZ9(+kHM zTs(F~_vY`#2@jva8}>q@*6q&ry@ZOxs0;hZALw`Ec>I1Gckxo5v!6Ufc{Oj?PyR%C zgSg($S2qwwdAlIS^OgoOI<&-sagKe+xtY+_WutNCW9W*F#y3y$xC3N#NQoUhy}{#h z({W}Vc<{q?-$XkL4~X}f@V)3)WNJuB))ei`gWz?s`}bSH3%j3un%fWJS0GB3@r;A$ z!O2m=#zCAPBui;YHD`?|{2Gry8%az^3GUC@2Hq&>^pl35ugCC=L%7jh-bk|P8pf}R ziYE{;hfr}%!W8ZM;Wt)1^@>sP1U}R_MDB;OpBy5$hOEh-qMd#ktS;+V>j|)8@@vKe ziNho`r1>#1;fTo(yT3BL=!tWiq2g6!Y>L*D@YKU-x_JW6J}g3>I}ejty{ihx*_d@q z^dUa@2nmZm{sy@9^KG0U7h=TfH<5CBDAZ}jeHovBgpBm4Dne}>kgciY8;_7sk7K9A zxJf3*_wt4#vVBy zxIT9ob`w2T?PV_f3CHjq${{}M81biTb9vq|G}a`3UdMIz;r}?Me){BC?WcQj)FR`J)HiT~uPYJHZz;X8F%+xQ;cp#Sze^$K$aHg<8t zomw+Kv_@Bse2rI<)>iZElL)4RIJQ1XLP8E@{NChk%-siv@Lea#6ENUyEjUPm9gWL# zEo8;rhaSNTVDGr>5Y6}7@^mj`tgXkekDsC)7gLmoeECkrQ87g!@(;|!H37UBPO|ZUZ%N3^h9w{+OVTq??ycV{ zM+6;1YF#3fOUCyqO%;FiJMx@kKi)#?x>vz6xvl{3C+k~mV++22nlKEarUGrj zAo~tTeJO62;_-aaZ=60t*A*ID{U%{Zm-+LsFeK*BeKSQnkdyl?Hlx^L{_ieG)}p=Ui_>eclu@78l~w9qrqdCzIm zNd{Jl|HdU==nyZ#h+8XjTf}Fz;lu?$0%2S}Xv6E8Reb0fGJjB2CB~Ec7@N68G9Dz# z9TETFjK1{kKSMr11;<%@C5g8^&yw*W>+10@te+IU7uq09a67vHsL}H;)^NXb&}Q@Ro~cxE7m(i{#~yRkipq z;Ee2<=skK?H`(Y}ZEwEu2l5qqw)97=$)$B5y>lb$7rhPEZM%8vkK`#@TE{akLHstj z_!4?1jm$vYz%joh}eEfHr+=u2~zf304^%mZGnMBf> zH@MeNWI0_Q#Y=yJ=ua*?xBP^6yy3 zJ7ag=u#|-J)NAB$;D>Im(nKr9xc%^MXX16@?M1_ioT(nv+l_|gJ2U#yqy1FsvC)|j zMi=x}DT#Mh#L^x8==nUJlSuERU*5sDB+?g1B_BV5J{+@qdjY|&!(Dwleu%>EDNryv z&}qwPcc$DN%jm>1Mkl4=Jzv5*a_O~^*S-wUu6=0-Bm*)4d4QFGazHJh3DBWk+v5(f z@s6c5(HTF9zE2znTD5Bj!R-nMvJLz|l6LK@t1@46BabV;$baPpNC(9I&wM@VIc{jU z2l3xe3-76%qenqX54?wE{x1rCRrue__^P4@ZD5ZE4ip;+Ks+D`kP1i#WC3yk1%PFM62L}4C7=dS z2WSMe0NMea+O>8IfB}L5QGhr=A|U0?B?}+UowsPAEh^&iXxqHUZ3`FW+U70DaaP<* zy)BL_#oD#28QQfgMaEU+{~d6p3^FSKTL8NN4S;4q8{iV!Pyk-A!qos|!U1+b0w5WX z2FL>lW%4FuK5U!3FmrAmW)R0{&f)_Wv(P*#c#D0U7|!fHug2g2c<|^#C2K zI{b^Y>;APppl4Z6{D0%`N&oNhUPj|Z&iaS&dm#f-XXob5UA)k?U{U5=+dN@TL_{Vp zyO&1YBIaw@_Wv#+XlvJF~6EL^jfJ`u$`QN+Fk@Sc2oipasZ`F{; zXK2@d15qf0(8rUVGZxX+))C9?+V$nhfDAw$U?rd&fX*#%0(5BCSGWVvxfSt7C(@sw zkB||(RJ+cr0rh}Z06J3Q2Z#kE0n!1vfMtMnskMyjd)8;J7&0VzMcLloAe_Q<@@2{X_L{y!oMYRAr zH7%L}q5z428Gsx>5ugmP1<+u4IQVaLv%4dwUDI+fI&v~KZBd1BeJs@l7c_t<)9KB? zO(@p1CA%~&x6*(mNx)Miq~mJhA}`8;Kf$_TNvY=0Ue4FFqFPOR3B;G6rhdKJjSHGi z7iFNooa_Q=n)X_vroGx?Kry;k3`KQ7qg}Yji*nFkjqiqHyMqL&x4~sw00XpZ3oCGK z(6oo^ac$MKtYDnTdTH8%T3l`Dc_*$A_E;;fIhwY(0oOwG4EzMb|6G7;J+3XdLaC>1 zxL(qPnSkS28-#`OI64zKwo72K;*3rlTkGd<0TN%nkiU(wAT6PKV zTt~;oEGh=xE(k~r0OfPCacvU?NVpSJ(2>WIczP)vJw4Y8vY>;Wz)$=%?MZY7zi@6O zQ5Jd^vCTPO6a6$MD5tXR`ZGmx(l1xTW-T+`OW zJ__{JlPIe}Sv%TkaZcMnKOoMG4Ych4^p}J4z13xOK>zi%jBZc>iGTv8R^qm@k`F7R zL+PYlJgto0g4?UVmeJ>K&$2L@?1hcY953VukeYc>3Px`QaCOxE~7>8=>p;wngWK`{2u+5l_q^e6D&|KD$1nSAN#gRkJ|_Z0bNO_ zk9*gmw+{uxS5UtVlJV)LfN`$FQb^GSOc-v`Z_h;;l4q9zrd-M^Uw3J}T*kJE3 zMD>p-pH@ll>m`f%`<3*0Ptc8F<^Gy%;&mtWH4BW9%Q3j?e zeL<)LH1M|V)Nbtqn|pilkR8g|PmIKOQNoow}PLcWu~yn`lK`)(1_1+U*hYh~W~ z>P|Y8SlLEKeU|Z0cY$E!ozH&;f``vCM#Tg%AWJAYo`1TZF7|Q%9A}ZxV>T+S6m*{V z1^vP51L;0^09ywQe9)>-3x5UqFkf`kw*(P199^*Dnw$?l2_5QUBF`^jB7=fQsBqMPOkrEyQT?NYm2^k-_Y2tjTvrwMn$L*(R2!CrY4e$soV>GA*Lv%_FFVQ87^t+R^2Rr>#aIpV&Yj zrNL?Z-3A(D4MH3Qb@KWKR0>9*i`jFqm#DOZpE*E1twy2q*8|j_+&?(e7v0ru7t)Tb zVY`rBqExqCSdz%s2=XBTf>*cQplUw8<0lSFlIc$io zfsYs7-=c7$&8h=sAl{2dv?8+IT7 z|ItL3Ta7~JZAa-iVjW(?=!ho%%rSaE=AHK*r*{zR2*hCAM*OZb2qR#LxQ))GCq!c- zgBcwe%S*ndpIS$utx!=3goA~yV^nynm6cW?=u=$4R^1p%Uj6&xt-_U{N z{##SwI>U4~7YHxvVR!QkQL3BnwkVO+O?OMNV9-r>i23*F z{T=<#V_Y&6z`8N=C7yGN?&GhtQV*+9$k(^h-PUo4j@xs2_9@zI=I=R8&scBIWpuoq zkNY0omU+K6dd6eCo$2euO?QbN1v@e8^&#AT7Ge#OGx019B-X?z9PPS0GtSXlyO8zm zv^TL%bO)u>S#h5Fs1o5jJLsdu|o;U)_%!Rt!ggx*Iuab503Tzogh)IsHS_nFQ0kbMas` zPNiN2JY}dF?`#QGHxn^Sc1EaUo%_PoD1xcY32ZvStmFh!CBf9>ydI^FQ!$G;$Hl5X zL=4_%C#e3;M~ABu35KEb-4W^}f}!Q?7^(KNctm8YVdNq8DH}f98LQ?vpN>;EP!Xqt zZdG$hpW!ti`-cu5JaX{JaU9QH{CL8x>LBO-c%i_EX6G+s)HEtWZEAu#$bt}ZE=&~d zj;nT}-E;z%IZsYhrxEzbIXX$rByfteI7jW9(9*GN*IZ! z-=&TbHsU3BsW%G~@rJw9TSOiADe72JCus`sNomgfDeCgq=`Az3*Eu!BI%$_8_TTn% zYN*GgHssqB<^Cp~E@&HS6}q7o>z^8GeLY{Hujlh}Tw6mfrS0Am$)J%VGbSdW8g4}fqNS`%wphubsTp! z5@!;3mpH~RI#5_z6@QQbVPQZL3lER-DrrS&#|i%yI*I{{pDB7rG= zR*DMP4|?J13UFb&9X-VE6Vrj9OR=rM z%X#Au>IXjcsI<~3CXr0}D4iGosE%}`-B3(=wW4yJWP5|DPNAgOu0koYNk|sSqG%U^ z_h-bX_{RGE!a+9c*9u;dy7@yhZ{&A`T>{;#uos?d7yM`to+D?Ox+M;Hs#Ks8cwskA ztxymOm~`p~Ty#M4(@^B~)UCi)c*n&KD%n=%+;vIaMjV?u1uI%YjHn?ntWj0>rz-sC zicbWt#~k?mz(2(#>Jh4_bC_DCn-0!LOsP3$OxpCGsecCDjymp=Ud|k3ndn+21Rx;P zI`a<9m+E)}QySB7%T^%i$9gpQ6H_+}fnv!+P+L?+jtG~FXoEaU0M>KtblmC;d6pr@ zK3Qp(c(el=ra(X$1i}@=+al z>Lu>%!H+$o{%L!zq&rTd2Ss2KJ%Gt9*KVxf)`yYxsc0a|sNfdH$ZFxTSc#8k#3F)0 zD(E)V*yE63qla$)(L>&&H(J=?wuq6jQDB-O1r{^120b8V1C@+qG`iqBnX;o6_!h~3 zj46N5g@R&p2a~&GcpILvQY}S#*{sn%4vsz_v*ux({T`(E%9K?a%jMG zNv|-bd|w8#0|Ac9? z1@##OV#eyVl#%J>pyx>XtBhP{pi7JOdXp&+MS-5@i&F=fq}L`!7Q;j|T~;{Al#d}$ zO_uoA42R=gG5C`p1zu*#uSpPKGZ=dJVoF&e@LGunGcqk1c!tDpg@tl>^%Zr5V{;?q zNK5p7mMM0jc$VaQ4VLkebWBkAnoQlC;ex+~`6C#(bXD&!7Nh7{-)U5NP_^6EouT!UeIi!c64# z1RTk8J|nI!@_d$&(QP2KOMaXp7&|-QP{eZsBio^Xk}T=imMutyLWu_M@Z848AHvZ? zX;RO_q8X9EfaKZ6loOrEm=qW2J@CSeX`F2vG2-!e=_{uE^vK9g#W!hV&sx&AV5~w&B%*Fff*7%kG!6MBYA09 z1-+1w7U?qxE^7f^V(|AFbK@e`X9CloM359o7pIDP0?r@MRDZ{4cY!1BpkJRSu&4|1 ziLeJ2^*#kmxexkVZL)e1Rs`V?Y4AR8Fy)dM#PO2;G4gr>j?`xlBhRFudxpW4KHoFt zhkS&n>|UQ=FbF>qgGf%m-d0B3U=Jn95a^Bbqj!YCr2y~2jNDR-`87+@Co%G64jM?4 zcse2^5&Y7D-e}B7hC<$Jup@-RYMbG3?+p&7v=l<4U@71&revizxUyO__0-j;ueJzkz3tTGL*Wu4dzjid3Dj7yI zvP1OP#P7hWUkN;4(&sT!0EI}g#G$;AfFt!?#nc@u(V+&Thke&G5 zltLkMnqoMx-IWIg#US^@GRjgIsVxITlhGi=zZavuo3|c7co?|G$mV#GL zsE@>6#CdE1d>n7Mgsp@HGP^Ct)+5G*MfITl11h}B$lL@>sQRb`j*Z%J1PRHN3hiae zms?PwK;k{7DF%z+UuIFuNQdzl$7t7Q03-iOgx#d;eWJ1Ql|qb+ZJ$JhMjLQxc%S=_ z*OSo?pDc(KksuB4^Egw!Edw5IsNsVJX0uJw5t=@$#fp}U0(q0*1J4c=t`d zm~sV%P^u;V9p-D((75yV5t|b+V9W-80bbXQ`+5Q|bHROqXS?8G7)%#;p&-*}!1pGs zXh6-;?K=S#uDVp1fi=4Wxb(cQgOMi%y;0U*g9XM0Tw2KYedP57I+E`;ro5ej4%SP4 zMtvT1oZR4J%RAFG;zOJMwVv)Z zA9gP{K~dT+8){<8NedL0A=eKb*&GWwwFceKjVTv0fG0{EgX|~K?iPs;!I{IgZYX8NIJeUP_ zvJG|mKM!6#0Y~c3#jz_gHHMx0W7=Noh2Atvey2ETMt3(#dM#5X3;UEx`Vrhe<1OGW zgZ00RTbXp=(z63_v*m$EAaO>80YMM|f#&XSzz9s!B2sE3Jpug|ks%E{U=|}yoluBL zdX9MH0C|aqLId(0%nj41!sIkM0Gp*H;ixb}R;YzQp|L3tPyUPqI?{mS*r>N6lP~$t zFm)RgG*`9(zrxU>L&Cyvls|TZN>aCj{ju=q&+XjG42}G4=#dQ-k`00Wql~k6C0o*O zgTNLk5FYpcBU3mmXfD0}cmT903b>3Qf80x1g*<6N{}-6@J}hD`J|UWRM3S2sbQ)g4IGEc7Fl&Oet9jx*{8BhKXSj(`Nza8OcFZo1=Q5 z6?r`w4Gatbe=`bX0|P}}JxTf)&`pJ*;J~|>vJDm>NuW>0iZE~{QxdMCK$>VEHW#)^ zQ$x_7W6DA(Xl^eD;(j73)k!*cLA6E30%sQ=U^~%GZpwUwx{mE6(1_Lr-7ISs12wL z(ZIiBRDUZ%qD?mNAybBI1fDDL?PwqvxM%=_B5)t@CW*s9fi1}E3H(TbKQN-zA(J8N zW3N*w93m8eh#*hnd7%3;V~hm(;f7#h8R)u;!4Qrc1{?5XLqO1Iqe zAnb)2IuVjG#)EJ~GqwQqR9Ro-^(5g zEDvb0)qyl0~IKc z4Gh98aS%OJ$_xbtVV1ZXbaPKJ=w3!vz`};bWASh}k0~G2qM%Mzz#d>#DJsZmWY9ZI zc`O0)%XwWN%P=31%=jFHDeOcX$BR=V9c`%LXGjRSjgjXXx+R1>$dua^BM6+ zn48<4kRCP-c@cH+!tB)Vd5A3}~HuO~E! z6oQFqEEF=se6TyBBo%nJq0nHQwVrD4R(S9TIE|})Ep~^nq+B5eW04;p3|t29;37;< zD}hTx4PJ{{<-n!dgYkS}bFmBl0aN}Yv@DUW?!t7r3wW-?zhlbh2n|{;@rz7#Y!>}C z1^&v&XLhKWXfW9DfMQ|+Dy)=vEE*II2!2c#wy}(e70KL1*!~E5fD3&dQ=)+)w)Med zTMBxz3w;H1DB{hOt_I7PvONV1t+E2{Hml$WbJ4doK|s93g#u7Gumbfv4E`aw#VEWA z`WA`X8QCOoIl6~n1sf0r{(MQ#cHn$L^vJBRl98PlO{7LLU`@V^2295fc^eAM04^;s zqy~9CfgfqeK1NnTo;hC)>A)R81_+r_-W43W*8!Ibg^JtV*bbM1o3JlR1fF4x#!!qd z@rcH}9S)s|Mc*CtN<(1i<4{P%h;(7-bBwqPh2`iB#dJ}03AkKxLO%h2WjDVg6gTkK zI#EzB1)>L*9N^&+KgsYc7z(sVh1!|2FB_-v$&!wZ;v9@MQ=u?y6kkS6&@6)<1{YYu zK~ItRWTuQy2i~aT4kZje@oYyys${^LduJT*4vFKf%_e+>Hw1ZcJGXjY)vS`x`HQ zSyBxPgoiM<6IX=8 z!Nku^;Aaw_4+TIs6^ML_kq?Cr>LnfH^ly2n?$ssT1AmbraAYI>7X}B`aY&C zX+`}g19uE@h*N>Wl zy<;NqOj#cfG=DC^S*R&5n~~cJAeQg7R=)JOGQg2ymOMheK=q7)K7DDCjka z!F4MQdUOCIQ_+sONsbijbx0@8KS?=s~tiD*y;bF>o;fZo->VWwQ)1-gvY=oUtvEk}K6 z`Dk>=(hUA&qeC(77!2VxsL&}3uu2^lp2(K?XlN{4Eqf3%8N2L!;8KB@H01RJex#U3 zz+a7w$)ATu%MFkxLnr31Oo?cNCjzAW)jTo4($C(CD)F*tDi_@% delta 58820 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 2) { // -1 complete pattern ret = FAIL; sprintf(mess, "Pattern (Pattern Loop) Level (%d) is not implemented for this detector\n", loopLevel); @@ -2610,14 +2616,15 @@ int set_ctb_pattern(int file_des) { uint64_t args[2] = {-1, -1}; if (receiveData(file_des, args, sizeof(args), INT64) < 0) return printSocketReadError(); - int loopLevel = (int)args[0]; - int addr = (int)args[1]; int retval32 = -1; #if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) functionNotImplemented(); return Server_SendResult(file_des, INT32, UPDATE, NULL, 0); #else + int loopLevel = (int)args[0]; + int addr = (int)args[1]; + if ((addr == -1) || (Server_VerifyLock() == OK)) { if (loopLevel < 0 || loopLevel > 2) { ret = FAIL; @@ -2651,14 +2658,15 @@ int set_ctb_pattern(int file_des) { uint64_t args[2] = {-1, -1}; if (receiveData(file_des, args, sizeof(args), INT64) < 0) return printSocketReadError(); - int loopLevel = (int)args[1]; - uint64_t timeval = (int)args[2]; int64_t retval64 = -1; #if !defined(CHIPTESTBOARDD) && !defined(MOENCHD) functionNotImplemented(); return Server_SendResult(file_des, INT32, UPDATE, NULL, 0); #else + int loopLevel = (int)args[1]; + uint64_t timeval = (int)args[2]; + if ((timeval == -1) || (Server_VerifyLock() == OK)) { if (loopLevel < 0 || loopLevel > 2) { ret = FAIL; diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index f8eb13484..1eb58798f 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -1934,6 +1934,29 @@ std::string multiSlsDetector::getAdditionalJsonHeader(int detPos) { return sls::concatenateIfDifferent(r); } +std::string multiSlsDetector::setAdditionalJsonParameter(const std::string& key, const std::string& value, int detPos) { + // single + if (detPos >= 0) { + return detectors[detPos]->setAdditionalJsonParameter(key, value); + } + + // multi + auto r = parallelCall(&slsDetector::setAdditionalJsonParameter, key, value); + return sls::concatenateIfDifferent(r); +} + +std::string multiSlsDetector::getAdditionalJsonParameter(const std::string& key, int detPos) { + // single + if (detPos >= 0) { + return detectors[detPos]->getAdditionalJsonParameter(key); + } + + // multi + auto r = serialCall(&slsDetector::getAdditionalJsonParameter, key); + return sls::concatenateIfDifferent(r); +} + + int multiSlsDetector::setReceiverUDPSocketBufferSize(int udpsockbufsize, int detPos) { // single if (detPos >= 0) { diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h index 836de2513..fc17bcc50 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.h @@ -1057,17 +1057,36 @@ class multiSlsDetector : public virtual slsDetectorDefs, * Sets the additional json header * @param jsonheader additional json header * @param detPos -1 for all detectors in list or specific detector position - * @returns additional json header, returns "none" if default setting and no custom ip set + * @returns additional json header, default is empty */ std::string setAdditionalJsonHeader(const std::string& jsonheader, int detPos = -1); /** * Returns the additional json header * @param detPos -1 for all detectors in list or specific detector position - * @returns the additional json header, returns "none" if default setting and no custom ip set + * @returns the additional json header, default is empty */ std::string getAdditionalJsonHeader(int detPos = -1); + /** + * Sets the value for the additional json header parameter if found, else append it + * @param key additional json header parameter + * @param value additional json header parameter value (cannot be empty) + * @param detPos -1 for all detectors in list or specific detector position + * @returns the additional json header parameter value, + * empty if no parameter found in additional json header + */ + std::string setAdditionalJsonParameter(const std::string& key, const std::string& value, int detPos = -1); + + /** + * Returns the additional json header parameter value + * @param key additional json header parameter + * @param detPos -1 for all detectors in list or specific detector position + * @returns the additional json header parameter value, + * empty if no parameter found in additional json header + */ + std::string getAdditionalJsonParameter(const std::string& key, int detPos = -1); + /** * Sets the receiver UDP socket buffer size * @param udpsockbufsize additional json header diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index 671baf540..ba027d9b9 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -310,7 +310,7 @@ void slsDetector::setDetectorSpecificParameters(detectorType type, detParameterL list.nGappixelsY = 1; break; default: - FILE_LOG(logERROR) << "Unknown detector type!"; + FILE_LOG(logERROR) << "Unknown detector type! " << type; throw std::exception(); } } @@ -2625,7 +2625,7 @@ std::string slsDetector::setAdditionalJsonHeader(const std::string &jsonheader) sls::strcpy_safe(args, jsonheader.c_str()); FILE_LOG(logDEBUG1) << "Sending additional json header " << args; - if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { + if (thisDetector->receiverOnlineFlag == ONLINE_FLAG) { auto receiver = sls::ClientSocket(thisDetector->receiver_hostname, thisDetector->receiverTCPPort); ret = receiver.sendCommandThenRead(fnum, args, sizeof(args), retvals, sizeof(retvals)); if (ret == FAIL) { @@ -2646,6 +2646,65 @@ std::string slsDetector::getAdditionalJsonHeader() { return std::string(thisDetector->receiver_additionalJsonHeader); } +std::string slsDetector::setAdditionalJsonParameter(const std::string& key, const std::string& value) { + + // validation (ignore if key or value has , : ") + if (key.find_first_of(",\":") != std::string::npos || value.find_first_of(",\":") != std::string::npos) { + FILE_LOG(logERROR) << "Could not set additional json header parameter as the key or value has illegal characters (,\":)"; + return getAdditionalJsonParameter(key); + } + + std::string header(thisDetector->receiver_additionalJsonHeader); + size_t keyPos = header.find(std::string("\"") + key + std::string("\":") ); + + // if key found, replace value + if (keyPos != std::string::npos) { + size_t valuePosStart = header.find (std::string(":\""), keyPos) + 2; + size_t valuePosEnd = header.find (std::string("\""), valuePosStart) - 1; + header.replace(valuePosStart, valuePosEnd - valuePosStart + 1, value); + } + + // key not found, append key value pair + else { + if (header.length()) { + header.append(","); + } + // put it in formula \"key\":\"value\" + header.append(std::string("\"") + key + std::string("\"") + std::string(":") + + std::string("\"") + value + std::string("\"")); + } + + // update additional json header + setAdditionalJsonHeader(header); + return getAdditionalJsonParameter(key); +} + +std::string slsDetector::getAdditionalJsonParameter(const std::string& key) { + // additional json header is empty + if (!strlen(thisDetector->receiver_additionalJsonHeader)) + return std::string(""); + + // add quotations before and after the key value + std::string keyLiteral = key; + keyLiteral.insert(0, "\""); + keyLiteral.append("\""); + + // loop through the parameters + for (const auto ¶meter : sls::split(thisDetector->receiver_additionalJsonHeader, ',')) { + // get a vector of key value pair for each parameter + const auto &pairs = sls::split(parameter, ':'); + // match for key + if (pairs[0] == keyLiteral) { + // return value without quotations + return pairs[1].substr(1, pairs[1].length() - 2); + } + } + + // return empty string as no match found with key + return std::string(""); + +} + int slsDetector::setReceiverUDPSocketBufferSize(int udpsockbufsize) { int fnum = F_RECEIVER_UDP_SOCK_BUF_SIZE; int ret = FAIL; diff --git a/slsDetectorSoftware/slsDetector/slsDetector.h b/slsDetectorSoftware/slsDetector/slsDetector.h index e3d744cea..0ba9c9562 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.h +++ b/slsDetectorSoftware/slsDetector/slsDetector.h @@ -977,6 +977,23 @@ public: */ std::string getAdditionalJsonHeader(); + /** + * Sets the value for the additional json header parameter if found, else append it + * @param key additional json header parameter + * @param value additional json header parameter value (cannot be empty) + * @returns the additional json header parameter value, + * empty if no parameter found in additional json header + */ + std::string setAdditionalJsonParameter(const std::string& key, const std::string& value); + + /** + * Returns the additional json header parameter value + * @param key additional json header parameter + * @returns the additional json header parameter value, + * empty if no parameter found in additional json header + */ + std::string getAdditionalJsonParameter(const std::string& key); + /** * Sets the receiver UDP socket buffer size * @param udpsockbufsize additional json header diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index bb1aaacbe..4ddf452c6 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -1640,6 +1640,13 @@ slsDetectorCommand::slsDetectorCommand(multiSlsDetector *det) { descrToFuncMap[i].m_pFuncPtr = &slsDetectorCommand::cmdNetworkParameter; i++; + /*! \page network + - rx_jsonpara [k] [v] sets/gets value v for additional json header parameter k to be streamed out with the zmq from receiver. If empty, then no parameter found Use only if it needs to be processed by an intermediate process. \c Returns \c (string) + */ + descrToFuncMap[i].m_pFuncName = "rx_jsonpara"; // + descrToFuncMap[i].m_pFuncPtr = &slsDetectorCommand::cmdNetworkParameter; + i++; + /*! \page network - configuremac [i] configures the MAC of the detector with these parameters: detectorip, detectormac, rx_udpip, rx_udpmac, rx_udpport, rx_udpport2 (if applicable). This command is already included in \c rx_hsotname. Only put!. \c Returns \c (int) */ @@ -2844,6 +2851,11 @@ std::string slsDetectorCommand::cmdNetworkParameter(int narg, char *args[], int myDet->setAdditionalJsonHeader(args[1], detPos); } return myDet->getAdditionalJsonHeader(detPos); + } else if (cmd == "rx_jsonpara") { + if (action == PUT_ACTION) { + myDet->setAdditionalJsonParameter(args[1], args[2], detPos); + } + return myDet->getAdditionalJsonParameter(args[1]); } return ("unknown network parameter") + cmd; @@ -2884,6 +2896,7 @@ std::string slsDetectorCommand::helpNetworkParameter(int action) { "out with the zmq from receiver. Default is empty. t must be in the format '\"label1\":\"value1\",\"label2\":\"value2\"' etc." "Use only if it needs to be processed by an intermediate process." << std::endl; + os << "rx_jsonpara [k v]\n sets value to v for additional json header parameter k to be streamed out with the zmq from receiver. Use only if it needs to be processed by an intermediate process." << std::endl; os << "rx_udpsocksize [t]\n sets the UDP socket buffer size. Different defaults for Jungfrau. " "Does not remember in client shared memory, " "so must be initialized each time after setting receiver " @@ -2908,6 +2921,7 @@ std::string slsDetectorCommand::helpNetworkParameter(int action) { os << "rx_jsonaddheader \n gets additional json header to be streamed " "out with the zmq from receiver." << std::endl; + os << "rx_jsonpara [k] \n gets value of additional json header parameter k to be streamed out with the zmq from receiver. If empty, then no parameter found. Use only if it needs to be processed by an intermediate process." << std::endl; os << "rx_udpsocksize \n gets the UDP socket buffer size." << std::endl; os << "rx_realudpsocksize \n gets the actual UDP socket buffer size. Usually double the set udp socket buffer size due to kernel bookkeeping." << std::endl; }