From 73d555c31c979ce8ef4203cbeecd6dc008d7159f Mon Sep 17 00:00:00 2001 From: JAJames Date: Fri, 29 Jan 2016 20:41:39 -0500 Subject: [PATCH] HTTP::Server: * Renamed 'parameters' to 'query_string' * Question mark ('?') preceeding query_string is no longer included in the query_string * Fixed a naming collision warning --- Jupiter/HTTP_Server.cpp | 74 ++++++++++++++++++++-------------------- Jupiter/HTTP_Server.h | 12 +++---- Release/Jupiter.lib | Bin 299992 -> 299992 bytes 3 files changed, 43 insertions(+), 43 deletions(-) diff --git a/Jupiter/HTTP_Server.cpp b/Jupiter/HTTP_Server.cpp index 3143f6a..a373cad 100644 --- a/Jupiter/HTTP_Server.cpp +++ b/Jupiter/HTTP_Server.cpp @@ -1,5 +1,5 @@ /** - * Copyright (C) 2015 Jessica James. + * Copyright (C) 2015-2016 Jessica James. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -57,9 +57,9 @@ Jupiter::HTTP::Server::Content::Content(const Jupiter::ReadableString &in_name, Jupiter::HTTP::Server::Content::name_checksum = Jupiter::HTTP::Server::Content::name.calcChecksum(); // switch to calcChecksumi to make case-insensitive } -Jupiter::ReadableString *Jupiter::HTTP::Server::Content::execute(const Jupiter::ReadableString ¶meters) +Jupiter::ReadableString *Jupiter::HTTP::Server::Content::execute(const Jupiter::ReadableString &query_string) { - return Jupiter::HTTP::Server::Content::function(parameters); + return Jupiter::HTTP::Server::Content::function(query_string); } // HTTP::Server::Directory @@ -180,12 +180,12 @@ Jupiter::HTTP::Server::Content *Jupiter::HTTP::Server::Directory::find(const Jup return nullptr; // No such directory } -Jupiter::ReadableString *Jupiter::HTTP::Server::Directory::execute(const Jupiter::ReadableString &in_name, const Jupiter::ReadableString ¶meters) +Jupiter::ReadableString *Jupiter::HTTP::Server::Directory::execute(const Jupiter::ReadableString &in_name, const Jupiter::ReadableString &query_string) { - Jupiter::HTTP::Server::Content *content = Jupiter::HTTP::Server::Directory::find(in_name); - if (content == nullptr) + Jupiter::HTTP::Server::Content *content_ptr = Jupiter::HTTP::Server::Directory::find(in_name); + if (content_ptr == nullptr) return nullptr; - return content->execute(parameters); + return content_ptr->execute(query_string); } // HTTP::Server::Host @@ -240,8 +240,8 @@ struct Jupiter::HTTP::Server::Data Jupiter::HTTP::Server::Host *find_host(const Jupiter::ReadableString &name); Content *find(const Jupiter::ReadableString &name); Content *find(const Jupiter::ReadableString &hostname, const Jupiter::ReadableString &name); - Jupiter::ReadableString *execute(const Jupiter::ReadableString &name, const Jupiter::ReadableString ¶meters); - Jupiter::ReadableString *execute(const Jupiter::ReadableString &hostname, const Jupiter::ReadableString &name, const Jupiter::ReadableString ¶meters); + Jupiter::ReadableString *execute(const Jupiter::ReadableString &name, const Jupiter::ReadableString &query_string); + Jupiter::ReadableString *execute(const Jupiter::ReadableString &hostname, const Jupiter::ReadableString &name, const Jupiter::ReadableString &query_string); int process_request(HTTPSession &session); @@ -386,20 +386,20 @@ Jupiter::HTTP::Server::Content *Jupiter::HTTP::Server::Data::find(const Jupiter: return host->find(name); } -Jupiter::ReadableString *Jupiter::HTTP::Server::Data::execute(const Jupiter::ReadableString &name, const Jupiter::ReadableString ¶meters) +Jupiter::ReadableString *Jupiter::HTTP::Server::Data::execute(const Jupiter::ReadableString &name, const Jupiter::ReadableString &query_string) { Jupiter::HTTP::Server::Content *content = Jupiter::HTTP::Server::Data::find(name); if (content == nullptr) return nullptr; - return content->execute(parameters); + return content->execute(query_string); } -Jupiter::ReadableString *Jupiter::HTTP::Server::Data::execute(const Jupiter::ReadableString &hostname, const Jupiter::ReadableString &name, const Jupiter::ReadableString ¶meters) +Jupiter::ReadableString *Jupiter::HTTP::Server::Data::execute(const Jupiter::ReadableString &hostname, const Jupiter::ReadableString &name, const Jupiter::ReadableString &query_string) { Jupiter::HTTP::Server::Content *content = Jupiter::HTTP::Server::Data::find(hostname, name); if (content == nullptr) return nullptr; - return content->execute(parameters); + return content->execute(query_string); } char *html_time() @@ -415,7 +415,7 @@ int Jupiter::HTTP::Server::Data::process_request(HTTPSession &session) Jupiter::ReadableString::TokenizeResult lines = Jupiter::ReferenceString::tokenize(session.request, STRING_LITERAL_AS_REFERENCE(ENDL)); HTTPCommand command = HTTPCommand::NONE_SPECIFIED; Content *content = nullptr; - Jupiter::ReferenceString content_parameters; + Jupiter::ReferenceString query_string; Jupiter::ReferenceString first_token; size_t index = 0; size_t span; @@ -447,7 +447,7 @@ int Jupiter::HTTP::Server::Data::process_request(HTTPSession &session) if (content != nullptr) { // 200 (success) - Jupiter::ReadableString *content_result = content->execute(content_parameters); + Jupiter::ReadableString *content_result = content->execute(query_string); switch (session.version) { @@ -582,24 +582,24 @@ int Jupiter::HTTP::Server::Data::process_request(HTTPSession &session) { command = HTTPCommand::GET; - content_parameters = line.getWord(1, " "); - span = content_parameters.find('?'); // repurposing 'span' + query_string = line.getWord(1, " "); + span = query_string.find('?'); // repurposing 'span' if (span == Jupiter::INVALID_INDEX) { if (session.host == nullptr) - content = Jupiter::HTTP::Server::Data::find(content_parameters); + content = Jupiter::HTTP::Server::Data::find(query_string); else - content = session.host->find(content_parameters); - content_parameters.erase(); + content = session.host->find(query_string); + query_string.erase(); } else { if (session.host == nullptr) - content = Jupiter::HTTP::Server::Data::find(content_parameters.substring(0U, span)); + content = Jupiter::HTTP::Server::Data::find(query_string.substring(0U, span)); else - content = session.host->find(content_parameters.substring(0U, span)); - content_parameters.shiftRight(span); - // decode content_parameters here + content = session.host->find(query_string.substring(0U, span)); + query_string.shiftRight(span + 1); + // decode query_string here } Jupiter::ReferenceString protocol_str = line.getWord(2, " "); @@ -615,24 +615,24 @@ int Jupiter::HTTP::Server::Data::process_request(HTTPSession &session) { command = HTTPCommand::HEAD; - content_parameters = line.getWord(1, " "); - span = content_parameters.find('?'); // repurposing 'span' + query_string = line.getWord(1, " "); + span = query_string.find('?'); // repurposing 'span' if (span == Jupiter::INVALID_INDEX) { if (session.host == nullptr) - content = Jupiter::HTTP::Server::Data::find(content_parameters); + content = Jupiter::HTTP::Server::Data::find(query_string); else - content = session.host->find(content_parameters); - content_parameters.erase(); + content = session.host->find(query_string); + query_string.erase(); } else { if (session.host == nullptr) - content = Jupiter::HTTP::Server::Data::find(content_parameters.substring(0U, span)); + content = Jupiter::HTTP::Server::Data::find(query_string.substring(0U, span)); else - content = session.host->find(content_parameters.substring(0U, span)); - content_parameters.shiftRight(span); - // decode content_parameters here + content = session.host->find(query_string.substring(0U, span)); + query_string.shiftRight(span + 1); + // decode query_string here } Jupiter::ReferenceString protocol_str = line.getWord(2, " "); @@ -708,14 +708,14 @@ Jupiter::HTTP::Server::Content *Jupiter::HTTP::Server::find(const Jupiter::Reada return Jupiter::HTTP::Server::data_->find(host, name); } -Jupiter::ReadableString *Jupiter::HTTP::Server::execute(const Jupiter::ReadableString &name, const Jupiter::ReadableString ¶meters) +Jupiter::ReadableString *Jupiter::HTTP::Server::execute(const Jupiter::ReadableString &name, const Jupiter::ReadableString &query_string) { - return Jupiter::HTTP::Server::data_->execute(name, parameters); + return Jupiter::HTTP::Server::data_->execute(name, query_string); } -Jupiter::ReadableString *Jupiter::HTTP::Server::execute(const Jupiter::ReadableString &host, const Jupiter::ReadableString &name, const Jupiter::ReadableString ¶meters) +Jupiter::ReadableString *Jupiter::HTTP::Server::execute(const Jupiter::ReadableString &host, const Jupiter::ReadableString &name, const Jupiter::ReadableString &query_string) { - return Jupiter::HTTP::Server::data_->execute(host, name, parameters); + return Jupiter::HTTP::Server::data_->execute(host, name, query_string); } bool Jupiter::HTTP::Server::bind(const Jupiter::ReadableString &hostname, uint16_t port) diff --git a/Jupiter/HTTP_Server.h b/Jupiter/HTTP_Server.h index 6e228a6..a3af2bd 100644 --- a/Jupiter/HTTP_Server.h +++ b/Jupiter/HTTP_Server.h @@ -1,5 +1,5 @@ /** - * Copyright (C) 2015 Jessica James. + * Copyright (C) 2015-2016 Jessica James. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -45,7 +45,7 @@ namespace Jupiter virtual int think(); public: // Server - typedef Jupiter::ReadableString *HTTPFunction(const Jupiter::ReadableString ¶meters); + typedef Jupiter::ReadableString *HTTPFunction(const Jupiter::ReadableString &query_string); static const Jupiter::ReadableString &global_namespace; static const Jupiter::ReadableString &server_string; @@ -58,7 +58,7 @@ namespace Jupiter const Jupiter::ReadableString *type = nullptr; // Pointer to a constant (or otherwise managed) string const Jupiter::ReadableString *charset = nullptr; // Pointer to a constant (or otherwise managed) string - virtual Jupiter::ReadableString *execute(const Jupiter::ReadableString ¶meters); + virtual Jupiter::ReadableString *execute(const Jupiter::ReadableString &query_string); Content(const Jupiter::ReadableString &in_name, Jupiter::HTTP::Server::HTTPFunction in_function); }; @@ -75,7 +75,7 @@ namespace Jupiter virtual bool remove(const Jupiter::ReadableString &name); virtual bool has(const Jupiter::ReadableString &name); virtual Jupiter::HTTP::Server::Content *find(const Jupiter::ReadableString &name); - virtual Jupiter::ReadableString *execute(const Jupiter::ReadableString &name, const Jupiter::ReadableString ¶meters); + virtual Jupiter::ReadableString *execute(const Jupiter::ReadableString &name, const Jupiter::ReadableString &query_string); Directory(const Jupiter::ReadableString &in_name); virtual ~Directory(); @@ -100,8 +100,8 @@ namespace Jupiter bool has(const Jupiter::ReadableString &host, const Jupiter::ReadableString &name); Content *find(const Jupiter::ReadableString &name); Content *find(const Jupiter::ReadableString &host, const Jupiter::ReadableString &name); - Jupiter::ReadableString *execute(const Jupiter::ReadableString &name, const Jupiter::ReadableString ¶meters); - Jupiter::ReadableString *execute(const Jupiter::ReadableString &host, const Jupiter::ReadableString &name, const Jupiter::ReadableString ¶meters); + Jupiter::ReadableString *execute(const Jupiter::ReadableString &name, const Jupiter::ReadableString &query_string); + Jupiter::ReadableString *execute(const Jupiter::ReadableString &host, const Jupiter::ReadableString &name, const Jupiter::ReadableString &query_string); bool bind(const Jupiter::ReadableString &hostname, uint16_t port = 80); bool tls_bind(const Jupiter::ReadableString &hostname, uint16_t port = 443); diff --git a/Release/Jupiter.lib b/Release/Jupiter.lib index 562833c56ea92d7e562575766422118383d424f6..dbabfba335508df8e84b4d52de1736fda2543c07 100644 GIT binary patch delta 22623 zcma)Ed0dv&^6y#PLIt;w6v16V1yod21YB|#NYl&=%yP+8?538cXp3ozKyPyDnhD(& zO-*g{nz`LpuNlzpRRim4s{z%`td!r(JkLANoY&VrKmOp4=b1BSmha4&Gv_?-=g&9& z{Q0H@t?KnoNaz=z)JIj%G9p$Ecy)mB;w=BOhvC_t>RD#gZ2uEgoNI@x?jM?=R$24y zds03$e>eCYP+y}aer$%-fp-)4s*+F4DD}w4<{6!0-6v)kjo$o;+0GkXxzK8Yl3dGc$^*D*x$H zWdfB+RKDU@V*D(lnK1i0moOa&EswBlaRcPoP(__Kn=^I67p61$D4@0l^&7UTtz+qu zMn7T2pw24vKjsW(p~+ttS@icyr4LWdaU~lAbJcSQU8y`hSDbQ*h67Q3m&g&u)3Neh zSCFMA&0ATJuvxYvUXxSi9sD#t#0ponhpc8K`OZ`31b$V}&x&b?e(D2rHN48c%2(dE zgRfw5UETC(BO1K_3!yd|g9eX;!Hr?C+TG6VuMS*qwdV;?V;WggVKN?7#t&vomGd{d zDZR?8G@sK35K}Z!6PIbSdg`1Rs$m9ICAzUd*VLs;Q>i}&__t^{z;WG|rZZK^m*zU2 zs-Tf;t!ZDG8T^#2Rr;0LEClV+8@RUsSR7hqbXE5(vOPC36lVWd*aR&_Vj-HsL9C(< z<{;geIcHpBZaQOT^R(!7vPQyL^EQ5()5Cpw4W9QL8*zPLZmwIGiQH2?%hbY6k;(GyW0FfimvL6I~ zkd{1$xade6QxH8KBvCk`K;b$O#Sp{|yOtoc{717XQ7r(f&P3Hkm3?WB(nUiD5m_3L zbs@4&zU+6x)WB~8fT%79R#&2Lud2J4bydr1PXeTMbemHxj7_Qai)vS}>tV)N;4ts^ z;cCmT-rypiD^dawbOY>0uQNKSn=LCK@qwGe)zV(JdI;wJc z;Gm2PFz8?%7kb-%GDoq~Q(Hlr$y#qWqg37*_{FK+Kbfu6&Ogmi-D-@QlAi@?4h?g$ z6!(jHBeNx?U##QiihaMBck?TPKAPHvd1sW9Q8Et)=3mT~tKbu~{WQ(5rpRg$A zKN^hrFVP*WHn%sf)=a9xfR3W`k6+C(JU+`FcR>R+SO>Qr*{YgholpbjB-d?Vhprn zZ7EWYwQ_@KuVD@5R}8c`)6#(E_-UtUc^E^Okd9p~%L7lwD);G5%kmbIL%Ut6;y|hl zfYj+1+Nz9Nkrv5OxbBgGaNWyPnRTp=zU*FgFE82Htt7zcI+nKtv1^D?cVILg8Aa>J zN01Q#T5^Izpc#qN6U|Us*Yeg%1T!r!$uM>zE-z(Skm6P}v0^VbWKBI`NHhcSTTov- zW!33bO?}I&21prm%r!%0Hnt*)W*T+W;!vv- z58ZXdWmq067-F!{(0CX+i-xM~8Ad%dZUg*V5oYm{?k&DVkLaGw^i5T5wsU5I^E1_rq(yNMlu1LETn}n8Oxp5LI}r8H>p(b8Ua%-l5?*SVS$p8 zHkeKpqBaLQ80~d!2p(t*N|;@Na1o$9Lm6!@qjOAoFYb z&C~&AS^_hbDI-D^v=SiT}%yr?i!#@Un>>?j9fC*+*TrU6B|tGBt%CL zA{T^M@Hm8~mMGW*lUoaQHG{51gVy#n0}P5OGZZ%^m@@ANnv|3Tl`t5zjEu0t)UFF+ zOU+O!jTEYqQ8Am5_~~uDh*hlA(KbRU8o+=~ixLv+X4@Af%yzjcR)Z;Wp8!*UKLW~7 zeTuEoVhW5IQW#_A5m({zIcA5VzZ<|$reD@~TU$?GD&((eXE}Sn*ml;V938xN*0d8C z;@$=M5PKKvVW~`A)L*4$86m2=p8%7#jmRgmA?k}xf&v>B#0VP}1z>?`8;t?XDZmWa zv>;+^S`<3OLy=zq9ZpM;hr5?Y5h&9J;MPithMR7p!9BFkrRnQi5!FB!ke1lmRc;-U z(Am0~?Gt_0#rWaQmbb5iEmyco>f#Pa?_zD?0VqGADz>Y2r~fH9zZ^iQpL)7ZV6#k~+j zMA3K`5J$UN1x(IKCBM4>1d7V*z-FAK%jNR$CVf*6OWUM7y2r%{EjcUii4$2F>ryga zQoJm4+Pii5v3S9k1Z zIguoyhjB|f&+hN(?1v>m?QWQ4kDA{f0KFpF%JTb$%u57`K=4l_=%N~Bip?Z~l~^Ya z6o}(lDZAhX>~(Og@r)6tiu-#q`$ZrI>B#|+L1S^=H=MDZt}ycxgT%}^kGt};O|kA{ zHQ;GW6@S8w!SWPqIlqcF+y!n5%yfwCoTe5O8NF28d83)H^1He!E>$D~_Eub)=Pgu3 z6{orUUrn>tGk-D#?lQ@Y{a}(eRpAh@^VVSjwKKOOY6lC@@^*Rc5Iveczd=i!b!;x@u$(VPwV+$-8XCU!e8_RX!3DWc4jWP;amJ=EQJxq~|BE z$CWuM&<2>?X}aU1{$jchRmG^k43dwK;7UQVV@$AF$%z;wpQzAu7<&-@`SGKL$icAz zA;O{gnKLqYXf{X>HY@2`n0~pg^rBTpz*O|KA|t?-Bmh=QCso@F5dF|rqpmtO=!&j9 zm+8$%t0jQ}+ooRt7Ef6om<5AKzROcX5+t+{hXHJNBN_f@~tS*1^e5UiePdFM^V z{)M&gB(bnkHB|bnTihI(B&s2*QF${m`Nm+iF6mc(qgOohCV2Q{vF>o4ePpsns(3w1 zxk;>NR7dZ)$#R+x?ZD>euBvmDnwM!_6GSWSKqOA__VXwN0Rx-CRcgS^R)l&l6Z)|~ z-zW^~4ZYbLs&uVizFBAuubibOcB-h?X#h8epPd@W3pWz9vg2m(7f{7_FgH?VPXYhb z-e`G8a@y7lPn<)Z#c*aYqEr8t9!adRBcu;UL+27IWC}O!^T6q8t~$^ zb$Iyq*byUn_bqm|F~mfbE}3wVOd1HxyB0bEP%pCK^K zQSNZoKQ>dO0`0)09&F?Cb{TzC<-LK+BzHZ|%nB6k$2qPpxwD06+NS4f1IotC zNF(*H%zF3^VOE}R_MBkzk-u&Le>DP;o4jOB3EFO-xMlYw{Yz|QIhXU~f zsCSfYw8+X~!1FQ4?nMHrEJeyetn?y=_a3{>9sU*;n8!add! zeub%laD*G1_5gyzdyE8xzE>$>MN1@j9@POzYW5hhYQ_>l5(XqR?cOC~<3iJRSn5uj zwA5O`(;iyt4mc;DR@b;sOYRdQ>e8n#6R)tFLGxZ*Ce`)tTsJQlJ6Ez#n_L(3lR=km zpiAS|jd5z-uYsQ8#phJ6FfsdN$_n8VZHY*gdJ6g#(>`J+2rRCj=AbA+$ zQTGeT(yEU=5Hfozh}zSzeP!np)i3`MXR5fV;7-z{2LfwpKDvs0P^<-*7m4j4V4DaQ zNPPqLGL;VsZz4>IWIT}cfth!;i}EG6?}}6bogY#H!-(i70)1bHUR`>~8qMzJ^Pgp_ z^x_EafJilyXmFw~4uXrq3p?ulA-sG>M1(IdB1E?a6ct2;Ma2L=RdPf_b>=mZ(a^C( zhMoO^4q22cT`k?aPHC zIut4uY;ZWDy*g`(iybHvQDAR7jVPj2!R=-poskx*gJHt_0}!g8uNBT^49Bh$80G+e zdz}biE;NSai9&;qV)y2WUM+J-TrW6i0*wHHZaD}7eY0K&!~+N9i-BBj?aLQabKfSe zKx{Jk=|1_COJ^!IQ^0Ox)!_mw&X;#XJ@vxuKyQ}Kwp*&~=iDvxy+A&W$kmTC&9op} zW}dXuuew|3VvD11WRo5fudt>f(R+a`<5kLIRy#F+h*4ji@d-S0 znKOKYSUj**KyVoVV{ZVsly!?&WnBVwW*w##c{(UwkIoedmb^z;szfDAx%s4WQ+$oG z?%|k+S59u;^tkA>F#N_oA>hZpA`5-}gxKb2H|(aWsEt;)qFc=fRsEv4(WP5BVxusl z*6_{(1ctt4#QX&ZG8=XuvK`tUDt)7{x1P02pA43@Nr}aqgcAC)UGFKerf9wM+aTMh zgu1ZHEqh9Y2v)6>w6NQCyGzqSWo#C$Wv+|1ZWeVBZf6NZxP_jnc5b%9ec5}utNdc2 z6IMt>g!jW{5m8ZzIJG0|;wd~SwyZ>y_*_pLPm6k*SI>u^7Mk)}L380+ai`k-4>*G_ zookXr4fW$9pmzYY?H{6AV&3V`2;Pk3W6ww=`+HK8pA}CTY$OLJh6O6?Sx5|_G6Swq#q7eoh-=DbPTeb%+2$;!~?Scue1;qM~?E))$23)yAgf2TZom{n_!Cj4SPd|k&ZKXH8Cf* z?@^KJb6*l|Gf>?zNW#maKx3%veOW*Sx2S|yywkT@RlH)gR)>;|)>=Ev>5lNx=Hta|L=&33Wi}b{ z64QPV&Use|!2WCWo-h+e1qpz6)VEdVTa$E8dkw#gnQ%8hUWJBED z(txag3qP}M8XOg(ald-oQL!cC)1)Eq3)pgR`tVqV<9lFRV4^$o<#vbnm`BH**G&?#I(0&v3l&UH-WCrFz{FMXMz6WCA{!6p$uoWgwKU+ykeDp zE>K5 zjiGh^gn$+YZ{bPtltU`^ln5z~kR7K)glKnSN@4!uQ^ru0^KD@AK=lbR*ibJ+#O!Pd zmIgx4Bf2qGRtRJ8{f*d45puj&-d`!u%$80*EiBDmIeuDrg%6Quekp1y&a5Oc9yNZ3 z66ZZ)_E4L@1l4v0y~nleDhDiG#bLV#<)&*9nM5F zc;)F!q{+Vqwr!ewG0PAQHcr1nn#?>iM*S)wz%U*8od6^m0Yi|Gjup}wFhb<>!&LnD z!U(tu6U8u~I15-T_|oXFmc1^5SzrGnevlBuOAokLprFH2_Zt=U0~}tbegzk7{`fKA z`Y9uF?m2--k`y;4;@^v1XHuIepzPKBoOFcBHsXAunJH z{TJ|paTZ$WgMN{Y@)sh7zlgO-E0=x+2Op{lsFzStVvQUB^T0Yf6waOXl1e)mOZrtT z3>*y=zlvyJKQ22j{75*-h;sD{{Y~s@*pKAmgTDzE^H!Q(&AcGWY2B&kF9@e{K~nO& zC`h8=q7CVa7j3RGZC~d03{~~Jz==Lv)gOVgF${D63??JN5V!l52{1gp!R)1es2A80 z(@Tjx7lpfcoh4;QUlP;nuTIEUToufz6$_~!WE(3XtU=cK@uAR+24Vs_Z zkF|A$g2Iqi2l#h|DfMmdTBMHE^7=vz#_G}rws)Y$=NXY#+urvq+BskZg3Nd_ z=s6$<=GYLMuYoE(1iuflz58h-Aj5lOL*X52Eozq-B5~%YMj4T6b|c%%vV2Crzme^I zOQNsOX^m~~n;9;Wk2bc&r#$$v9bY@i47I(lM_8>Rp+YUK1=(JehT3VW_=MPIvIZ1a zb(+}T*F>DFa+?Tuu_jHL3QdTO_H|olIA=LrV??X{O@$q}45sOtG_(1psq;Yw7b`oO z31eu-W-)-|jEr7*ir`fw)Xdw}+;-ONdjQF?MAluuG09bBUJC&oiWa=*L(zgssyjwY zdJkXN__}{}T0!)9TG4~(=LI>bUfPdl$C3+CCCtdtZt0ZgTpy!l_z8m52}y`v=@r3=0!q7$THN zChTVSacRiQ7{A5rqzW3FjZ{^n$OEV&5#sg4Q7&Puo-6#zw7S??tkX0P zBA$k)!tgOTym*V*8xPq$<6_xKH287MSfq)Z1nFo@S3yI_<0jkYuAaSlhtfI5_C8qS z4cyik+xrF-T}|}>x;j(sjIrbNk8>g19giN4wY{q+{Pgy2`cvoEGAI}tbhr823B|c& zYj=?_^yO)E53xL9x+B5xZp z^?ss29>wC-ecV`#>SN#UDd5jhWRz@}X$BZ2{}TKLOYJ2i1^fR3<+uaEtr0U4MnJp;o5fr7{QET~)CGzd7++vhbLmD@G6Ua)rW5iOhlLLw6&C z7`0@w(O3=a87Pl7*Fsg83ZyVsLp2w!7eVm7#hR%@g8^yxPyr-fhSG5lnsHR%392;{q+83CI@ zHv5iI!t5Z3BVNL20YE*d_Kp@);wnQZ!qek*s&2+=mQ+)M`nmp7K4>S3NMN7$3zthpMzG<2t*f6r?rd@ zV6@J?4O&K*Q}ZI1JWFI%-K{5P3AeJB=FApeg7%0b^2OQq<6HzV1Q?@ls?)RVcvX9c z-HEB3ds1`UN_Fxa!JurR>(b?*^V=$Gjy=y8eYBn`zEjjqI5$mj9}vBRM0cwAx6FF# z&bg8bSdqsL&b9yUpS#HaFmImyr2nCcpYM`Roo_$IPw5xruFY}9jLWf$^;bW_EAr1O z5aTHLC#|`;RF{-kytTk(aeP4_i^uPBU+uWden#hxKV3)M*8ukq9PaSjh86H#M+eKrK=x8*4PDl8} z&*@I7l4WoedH6EnD^_yjGNB}oC98xk4-|^!T`6B3TJQSt=jHZ57L|T`b8N1w#q?ae zk9_4g{#dTvPd*J-JJ-4cl2!<{%N}%Rcz%VLA#An#G<>CCqg(HRm4c1F{@1J&cwk<$ z@4q6iPwp4IP$UYDXt412;E7$=nk`iJ1Huz*mzN(9QiEL_<=a0fW+H2`^7#)2%;bd0 zgMy8o;paXSEW>~MkjU`b{`V(U^$;vo%RT_Xo39cwvmMT?64H@P@kj4Sj?9OJ;TT9q z9u`1iHp#068>Zd5TF?S>#~_hw#AZ%+qi>Bc2s1Yx3C4WxBf*%Te&mYGC#@CCbw|7{ zUy(@o+c#I^&(mNRyVg{@*4fvpBdhI3Dr<$^oWZPHZ0kBI6!L<3cxZ?{k%7uaoelW+#uKdPAAqP9V!K1?2Fu;*+VbG_i<n_8NpEv6{~y~)XICUjdg zGqufY=5|}XW7G{yqmaJm3(4GsYgCG&*&8EJ~6{+^p;P|cHZd9g;q;d`Kj5g z0gleN3jWl}lV)=j*2e7W%YH3HZK*aJ6`e4fGrO{{tQevm2gC+b_f(ainNdtt`A?TB z6R1q0@)f@l<7XMogxSMf!gL_CJi@ZY4Ul6a6?NLYnyCxEFrCRq0ktit->_9}9ZQ!q zdZQJCI;+tCm@}A#CVyRI(a$fHK0GzYm23>mRnH-GrSkM#ampnc4n*}`B1afc$I5qI zL6)90Z)HKkX4#H-O;4G3@YDDZD_qqcvYM0RJ5QMt_*Fq)E2a_p={lIJ(N*?UzVbdD zdZV5<(ct}G2({4|GModJx_od)5w|%lkuoBelT0AoWI%4 z=v7{&`K&g8n4*cAx=fSRljqD(4Kt`J(TxSVW-eWtO8qgwzeU3Vj_bZOovBK`G}rM| z1&v*6P5a8s;HPA*(yz?sA!wK0z`X^);?OFitGZ{A?YW7eF#Es4CTJ-V3(*t~Vik2T z2kOSmIpZ30^BFUnr$w)mH4@I6xAD`Q9`4g4XU$vqDTx^OgzL~LUz-#8Rq@jsK~}(k zZi~)I>tqg6)!&J5hAb1VDn7LwJC6p!c30WH)FT6mD$FoFL>bl<-wRj+h#Y~I{UGpz zwB$L&MMvV8g6Q!eiNX;D3fGA!1|x3RwFH^vKbp;mY5`DnCaNx~>`QZ$E*d(B$kKqU z3z2p5Wxo@q27DU;M0Gi^x)ObRRo%s`t6Elj5+JRk+nj1)Y)Y+PRJ(#*4>QIBhk3sb zS6hGe1{e8UkrIHQ8(=qjozY3%Y*_(`58NECmiDq82Mh+{?hbL3uk4+xeW`z|qbipN z4$8OygAUelp||}fa}+y0wH2h9to3$tO68q_U!288t;VP+`B|Xm&`=jk zale>1GFwvm#X4@T*!PQhH@_l_VjPeMl3>POph01t(bl)6ps_mfv*{&Fw&=P435#O> zqrsT}65YXSOM9cCW>OUfbQGO`{A!Nj`NMA(Us@?1#<|qWQ))LU057L zfz-PAy9lhxIM)xG{xC-{2b_{T8w1Lus**n-g>U)B?7{>&x46s-|1?wiDftNV42|sv zV+X0oOJ)ZZchT&oQ}Gg&e^I!I^KAGfk!N)r?!FWZhoo6tt*`=SHj-lq$T56FnicOW z-BQO_yuPkF(Ia4~$4rVGHuSdy7{N4zmu|pdB;X~rtI<|Z?+^wKNhcr~<&d<*7-+}Z zQluPfo?$e!?f-6I3xx|gXk>sTFq*}dvsUb3-UNr2IHEN=;7*AS!bz-T-&iq?^j zAR_{_kTMv@G#|$CO*CHul*GBsEHA(8%5^!{G_Zo?MB+TZq2)!ShLfp)lNGlZ z0XPA<9BHS9SYFMBfk@I|AZDR7#nX&y(Yj$;g+!urcFJlbki#w_v5q$iCNVh&v-qv5 zqLCFWi?eNrOKD?^lLan8^l)?&YaF|Tlijf<0VNX7Q5lExtsL=$_5=%~WlZfZ#{V6J;Nu zyhCL*vm(`s5G#QNLMM=h6-@)}$|j%OOuRyl#w#(G69<`q=hgU%bnLk2**n|sZ{S80aGrLbFUF$fs&Fo zm`)a=HU~Nw?R9Mk9%u|om|cNz5uiLn8Er13b4+217-Rjky}HbN;Hz<^GR5)$iX+ZQFwcDX55gDG-1f+@fs0cEH@ z#kOcM1;z|1j4|_wt8n=ovqRC}4d5r!FYCL#t*0*)^4GMpoV{OcJL^%74qiKJ+6fGC z?}B`Yy^Hm*RHiQKr&60@ zY~9TEi9YLM{BUQ>+tZQTVRaX%t1bs2 zC(;JJy=YS`*_z%$GJhSdLK8&}Wp9%Vn-WF+hyw_{*ur=b(VH^Oh}RL$>h8WysLMf} z*hdJ!M%dR!7=cwt?kiMa4*UBG4p>rC9vT4>y+V1Yx57N6vbI2>kv-UKqE;t~$mi%e zktCvraZ5VS?&s<3hb2MnZkS|`n%@rqy&~Dl^81F&O9Y8P@J}S@q8ew4%_M@ASSJq< zh~rr)yWj@wb#Sclv=OI@`*||^MIZ+0$pMi;V{zU$oUxs*F!RQNV&CMpGQ@NtFntG^ z_E2#np!0VqIWU2<5M=49A;MtvO6zC52j(t+&WJ$?Mc2SzmKei?bew_nh6TyM-G}QL z*vYlzSIo8VI}>&Bg}z-^jqD+e%=jUBmyP%f)PA7KM?!+EzGX1#?G@jg7>i zz4>UhBrssx^a}vP?iY+fYIB9xLGx=*RG6bG9IDu&7;CEEMBW;3e0+d-By`pUp+2wB zUr+GDi8ye&`3mN!+5!0AbA!->d*vY$MT{n(#x z6bAK%-s}xky4Ek>EVPDK&QcRQRn+S=fSbe5Obz6P8wpz3aWnV}sNy@A8>zCVfPZRl zw7erZ?j&x$#qv6d`i7%vmJo+G9OQ&GS;Df_J>4RzHY*q}5(m2+7tpd{1k*{*_at= zr2dsz58olo%Ja>h6Kp>6*A3vW#vpRjmyA&=B1gi+f0#u8+;(T6`QztW&S}ylU=a!| zvU?a~)W*4j1^eRM+&}@?7Z1-93bVxB=LZg83%xsE3_uH!d~T{}1`C8uc);!j zR~#_*E-`?0_}^WDBC!tne-k3H4vBXM4qzQh?-m0v^;68^;dpEGa_Y@ye-(cy5I=x= zN7=@UtQ-bBAA{^(B#_Edq%0Ov=-KS}Vv)@#r0^h)%sJ^EYaY))LL2xUp#uAUM3oNI>X&l@eC8M1tp09e|`}j}fb8EDQ`q%>@v!{ZnJq_Dec0N)4@*i=gikk}VBu#oCu$JbdtH=k%T7Y?x*bW4?iC}@$ zH()PQ`JnJ7!jwqH1IcwT^R9MLzU1~@kt(3`LrP#65&cA<@8i&`OAlG2+1-5pvuu@K z9KjtBsb&%lPSnLga8Y<+N4+0}m(PfZ@a08>=+=Ouf~c^l=Kgi&CYlg}b!2XR<@m9`9KM=#Fxc+9=mRu%vOo=y;h-M1eA;I27$v>g}d|xllxh zLZyNY4o9?CXH9Xj17#u#>}{tJMU*PI-K?WC(n56*OqhQFLiO{t!nus$*mVNK9Kdg{ z69LSH#?U-bXz)?&-aOH(We$n!1qV%_5g^bl2SK23)(e4nVE=qEkjt%o`C@AB+r$-! zO(s9xC!ccZOr>TD*lnyjTwuld@@}Z7o}V4)&9d2cOO^esyJfx?$j1@6`f;Y27G%rJ zla@T{iNfV|cb_OlcneLbYNtI^VFOX%tN_os`r{)hf>Z>z8foCpr zhHnsy2et|bF8yKb4FH$2Zt<$DOQ6oI!?Yq#2gU2rxgx=m_XtassAMTOpHyy&uTj=L z9P{wX$<3P|7o8S{-`I@;e(Wo<(AOKqHb=W*H&sP#vbq)BYDTE)7sZV(-NF%@gc-Gl zcNQQp^erRiFF26du=|kh(DqR2n}ogftX=vz&^Q*+wPQ zg7Ym)R zLLwr(A2y4Kib}+(9a$Go;YqP&C8EUVdfIqO)YH6rKKzu>l-CNH3)hM})$V`58GPwn zlO$@S9~S|=1EB5y5Y-a%PJdePW+WebS|ZuslbZaDc*FNwApsO}gf;bl>vF;w=xETDp0RKhFX>07NTUa?xMLrF$!tsUlcNBC&;_$#6h z!a+=2@Up=p4wv|TMyNU)rz_V|Vckxo(}8rYDtygq;oGvOvzoftY@^2A7wC5`-PgV* z>T}NaNqa=LXP}Xd=|mIUSo49=-*;$hLlyl`Aq(avBE#I2?~tXaU2h5!1U4DB@m{$J z0E5xfoqMm?PfL4UR`Hf*^I;(vLYJI{cc6+5`_Vsos*1xRJ+Z3}|4Z2Fay&c*j*f0@4AmX2 zrwZ#Wkt&#R-dln(WO@e!ac_%_AQnfIMzJ`07FW}P=5X*dt|k!EY|-?0ghjcZQ2vg@ zv>$|X-W39{{~Et1%!E-v0^l9>?U=_iA4^u>z9$Xk|6qaKmV88{QI_h|5g`@X5O=pU zAnV`4&up6pM}=tIuik!CY{~dEY4H03w%nUO{l17LZts!H@v`*G;I`^dp~1E9SfDN} zTIdHtG|mruKM=NL#-z*mQd!UV*O01GFT*NY(ec(W4VYgho$bF|XO)Wq96=A1iwM%^ zZSbL(7dNovGCXa412Hr00ds)*?n99X_^d1WBjGN#=&6r{MfDYE>BnMm;sI?xx#EC> zpNIjZy|#`17x>{ob0ZNk?X6j?9{cM}pldS}{FVG!pucztFZ@g>!&xoib0HhASf!tf z6^jefsmFyOb(~%}F2H~|rF?`}Q;w+GL*$uXikgZuD@lw;jh~^! zd5@Sq)Rr$nwOv8)aV`5wNWr+h_?5s0amM3g3e8Rb6*-%&-tmmEI@v_)D4m2=cjd;> zc=6ve9q)U`o)y}$3@6U&GC0e?y!*ti-OhkiM zp1wqy{A*y_rnwih4AEfY^ed#v%rj%uuMz?b(~;i^K#~zK1PSR_A)NsuL_RlE#eXl1 zfU7W33mr!-^*`bV2{F9%fO`cBIxKa+QBgm@;dSa)aKYw}9|NwR zG9u@m6Nn^9abrUMtvx69!~BYDfP0qj(FQB?&C$r+JI^9QULew|gp6#S3su5AT&nr1 zMS9SStB4xU*Ki5TJ#Z_j5iKjOStEZEH7l1kM}HD)Hp!UN$Nl1C+RtJ~irWaR}AS9*3? zW7}T4flWd_O$9N-z^6HBi7Ka#Xlyfc^3IJw))c(sOBggpt-cg2g67n~1^K<*L zwyv-c%Qyf-xx-l5i_c8MVpXMS>&5vgW3w!JLNXY~6U+upY% z`ud#K#P+_K;Uf8H6I*=BgCE=RwUf+H+xvQi)jAR?)Y4jz?Nw>0ou-OUh;1foKyg*4 zsqKAD#JMWBsc;u-(zKb-gxF|bw{?bdmcunhwA$ZH*n!JnnyzVcn{S#rA7pT`vZJ{$ zhIVWg14z!u=!K^UUPVI9yj@q@&YFD>AUT%Ey6ZP4xvI=-A)rIig7rlRWd<+1^K9aA@DMsJ$!r zOyD^fdFDTBc2VnpgG1y^L&RduUOv`dco|u!Q61beBddeG%FE^cgdNdQSc@UFqoaTj z??Z=o5}AgBh?K@48i@kNZ#6rqf+l8TRTU}n0P0ADcs+5HOBk!?3jZ>#E_N2{G|hvE zr{SqEd<+gR-fH&7LpIO2SauQ(ejGCvX(A^N>^S}7TnKl^qlaT{@9GIZy}g_M)cLgx3Wf&VZT@ybaW2`` zT_g;Bc^chAEKiv3NHDw`Gf5T3+3i%-&qjFgPq|s;wQ)jauHGBR+ank+ynS2~FK9XP zLlUkS`D+t`MLuOx-1<(1I2$(_I)XWmiE!jV$?quwg-^&Md)cWh8Ucj+QH8w(p0T1Q zdtgOBP3`V&!#VzC*rc_LFD-8GZF^sD!YhXXerY)!8MINA1ME@K>Hbh?G4l`Q4 zpD2(=vDolBHx{F=v+ws5@aHHpN;b?i1B{Y?34Vj6_L7l;{eOXS+=1ZMh@d_Jh-c!2 z3tluw=!Yh}^mXkkmOk#09_}k*43GK9PIx8a4i(qeZmX6jiM0UZfC#XQJBJ8-^ENeA zjr)lh=Za)nKanT&3ZS;1r~o+KZ0ax44WBtC4iKKeGKB1d2lP2$pKbbg5*&d_ zrs)ZE3(zz*DX_t=ze3nhE7R{%nFH;vs@Qfoq%s;p1_?B9#aA*&RD7riIRFnZ?gIzJS!N%-O~k2V&tQ={IJ{^y zeht3d86B=F$G`>k>X+bR&D0^mfV6vv01_`l=|ja+&d}$E24rZ;r}qvMPq}qhXSjz# zI5Bi`b;)qs`#MlJ@XQgyz`RV=j1Wd+-VcxTcsn&Ne#=0*W4>Drx_=M?`EF-Mz^0JR zzGIXyI|$;4moQoYP!FoTqs5fC$`Fe1^mv`B9b*quv-{fKwmC-8-%pHoX(jjf|L{a_Y;LlvD~FRhd*RdjCrodKC>@&s{;DRtS5(G32a`9ySCFi zTSUe?%?&q-ohA$0c(M>yH*Nl8VOp$@$f^-HiRj}2gigHl^Q?-x$&T^Wj)NcHxJft| zD4p?fQ-podk~9=I0bA9|sWyD!5(0(h_UwR2;?k7Ju{7OAe~a?i;|xf6euHmdHY^IhlWcw%8uBfb^2$lbuV8cQAU_m@$%ItE75i1BjJ#6u#UG>}nI5=sAS8)P7vQpo<_l7Rp}9z}{kMto zk1L7H+eLH}(s{ z*15Mq%jj}yUgVNziL9!-^~5aUR`$}I*}_ZE9&tpzINN@livWfIWAsgRdX^opYVWW+ zF_m*qYK~i}PM#welr3~!x*T+VTV>6$=lPFlIinPL7*{#gZL z90mWRU2QJaB_$SbEpS;JUl7RR@w?ntJMOZd*16+P*Ae$M!2JVs@ceHZ57$P&$r5P;wM*`(FO# z2DQZYFLiGie6-Xa$i}Bvare2ehTdoQldqhB>;&vjn)OxYbfcB}^gaPP8jYXR5kB#A zx>KrT8C*pkzD)RvmE5#UD9K~VDxu2*g<^SE%2$WhyMFw6xjleIrQhBho9k*ZJ=eZY zzH%IYEZ6QUpN6ZQYuy1!D}>r*54tlvw?fPiw%UCfzEZH!t@pr6!A4*IYgP(8Ft6G7 zUy;`*_X}Pq5(P&zSonMJ#I9@27ApGz;R&|O%MS>t!7h&S?H?2~k+oR){09SOa>C?6 z!A8&Ua~}$p;lF)IWO!}=`;)4A2$rg4AAsOjuM#q|9nP#0(veN^NAF0E%!h^H7)VDR z7C>S)$*Tn$rrow$&;oPEAdzdtW=?mbZ;dbrGdCUy#(eH0!I+}%DL)plc*wZis3?$j-|ZJn?f!=i1T@TWd+VV)3)=Oydc z<^?K(j-i}`UwGP9efTMfGWglLqV=-5;g8XC>&2wHk*DVClR92GnlI+lBPgvvsD%MR zDF*|hfhy0pTd0o