From 16ffd60e75a8e3b20e875b31c813dc9f4fbca454 Mon Sep 17 00:00:00 2001 From: Brad Arant Date: Sat, 29 Jan 2022 15:52:04 +0000 Subject: [PATCH] Subscription system improvements. --- CommandList.cpp | 2 +- Sihen.txt | 1 + Subscription.cpp | 15 +++++++++------ Subscription.h | 19 +++++++++++-------- SubscriptionManager.cpp | 17 +++++++++-------- SubscriptionManager.h | 2 ++ output/main | Bin 106552 -> 106536 bytes 7 files changed, 33 insertions(+), 23 deletions(-) create mode 100644 Sihen.txt diff --git a/CommandList.cpp b/CommandList.cpp index b3ab300..df97968 100644 --- a/CommandList.cpp +++ b/CommandList.cpp @@ -17,7 +17,7 @@ namespace core { else { if(request.equals("")) return false; - request.split(delimiter, 2); + request.split(delimiter, 10); request.reset(); try { auto command = commands.at(request[0].str()); diff --git a/Sihen.txt b/Sihen.txt new file mode 100644 index 0000000..3eaf00b --- /dev/null +++ b/Sihen.txt @@ -0,0 +1 @@ +0.000000| pos: 0.000000| pos: 0.000000| pos: 0.000000| pos: 0.000000| pos: 0.000000| pos: 0.000000| pos: 0.000000| pos: 0.000000| pos: 0.000000| pos: 0.000000| pos: 0.000000| pos: 0.000000| pos: 0.000000| pos: 0.000000| pos: 0.000000| pos: 0.000000| pos: 0.000000| pos: 0.000000| pos: 0.000000| pos: 0.000000| pos: \ No newline at end of file diff --git a/Subscription.cpp b/Subscription.cpp index 94231cd..ba16cd3 100644 --- a/Subscription.cpp +++ b/Subscription.cpp @@ -1,8 +1,11 @@ #include "Subscription.h" +#include "TCPSession.h" namespace core { - Subscription::Subscription(std::string id, TCPSession &session) : id(id), owner(session) {} + Subscription::Subscription(std::string id) : id(id), owner(NULL) {} + + Subscription::Subscription(std::string id, TCPSession &session) : id(id), owner(&session) {} Subscription::~Subscription() { std::stringstream out; @@ -13,8 +16,9 @@ namespace core { } int Subscription::subscribe(TCPSession &session) { + onSubscribe(session); subscribers.push_back(&session); - return 1; + return 1; } int Subscription::unsubscribe(TCPSession &session) { @@ -38,9 +42,8 @@ namespace core { return 1; } - int Subscription::processCommand(coreutils::ZString &request, TCPSession &session) { - session.out << "Generic subscription passthrough"; - return 1; + int Subscription::onSubscribe(TCPSession &session) { + return 0; } - + } diff --git a/Subscription.h b/Subscription.h index 93e307f..4b11c76 100644 --- a/Subscription.h +++ b/Subscription.h @@ -1,33 +1,36 @@ #ifndef __Subscription_h__ #define __Subscription_h__ -#include "TCPSession.h" -#include "Command.h" #include "ZString.h" #include #include namespace core { - class Subscription : public Command { + class TCPSession; - public: + class Subscription { + + public: + Subscription(std::string id); Subscription(std::string id, TCPSession &session); - ~Subscription(); + virtual ~Subscription(); int subscribe(TCPSession &session); int unsubscribe(TCPSession &session); + virtual int process(coreutils::ZString &request, std::stringstream &out); + virtual int onSubscribe(TCPSession &session); int event(std::stringstream &out); - int processCommand(coreutils::ZString &request, TCPSession &session) override; + // int processCommand(coreutils::ZString &request, TCPSession &session) override; std::string id; - TCPSession &owner; + TCPSession *owner; std::vector subscribers; - + }; } diff --git a/SubscriptionManager.cpp b/SubscriptionManager.cpp index c93c530..93455b6 100644 --- a/SubscriptionManager.cpp +++ b/SubscriptionManager.cpp @@ -4,13 +4,18 @@ namespace core { SubscriptionManager::SubscriptionManager() {} - + + int SubscriptionManager::add(Subscription &subscription) { + subscriptions.insert(std::make_pair(subscription.id, &subscription)); + return 1; + } + int SubscriptionManager::removeSessionSubscriptions(TCPSession &session) { int countSubscribed = 0; int countPublished = 0; for(auto subscription = subscriptions.begin(); subscription != subscriptions.end();) { countSubscribed += (*subscription).second->unsubscribe(session); - if(&(*subscription).second->owner == &session) { + if((*subscription).second->owner == &session) { subscription = subscriptions.erase(subscription); delete (*subscription).second; ++countPublished; @@ -24,19 +29,15 @@ namespace core { } int SubscriptionManager::processCommand(coreutils::ZString &request, TCPSession &session) { - - coreutils::Log(coreutils::LOG_DEBUG_2) << "Processing subscription request: " << request << "."; - if(request[0].equals("publish")) { Subscription *newSubscription = new Subscription(request[1].str(), session); subscriptions.insert(std::make_pair(request[1].str(), newSubscription)); - return 1; } else if(request[0].equals("catalog")) { session.out << ":catalog:"; for(auto const& [key, subscription] : subscriptions) { session.out << subscription->id << "|"; - subscription->processCommand(request, session); +// subscription->processCommand(request, session); session.out << (";"); } session.out << std::endl; @@ -53,7 +54,7 @@ namespace core { } else if(request[0].equals("unsubscribe")) { subscription->unsubscribe(session); } else if(request[0].equals("event")) { - if(&subscription->owner == &session) { + if(subscription->owner == &session) { std::stringstream out; subscription->process(request, out); subscription->event(out); diff --git a/SubscriptionManager.h b/SubscriptionManager.h index 0f32db9..e0d19a3 100644 --- a/SubscriptionManager.h +++ b/SubscriptionManager.h @@ -14,6 +14,8 @@ namespace core { public: SubscriptionManager(); + + int add(Subscription &subscription); int removeSessionSubscriptions(TCPSession &session); diff --git a/output/main b/output/main index 99f2acbf1cf5fb9e8cbdb9d0c842c9faa7beb4f6..b3e266c4e10dfdfc23eca62f978556db9fb095c3 100755 GIT binary patch delta 27603 zcmaic2Y6M*_Whh&GD*n2gd~tkk_)6k5(qW45PENh5(qUAn)Kc;O?n@CM~a9PmEQ5$ z@rlo;V!`t4QbbV^JO8!!oO3RD<@e9`-DK_AGyBZUTC>lbl6(4c(1FWAtJ972XEK^N zqguM>r_C(?^`?^%Ws`ruRsD^|xNCdPxP-fO!==x3lt#np-MhvuPD%it@0grMPslS9NL#|t4HM#USL zz1Xe;!0i`s%7aT0Ca8YcV7Cx)6Tn|k!>m{e9sg_%7>%;18xe7Hfb+^-s7PcBk%>=D zd_uC}6cMe)!`nO|u_=4iQ*|;rT+7#CKlwky=I-LKqaP7sJ}N$e&tVFi_i)&iD!Fd; z4tFqd)X&~QfqtGSd8nU9U_{KIKIfI29tO!EP$g7O$0wxY!vVigTkBT$Hy%a-+XaQx zmO>;gX-iheph}L}sGls7&bFa~E$#J|1H!x(lH+|0>OP0?>|CS-v78&$w#sNqk@Q!fqvv)aWomBG_Wc= zCZo$Qgm|jd?+y?V>X9`t7e=tZL+DKSgUJf+P;E&r3MZi;N)T!x7dv-JI&`L(w;t zROQ}}Gh|&=zkWj3#nj(vhAjJ}9*Y|T4F8sn6fyXx6xaLqU5mui3gq+a>RwcKJpCNp%IA%{SpR4|)baQMt+$aFMIBJHnGnq6gt zO)O*0?lwc##_E5Ts{cp>_?5e~OeHpmF}kRF4H9ElXX%-Apf$U7ovI_$=mu5V@(i9d zWHy#Pjk_7udO$(+3|=;5f6NY*47FT5L1q-5*sF%Tp{_Sb2;qsnX2{>xHcasI1b%GD z6*NdBgKN~DfNoEH7FBs(zcS>e6?znRsZtqKGUs)J;S)5kRIcasrXf2G6oLv8F%M=x zcwX-qawS}(o4hg&%|JR@wURMIMCcEOd>$!-gYlIAY{+h?NChJ(7#}%vnYz~ShJWi! zn(m2?uzasI-SZu?U1hL?OcLH>B7XJ3FH_8u9lq^2a40!h%!?dyrcd|gC^ewExQYUe7eZmbN!=cYtdb)H zwWwve^we{&t1@+m9CA*O5W`TZkSY<-2PvzM!jztH$bstbjT1tc(~Az-Pu*>7E{c~N zvh8s_Cl@HfXhbl{o9ggAJ^@og<(j-J4*AtqA*kRcRn|RW@~%4MYpP#fQeK~fx;K@4h97d+_jyeMe4McVmt#L{&~SY|l0q|W8V#c_7|$l-euRYFIg8545Hfs^xh zd5OkYU0xxno^vyi~6XEIZatk*%*tPI`d>%gkBz)rcWHcBQ#A^uBR!- zDStksD_*0@)43l!O?8~|1Jy1+DWxZN1KfhAsj*Xz?yUz(*J`5 zA4Zl{xjYu5i!|kVB6u!pX78ydgunX2Nf>GMp2z}5_4=toII5qhEre5qc0rvi?`gZ$ z$>67`)f1R@fAvpSQmeNIp_K?-h;msLImGZ>2@S=fuW|WF9OkM&owg3bs3F$Cd@F4l z4i4)idgZxhSu<+Ex*lixsy_52lJzWN~_b6=Rd9o&MZmC4&_n@rv=+hq23+a}Yu$Ka_zTjp=CW%_fN zzEM440)l0S@2al3XU7{ zjgID6SOh1{kVA|ds6cp5X&dv*A~M(u?r+&9bAP)u_jfF>=Kih`7PimqDRcjmAs@lOcp91e z`-VIlYZfr~zZvo*mgtZ!G_g$nA687w{h!*jxc|%cGWWt^F5(>K-q0pGpP|OJit+!7 z9g5)zc7&zJ5Yd!WL#-Bi*?SyvBG&X$^ine)?vS5grBQ)qKFT4}u?MCC&3v?@6!S6K zw3v@~1XjHt$E#=^PcQpK+hppKY?GN!wqj}KD?4Oo%ntX3nNM}dRoDb@UzquH-N0f# z!#0_De^uLN>Z{o%Q=jE1wd}KPlbNq>o6LL-N2yg`)ADNO>p0|HOc3{!na_2|l9m`h zmoW7W9dhGbvw*2@;*h@|GzY`XH?v}D=9_ENV!nm#W#(JiUS__v?d4V9#zCtd$2WM{ zQ!hkX3~nJLlq{JwwK&zpz zgVhjh=7Ij&)M~)_tN0-~Kn;WKZgL_hu@0|K0z+(*)iBhGrPVM3JHSk{FRX@94p}3~ z>Q4Fsz1UR!psi<=V8=u);Q34XbRE)v#Kd zE=~lGwM+H$(%)=V(qwOQ$Zz-JF3B*9?41r-9@`))&}8E}pepuwRG`V;?_jc%OtPQQ zW{8>e50>Wokaf76zx>E3p2N1yOaF*%GTBFUEbD~-tV4F|Y4(N5#)ZTt>@>MAO!g_= zz#{v!Z8FzqY?HY5d(PT6lYQP%itG!v$z)%&O(y$NX|kWQyqfG69P;*9v!~4U%MSVW z6J`N(eZ?_UR>C%sCzi>6-67L1nuB4o->_n8vj3q?i|jXTFO&V2?Papxw!Il@Rfm|e z_i&+Lcq%%>S|!plS0_89`R^?kg06Zrujx+t2DSiHpn0w8)%sE|b?xZDOW* zBbVi@sJG=hqi1UqePvp!+a}XmgWCo+aGo-bV>!NLo*RHn7ycXCd^V-d9jFUO-=DRzqKD3de zZi%!>xMyK_dOO3qAi03*%bhCt)3R|f2d_@x#ZEc>oG#GZmpEm`&ALEyKU7a)vdR50 zZCY!3xIMwl{Rq2HoWCEnd(7OAg!%ABZj^3pt?9A2(!?D{>Re6cegdv@Ayz8LVeTi{ zM`P|M+a_~A#WtDyskX`7PuG31H*z!VuJW3mX`8&JXO-rDw&m5_&vnW_r7XL*bGml+Y;uP6u0-6^-foN2+DPjRzuhVQ>xEc@`dSUUa4Vr$7icx?b;=$dU7*$Q zgp)ITSyK%Mv}t96gZ7lO8V=!jh>an!8V-|5dk!-d9I@Rx!|Pa<8lH9Hg5T_m&hSoI zA6M_xTdjsux`CbHZBu7>+hjGIHBG;fqcgm-bcVN0o#Aa$XLx6+&E0dB*Ua!vS+9)Q zQ=Q?Ra&uR+KxcTT{9%nQ=vPx`c&B{ytT`B+;jNfvhS#R0hBs}m&hWNZXL#G2p$x+!b$ERe_|Z0*`JZ$wi~0Ky9rhXA7iRu9r@WA7_J#AnAG(3X z{GYbT%=`bcZKnQ#Z8GzQs}%DN+hpdQw#m%9T&0)~vb>u45SL7?Z1$9y_qgOILot5t zJ5yiIC8y!?o(q`y@-BJ4$Q%qaA7jPT%*SfeVm{6`nfV0UWacZ{Z8;Alx@cQp5$yA} zo(?L~-fKx}sNxD6ol0s@A9t(ZpNO?Zx9aq=&vePRAWtgL zwl=MkKwVehnhxCO+I?j1>)R%u1RB76_$1I!$Fj)JbIC7un|)#Oo4REFF|#jBeskTx zBEN-gGWjiSleuqYo6LP17jti)1lnpFv6%dJw#nqTFHL?&%d5%n;*vw>n>}Un3tX~S z9kYPB@8ObF`a~uVMtN9`;rY66SHZAh|+FmBVzwKr62iV>W^<0k_f9e4u zdZ;UGYPz-Thg&W5vLES^U)C4meu>5W7))-kF3`+RaLJ5jx1{U*6Y*R1$ zrMAt~FSAXieub;lvR`SN%={|bWad|wW`3>Z)y%JV$wb^{plQ^XZ<}0lSUZfLOPKm? zF8K>s-~y(8mrJ(nW)6mz{T?f(W`3_WE#~*xCNuwpZ8Gx*?6$n@pX6naM*Cyjl&{U9xi|I_9To z<3#YWOFlc<>^rOBQN_$ z$uZD06=*dWZdOCSR)gQ;)OMtKT^Qspby^5^TT{-tAw-)PBC8?PHdzg2bSO&=UbmDD z&AzZ2%DH9x^JZT-H$=Mq+!;#_Q91xjRzrE)WHnTXSY({)4#tV0aq3!!~4F)Hk*wXzKIba&x>8XHij8-`p+# zwoeym>RY?zOW1c)4NZMJcd10sL7O@e2v6sSn5WZ1SL=8>5jOnrfEGWFebEQ|V{ zZn+khAarPbRoL4t^V*nwVe0$n1{U*uZBw5X`q?&9-`_Tw`ho6J)EC<(Q$NTynfk${ zsUKo_HS@#Wvdc2Fr_B6Fw;X9;{M>h@evDhX+nNPT{RFq1JHQ+aQ$NXysi~i=O^f;| zwwI}&W_y|W>9&{izzlb(-5~Wsq#eRW&+yE3hwZ9CYEa?*EBLE*5#lp=HTg^2G8|8U zsX&vz!Y#+)Vv-6p`K#RzuY1p0ZCcBI{X^t~`;B&|c-e2#rnT%h!+dx*xJAdZ$lvak z1xTFS7hdbj_ zP5vRvtI0p=mJZx4<(@M6$J{cxf?2@apK{9&kzlz7bAQe)TN)_v)5J3Q7p<6@{7c%j z$iHlxO#a_&lgWSHZp-Aqz~oye0XnEia~>e>X9k5mg|mS^3Cs?%=3l3Rxk0i=st_ye zv%rEN+4fmopw+NANVZ3^q8eHa%Ys-9G3K6Nxi*8$lfcR#J_%sM$hQR6;CM(R7!s>t zEtyy$m~u`9O1oilDp;puS!&oAB(J*6zOWj$1j)>)x}X-Pf^E9Ne7{kP?+|U*c9D4& z*rCliMh?qir#Ahm<~@PkL00GZH1N1>vK;ore{g~G_^|CJHM{mVgNXV5Lp{i{|yP5s}4WWO0gth1?qBS;>>CXxy?^=}2q54-CE zP5reXroN6z{kz)4%^`lk|GuWa98phafe)?YY3@JLrbYe7w#n3gqGMUqe-WUW@&Em^r7}TW0?ke~{d^*eqfCe-Dy__m~Bo4gLy}^E>MT&AyOU zf0%tdYcW?2v+vXH;l-_Vy831RZUYMbODQq833H+hh@RwM`a5fnV~g9)`Y3q=O32M@Z%2 z-ri-Zx5#-@OavShf~96S}d zcPmPbAMooJ3jI5EE9x{=QZgG4 z1diITjt)!opFEACow7!>u4v3a?YVY~sC_|j?~yMineHuc?FzV0oQC@exhCCopMmRA z!2LZY&wE%d&Jcp;!*~y_j{|PJx9Jw%XXLl4>+tB{_IQlrJt2FlvBRT{+G_Fe#PY8a zfx|q;LhA2D(Cq!2?4ZsKujKf-qxxicd|IWaQ1-Tb1p9-AxKU&rz^^0tnA6df*fu z`Ia)NI^78W_koW-Jjql`x&hZ5jkkqWqfx0k3f>J5Qjd=Eh1^E|@J=%1i)y`P;Z5-+ z>XK#6GUR@B1MRrxTtjwOF{6F8F3(3hys;Oz)I9n(jiGvc0<&ixoog;N=chQZK^iJ%X4U3|XkYv#hO#d|kzkF?~A>xlT17lUkc=K5ocHIGwRf zW3Wup@d-@5dGzYRi20-;KZ;P>$0UcaiTB}FsFx6wExZi3Q++=sRa++vSw$s{_4$XA zJTBpVZQRYEyVUm(onz|24X5IY(fg_q!EYKjyy%8?#VAjt2ivc`H+p@&5ZkZ_L@3EA z_R=Zj!;!6ZK3s|uP3e5t5R2T(hyFIS;_ZaEfpXed6ivn_Bpj>DPKb+fXv0{J@{N`+ zyaH9w$#jMcMbC{x@SU>#x6n<~KUZF!1pnXR`|u&Z${QEL{|JO!xLI``SFyy*g_RK6 z&V}?off4F$8pwrxr=SG3Q6ImW;1iNgeW_nEda&@Wl5b(Hu)7ehezx06l0(#+ZV)Z zHgpg^x{Fa}W~|)7bSJ@;;t%-E)Hr$xG8bmb$b+jzz)i2TBQvIynC`xC4GOr;Tv>z} zhZ~eeB4{T37?gZFR9-x3;8%prA#q>$j7Hu=P7}F++59u&&tO=)PX5x zc1F&PUTx0RR3x3n_%K)Dv}`pi4Xk`TN&SJCY#|?~t7=mN`FN1(Zdu63os{3QkdObV zo}8MhGdJ?_3H9DoUo9)=K3HHL{XiQbPUEAGo(*N1N4L`Pe3dyZkdDWy9@7HpI9@#l zpOub-)X{0t{{NnQDXZz^O9SNOOaIFyLg|RHe|4wL`B0sFzklT4lkaXM7%TZ60S@He z;+3$jq3A<=LK;Jip?30Zt~yVT4d$)s4EekoJ3U4lbEQkIo?fwoxtknz4F3m;hKA9n z9sU^!AC42=oRnS1%>1g0;(}w`=eZJg8~yGV|51(-Zxh_Urb>MYvv|Kt&Y8N}w-< zn(mL_`aIw^Q)+Qp)BOir4%{Kut*u?=J3cW-eTY zvC!M~hJlPM@i9AVrow?VT~;bws20tvWRzD2XC?%jId7}FIx{-N%y2it)t#9Y{ANPq znYI$z6!`fIGGq9p!iF25&PlPXJO^D;{Nde2A{iQX}_7z3Qofx z2VY7@QNavAQV1lpdTR5mz~;2KdSzB%bGqN!oNhvdJ#+-3JA57Wz}}qBR?)Kq8E%hi zH9L^u@K3z60~v0N+B-Y70&i-O;Vx#F8`o)_@Q=3Ync30ddTb3imm%xDsH8uT^^U6? z%R<&$q>B8hp;p%WVZU1DPqw$HTh(z?wYI21>SN17+PkEJ=LFJTOI2@9AnjdN11$?_ zZ?IZsSx9?3)Csh+wxI{r7w}nWZ=v$e^@Xy9wD(J@sy{bbJF(Z?tBU6aa@%0FW^N$2 zby4Rm3%M;>eTgu-$5PJ45^95w z=80CZIi=QKvyD1GFOb}hs$25{d(G=Owb5SlIRxNly6ykiYqo_Fbh@L%aJuUj23>@b zI%4-A+k0jp7+rh!==1OCP8I~xoj(djAm4R(3RWW&HNz)lGLB-WyRlfLhEa&}L6$Fk zCRMQZnzy4+VJdv{ZU4N0f3CcN>l0%Wdx7Iq)n_I_&;CT>tb3{AO0HgR!&!7F>4&ZZl7| z?1d~x9Sy~aDjXl((I_)>?%iX$GvKNoaGSYwLZs<#16L<}%9_p1WLif(_gJ)bb-snB z)JmOu)VGgSG9FXm3lj>=)S1@`Urc})#s~QIFMP~cW-|Suuj&33t_QZ;+AcC-R(9>K z{0r^N_3~=RLi=*Pin<8H%#x?o#|s0O>%G*2g@KHisnX$re0UV$tVjF0{7n_QII!pYR@Gk|*z-lGQHulF?_IUgvXK2M zs^`$o%6{9__wZTQ=krwDl0fo1ty(Pcg<99(Uw2SrmZaDh;r~?IQPtY?`P9pnh3wZ> z-L))azfV>C(m?hbqS`GDWWO)fM9V_-~QuHeyI8Hd^kS*y!JwMd)wHi?LH6&c?@Kd-pk_)*_&DZwibj98oU% zHHu0O!(DcJ+_AgM|1|n9!=-mqoTZ!I!KIlIS>z~VG=$lV%*g%@xn(nopXrC|V|+sX zT7e@q`<8qI9CG?#_+Cf(dzMds?L~8LJjfw$rl^jqVnS%27dhDBxuQm|s_3oo46I>} z_z{zZXqllluWCQa87;(m9QD848^{kz72+AoS9kAuST%j#V!YzY30@CHPv{MqE|ck-wE_h z>(wg-&fp&077I!(6T9|tC=MbN&Ngw=P}HSN?BI>M$Z)oK3x^NtUM6-sF0=T_iL*^l zoO^?gmx(PoVHa7k5`+FDmVd`7yP6d&`G{R)1)Juzi>zRu<3_>1b*v^-XZFI1wReeK zWX0Nt>oBvHCl03^8s&H8|0CF~S#~um*f9|CZ=)OnRqGrvn)u@t`DU#ry`Rp4K^51W=nc&8cd!s%rL{w3s_6)4`|u=gn5v|4C4G=}4Gj1fA< zaZGjGqq=pGMc5s6ozKWk7=TBh_R-Lap`Hou<`@LI>Oy~EJerp$%=z8qaK=V#{X9sN;^XO z>-lw@hSUXy9)I|YW8&Y8ra9;sEWh7|^9SKh8Al=qn~+_D6TQZ8+*Ry>iF(A9 zSkBoHpx_IvuEdB)s!{M)5^!WFRlws7bT+Z9q@BL-jw^x@<&K5n65VL3>C>IM>J%M~ zpl?w*l!|(|{O;lSf{IXT7yl>@mss8zMtBr(Qc(HXz@ba2;A(FnlHIXS0L%K2{d>Ng z;Ot>I*e98o!CK~#U&GY->V_=CIt%uW#H#VtVuLa_5gWPQ`q=&0)3WK}_^690Q|WnL7wH)w^aj zjE)iXQu-Y4^%NML%F;ic&hvhbS@v}fK8JAgy$ia)=vwwQ7>m72DL^mJZwRp3JC6ol z6nzbzP2T<6GDra0%w>PDixir$eS2nWM_06e96Xn>FVn~&~CBgVawcJw8XsX6-iH})45iM@%W95!O z7w7<@@L9EYi!Y=NE-foBa)dQeSGU9@_5q8P9Zv4nMyg8P4xi5Te?FsJTT@a8C!)#; zM_3X5(pWyHYE&bf?$d>zhA9f4QJuG@gxo2Es^=YHU#eMK6AVLb*%}{Ge-p~iIKpbE zi(8|ONOf&%sxeCaxizld-5&6a2&0%UL%TX0#S}%0tHL#(U7!7%YlP~wEiPdS2(Emt zEO8YxvQ*o`n`*%}q`0&Aim4EDg){|!RYKWtd9PQ2QHG6R?{yE1FgC)x#XcAwHp0EH zDHvWhqP*D~VCa<|9Z4}|`=EKU!L#-l(kpW*3d^gzJCd8L?QjMe<#wYt zFO!pio^qN*QTX!$R4Ah>eDmKb%u?NUCO7)!463zv@Iic7avY+UsQM)~T9p?#!al@b zVzhC<*LP}1_;y#Es-E5%9n8kg=&9-r7?Wr@~;&?QU`V=1j7=Q??->6{=O^0*r{&piZ>on?%iodCzZ9kQqV1&M*1n$eRoy= zSd2ZC?sWDHzJXKRz?YMS_#FT?eTm(`YlV332VnFJrf;7sc0+u30eS}a4#LUJ2>t?j zxcKG~+{A-je7hwQ5x~H8*w%dn;2P-Zij6OJV2**g#3zt}Q_ELq*3se4{&6ObPbcS& zj__~rCzS3db##Rv-33gSU_FEB%hLwU#jmhdD)aF!{<7_HLo=m3CD-`FSQsg((FKI7 zV11>e#Zj>M#SMVd6DS+U--b$3GNOp#(56VW@ex@5DOD@b$uWKla%)OvES=ip^EU%$ z#nb68{{B(m+7acb{yChfQ|d%kB>YWRoDWj!MrM$)b}w+fs5*ov&jHSj;-2Mlj5xh^+!ex8aq3HNP=R?1M(5HSMe@kjKLXrX3W?SwAVNY8cFY|8@mbj*5!RM)#)YWuTdx7RVVkh_OC?AfQ(wf?@hwS zqy)RE488pj-nZ()(A$q-Z}M6gdAvmk_ud}>qXio=-Zrr?TC$Ps9Y_IMv61e5g95Z> zqlPzu0<>Wx*IUnk(UuIq$oE#j^3Q0;t~TDe$6>S&rma>N?_*?iV56(|XE2)4iH%3R z;namLY!rBx%!Tm?8{NGA92ni$=>oU^-BtH;lp! zWLGcmV-#)>8@;_VC|n5}Mc$_=+(e+_-Zz9d#iA2~ ze^UMT`~1yL2~l;Y*F9N?k}1`JcX1XjS%%GE)!pTY|B@C|XTPp9jp`iHbyiTFqg-c* zA8Ds*gg#Hi#~#4T+{qqV&^?1^BJ|K=*Die3SvV5Vmw7_GMqqM7A>PNXSri*sMPC!h z3c*8a0-1>BEC+BWS%`83*5izyL|||h?obd|(-sd93DA>|wgj#qef1>JxdwVoU}+a2 zCJ?xX!OtVmyeX~_3A~2Iv8x=`YVrCGLL8-{pYnycNFWc{@^u2D1s?1XI9H6MPhc|^ z_HP8fUxHmi1i zh8qx6Q~_s>p9l=Z$efV?;}_#07Xdetu#dpk2G08g1{UBA3Ia=!&^r;RxIl=$1d1@7 zPZPM_9}mh2B-Rz;DuId1kn{=oY6@{1z+b#|AI>LKG`0tJpiuzLwn7~Qp21Nk5b#0p z^9Y<9irFKOy$Z8OAPy6Alz=}QlSiOUdm+9fu%ijSmXtvCQFz)=9^m~)aJ59>U}p$~ zfWK)aAsP_+r5acya5DtbClJ{N!XYr{Dg1{5filZ+M~A=-@cJHsQCQ|*6IdK0#LonB zXW?E#1%P1!x3LKH20^0|1n{&?EGLlQKZZB!2<3JX;vj+hwS_oC;7$QvA0aSw zzYxC?=!Ya791V~ginsI#oJC?uC2-*Y&iDj&LxU{{JPle42;2gR#RTR%ai5F8s;SuW z6L@(C^!FB_tcrLMpTPTA6?X~53`hSlsNyR#aJ!Pgt+KemLEu6S=!?KhpmPy{1#6%$ z0>`RCUj$Bgpf3XVF!|3D__Qt_JP>%00eNBGin~mP{vrt7Y7Ko6@ZuOX2!v!oUj!%;<>+IFE&w zK;Xlj&=&!D7V;u+Z$9Kj;ORM#7l9FdATK|mrj4MHK&lERjlJ-_y_+fp{FF1%db0L0<&AfS_UmlTx8C0xhwD zm_uODR(zc@f%(CZ7lD6a^mhrY9|n0PQvT_K6FjHJ4-vT&SYtR!_)_K;BBoi@+`jHjBXZdC*@YLTxVy z(VoC93}`%o=EI>c0yCOGUjz;fg1!i}Zw7r4cx5^CMc@k@@d1H-k72u*0x%T;n-JK8 zMbU{sbu6sD1e)RyBMF2%puZV}QZk`00%r~AivV3a9Uu@g6pwxgv_1=cAy{!$3^A5K zE>dJVfp?H%>k+sZj;9&~g688c9f7_j_%3Mz&38av1YXAEzfK^bHss|ebgDn}MPOe$ z=!?MZ&3M>^d|O-+g_8h*3y^190zMq0kU&HH8cJa8VCaj$BWs~A0>6Q&bp)n^yFCQ9 zphM3Rs9X(i5D@ry59E~&{);z5JC)M`K3ENX5!eF7HYLzE2K!wCV==@13GBkeE+i1& z8Tukn9;$tpzzgU!{TD&;E*JDgVBIpv3qmM%7vY%~frC(GB?50?^aUA|e}2Ri6;shw z>QRt0Dp2YnHkH3Lt? z2!w<3_5^|wu~#FI2}*|p_={UC!M!~y`bI)u1fIa8eM+F(Y3Pfiz2F9Ba;>@o<1heBTjQffe71g>D3XAro#2=XGZ`dP?}z>fe22>91x9iAeTJP+T$ zO`u!@ytYiB4bC*_P-gK&Ol&;@jW9LP{<;uqh0*sX zFaXmyn!xwSEwc!`P$0x!0tZ1JJ!>rfydv~PfSzc&sspST3Vji9HiNzhya;{d5cqAN z5cvdJLy_YMl!vMgFe5V?{-#$0Hbz;9Tb^$5&}hL(x{V#jQV znTl3my)7g#XDPND1lH#Xv7bN=xIal?L?tW}0*|9Z?+`eQA$~#N3J&%ofy-raGYk2p zII;{P6PVQt%Y;D4qgW;cMnN(2YE%9xnuI+k6%9|qrhtG1XD<_YtsT}$9e@`5u}lcG z>WyVWpvoaE69QXsu$BZaLX6!Aq~KtK2n>4`%Y?woJ+Nyc@ar)lP7v7eBwi;3@E8Aa z9OIy(7mx?PATS>D`6Gcn%`uL;0J-aM6->ZU8RH<(tsllgpjsrxLBMws!yxeO4h)09 zAx!R30>4zjCKjM)F#V%J|KKY5^qX)`HQ;1~QA15QnQ5$7yH4gBL)H5y8-;!ug$+HX z(|cJZor?2+1v4|xy&olA!!w&ZM>j&pASmx;Oj%|NFWn^&!^W445}7U82o~{UP$#pM z`vcvkqq923K#ym2n@*AZ@8G&kXExBL2I^#XaeGlMrsGlIbZ6Pli-bCTD#4$Dtejb( z?-9>Ig>d?XAuYt85mj4f!&~Txpucq6;c>f0QNLKYO3KpH*V9zWcRz{-QRy(gk8w3n zI*dvme2WPRAPs>dNUxj=Sk9_)L<~ zNTr|g)ow?<8sqTXrMlED(R=A^6yd9l$r`zYjF$}$Jw*%WuT3d>Scu@Or+`kjC_Ho-$k=Vz&ExEmHa|3 zJ^GweD1D^@mBwJLacOua`MH-xFRX|E^(6YY?OgU(!#U*P3RkUgG%8P zSrmPNyqx_GSKVNj79JRY()(JZhXchI&Y<{LUHpPwT=aY&=&IKF2xFjXbw1a4Lix`p zgY;eJwH`q4HeM9pHicLTiz{0?J*ni^68UN{iq`S~8=RtK^I2Gfv`MlkL|7`-h>?DZ zBQa6EP&B@V%Dq(RKh*_=(8C=3Or3Z?8c#i7J$UfIKkz#o;%_igC&eLshhPG089ee9q zch|8_*MDtdOxQSkrjc~2b-Z!CW%=sE#*8YdK5F2^iPZ~A#!oI8-+avYl2c6w8aFad kWiB%^ql``)d+juEw|(Q9okkO5*v2>M&()3Pb{T2^4;a5XnE(I) delta 27646 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