From 4649de2742d6e777b2d58c2811182cd6f11e7b09 Mon Sep 17 00:00:00 2001 From: Maliakal Dhanya Date: Fri, 28 Nov 2014 14:26:19 +0100 Subject: [PATCH] some changes for better testing in eiger server, including using set receiver, and changed to top/bottom instead of master slave --- slsDetectorSoftware/eigerDetectorServer/Beb.c | 12 +- .../eigerDetectorServer/FebControl.c | 148 ++++++--- .../eigerDetectorServer/FebControl.h | 4 +- .../eigerDetectorServer/LocalLinkInterface.c | 308 +++++++++--------- .../bin/eigerDetectorServer | Bin 237572 -> 237703 bytes .../slsDetectorFunctionList.c | 90 +++-- .../eigerDetectorServer/xparameters.h | 9 +- .../multiSlsDetector/multiSlsDetector.cpp | 2 + .../slsDetector/slsDetector.cpp | 2 +- .../slsDetectorFunctionList.h | 3 + .../slsDetectorServer_funcs.c | 14 +- 11 files changed, 346 insertions(+), 246 deletions(-) diff --git a/slsDetectorSoftware/eigerDetectorServer/Beb.c b/slsDetectorSoftware/eigerDetectorServer/Beb.c index a428774a1..e6683f030 100644 --- a/slsDetectorSoftware/eigerDetectorServer/Beb.c +++ b/slsDetectorSoftware/eigerDetectorServer/Beb.c @@ -185,7 +185,7 @@ int Beb_InitBebInfos(){//file name at some point int Beb_SetBebSrcHeaderInfos(unsigned int beb_number, int ten_gig, char* src_mac, char* src_ip,unsigned int src_port){ //so that the values can be reset externally for now.... - unsigned int i = Beb_GetBebInfoIndex(beb_number); + unsigned int i = 1;/*Beb_GetBebInfoIndex(beb_number);*/ /******* if(!i) return 0;****************************/ //i must be greater than 0, zero is the global send BebInfo_SetHeaderInfo(&beb_infos[i],ten_gig,src_mac,src_ip,src_port); @@ -262,9 +262,10 @@ unsigned int Beb_GetBebInfoIndex(unsigned int beb_numb){ unsigned int i; for(i=1;ill_fifo_base=0; - ll->ll_fifo_ctrl_reg=0; - if(Local_Init(ll,ll_fifo_badr)){ - Local_Reset(ll); - printf("\tFIFO Status : 0x%08x\n",Local_StatusVector(ll)); - }else printf("\tError LocalLink Mappping : 0x%08x\n",ll_fifo_badr); + // printf("\n v 1 \n"); + printf("Initialize PLB LL FIFOs\n"); + ll->ll_fifo_base=0; + ll->ll_fifo_ctrl_reg=0; + if(Local_Init(ll,ll_fifo_badr)){ + Local_Reset(ll); + printf("\tFIFO Status : 0x%08x\n",Local_StatusVector(ll)); + }else printf("\tError LocalLink Mappping : 0x%08x\n",ll_fifo_badr); - printf("\n\n"); + printf("\n\n"); } /*~LocalLinkInterface(){};*/ Local_LocalLinkInterface(struct LocalLinkInterface* ll){ - printf("Initialize new memory\n"); - } + printf("Initialize new memory\n"); +} int Local_InitNewMemory (struct LocalLinkInterface* ll,unsigned int addr, int ifg){ unsigned int CSP0BASE; @@ -63,218 +63,218 @@ int Local_InitNewMemory (struct LocalLinkInterface* ll,unsigned int addr, int if printf("ifg_control=%02x\n",*ptr1); - *ptr1=ifg; + *ptr1=ifg; printf("ifg_control new=%02x\n",*ptr1); close(fd); -*/ + */ return 1; } int Local_Init(struct LocalLinkInterface* ll,unsigned int ll_fifo_badr){ - int fd; - void *plb_ll_fifo_ptr; + int fd; + void *plb_ll_fifo_ptr; - if ((fd=open("/dev/mem", O_RDWR)) < 0){ - fprintf(stderr, "Could not open /dev/mem\n"); - return 0; - } + if ((fd=open("/dev/mem", O_RDWR)) < 0){ + fprintf(stderr, "Could not open /dev/mem\n"); + return 0; + } - plb_ll_fifo_ptr = mmap(0, getpagesize(), PROT_READ | PROT_WRITE, MAP_FILE | MAP_SHARED, fd, ll_fifo_badr); - close(fd); + plb_ll_fifo_ptr = mmap(0, getpagesize(), PROT_READ | PROT_WRITE, MAP_FILE | MAP_SHARED, fd, ll_fifo_badr); + close(fd); - if (plb_ll_fifo_ptr == MAP_FAILED){ - perror ("mmap"); - return 0; - } + if (plb_ll_fifo_ptr == MAP_FAILED){ + perror ("mmap"); + return 0; + } - ll->ll_fifo_base = (xfs_u32) plb_ll_fifo_ptr; - ll->ll_fifo_ctrl_reg = 0; + ll->ll_fifo_base = (xfs_u32) plb_ll_fifo_ptr; + ll->ll_fifo_ctrl_reg = 0; - return 1; + return 1; } int Local_Reset(struct LocalLinkInterface* ll){ - return Local_Reset1(ll,PLB_LL_FIFO_CTRL_RESET_STD); + return Local_Reset1(ll,PLB_LL_FIFO_CTRL_RESET_STD); } int Local_Reset1(struct LocalLinkInterface* ll,unsigned int rst_mask){ - ll->ll_fifo_ctrl_reg |= rst_mask; - printf("\tCTRL Register bits: 0x%08x\n",ll->ll_fifo_ctrl_reg); + ll->ll_fifo_ctrl_reg |= rst_mask; + printf("\tCTRL Register bits: 0x%08x\n",ll->ll_fifo_ctrl_reg); - HWIO_xfs_out32(ll->ll_fifo_base+4*PLB_LL_FIFO_REG_CTRL,ll->ll_fifo_ctrl_reg); - HWIO_xfs_out32(ll->ll_fifo_base+4*PLB_LL_FIFO_REG_CTRL,ll->ll_fifo_ctrl_reg); - HWIO_xfs_out32(ll->ll_fifo_base+4*PLB_LL_FIFO_REG_CTRL,ll->ll_fifo_ctrl_reg); - HWIO_xfs_out32(ll->ll_fifo_base+4*PLB_LL_FIFO_REG_CTRL,ll->ll_fifo_ctrl_reg); + HWIO_xfs_out32(ll->ll_fifo_base+4*PLB_LL_FIFO_REG_CTRL,ll->ll_fifo_ctrl_reg); + HWIO_xfs_out32(ll->ll_fifo_base+4*PLB_LL_FIFO_REG_CTRL,ll->ll_fifo_ctrl_reg); + HWIO_xfs_out32(ll->ll_fifo_base+4*PLB_LL_FIFO_REG_CTRL,ll->ll_fifo_ctrl_reg); + HWIO_xfs_out32(ll->ll_fifo_base+4*PLB_LL_FIFO_REG_CTRL,ll->ll_fifo_ctrl_reg); - ll->ll_fifo_ctrl_reg &= (~rst_mask); + ll->ll_fifo_ctrl_reg &= (~rst_mask); - HWIO_xfs_out32(ll->ll_fifo_base+4*PLB_LL_FIFO_REG_CTRL,ll->ll_fifo_ctrl_reg); - // printf("FIFO CTRL Address: 0x%08x\n FIFO CTRL Register: 0x%08x\n",PLB_LL_FIFO_REG_CTRL,plb_ll_fifo[PLB_LL_FIFO_REG_CTRL]); - return 1; + HWIO_xfs_out32(ll->ll_fifo_base+4*PLB_LL_FIFO_REG_CTRL,ll->ll_fifo_ctrl_reg); + // printf("FIFO CTRL Address: 0x%08x\n FIFO CTRL Register: 0x%08x\n",PLB_LL_FIFO_REG_CTRL,plb_ll_fifo[PLB_LL_FIFO_REG_CTRL]); + return 1; } unsigned int Local_StatusVector(struct LocalLinkInterface* ll){ - return HWIO_xfs_in32(ll->ll_fifo_base+4*PLB_LL_FIFO_REG_STATUS); + return HWIO_xfs_in32(ll->ll_fifo_base+4*PLB_LL_FIFO_REG_STATUS); } int Local_Write(struct LocalLinkInterface* ll,unsigned int buffer_len, void *buffer){ - // note: buffer must be word (4 byte) aligned - // frame_len in byte - int vacancy=0; - int i; - int words_send = 0; - int last_word; - unsigned int *word_ptr; - unsigned int fifo_ctrl; - xfs_u32 status; + // note: buffer must be word (4 byte) aligned + // frame_len in byte + int vacancy=0; + int i; + int words_send = 0; + int last_word; + unsigned int *word_ptr; + unsigned int fifo_ctrl; + xfs_u32 status; - if (buffer_len < 1) return -1; + if (buffer_len < 1) return -1; - last_word = (buffer_len-1)/4; - word_ptr = (unsigned int *)buffer; + last_word = (buffer_len-1)/4; + word_ptr = (unsigned int *)buffer; - while (words_send <= last_word) - { - while (!vacancy)//wait for Fifo to be empty again - { - status = HWIO_xfs_in32(ll->ll_fifo_base+4*PLB_LL_FIFO_REG_STATUS); - if((status & PLB_LL_FIFO_STATUS_ALMOSTFULL) == 0) vacancy = 1; - } - - //Just to know: #define PLB_LL_FIFO_ALMOST_FULL_THRESHOLD_WORDS 100 - for (i=0; ((ill_fifo_base+4*PLB_LL_FIFO_REG_STATUS); + if((status & PLB_LL_FIFO_STATUS_ALMOSTFULL) == 0) vacancy = 1; + } - if (words_send == last_word) - { - fifo_ctrl |= (PLB_LL_FIFO_CTRL_LL_EOF | (( (buffer_len-1)<ll_fifo_base+4*PLB_LL_FIFO_REG_FIFO,word_ptr[words_send++]); + //Just to know: #define PLB_LL_FIFO_ALMOST_FULL_THRESHOLD_WORDS 100 + for (i=0; ((ill_fifo_base+4*PLB_LL_FIFO_REG_FIFO,word_ptr[words_send++]); + } } - } - return buffer_len; + return buffer_len; } int Local_Read(struct LocalLinkInterface* ll,unsigned int buffer_len, void *buffer){ - static unsigned int buffer_ptr = 0; - // note: buffer must be word (4 byte) aligned - // frame_len in byte - int len; - unsigned int *word_ptr; - unsigned int status; - volatile unsigned int fifo_val; - int sof = 0; + static unsigned int buffer_ptr = 0; + // note: buffer must be word (4 byte) aligned + // frame_len in byte + int len; + unsigned int *word_ptr; + unsigned int status; + volatile unsigned int fifo_val; + int sof = 0; - word_ptr = (unsigned int *)buffer; - do - { - status = HWIO_xfs_in32(ll->ll_fifo_base+4*PLB_LL_FIFO_REG_STATUS); - - if (!(status & PLB_LL_FIFO_STATUS_EMPTY)) + word_ptr = (unsigned int *)buffer; + do { - if (status & PLB_LL_FIFO_STATUS_LL_SOF) - { - if (buffer_ptr) - { - buffer_ptr = 0; - return -1; // buffer overflow - } -// printf(">>>> SOF\n\r"); - buffer_ptr = 0; - sof = 1; - } + status = HWIO_xfs_in32(ll->ll_fifo_base+4*PLB_LL_FIFO_REG_STATUS); - fifo_val = HWIO_xfs_in32(ll->ll_fifo_base+4*PLB_LL_FIFO_REG_FIFO); //read from fifo - - if ((buffer_ptr > 0) || sof) - { - if ( (buffer_len >> 2) > buffer_ptr) + if (!(status & PLB_LL_FIFO_STATUS_EMPTY)) { - word_ptr[buffer_ptr++] = fifo_val; //write to buffer - } - else - { - buffer_ptr = 0; - return -2; // buffer overflow - } + if (status & PLB_LL_FIFO_STATUS_LL_SOF) + { + if (buffer_ptr) + { + buffer_ptr = 0; + return -1; // buffer overflow + } + // printf(">>>> SOF\n\r"); + buffer_ptr = 0; + sof = 1; + } - if (status & PLB_LL_FIFO_STATUS_LL_EOF) - { - len = (buffer_ptr << 2) -3 + ( (status & PLB_LL_FIFO_STATUS_LL_REM)>>PLB_LL_FIFO_STATUS_LL_REM_SHIFT ); -// printf(">>>>status=0x%08x EOF len = %d \n\r\n\r",status, len); - buffer_ptr = 0; - return len; - } + fifo_val = HWIO_xfs_in32(ll->ll_fifo_base+4*PLB_LL_FIFO_REG_FIFO); //read from fifo - } + if ((buffer_ptr > 0) || sof) + { + if ( (buffer_len >> 2) > buffer_ptr) + { + word_ptr[buffer_ptr++] = fifo_val; //write to buffer + } + else + { + buffer_ptr = 0; + return -2; // buffer overflow + } + + if (status & PLB_LL_FIFO_STATUS_LL_EOF) + { + len = (buffer_ptr << 2) -3 + ( (status & PLB_LL_FIFO_STATUS_LL_REM)>>PLB_LL_FIFO_STATUS_LL_REM_SHIFT ); + // printf(">>>>status=0x%08x EOF len = %d \n\r\n\r",status, len); + buffer_ptr = 0; + return len; + } + + } + } } - } - while(!(status & PLB_LL_FIFO_STATUS_EMPTY)); + while(!(status & PLB_LL_FIFO_STATUS_EMPTY)); - return 0; + return 0; } int Local_ctrl_reg_write_mask(struct LocalLinkInterface* ll,unsigned int mask, unsigned int val){ - // printf("Fifo CTRL Reg(1): 0x%08x\n",plb_ll_fifo_ctrl_reg); - ll->ll_fifo_ctrl_reg &= (~mask); - //printf("Fifo CTRL Reg(2): 0x%08x\n",plb_ll_fifo_ctrl_reg); - ll->ll_fifo_ctrl_reg |= ( mask & val); -// printf("Fifo CTRL Reg: 0x%08x\n",plb_ll_fifo_ctrl_reg); - HWIO_xfs_out32(ll->ll_fifo_base+4*PLB_LL_FIFO_REG_CTRL,ll->ll_fifo_ctrl_reg); -// printf("Fifo STAT Reg: 0x%08x\n", plb_ll_fifo[PLB_LL_FIFO_REG_STATUS]); - return 1; + // printf("Fifo CTRL Reg(1): 0x%08x\n",plb_ll_fifo_ctrl_reg); + ll->ll_fifo_ctrl_reg &= (~mask); + //printf("Fifo CTRL Reg(2): 0x%08x\n",plb_ll_fifo_ctrl_reg); + ll->ll_fifo_ctrl_reg |= ( mask & val); + // printf("Fifo CTRL Reg: 0x%08x\n",plb_ll_fifo_ctrl_reg); + HWIO_xfs_out32(ll->ll_fifo_base+4*PLB_LL_FIFO_REG_CTRL,ll->ll_fifo_ctrl_reg); + // printf("Fifo STAT Reg: 0x%08x\n", plb_ll_fifo[PLB_LL_FIFO_REG_STATUS]); + return 1; } int Local_Test(struct LocalLinkInterface* ll,unsigned int buffer_len, void *buffer){ - int len; - unsigned int rec_buff_len = 4096; - unsigned int rec_buffer[4097]; + int len; + unsigned int rec_buff_len = 4096; + unsigned int rec_buffer[4097]; - Local_Write(ll,buffer_len,buffer); - usleep(10000); + Local_Write(ll,buffer_len,buffer); + usleep(10000); - do{ - len = Local_Read(ll,rec_buff_len,rec_buffer); - printf("receive length: %i\n",len); + do{ + len = Local_Read(ll,rec_buff_len,rec_buffer); + printf("receive length: %i\n",len); - if (len > 0){ - rec_buffer[len]=0; - printf((char*) rec_buffer); - printf("\n"); - } - } while(len > 0); + if (len > 0){ + rec_buffer[len]=0; + printf((char*) rec_buffer); + printf("\n"); + } + } while(len > 0); - printf("\n\n\n\n"); - return 1; + printf("\n\n\n\n"); + return 1; } void Local_llfifo_print_frame(struct LocalLinkInterface* ll,unsigned char* fbuff, int len){ int i; - printf("\n\r----Frame of len : %d Byte\n\r",len); - for(i=0;icv-7P*l`wXrW?ZVO~=T6BQK;8|+>tEp5oq zgKjNUoUC-B(h<8l>4>F`PFOUfeR0B~NedGTOH&KIzt28rpL@?m?fd&Z|NnWO}?J3v!4ivx4+}G+W6Ot>J`8`K+H~5bglf30D{|DK_A|-d7pIw?^kqpBZ0B-aj zM~dX2fQiH==Lh`7H)&0}AQ?;oP*S)1#iTW|rCTDYl-G0{M0U!Dx`D|WIY_!s!AL{d zW3x1x9Fm))0pzso9XQUqv&=^fD(h+}E$=G`;3k@cuhcpp!yEV8Jd8@6z zn8W#ihXA&4xDaqJz&RW)0UQiClfz|zJpr3Iyvl6oehsjZ!xexpn7ays#4D=g-0q3w zhFsP?g4up^_krxu=pQM6*ZnnhG+;q*`B;y~UC_RHK~}HW8yQB)kTyTDwamj%YBu;VP@g#-UuSw$d+)cFl7rl9X zrN&L=^I{&auX3+nm&5BfyVqMQTR5WH9Z{t*s&TKUg`9q;d;P1&c>ON-`t258U+Z4~ zTANaD?JFE}N9^w44Nkb%zpXJk?Owk}vs{yV{a<;#==6~c#nStlRsLcoqfciuNk#0} zOw{bo$X>|>YH_bW*d*r+ndoyst;O7~8S=1*N5_yp?2$BdL3m@C0nteOVGL+k?BE<& z92h!*5nUZB`?Nb5R1W*Q_>G^OllEBeZ^DL;Hgv3v&n{&FO`)hsY%+^&YY|?UDZ%a= zliZZn-|L&Sv=~DNdN;}G!(aBvbF!-$k}A&{A0|hSc-E~G3!BQK$?{FH>^E{yvT8Sk zNV9nHW|<|jbbw6|#%vQ36h>+Y6-~DPu96E!CJt}SFe-tzNeQ&#MYbTMun<`pBdC0Z zZ>m(9WN*Ff@`;g;GnGy0cG4ubrvK^gGS$iFGe+JW)g)Jr8awKnu)A?Li{H+NBqg>O zA!>ll;25)2V3C7ase{$A1w3s5x|c@BiRXjl!J`+&olnwZRwlsKo@}@-Y*AaDPm+&~ z?j3hN^B!bVIa#Lcmw6vkEidy3R0|uENY=}lV@8r0_%}v=bxf#OHC!qFdrU4_E+>s0 zMwZByv7^Lwugf)KCy482$)<6Ma<_3Y;<{iICz4Z2#dcJ@v|6qoH$i+U1C+hx{#pHe zoFgF5%Q|w$a8GcvU7=iTp3vuBCj0Vhm@Ew11u1?i)SQ%C%%kKFCPXo9S|+^UQw$Xm zngJD0eEI)@bMtC<&f7MEvobrFh=K9R8-8niDELTLnMcb|J_tET6?(8qR4n3+u~e+vJZ}Pv$8LeA*b_ z;mLq<-j9$!pOUK6Pr84Z&kEj9k~5bLkl(+5HftF5z*64}lFlk~<=-Ai(X}+?yh_f> z4LRe;VOg5mJK%x|_DyiQU)IzSA$K1RxoYZPSPz-gmiZJqMLRStTgP0Q{wi|I+UarP z`Z03j^cNX@e(o}#6Hb9_>qg6=GxP#g4qG7GXM~Zpa^s9h(k!>lc!xEse(*V;8_s6Z z`iEreL+;I(@AQ!09Tk5sfeZ6uf(w=8wF{EhL@jy!wotCl(@)`+yr+D>4RWevnc3eR zj12TK3&aRJ8C5@ga*BLx=I?Td2>53>#@Pe~FvY*klJ`8kfoYZX$RD)y3Q+CPblD?+ zfX;xG!=8{|%Qw5%cp`0ke!Og%731TKT=JS(y+giBx-&KZ4nbkoB~mBvc{Eh#nvIVx zx|f-9XUCIrxpa1K@rh`;W_Dk)P;QvLom`cREPrG&w_BF^v^qzkXwGb%bjB5n{exhb zBsg%GSty?&=RDSTj8jS$Uu{Q#5kEN2Okonftz#xsTwnZPxHctJ+;=xJw3&41vBc=N zxqnB2zc*q&$=oJHsg$kKhPjG8tL8rG+sXo|8U&b|%%11&CJSW8yh!%}jgUtbm;+jK zz&On5`BeqaFm0vB7icLjAhtv;+!-N%`gmuii=XJxnduu(1hYNW6N+Rxg$sOm=AiH~ z$-AD6l)KFz-MQ7$`IW3+k0%%Ss4E?dW^A$C_2fjIrCZ+W{Qx?pe!m5^$&F%92QOMy@TnQ{_lsH$9*6z1Uf~p6-f0 z+I!(@&O6gAEL4n)X_Rgjif-|GXtr>*-0{>f-N>g3&jwv;-bf1pI zxZ)Y{Ngug-MNDw#sVJGnw^sk|qWc!xG8fvcLJ(#tl%6(A&U|Jx$(L=_6W-gnRZ;SH9IhCvlcU2CU|k(-|#gcL}!#`rfuC|BB* zZheXgQfJ-d`@L@YT%IfMvJH*9`-*55cg{iwaGJ?uHk60>exKs>b7Q%(h&7f!>HEFe zS*s?zp>o9^@6GbhD^!-*^A(mBXX9eXlJ}gFqtrdOz^BZKP-9f6T)b-N*n0_Dvr*+b z>0G5%@P_7EKxOIJTRXT$TOM%ApZ z?hGsaxt1+*{n}7+X2aT^Udi5OVd4%sVeK&F(D`e7x@q%rfxKqz0G}bcW+CD$x8$a^ zZ|WkXZQVHe;}<0)+U-+9byLY!y+D5APeBMT?)8Z!yQfZ@ z_sZ2313N7Rar7t*V!`N0<)ekL^4UTZW45wacInCq(@V`lRt0UkW3Ea`Q_O1NCF};zjr)CXirE zLw1E>NMk8OT8-ch{}8hsFP>z0dC%O5^5S(}d@p68FLkN6t(#6(cCwT-eVP2k%OgAK z{&3Z0bdbrUQ)AHhbAV0y+#}U^FU2=bvIsbFR40tit1so5#f_e_v2rwdNp5+@-K*EY z4=VeT;c`mVG~Y{X71Yv`1$P-;HIEJ5FyNj;y5X{H*$|W3d}l6uNv+c##0r-xGK_rV zuxCRgxhU66jr3=`D6an4EArJ1qkZa~Vj0Uz5X0{qFW1Qfh>vWXBfNY-hY~3w&*qSbp;kCCWdOqi77-E2q-1^=?|JJzvBZlzdjABy@Vq#6XJWm-Yi+Zr( zGRzD97|wCYRpnMC7_s4u%D@y!E5vYSO)p(p05kT6S+Q#~i_h;+hV&W2hBQPUJ64?4 zVu#$G5hAWQDEm!Jln2a7kgeOL;L~Pt^?EMI4aIJ1mWlm*w0v`WNWU>?%~pDZu^*69 ztoCHmvZJNUYGIAq@W1WOhLyuCew;YLEUsE9@2ZLEw^ql(jM^#xw=57mo;xmEcEpKe z!;$0k4Edof19LWQzIr5uEfXYqZlio)$Jl#X{<-0D(4Qxa9lDZRVX`Xo57iLDrjsM;I)a#GnfI;pXQ`W1P2>~$!%p` z-cPQ7ZJEz$1;d6xOv>1}>KF^-L zf~6xV)glb!H0_|t>qK*k)3ES`4ir9xooIG*noT-B7SPPpP3mV?bD|SEM#Y^N&EYh^ z>S&5O(ctY%#tymT^_VH0M?TCfT9x-QCgF!0?or~|msE~Fdf1p5_~ENre0DjjH?{mI z$%SuZ4~bPE;m5S{(Il^YHpzEe>cwXXf|Y=s2J$0;#UR!)OKyE*HkLBKT`}SL;9ltB zzH%1lS0vls3=Ph>OY2o~?VGa^bkN$m3$2S?t;_gf<&Sl!FVfYQr&$DFv-pQAjC-o_ z$75Qr$koHtgU+&9&Iz?mSY;Lxm3o&>!!;X+Lz=i+ZncA+I-@Q`I(NA)0O$6&Nr@v*C|VgNx0WeU@3D#2A$uau}`&7GFPE40K?;m-`a(WkIF1!h2P7vo@yd#yIb995fFAgtq z9vLLhwh#6>nM~FO~RGaJUZY==N3kC0wJ@)gTR{}jxERDe3MQ{7b5;Y23rN}44mGYw0o zS?C(9)&*b0Q$QVNLg)~bH>r4!&(bX7YiikZEu%3D@n?7lk5XpQZ0x+SVksL!#MBIx z=;@VaAsZW~!F$W*N2*GD&WxOD{HYKl7pBpg#o5Q@wqr5Kdi{>agnx~;LE!1F;h8?-aBNWvf8jj4cT<%i?SSTj!$9`ux>K6)*%#zi&jf>{`VmlYp{V*eTSQKW46$BDoL zww`(^^3TZ4|9F|~-dA)Yn}qMsTnFN$Xrh>fN5SOeb0Et7XFP$#r5{i9Y&MHCGvs3* zXNN0GKh`eDmA8>iZ^bi(tldhV;~LgeV;b?MHR+^_zcLK!lK9LVIrFCkIj4tY<%8_q zdAvZ#mN(?RKVxBhXunw~Tg&0WfM3VEj&MvKHV|&(jCN&aK|IN{VdDtdr z3gqQNls&1j8yxEGOwvs*KGh?fDS|os;BhFjR}&8TteT3~x`G1YR_ z!JqM%%E`uuu$Gsj~0GkGeoew^PB zx%GeECmr(6ru%%e_bb{7S3Bez44k95hwYlTJo)S^zV{t=g6(HtwT3H@a4pHjcoI+W zui=vkA;%di#7RnmpK838h57@!dL=bSeGclQboJvEIgHoxQNK!8-w%!*hSXn56J*~n zg8d6!Do-ME$`>Qa4!Q7)X`{*yYYvZzr0x+c*D%S4W-@WX4$SkIREoVkX(wMP0^J%%( zMgI7^OXA4a<%Y|B#E~oZ-MHL^(663?3rVe^`(nNiBRGCxxU`!pZZstc`(ADvNyMS+ z6~xd2AZQoTzOV9H1QGk~m1}=_HM!g@c&W!hmS4_emXtHOl(B(%xfb)xV#+nS_msi^+TAH*I7NzT$BYi)p$J&t|7Va zO8f4R+pZ75cYRSez74pp^QXT4vUD@VdfjLi`|M?6ngx#@YfzUfc#Xn@jvup4G&35;N8xX~o)3P?o4x@( zY|5h3k>=nGh3kcK!>@fac5@dq;Hw&=>X6s9>3;*wla-W4?4z6q4XVG+L{+*li^o5yfFEk z=K7i2NKhxK`;1Cb-erQdPV5_!j&&esy@IiH7dr_a`)mJ)la9mV&$E>V1KWyno06E} zxpEv1(sXB|&<2^IxAMYK)y8Qloi<6!)h?6HZRqG7l6b}?|E*lC3PENu$wyA_h{sOY z(h-mSHTyCcLzV6L>1(;Nqp!Z^=M1^{7TbfnXimv{ZiUIlTV3_FKd0W&a^@W^FQVnd z;KPt1%q;fq2PtuM&R;euufzK*v1x-n3VUi@B5c&U?~FI@-6oOP+9CHEqHWd5_}{`eFLfXJZ<9 zm#n3YghbBJDgT4!#%v>y#zrXH@x#ipXCq7R*{|b=SxUFtl+8m4Zxc>4MG`qn&w9U3 zolH*V|G%&<*H|M}W4RqWCh+5Jx7;E9Wi58-rBD9-E-o+Ex?rcKoOQAy{TQ9}mrva( z{pExI3+pYkS|krx52#$*ly6{MV;?&oHdPL((KE|35f*N=sI-@Z6{(y~7@NU)48MyQ z(YiWz0Dv)T8>5J(l*P7_w8%jEN8IF=yL8K)x$z*aGmv5$6-d0j@TyKoYoYx;$b;5O zhrr&2C}%T#ItC#!vTU=EO^$5GZ&P%AA7DC|gqxXsA{Ls(m>tkDhz%MhWFE?XY>$v( z#IeDAQ+xSn!7n;lFt6-;pYo* zMiCDPVUUJ>5>SYP_Tp^Ef488gG~hK_J-#H{aefI44f-~=uLRV8dzRH@JAPH(WkE9U zl|~^Al6$N57gv^9tj^C>_o$WME3twJf+4I{hR}ACIT09LjAjWlFE8Q4!Rl`+)_?As zQtQr3rPkw!Gs^3(o-Bpb_GpcYiITZF_)j*5(}i9nSd2bOja^93he?{sy!Ehd3@Q{M zYHrqZoUY^6<4VV`q0?jNRQdWedga|Zr4}y|Cr0;T{q&x8F7HHBjceGcLtc zIjnB{qrSd3|ERT$e-v%%LhiTzn#P@`)htG(!u)NlBV;|g#3jndeYfYqcX=$6iF}(m zC^DJJa8Nay7bBISR5KStJ2Dq7TVk1u`#HZsjEttcyh)5FGL$Gn8@x%xD7NfJe(h4; zu!gnEFiK+D{9os(t3%{b4UY(A89tl$VfnR)R{N5O$0Am9JV836u1J<&OTc%Qx;RHJ zhpV23G1cFa2wirY1%ssPr-Ju0Ue`~)uAgdJ<3l3pAYT%cy3;I1e68}0xCy>Z%%)}` z5GOz4W*yIZm1o4MO}-?QC>$c54A(-xUeZQzoX{Ysn8ol5D*y0X%n~Zk{;^o~t6e;Q3!_C{30^tSimqh9q$IRj$Xl&; zwHj~}trB#tvQ$aJXWmm1u#3#l;-^mW-*U}j*frjTzpD$=VMLGG&gPG>hAMLlfk4lr z7(BMBJi_+7jQ6Gzeus~S3-XsfILSgj7la7oJd7F4+&|U$+bX7xMrRg7Z?WiQQCwY+ z_|w}$SNf5VSZ6TG-1ZxDDI`3h8Gfv^Egv$3gIeUY|>BXaNYCtdsDg^(cK zjb*mu>lv)AYh4UkLRf#O*pgi??!rXV|Kt@f>*MmtT**()>kX3w?y#8xqFh_ zGKN*Ji|8nV7W^Bhc)>NuJ+|8SNMsQ4uVluA_EBcB`z+cXNMd632X=gS)NzQDA)D?V zO-hI74WWp^??+}V_Mj5XDm?Kt-}yzca-5E2=DH|*Qg z6he|{ZjZa;znsbNgZ!_$#FW-5gW@Kp(|gBkGwivyn9cL46m$tEjIc;K3>lNw| zj!eUPiYA2{ zcHy#k4_-yw0*dgb3k+6h;Qc1S;ZRf&UhU^jS9waIQ`XGC&!IIDBqHS1D|a4;9-2fO zBglf8u}-!u)(Wo_bYkb}#KU5)ZePi8r+d-aEyTwgq1EAXdpO>)EP~@~PseM4FCs~y ze$4+(XigM~j9tk1u#teBl9V_v+^%w2y~|Nr5k+F$TK1y{qR6=5_La#Z4*guGjMB7Jh#`JrqqMM6c!QJEhCf zWLk6wQ$sld>EkD8Wt*>`2U~LGoG*fCaZeH&e3i+rejJJ;F@@dV3fO_S=(&Z~^&|tP z2I_3X<^|A2O7EOB0 zv9^1g`x8&v5=*j4J57lr_$+~%QCj&7NvHL_5H)U}q;0*(8(#Rhp4|4Nn|qUWaZ8jr#ODGZZ$Uc{ ziZYX1p46O(C3OugOGM@}OPkbIY{S?(XMO!rsqHHv%=!)a*Z74BGC1sLYhzDp=X;BiH zIA)B7#z^D+6w3pB%5`;N>N_jnsal;YCXxg*`E577nnV)E^wXg;c`q=}Z^|hejtcQU zPh+JXanY45W={b-H>PU)3 zXg8I&W9y3BjCZyB+j4qh2#K*;c(Yw-MqJkYTLydgi4Bh~ICSW3$M^fZDgYWG6fy}Lj7w#vUZUX}2jSGJ>L^_`|P3ItRem z*l4$5B-k7Nh=Kd{3>(irbDVj%Ym5xVW^#E2mlU5m^;iP|UYBeCn}CoX<-4V9lAQj?IFh!txnfRwVAY?#Ov~OJ3cCSKpax`o#$Hsh7uOGikj=_lzWi@N$o|9;dCW*pA{$)R;~}`g`WMx@cv` zSa>bySqc0s-US~xrEU_n3?gaNGLi()zoe54&lWTJ?kH_bCj-5_qEKE-6Eeua{$5(* z3wgf1sWSDd1z!1P5lahas?;SbOy!p29<)A#4D)P7o4vFngY@?5l7;eWnly@)Z79#A zxuZy;`g3{2ez3oAMrH3E1avs98b!u>d0SBb8Et0Gyem+CU6ng?G#TV`faz-{=f9?9 zqsaiz(ifJPZB)Jlhqu@`TGv?O*kVq(ULLb2~tIy#~@tJQL9qMlIdhUwT&h5 z!*^?|9P@VNa{|(G?T$KuDzTHFbRv)4G=w&f#m0Fh^%zG6gtMd0Ftf1njP?xxU?kZa zkJHKHNYCyqSD5Vv)%&#b`i;oLf(@kQB&`~UG<_V!?6%%NSf zRNbOMS=bp&qG{}LoaSedNBZ4mCj4-hncyp#$yaP94585v5kD&ei#l#!&0s-BEq}RI z>rvIiHywJwC%#fvT<56-`BHJgLG`|Q*^X<YH%QR&U}1?+Dp#RWa8;^=w0$BxFH!q* zFdiBM3N893pJe^9!9~pU*S>cHe~sMRNnQf-F-khDlHWXd7jm{c(8LqDBrK6r#<{$2 zTnkN~M26n)WG`hq)RS<=6ZwIs(!M5fu=1==T*cl+4@W|27IKE)#WZ`&R1>x)T{)l5!bv`KE-gblz z$G@!c8^V5kr0AzZ&g2cNbc|2y@Wbhzl?bY3Ib?+R?_2ah4q1RmnlP0N>s8O1ngqW? zx?c$Oar^Xv{Oba>O(mhpvlLQ`-!3!xcPczw`>!*^D$kaOU@LYl1 ze5><2725nX=}H$*BZZ`mHcdm|n@>CNh;GHQcSSe&TFQzf({P5SPbcOutxKjPHtDYJ zYNnIOw6&@t{t_Q|1iHq9ok?8@+i!EQCGiD~{BlA(4ap@&tN&n^$r^{?g^Yye>Q8N) zr#1d*X7cG-NCF=hD^-K|&jTAA(22Q-y+N#d&|GG^@J~xj!?CU~+Ek-Id(l$rZr@Lb znm+?0|H&1)c?O9Ye;#TzGgWQdMT_#XjC^ufIm{=Y_F}ld4 zNJPLqb-3^f_6SlC^6_5A22&uNw&al{9v=fLfjPcmO+4*39;VKmi7adrchg z*^iTCFLi3sUuTisK9^aRfCXkXt$mb41a#95EmF+n_}e%=h?jrN@|CwX2GMh~NVj{> z%FNlA-EDN9`dBj?LH;8eW+6Qzx`lD=q4}{f=#GsrzUv?KADW}!2Xj1f=3_p<8#(^J zbd7@7l5#AHAASbB@*ykQ*VB3huf_KS;I{y;?t5*6zN9xSBqqFqvrhtg4$vu_{dsDd zgBKBeDhW{d!(;_z8B~ujbX+M5gX-EEc})>*Im0n310KJnbh_qc`QKEJOy4|i@VBB4}XKqlYq%wDQDlLKGd zZ!92R5qt|z-n&Jc7m|q?SD8xilsSyMD@eRI1suZ^?+^n0xbwjy-W#ISSprQcuV6{< z2(Q4wC=aJKi^!94fs@%GjG5HE?e=v*we}~u0`q9fVjMAPd(l-Ool5f-lf>jn>?=w| z8nQpQd^G#Q$l*{vSa&XEfh8bcPj@XQpNN5FN^;|2Ci`yMD~rh^hSbw6Si?b-xjEdZ zrK*Xi87KBO8nPSo^)#vk5$H6{DItl$r_om?e8|kG)L&sFo~9Kg2nna@9z22>pWCoY zt{X)w8k5s@X*nLmho(IR^{QPKd#4wj_Y@f#_x5FV^?sYZ&sAU9Y;{y{Ya-2jCz>95 zicE~H<4qAL-c}AL*z7>3C5$xH7gO?26WAHe@eSWVdwprnWLN zO?-1dwXKA&UMeF!#O`66P!3*l7xEOEvJx9;=&+LX@#>ywCT}LQv~W{E_bfAcL;a## z=x(FA&yvT**H6(y&yoRT4{dvvd=#+r3_2dnJ8q%%R?O=iIN+HoThi0;$1r?pe;Y{< zdnC|Y8%EBbmf6U(?mhIY98`X7H*K+z5G#JFKwdki+FV%0{fwU=_t**CQH~qi33m** z*BOr0LxqgEmD-HlEq_T!9A zlsrd|yg)+j{a2Imge~FQ=GaT0Cr=mx4}mDmHPEjhhOH$I(oEZ5B=Mfh5gvQd^mU}C zedwP^Bk3N@HYqxKidTg%kzd8&1lAx<+%%P@ts~p|1m`2=^kef5p5Xq2f3i{8N|-G8 z14m@z*-bB#cS3@5!FDhcgPj_wDPh%dYI&KAptoNpL3byZLz61W=c0UY(|Y**6k4>N zyoNV5(gyhbTDxfjc}^rR(Yh+~hPV#zQ{d$Gr#F)7E_fXhw3WOO5WI@dh6FQt{;2)L zR&vCfq}bQILArSoqkZ#R>3$wV@qwl|aS#gwD8 z`5aQ54vC!GWA8Xe9wJt6$L)c;-0##T6;3^YXDKh=aHr|qW?&fbX}FXA7rIV;S?^%f ziQxZN{F*z2v$|`)`3?ei{Qr$`=HKCw*BQsmrem7g%HcwLYYR>k!!sSXmx0FZ&H-FV zP2Z9?tWVWBZa-~v+K&oCpK3toO}NkFZpYmL#@;mNI|R0R zd)0TOMI@#6<=>MKV)by`egowC`^`>uonbvKEB|l!&h&cNOJ!h}+QfydXX{q6+e@o zyL1~@STJ`1h>g<=N{q{k>4M+L`rxd^iwcaLFoON&Z{z__dkGN-k%fgTr3>d28J8A3F@IS}!BXC(B1)h8A26zvOAF@AW4&}Dwr>-~AG**wU$Kr>_=-vP zHC@F*(Nk$m+x^AF?n-f5LCNx^i&%Rc=Ga35MAF4t=x}T(!`*^ANqx!bD|Nuj zdAeJ2I5uZG95jXB^?07(cN3l(%*w1D@a78L9fsVh_J+gpRyuAVYd!e0R0lI0?po9_ zeC;va-RN-aKZHA9z3qb?j`twEayK~~P8elY$Kbj;*Zp2Cu|^t3!qj_k2Rm+EO~MnB zzPK6BW{0CP9nW@XT!Ld8Xjx^!Gt=SNI2q4eXo4k-tZ_KDcHmjG4#z2V04#xp779rtL4?M5pSu6+!Z-?Up;0;lD zw&7`VI6gd2kA;Zw$$5|~0XMrO+>mW;9e&hUgEG6)a6`_Qv#1m*j!e!32oB1{$Sa{z z7@nccutVfGdqx49iP4!M_m#M1@f+ZRO!y3v3 z2}u&Ha)90l6%&b(8pFhi$$qGf;uPRcY8{SugLHN1iPXbZMp_vrK0+#JTbP(Q!y7G% zT&=`BhvV-S!1cPiB8TG$xC@7LbvD#7U2f>=svM5`&FH1Yz9d}q^V(z-L;Y(cF}MYP zs2}^C5DQH(iv7hejWpLN{%zEi$r8DegF6>@9`1bH7Tkrni*c9YF2lVFcLnY$+|{^i zaPPEFjumGR>-NDAppXl}9#QZJ!6N_zj!PoUWrSS{p#G!ayS$*`YqC(irZc{4A1A&6 zIL$zeOlcqRA;((@dyDH?1B7-d1cA?M4Blvhi=}HwJQaM<2o3)ijFHoc7@2|(>8Ih} zVs)+TAATwLFr$jMO5`md4H}X?6@rL=YYg52-syHueDo_CzK&VQ!VvsY+Q+0i@f{e_ zObv;rf;WDz;Bj(B-ecN<$ayIQaqBe(c38-}!inV!dR1!pBgX`x3uv5|(mwfL8vY|D zK$H{9+xKl_cq<#@6Jd8F=)=z=d+*eccq;fI$r}ED814=q z82TUJ(LV%eVzap(w{|HE(%#Y-G_l!xNJHYO;72Uc@MoEIZgj?{f1=_4vx?2C&iK(0 z9zqhUlt}YDJgPbqjNPU&Xud%|>?N+l|B*qb_ZDNlwhv}A!~RTfG0?yPx;|Mf^u+Y4 z$+F*07P}bKGWG2zKH*!Fg?d=f^B?wSdyDUhG}Rq}pYpTZW61ymrH+yK`yla53HYFF}}=Y+wp#Y`VCYelZMlN+eaW|d%cB0 zd#ja3r;GKxZ2u-*Od_7G5_zYUN~6T1o^49;^HJhYUbSFY8$~}EErw>+qNCb$tY?xc zXkT>nF8ieo6SNkp)?Nj&ACO){nHD0n2$L1$Rf)XqM|)+84|u&}1otF*)H? zT-wJhPW7_GwT~R5$_`KI%q~wwbDT&t5vLYxP}!KD;=m{1d5do zc(9`4%yz~>b>{a=7_DNZ0}?%XpZHf#7~!K1YReY?<#~b??GH^BBZ*f%JgQ!@mrfCF z#Oqj;M2^+b+xLq{d|((BAme^uzBro3OcPhpwK-x}X0a1t_ANPL2Jt-+CJ`1U6XrRo z)_JLw_I=aD@x<#S-0o9>-kuJ1PeS!i1^by?F^YJWqU9R;%M9^|R|C3jNTBaOC_d`d zfT`Fpn8rLL{^WJSehjR~x%c-Fryj8?H(V+noqVevhmoob9unL|=;r2(U*o}y933gOXC#1~|!o7sF+Lyj6 zjxvDr-fd!cLOSfnwu>`~_+Gj_W`{VAi1sx5yg!RU9^{05#T#O%0TknPy*DE9QzKyyC-m#GW2xCk3-$di}3rhu9?9uk90O5z=U%zF(Y1NQM24_rwB1 zR@wayh}i}*kLJBEI!Fi2J0y;UsbH0zrCNHQf;B`(-A|naJ5Kw0^oF#yG2sQ;_>kfAfnbaaX%_4JnPv8UCQ)1kk@(cq+a)Ww5Vu%T>W7SAZyW(*k%{^$^BZk?r9RNLuAb<;b zN)i?38f*jXK@U7)=xI&F%oK7!7XiBck|A-G4*pOw^sdsup8-CvgTF#qxjY2N6|}$5 z3I53)7Q2A|Y1A<}(4QEpBsq*oWgtd(YLN2(5gyv9{pe1x+1jZhrxTpl37*plezFr> z(h0V8g4cC|t+Z1`O(%F)CwNaM_+TgagHCWmC%DNSwu;}nSBO_T!JUS{fT2?_b;t~U zk|7QY9Y$XeLg1%ylEJ7Fz*zwg>I6>!tndVV5XRr|fF%4i9nIO&1s^s%s;EG(0C6Vm%nfhywt?>m)Kh3ScpB{|;NZz%Q!1sPKDF68>=l&X&jV^`KQQ z#vkKvXqL#cU?663f;MP04>;CgDDXEW;ZP&M4i)d=B?;Hp0H4C)7>TT6X67Aun6PTW zBAzEy0X&AQDWcHE;W1F40`xWDZ-oXP(n!vY?N>iIAcxxwM(z$q7CTpsvS z)x%4HZ{YYhBw^tpz^xp9R}v!gK-kXV_myV&hqwP&+t+j#txAXg?nLm7y9qrmNhE=F zsA+r~7J^B&A@TH-gzq*3<^p*Jx%2Z(lE@eqH_}vrJhLR>!6r1{)gAVS#-39plEzFj znG+PTLvFw9>oT1kMSOgYw!Xp4z>fnhI zSrCTye2Ber(B25VRb%j&Bs@OZrIA-LLM2QjNN^H_O0ShLG1D-K3xEyG+(yusad^8# z2Dbv%@JA)#CkQO$bNm@exS0o-51|*FJbo4Pe=a~54@o$B!_`5TKuKtT#DYy_&?P}4 zxrOL}&w?&Y!_&ZP?Pp8Ei{5~9IDH{H$kpMYz?vjjpoQbt0H@49?v-7(NJ14PG)SD_ zEof{83D>C0e#~R0K{3aFA_*CAG($ay|3?z=Nt!_XID8Sm+GOpyK;9lGE0Re*s+Kf_;Lq9K!;FP4y9VtHF5ZR$x6Cs!n^sH`--eF zyFh@;muaV59A-n*gbHpk-%Lrk!p4zU1d}l*@>V7E-J~7!sbl6_BMEO?U?Hxt?>OS^V)#b!1HUAw8xH4VDrle4%S)G>jvICbqK35$0ET%$7V zIz%%3Ig7QyxH5bu78?wOkO_LMHC^wMghy`B~n-i{3?z=C<#9o0WRk7r(jqEm}~6! zUx}viam z`;fF#5{{umQqSp;PkhTPa)85!;q+qDIn(p1o}zj4;~PJhvvX=Nq8U+vw~YFaG*qf&M@XcY`A{yW zM;8151kwUs_ZgDa5ZBH)s3z`SDv@bTfSY-Pwb&WKsXVyE-K*KzEf{3-4tK#~Ohc{x zUX+y!?QwPgP!a-Gp}?nM_kV%D5HPn$_ZF)pe3_2G;LSV4PG?6N;2PcmV)p|WLoI{p zfykx4vQhCpy1~Q;Tnu|8O2R=XAl^{<^+=P17r`bW z@!*jy2rqpC>H$}%_+WoY=rI``Z~=p(A>a+b+^K>G!y?5xc!DGhGrEQ>cse$_@DU|{ zVC#SIGD)ySL85lv!D>l}WhT>Lynt$I2F#r%7?EuXyqcWm^naIxX=PA=huYvTA&_oJ zg0D!zc8g1a5E1w+@PoisHYOoKsDOzy4MH%F(`|scMM9uaEE{tnP-IDD$QbpNolvCC zf{-Z^na#$O2eJ_C1;d#Fg{pudET_x|%zYq)rC@s$81{$hLtX@+TxftRq#BWKFbWBr z!FxC~@?#hX06z-(P<^}NUBLywV%6LMbRDN}X0+_${C<#x+cmJ*F%=)`t03_YTmNx| zMqsDHB;=7RbO0h3Gf@_AfYs}017PlCq2sXgvFTuF{OU1`aW$u(4-J_>+$TcICBjZl ziH3g#FL>aDU95vu4MJa&$TC!DV;YK6tdUFrb(#pFNXg;~bqpIN((N?h$-G0nN}F5; z_z;H?y4CLwRQ_R}a7t!TE>KvgB%C?G)_<;XSUftg=?MDb5B6b9HKz>2yq&NM_(rvZ zu*We(HGp|&4qJxBiqUfmg{{YVKprf@BVpL9l8{mg`ZV5t2g>HGo3wT^%SCt3;QQ>eeXqX0&uLa>fB_iDb%$+bCi_vH(Ko~t{U3k7E z^e<%nU*#1~Vw!~k9?W6v@2l3J0T(D7W%c46BGmp=h?-rT{#}VY+zNW`GvSD=KTE*p zbNuHL3A6y_77G7KB7$`uD(X~%2n3d2f&dqBI0+hM0_I~D0S%sEK2gu{6D0Cj4LS_s zFiz2;HUs7+k66fk275tvJRh+FZIui3xFY@}3D$GWOEWoxZ4&V)0i4U>I)qju;3^J( zgd7hVYEBn{3@MI@k;}wV zm%vfjUAHrh`7DdV;--ESqfW~xD>9zt)gaizJJM?%wkFxvC}tkM1w84C$Tvq}&>0Arj5 z0zOZp%@SFHA<+&fq91`5R{*Z#^h@ESC4jlW(dB?ydkubBBKH9#VVoYzb9)Uc1}m^t zh{gdyJYZ)7EXQ^XiBq6!k|8~x5vX1q{VOZ83k-1e>~vnxGg`vWj?p1ks3$&GxQZdv ze4-};+1Mz+HYNb(f6qA(fSH&}-18Z%1x!OeW<6y{%owN=3q5O5RxU2U2T0)Z`b4QH@lBGc;t^D&S41Pmtw)&%|r(~eoCkkfY{^cn#-sjx8&htI2! zRY!4nlq9Unfxwk~|8JZukqxW?4;01)5_y@8VLfk9f(|jQv<{8WOF~Hsz$%Vk4?Gw; z@ij#IbBzdF$XBNq7wcdP%(fJCZOW3ms|#v17Pe9sOCvjT3-NIsG>hDTM{B z*h;AaT$0GB1W3f4F3w95ieN(RkSVSkoUQ^4xYNZ&Nu&%gsZ`s?;UKcL2Jj6Ir$GUx z5LX}$i`7GLO6@!$PCc4+t^aWt<2abu+2DDJJjw*(YeU=?Nr>KsF{|Yr;5dD3HR#hg z{DDNOSAm{eBn}#?AHS*7Fz$+ENP!P{umlntm$>U_tK=U77~qQUA_^#Y75{x_stdw@Tn;uEl# z{jm*j3x@+G;W1yBObMk(i4)+(@j(Fjm?a=5j4#u{194c*G~faz;7}^wPlwL~Ea~7P ztgdPH1Aj1-k>Fv%Qw!%W>OW*~Y8py&N?B<*owU*rIbukvfN$t$FIv8ES^ptJQwJ*0 zQ*(+GXpkFjs2gsW{f{dRMuXR5i%UutFSPHl8LoNyFDsd|v}9Vr+=BT}6)d%HeBLlP sz<##M@QX;FdEVd`oU^o`c+S#-35%C1KNnawzhwU6MfOjqVW{{20V6e+g#Z8m delta 35645 zcmb`w4Ompw_CJ3189?4WDDSTWsDOeFiVBK~ig^?*R4gpbF|{yJF|n|)8Inp%4L#`A zLZi~c8_IMOJb<{+2uic7{oK}yHY)#@e==U zr?T6(uXv_)SBtMgh@h1FFC)U*fDvL+k&+v5H~TV6DSmVE%7&OFL)KitO#vfGxDp&V znxraI1OMim)RHYo29p4k)cH;^sYNk&P9oXL^3MH8zS7VcOj?v+X{?Ho2C%OU(lAn_ zoRst-Wn*gr^+{oc(z)u6-!QmFbivibixDD`ZS+EFIyx}SuCWFAL!Cwo2M*%M3us7iT zfXy5Z2HYKRK8KBfLjdP+I2o`fU=xQ;vZ2crz(x*d0zNPM34+8Ma+HEDNu*FI?-I#u zzoAQC_SF;+rF`GzHO(8aV3BgD>w`{c*Q{WRSA5|Rqh!dOlO&gW7|LXW&snfEn9NC; z>bEsX-sKVXy0_Teva3GvArIoO1Sb!M3-j@BzOoYkmh3u`oa8~Ol(y8N;@RDbDXmB7 z*}by(`{$X0K%jLiQ!?Fn_MB3jHl27V$I>4243@>;&eI)LBvHAmYi#0X!Cw|u2Z7jM zCNnO`!jXAer*GJh5hck*N`3EvKFlC2W-^u5-f=#fib9gC1o!y>+MMjukK`!+rn_)I z)igLFe~3{MvQh>Vuozj>OZ6vur{*g=Okp~9P%g*r)_4Qk?8FXH;|qNo99Svc(Kol1 z_dVvo<~XrqR&uPj16$(6j<4ic=0i=ZS|@g5Imd=OuuV?v-6uJgTPHPtZC{5{Gg3J+ z!_n2`#6CEVW3wGtvlIJp4#$pjV5^+ic?}#}=)g8Qv8B4)Sq^NQ6Z^z0-nYboHTKhV zCRr)gXpSv&VDp{WWo;a5bzrUi!Ys_a==*F2$1c~gTKjS%Z(r%&{+z(ut2(sj^Y&`@ z_SG_P-{9VEsnWerP{bjzJ|Z-0lki;fr>qFQ=aoyK3xVf5K-CTWO0y8BMMGqO$P3N^d8 z@7to}_aE)U0|j%tw*S2%zS{fuWM9bx=0=p48<38~pN69+lE*jPi7XEcxPuX09-#Pe z!vm@s_;>M}y-I%O13kVulr_xIzBDnfjAb-caBWhiEViyddSRwy>`p5uGkbe|b1pN^ z&<^P)B|GZ{9}i7Su#?^!qr?n)(oKMwO=Hny{x(|iAKWh`Qzb@zl*J3z%FR(_eXN2o ze6!F^ZP)UrXtI7|Qi=vAWywQ~YL?AZv#fZ5tp=$qKUT#F8eiet9E~Qq$W?FU$lwRr za821ZlBu+0KYweT%*weTgKv$hRH}xK82ZhjTXC1g@8&?0Qfr(L-N$OM58ouPtN{ys zTgTei>YX{48Dv<3_-&(-F>HRqx5r&EOS{3&p3GI}H}amxl|#dNBz)U?8?p(UtX1*P z8Ow%Nm~#L_3m=|DW-B?v2a^>18>hT9JWNzpsJH(bUO>hu$s-1mQHpuQP;u22rFO&} z;;QY6X=IYpd1RcpYBp|1lNhz(Wi+fjp)`)XLtMEEls%N*xoJTiJkUHxTYX;0t#pX0RHpLT!Z7EDu%waYr;8R`VUt`b1-_+Uiv@`i1|I z>*=T6xo$cSuIlv29`mdZpOWC;^lE`(9J`r`Y8<=Br_dp)$+kdwGtcN#Hbjj%;E(6c zzij}VyrzetD%K+STVED}WnpnT3u=U?Q5LE`SFGbcWRm3ZbA2{2zF8@N8ph|j3`)9l zk|Rh(n}~S>nA0MRcn-{NzXC*sRfICN*xMS zJvU4Vo9wDk)xf!mZE`r7rZi2CBFmN5$#1c4HFq!b+2ZV0eUDO}w45 zMTK!8!D`Lg2{mhyUbB7|tke{`PTuCiM}5yXI)-DO(%T)33i6Q!VuX#1THrk#uN<24 zmmDGk{}}=QnxH%;_xUzu$GvOWh;r|HLNBTS)ep#4Jf`+>@l4gghm_Z*%I+AlEs<=FI>Nv%?Bev0YbW?tk|?eIeJjOi}g8J8>w2!>&j5xC*9VBM@Au7U)MkAZLS*_Zw-7;O*=I$$J2X-mI$I9>z8#Fi9Z_FB`*Ai}>A|^r zq06B6GL)&6!OF1*-MutdS@2NTj!a*FC}!$Ph|)C(N0UR-Ps{VBbBvt%TQls-eM_4M)0%IBluf(yI>cDjB~*>IWTPtrz-i6c2)kf(9gG})unlQ_be_hLl#QT z@_UmkEF8t}GjTsnDShP0+r_u{qCRAflDTL-vsTlhXS38y>m1Myb$|$9Otbk%8CMtF z3NA&Gg#|H6RcRFIuGE*_Jme@}w{br1+tP7xvF-!Azen*2&O1jIigg{bajz$JjI8*C z(*Ec`r{hp~%~jrbEQbUk;SW^e%0{w5%_`gFLSkI@3bYs-!*{7t?VF*vYyLzL4`_9K;wWQhx?gi_9OE8FrYQ)IVgz3&B=g>!L%QfD2I zaO<^D7Pm};00d3m;k6Z^z86k9!q!-!E?-R*5BpxY>}ZwVla-ZE-Jad6OEh+4SFNoG z^YM4|D}fq?%hZZw_p-S@$qs~;oW_p0oqo0JG=^hhsw{#x2CQdMGgx3|{*dFws_k#V zis@-p&dR6fIt!e&&kXH5W+9K&VAjEY*Jdv zty!%JV(i&A$m*A1#rTn>az9zSeD!Vl)$9Sk9tl-xw`N!s!bS{ZtyJ2UhmkXi_lj7r zDXVqhAp!X5JXDrLMis~6@eRV(`V3~^)VsWh*6!zF`OJvWIgRocdfIj7m$ zopY3V&xb;`TQhP&Nia9Ny8LM_*|1+pUirXnhr3~)vSnpo*QKI)WfVE8wBrzRWQ7vF zD&fH&>ftg;Ul^S;d4s1}z@eKKN6g{5Z0zi?NRv#}LnM>=heNVRck)r5yfrVnPia`6 zqiIt-YcYt&JPM{N}p$N3G5EELQk2 zbBIyfJS^>njiZmD3?t20I`h6Vr(4&c>YEUy{Jhp5yT10d!+eSzwl!9iBEOH>q%EsMD2TT-F9#Q>TbYXl-JVs7gh^%i?qU6w|IAUajYF zdqydIF$wv=`l7qqPfk|qfJjrCUhG4zuYIW(`F!n5VamXbUB#ta+1-Mdg2@u4@}>E{ ztS<~}HvUoN3}ihDEi%Od5aO(SpXt!HN|S2rc}&RWIY70qT6#(`{k zQBs{@){ZlrvG#0;B5xjbX0ZcP?c$8Bk zEZ4OCrbe|s5*fy9W-BivZj!~yr#(=l_7cIJeg5vrMGo0P^^M%>oO%Z4k_uii1D{|P?T#%U`5Btr+2e(ENRPt9;` zzj>ZKwGWd#TxodK&t*s5^y;FJSsgU;2QN>h@U_v{jMu&vDY?$~#r>-+%3CwLDL=h7 z-p2}o+OA9AB(2;M7QY{AvJD%Kw^R$4YihYzxVf-MN!{va*^n7W3fwc%lh-n_l}tAa zefeN&KvUR(<^-pi#c3Fyq7F1WIn8<(K4y0s%af}((GeF$CGJE|&fzqFxX=`Lpcy3# z+1JYFM3rIK;g%IRmE0uc@C8K+JmIH~eh-%ii0i~Ib4avc}8!^$kg4_0OI z$)zfN^G^**$?JLjQ+V%l6~jnj#dI>2abYQM=^c|Wcb@ct3IcXDD1Zc(T|`s!Pi;!u z>(jAD<-ZX(3I!qT=HR|`w#M)0aPTvO-z;~2OGn+z?`M;;`;F;XlEH6Y0r-_T`IW!I z_@x_vHlw}RrF})FS@4y`C$4dPiLM8#^lI*m z+Pbk~p9-b5u3tb6QQ_z@6U}8?+o9z zzx9e|#VT7vf^QqT*zPD>-b{?&_}?gR-mQye!im1Ffu#7Aj*+g-Q0 zXB6Xh=yuYfoAIs3;*b7+khXZCQtd^wCC=K*_h;wwz%u61 z9igPceI4j980*d`93Ix}98DsWlBeC5B^)3%E-MV@k)kHjbYmNv1e&R_&F3@1?Yu2g zTzF8~vRhm89`RI4mh}*4Z@r28?4`Hjp6cLUviLUKOU666m#k5_&q}|E`z)+7dmi$U z9qg+1Jl3(O>|hGilj8g|*kYja{P51=1K7rNDE?+#!OkX1xyvS@#5UU=@+oq#Z?Zk6 zhMc}JW9!k)*^(UyezrFpB|yvG1u35+6d1ifLX;hcrJ__$Ryn$r%G0+g)_qCvW8J># zKFb{vrT6X^r^mQESE>4oa_r%BrSSbkpV}cO;Z}*ACb^@ zsAAY(6<>2^tE>3b!#AzsQ#UCq8{#mw`i7AcLNGQpIQlhSDnO1v;psW8{JF$3mRckhkWa)ezdXdap zoFq36e$o8lKLuInd;x7@hqe=F!{JHr;!JZ~P9|1DS@4U|+Ct{xTR8{6f6C-XZOK%i{ef zFb}XU{IrRURn=9P{E8xf_*#kzaVos;(8p7yz&?m+rgN8tu@Oq}N8bijS!0E8N2@rE zDBee2Al-LuIFd&qV)U+1F4aLK+}~YkKe~*J+GYJ`B0)~v^6_ZT-Lg1kj?(sVUW8iP zYw`;ZGMSooxucYVWA#*8Pkb#2NBC^!yUAbLWU(+y79RK1y!$IkvceQt?hKp#%*$*a zXZ3OP>xN)~bwu^7QuDN(Wp#w`uSQwC=OVvP#XXxPst#Ee!D#gpJj&^+5u__MO(l`N z9UNIsVZAfaW0fo{jdzV97LzOvl(J9XM1t)0+1=ucX}iil^C0SYdOEqt!Yoy1CX+{# zzup_)o=WR4$x35HcxtA(>vCC`=^A!C%ziD9#e!2@9Zc(jPZa5MWk^-UFzv~2xi3uN zo6w<1oOINI*G_^8%YDcfn(60XSDHWnPrz=3j1i9MCJUd=R*c7Edt4lT>ufV|l?!P+ zBaLjmu9LDjU>g@49Z$jM1Ve}Z*8gVov8R=?f5is=dd$h}lNGAm*4a9>dzPE9(}i@D zCO2Lub&-n$jQKkm+Hz&e&FGJ}m2XB4T^a=y3EM;))d;B(&M~8=n}2O_m`XEchnhV9 zngg$yvcPG|;xw1IsIE};@e4p%A z3Qmpn9j8{a>B8mRN*x2)sUY4CxZJ3;pL)?ZPdlh$VC}zOvK&>B!sTWsD|M&) zijVbIPM^L%vSNq}Css6Jf?vszMR|qN{(01{1!qc$Cnnn+SCp2o`gqph?w}I=b#JdL zt+-vK>&uDYK(5jt!ED?%eYl*X2@U7!6BPRI!rpS8`2r#Vj(zg@#F4kqHj z;VO1u2(Yvh$={XpTO<*C&rqiR{!$9oL$3>(S$?a*T&Z9hsvd%ondTVFELlw3su-_^ zKA5)ExfK3}Iw6&pB)=WYLNVlYblN;5ZN5bQc8o3E+8ZfplUX~CK~!A2@wX-fh~&Pr zOr4g7x>$8C(~a0mBwqKmfudwVy_uYOH zRhs_jE%scs_RsKH`neIF5@3iv>eD}M9U;}6Z3&Ml#&(p(w&!-89aniTaBKA7&)G~0 zZ_+qr)GahV;$)q2n6pm1S>qJECkZ- zI*txG1r5SwvBxGTi35Qi<7I)qqLkkl(f4#(U~*>7(pz(^v-==KVF(cH6qn zNS<)@(oaX%)seT!7@8xJsL3va|7n7&Oy;3H`%gp4pHxq`ZZoEz)XLbhS>0lkYJD!A zqC3EPnk#EH4XM?~W;}sWSzr9*zpx&zjtH!gX;|&ZUf}cRYE8LG`-^jK*8bv!zZP+^ zzb*nBBwhOps`kTOw7;mHa(B>v$$w!zh58%FU6v9};nsPoBu8Myvt?2}iiYHFJTNzK z+7lgUw`=V`UUL~CH)87LJc#e+T9%w3`PhVQ-@O z>uHMSWRN7KPpL0G;Xx8v2UgguUNEVF|G~1Izh2&QZ6Z~UR1bJz% zvFan6thuIqTI@*@$yQqBN$#Rv@_HTWCh8Wq=i77uC zE13SWRu+x%CLv;M7H#(;NfVxSvFb`ycI`DTuf;`PiyDBI*C6WSMb)Q+oGE`HhcG$OG~b)tX}Q+M!=XhM zqqo8OtxS+faIIdVE7(33p5=Q&55DhZ^B>q^N3p{nR5wv<**FgSwy5lcPHSYrz$z|X zOs*y-YX5p)5=IJWl`n}znSKkdQ^9Qt=eiJFPckFRLeL4+d3gNc;K&!OD1^8c;ZVHD zMR83A?dwZIhAfxG$g>*H$ZJlX)vEV3{$8k6M7D9!HQu6W9C=XHST#fB9T9r`y4qnk zxKHEU7c)C(9D7G#F~>t42gfGPaf}N`+S`wWq%_N71TSAAt~)vOxdaZ~TsXATVm}f` zy3v(>q)!U=gc0fi8@}1ADO|2;50Xj!O_q2#e8|n#{xcbULp0qZ(wvs5i)XZ1!-Nu- ziVhYEp6z1o3>F9J#y_)}hB}=rhA*bg{-js@DJSWlEHu1q0i}evN-_xINqEJ+vv1^bkYmtPdk$9l3qy zw4#&Sk-y;9pK(j_yuhkNYF&m0@bi8M5^prq9i7P=uBFb`)940?M0c!Ho8wvY>c~Ia zp*nwoCsA;^EI7@U6GZwE$IcvQq+KpjYZt787o2X?%kK7Z%*L<`D%vjFX=4}CtG|mY zP9N2~4Bt#x33p3R=Go79Qe#&#DZ3Mn#tqs17o}-ZGl5eZ$>43l1^YlK3 z?@9k2Lc9mGH#(K=ypeAR@WP3RhmE&W?bKn~9zvpAL*U=(%&I-Zot2R^O)IO1)N%Ulgv|}XfhuSyN%3^x0gAa$?O-9=^T8(D4HBj4rs^O zvgp4Q<7W?nSiQnGMAuh3$^EBMDT0KCUaxa$%hGbw^+Pl}g7g&qJ!uj9wx-eQ2-FK! zAG$XJCE9s<8eb6y^+3QH!dJKJmu1m!D{agmy_D&FeChZ|(wiKn<&mTp*-q;sNuMd| z?x8#uGXa$+ViymetJNIqNGHNdHIJ$^@S#bt+nJ8C@X{P6(Mh+)hrt@|@0+M8ibRIi zq}_bL+3++qN0GTxrm5tbXzUqZe8rtzl^WSxtiMz2i)xkN6#KkGEY!y{oTn!%Z4n_f zE1JCM>hb?OOPixfRJ>zX05fT)=E99`PNREIpwTfT&b8;i0;n8AMuy}sO%d7SX2)q^ zp8dp5S_|r1qL!-DCST37wKv#?*#B0GL7x5p`twc6ZSW^5oOXS`f{u$NkzyyL9X$M@ zOJm8z7_~NJ=js(b{nUC?J7f2&V(aJH)4}WGNLX4W(_DMa5=RoM1K)c^cMh|r^GyV= z6q*}H`b-$laUouV$37y>xm>?mq6Sl9A**@4A+CpUtiGj?4PY*_J@5_p}pHqo(G}}ZPN^D>P|+I zIkdDpc{tEs%}wSl6FW@S9m}|V0>%26s2;)6{2oXo_9?Wy2YKDgeoQ7e*3sl7vO3`r zbvC&>-QLQ%Ma$&+I(jk*t86&+Pe$>w(Gfw|R(_X#=A&QBKpmk}bqk?$ zlF6Vc;{b+eD}vFK8E3?+#YXkletGsUkGez}&s~C9Chg}LJq{96Wg$>a2V60U%_@^w zs0PhJ+MY~C4_~UYK!U~NDRyk<In$)D8*H*@WeQ0euGhxw_#%f( zfqDMCrfK4xgNMFMBQ<$(ZFG$p-RHK}6f%r>=I7ZDt+APUk<(O_ z?Isc{7B8d)9Z{dtap@$scX7O~taAVcSINzqh9q1jmoL&LlY8PiaFI!fBim?ndI#B` zFadFCQ*P!juG8C`22%NVryJ7AgI>Sl)X(z@_2^6HT9Re*>lmou*wAu==+6wT3}-T% zHssm=9;36xP%^pNGWz?t(4??L=mL*neJqV^vC)2ZX)+Up#V;o`notugyFcBf6N4wv z`o5S60ko|z<}(f&BN8co_nsVaiy$MVGP!hxmh>YtNeZ9Y?CBsifaEvADJ^)#9EpBbb%fk0Gr0BHXZuFJe>^ApNgZNOAKa71$!Kl zU2A3M>_TQUo9hoa<~e9#|340^JbFG5qVsSOby_AD`OL(FIXsijv$tQQrab)B1pApF z5A+^G+XrG=uhKh%shS;ty5Q2LW`{icpZoMSrx1fTgp9$n^K4sfCb>)OpX$u5Kg`f9 zZzz_@4_mnnd3k53aiPm%xpyGFZ!r1H%dl4_7nV{}HtFXH-WNvEB6d3!w*j;^n}qiE zXmECI*{F%|XqQO~dk6^|=|9|1+m5PfUHSQ#ktPixIiAR~EyHQ?5YpGnb2;vP=oZ}f z_EgUxkfI^-`z0DrFXWBy_q+2{+qP*-McfE@Fn1`FD*$0SEgwpHczGenzxSkd>V2zB zzB@&a4<$(v*-o9mo2>EgWCeO74IV~Dcy&T{{B8oBIt(m2UB!KOP45N2M$*H>NN*pt z2$RYA8MJ*E>EoG$TNo(^vkI0ukDfW`>0O3<-t(@mG2w6%uS~pMmb`OIX>$%ztM{Sx z!%3)kZj@&IyM~iV3Et<17}*J5LQBOM!J{HYD~24!5BYW@BR0{?!^uNLpi@U6fu7Zx z>PL`CWdHh+Br)rRzV5NPpuSE(&Mv;GO`vmFJn^$k)VS+s(5WLy5;Ah-NYW=Fnibt> zCHfP8z$n1iU82WElGvVS7cw*UYxJ4Q+Yjmz-0C%Qb_@;9MM=Mu=H!y7tW7$VQ@7?J zH?;}t)7^DjmqM#^v7J~<_p+}`^mHz{FYOkSB#)WYF`g7LqsOZVpYItJYhw|)rL&6<5jrC18`mm)>{~1rao{_+d zy$3Lc8SN^jb5MuQ@vO5+@C_dFmof0wHBOg9i|>H{Kc_42Aa6!&XWZP^eBTn8d^L^c zk0!n73*{ulVlw-#L{kVBjw^ZgpBLYv3#yGXSF}lID1sn;^}JdjbSh_7%d@xL!o3<7EZ)0?-*+J)_Dvv%Dy%JeP20mSSXn%WyBN=0gWwKX_8b{jT{vd22(PeO%-W;x` zEg(-yHCsMjN3`cYw zHoLFrmC%fJ(0^%)p^O%cAp;^EqZ06VVH7hdmrI!3C~}>)jV7VK|Cy(W5t^xSEO~*< zqdUeTGj_j)51`b)*U`4Is1^6yuwX?ILTuy4k<}#h%L!}|HVMLJCIlHfSSDW%p>5+y zkI*keIIh?QM{KEgqGN(zHAAuy;5{+HIVVo2t5mwtua35rkYI~UP7KHRF^l{fI6H3_ zYW~KIUz0A%1;?s2*6*B)q$Vf+_yvx?%KHv-!F{6P{QLWJCR1nuzC4$rxL>Ef$FgH0u>fhBglu?_w%v_KCMA<}#epV}1b*5NYaAy={)fOLO^af&ircCUZTr|69#VNQ(+99xrSUgZOpv8M5=u7) zu%{1YZf~fN&sO0Lm9m0?&R0~}J6GxqQUzE8!ohH%)1ss`^8hb#8Uu_pXEGVu_cJw> zBl&tcUs2J|+eGXMKGWX7C7)@jyEdSJ?wCvliJy(4t&>UIs1l6zG#kJ5WznoYizA-} zsm~0^XY5Uo(^`PI==0msJ#KCWBrOkWU&G%pj zT~o+dPY`{4kRF?Y&8!Rm%Xn@&1%3&jrh74CSJ`&lOFkoHKebLJQJyB59Jxqqry|i_ zvo%k}YVIk^d=Fhm`QA8;7V==jPB4z zh-M-TCTqVzv`)qAN5av-&j6mKI))!Xn^pWF-rop3`;j#>FT)#Y_zcFsnd7_3cYMF<>?s^EitK&NtaE?o|Eypf|Z&<`q9l(`=Q(r{S47y21(M`jQMAu}l6 zE)1KEvi%?GW{WMdu-67~^haAfx21^qRsElC?3{}<;Mh!pMm-%upVA8S0edVooo9h2 z*FB#c98cw$*cLERgqF@E4~uAG(mji0a&QT4pNZQ4AfeH-$X(;rDhY|okh94lxY%8A zqrP)<70jM5cMyEwj3yXT8rQsWZWa-JF*>}vap`Q8#rDI4WEJt5gBHZjC1SG{kvCZs zrap|)d>SoeU+J{+VKOk{noD4Xvw@n-ol!Nux1An;m^?73v+i+3#J-D~h>M6$^_ThT zLj>oxr?c*TMthK!%q6{hc5WSF#B=crlE4mR@oJcw6x<6}3At$BK6+#>nH%96=Ug2L z>*K!uwsFPeYn)}t#5RGN=9AGw*dLm}6gA9n&j|0n0=H>hv8wQhf!p6*p^Z-3g8NTs zYBW}A3|6WGxJt1eOQpsIWN3oah-@XwWDn8jj;d^p{ z0+JN4Ni_>oitL#~n-`E!FR2CS^R#^d`BaqJ)RM;oE#qnaLXv3fw2)*PNCwR*C1DX6 znRuGPo=-zf_EQXA?IvZ=l2T-p47#P1B!y()H-b3`ADK~U86OnQrI^tf)MGJ83}Jk3 zzyt+u6xoZh)yuHWVqb`Wm5*WwlG8YEEuniKB?A)P!mn7^+P!@z@}KsMXp?=VX1E|s z+P4-`=`k`oKACsLJm3Bavjp2$vgyJ|(~UtgEqe@GQ}zy`H?|V&eb7z_6ju45OZ^p> z_ReTmS8S6Il+W0L`F zYrBThp-V|{?;vIb1B+p+cVelt`x}RE(Y=;hmtuQ9jrINky}g2V%jAuvTG^PkmITuw zPm*bYL3?HL`dL+^5OkT=JxLxEUyrAfh4jHI2{{(>Vc=Hw(~S&Gt1bmJ*b4Vuq1jgC znJyb>9Rp|3CM%iPyNlyYMSX5TUSsb)!1lt2EPj#c_&IeK?8>&J)BFk&mW6q`MJ?h% zHo~2(Yo<(IW3P5-@7dJo-Mbc|{Vc6T_xKXr9@eCI{=GwYq>$IPsZaZ8pQ)%;$dtz5+$;=dGj9Iv1iCbh7c1J40rnL#f!*6V`%Xz@*WkR zC&Te1qzKy;uZ>5MD7(|D)g;#T-1DS~bO~nXk1jpwVb<#pF?a*(!QMt&xteSigPUmT z3wUCDlsU;{4sMjm`ZQYb0(mPmnAI^EOg1~}(h9wG5j4Dt+<8k}^&VPYMZOTL18Bh- zMEWbVaSeGbeib+yDu&^w59*dUk?pL)9e-trtUY6^TuYXTI2rO@M_w0S$g=HNM{J!) z1ufb{UJneu%I5^8@3SGc=*{GSH?i7IzfL-Pl2Tjio8&)TNsaBu0W#l5{L*C0JW4+3 zN=j(^X)>B@q`7Cv4`NyfHGPEwrcNSfrrPqqBKHu>RQrv-?HxX;9FE5KF@8U;15L+1 z#lWw`r~JRrb?9fgNq7f>|6lQ^Z&J?UKKj<12;A}ii*hx8!K1z-F1$lSHisK**=KQN z8BuM&u?VJh`)mQ+Kr6o^uUj7Tw%>T{xc$bXP>g;5ub;Bu|DE=>JcI4@@b@Gk#tL3= z{bL*Ofo_lOz^4J9Bla6*!M2v~NwY|1*^d4|LWw2ce&Y>{+3nM@tt0&3=sV*70`^h` z=i6qrk|UnIdb(Xk?=$1Tw%a$9+3j=||6B!( zl1BYVXwzZbvo;kzgnRvyZ?{{vo9y;COYs45eK!Bz;Q})pKJ{p0`1*F|XS=uEzUMMN z)!N5aY`5E>sQQuct;6h|wFBPW>ioQWj##1$gJI@FCWJ@Mp+9!Q*QKj?;Ulihv@ zFV2REi7Drx7n;;d!oSdMMJs+HS&Msiu@VJ(zEDnU!os zTS)CWm-uiH1U;iOc)b!Kmdz0SQW*pf((&6G(aub%Un)K{O~?PO9*7nliEkAjZq)D= ziM)y6H@M(6g2;dA4Bi6X5qFGEWf1eCj^E8JWM&9{sra~b2OidQ#3Lh7@x~uiJdVG} z9;TfhoDPD7H9CWL&k2I}N`~N<%Ak9djz3TWhh*wVe5?4B|I_gwG6nR|W@IY9S1ZF? zPy&;W4&92Nw<89QG{XYNSWkYb4ElD{1$+t`!(4zfBlmv))<94~z5=l3Alf zPD}WLpBp6nsME7Ek6c#oIXN>`i2XFbb6aLyK)F2)$Ndzzgg zF7&NEClNLS{HD{F?-!%#R}YBK&?)`J&R!aZ&hIb&eDAA=pugt=k}8o`^Kt9(xO$t- zS|4V&TQk`040iiUBO|C)Z%f(jdi6Gk-M++bU#nxZ6Vz5KwG9y8^Qn{wn`VLQT$G5; z6eZ8)3_;T~#a|L%-vLec!p<#>Qwiw_TW*1EbA`@8G~siS-jOAmyxu_Cstcy&Sz@>+ zGF4qF-Iyhg@v4JKw+XZ*OU(A&)+iA+Z>8BZK3m*LzaAv|d1;Ndwn50*UVp1+6PLzh zi;eu=_HDM9OgyV4@>VsKhKdJ0H>kH?3>AOzdJ_!aJVHMmCWhs_2|;gS%88PuXfG)G zHV$g6OwoD_wZ0a}G$6eOuu+H@MYy6OYk}NLyXS~^d2K%?k?qInfxE>px+X_V^MPQN z34(ugvC*92u#t+OPYxH`rW7;Fs&0DQ#DuGEdOMo6s&0Cxo!zQ#db^1csBU_@lHICq zdRz6b>ZYA#j8=8i+g0?V5n_yI4F2e9Y7c-2tE3ALH`DP4$)hPr{o%C-zJFJsJ!Nr% z*SiSq10}RV7C-0rw!$%DIGIx1MYq!4%ed97wD%ZmRjsst9J^Jmv^SFxs8+J=V7IE3 zY>a~z%R0d&Y@T#OnYe>Oh07Y`kbCULPEh z$RRVmai@5|2Zmt@GT|o{i^FK#M6r^t$QS*X#XdS@+n6s7A-*3Sk_bza-DWwcR(olU zwp|m&QN-&A!tT?0dSeoXdjv!OwBB~2K#V4y-S9_sGU#uU#RFa+L+r;*^!>ZV`@KFs ziTh?6caQk9@2Aj>CDG(Q%+UX!|1N}iwMN^Ig<>R`QV5r6k@eYf+-f%a%*tFtiR<&7^k=}o=_^waBmZMY0(@&?0pU@xf!+Y0i z8~yV>@u=6A2#S;C^q*73)B1h=H1P+|a*3SEq%YkMQ){=6Oh;>`ME-5E%`l6Zgx_zT z0S|bZSRS_h{Q=gl-TygL^d+7W+PBzzXNz47+C7agLaN<@BLFj9T_l>c(*XKGkvP)p zbQ_vY)PIhMmxmaIEq9JMCQjVkYYl}7D*ZXvr4=mBKv-~ zM(l4O%W30AG1FGCPJD-m$Zo|O#6k3vZDNG&J}P!5;@|3RXqrUG1{(->5>jn@&7iJk+>EA$BNkJ$VR z4DS&!WVh|eWW!g)HxcnK;P2B5v+0g|43S<>G-5vF(x!V1U-SiITqv{r**E+G#wr}3 z!r;u|Kn@?Voh&r;5lJ!izRwUBWM<7MJpJ&6$#Z50&AiVrJ$^Yr4t^Zd!HfJ(t|DS`Jjsg-5$x%14+vPe}H@S@(}EofIr#+{-Oi?qhv_RKpT_G`2FdQ z7tyR;8b47|iyYSEXy{1r*D!==7w@0g0Z#1zGv(Ba(`U0H%e7%t2l&noaA5~{RtNZz z4)7Bl;K~lLg}Ft&xJJw!uJEP~@arAm9UWjtDaiT#vjhI5J8Xdu_{BS%?*O++hJ;Mk z2Iqw$F1;j!Q71uPLs$p6Ct%g=pbrMVpCr5kvy)P+HV9F}2)#34R^%F{NQT64+NYuQ4&4^UM%GJEvzrQQ~`paQ6fu^ z0H4e8O&Ab!8$%oWm#zGIl^fGlw@z z!X;=dOy%%9l5n*SFn5{PQ7BLeSXcP0BpgJL2|E9uB;n&$z*en)CnAvoSj-}}^9DA; z<4y*hutRzdppeh;qadKb1&we=mNK?WcY{E{~h>lF8F@|R`b8!;TJ5wuz+CIg2YFVgp+3Q<5BMuAd&gZ0wzsi zpLmH(Z$``%aX3RF1FC>O&fz;GVMhk=OaaU?pL->e!}{}>@xdO~^6OPJ=nRl(uCxO_ z%{#n;dCN@382E$18xpy57C@Qf_esJsn4O&DFcM494n#NixzE?EFS~%p<NhR>>jKu_|7jn=6i-})^ zB;033#;oV`NWDL&0?#exHwXew1LhX+n<$aNGAxkI>E|O60oD_d#qSA;6dyrDE+<%l zsDwov3@8{jyTCR{_?DTNPa{8U#uK2hSj_t~;pzn#m)|vsczb|dlZN;23jQpSX$s;U zm1N0~T!eYwqWRFDrBbtlK=2(-$*2>4fC73DBurCI0_399;AUD zlJI2>=&Q8;f$Gi%u)x-TT!C>I(IMRM5e4>?1pi=IfSCvu3hd9$s}S|OHH89)!l$r+ zzB&d@kc3}T(Vtr|@FB*PUD|*GmwK%IXjU^9a)+B^*0fQA+{cmocHz^>wVyPWX5*J0Q4A5;AQkL=P>L4Ct&o~1$GVq+~@)a11<$@;Tm;D(U`=h z9WM|%_k$0sTsn-ENIxrJZqm*RB{GotxK6WB=jU;+UfPH|za)_<$ryl{~p@MN{jXa1Me%qBe`3BP+lAP*vGkt7`Q2HeOyJT3|6n?b&p z!z(2+j=_AENLw*Nj97P}^bTMXU{Q0abU+e5Gy~?-TKZ5DK4@n0lR3kGNx}>Sk)CLz z|48I<}M9F-9NSwFtHf4L#Ea zO-Bq^WZnUpET}_)5mW{OHf?l<&qyQ=K}NX3L9a^0xCIL3as~E)R=oh@3c_-%Js!|p z6m&uos!oEwjMINF5sUVKf)li1F{wgN?&B^#5-G`mzyhs9mr#k^1t05~u1hy4*amt& zYr2e<$V4mP)11CgBF~mUf39$sxi}!LL;oC2UYEzP{wJ~#>I_(C_0mSr1w~?DB^vlN z?D7gsTm+a~q|4iqaAqa)f;Sh4Pk%Zh<&~q1b&5(qDups1_vg-&aT#42z7cb;Bg#&9C?9_nAe0|pOS=}<6yvNLD$uiPy`E*-JJeK zi99$J3VCpN7hF<+{ygft9!8Dn4VYOFso&D|OK6A@>n82`Gw#(33~&V#ScoxT9T23! zIOtAq1k8OL+za>W#p#Dg#Oe=)YBdFd^U!}c2)N6F@8jfxN{=4`;N<^<r;h+G=J?%`&jhe*Oeqtj<030STRf#-`;$OuWWMnj=CO#q%r3-Qci zIy@6)d@5ibGa*Q9;}O*4IOy5>AF@gkCL*ZBXwG0e6moG%NTVdY41xLxLOusR7Yw;e zLcRrD&EatH!!*ve0_GM8#em|y0SiGQt06;iYFt|eu(*q;?*BuhC362|G_-08g!Yz% z2sVNu4zr??xr7T0WhK}S4ntsQhXahzxmZguLVYa>eHv#%hzV5zgi$DtaI`14T`cMu zPAFEZ({;e_<^tbj#Owl$D|Ejk+%UmphdBO}+KhiV{sQK?2SA>UIlY|q@r+ma=*gGazUGRTMB&-n%@gNMxw7nx4_$G~icz?JE{PA`_Zy15q z>MA;L6NQ_x|Idd-cqR;gSQ1iM&}4G@65Oj7U|iu(Nn|67@=}i9ERjM+!xL5bJB*55 zoL)OyX6r9+IDrvn0_1B!_(h3G%w#+WBYZHzBY?R}A|fO*3?m|}KTIAmSQ2_O`pX<1 zgQAnc861WSt6@R?$RV%ZC@j(5O+Id<=Ibl^c0fg_k-%)n3O_&rdt z2{5-<#OIP=zYLfMaYQSEY!={RjXtsy2ABhw4IHgSk#Nx&mf3Q6e*~e22jF}TD_ESEg4G;GCbfLaOwNNa z@*fbe60oiz_I6KT1mqm=fU0*1W7x{!>o`KG0bHoTQPD`{y8&~HL?ubWt~&HD<#?3w z{>PE%N;o`@?f=;*m_RHpQTO6ry+D8~YM~@tHsgj*yQt?Rq1z5jyCa;z21$4diA7g1 zYMVr8Heeq0QHQZTPe%VLPXDz;*22Z4oWob}l1n}tq2A#-h}BC|Ai6WE-fn0xX&s__ zp@M;n1hY0RqcNhz4Bo-{fVl;ur=wng!g@Ury+jf|s|Uf_R)W zKqmaR2?{lH0dV3zq}V=WsZJ zmL;~`8f=N_gQzS;1J^iaDBxTd7!}JMSCI#}$z$fAMr;Exyn14$`qy!7_5ykv~y&V|pF%XMKWW#F!TQvn@ zW1)ZtV6H&yK&%BBfVs7&lQfHgM0O2@-Y8naR!vjqTb9IuEI+Y8!&=)%>}XR zB@zp?9yGD>cygB*x1q*s1^pqe0BXbn=F%JvWA{719QbU${u{Bp zs_Qe4QX}?$8*5!gcvT`1J20X`jX`{nL}n)g<^tn;piFN8LtduG_Xa;$KzCU@n^oQ} z@H9zy?Ho=@EfQyll4%g8oydJ2{}?*dyL4EOJOI-PWt_fNB99${0(?aAbrKn}1uze~ zcvQi~u%LR#gcyrIhM>zte?F_?Pf4U4u!V3R#($5XgNgOUCjJUWu-vIYf|T&hNS; zM9Yw`k0{X#sS_5^J0!+pr&A4>uV#tZ&qpyI?$87z;+Sr1J6yJ$!?RH}GoKf5_z{$7 zFfsAxFe)UE0$4!rzY(d~auNhJoM0masterPosition; if (thisMultiDetector->masterPosition>=0) { if (detectors[i]) { diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index 41d1e0d94..e01ae3dbc 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -6190,7 +6190,7 @@ int slsDetector::startReceiver(){ setErrorMask((getErrorMask())|(COULDNOT_START_RECEIVER)); } } - if((ret==OK)&& (thisDetector->myDetectorType != EIGER)) + if((ret==OK))//&& (thisDetector->myDetectorType != EIGER)) ret=detectorSendToReceiver(true); return ret; diff --git a/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h b/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h index cbe43b571..250e5f799 100644 --- a/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h +++ b/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h @@ -107,6 +107,8 @@ int calibratePedestal(int frames); #endif + + int copyModule(sls_detector_module *destMod, sls_detector_module *srcMod); int calculateDataBytes(); @@ -127,6 +129,7 @@ enum masterFlags setMaster(enum masterFlags arg); enum synchronizationMode setSynchronization(enum synchronizationMode arg); #ifdef EIGERD +int startReceiver(int d); void setExternalGating(int enable[]); void setAllTrimbits(int val); int getAllTrimbits(); diff --git a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c index 7737e2418..d9f68c314 100755 --- a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c +++ b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c @@ -2278,9 +2278,9 @@ int get_run_status(int file_des) { #ifdef VERBOSE printf("Getting status\n"); #endif -#ifdef SLS_DETECTOR_FUNCTION_LIST - s= getRunStatus();printf("status:%d\n"); -#endif +//#ifdef SLS_DETECTOR_FUNCTION_LIST + s= getRunStatus();printf("status:%x\n",s); +//#endif if (ret!=OK) { printf("get status failed\n"); @@ -3269,10 +3269,7 @@ int start_receiver(int file_des) { strcpy(mess,"Could not start receiver\n"); /* execute action if the arguments correctly arri ved*/ -#ifndef GOTTHARDD - ret = FAIL; - strcpy(mess,"Not applicable/implemented for this detector\n"); -#else +#if defined(GOTTHARDD) || defined(EIGERD) #ifdef SLS_DETECTOR_FUNCTION_LIST if (lockStatus==1 && differentClients==1){//necessary??? sprintf(mess,"Detector locked by %s\n", lastClientIP); @@ -3282,6 +3279,9 @@ int start_receiver(int file_des) { ret = startReceiver(1); #endif +#else + ret = FAIL; + strcpy(mess,"Not applicable/implemented for this detector\n"); #endif if(ret==OK && differentClients){