From 6331724953b0195b726236c548b34f146355c353 Mon Sep 17 00:00:00 2001 From: Francesco Gatti Date: Sat, 15 Sep 2018 08:57:43 +0000 Subject: [PATCH] live detection --- CMakeLists.txt | 3 + README.md | 14 ++++ demo/live/live.cpp | 184 ++++++++++++++++++++++++++++++++++++++++++++ demo/live/test.jpeg | Bin 0 -> 34073 bytes 4 files changed, 201 insertions(+) create mode 100644 demo/live/live.cpp create mode 100644 demo/live/test.jpeg diff --git a/CMakeLists.txt b/CMakeLists.txt index 225c9e1..f305500 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -80,6 +80,9 @@ target_link_libraries(test_rtinference tkDNN) add_executable(detection demo/detection/detection.cpp) target_link_libraries(detection tkDNN) +add_executable(live demo/live/live.cpp) +target_link_libraries(live tkDNN) + #install if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) set (CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" diff --git a/README.md b/README.md index 0f08d93..557736a 100644 --- a/README.md +++ b/README.md @@ -33,3 +33,17 @@ Assumiung you have correctly builded the library these are the test ready to exe * test_yolo: YOLO detection network (CUDNN and TENSORRT) * test_yolo_tiny: smaller version of YOLO (CUDNN and TENSRRT) +## Live detection +For the live detection you need to precompile the tensorRT file by luncing the desidered network test, this is the recommended process: +``` +export TKDNN_MODE=FP16 # set the half floating point optimization +rm yolo.rt # be sure to delete(or move) old tensorRT files +./test_yolo # run the yolo test (is slow) +# with f16 inference the result will be a bit incorrect +``` +this will genereate a yolo.rt file that can be used for live detection: +``` +./live yolo.rt 1 -s -t0.3 # launch detection on device 1 with 0.3 thresh +``` + + diff --git a/demo/live/live.cpp b/demo/live/live.cpp new file mode 100644 index 0000000..5c1a833 --- /dev/null +++ b/demo/live/live.cpp @@ -0,0 +1,184 @@ +#include +#include "tkdnn.h" +#include /* srand, rand */ +#include + +#include +#include +#include + +const char *reg_bias = "../tests/yolo/layers/g31.bin"; + +int prob_sort(const void *pa, const void *pb) { + tkDNN::box a = *(tkDNN::box *)pa; + tkDNN::box b = *(tkDNN::box *)pb; + float diff = a.prob - b.prob; + if(diff < 0) return 1; + else if(diff > 0) return -1; + return 0; +} + +cv::Mat GetSquareImage(const cv::Mat& img, int target_width) { + int width = img.cols, height = img.rows; + + cv::Mat square = cv::Mat::zeros( target_width, target_width, img.type() ); + + int max_dim = ( width >= height ) ? width : height; + float scale = ( ( float ) target_width ) / max_dim; + cv::Rect roi; + if ( width >= height ) + { + roi.width = target_width; + roi.x = 0; + roi.height = height * scale; + roi.y = ( target_width - roi.height ) / 2; + } + else + { + roi.y = 0; + roi.height = target_width; + roi.width = width * scale; + roi.x = ( target_width - roi.width ) / 2; + } + + cv::resize( img, square( roi ), roi.size() ); + + return square; +} + +//return inference time +double compute_image( cv::Mat imageORIG, + tkDNN::NetworkRT *netRT, tkDNN::RegionInterpret *rI, + dnnType *input, dnnType *output) { + TIMER_START + + //Resize with padding and convert to float + cv::Mat image = GetSquareImage(imageORIG, netRT->input_dim.w); + cv::Mat imageF; + image.convertTo(imageF, CV_32FC3, 1/255.0); + + //split channels + cv::Mat bgr[3]; //destination array + cv::split(imageF,bgr);//split source + + //write channels + int idx = 0; + memcpy((void*)&input[idx], (void*)bgr[2].data, imageF.rows*imageF.cols*sizeof(dnnType)); + idx = imageF.rows*imageF.cols; + memcpy((void*)&input[idx], (void*)bgr[1].data, imageF.rows*imageF.cols*sizeof(dnnType)); + idx *= 2; + memcpy((void*)&input[idx], (void*)bgr[0].data, imageF.rows*imageF.cols*sizeof(dnnType)); + + //DO INFERENCE + checkCuda( cudaMemcpyAsync(netRT->buffersRT[netRT->buf_input_idx], input, + netRT->input_dim.tot()*sizeof(float), + cudaMemcpyHostToDevice, netRT->stream)); + netRT->enqueue(); + checkCuda( cudaMemcpyAsync(output, netRT->buffersRT[netRT->buf_output_idx], + netRT->output_dim.tot()*sizeof(float), + cudaMemcpyDeviceToHost, netRT->stream)); + cudaStreamSynchronize(netRT->stream); + + + + rI->interpretData(output, imageORIG.cols, imageORIG.rows); + + TIMER_STOP + return t_ns; +} + + + +int print_usage() { + std::cout<<"usage: ./live net.rt camera_idx\n"; + return 1; +} + + + + +int main(int argc, char *argv[]) { + + //params + char *tensor_path = NULL; + int device = 0; + float thresh = 0.3f; + bool show = false; + + //parse params + int c; + while ((c = getopt (argc, argv, "t:si:")) != -1) { + switch(c) { + case 't': thresh = atof(optarg); break; + case 's': show = true; break; + case '?': + return print_usage(); + default: return print_usage(); + } + } + + if(argc - optind == 2) { + tensor_path = argv[optind]; + device = atoi(argv[optind+1]); + } else { + std::cout<<"not enough arguments.\n"; + return print_usage(); + } + //end parsing + + std::cout<<"open video stream on device: "<> img; + + if(!img.data) + FatalError("Could not open image"); + std::cout<<"Image size: ("<BZ z=!ovB$au1<`pN99&!x{T0IHPuPjLVk7ytnFrGU>>Kp+6({|F=`1QZk`6ch~fm%zZo zzML&_??*eJ1sRWC#N*n|K9;VdjM##V02(x z5MbW{;AmhFXkedx0OBtjAtAv2v-N)k5*z{w8Vm*&00;lM0)YKLPwJhi6VLf(Xc_09 zlTt_f(PA(~E;x6eCX|y|65aXLtCMDuu7dk8?Uyi_LU58i3eI5~D_&q&Zf?pw`K7H5>)B@!t78XIg`i0Oc-X9t=-RzL_jXb(G8Zk(@;mP&9VXnS zPIjEVa`m9Dps&g{uHYN`1>p+8>=Vb=-T3HoD~I2PeM^oYmo)6bZZEN^;(x4*p~MwO zUs0OgpGiXP_1li+cEn60&;-N(Dl@Cxrb;_R(dodKefs0nNeEJAEds2`R5 zr4WqCD3Zw$+lD1geF*CVAdmSU=m-5;x;FrReQdmV|W&w}>mj{NUmR92F!6JUhf7fI- z-gH*Qug2S8wltve;B^LqlT%t@3{EvnVgoiG6~dq@FYDdr6*7W>%fI<4gIuGg~U*aIZvieDG;f8(xn#pzzki}OW!4!2X zxKd0pj5CgB^K?kaJfxxD48ulVJJp(hjlojHxlmR**$nQv13NegE=5g(xDpR>t?4P@ zdac6)4LNTt9Lrf5d!QL}p$dqX?stO`N$>SJRBY0pJFsnSG&jid4?28deOnU`)I<+}ZCT|2wN87|kSy1j!&%PDm=lv|8)AH(4pY zD93uBh9fQJHHC}~x84&QZF?{C*>i3v1jhz4GCG$>fJXdY^r#|Gjgde|Vw2BPvS z@b{>MRrOoRJ{NWVwzjZKTIAqhy_A;VIP3U#%%|Gi&N;q~^c*`_rFM5XQB^5gY#(A^ z-{P6KHBM;wFJB3V>uBM)L)G&D2`kNNgq(Vo2nTKQwaZ4qe%-USWmH;=72@QNFU2W5`{knDV#&widN-q- z)-OX=MC+v%FOho6iAf$O+(?D*m#GB4{Q#S-y|am8u66SjwGOn>-1{~v3Q~EjSjun4 zChVOPrzdga22B=kz3K&%PT~{oh-8Fj%V?^QI-(J@@%MiaU3?eF+g~8a@E^4;Wu}+O zlWI?+5r-YM3%OeuZ0uX<|J0ebEXk%%X{%KbRl6~C1XihDepfqSmEc7tG33_L;p~z~ zCK`7_`0@02k@j4#$!jS7D!hvI0?R4U=DRAA0@C9A5Pv`KFzf}!3s@=XS{F?Tbrowg z*$dm@iX#-p_l!f4_+JaPfYbNnIkuCv1gdyf3t8f#`hc$us7j=Nft^DQlJ&0um8-5b z-7_6p)!j51r1_85#W-P;$BfR5DrhcdaV2rIU{E#j^)fz!wZvjR2nu|X#oN-|{M^jL zR@lW8BD@F2B0qO0G(fskfSBmvq4A_{>RC$8`oAawHhNg{ln> zrmoVG;5vARtzklmA4l?e+>qMX{n)<|(>f2xJYU-J{Vv&V$`B+G^4;M0w3+bl-Y>F2 zn4`@23fB)3W^I}2m;RI|NohckQazJi%X-yTKQ8skPCA56aQs@2yLO#j7<8S!L6|I- zaQVGn_JaM4*y;BwZirk`_K%XamAs&q`o?gs})^ddCs z?KWf$t=#mVz0L}wA6v8YmIT;S^0&)u1#B_$nv_~(lN0Rcb4r_wj+m#0TbBC~J6Vbl?V5hI*{b(gJWQug}9~v2z z9g20Vu4lCZP-_*LQCh9ND{4=!xhzCRiC7^JDom9>YkJ)Wu$d|3&!+scYJUBT{o7BB zq?R_VwTQ}7&;A;m2()Y#?LG+P(HHHm?S&BOCY9$bV!kFP6n9jOh6D0mlgF6{X}Tmr zr((&Vz{;r~@*X#Gfuua)JI=kmf{0>Mz!EzfXz4+;dW@ENr6y4O@JTlXP^aYlX(>>N7+v%-3oTBW##G z)Dcza{GPAEaW$St$XBY&@Dc9=J2d&P)kYVxIw{OYO|U-!g07^@9AR6%kaw{+jfBdY5&)H%wBu}r4zT;ibXgWv*F;@7W2X~jO<1_7@ z9>D)0Mh2_kY>N~BDk5&EHn@<>}B(CZ(To=wx!QD(US&i;%;WEvRYn0DgW&e zXtrT}{@wkbTHAfyhD=OfY;p8SHp`4Fp%Zd{(c-2)?O|tH_2JG?`dqu&_(EmAg?d11 zrh*i$eD*$->ib1>EKgL+HfDxbXYvitgXms4UU6e&e2v4?;(i&5nd?>iLPE6EqT`*c z+v&Fadi>;SHbZ`W>oXs>yHtN@iYn(8vaV8JBRJR^5RPUO(MdeEvk(_7|=HK#fP#|*IT`cR=Mo|6Li2A>i-Yu5dVRG?dZT* z-NA;@3Ma^nXcuaeiF_)R1Hiy#;BP5ubyY7=0Kg&UOi~}ttEj3aTA{KAvx++Hxj3M5 zQ=uX{Dw*S%+O{5zQYp)ZO$Ecz97^69H61WpnTO*3NHYHGX-T5px0%GCty#ZJeed2< zN})de!%%Y6qGeZ-!d9PCJZ0=1S@AEvg2wYToWDA6+G$9x_D@S93}^M}LpgO7NB37} zuaG{Ilg?2ScaEf)Mrq3#w;JZ%7nE-!UXcRsyKz2D&+n;F_?~>aX?DLq0m%BUSIBpF zWb>nlEEspKoz@}8j(0k1p5C^@hwt*fPFfRAsA?#)*Y8?4@3x-HPZ&p?%E>mL02ptU zsaa79IqSk+n@Go0i(Cr)!UNRf+~z;Rh2P?YxS=|c()TrLDKyq8=c7)pos&A%4*2R$ z>@WKjl!u(Nzo2GC{o=b|5a5td5MM<1Kh_Hd_<|Y@3LOKJ6dLtA6V^8}W}zR9g4isq z3L=W+Y)Xdz%YwmR!50M-Ekz0r9qiQ#N@9Wx7?05~_V{J!ya#+Tyg@gj9#t4aJE(e; z*#Y9U^+z6BnA^9+n$PSNU7RA%n(yNF?V; zsnE-d<^`O;r!Eh!}~ONdyE~Iy#@Ck&($P zMOvx^sbO&DvL>MSx{D!kj1v*onul82+_F|Gk9}g9rGhz=@MG6NW*rd+x5bp?d6~sv z5;kvjbo7D&m}0p<3`O%#W>m^B5&b?f2U9_9B}kP0d3s z#AD&mGVY?kB2{8yB028BR=F525`i;am+ExN;m`u#g-$y-%|*D;z_wfJT2r@{S?N0~ zc>)fXYV!iCO|%f1<41@9zv^4}P6fYMVj^6x4%&YMC0gu>kpHyqn7dAX3eWge^U=uH zoO(uIJzUyKQFdmWRxj&?E$*DQoq^)1(FD7%xDsQ~r*vUY!j3Hv{EAlnN2VtDg5J(i zBqa8h+{DBLy|!Kc?%W)sJWm<xSn|0oIJt zfiS|loAJMMMc8H570v-HYnaZ)fhOmvg~CMY1{a&#`z9u4ll&^5fWAs>HMQThVVatv z<$3KI<1fEW)RU9iQEol~nV$f*h{hlMS@sY=y@N~zP6(9C;+c}TQbt9474X?xLrb8{ zlsaGQM37@j=HH=Ozn(!@r4;rAadeT|6>HZH4>~VWcdEdvmEzKp4FR=J8A% z9tx&qeCL7x$Q*HL zWsdVKqt(>*TWqx#_FHVUlho9Fl)rbrSNHAjbiQakc=*1o786|1N@c`(jpwNq8J1SE-HZ zPDV#B18n z6W2#;U9a1vVV5;@W~!5};tDMgPHnWogKqTLmFVkBXlyFJbhqUu*?{g6RJL<4HoDIC z85qIWWL-NL=|>#PEm=jmXMLOv{7(JD^HNMXHo%j;k?m)}42QGSbszKkDDC=}E&qub zf}1>97I}$)O}6u>Qpq)}agg$~*vlVDydw~PhWC78VhC0@lP+u7Uyoxc)6fSCWo=#B zgn4qNcDPJlKyvFFBBkR!et%YMaW$5$!rs}CuZ`MSLo}oBRDWfzGXfo&@B z*PR>$5^0%@g@k9cB6r9CD0qh-uFW=$g=~;se+xNCZh^p(8|7*C)C}T!djnN}gp2bz z@U-qx_t&zGxr0)kad&;2T*X*%dMPMIjVv}8aTw29gi&7ODF~Gscz-_)&I`)puhep$9xr(R^OmAgYKoJD}PfN;gcrzc{BKvib~Rmxy4sFbHo zQv3>zWU>-vWZ`#pO5K<&*knZNj+YXSuR=msu*+M|m!C-5gy2jtx1?FQAoxCHKhQh5j;U^jbSCzM4=*;8f-BANLN zqW2yy{4SyuE^5{h_swW1s)z8eqp}1`Jv~B4ha#MKqZ4a2QsGSLRkJPxAu0ZC=wg-Z zCsEJ}uetEiXU!JwyT@I4N)c|ks`v*S)XYn*6H93u@J~>ZwaBEtSQ$~>WinG>!ge?u!TcGUMS(U$1nwT7t=dL}%X-eRZtSO@uSk@%N&meQ;EwTprHzknMCfYt~ zcl=3(OJ=ka7i)gd*8kQ}tEop(4Of2{%-W9`=i7-_jF>P)%uGnLJ7)^vS`>+5`w763 zr8%ELM7j#jdoyK#mi`2gSHTTxVUYRceb=8x6zNXqAH^qcx~B_^inj;HSLVc;sYUMt zrH)BHL^e_C>Ys*J6ZvO*W7&hJj8sWT^=6jm&EMSi-y=Fe(l z^sW|*E(Eu9ETl_O>yLwW5kVgj_pd~=_oFtDWIF_6JUaE#Qcv%Ng>G?%m+F1aE04DG z7Ckqo3e3-r+QAdn>!ovq$M}SHI3`Ob=-A>aDae{)`vv@?ZhKMnM#hb#$_;&yj8cRl zR6Ukio2`3omP-!Nbk`u-u(Dqo2vmOrC#I?!7*r(yYg`qSmQr*^r-Z0o-*GlNNxz?F zwBEGNv>rwp=%nNpk3W}tv@{oR87$G_a5&6yr`?Xc>}VQW>JXaf6cpg@MZNy8vhV25 zGm9RJ`Pwn5vcK1Jx!xy?dt^l4+x=9!-x6B&CCnt#eB?fN-9mPo-2>x$P2VU8&E1@v z3FlEG{`v&3#>Vkiz|u?*!7DU_bk?#)R2{BaYDn=bPni4xk zDMv0ybjRhPLJ;B|Ub2~P$Q^~h_G?}2+K-Vx5rhSTMe4& zaSqm&Pmm(F5!)hT!J&oIUg=oKxJAwvI@PRvSriTLBHD3HbM84VO`uhQ zmC!9a3hHF*r1Sq9$Fb`q7hJbN@FUaTmEU+}?A&H=>JSwpMa%OhhUJ z0-9}tQqj~?gn`xCHMW~(miXjyV4DnI4SZyD&R#S7RYZ0U8Ar%QKzUVov^qGEYs4kB zTCDl#?#sr0f+56TqmsxM7@1)Re_E*(lbqOaP856(#3eS@LGakACgJQq3+K_8@$_@e zqa}J1;Q8?jy9!PypS0rFz&~R0pKSy0rb2?962>9KqeMic%D0~0M37QWdq~5AI#2yVj60#RYl~|y4stGxnnTJH3$GfQQ5&KOzmbPK7l<*X{X&};( z1s>X>1j>@{RB*PqEF`_6Fy8#zUzw;a0jJiRC5Y^4MU+S}y*uy2TR$z_tOzsV#El^s|p;)FD{ za1L!^E7k(Jl9di@48K%*WqYf4{N*0Ia5zYJ-!KU)E4h29BFpB1$i&!?gG3^6dgWrI zc5#ZJnkM=TOki`61ldP- zM!AhGlSfEfni$tU#Wx(y>IQWT$GKh%<^HaQG@rLo8yQz_C5i#pgvt57|11N#{_}&n z$t^dAxh>0`_|h_^wHU-I7FCytMN{R%bo?&M5S;xqVxU0Ds;X?6A0 zXcK5@9Ehk(a%w}11n|qtxGMo<2xzYq(ikkkV`G?RxO!yXr+nwO;>;9tx{6R^S zJhZhVD0bA1Xe7CxBCyEiW@Jt6 zrm4j-!K%H8XozOdSHWSeiPk}KsjQ=-gZuOh*g1k9mD5RX{abG5DYMU+K)R~7^?164 zNqaxDhyB!yJzta7G3k)51zPgbj9JjmC9!5SYBaJU!UE5>o-1*EkINGE;r6WU8#tnc zr_Ou=>e^Hj{V2a2p5V(@EKK*Uj|`TP^bktv@|;^mAjEtOA?JTI z*T^&->=ECYVbsFh>Jgi&hYu%9c& zoRyF?XJ^yeYbYX;&_Oj=YdiQq4Bhm6$x492SN!}9?i;KnG}2|(z?If0-U|HQA5sgu z)>AO&y2?hAMVZ#;*cNK>xqfF1pu5z@J<94~Pz=oiA`G;oQ4@yBR3}bS+bFTks3O0H zw%YvH=wFQ?N@6!w4Bh_<741*1UTr;^b09kFN zhJ;+2SHkkZ*aZX_N67V_{civ=TpdfJrAGQPi=M#=sx^I-=1v0V-|Qz(&ht~+u=CY8 zn0_v>P%$+3L<}YU)2dM|NqVk00z(yLMoZZJHTFSu2)52a4b~bO@8N3f#2naShJ_rO zZ8~EhIw!~pjUl9`lL-FFiFUiX(!W_a$mnnJKzneL zWc3kOh*YcdY$c!>d>bLkQR?4RwuL4^!;TV$wPfouOmnBYPU``%l5I|0oes)7p^`fY z{~oPKC104NI|oPb6VP42DPF#fTL7!}=ihUDDfGZ18Xmkj$0jw(@6ArJ+BG=9V7 z{R6;sit`}+9!gy}UOYi@lJ&dnbpFyF^r6|4B-iovar+0wo@a=)AnM_sqwJ)>6$hS} z5v{5~^kah^PF(@QKQJvFqSK=3`t5GU3OwFN1_!a_#`X>@9&S6HDVh-bRvO_rqmZ{q ziT&bSU~%B_a!HI)veEba-$T)URcKeAnQ<2XCP@J?Q=iy1iq2WZvyy{wY%Iy4(INnQ=K|(4@jT zb%piDMZ8~oo;VdQ{-R!WkvKwH{pOXeC#yOs9pQXnnJpFMNPJAIYu~=WY=;E8`F@F2j!p41NHG=?gW1sDFSq8Kuu@$2G#R6UvVUGJ6sDk&!#0bEN_@}Nk84#> z{{N=*-~_-0b{wMZ*AwnO0m(lnws55KH+Edli1n?U+$qVC&OGm4_A4$@`4Q&wy0;$& zR9j@cvDd9TV{W;`sZNgGyqAsHmP*lmGKSPQTr%+#@?$1nz3L#+LE60*X!$g<|9G~1 z2G3(FVquRy0W1k-bIzZD{f7z9sbz@zDy4|^fAkF`&(7W?RyEC%lmb|FWOn2Nf4M3j z6Hk?p1;S6Aj!fx{2Oaiuk<8e=M@%V0iBclv9c*agZZ#Kh@lH(Y-{sd=)FneR<66aY z-ty5gg5x#7YaAoIsZI%oS2FE%AuqJ`ru(YeNKD|&WzCB%1Gs`~LJ*27H>T0o2jHOg1yT9Gc2ViECPlRNinsx}P4`8>y#;KXwNHS8DEiwaM#Bg!9#R4K z62Ab}V>Wokfv=~jPpyybvZkt~L_m5GXpPs4(pM8SSL$jbK@p<$N@!KbX=gC9ATyxH z#O{a`I$FjCv|qGeqGbM^^G%0Q3DQTA`p?v%c5_fELUprERB@)F*H2=&!LD(urfZG1 zl-)hFCPPg$vQs|wK^V3buN=1+DUlz}a&t??C~X_r;dNAI(|~%Ev_^Qj)pEk!rqY@8 z857__6SQtAWyar)H4a{28Goj4AENQH?806_+J!sk^+SGO%LCElWP=K*36Y&BHjUh0 zj;d4YRrK)9bO5YpQ}bm0-I`vn4&N<`Kw}f`u4Ko~DqT*qQqg5Jbh39G*Zl8M*IghS z!`>b?J4KFp?55MZMiFqs2t)R$HNR+{VY6Qui!1+Z$FJYuh--qh+De$??=qe?R$x)H z(S%9ME1Aav^o-bLi^`AYr3jNZ(~(4&0|CvGZJ*X-iF|pKHfsWn%a8*4gFS@qVU?tT zvqect>0cd1+EkHzQy7AnvqKv>9!liSiEEG)5!@pJnV;fr{@Sr=Zh?w#1xu-dE&ToBt;B=44COJF`!Zg8UsW0A{>x z&Y1|?-Y$Asl^{Ca{0~@c)JoH%%5CM}DHl}y9~{~auZtfA*=*OUnvn!+#;SsYR^LCg zXG7_NA2gXNF$qPYCF;tH{NHTQ68#;hx6nJ!j_gotBQ63(8Lu@XF64>mZ!LvgYS5bw zqJ4BbLT(1TSee z$!qsUCo3l0gc#0Tx9OcXDt5W=gJ6WpxfCRJ?(@(nkhYC^mSuMl2vXnylQfm;#C?(TOktDke*DS=RG z#GZ5BJCi~D<-$oIr<(Gv#7T?uiZz|$;~j-&#=ru9#>Ux%x$hd_s<~zc>)(`3E|i>6M2ep zsml$pbA?jLn0gWXN9Iuy)_viA!oXr8lk4;2699RmUM4+mBVk4N8-s+hOvImlC(}7m zt>OJ0WB*7Z+|vFsE_6qcP>Oy>IRw2rc0~=DhO>C51H^Ya?^Z_CBjEx5t+y$1bt|}x z5R9kBeD#jCdU|s2e%L+k<5(@WcH1T`5Zy>QvaO^}=CGGj*bI<1ew_C8 z4+Mn?tR(0$2h^LHJhw$8?%oajH~sxaJ2e!e-Ka=4n#%un#(?Ixve3AAYx8`hJF4Hv zJXiQ>(*>f6c1kQFcRnOfFbbn7E=L*SN`7Y1CN^CKp3KWO;Gvr}IJ|To>DTLD1icEs zTRmew%&{8q7(Y;?a<{vX$siS|IYu)9V7oAJhnIA3bn=2o-^oXlS-_aZQ7*E24Noey z2*N2=+ZJi8C(SUq4iNBK_gJg9dW#v_EOO42R+A-tmGKZ?gr~beZuxi7EvG=?URNb! z*p;+pSsQ;lu9fNLqdXwRUZuP&o4+em{V!WzeMm2Z*`>W>1dyOY=5x5~f!y2BQ=mL{ z)lJ?m9BFactywNcNI16mDa)94C6EeYUDc4-7VedB`y;D^Bp-~ZHkB5J%<}p|! zzTOWtw#~BoTP&s;6Bpwr8C**mj7SFB<>tnid&CoBjCJE&14Pd#+wr)>J+O4-$!Z`JlY;8iaZ~Z8k7^;jVY|3!CSn!5}M3F+j zV!|B_z%s{v*@0ahGE;t4H5sJsAa%>Wb@Sy;aBBZnkekz04BpB(Ps?|-tPI6Id&#~f zm}q)Q%|^|d0&BicaysIx5LiTYYKBrxB7k>5=JQSb*=yR6Ou^7^NWYS%{j(`**P+Ze z>|Q8UF4=^yWF*YH-dOk7xC6r{fH`ep`GjGMQvnwerd!(+q;J8&d)-n2+F_=97n< zoZR%|Iq^qTKjXID1bZN?r4~cdJg+kN-wiNU(%d{{{9}%UB^0Mas+VmQ>s?qf`cux% zki>pZSyeD^_MvV9WrgWK7#(bVHa#Xx+Yy5U z;+7dCF$ZM}#FxVkt((bvE!MWfH#)Ul(7%&u%e^+^N)#T0COl94_^Rx6!sGSXNn2-1 zX5W`D5&2ht4s%*^2FwQ!Zv?~-VxmB0?X8PXtPh>nmg7EzA$gbZIwhz#UC{tc8x>7I z0hd4F>o`mAp7O03LclE7ZDxhnu~X5~06Ny0M2#}+ZJzJ|8BTHG(e!t?81N4dzf-sj@+vSnH`yi;z$>=|J<>QNQdJ zsH}QB4a0yn?K9I<^9fiNrxh>ZB_+vA2NfFA*mTS01j|dw$Sc6dP)-7kjov2Y+Buh$ ze?c0rLd>X6N>LIIO{|(Ygs;!jWdAsJ<=px~9J(3)rcOs^deG2?H}$4KA1VV>;Efe( zL_a=ViiGGga^2q|4Z# z%Gyfv9Qh`^56xk+mmUVd(T@YLi%n;ZQY=9=d!Y23X{345r3`XfTjog^s_4zi^|(Zz zkGNs+L3A)pI}Mt(C~;knGY(+n#X4?n+b9LF#D^_s?JMJ%|Cu%&dCfh@$Y=#Z6;+qY zw9BS1l|)D#4AiXF8F^9nkRiJjo*I8x=H|VJ78+5w49uHTt-3@VFNh1naH%|uPc_Y{ zGAln-L5?E}aZEK?4D+!2CG16bO_eC}mFt9uw5H&4AlA>RVyP+(AAi7YXd%b6J{=iZ zHkWqHCi}bXC|*(5Jt+n{)%slAofYvnSmv`&c{dyiNzCA=%{EPW`a;%s2kE}4Q_*zA zRcv7?cB>L%8Fs7R=;S;B754Rt(6eq1wg0M(fP^GOa}b zmzR^6c5s)MP%weT4lk}40->9#tf4r04zh!Q~`(5c|TqDF2 zlO43MwBu0tKnZ;utE~Tf;V!@C3-6u(wUUWSClJbA1T0veU#eYlJ%$VM2Q^a=!xf!s z@Ay8(OSGqO76yVxBMeKl7SDbHtY{f9x4U(YU}?z?!nT~G`n!#`YV4GXL}I|RcvX7} zSobz-Pz2oyp9%{jjFs`X7h2eW@DW%)`UbzLTuleDWx=OoV3Tf?a;aUZ;`{QQq{_HL zieopkZrtpv#vQ;wZx|feg$H05Trh@mmV|`z5LPIcpM@=DhN_?st=8a`B5K@AmE+@K zur#jXP#OGk!RwffwZZ@EH>cgfSNO|u%jcUYXJfiWR$-e(Z<+s&ZS)SBd9Q||i;H8e zs@C~6d-Oc+%8!fcMD?SVN*7yPRn2N<=2j1&*eE(sjw%b@jcgs?F1YbW_Cd8!-J~OB z$>xs(OI2s4?4M<@11lkQ>EmpM(UuwKB&-KGHs~49?7Oked!hi<#>fBO1%PM>S=vQf^>NYoaL0- z00{H`kgcpW<_Br7Mvo>{ik*j*&@`d`!xu+YhOv;@$n1z8TMMl9=&oIK@k@)hZ~q_< z-nLzUN(;OFL9H`(xH=_Ce`&Bc#OZ?1BpmiDeW;jNS8=sBKLIvfbBZ_AebpZmhu_Y= z>ZSPiH_NN;RDOqNK-M*BdZK^??*WaaM{{=B&MJ=5(#+>_Jp#WA*T`tYgaO4{oRu*b z_qrQ{xDrR}uk5?ElKOADOqasrb9)~|3XwhsT#auW=cqJ_r~$JuPPjlgR#jgNc1(+e(%LBS003~$ctA3GP; zcZ?HbYP9e40^vjPTUlcI>!+tEd&5rI!z((jskG0ZfS;Oe32Y(O0Vc*YoNiTDr?)8s zZ-XwfuM>}P<71Fz9|O! z{%G=1R`4glk0}w>hwKwTkPOsm@h)$Esrj#8OfD_9Z9@0<*jmZPip%+mF-Gx6DaR!Q z5WT=drC2}r4XMMya;Crow(70wX|2WK-G-s;NTWlVrm+IPR8i(BnvS&eZd|+i;bSBb zVk!}0CU*z27?oV=u0$`e>a9|zOZ$V)CxT(x3lW5Hq*V)E6)|BbKH%a@t%LXEH`Li$ z{sHKLgp(KaK>dLEa0TjrZ~z&un+NDLdJ(Xx^5HnyBQw=nrS++Zpt)JxFD5R0(v@I| z{b69Llsaf<_CEoLK5WUS-c6r?wEkpVlb{F^!59DQT0E^vx()7M&FXxBdqVDO_y>Vs zcxIQF*w0dpE5OKW~!I% zqH-57*!js4xQX2GS1>3(s2Ae~Ru)haB#`k<*`_MRSp`xd`KL- z_!*c!ZeehbW*hbYPJxUsFbn18mD5tzQwK3^>^y@W6C-Tu|rXLZhN6k^VXd;F3a5Hg5wev-VR_g+A{&aXnAXB!@YM-ATY(WW!B{1_Epo&-+n9b0DzH|#!r{|~;ywOsV`B^}{ zfQVP>e$F|Rm8^}-Oewq$UU)oNfY8?tw^3Vkat)9uQbG)~wC#I7MB%p)G; zI))!w(vpr)TP>?xYB{X|+h4dJKiH1ytF~SQp6FVY3HA?AE_suzJou=f~O8F-LA zbqf0k{fel;wn0Mrg;~FUIdew81&>d0MbLdkgUUJ(+C!9dS~kHwb6!aBXAL+5f}(S? zhCB**ei0ffL?E@xYNGuD^0x5Gx3h2blFq;O9WGPo*N}^wgd*`%ed)I?OKe5GjxU(k zfivUoNK!XXDUo06dVln;`oIV@^9hKji(q)R@Lmj~Ywo3E9DM_5`HWL54Z~c%c|o0_ z1c`rV?iom^z>5J~dWPPOEK6Ok_igco_zzn_`}f&$QiO>B5dj;V>M1MWiAlLv1&P;= zfJ9XG#BJn}<&jSS%~}!7Qh|5{YXFskY;xfUD9o9jz==;h$?3pMgJWPOU=5LG;?xTV z=sJd_OIo`T@m?9a`&!N}*C1MKGr;m!f2@G1>3YoDUDt7n_aB&n_t)%t!yTN-7L!WE z&u-Gs_M<}%Kko598B;)uTk87ZMSINe2MVhrc1S?@1Vr~FHod05i(~4GG(~W&t)Tz9f{S1sY#s@G{^ZFI#?^N2}QJwaab}T8B#A4cSny zDu@{W$NdtFXA*3#>n%gXyXw0>7$(&$y(jkS)g)n?C|?cYyhYQ32YUL{Bx#y}us#8m zLE^;M?ICNCd@o*)56QSSsNZq`RR|sSyfMbT-M8N#KNwG2*XY`XDkCy*OpB6r`Hg@l zmIN-{2d3Kd7{A4mQZW0di>8IT=#T*WO4d4=a;$I?~2!X1a@w$72a;AGau zG^&{7SPrO^#IpdCOoY@HXHMvyQg?k&tp`6~;uk?&h1*8KdD>A}gA4S*BE!|xy(uay zhBLzwGjMrg9Io%sg}+hI{Hm%@Z?+A%2~cpor=a93!2Kq;`{)pIyE4#X;I(~j%mValN2%fEQOI+(Aoo0RN}o0 z$|cj6&G?+sGrCuC?UMa$FfjG~okf934qAodELbflE~I1l=>!?v9AGANOr0KLM8&NY z59TAZG~lxyUIU>3nkjoH`rna1rXt@W-RIE)QY=U4nPMtwsNoD2`l-lMbroQ3bGygP zK+LS}tKg!u7^r9;Le-;~l0na#)q39u36_Ia5r{LsVn<2+vSOd21d}99L;i50$sPW5 z;k&MN9DAewm;}gPT-V}vHIOHoC9%-&e+4M&;q@e(jS(B+Q(618(%{J0ng9H7!DMb1 zz^Kjbnn{?qDyCVzwhWe{okLdC$VUm1ekIpnW!?KL``T{VCcCpcg~od zBx4Xms&hHU`$e0Rn{KkJn>!<3$eBy<7bn%uy14sfBT|~?%ab*l?73$>_`Z{7o9COI zCFxx)f}eWS(P7V=K8d~)bs#SX=MjIC9voGAf1UnF=iXG)c^cmdX7`zk;tqw0Z--@% z44!m=JZZbEp)=xx-E8TDo-;RC^2IXaz&(|yM$dTV{RC`)1ynxD?8%&cpZxm*^$D=6 z(?~5{d(nQ(+D4^mMn9Wv*u3~&VL~&jB^x(ikMyhVoTczGblq&-f1r-;4YfMDIlY5H zQ7TMVg|!pnM&?1T8GZRVs>$}8KFW;StXj@f{2N9SkDmSPU*V$_>OTvP^uPC$o>x;X zwQ`1HmZD)T1zg(&OPmDUT%-o4&=y<`Z&4b_i2$Kda{5(<-u4j=^M6PWeBFxG8^r?5 zBGsUq9XN61)p8$6-{c#O2!f8-{9?)lt$gf>uFjuM@G#kTJ8hZZEM4FIw1QH-F{>&R9zx);IL!HPZ+i7gUCvYRg-^ za1$4P3;E+CWY~+YF}Ap1f(j;A98qrttfbYhpbD0rt@tXrXd30}tJTF+1lLBh9Ta7+ zvzhx>ul#ee_FkMh^wFGUpL7@I4TSJ}ETLKi5oXqrLjNQ((M$q8TMUJ;PUacuu(!n- z%FoAU?b`T8`K!sTY*H9clX;~F1zpcl6Qg6BaY)M}u;i|!7)~J#Au11mD*%MHy!%wK zfD;c3xk3%o|@ z{DO1@k9WD^C#N%5JJ8{640BX--E8OjTY?39QO%CPxnf-8m){}`@oG){Q>HO@#{%9T z1qAP%vmbIFdA^2{A5@qUxIUpDRoBdh0+mx)Jeuv1V?H#!f8-5R`hsaD2s7!SlTOh@ zPU=)lD^Wut;dD0&H7XS&!Sz9|DQSGZmAkg-P~eU*N^v{J`^vQex+f%}=bM60a|qqZ zg4%HN^<~R)8;Im$3C3lJj#`Zq(jJ@4--b3D3`=mHzYzHnGT$58)dAHq%r-&ygY>$Zu zwzOg|(xl;H^Vr_sy8L`)d3)mabtqSIOyUUl5zc-K&STAOQEL>e(-wRbP{7C->2>cS zRyC*h-V=#&cg8hPR-<~Ch{t9*s6JlOkOAp%S*UaB(8{WW@Ww^N`^dQcq>?*w;|<_T z>-t$Op&J}GUMGhgEvCg8{+6X5<#G;iKF6pWw~i?H^$JF;kv@d9puOo|IPB9f>`2;OElJx#2yXvTVFUim zHs=rR|D;dtOf{E)#9+c#Lsh62QMthBpYEpXFw!acmazjNF%4TSty@&&JXh9;N?p#C zI)kK`oGEwCNHl>bq zmsWwzl#_2KDzo`3GN2(o_4`h+hhXrWDe_l$avsS`pdj9vWHBuM=@WqJGQF3%AC7u@^Z|(QQU)O=f?3dPjc&fcmQ);KW4lKP?m7jtg%~lSCpZ(IRvJ>*f^MhUN%w%p+JhUiXUFt83~L3JP>trUaWcotnEN z6Ok4=m?ce|CkkTV!Ov)Cocatw#0+7%PO{~cYunIyltWyG=;rAyvFv{j62A5}(eA)m zE-Ef>1K?^GDZmOr#z>St_dTvPdymYXRsd<#5FHC&EzCKZJo~+bQtA7CntC=3LF_|W zm++Qo+@vl%t6q3oY=`|wLA1bH@_5@ ziGT(?6-Q`T_&4tgT6u?8X7gsE7>!miT)g8D5*OWz#eP?DQU1e!)X?IV#m_Cej!fTh zxLDKgev4ncs8t<_p6T_^eMHLDz|qgVskXFmKougjV50lO3@G9kDQ=hO{lup3^c8+t z$)`nLYUOLYscMFCf*-E&v>De$^2KF=LW@3TD%hoFvg@=)aAE4a8V$w!Gb`up&i?@Y z#I%Nz_T3*a12QSYp^h#iRI4dzE%F{4H=Kjp`?UY8tk zk9fDZxy*X=j2>BT4~Z_)_)ppyWfy#|7AHCC7g@!^H@I4^?qNd$Z1gES@d&BK8C2N4 zddj8ctQ-Z-BHk`<&}O}tmZp+>V$N>}*kY*@NWxcq-F{#Kf{5>#DN6~couCrmMb=KC z!OPW;w!#`KnC+3C&=I=Ob%{mqYlCU<;s*gE(8jKW}!e5_>L#wP0M`%s$ z;+>%D8s{f53-XMmXjb0!FVba1sYOJXjHh`O^DdTX7mM)0IBhsHnbPCK)-+WWT<{gIFpW_84UdUR&pUfE`G}#JF-0&) zgC@##b;LP@Y*+i2D6e9bec}?$XfiVx#1vD-c!Ibvt_PX<1U}Plo<=$`O=?hGplX;c z3n=FmLm zrU;0&^;a?5>-3-IaH;PO{{Z4R%)W>&Ny$qebS1R=OTyLlF>rJq zv_Gh*B8#d_w^X8=UjG2}N6GH}+2K4h^K+;Un4V@C35u7YrchDer{S1wXA;=2aXU+8 zpS&KSYpvHlg*`J4PnmtmPQOW0tnikW`o?8C;u5y;DbpUD{@{KmE*TUFj~8XQ5Kp z7W@dk{Sf{j{35Zk`bGAZ;Fwug&iIX6J6={%%%*SLcOm#fpkDL7o#Yw`UM^d-jLPMQ z;#QKVaTc9D6oU)vVn5l`5Jd~w6!Qi^ga-t_NEt?Bq!DKkDcPvoDpaXyXiKxEhl5oH zTh;<%TG9Loz|Mw&;5tSxBhd{p_kVMy9%BMGu|LjF@RFazokR8@7emPYrZUgpNmEa~ z_ezkyAkYAq8Zj)6)*UPY32x|9@haRpAG+#Fi@&!#CyY#G^nN8QHCe$Q;w&Fn*HX|f zOz{L_oJ8>!OB*%DW(_272&Px7UXbjCp!y^bBk)#(Y{iEv{`SYYa`p4=+A5W^?uMtO zfD*RE?-1-oib8OK0OR5io#igy%@XI<5FzLVMXAa+UCD%Zkbdj5(~D07sS+olB14dt zzLtXNE$F$nm zU!-42evs%&IG8o)6ti-T=m;fx<$}1{x|0qBv)ST29}H!Ve)6LaqPU^Nr$`A;O=FC_ zuHL7rtCRK2yWi*Xk6rzG`fB|@%5tFEey3?uBjmp1$x0H)L5?Apwqp@fihI86h)ys! zM`Anl5fYsv1ay>mge%c2cDSC&PLMF|goQ#7^u2me0BsTc45Zu#UrM=ADfD40_+Zfe_>QOQ@g6wgO#cArznRne{{WdsA1CHp z(sqM8mK*H%p_`uos9y|pS@AHbsG#VDPOn*be*XY-^nbIs{r7`uzU5_>y>=Wlz61N7 zPp{?+mEeCf^e@c)@ADlO@_u1v{p0za@2m3;v-SMU>jdi+3TMoDR4!P(21ffXT%Nj= zzxzG!c<23ok&j>X46tl(^_mr}4v|YfrUjt<75z&1et+agKWW?^$L0yc?f(E}h5gA> zk9h8VBweq4qbunIM;~SU%>)V3_+#{a{{ZSdr{te(LVs3MHU;j4iY~UrW7=#M%iw0J z@ia;vVx=a<#>A~rvL_eXJuows(k;iXabQ zVkkw@-UYunf{T}Fc+;D_S6S0|Wk9}=LkakU{8Rj>QAWLLWW$=tKg&N8{P*GurF%aR z!fkLD^Ta?^tzu@1?TL_?SIVOk4poE5UB@c=h?Ub#;hc^HZwFWSoL-Q?pcGcbDD1q! zM~l9+y`@A8W)oI&lKP~iKh5+@ah}F zfVoo&ba6U_b^*mkVABFynH=XoNtM{)$yi(6;yEQ)TF@xdTa@PrsOXI{yzN0`Iw-eL zzLT3^shY^@i@4|&nQv?ugzk`)9U7?HH1!6 zzn6$W-7wC3#}F#7lw386?+IA2;1(mDm0zX6`Gr)zb?VFAi7@4#2v~;d9({Y=90)nl=Ls4nCR1-%NY(^BrQngka2q8f{JLiH%)Y3{)P037EKKz&Sd4}h)1-^tE*29M23gZ;0^^~f`t!j3>4%`R0(}WrAI#+Ry_eb4qRYAHGRass6`GNU7l zW7xTfCZX_E=7EeI9`&{C4=YiG9@T+;9>m+@dDCg_QbetkDuu z0J)2b;Z1>M;lvt(`WJC*A4~PQY`;Z4FFc!%EsGW=GV*g4B2gN}k79j2{VxmxUkSwmNTPW|CT6A1wy0tDO`!H8Tm#6rCS86YYZ>Ia~3nkBqS zf6DzVBacO5#q>0fIH<8>=@#PwC{9Uad-POIG)0&j#AQ(G0AeYyulLNhrmzFXvp$g% zS1^HMy%4OZ2zY{b&>4^_1~Wth>8LgWP(WaMKD0(S=2~0)3$o(As%(82qdw@No-x_))M05c!jWO%WPUalYcj#TrxSHxE;X4uyE+uggfi)FEEPVqF zfmaEhCFHyGVuYll8bu|`i!GPwaSgVBZr_s zRJpL0%S(|-3Px90KjCuyLM=uVi|VwPaxg>TbJo^bNm$g8A!%) zV)UL-a8|fr_hMa^w2mjU$$PM_cR5|JK)o8TXFklin@jo3(veWBkogz~-B>$p;LVf( zA$g*sDSg#t?n;^oV(o|hZv^h4Q&ub6( zhSUd(z=z`^R|#b|WNI>!;yp_KW!+pVQ2+?VeHgKU=|rMbuW4S=y`n%R2xKt_BMT7+ zeJ^SSu;Xc+S&MDI6e6@_-t7@HO?;A7U!cDRv4zty0_ik-lC{o#o;Dw!OyH+dqk4&; zM@Vd;Qz}+;si!^?tb(Id{`F#FK~`LJ3LtV6!SKOXO`-%ECcK+rrAF!ogc#O|g<5-= zT(BEmTg~1^*bH2qaDlYN;s>1#tl?@cioVD;ILjrR7>|i&Hi8H};r=Ix5RZ?`&z#QoZAz2Q*!Hx3G9HH1xqVQh-N6d z7OE77z?oAIDPS5E#scaPcjCD+w-K-|_`g*n4%zJz`sfs@n^C5NbBmS6B@Uca=Hy(8 zX;2%X3p}hD_c&X;>b-$gy@c;K3xxoQJm;H$`ik)J!o%`$EE?!ux(mqEi5esE665DB z0D?IsN}9xzX^o!yp|~rWS*-@y?C~*5u{QJaI&-Bnnhx z@^*hGlW}-sV8Nv>chE777-RF9>r z*0IC_g0!IgGTIl%$hYPhSdo9md1AAkDbyF!`!Oy}K24<^aQ^_6e+elXWBN`Uu>AHH z7S@A-?twZ6aqh|Wg1C7yD&efo%Cg_iy*duJV1zP>(7i#sY3upr3Da}o>U4U8rZq$SWvXFH_S4kE_Av}*0u** zNGXh0ENV_n6e6&0b^$H+EJ$dGI*aLXW=cc|D#k7>seX%w_-;Hbt?(%PF=FLDmHopZ zdSmEvPkFw4{4!t!@#UAKQMeQLPyMlg%8-ccrZF&XXf9Lc-0H+_v>!5Z}Co<*Y@1VCH#_CGa&<>MhwMC>sMhZbwNFs^jV{-s9 z(vF_-I+ALl+2M@4&oh$~0{p?#;b#%CZ7Zf=Y==OJJNa-22NFOo^f77J5Vvo$2sSD6 z5auIfpsJ_=0-`44ED!~*28yb>%7bTLNM7uhat8q3hZ>hbK)k;Xn2|KHJSpW3Sl`I2 zd;|$<=heYf4L3xt-rL%_325{5s8(I`*sb15?3Upe+jB^T7h=4h6O)-!I@a%tb&XQA z6QnamSgz6}aIcD3v;_)a3}i~Imq8otx9TQ#;Rf45U38f6iJm4~+y|2>ixya)1Scr< z8v2`eCZ-PWMbhb>f<`Z#OQJOB5(j1Th1ycmEb`|aipGBWW zxRRDse9)nym*`9K`f5M<1RM}4v`na+M8NBE)lhLs@8#oZ?abb#;sGe0PzdaHqhauQc=+E zrOFh6(8*hkQNcawz{fkcR*NOjY$GgkjgT->#M0@fqJc~Xgl;YX%OIs$)}UBoY)M6+ z7V-mE`aHAg;#`ND3sp4(wzeiqO?Ff?rs&99wiv>9Rjq~7cMui5t*i#}?VzVHelH`o z6izAk%V8asSSu{E!VWLN-PvE+Lf@gt@D*dM#p??4a84po&evBgWRp$J`jfu zMxD!fisjF77<=;ad+{B4^2;BxFc0xL_<*aVeVQ7-=erS{ zzQ3f!P$#*V$8Z2@D=JHy^F8lP*s5>vSRZvmoy4q?=OXC~@o+A4%U@`6(DK#$q1ExH z8d_gueqo~RxGFx8WgMeBO$s}6T?Bf4slGf}7?I&@ugVbcSeT{kYKK9n2(=;Xtq;s$ z$l$j0bGUKHv1=Mva~o(CYs^;)y&EV$Si-8<$d}n%-KpM2yig7c>^?}{+)QFVS$i3I zAhBt&uPU#+w*u^VIFC1GmMQ=Rm{yc6Fe3b=Dy2sYp>-K2tivRak{JzXDh|Igxgpis z@N$-9i*@x$?v0=fayOeH93C?8uG9`m-vuF{QD(FSlAJ)SwpEEDy!w7{Dm!%+FS0*- z8y;Pvrj26Q_X>sau^n`uHFe~o3r!%j-w*O|JqAo-FfUjqm;q;71xiTw{=B0f$X|H= zX8sn>bJTz+7he$xN#RX+GNfZeL>2}y&_cr+@q-80@BI@S{=d>Ko3hX@f++Q6QK$;3 zsZz1t9>u**58BRn_=iZve}aG*tQ-zj zt@#HM(gSQvA8D3P6=;^P$$1T!JQuJdcHJj6FTBxe1-f-PUrSIl+$k?$Sfc7_rbZM| zpjw?U2ZkzL1?#a(7joE*k3kms07|O1RE@f?m$7Ax>_oUU&q&K9viKFTm4#g9g$@CH zm?PIE7~~qRddQMK)*gzAj8S(VccDzN7wNQzS&r4BBqff`e&kd9yc3E3(bV7ES^(|* z0Hyq~mGGMuw{7c>@~n)yRBf-1%D>c8+#4M$?*?Bm6sH(VD*d5y-xK_}p`rCZk=z6D z;X57kIJQS&;&LXuUq}wF0@e<(Ou##Wi?jueZHozIrWP!u{SfE6A!6cMjq95xCpe|< zp|n&U3NhgP2Bi=RU1hfX!CqE}ab?TwE$D)vTXL)=|OG{NT_lrTr=o0ZAOK%2FhX`n?p`~q*l9NL5s0Vr3y)jK<$B`>dhl+s2FNeqNHEZhP^W*krIS1MmYQ7ew z_jLN)N2%m79{n)Nv_oYR?nY)c3NfUd3eCdm7uw2SGnOL@Q;Hz*hhNIS*f$r~fasPU zm)lwL0U<)+PV%QHN?S?YXWEc0d@Fx;C%*3{@XvL`<^XMZMaA%c&Dk6+pO5U3hwy0% zw5kmWGE{RZ@oCVsHYX zmb*vY2(?VN%_ypc=utBt$U6tmf?cpnxmV6M;)da6YS0{mDIK*#W9?QUXJ_2yp-v^B zmUwg`Q`uw?2n8Ysx|bVV8^+hcd2x*(LgFwvV5^&9s*O5%k8h1ptqz4-W@QcU$l|4O z_*}}VcmPyN&?hu@i(1E(zdHtM9(V35m2e>?5$zwB176k&zhWTPb${xtm-{3?BqM~- zm3U4E#DDh{;O^0Ma}T-;5h9Uxq1VSis~am3ID##P9jd#Pi$r{b5wqM@#oC300oZOS zGEi{%Z0-9jkSy>T7@ZRX##c z_wwtQnxq)tzlL^jf0COc#l$^|u40f9;16M=_ln`;YNF&3ED3g9#R`jBZL^iW+HY+(m#!hmM@|c&wEfolqcfHSoX{5Cu13p#*{x)YDcu0*dP6 zNBKvmsj{W z*2`qIQoe~P2t^L4sLejiRF|v7Sm}VP3w$z*ykWg4YSq-TLx!O8iDMe~D*-C9#)}*5 zmv_o;E&Db&!D1lzTA3HUX@O3j0i^8nsXO(Sj+tyZ`N?>%a!V;H?yn!iEdmOm+wwz0 z1%Q@)$Rr%aHS4Y+HnE?li0yPSOwVZ9lM%x~M+8$JoUY*c7v1ry+nK745;oK>EL_DM z3{+;{;jE3!HBnxCtc^X0PH@_+D=L;c%5n3j8Ygz&_>jv}s(jJ?XK}h+T z3o%@%0Y(}H-!_f7jS&Y0wB2R* zkE@cN0L1TbOymFbH`EH=vbk5dUESTVE8E|3Kj_47LuVt6`ZJs_6LrN zPdiQ(khwCT$al497s(L5QUIxT=a_gxUbr_(jNqFA2J>nML4Zx^ZOOWuwOxb?UQ{_J zw}N$qtKdKi<=`yV!=6owG_qsD#x1B-Tsfx^>`p0wD~eLAieZ+hN^(~(BN{Wr#RZoD zt^wPk%ODJ&3p-M`22`gev=^cM!v0Vle~8#3N2m(q(yng(rVX{rg0$od1EUbdTkY}n zl&}{I)%p>2wd@`~NQmpsBmge|05&cKvF7G-yGfqR%6Y zuY3OXj8rHrg{5#ai7t;@7WOV#0MZc4SFjia9{mBPsnbh%T^HUecMb@wRO5IsSthda zu-m0RqssUX_n>qKwfG!8r6(;GwmisZp_#2lpB2$|MgIWU@_>uoK+0soNo+eyabrBM zf1#BR15l3Z{{TB;>V$3<8bTCKghSLfpAv;^3v}uB+3|98)fwX6{1A1ZK?+e6?0|`u zDLDPlt%R$ngR5#~*hWmyhV1H#Bc`Z@w$C6HRSmorQ?&Vk zB}`YI1w7E(H|-;j3n14lRQMKPep?DFd<*O_7u=Vn)^= zvj)!JRJo;Bf&NP3AQmkHw;PrZGmRfgiYpurmbz&o=)%p#)!Aj^q^9L&5$dq6O})ef zC^Tq308(cB3N?5SZmb9t?rJoIT)_tC#(rY&SiZUw**F!*gq-IJluR7mww;s@bfkG% zz%`w+dBN`9G*oh|N*BG`N1nV?Frk&k!z^ zu^S5CJ8fz^(an3G8^k4_fl)080t{C=q}4cC7X-U-6410XHzQ;d<<&@qU$C%Q9;Z{{ zVsj)owxE1+V*ndcnfnYQ_^2IzSN1fxD1JZDGR)B^AEH{?e5qBSd#n~~&1@LoTPe!d zx@&?LbrtTW7_eO^yp4}|kZEs&8(|b+tqi%sEgxMemp9!vz#HX>l+vw2+jUy(dJjgh zi)cns>QQJnN~ReKu%g2Ul(>uqeMdWyZJKFdhs6P`sSl4cciJk}?owp6H#T)xBqex= z@cLJ+qE%yFD~p>yBEIwE^)D;RkEMYrMO`E}A@0;|{J6teOs~HvwD!j5LpwTGeUuBW zYX+40E{~9x{e!P}HsB|1WJjdD!nDliKkHp-qQ}j177{Oat4H1wjf@4TRJcq6J!1aL1x%@INu+-LlO6 z-MFT`C55Pu6csy=PhigVEy5lZ7-gX!ZK1I<;n&}LX&(W z>Ij@iRLir1{97pk1;!gJL^OydJ~pE2TLrqhBUY-i3^-{UT~y%?LbH{yd1X>ag$YM> z5^oeoE^tvTs+n3bOi?n-HGSPIYQCi-NZ4&P^q>8ZNVp=T#*%pw++UN3R9TWFbQRXT z%FjP0qL>;M+&N)B3dUZT)NLC;i;s`{2>g9W?)qjv!2C|mxu65}O~dMM;vf6mO(;wM z02IJ<_V4>Ld|IBA)GXmJA{MnLDm<}F$4oZX`%1{A%SvoNDAWRbX)U6^Sd)}7gX|x; zphb8De{rIo_xkf1<$x~A#CSu@F!(@@uNUN&DijeKIJaPQ@DSSSD;jGTLoTYW0?HY7_Dc98vC#N?;l2L6{gg0HUB$$23Q`P^oA&Wx8ag%yES64(cShSGuh=IpvJ#aq5cuSu5S; zR7t#Lzih8BX0TZZHrtrrp*1Yf zRfy=2gXxDCNPEz)#H!cxf1+BX&Z~YUJV4PbLW<{J->Z%Sjj#jd2s+k_7dM-im2R(J zDkhL)(vT%*nz#m%(}kt*Cwl2;I>IYPS_cQ?#^0+HAT*AHuOU0C*t!J*HEB?VZm}wr zT(*~7QM=K`rghr_I6+dS*j*J9>3Cz{234$vV|qlmvL;yFx!%}}OM;H{OXO*0RR|TH zCBdF8z~!Pvn6PKLZKkX)Y$Jhe1_ua(g6=Ismw|z$M0UXPsdQUw;X)5SJnjlh098R6 zeYBZ+6qFB$ZUf5D^C-~ZrA7v?hW;hU~9Ykh~zV+){ys^N-+ zrLD5HY^r#mk1qHns?}LR`nXi4PjOqz9BD1J*maO;P#5bOi}Ekf$EA6N04et(HJ$?e z>Q}MHSl@-LNv#6jBsvW`B8mm!SgTgLAbx;OVIC}gARYUm`Yhfs+VIt)!kdq7ChLTJ ziK951YX$ltoWS%;YuO?fhidW+rrAR-wfGDB0PU#Z)9-N9VjuhH0E48uMjq20h9xg=dR1KH{Hg=*2CS)ytH>KpR#w@6$0V*b9^bCS`F(;Qc^Lz1 ztl&P)#=8x7s36=L@Qn<5UDNGI`rIsBFj!a^q-3SDsCjz?w1^J~bjQfcxazQnE>exd z0sjEim6f;JGh+ILZCLuN5a17_s_G&}l$jnk-6)m;j~5x1Bqg@{OG_t=e-k2kb}{VL zyMz_4E(@GHQ3BBf88k(zfJHcV%#?I!-g$hqmgTipZFyS#WhKB~1}9u5QTt>iM$>_8 zqB*k#YCIu*wF993Puk^jzNr5Ian$pV}0!{^mw7bE{Vd_D@=J5^^A;M7=SbKv7gcE%-`P8jLx_yWFwdLxi*f8n8_Pw#Lg-0U$w|yZE{!j&m1!HRhqNOO zlJ8H_r$3%pI(MlgF;*f{9o3d&PA>%``G3f>?`vgTOn4+@w)la0&wtKLoV>s}qetue5a8fjJ?|CQ-6&`)Mw%5Bvp+D@ z9H#+2$gQb|YJKH{KK2x3JUI@}s99VewgBDVEGDCQ;uR@X>i8jtN4&XwLhLAO7Xx&E zKc6!aXftW-zSXKykx$wQ*#_ES>{#f7!#VOBDhk6G%&^`)CPm#r!_ro!LxE5_MT8oc znumg?!OHT{Ip=5UJ9^~wbs=}rB!D{`8R>{56b+(+;7$$D0l<#!NQ>C zCiV|MwE^>Aawm@FsSFL50P+0^7NLNpD}5**hWbH8*Yy5o&_oBx^4uJFg$Li4A(V<$ zjM_0qR9=HyEh4Y$15~YNEFE1Gc8h=TU6x8#4U7fO$9Ge+6uC+vV{>;8nU3LWfA!1`zO z%(}ie>Mdyg$^DE9{&4;T7~*mN0M0rK@BW4{U_b4(0M_|_h7#s^k~49li;Id|aJ-J9 zQ35H^tCjxL5HiODfpeHCvK(v<(DMy~dsi9-Vh%S%L}t;__nHw%!5|h2aYDBbECSHV zKtf;5Eb0E=}w6(d7k7N z)@g;S2l;qFV$+hzeq;bb&}r}%*+udz(a!8$j)_h@T$Yz`b$fyp_!xu>P~g3Xt8kbe z4sWDOo$lbS0JJ`#1|vaLflaKK)EX7gX?8X{N&?ul9r2(@LKWb&Y~e(1mQ*CMcmy=X zV7lO_xpML%ru?;FYb;1%itdZKdj4*kAHW4s=~5`#;gzGoW3gU2xM0InrPR%i%Pj(0 z?ChbwaxCL%$Q5iprpVql!W5>U4++doa=+-?6K!o-qE)j1;)rmWbP&sk**q+&_ms`e zn;}Wn6g5o6QKTLRuu9Xj9iPTap5qitGSbIXg46i-ij&MV`@3i2O%Ar35fF)l2QmzK zeo3yq4yEaLV73H^Fib9u0X#(m8Fo>7upk|W?n4k~vWwvDWP&%l8*HTr;2Bb&emkF*gilISsTG+KonO{zhEZg*IfKl^k(B;RJjg%6S+O#KgV~R)g2*o{F>wpUh(QWYR0BvWFNp|Ns;Ff%k`!O`*m+5iXv0s#R(0KGWykIr2o`I;ZtDMOsyE%%&5 zN2`r2hX+q3bOwi@N3Sa?(L}A0Z5~>FD1sH9TOxVxd0L`5-O?!bG3n=U*a!R@GXe`k`Lvbxw7?&c39T5B%9* z`5|%sq8f!8qzPB?Mc))kE+_R5AglfW7MRo|B+&{tRC!L@-i@E+uMiIC zWHrvx&`G*aeG(CRyXC1DQYVq$ndL=SD+<-}**Z72CdppGacK1d*IrF;eox6Qk;K{B z%_!w38v8nTU;9NZPSWC64F%H2edJR~azE6qO4afuS}t0TJwa+(f^)g=+@Q5C$|7Hf zmc#gTJbaB5(CxNOXhCT}l1(Do#l{ug?ypxTk~-bEkg(e3n8ok8zeIZOMUt#prKtz4 zVHbs|9;g+m6VAe=uvUpfV1gF0S*T>je;g7Im=+XUv4_kA(bv?fT#eG+oY|LI$LPj-87Pk z@+i2X;#H8fkc@}T2?_+1%cm@O!=+>P?}^K5a%*0hpMcSc5E#dz%^yC!5bZABSD8wD#{JgfzSPKNAv+$@moew03eYN8Rh z$6;wCCo~N{h_C@*_CrZ;OHb;opv9md!Du&R+BfL1>&D01xe8zetgj-4pwfd-u(Aj5 znLb6q!{!1awEWd_nvBl%MmG5^03L~H4W;66!TWqA{#v zu?2M}bVxK0R6rqK$k8j=2*|ubfpTLU;sv1ECv^+7_+)hiqea{G1cV2{F`Ca>O*SoS zMpE~eJFNlo2s=?|Q|3Ae3#=o)|Egh5cTJF@Fkih*_*-4TgBi&t8 zX4(((f)VzC(yV!=5WWF(?XQ@$m zy67FPK4BORAd*jDn#vZKX|lWFUsWTY;GF~q*2IeeO_jx>4gKmDInNAe5fNnn0Jx@E z03NBryDaQz-uNc`PK;lxc3vA%>&e@44Iwj7WPcWf8VD^L5-oksGu)}M#7wr5Ku|o$ zYKrj9r})g%q5}T_Iv{_P#>)1MQRyeOf}f5Z?==`i%`JJ@Qv0{M7+2kS~FQy@SMHaty*@ zX>KC{9StVXb@onutce9c&g3}S5#MylB?809O`c!k6mlgU9#@S!s*8$bTt(wh52c7_ zWD&MwZr{DH5}wk8%<~EIwZQHZ8qv60SL!~7_p*L$F%x!u5#sQEMxvfOS{VaY)@f*pY_-8E@S%QwJ`H$kz2LavvNn{{T={?!=*q zi{Te|QHmC{L_OG<^a!*HsM+*e=xuDGd)wQ3A$Tuw2G@cMTpWZUs&|NEbLg7t7A9*l zgpOcv4RuqOi0{l-i}6NB4z4R(zcE=nP_}t7+Y{VC6yfGmF`tm*7}@8dmxjy@3E8Nc zt6!jUC~C-H`jp?Z?&@;K^r-M6gCj(l1kvgOoR$z`W1SWC?@BC)q;L&>{#^=bqAh1c z^D873L8Kk(g8SARTF`Ri)J4!Xou7sX0&q`|Ov@QMj5za10is&l39x3ojT|~pSC+L* zGGmR5o+dTcNDX$akYRUZBe6)Z0ssg`Xl#T?FgEr@&pQOxkkne@dnZR=f|-mXdz{f% z)CH;SY@w%j#^zsI)F~bnJGFlIR@(PZ{?t4X(PTj}$}V(bhQxp6QA;CB^O_s>>RlADDIJj|`;EPKx=y{av$8Swj%4U+> zfdLA>i%44`Nz_#_sJi(VQ4}o+TizEh7C*>;r3s<({>#OO$bA=$7x2mSYVqt4*huw4 zs*6=e`2r*kjR}&0)wEE3_F9lOfZcaix~;-`EFW!yH zPkobOEmTuvYsmq?k=1IYtoaqJpyIqn-D(!KAmMzf!ZGSQ8bUV#)F8)SP_!R37<|!T zS{$^y$!IEy`7FLEoeOiN4;~gaaASjLIK*+;C2k#N+_Ptz46Y8wIB3YpbaGg;q(dZ| zeA*U1UQD=+E|sEJGb)dVs9Z17)9(+bb&tikfyu*;S43iyhh^m#>9<^OkHfLB*^l4M ztllNWV$Plj<@eYmhO~ei8H7o8*AU`m+o)V;jO60*3_c@_Ygmp)hk!|q@s}Tlq0}ip z(D6)snV9)lL~}^sG=r`&G?6qOlz(QSF@}*^EPF>~!gJ<-5D-nHQ^EHmXb+|~O;0-=RNyw*b?l^T z!1haT;w?w3NY$jDfJCRo3#1P)u)K723k!c~3+#G=W293i^U(9vTic)!G9VR8N>{DRr! z4rDp4#*{EMy1aQIY(!g5z)Cf&DRS~LWXX0&8b(BVLje~Yk854@9TqPW&&tV%8cc^q zC3N_~@rDxFV3KB+Q=7igY=5%j98)(ATyqfCn9%9sTN-24525QSjg1 zn;(tCV91w41&2y5+jrzvZch^#98H+{ENfwbuV`}xhdPL(z1#!gTw$^I!kO06h@^0R#X91Oo*H z1_cEG0000100ILM1QH=J1rR||6Jc=%6d)opBSLbKu?Itep~2A=B~qf{FhpX4lmFTP z2mu2D0Y3nE%M?xiDlu;t-8|cmmYlCs$b>!t(FJy|l_vaTp{YfoebT87)YJyO6dJsu zL2+Gq3qcKefT;j&097D93-~PoXc`>4BeLiejwQ~u9*mHqr6I|qkVAArU<)V(0JQ%A zqp||fuzn5GiZKJNrh(wQ%&d+nxOb6sydnzl%F2LQN&yc<6%ebIp8y2%8t4{PTX*GL z%ay304{N~KIR@om1qQScW{E++W{XYQEh{MOs0C;XKrL0GRo}pA0#>CEfK|zzkpL9u zQ9P|R&J8*nKhBZquUb7cq}ahBwl8}t$dm?iTMD!Nk!K<;1|X?cij^&j6j7zAKxwkB zWbh0*Fh4Pwd8*65ijdLF1)EX;NhJYqBH=^*USk)L@1=fnW(#orq zsN0@KgRv_a3{f^B*3l)vi@lL@zD@d+x;b9Txj5!G)d=0tBLV*aN_0dGf^ZEdMFa8| z8qkDBce%#PiL#7f>9R3)DS!$EG?Hqm7XaF=Z4qPFqHv-|BITWCD$gbwEh`rM&1X9Z z9YUK-rurguS(d0ew6y685)xG!wB*xPn`e;ZGOaSd1qu=`yj^PgbpZ1#%{7SsUv1l zqKgjs%fNeELdkKY=K$gqZM!tEk;3dlJZ6_f56l6|NcGi4!}t^Ya&R*?IH7aiVIK2uT}>lNXNrqr> zgj<0i8uGLzo);euLf-VBi^oU^ekw;a?lT%ITJu4q8&KhY%l+#&?~G(um4dWWV6ZYc zc$iq<>d;i2BZd>E0xSF>4h6!<*8;@e55eNl;h`SC@~6amDHTNHh0X!ZOb7YW_L5E+ zK0H5%H!L{-a04jJnA7yH3CJ>&hdoNwHLfO`sXG9p;MlBWQ8lD7+Ls5|qM7V&Im91$ zkMb$L#ZGm8Bwv$CZ?QDsU5I@S%v?j+dEo+9HN~KO#En$gRb;rb zF>sy*k9(ne-HDOW45qTvL9(2FVo+2yOo8%!BW=`PBXFh?{{WN3&qHgfUKn5F{8h(X ze7~B17RNZ*#!Y{Wr*RBpwfCt{{>3_JTuCo+C%Htp^;M$E0kmZ$aI7P7*z7zHk*yCT zTg^7>OFgZ7MeO!F+4(TSa~p)r%pDOfZQj;ETB?6Qs$=&^LpAQW7qO0h1BY>JPBRT0 zFMG@5n3kN4&{ZF)d-L#YgA)!A;u$B@8`72w+E_d}Uq1%LK*-o$=Vh@&)|8*L9vL6e z!sUOdYk#_b?HV$EP7OoOU+mS2<2+xBU}KjDhJpyBX}3MZyRoGK9|Pe0iH4%KMo*YJVzE=m)>Nr#J%cc`{({> z%=d2MeM&F2nOIud(H>Rskf8!N?sW#T`w@m@M3 zEBheyT}wDw!p;-nnkF_!!uGJ}99lpt#2wd&7m5*;cr&^`6TyB@^--lnqZ{a)rEGyj zBOqDPkliOrThR%RWF{S#iWiF2oxRpzdZ5-Ew%toF_~s!o%`KMO^tQ+50y#s-4b$cR zY3*e^hV1sY^9IySjm&F{J%62kiLtfwzBdi8Zs4ZD6XR>O)uZ#Ef2ufm^2k8?Lr(o3 zEjl)}$MG}EM_R;}x*>0KgLbzQT{K#Pp)p_D2NwST;%oJ_F^oL;ZE$C28z>bXKNk#6 zjyz0_jNP<2fN#k`Bb@pqnrn~bEo2R0adU{bf3%RX5|+mqX*&1(EkD&cpfr)WW?_Cn z-{_@y&6h3xCw|~3#Ky3^G#aBu_94IBMH3t&F1<_d(V!I!Ep{eGJ7${y0B{Op6B!jp zWz0MDH%kYHWbw{jyK29Row3B=(9QL`PZ7o9jHJ|sqtGZD7FId!CwtXJ6J(w2BglSW OD_{+%#g^XXfB)H`b-;B1 literal 0 HcmV?d00001