From 7ef60a0d2f83891b6fa1df5bd07493aa2aa68af0 Mon Sep 17 00:00:00 2001 From: JustinAJ Date: Thu, 20 Aug 2015 03:54:28 -0400 Subject: [PATCH] String_Type: * setBufferSize() and setBufferSizeNoCopy() moved from protected to public. * Added capacity() --- Jupiter/CString.h | 83 +++++++++++++++++++++----------------- Jupiter/CString_Imp.h | 5 +++ Jupiter/Shift_String.h | 37 +++++++++-------- Jupiter/String.h | 46 ++++++++++++--------- Jupiter/String_Imp.h | 5 +++ Jupiter/String_Type.h | 46 ++++++++++++--------- Jupiter/String_Type_Imp.h | 5 +++ Release/Jupiter.lib | Bin 283594 -> 283128 bytes 8 files changed, 132 insertions(+), 95 deletions(-) diff --git a/Jupiter/CString.h b/Jupiter/CString.h index 78f5d5a..1ccd787 100644 --- a/Jupiter/CString.h +++ b/Jupiter/CString.h @@ -228,6 +228,24 @@ namespace Jupiter size_t concat(const T *in) override; size_t concat(const T &in) override; + /** + * @brief Sets the internal buffer to be at least large enough to old a specified number of elements. + * Note: This does nothing if len is less than the string's current length. + * + * @param len Minimum number of elements the string buffer must be able to hold. + * @return True if a new buffer was allocated, false otherwise. + */ + virtual bool setBufferSize(size_t len) override; + + /** + * @brief Empties the string, and sets the internal buffer to be at least large enough to old a specified number of elements. + * Note: This does nothing if len is less than the string's current length. + * + * @param len Minimum number of elements the string buffer must be able to hold. + * @return True if a new buffer was allocated, false otherwise. + */ + virtual bool setBufferSizeNoCopy(size_t len) override; + /** Default Constructor */ CString_Type(); @@ -266,25 +284,6 @@ namespace Jupiter static const Jupiter::CString_Type empty; /** Empty instantiation of CString_Type */ protected: - - /** - * @brief Sets the internal buffer to be at least large enough to old a specified number of elements. - * Note: This does nothing if len is less than the string's current length. - * - * @param len Minimum number of elements the string buffer must be able to hold. - * @return True if a new buffer was allocated, false otherwise. - */ - virtual bool setBufferSize(size_t len); - - /** - * @brief Empties the string, and sets the internal buffer to be at least large enough to old a specified number of elements. - * Note: This does nothing if len is less than the string's current length. - * - * @param len Minimum number of elements the string buffer must be able to hold. - * @return True if a new buffer was allocated, false otherwise. - */ - virtual bool setBufferSizeNoCopy(size_t len); - /** Dummy constructor to prevent string initialization */ CString_Type(Jupiter::String_Constructor_Base &) {}; }; @@ -305,6 +304,15 @@ namespace Jupiter { public: + /** + * @brief Returns the maximum number of elements the String can contain, + * without expanding the socket buffer. This is generally the size of the + * underlying memory buffer. + * + * @return Number of elements the string can contain without reallocation. + */ + virtual size_t capacity() const; + /** * @brief Sets the CString's contents based on the format string and input variables. * Note: Format specifiers similar to printf. Returns 0 for any type other than char and wchar_t. @@ -424,6 +432,24 @@ namespace Jupiter static TokenizeResult tokenize(const Jupiter::Readable_String &in, const Jupiter::Readable_String &separator); static TokenizeResult tokenize(const Jupiter::Readable_String &in, const T *separator, size_t separator_size); + /** + * @brief Sets the internal buffer to be at least large enough to old a specified number of elements. + * Note: This does nothing if len is less than the string's current length. + * + * @param len Minimum number of elements the string buffer must be able to hold. + * @return True if a new buffer was allocated, false otherwise. + */ + virtual bool setBufferSize(size_t len) override; + + /** + * @brief Empties the string, and sets the internal buffer to be at least large enough to old a specified number of elements. + * Note: This does nothing if len is less than the string's current length. + * + * @param len Minimum number of elements the string buffer must be able to hold. + * @return True if a new buffer was allocated, false otherwise. + */ + virtual bool setBufferSizeNoCopy(size_t len) override; + /** Default constructor */ CString_Loose(); @@ -463,25 +489,6 @@ namespace Jupiter static const size_t start_size = 8; /** Starting size for loose CStrings. */ protected: - - /** - * @brief Sets the internal buffer to be at least large enough to old a specified number of elements. - * Note: This does nothing if len is less than the string's current length. - * - * @param len Minimum number of elements the string buffer must be able to hold. - * @return True if a new buffer was allocated, false otherwise. - */ - virtual bool setBufferSize(size_t len); - - /** - * @brief Empties the string, and sets the internal buffer to be at least large enough to old a specified number of elements. - * Note: This does nothing if len is less than the string's current length. - * - * @param len Minimum number of elements the string buffer must be able to hold. - * @return True if a new buffer was allocated, false otherwise. - */ - virtual bool setBufferSizeNoCopy(size_t len); - /** Dummy constructor to prevent string initialization */ CString_Loose(Jupiter::String_Constructor_Base &) {}; diff --git a/Jupiter/CString_Imp.h b/Jupiter/CString_Imp.h index 36dfba2..9213aba 100644 --- a/Jupiter/CString_Imp.h +++ b/Jupiter/CString_Imp.h @@ -618,6 +618,11 @@ template bool Jupiter::CString_Loose::setBufferSizeNoCopy(size_t return false; } +template size_t Jupiter::CString_Loose::capacity() const +{ + return Jupiter::CString_Loose::strSize - 1; +} + template Jupiter::CString_Loose Jupiter::CString_Loose::Format(const T *format, ...) { CString_Loose r; diff --git a/Jupiter/Shift_String.h b/Jupiter/Shift_String.h index 13a9e95..ad42af6 100644 --- a/Jupiter/Shift_String.h +++ b/Jupiter/Shift_String.h @@ -81,23 +81,6 @@ namespace Jupiter */ virtual void erase(); - /** - * @brief Default constructor for the Shift_String_Type class. - */ - Shift_String_Type() {} - - /** - * @brief Move constructor for the Shift_String_Type class. - */ - Shift_String_Type(Jupiter::Shift_String_Type &&source); - - /** - * @brief Destructor for the Shift_String_Type class. - */ - virtual ~Shift_String_Type(); - - protected: - /** * @brief Sets the internal buffer to be at least large enough to old a specified number of elements. * Note: This does nothing if len is less than the string's current length. @@ -105,7 +88,7 @@ namespace Jupiter * @param len Minimum number of elements the string buffer must be able to hold. * @return True if a new buffer was allocated, false otherwise. */ - virtual bool setBufferSize(size_t len); + virtual bool setBufferSize(size_t len) override; /** * @brief Empties the string, and sets the internal buffer to be at least large enough to old a specified number of elements. @@ -114,8 +97,24 @@ namespace Jupiter * @param len Minimum number of elements the string buffer must be able to hold. * @return True if a new buffer was allocated, false otherwise. */ - virtual bool setBufferSizeNoCopy(size_t len); + virtual bool setBufferSizeNoCopy(size_t len) override; + /** + * @brief Default constructor for the Shift_String_Type class. + */ + Shift_String_Type() {} + + /** + * @brief Move constructor for the Shift_String_Type class. + */ + Shift_String_Type(Jupiter::Shift_String_Type &&source); + + /** + * @brief Destructor for the Shift_String_Type class. + */ + virtual ~Shift_String_Type(); + + protected: T *base; /** Base pointer for the underlying String's memory allocation */ }; } diff --git a/Jupiter/String.h b/Jupiter/String.h index 655a38f..26c6650 100644 --- a/Jupiter/String.h +++ b/Jupiter/String.h @@ -283,6 +283,15 @@ namespace Jupiter { public: + /** + * @brief Returns the maximum number of elements the String can contain, + * without expanding the socket buffer. This is generally the size of the + * underlying memory buffer. + * + * @return Number of elements the string can contain without reallocation. + */ + virtual size_t capacity() const; + /** * @brief Sets the String's contents based on the format string and input variables. * Note: Format specifiers similar to printf. Returns 0 for any type other than char and wchar_t. @@ -464,6 +473,24 @@ namespace Jupiter static TokenizeResult tokenize(const Jupiter::Readable_String &in, const Jupiter::Readable_String &separator); static TokenizeResult tokenize(const Jupiter::Readable_String &in, const T *separator, size_t separator_size); + /** + * @brief Sets the internal buffer to be at least large enough to old a specified number of elements. + * Note: This does nothing if len is less than the string's current length. + * + * @param len Minimum number of elements the string buffer must be able to hold. + * @return True if a new buffer was allocated, false otherwise. + */ + virtual bool setBufferSize(size_t len) override; + + /** + * @brief Empties the string, and sets the internal buffer to be at least large enough to old a specified number of elements. + * Note: This does nothing if len is less than the string's current length. + * + * @param len Minimum number of elements the string buffer must be able to hold. + * @return True if a new buffer was allocated, false otherwise. + */ + virtual bool setBufferSizeNoCopy(size_t len) override; + /** Default constructor */ String_Loose(); @@ -503,25 +530,6 @@ namespace Jupiter static const size_t start_size = 8; /** Starting size for loose Strings. */ protected: - - /** - * @brief Sets the internal buffer to be at least large enough to old a specified number of elements. - * Note: This does nothing if len is less than the string's current length. - * - * @param len Minimum number of elements the string buffer must be able to hold. - * @return True if a new buffer was allocated, false otherwise. - */ - virtual bool setBufferSize(size_t len); - - /** - * @brief Empties the string, and sets the internal buffer to be at least large enough to old a specified number of elements. - * Note: This does nothing if len is less than the string's current length. - * - * @param len Minimum number of elements the string buffer must be able to hold. - * @return True if a new buffer was allocated, false otherwise. - */ - virtual bool setBufferSizeNoCopy(size_t len); - /** Dummy constructor to prevent string initialization */ String_Loose(Jupiter::String_Constructor_Base &) {}; diff --git a/Jupiter/String_Imp.h b/Jupiter/String_Imp.h index fbd3d2e..bd45b86 100644 --- a/Jupiter/String_Imp.h +++ b/Jupiter/String_Imp.h @@ -536,6 +536,11 @@ template<> size_t inline Jupiter::String_Loose::vformat(const wchar_t * return Jupiter::String_Type::length = minLen; } +template size_t Jupiter::String_Loose::capacity() const +{ + return Jupiter::String_Loose::strSize; +} + template size_t Jupiter::String_Loose::vformat(const T *format, va_list args) { return 0; diff --git a/Jupiter/String_Type.h b/Jupiter/String_Type.h index 1634041..3cd343c 100644 --- a/Jupiter/String_Type.h +++ b/Jupiter/String_Type.h @@ -61,6 +61,15 @@ namespace Jupiter */ size_t size() const; + /** + * @brief Returns the maximum number of elements the String can contain, + * without expanding the socket buffer. This is generally the size of the + * underlying memory buffer. + * + * @return Number of elements the string can contain without reallocation. + */ + virtual size_t capacity() const; + /** * @brief Returns a pointer to the underlying string of elements. * @@ -230,6 +239,24 @@ namespace Jupiter template class R> static R substring(const Jupiter::Readable_String &in, size_t pos, size_t len); template class R> static R substring(const T *in, size_t pos, size_t len); + /** + * @brief Sets the internal buffer to be at least large enough to old a specified number of elements. + * Note: This does nothing if len is less than the string's current length. + * + * @param len Minimum number of elements the string buffer must be able to hold. + * @return True if a new buffer was allocated, false otherwise. + */ + virtual bool setBufferSize(size_t len) = 0; + + /** + * @brief Empties the string, and sets the internal buffer to be at least large enough to old a specified number of elements. + * Note: This does nothing if len is less than the string's current length. + * + * @param len Minimum number of elements the string buffer must be able to hold. + * @return True if a new buffer was allocated, false otherwise. + */ + virtual bool setBufferSizeNoCopy(size_t len) = 0; + /** Mutative operators */ inline String_Type &operator+=(const Readable_String &right) { this->concat(right); return *this; }; inline String_Type &operator+=(const String_Type &right) { this->concat(right); return *this; }; @@ -265,25 +292,6 @@ namespace Jupiter */ protected: - - /** - * @brief Sets the internal buffer to be at least large enough to old a specified number of elements. - * Note: This does nothing if len is less than the string's current length. - * - * @param len Minimum number of elements the string buffer must be able to hold. - * @return True if a new buffer was allocated, false otherwise. - */ - virtual bool setBufferSize(size_t len) = 0; - - /** - * @brief Empties the string, and sets the internal buffer to be at least large enough to old a specified number of elements. - * Note: This does nothing if len is less than the string's current length. - * - * @param len Minimum number of elements the string buffer must be able to hold. - * @return True if a new buffer was allocated, false otherwise. - */ - virtual bool setBufferSizeNoCopy(size_t len) = 0; - T *str; /** Pointer for the underlying string of elements */ size_t length; /** Number of representable elements in the string */ }; diff --git a/Jupiter/String_Type_Imp.h b/Jupiter/String_Type_Imp.h index fe018f7..13efd55 100644 --- a/Jupiter/String_Type_Imp.h +++ b/Jupiter/String_Type_Imp.h @@ -50,6 +50,11 @@ template size_t Jupiter::String_Type::size() const return Jupiter::String_Type::length; } +template size_t Jupiter::String_Type::capacity() const +{ + return this->size(); +} + template const T *Jupiter::String_Type::ptr() const { return Jupiter::String_Type::str; diff --git a/Release/Jupiter.lib b/Release/Jupiter.lib index d01bfcaecb727a71b91692e9dcc8ceb899f7232f..d09d6b23ef88e9fc48d078ddbf7dd0ec23c48307 100644 GIT binary patch delta 34075 zcmb`w37AjSA3uKXITvGJvWziiu^WT2GnN_K*v6QVB*_*+_M{SKlq8AaBS(^@RLGu; zWEmyNIwT~^kZg%jlHKq1KIh&upKJ8}{ht5x?|EKx&AspYKJWdkciR1V(OaJsO)Z~ z$)fWOrtst>CJ0?1Iid4FjieJy0CqtLLnt&@K@35l5r#r5LRau11kBN}GMFIn?iykV z6AB@?0(K-J89z2?p$z&(~;SGn>#dLnF2cvkA?hB_R%-453w9jTYlT55%t1XohzQtt)A? zOzsXwK=bJuF}s*eXgXJ;)kZJ^TA(*0G!N5==>a;Reg%z&U6`$~16QCyK8+54FPNOu6` z5`aV$GzAEq2y}$PK(gI20{_ z!aEN%K0d;PLPK1E#kPaxxB{Q_)VO+<3Bt9T4v;z5lJVnedyV_COaOK;*9bycCX|_^ zAg(}q!tWb3&L=WK7@kjopKievb{1z`VHU0^!CA;Cz!m`t;ywf>e2=!1@xv|%e*i*e zXw1b6gqgWD-pGW>fJy5#WzLWlg1DE7*|+;D{wnQ;OiR-c0_xoP%V(z3UEg?p!#Hu$PLUU)aa%lw!*B0ZP1#K zK3QWMvW2h%9h3rMWe2c4AL>7Th~@J&zCd@X&5~ZA(9dJM$~=6SGP3M3NcRDFi9f~F$dTcTVecPu@$o`K|_VBxB^w?YE%YuLe&up zVlzyrumD$J%S{K!hAqIi10CGM75Hwc#^+<0AS{Klgk?Q7mL{*q4Pa9j1-tk;jPrmJ z(3ViLfP%Q2#T4#sU;?l)E+B|N2m$b`b2P3sWSo$N8lbQqSKu$MaeXY~gs;0Qh~zw% znE>qkD5rqP(@??AAC2FmnHXP8V>0Ln8xTB%Ig>QzPhoY0yOIlbUCi^OJ|JffeaTn@NeKww8riEOb~wBrEwUROQs*Y zaFg&O2ni2HY5Y(evsPe2eFw*I1zv|B3b$|t#!b~&mk8GZ>w`4D9LEG<^#hGHA2UI? zc~fId1o9t0Y`d9)_^38hnAngB!mKQf1({3`7T$3%3|HXOFpW>}jIiVljRkNA;r)vm zAI3AGa0ORj`fQC94*#ccCZg(U)Q7Z$8fchMYqUnaCQJ~juhEDc!UUnhCXGsHm=KM0 zB-CE7QF#Xwgldr*bzm(*gUuQZlkrPKAfmWNRhtQb|BC1&Y(*Xu(${GGTaIysb+`iC zko$!6DjFxwGETUFDoFSP&j^?AX?zJj3MFv`k}qU{5V(SAw?Z>qf%W)Z0p09+;LcTz zT@j2cpflP9pfD+%UCKD&H#A1L8K|*k7UP6}CMyWGoGDl>Fgcd~r9K9TkEllPXLcUBX1;s~S=J;WnT_NsXG*m>|?Hq)`vGgixcsM)d%= z52)BxqjCuRUm1)W$7<9`gnxi4JvFNBgx`R=vo$cp7KBEVH6rH0Z9rB04%qn`Du{{? z&;SsP00r#edkW%%V5YGFS72mvKl}hjjnEi*6Tbs{Q#AIRV}dZRp@Ja0Tvj z1rgR2!}lTZ|2sp_FnT~hOx&T-X#f+1oh3DT!904PvJ1G zhcW-ZKTYFcIv4LO+cag#J^FJQI;p4W~-FADz?t}jrq z%Z_0LelAtxFaneCbDt>u03I&UI1FhCM-ZumqxCg@#=i+i>MDqGi1eeVl7wR|93bb9 zZAN*mpum66jiFd>Ip}kq@aCaXX@^Q#&4cs5(0_EhVWazx8rElsygr$is@SeY>*me7 zws?8Kfc~RmYt@eJ)}8h0HE8IFUNMi77R^B_GvlmfX;0L(`f~Y71FLdcbOZY5p^a8) zS+ff-C|5MH0@bg)TXz}5?eg?XS>K}IJTgAo3a8(~WmvQo?7Q-25#P2d`DL|etEg|> zFZpDp*F});)KG`fjc7~%7TUzhlNQ+6+LK?-D#FXjFWOi&WJ)_LS6WzGOXl-zE!3|a zjdZnFUSL5;TjsUJ#aDQ?gn-vGnHL%$jU{NER z-NEluf(7fnU$Cf^g3VbW*vBmd8+?MZrCT|xw2iYxH#ysh#vXt!d3J!!7W^RCo$i7y zct)`HxbA2xSPwKfwvAvR`1h4K!M;6(9`U4LT~BdVdk1IH_}Lh*c3QCb z+nm+yCs^mV1dAIh*nk2yOL-{Rn45wXA0pVMd=T)AV8eiU-2^MtO(e57o<@Vm1ZxPC zJSy0fBWN&FuoEZI(081z_?ELMU?ct=@w{N;3fpXSS;6Km z^FgRpoCU4nY&~#mEoY;Fl+~OK3$s~tIO=s-y<$z%M_Ca_c_h7+ZO&)}oUJ$I@Kxhr*#=pl75bQ>0!6rQk z=3USr{(T||jTE%m;6gT=2UAuU3YxC)Z-8JKmSEkvU`qtt1w`6{Z2(wq@X94v-2#Gb z1p*2Q_C`UpQv@z43Z;v||Izr7iU&c3p%EUO!nN%af*k^aOQ3<`xWcqGN}>V$z8BY$ zfq18sU`I!ZFUv+ipRnK zZClxF93HI0O-IyJBoMx2erGg60Zn!f>w#?p3I7vn~y7wgbqA)cdQ0 z&87i6;%&CHEi`RsvxN3&0M{Fxz#rG1cvc1fo(jZ*CN&AaC*wzY0vZIqO$2jbdPkc@ z05^bsZEUu=377$yjd35s9KyZP_;(l@T#rUJ*28mPU@Fq?4Z#8@3ASP;@_&Y4^`{8- z*{6byeih~(4fnn)*n@WjJMu9y4oJ2aBd>v;p9psLs$e&-!B;?g{5$r(U_97nS@74S zGHBq6U>koIEb%;|c(`CKPIFd#Cug&OH?k05!e&SC&a2;}ejr#gBwRQbK@DLtA=o+y z)_xXJ7J}`EV6mUU|Ak&dxl{FQ)MDu?L5iA+FDRoI0fK8ON_U`;85SPO#S;fOEP zkbxn|f~|TU(O<-7n}ERb5C8;4P#QA^3)bv7XCuDg?8tHi8?de)8t8+RY6fOa1v>|e z+!zJ(z9`r+&^AM~f3^a`0p0pTslI4DMzD*ZpZBL=OJ9PO@}pt`shc=Em;4PR2X1`L zS^EeGP|ao+fyvcvwjt7H-D+T*xfOoghI*e4|KZwX2h0cLTQ1mq;K~=U3UF}~O#cn) zeMy_uE`@jkx*+8uE5OvKlDCivh0-{iv;kEW*H#rVv<<9;Q~>5y!3&jbHliv@M{pO%t&PU-{3se6N z^Z&wGW^PzzC47l{J-!mm2HlGFh~{;OiB%AEH5x_?jq8aD*$W*|D|9lg;j-rtv_M8n zSPvNXD`#0K<4eaUqp`Q)X9QObL~8(w$W}De9o=4=@J8 zY9SSW1EX_r1+J6NB4&^o6Ob(l7X+)_8;t?SyP%+AE;3o)o82?U2 zbVmP(Uh4t6$RFV62?!)0;dQ}o0aM38a%dL>EysO{+=Yf8uYqe2-4SCTxD8)_gj}A8 zEJA8!EaI@dC`Aj?_*;{@0BHvSC5++69yip0U5Dj0~M$cFoDOC-E)j_H@z_lTSj({7g;(eI3I0hJN(m5;lFERyK zfWbx;{C*aLkH`!7{SVIWp+v9wlCzRP#sw^GoVbFt0Zyz(L;_cl#}T`bMnKkG_~ms_L;p9fhU1&KOS~kQ8 z<^kx#V3B+9b?^s>cA(!#!A6XNTX0R;i;UO<+Ic9w!e()q$a9Q@*7w3Y{b4!$9{eNf z3Y0sa9D*p1wi!b`--@7`g^nc{zlU9ic7Gw*S|Ae^p)?~PYojX8!i&XF8GDAJfb4`u z|02*3aQ4s0h^NqXTWVg)hH(r)e5eOdux}!K-VuS^1nz@1BldE(3TU{Gv*ZoORqsdSmN+o$b!jm$1AYH16UcUd@Prp%sS_S_DvD_KOr3sVL%D=%S5!E zMzQ$^OmCoJp#I-r42x{VbuS|S$OuIDXJ7<|7op*(1h}9p>N>2j0~yh56&gl%3`XBk z1@Y4*gR?_G`-6y;2b}GO!pA~kp4$5{90s}^z-R@S25Y2)sO=%nz6Iukcw;!aQw*<% zAiyRez!ucTxDhz^BeDao8iVm(DgtoTVGLG(=4=T9vo`*{;Rp)XQCxAaF8&=^4q1iY zTO8wTGf)AuXOod3!X@t^o%ev+T!r+GWxo?qpE@GJZ}isv<+ z#c%L`_)Tf`x2onn$XoCZ{4&2K(|TD?=0CxI=9#=L|C9eKXZE+Al7o9&v%~`ag?!lC zdbjjy{?KCF;#;g=tozmjE0qWGl{`QHNG82tl`i@r547T}HdZNX5#PbSXDj5MKGxR- z7xK6HJu8IWw(eLLrdwd$7FAEN`YRM_jTanf! zIdYIyz4BHzhF!2;=jZwFydW#Uin8B$L92juiH+k|SYcL(U1ooH8PRO_PLH_$3o{{PX6&uarV3imf${C}FxI+vDbu=P_xU(ABsX%AkpjyF>CSc@esQ=X0Ld|9;3aeLrd$ub6$ml&ralKT+V{$v;1p!011l$+dT_7V^MhUO*Pv z!b`YqUgr_{iL4WdEN08KgRNFXRn8&EIw3Scdk}DD`?fELks~sAxbu8XZ4m*vWX~0R zko!syZC4zWVy%KKIYiP5hA%W_d0-FWZS{AuUy#G(4u#nt>N=N4&2QV&~Wq;?ev zSZi)&-Qa<8`dVHrFIi{=+AbgqujN&Jsb4gcMb;S`jMxYD7T$5xs{^`%ka7D^tD;O@ z$16H*Dyl7;9jdyZDx|5Z%F;o$$1AQZgTKs{#gW)vZ*I{MQaPiQc!D%pu%17!8#2aL zQj@WZ$%80~bM9Mt{XM&Al(xa{uXrDS5m$HB9D8iw&p7wdQiS5x1l&r<#T$7QnX(0~ z`$ZDe(=^ebDM>WdWba5TcaD%FXOhJC()iG9{@I$$+vsW{Gi@zmjjxR}W7p|h8@}ex z`RVHk_c9djiJZ5f=x_p6S!JJ_6dfQV*7+4xh}<^<30m!&?3gFN5B`Q1BQYm@!)H2T zx)zJw?6nvd8^)=PM4*fpwi4mg z7Cuso@P4K!CAW3Z4oca|lUxJ-<8W;WuH}jA;(S&Enc6~lk|V3PHr||Vyrc7GR!dvE ztuo%MC_mc9%gBVo-k^0OVp_V12#*?-sllSTphk!7#)xj#E!gg69fa4VBnnMcMeO%{ z$tvU9Hawp^aocs1Os!>WqN*Um?kEw3$PueN=22#NSjJY7AMzdV;3$(=P3t%BJGV{g ziV?QMy`^9No$1#*9L?3e>Rgc^g0T&)CmZyK}#H+s(8yP?eJ5|}dIHW-kx?BY)ghB!&&|XAGnRZsA(`@nE08)y zZfd}-A57*@#uDkYUHsX{$R7BkE4y4n;w1m*l%+~&8{2rY`OD}aVRcjHiK_5ft$DuP zytQGfCECq9nLDNALs%EB&)LJd-I~A8gee8Q;zTxWE<^Y6Fu5qn%F*X250YaQaU_UaXyQj> zqBjza+6X&fOidL@^=sH(Vy$4iUhS;Pa_egtW?VbqrUM$tj{Vk}DBOtRSXsvrlvnIX z`8b!-FC}}obXe5@K^qWkZ-adX+69oQt9fO|7;da!#^D6-V?5o?efv>0DZP~`s7ke$ zwGQ*LYB2Q}wY0YtG38PRP3#)kjUP&DMMG&FPc$uDLE$2$FS)2A1WGDtm3uVm6#-SK z1Q1Mo)e8R4il7>)2Fgxy@z1=KUsO@q%tak}E&0*U&?h6oDlFrVc?yf93Zhul1B)bL zQJM$?Wcm?a-I16aplHYeoi$C^YgPeb=IR?8AtF>`wPpBG?9`+b;Q8g=qwaGG2lY5g zE<6fZPIs~j`M++)3W}(%3_r#z$nTHwNJj*Zf4a)Gzx+S@=V>B#ZBJfNEmV~&e?hJB zi!x7ve+JdaSL;}{$6MV$Tf58Zzw)+@lr)S{o@)m~JxgQ9kD5Ko0%btc#DNAo;d1&| ztFeFOAxkQ2*9O6J^5hBL-p{F2Y1C7Sy`HkyNuwJjfGVdHHod5vPA`PME#;)g;U?u2 z6H2+>GU=4jz!SE874t^wV6EDjX~6R)c}pi29S0sg?W^}-E!9T7tlg-Wz==Q78DiL zbtOkdFdGP}ka1SfqmIg{@gTYQtgCTOI}Vm*esk@po_fmbi}J(YJlXlsm4SSK&1E_K z39G`R-pVdvN_Xn4hLY|xi|` zBjm&1c{9iQ#9tYV_>Y9JeL7>1@+f;xl8%zs&hte7$n{tFB_zkla}^%7xx_F~H}oVL z8jXf#j&o~dzS%0*sGiPHsCFN3ORL8~26dBz=CZ#s#T1gbGI<`N(5sH5gN zJ1;r&oR{(V6?x_opYA-SzFSp^`tsx@UR`EfHp9a;Lmc@M@zQHhB4uQ2nQjRufK?w) zLvtk^%|yp4nrL5aNZ!W^sJuo3zD{1dUeJn`nQhUNf~RLBn}~Uf}(<4DD6Jok2Mf4PQ;M+Q@{g?9{)3>D9YgTz6U1q?N_n_$KU+^`Cc=5fl?L!kd~& zGx^Cc0LR5`bS4E>AOAmlq8~2OEg+eyuoY9 z#D91%Hxki1D`D%&(0_Pj4q-_dB@GQ*-gVlLr{BaZ^uwE`0h-1Yrh!0nP)$SZ#KhF~ zojDmQ54>$XA*=su2#K8vGGg~01=;FAOmeWw>xo5A4>esDzUB5%l7dFrEfx%B$eFiz zH%AkS6!nB6B~^ys=3QMKk!|WpeLR^dSKsCd?h|OQ#G$bXPO34vsx+_a7xUU#v=E^f z&_aYyeshP%I}AL6&XzHET|rf{(BxRXN0a0C<@US0pMFnOZyG(Rr?v2Oj(qN(`!1ep zd1+QB<>`BF(f5v}=E`38jV3fZQGTM{>jU^Hd@@#PVOKYiaz@=eIr4#tI?wwb;{6Hq zzF%Ie_sI~-USx>*WUuROF*46lO8gD}(fj#@Yj2Oa7Q8=GWDh*FA4ubc#J5i;t3r-E zr?RP%&{CV8lJ654 zBZQllltaqEqw!=340PsgtEx=QE&BMyk|Lm3`cxBCl53`8YE-tc>0Lbegu|D_22}4L zpQaD?7G#n|F(g?&2Wg*oKpOQPCcqum5xH6^Pp)2t=MSE&CQIJ%S36LS$mcK_1)|j; z%Ix)moOHq)^S$11(hNsa*&5j~zv!YpX8JQ_nFQG`zlf4i1w}>w#U)Q(tV0tcmsj(p z)XtqVHvM~!FBM@c{~GLxto8DGAyMVAzEr}DmJ17tnvX`8@(@MW272AiDZlRK&qCze z|B5B`I>pjP`LM7juAMgT7XBY?Zlaf}{O`#5#-aJYO0ZehEdC$*D=8_*wkVqa5y@wY z{of*a8?kUB+2eq8*}R0PCifQ3vKCf`zl= zV>)xy6m{l55#`JeE6VYqrX^b9P!^~mlR`yVnH4JB)eq0q_Gc0^p(@s69@mU#a(+ba z3lr|b1Fg#`0cg?ZC@~pX73&X~;gB^nL^wM^db&rmWTi08l8?#n!$lJ}#{8%FzYv#@ zc9`BimJ7{s6&JGZak;jfFbp)6s7SbF*pgbn3i2y zCd#BkqOKz-ZAvM18-n5#F-nTS@O484(?d|@R^ri!=(H?c(XIQEmKW6%T3*bQA67Ko zKTTc~SDL(>p)82XWyQ*n8iuQyYGm|s`kihdJBvQ|!Az^8EL6`>q1Nc_E7c4QmVT2% zD+_1Tm~(7+PF}ApoUx(oUEG-pcg1_ZgZr9URtJCXwAH4hqzy!TfPp=iJXSM*DT#$@ znpj+r`>Kjzj@@VkrutP{`?(0_2l8S7x4Igl#BZJ6GwZqps_NyeIx@AXQILv(8SLO= z2YK9QMGzZz7ELn(74FStay3yxCRfK+Fc^4-`Lvp)6rt6uE2PN5JXTX#bGKom%$+&Q z8GbwkvOkIJT6Nwo=T?mW%=0Q_+B(~6?r)WxzPkph2eZAtBcYV-NT@6sT2u6OY-fZ~ zk4c#8^6Q$eX>)q@FWD=~cvZg~tc=>NMUU-fbFWc2J`g&Z84+5E7Wc?4<{v(^# zcH5VpwLyI0B+qcX+N-8vZsb>L*>bVTO`8X-2agS$_|tRx8=6F zVuV{m{QYnTEffrZAK+Ba+KF+73IJkqm)hzX27_Re&7HQ8L6o=@>-WH{kFa9=o$AS! z`ykjl*PAV#AbUVDlr+@KF^ue|e_%CvBwlqy)9R9i16uN% zI=oGeQ1xtZaPVn9&nh7&M2i^5h8|xEP0&oXK4K=)o^2Rg&S)&+{G*iiIhA*4F(j8P z*hIK1Q);MwIacV$J@GiVT-`*Bao+Y+%{=nCrlx9oM&tnyX=N=7L-J;>t30#TymELm z;VxRENu5#8qqThUS~D@uX>CM|Zhc{^6;jIO<)eK0O1fB5=BI?fH&58DapSc+nn5QSdtWkyT!9Y-yDB6rN(TXe(2A zj4aBfB+C;rrnP7&pW>o|W6Idmj*(mAadCRw(?1|QT~-OSzIXx3UUYBMIxVayE62)% ztwnvgI!;t_7+~NTC}}ZMiT^VAmjZ+Eh1OvCS{qY0s7F==)FTIKg39t<8#BW8bSkA` z_SEv|Q`#B{U`x$_awkYVFC#M+;UD|URV6}C-{HyoGJe!@RXgEq#jBj9Gu!v7Yi zf+qUk5>?bhq4HjW@hcSu6__+tuOy%Ck*}zJecG!ig9BkSZ@CqM~NOJxh%8C#i~1^ zadCAEgZMKa1j_w44HZ>K#fHX|HQ=2^NwwsJCq2&<1A1PQD#6I4D4DN|A)u*@BA}^E zlqQJuUG0=de$d5aQhEiPS_{c=s@`j|R~J!Ne)b7EVVsciCIRG8N!vtT>mq8&B1^E2 zl=YO`oU$e@GZs{vv}m#pnv9W2zgnTb;a79X^ef(^QsY)ynpQH>(sW(CAY*D+)#cr; zMnKP0x}H4!v?wP}$MC{3^N8DY_QI)>uZ~Q5T2zv~mtf!5j}esw)fBDSHlU`$V|i^k zx0{!ZX9=gFyxz@pO5_m70DpE9b>x~c9OLC@%w)~&Yfjzm-!b0x2>t6&e1H9;JOe`Zzj#fPc-<}KA zqmp_0`evH4Sq>_S9L0|!CkCOHUa78(&Gh=u)3e2b)y&VVoL!sova(zwIpaAIHRp3s zC;Xd}ol0QpC|k%ry+ouh>=JfeAL%O%Lq$ws(~^kYrBgH1Q}WYLuN4~G{<#$eZlz^d zT=qf$Iw3_A3!>JVsGi)N-Aj39xp5RQp;b^D+VpX~sY*WWk10`Tf2@sM+(!&>x-!3o z(2x3vYQC&LbIBL`x-YBEEA=AH|Junu&*O+rN-G{IWBZwqqLmV5xQ=prUr|P$ZjB8* zJoh9f4Oe+qRgD3qP&c1jl*kxjFi*|q znS!X=c@6D6C1(y2vz*5s#$B}p?kcF8lb#Xx)093P;8jOVchaib>HeaVxMR^yH$^$z ze|wLtrsSYu$}=)%h#2C?L0h*Q$U&d2%cAqGdNT24kxMpQjq@a!OL(MG zhV`4K^cpSjop~HD@5@>ioP*j^?*~DL#j7z-&o#!_g5pR;SR!N?EPIU+10Ct8tf(h6 z8-7tf9Al;kp2|N2_HBMU&VP!wn_-)@p@Ly+})R$bLgq&-i4RLsm!b``ifU zS@{_b>BE~~<>#H(41s3}V+2_E%BD1v=lhsY_MDm+DaVg>=ccILT01(pG)jiPF2dDE z1`j8>LtAzBR2hKAnlH(PubVnZ3tNTAakQ{CS~*UJMB@xefeB`$s{G{1kC$cAcu`M% zqmW~T0x4HYdRC>!5VgB1P4gWk3e9(3kyf%O?(224jEtFs;P6{ZqluXcw$}3Wcxs;zrUUi_$9VYc!Iu~o zWX|_SvC@|gzpDhJS>^Y z@hODfg!oOr!r8a%MGCb@ri?_Zdz0j|Z7In z?B|}2@@+I7vH=}sleb+4IVYo2Koq+HYf*mksj(6*D5#KmM$UX2VRhhaZkf6P2Y1F# zaTS#wpH781+t0?y(0APDsx{B|A@8EKLTOm8O7jwV220aq(Wz#zWD+2d@`|=)-g8Xv z`JSkt=X)Yqq?zkuB?Fy-pyRzurwZrO6*__yC_RfNGr-rEI;W$b0?JeL;?;MB^BIhX z-;`-CKbmH$(nizFS>Pm-yW(u8-#)N=#CXYj!ug`Z^l;Qd!|B2~YHiN8Z=5ci4_iEq zHk;u#s%|@Ht>y6^ako6m1|{^(N`o z%oH!{@~_&Ym+5xbSz@TuD=2%qmU^v?)L~|Kg=G%VSAsr-TY7tcO~{;=Uzb>`0(+Xs^Fxx!Ik9eGe&rmU5A>WRPjR-t~3x`Psgc1zh!(H{t@GpPlWRg znG%84Cg^s+64ysM_TA5PrY>=V!8AkUk)N6fq!k~!wfj>yVNKyk{LF+0)pnw~{F(6{ zb<1>X>gU4!CeCz#bU$pVTPt)N(y&3PNW<#wOL(S(EWhr z;&mr_$nUBnq5;_s+3^ce*O&4Gb`-XGdu5&6*f*m0{4od8WQ4apv`O(RQBugtITAALb zi0b*jnQuHyMVkGs)m8cW0eZ&W-MrFWu-i zQDuVnFyw3gZ_6BmLC?hFXHw#3eYxwFcR5bkB(Pkt)smSAH`nO(6SJGjdjHGTi`(TrCjOUDRCRlCXSW%{bBWk%m_FwQhqn=|l zzS%7<-q<;d=Skm1=SUG{c317TTe8)rvumD%X6F=#2${M})b>A;Yl4{!w`i*v?~3P6 z0qB0hHn&1+pU{>H-Ot?SO-lFvlyq}n@uvzx^!O`Qt`EsPbnEzbV?>n=E{nn68Wtw> zm1k&leg$>5)_$w1FKnlBq}#))#yks^e`?Aka-vI>liyWPP27+DEkFBvs?;@^{5?)> z!F|F0##0iz6$gJ%$WhMZmg@efW4KOZvp&P|5owOiV4VIZJEZRv?&oc)Go$mSbU*qB z;rB^eDd~Pbx%CIPM>8Y0w!2KeyI&jb-zA(6wv0@~H10>!i+D~_-$IZq{7VVxE)03T zez;9)6dZ}KA0Aykcl+{tyG^8c)R?}e%$E7`paQ^{0J zxubvu2hDwRtc#?IJtUluCe2WH!y%JM?vOCm(BurWeS^ZQpy> zvCVwfEKj=q(jLS|BV2ewmTAh@YG9ZWlT17sJXOl->Kq?d&Bsc~UY6@tJfKOQx4kibf7EPp4K!6IAl;9au5AmCqLsV$c=$yn)iub40Tqy%{27Lu~)=;EgR* zXwoiseS}z(x5MSb0{F8Pev5}HAIJWw6KVRN;w?A$X=p6V#IJ@0`IedM*=w)26QcLThy9GS;< zzigmNt@u)_#DZ0k1%-7 z9Soq3W_ujY9Uy?*Fg3F-wF%V&3|;_P%uBwk_iOqRrv}Ne3;1&qI62`C$f$HFBh&uT zKr(V@Xe1p*@R-gsOdJHk6E9e`Y3JAzN1k#2U{FoGfJHjL{beetsxjIfdy(W%c$ZhA z35+9-vXW=ZcL-b*6;Xk@B>&lnXZ>_2n!0xZ3#i!iat)!JO=CP|Nt&n*!&k?44=0_; zlFAeGox*UuKl~#8IECN)G;31?^i9VI5Tstj4pfd^HUD$$BO&U9cPr;0q9UcFpuyBA zdB3pjeEOB`ZeftgYA$CKx9j@SV*}(0`m@uOK91mpX)=&{&DxjoQ! zKQ!LtmEgB13^NDf zl=Gk*BkSw|lOm@QKUtGk_8XV#OvciJBBG^*w>43ajJ@J+&8a`9p^RTeT4n68M@OjH ze+5YiPKJF)hKJapu3T;vqg_u$QUfGYHHkC5@~>k?C`C&`y-T#MoTA|2GEIIIVmqhV z^?UfEAgZcH;Jx>tOw4GRR1as87tz7iCZQ(UJH%K&Z_;0W`A>jk^_G*fF$GLNBBrm&sA{&~$DyUiW?KF98Ce)B8P0~qdJ3BR|oR^Vu$L*9GV)A zst^*#kE!eY$9g%3uJ6>e^;qZ)P<^7QM&{6#T&Q@F3zxW5kLv6B0P|DXp_c7_fJwQi z-mi-HKg0XiZ{h&Rqo)hiw94~2;^+9J$#y?S^mK7c<=Wb|dq9R}F{+l(_o~ZeOdZ=j z;yI$N({MPREaw4o;=fi&8Ql~$VEh;EU&Pesy|*=UJQ@PhFJz~>c6}#`&2&$-L1%(j z$Srkk|L;PTa^>)3B@gfo4=N?&>zSA`YAK=$AX=q}O3E$uOf-W?TZovfhM-yh;t#AI zTAuy+y1yoCK(I9)ntW2)Q=oC8F(8GCb2c3mb&T>*UY|cJ1uP z+Jt5Bbw(-cQ(kXjSM#>rN`81 z^8H5HEE_rg3d4&VVW!1FC1g;v*OtltN`5V0iuPABTZ>Kdw`kLD1{f>%5#w)Ur^fC( zIXk1xa$Do<&d6VrEwXVF!;${Fk@9F|aNNoR=G?})!^cLJC#1K@(55D&J$6c$zNUtI zPCIRv51Sf0<$V0D9NH}BV^!)xi&I4;PafAsg^Z5&_xu_aRb)N=DjCUsUo9Fx0y40RrvFAhs_>1e>8w@0eI zMC}#=kJ=YR2;o^nSUrr701fKbCd?_VD!{U53n2K(4NDm-KJl6Wkf{!&Yvf zN>A$tW&YMVTURElC_`J>CFaE0`Q)ya#%!KH#`TlD*4iYiHj#f$9hNV|nPzi_+RyT6 zoVRVy-?u!%17?jWlfx69soYV}j4taR5S|1*ChN2{0(ffpFQ|N1sq%f()`XnLFvn$y zc1AeQlV9bV|MBF6yq^7J4He2u9h^EEi1<1wd$qUSGr^t&IVFE+pPeA?i>2s<9KCoN zp6>Ph@Rx^;jvq9v|4Z`Va`X9@Y9-lir8J1~?Rf|Pa{P!8XJoE;BgC2nr<#?(i)ZD~ zc)NxhL($F?s^h=OpW^++%dU;*WK75GC;r@imtS;zJh$_*Xu{*)xgf_UWWNJ$#mNFB z+eNa#&^|Bre`)k6iT@*uNn)~9^-hkFi-Yo#Y}d(-bhYr8=(1ed>G9nEAnxEi=yBYi zOLVxG1otcQwM4@sGs&@0DLna8o=$Y_is^ev8IfccSATAx7@l6G7SO=Z|LwbLa#@n` z9kDM#1|arX#Nd_Tqx!W(7|5axObPb5@Vb1xvk^~)hDZ9p1_|i*EbP9Da9Y>&}ixT(@WZ=32 z&SwCfUEo^h63lMWL!rE|0>3$o5rprN z?o1G-wAXmH8xw$CqM3#@h}nR+2IhpJ@d|eFX^bF#>Z5V$AQOZK(SbrNjzEva8b3xc zK{yP>2tSNf@QFhgnZl_|Fn~!<+}8L48Y$d|Be3nT#`Y{|n#II`PRuTu0W;5Gd|8Tu z=s$)L_$MP2>|)~>K@?*SAaF6bZ&f9Y>}@{Av*EYZy)@P=WLzN(M<6>&!LFXd6lxS_ zw!#q{fm)+AYQE2GLS!2Su@!Mc*j7_xLoO49PbO+?ge3sGw2%G~5SfHBX&Pl`Gn-K6 zqDHxz%mzfwZ3_IeP(~1GTQu5DVS+GXg~rGcOc0K>(m47O6NDqz93s;0P2z>=elG;oo76Le-fd6oh1id%8Qw!4U|F)+n)<2|_7oqc9gop!81;df^C! ztkHnLf>3gb1BN3|W-#ERe}8C{gHH%$p#h;NJ`>7kYLtTpgz}d(DmG(+PyrngD)mv| ze>7tXzprGR@W&yIYvGI&{+y?=>K(>?^zZy^jSD>)C#)Q&APOymMV2wUa=J#P4a_D~ z-m4LY^MLpjrX*b0sPXG}_zqm`reMcC#Ry_|dyQS|m>}%l!+i8lv?{DIc?=VTSD}f* zRUEIP!sTjwxtDQ;Za4xv+H0JcjG6&#J)yC!4{8PQSAUJO%NQs8I#J_74ip7Gs)_vn zs3zl=qctwUG=z2K6zmjeNN6`qqxB(X6WYF`(F%hMA!Un3yEC8z(kf}R$zV32)ntui zv?Zk7&}i$c2Sz~aEREE8%qAoc)<~NQLZHoNjaFB|2uN+9(exU#2`wTW%)t?8c1)x5 zc4jN|!4b&7HA4DW4PQt2lh7$#BOTHcy6({E2c)vO=q?O1WN)E*Jvbxme66bMq(Py z1D&oqn1UnF6joC}+os`6%tV|Ko<}MYUO@W3Py+csD^z2~Y$gaV*VA~vC=-Nd=4d>L zz$8pVNhM6}ukmgRCJ67$*H|=&3Bo(*fbi}%jmv3F5ORBJTt0^HKK#41QsegfOaOM3 z?=-?tmI+n5D~OAbo^U42!CD-F5fB*QIRi9yY(iE5U$syWxo6Pf8D`r@6vUkbrtl^D z_Tir$0)GHvZes^%Fc)}ju*UO;U^3u^r5dv!FkvP-CcL~|<9$>`!q`}ir%ExQfa3HN z@H*U}uo=hAjQ_Nk`RE_t-PplK9DzN^ZNM(FQ9*2IgW(gHdRyZa2mw~A87KTRSL5%|j02+ER3Cul4?!8jlu`A*|ubWBL@ zu91Ykl6?60TYHVs<(ME0nWMmu-UMUd!!r&ta0FIBQ$P$HtMM>C6H+!fK+vWDzrk9B z(YrK?M>COcO8GtLBIb5D)WkPU=wdo;etVuG-}xW+wYupY)jeuKdc43rlK&-5!u_lrU!p9IC@QHPUz!3NtX-D{|g~lp$tgr`1VD?0fzHc)@$V$^_ z`w|m`v{;S4NHId6Q5tQoGNI51$3Bc7o2l{HT+E>7BL63>)p%(t6NL5eXh>)T@Uxg3 z5RPEN0EqK&6<~+%P!OpDnL?}in8X0X$7u{Zh>0oC`D-x#P(3nKy|D+O3#C6wb3hfE8r8F8s7(zTcB{V?Cg!*tBq1G{t z+KZVWwA`Z6=nxZxCJ_v zN8lGU0_^x~X1CwT?6_QPnWQsuxG)omp&E3K(5#t8>`J%|XcVgv4?h!PhG;a1hWmiX zF&a@R@PAYa6A6e=LgP^ybtW=FsE6DoG+C$7{3#{~EuaaZ?k0_Bd(-kxHU^bgcoLZ0?NC>L1z0B@UPKKjb@k<5n5t!0mPNb8do78 zp>>+Z!gEMN-~zq_{3i^jgk5l%!bTi7G7%0b(~y^hv+)||8=%$$=hkW*LW~f;hxUY<%mFmL3EWC@fU0^6_^Y7CjnPaH z{(4TMs|`hf={^M9bYN1p#^hI$h(yRmKVXZ)qGDi|@d}AsTmDFb;@_iwMk{h=n5rtpE27 zbAX2XsPQt1z8%cC!f70VJDU|m^&`j@t`VPvf(5kiuF-e|vlVc?F~_b) zg2q*R2JC9S_W0Kxm2Qp3_o(57L){bv+kxu11Lu%lgdYxT97YW%9Kv_P4~TX^)IbIt zKBn>G0LB$i3w}gUTW}x1&qNXW_U+I)vy1%dect~0jpf&GEN`WTtuNig>d);q{YLkb zTbo&B<$KTbk^x^Y=2*o7zP5Uvm&*HUXSQn7K^|yo#jKy-6l?^(%knL(TI$1VtF1aR zJA>Erm#q^bSG2H7i_FwE{)9Re)t4gp(jlcMOMXJewzMjhN^RT2In%fAV?#&ubl(eXYfk;YnjbfxXj7oMdgHEJZ$}?me$L~WVh2+q#W=fuP?VW zw(gaU##t5R%yw2&5zPy zv#V8Pebx3>+oGO(8BJpwJNGg$&tlWx<7~qc&MqzGEVPqg(+M2~D*=RN;4`5!z5_j) zAk7=wY+ZAkwFgGEwAmh+_Rf2Ty_iLBV1l z6h5}NhhR}ZqO-$-jr~Eei-!cu1i|eS=;#a1?gI{Q<17oEb{Zg9MoF8^f#fO6I2+R+ z0(`>RxMDVA#n1szX%#fg=B(Fh&K9oWEDVUk_mt{3D_#S_0HbT!?ERWHYZK|S+3c-? z)!Zgn?gqgoega`O0;OSAAgv6pm$lhN9BY=d*|wT+0~T>x(gd5*POudtAizk$TEP-8 z9Tn`_5y6sxZPjenE!<|Of$RvI4QObyUi+XNFzg$_ZUIq`3pUR;Sg^H&FqwG_=EdhI ze4hWPVCC);?0sOw{en%s7uM(|Sayib5<+dZ38qXN1{zpyLlMEQa>2$4q`VEQ02u`Y zI}B7W1YQLN>wb@5IY4xXV2ewjpHhO&1%4_G|M$YbHMo!v3XMt%#(=?P1p5O>Du)ir z;#d?eDUS~D{SuDNDxysV!TMCf=RY`G`8#Kaa16i3*}OkFdj~F6LA^p_0w^;+P(0vy5K_+js%~{|+CzT@>u8I7IPo1k*0T_TX5!6@qOtI(Zcu0=Wph zyqp;HoJlE^+1#b;(4hy8;o;Pac(ncu7aik z&RuJ2v&a?*MBrF6n{Drm$Oh(Q*lcV%H0@}!@J{FepLbx;&cOFrT)UZxIKcN(IN$$X zeD`&;*({u_2h7Ij20&I9o81EO4jkh<*lci4_br<_^=Hp(k=_u zGgq)Av&mnbUJO4+PMO{7v~!5X53UVU7!tfQP&Si#wZ zQ_30^l}icY!v# zID#B#_9>&Ba38*xt8Fvi1^n9* zg(#0kgE}^ARo7-iHVN!=AQm>mUpVgB21|S)SaEcGWC=Q6ig@`zunNG2jnD>_F}=La zP5|BiL5v`7E)@k|)QJs9!=AaE#a}^<0BWLE%*Qn5Hp+JKB2@qHv02Z;V2)$e38+*r z3U*^1B%TAe%ol9dYMA;AXFZO{VV1qyxiern91gp9Vf&vp~3-)$j z1alTja$5{CX>b|7kLm-Lwn04sW*$S#pp37b;6o6+gbvoDBMIN2h~%K74d)R=p*97;x3nlklZ!iX~Hbh$fjB}^q3gE&|F#9iXMOCEfS;6k>2O8kk{jkoDzRghhH@ zhrgeO_61RN-a@)Phfe(%M;1WCg%AwK$?xI&Vx%Cj^li|?qSmvtqH#PLH^3yLK7t8>v$!@)-4glR2#lgIxYWZC+eEMv&2VgialJ0w5smhk zU~Jk9H=!iAxq(ap(zbB6AFxrXGtObuyvSKqpvPLyHlsveJ;!}W3(m5D$scoe5f?&l zadr@So$)nirI6RVen!L7C^DF}v_J<-G05z(ki(p|03h&poE-yN{K8pwyv=sDw^=U6 zlJuU)@x!oCBE}9V*$e`&gp#pP{+f`RFYY4Gb=1QoJiEtvN|1R>A?y9w(6Nw*NaK*7Hd^*022 z4o4fEj6zUlBd88P3&Ak&qjl)Pu@DeJw`&Tl@*>>v4EW)EEK+${A=}4l7P49OBviO> z(E%{xpkO<55Us$GKcP9W_77bD9sUHWo9M0b|D|SY;zJBpq>d^#EtL_M<%GIOL!YCcT5egZ4LJ(j&0Ouzer^#(`)hEc4Sr z&IW(W*=b-iXpdA!4#P!B2)6DBwh@?ub0A?C&ckKxG51@8VBG&b2CqY0t;X)d=fgiB z@(<&PbKUVdqXsgp3{DLA5rYemhNzB0rQ0Wm_px5Cf0Q5N$N35VJwL?1<3I2mev1FZ zJMeUVgxu2L@WD3#{P9_(7T4&#D+w!Ai5*S>>&__;&UsTP`2( zXMJ+deEuT8WmRQ=SvRcplKHUumtfs#`JE-`2-`6>q{;@>lsZen4L7 zZ}qk=$}SIEO{$&e=lDIWI4jA{@O!M{)_FFLUt}Sy1iQd~WxvS2k6A6Pv-0G_){OuE zrW#u82%pD)TK-+ava z_8!kdw^|6+xMjcPL1>?kpJlJNcs60Y%L6b0Ra=B0Cp>y_*3eXRXY|oZ5hbu7%NlOkFh$)iA7cpbA8l%{2xp265v!hnX-h3775Gz{{BxGV_e3($1BUxOZeFUlBbsPP-^

8^ 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