[ccan] [PATCH] stringbuilder: Functions for joining strings.

stuartl at longlandclan.yi.org stuartl at longlandclan.yi.org
Sun Aug 17 21:16:51 EST 2014


From: Stuart Longland <stuartl at longlandclan.yi.org>

This is a small couple of functions for joining lists of strings
together.  The lists can either be varadic arguments or arrays, and
delimiters are optional.
---
 Makefile-ccan                      |   1 +
 ccan/stringbuilder/LICENSE         |   1 +
 ccan/stringbuilder/_info           |  55 ++++++++++++++++++
 ccan/stringbuilder/stringbuilder.c |  71 ++++++++++++++++++++++++
 ccan/stringbuilder/stringbuilder.h | 111 +++++++++++++++++++++++++++++++++++++
 ccan/stringbuilder/test/run        | Bin 0 -> 86267 bytes
 ccan/stringbuilder/test/run.c      |  68 +++++++++++++++++++++++
 7 files changed, 307 insertions(+)
 create mode 120000 ccan/stringbuilder/LICENSE
 create mode 100644 ccan/stringbuilder/_info
 create mode 100644 ccan/stringbuilder/stringbuilder.c
 create mode 100644 ccan/stringbuilder/stringbuilder.h
 create mode 100755 ccan/stringbuilder/test/run
 create mode 100644 ccan/stringbuilder/test/run.c

diff --git a/Makefile-ccan b/Makefile-ccan
index 40d0389..cc865ca 100644
--- a/Makefile-ccan
+++ b/Makefile-ccan
@@ -83,6 +83,7 @@ MODS_WITH_SRC := antithread \
 	siphash \
 	sparse_bsearch \
 	str \
+	stringbuilder \
 	stringmap \
 	strmap \
 	strset \
diff --git a/ccan/stringbuilder/LICENSE b/ccan/stringbuilder/LICENSE
new file mode 120000
index 0000000..b7951da
--- /dev/null
+++ b/ccan/stringbuilder/LICENSE
@@ -0,0 +1 @@
+../../licenses/CC0
\ No newline at end of file
diff --git a/ccan/stringbuilder/_info b/ccan/stringbuilder/_info
new file mode 100644
index 0000000..f2780e7
--- /dev/null
+++ b/ccan/stringbuilder/_info
@@ -0,0 +1,55 @@
+#include "config.h"
+#include <stdio.h>
+#include <string.h>
+
+/**
+ * stringbuilder - join lists of strings
+ *
+ * This is a small set of functions for building up strings from a list.
+ * The destination buffer is bounds-checked, the functions return failure
+ * if the concatenated strings overflow the buffer.
+ *
+ * Example:
+ *	#include <stdio.h>
+ *	#include <string.h>
+ *	#include <errno.h>
+ *	#include <ccan/stringbuilder/stringbuilder.h>
+ *
+ *	int main(int argc, char *argv[])
+ *	{
+ *		char mystring[128];
+ *		int res;
+ *
+ *		res = stringbuilder_array("', '", mystring, 128, 
+ *			(const char**)argv, argc);
+ *		if (!res)
+ *			printf("My arguments: '%s'\n", mystring);
+ *		else
+ *			printf("Failed to join arguments: %s\n",
+ *				strerror(res));
+ *		if (!res) {
+ *			res = stringbuilder(", ", mystring, 128,
+ *				"This", "Is", "A", "Test", NULL);
+ *			if (!res)
+ *				printf("My string: '%s'\n", mystring);
+ *			else
+ *				printf("Failed to join strings: %s\n",
+ *					strerror(res));
+ *		}
+ *		return 0;
+ *	}
+ *
+ * License: CC0 (Public domain)
+ * Author: Stuart Longland <stuartl at longlandclan.yi.org>
+ */
+int main(int argc, char *argv[])
+{
+	if (argc != 2)
+		return 1;
+
+	if (strcmp(argv[1], "depends") == 0) {
+		return 0;
+	}
+
+	return 1;
+}
diff --git a/ccan/stringbuilder/stringbuilder.c b/ccan/stringbuilder/stringbuilder.c
new file mode 100644
index 0000000..cb2bc2d
--- /dev/null
+++ b/ccan/stringbuilder/stringbuilder.c
@@ -0,0 +1,71 @@
+/* CC0 (Public domain) - see LICENSE file for details */
+#include <ccan/stringbuilder/stringbuilder.h>
+#include <string.h>
+#include <errno.h>
+
+int stringbuilder(const char* delim, char* str, size_t str_sz, ...)
+{
+	int res;
+	va_list ap;
+	va_start(ap, str_sz);
+	res = stringbuilder_va(delim, str, str_sz, ap);
+	va_end(ap);
+	return res;
+}
+
+static inline int stringbuilder_cpy(
+		char** str, size_t* str_sz, const char* s, size_t s_len)
+{
+	if (*str != s) {
+		if (!s_len)
+			s_len = strlen(s);
+		if (s_len > *str_sz)
+			return EMSGSIZE;
+		strcpy(*str, s);
+	}
+	*str += s_len;
+	*str_sz -= s_len;
+	return 0;
+}
+
+int stringbuilder_va(const char* delim, char* str, size_t str_sz, va_list ap)
+{
+	int res = 0;
+	size_t delim_len = 0;
+	const char* s = va_arg(ap, const char*);
+
+	if (delim)
+		delim_len = strlen(delim);
+
+	if (s)
+		res = stringbuilder_cpy(&str, &str_sz, s, 0);
+	while(s && !res) {
+		s = va_arg(ap, const char*);
+		if (s && delim)
+			res = stringbuilder_cpy(&str, &str_sz,
+					delim, delim_len);
+		if (s && !res)
+			res = stringbuilder_cpy(&str, &str_sz,
+						s, 0);
+	}
+	return res;
+}
+
+int stringbuilder_array(const char* delim, char* str, size_t str_sz,
+		const char** strings, size_t strings_sz)
+{
+	int res = 0;
+	size_t delim_len = 0;
+
+	if (delim)
+		delim_len = strlen(delim);
+
+	while(strings_sz-- && !res) {
+		res = stringbuilder_cpy(&str, &str_sz, *(strings++), 0);
+		if (!res && delim)
+			res = stringbuilder_cpy(&str, &str_sz,
+					delim, delim_len);
+	}
+	return res;
+
+}
diff --git a/ccan/stringbuilder/stringbuilder.h b/ccan/stringbuilder/stringbuilder.h
new file mode 100644
index 0000000..0d02dcb
--- /dev/null
+++ b/ccan/stringbuilder/stringbuilder.h
@@ -0,0 +1,111 @@
+/* CC0 (Public domain) - see LICENSE file for details */
+#ifndef CCAN_STRINGBUILDER_H
+#define CCAN_STRINGBUILDER_H
+#include "config.h"
+#include <stdarg.h>
+#include <sys/types.h>
+
+/**
+ * stringbuilder - Join strings from a varadic list.  The list of arguments
+ * are all assumed to be of type const char* and must end with a NULL.  If the
+ * first argument is str, then the contents of str are preserved and appended
+ * to.
+ *
+ * @delim:	A delimiter to separate the strings with, or NULL.
+ * @str:	A pointer to a string buffer that will receive the result.
+ * @str_sz:	Size of the buffer pointed to by str.
+ *
+ * Returns:	0 on success
+ * 		EMSGSIZE if the resulting string would overflow the buffer.
+ * 		If an overflow condition is detected, the buffer content is
+ * 		NOT defined.
+ *
+ * Example:
+ * 	int res;
+ * 	char file_name[80];
+ * 	res = stringbuilder("/", file_name, sizeof(file_name),
+ * 		"/var/lib/foo", "bar", "baz",
+ * 		NULL);
+ * 	if (res)
+ * 		printf("Failed to determine file name: %s",
+ * 			strerror(res));
+ * 	else
+ * 		printf("File is at %s", file_name);
+ */
+int stringbuilder(const char* delim, char* str, size_t str_sz, ...);
+
+/**
+ * stringbuilder_va - Join strings from a varadic list.  The list of arguments
+ * are all assumed to be of type const char* and must end with a NULL.  If the
+ * first argument is str, then the contents of str are preserved and appended
+ * to.
+ *
+ * @delim:	A delimiter to separate the strings with, or NULL.
+ * @str:	A pointer to a string buffer that will receive the result.
+ * @str_sz:	Size of the buffer pointed to by str.
+ *
+ * Returns:	0 on success
+ * 		EMSGSIZE if the resulting string would overflow the buffer.
+ * 		If an overflow condition is detected, the buffer content is
+ * 		NOT defined.
+ *
+ * Example:
+ * 	#include <ccan/stringbuilder/stringbuilder.h>
+ * 	#include <stdarg.h>
+ * 	#include <stdio.h>
+ * 	#include <string.h>
+ * 	#include <errno.h>
+ *
+ *	int my_stringbuilder(const char* delim, char* str,
+ *		size_t str_sz, ...);
+ *
+ *	int my_stringbuilder(const char* delim, char* str,
+ *		size_t str_sz, ...)
+ *	{
+ *		int res;
+ *		va_list ap;
+ *		va_start(ap, str_sz);
+ *		res = stringbuilder_va(delim, str, str_sz, ap);
+ *		va_end(ap);
+ *		return res;
+ *	}
+ *
+ *	int main(void) {
+ *		char my_string[80];
+ *		int res = my_stringbuilder(" ", my_string,
+ *			sizeof(my_string), "foo", "bar", NULL);
+ *		if (!res)
+ *			printf("%s\n", my_string);
+ *		return res ? 1 : 0;
+ *	}
+ */
+int stringbuilder_va(const char* delim, char* str, size_t str_sz, va_list ap);
+
+/**
+ * stringbuilder_array - Join strings from an array of const char* pointers.
+ *
+ * @delim:	A delimiter to separate the strings with, or NULL.
+ * @str:	A pointer to a string buffer that will receive the result.
+ * @str_sz:	Size of the buffer pointed to by str.
+ * @strings:	The array of strings to join.
+ * @strings_sz:	The number of strings to join.
+ *
+ * Returns:	0 on success
+ * 		EMSGSIZE if the resulting string would overflow the buffer.
+ * 		If an overflow condition is detected, the buffer content is
+ * 		NOT defined.
+ *
+ * Example:
+ * 	char my_args[128];
+ * 	int res = stringbuilder_array(", ", my_args, sizeof(my_args),
+ * 		(const char**)argv, argc);
+ * 	if (res)
+ * 		printf("Failed to list arguments: %s",
+ * 			strerror(res));
+ * 	else
+ * 		printf("My arguments were %s", my_args);
+ */
+int stringbuilder_array(const char* delim, char* str, size_t str_sz,
+		const char** strings, size_t strings_sz);
+
+#endif /* CCAN_STRINGBUILDER_H */
diff --git a/ccan/stringbuilder/test/run b/ccan/stringbuilder/test/run
new file mode 100755
index 0000000000000000000000000000000000000000..0b135d15f3a4785a9b31050a238974e6e2ebc968
GIT binary patch
literal 86267
zcmeFadw5(|c`v+2vgAn|+e#cK0Rq|aB^f1>towz;NygI1Gx6vWjpR!%os6ZCEi6l_
zX5<SYA;bwFgnQyb%cU)GDCML5Xrb+)CA1WCDGoif4Llzur9C|<Bta%=n*yb23;6r}
z-gVh)&x{<}bN=|g=gB12-s`^ByWaKQ*1OhzYa-oW6^VG}SMA;6G32jPF}LZ2z1=~c
z+q`b?V(&I at i+8P8i}V`&Gx<uN%~eRm&pe|l=vCvn3jgMGdg=3OozFZ?>wL1km3|*-
zR4L|(kw^r~v9C|wEI~Ydc`?snb_l;m_0yDN_gL;3UG5oO&OANcfAcis<JkD`-8#MW
z=_8FlU;e7Rd>wwSIKgrc*Q<om=l`RkJ at aH<{_a3I_VZ``nSPGw_Ev&Rw}yv#5{~>m
zxN%k9i>ddY<*#XP+w|1_&h~B76OGeTGYiKWk9Bu8cD6SaW}8|CUUjI9ZR{KzlWGn8
z8PDIP__rDVHsIfD at b7i_cP0M49{-54uf at Oh_-B4s;Kj$ktMG3l{#}lLti!+!uihs9
z(LXbtr8u@)r(a?+;>j^x<b(;TH{jp3_;(rpt-(LyujxBpv2N6lb9D{=t<_<cWnPY*
zY404~T;r{Ju$ytr$3E^zeB;Hs*?&9mN8kCyw|wi*zw at D|e}3=Phu-?Zx2(PV+aE&m
zioa^qYSx#@^v8H%A4`8-h^Q2QWQF)2A>PNo(%%3g2<OrtVN$97TUUtZ_$%e_Um^aw
z72-d&LOkoPRR8D- at sF<%e`<yJEtpUrX{Ep372<y%87uYY^DD%EWrg_J72@}-(C+(J
z$o~-H-SvT>{O-ixO8q>D_)7Es7l^OJO1<hfA8*0$GW6$Ctj=K_Z|KC|BTF6P_m<>u
zL;lOKYKFI}Iu><R-_ZF>>;E0ZGk>!t3ZK>s|9Kt%jIPJ5dk^$!oaCs}D-`F)=Z<@m
z)3f7;Ca0$J-jQ5kZhmT}IO%1xg<@{}P<H&_q3mRCYTBDyD2^Y@&3gy(#kr{o7M;$|
z;4v|~Q1m95iZbKH<8%4!{wykFQht8kn>;!{Rm^*n3p2JA<U5wjPEO6_rl;PVmtGv6
z;{*9;=TQxN$oA)p*~7W18SluX?$zXcKF?-QJXg#gn<{$Q{6wypL)`vCK@~yN%!H|A
zys*HAro3!wbRdfk<qu31iuw7`f!^uanfz#OKSo{5&B++E<GJbS{TMY$A2>Waqq~rG
zD??pq^!6j!5nWU7bgody7gPfktKXSU?dZ+6Hnn-?t=+!0Hg%}!tpa=H45=soRy*&^
zV^Y-HDug2?|B(s?w0OhR6iDwX at 8=Oo`h2;BtG)Ylc;U5EAnjG&BP at iUkrNDl8Yc6U
zmIqAy87()RzSWm<Cf?xLr%U1u-alCqAH7YLf2t(j;QiAj at dm$5In%BQ*XjC9{7WR1
z_<c;*Q;T<(=Y7(NXPWt)apK)|{)`jv(uHLwo_yN;UUK5e$Ib6$C!W0B{9eArmsj#(
zyH**a^D|zHDvb4_PQ1(O>zsJQ)0zJ&C*Ht_ at xBx9^7 at z)Z+JTMH#_m<b>`RY#Je)Y
zZBD$A1z0BO#A}q2s)n6-SI*h%#Jlpwy-vJ4Uk9Cd%2MVx=fqQ1GQVR^Jmo0!d(ere
ztYv=hbmA#{nct&MygTpjcj76-nP2k6i_zp#&Biw0OFnX at ShM^BQj#aW6#b&galT_y
ztM8rPx&?pNUvnGY7(U3vbI+W|Z|iFr<|;n-l!Py1m?(7ajD#;{n5c8^lM=3Cm?(4Z
zw1oe?1z|3YbB{{+`wVkQoO at 8h-(#4lbZ$<<-)5L7bnadWe~V$F&beU;f1P2X%(>en
z{AUakRn9d__zMgZMb7yW{tUxJjdOJp{ym0?66ZV#{}#hUg>x_c6cJlL%y1pU&q(-#
z40GzwJtg5^WSC3z+!+bKi{T9ne^SB^G0dqycN*cAe at HEU?dOt<-%g%*_NC#`^is{6
zke*yx`yP30e=i=(U1;}*laCVq$&)otGUeoU_IoT@|8jEix#WqL*B!08=Zl!gb|zvX
zzkkp9XLSBkDnI*S at _+v2>g3`VlAr(Ht;xt!$;B at xzxLAwDZf#b|2oTmo8=$eeh12V
z3)d%4Y`=zYV`#5<NpflX4G1m29z9z=h(Gsyxh95)$Pd0a$zRj at YaYfBJ)qL|ry5bL
zcnv!Dm(8kk8^+jwM5C_rPu+8F4=Ok}f<KdwvU=d;+~WOzoLpS^<V135)z%p6Sxmg#
zat5P6i&cQYQ+Pe2UY|~$Ogxi5S at S6dPp<tvJU&DCVqBlY!}~P<EZ+r`TTFa)De=|C
zv&*{y`Q*v5XE^ke+aE>=mFYu2Ie-4d{a^JKTGJ=jK7?pg%hV^NzLOj8!+Y{%$7P_j
zpCihvQpbUPFEpdXuqrX)lt`%(&*0&7W+zIp*Ql$B8PKJ1H2ugKX?PQ&(C`{Oo**qq
zp4?c)Tqip|fQQpCwIgZxC1gX1zsAFqcna?*aeyTV0M*sMz`{`tZ+xB^7Du<#q55a^
zdlc{AlK0EEU_8HzS5*5+#++RH2|OwQwhC+80`@0Ab^&`MN~m at dhzDTrl<_^Fs%7dE
z)IZSZCcLA!?7TBRAH9|FrB#W4!!(!@FX0^}-oX;V`2G=uLZib+CBxcZ$HVj*bA1`|
zt1jIR8fE*<{sjn8KpB<k<bOB_@$-lVIGFmxCe`mZ;T^q*g!@f$CH=ltm54hfx>bq4
z#KY-#r|viEV)aCb5j3q4VhT}c_}@WAp4hA!{%5=+^E+8hfQkPEx+x8JsS-~*B|fK0
z>}H7oV4p<^3>?cT at l5>FB-_cwuNinrzGdHCIai}s0ibS2oeEGB|Ly=PiD>kfsZZ3a
z{>D}7PvhbA_g2&2D^!WAoD%C*iI1{G(BHMvUs*YanE`;RN7EWmIYgo1uYvqNaf533
zNxTD4SymGO>dRm_0;p}O#A8m0Usfd=St4loy(qDKBj|i`Y3${RWZUIJmcTIY{I~Px
zzw$+)TW@=jGH`P7vsZzZB^N(MhLT)7N&1*xd}K}@Cy(Lr at R_2&zCQ8b`uc%K*Vm7o
zUSEIDC)d~K&#bRM{M7pTg=f~+-~Uo_ at t2~=>QKN(k_fk)Ir|71*;VM;*+<&()+_ at Z
zt3!cq1d}Hp8Rld05%Ry}$&<{TT$0L?OR7&xkEkA=UH)Gvy!c21vMkA8WMnJu0FS?H
z2YBMe=H%l2%b?89Bp1h?PA(2S<@8S|^ipCux#T5pN<3YRCr{k}l($fqTuLD8*<~LU
z3F%(K{7Igt3adX&P4|Ta@<_QQ*7{e>{e^#Jw;9U{o=Qf(AfZKur1;_&k~acz8Ct9p
zEG(Ux&!GxEH78!Y4LwKQ3*dKSPon2%N_u`a at hp1cCC?_7<++qNv*ew4xw)_fO`J(C
z4YOfHEuJCITpByGblJ(<Av=woS-kj#D|Mb|auG{OMJE^e1Ue*M0wA9D)<67l)~|uF
zfx}x&ET4OyM2@|bJh|{BR^d}mNb3N=yTGIt6VINw|5<NglhjarU2<sv00E42W&&!z
zlW#!v@&8=6U-F6<vj^)R-b)-wJX;FmyME-rc(@eC>BYpS%i#Q?jPPvYC3zAw#d{4{
ze*7;2mX}@_R1mF8o=BVlTPlIg47lZD;>8p9zvwM&Rj_#jVDnNbZ2DEc7b1@$)2F at l
zzjP*f;_#;<Sbw!FTm0Zs;>FStEusrw`QrL(MAU&S;xFF+V#yd#N+gF(kP9{aLm|f2
z+!XUU$0QL-asi3xk{Y#W<C_&!QfG3h=B?MWEHLKtpCKjw6Vfa2tS>?uU49P%vs81p
z&awpIg}AWz7es-6m3XTu|K-n70ABv5AIcI6_2vIYoF!M!uz|%-acV(5?v=-XnOuD~
zCWONZY$0+5P97px36QHty4hd}x%wqVt{!1!ni71G(%O<#=R)=Gf8dOy4zODM>?Km@
zQxx1Wo|m~WPDT+(FaFGA7lfK}zB4&`9Lckf_^1lw at Rn-sxX$-ZoQW*fB=M3w at mUtZ
z8fif<6nT!7jCV!ytjBwjH2 at ZDLQm@7f1iBq_!_5SKtVD*a%TO*e=03pjr at WpI%QD+
z_rk&D_W(LVIwfNLA9(Bk0ECOQYyBU3>;Le~R+`trHanN6UNNUHIWIZ;2wOw5-V0YG
zPe{EH^oTQs`X4^C at U9b|l^n$e(@|L^(M!xKc?8Q52%WGIMMRvCY4a9*q}*y#HemEi
zHUGRt!+9AmOEurZU#aqHo9~5xMwNB~{sNstHPtrxt4wyF_KVB_eHRtUN;|v!87GH^
z9%zpl)y<n1K-+7c+pP0{`Ez%phUH(9LN$LO(O?WF`}#jQ1Ej@@EK0X3!002W?R}=U
zv&&z7>HPT at K-O!%!#Ek+?NC+~QCW{lmTLYDDbVPW$n-oj;r$}Ke+%y~tj5c4+L9Y=
z$#0-q1K0ISHNS-{CzgS(kK;wrhF&K}VyWi6NRWz8);tZ`fr?Mod=oEApW^ySE}fJ$
zwIpjQzW9>r=^rA4>gmTR78(>hyZl%G6g1Dl{mv!@KC}SUvF0%qJpYvLBFHkavt0D}
zDeAEdyv|vZ6g8GViPWWy-$rFUPpyCCEm#IiH6KR^SbYP=tls>knqO6KR{${@ZIAyQ
zQscR_lu_x$H!Rh>898MR5;ou0nUA{+OEsgap2nq`e)V?oQca(Fd(BeKEvD>RXk`j2
zL+oJ9wUVXSzf`kcWxjc7<3_wK)vUqao-Y&{mNrHteEwSBtN+4M&A;L)-S|ga)h>49
z*MNFUHD5z2hKR;Lr{3;d+W4n<TdMgZ{O$R|k=vIx{;q^SfxlAE-`RSqQO{D%2a$le
z7+Tu+PRaN#lkp#H#&1EaeW7WoW>#h0y0q~g$(l7;zi+dCf>~ERN+w&v_-^^f3(VhA
z&5cs`!nMoK{{tv>%~c3uj at E(_F8_DP`Dbft5u>PEn4vQN%6Rc^U at Yd}moat$-)8Zu
z`6_K<hOh3%2$pX`7thxG5^}Ji&yl<>Uny~U9e1`Squ)x0mvy`0ldqSeXarq3TXUr;
ze{%beL3I^!w4yMCl4Y-W73u{irzzswHhBY*)k^)qi(Fe_06d2{3xEm&%JMq_#HE^#
zUSnZ!2(J}jFoFh`yU^Cznp4OTz<}+Gctrp<1%<hRX#jXD3;#R1a<*nPRQRtXZi|ki
zTy%E%cOWR14&x2MFy8j!GpPCh`@%@445LgK8GXS{$lG3|V7n-+ at PA*b5{1n{tB_Px
zhlX4w at Rg*hlXWEKCxtC(DdWEHiIlM$QU)10D)e4RE!E7uUNhbUc+vb#a~{bj4B{vj
z>C)N+b1Z%VlIY3p4<JUNcLw!>B4~*K6#m3-i>v}M;c-(Ru;SzAh!thvtU>Aj|46A^
zxx23Rz2zp1Mu}`ST?q4cwx$DbTvru_`3B^-%ea)kovrzg*ZHghC2L;9D<%E6ESImM
zrxCYeElV{YKvBgn-lyK8D((gFiIa#~syTtb;6txn+IU>TNAY*@YxSRBd~z}I!==Oz
zU+|YU9*~rK at HYYubw^2#QXMLBp)M`o0YpR1Z at d48#J2}lpH0XMS}LvQC*S4J0(0`C
z$;Ig{Pp20rwmg$O**JTp4|C7fd+|sv-o53iG!mE7i^VN3r5E3_<z?t at -Rb)0;)~}~
zi$6+!{wLL`#c#Cy&GJR4Gx^9r6kkjGc6#x9>BS%QEuN2`zx;2LC%za-_Pnt0z2wr}
zTcEp7Z>dW!O>DU;jW<8NRNN9vFTG_;Gqy*%p&vfTse!%Q+PcNw4*vWabO+q^Vu;@@
zKRWjrG}rR=7ye}uDk%0^^wvrQyKKjf9rKPKKkn_{zu(K{a^8Ht at J4@Yp~1&y^wi7&
zzF*8pfBSa7+1pz1<`-s~#+j8RxMThEF_pE!-=tzU)qCUou})Ph>J^K;m*>x$;LlW=
z7|86*r0z_34L)ma at GI9V@u(U7Wp_&&R<THy&2ns>V?*0NjJ at pHaet~%Sjc-VO-)-T
zF7_Z{dY+HpzS#wTCU-bL;UAw}nD>kMLeal|YvKAPl~g!5yD&X5bA8cYDCGT_g~R*v
z^96r$cHYU(;)N!uZFheDxIaESGr3Rz(3-rN*`n{w9`d(Ncz&Z#u=$()(V at N}fYXcd
zr5+t&Kl<TWfKF`1mOOe8+gf<z)<Ue_&lP?6PUTTSJ*<hdvxf=@AIdwePfVfM{ye&r
z_os?z9R2m-i2y$YKR0u{cu+cm(O#(hn-<V$ZW8VQXsJmum*w~8rgJkh?Bj%hso?KN
z6Z5$lM&yqb=X0iDxSy5F&CX08*M&{7lJWU;ws4!9on%YIJKe#Ob}Hs?@;Jl5VboNd
zmA?4Jqf_JgYcD1)G;=~Sho<H at A<S9GO-V*H<2S2uUMr|@{gJ$X0Mm&|m{yoQoL8{D
zm~JG%vsnEb6{ca at R9Do@qk)2I0CKz+d0q8QPvJ?~@8<8EKYul- at vlC6{``vwfBd=g
z=lc+z0K=KUGXXySFrMe}{0N at o5QDyiXE#K`XYqUoo~x?h9|zHX3!eWI&ptfQK#88f
z^Fdf*9>()&JU at bG7UIH}@ce5$pT+Yu%zmq?J?~Ahg>J#~3CPZUc%Ft_K7r at +cs`8h
zaVS(D!SkzlehJUJe~kX(IgRHk802BamtW+~BVOcKUF3C_td2e!SzX8YtMTt+80QTt
zi~Oye--C~-%74|j&!4{+<MY<l^{>0?_VsIyMj!NUeeF#*v~AhM3Rq_!{@n|>iH}cw
zUESNOde_!g|Nbg8E$I_Te;I`T at A33Zdez@DS<)Xy^b_ECp9!UZ%BFt=@e~^-*bh^_
zIvX+de+kj=!@PVwRQ}Ix`DYQIhD13OO26HvuR^`|A^qK<^mo|wElB?^(*G=!{--v*
z59z0X58uH&1pWKFYGxpO*zZxO>}T){(*MZz|6#=c5N3_Nq53nn{*NHN0eJL|Q2IkQ
z{YyxvS?A56^aY##EYkl0>1RXfU$E(`fPe3W`ERB1Z9)1iz}q3z6ZHRf+y6eK9|j(O
zH&p+(ZT%BSZwG$&htlIV{b8iviS+k`(tp9Ge+21&PP2F at y;st=Anr>@_pojjnST4*
zYu{Znx$d?Tt52 at _h3fxSRke2=&`j3Fi^z8n`Iz1Oi2tiFZ}%epwI=e_=c^ES6#}n9
z;8h5`3V~N4 at G1meg}|#2cohP#Lf};hyb6I=ArOXuJ`7>b-<U+23ivb6OH|N1tzXQU
zi%YIk3ADlSXU_YWGbq&E`7^q?Irl at m3V$Yjl?r;F)XM$8{Pg at RquxoI41P80;nl5H
zFW8Tg-;+9>_CWql=?=qVLVj22CmeZ0KV8gw<`!S#jZNWYUEbK$baQf6mKi^$8#3`R
z>^1Xe#_^youcPJsEYsh>Klqt^F#pN;41BSzE8%6G0Xr$7ba-`0_`^CK=0ypcc2w>E
z=l<Gr+9g%~m7f3S_47yiS*sD^3jMrJKRflaUq5&2=cIlf(a*Q*=P&E$NA>d$^z+O5
z`B(b+yng;jKWo>ij$Wak=G<6G_w9K}6K~FWne$=hJeWy;rKc%x&V}vl?R}#k+nJv!
z&d&PD-26nIX8!i3uBNue`4)e!rKzpKpPR}zHaB%Nb=0dA at 0ClnS18qh&MCZANU;ph
zX8yirkXr at qUzPtNq^kUXtPhqgY8cv#`lSXrb^VbOSa6YJz_uS?<(h_`&=r`1Rljh=
z^QvPvBV3)qpEUlh;vcNv=<5HDM{Ng+UsdJ3AMdMkH?n at dR&DlH|2mec39VY)*v!yl
zk``UPvpWdYc{Qt6Uy1b>jaGGj94$?@AXiN!`aibeQMLMHkF>TIgQ|(tz7b=nsjB(?
z1dg1qs=*;t^rYtWO*l{<{f-o?jdPT7*j`tC<1>tju3nASkn3C5GuK5}p=+4+lE|~W
z0E61dUm{>2 at D)QR5EtRvUwbVE7^$tsYxSvjKClj(Y6$*MBv+q$@PW0FH!}5m5`6jo
z^>x?<^deE#SbgeOAE?XCd6A1Am(b}4yh|U8A$OfLXc{`93E92K6!}}UqFT6=uT`h^
zss=9owuFY)q4G=Fm8w(8wclKi5|^^+s#CXNVC>VyQHC#xd=L{Exkef?4Se?sq~Lc3
z{~|mEuSRx_u1+<34J$!)s at ZGQxIX>XbsWbvEL45!lW$dnyq1HkIyHLP at 5WK#Ce at F<
zb?D({Rpq_t4Uy)O$e&^AB5l$e(+h)XJ_Zxv$rRO_woq@{LcM7-y;=L@#VFLyQtZy!
ze!N85RqDrd?>bfQ?pD3)QoUo3*nsx{)=QQ5GTx$UA>8w*S_ozZCAK0BzdKNMF927i
zu(3*EW0k_!s_1GWWtBq8DutBQ3Ms1;Qm%Re5U6_hepIz;Y8J02`HF&EJ2lbT=r1rB
z5u9DU>Z0a<MlgExK5S1_MZf+&JXS^jdIpbZ^eexPM_u&qj^W`)FGYVJJmW>zW$}D4
z5`E1bd{#w&<s?86ef%wK<L?fm(dgUILe#5`{wr#}h^?(sYkD={aPgJ+!+&euiUiD*
zEap|--H2Mt#k|V9713DCYq^+BXw_OS=2hO?B`vy^i`j(gyj5xq{}_p at xC(2&(a)-P
z?#5nQ?T>l@(6y=KARPaCm#+FVZ$jwD at 6?r at J&n*$RH$z43u6fVRE4fu`v(l2S0R7h
zPk#d;FQS66b<bkZwGka`UiStJskTZ7yVw2xFC$p3gSV~w`W^&pbTGLt4{y`jS{)o-
zckw8Kt95Yix~Blh+KVDb(e<j$_pVFrLvT&xehD62ck_o4TpLlNnOnDnan at d{gT;0C
zai|+2Q!=_^>(<|i;FS>o%&Xq~U}W9QuONI?WI)0XMb`Z~JMx;y3DjM^`9x%0oVC3^
z@*WAlGqUcjtnRu<QSv{E at Y@jH7U4`(Z+?Gd-P;*%*5T8Ubtf5a(czCp*1ebERvrFi
zWZkbY+!i?yVfjx-)(t(3aEJ81dh;2SKZ<Zy<O9+^wzbxuI)I2 at xuo;wK=o at MCrH*#
zzZX#-R?zX*Ry~B!uPfk0*M8*?LjRY7O&zfCHWa9h&ZD`DiHjVU#=Y7oQA1*X)5LB7
z77NwJf*}pBTgGHZ;t{h-*8nN`Bb|<X7o{%!zGM)jJ$1KN*S{ADsffw<KAry==HCJd
z^|HysMP%Tr1FgM`R4&E%s#C-0CRaw?pS=fp?}(V9xz|XG-fdNgev_@@4pvcp>irLF
zxSW+_xPq!rf#h$DyzO!1%thEIQ at HQ-s*=;JWFsWu%VrND55ZJ@>c{tAdj10}qN;r9
z{!9NF_-BI4_g^}QQABdAulm%>_g|X(ZwT&JnV-2|wLf9nzv3>Y=D9|yPd)m;<>Ovt
zQU%`sz!mNHA?<)__1zD6SHAfe!e5S<-mSVu_0j`iBUd#};4dynGO>5-)O(qF2xEB7
zU(exfmEg`r)#=-ORr<A&U&|u?ib%wi_>L}lh9zGYsRjB(nj#SseUC2a1GtgTqT;KY
zPDu_95wqmIF7gSi&qyK?F<G}<tJ->yMP6bN!GnYVy$Xo%y2$_FH13Z?OxAzYMV?`i
z_FCMVBdD-Hq5z4Bd;=$PB4QwkI=*>7^3FvfrtJ33s at dDnV&s=u#|+bNMQrt{cR!$N
zoYOTvsB4_JHNIwJ0p$upW{5gy;pyK(%wi;BYTmL%wQ!m(e9QK7v80zvwodQ0k#qMV
z?*}nbUG`1-$=h at y*IaxAe?J<LSu!a<(K+sAjz$P#Z-9vNG09SOYQpm)RiL|(FRDT&
zv*D0uSZKd4^ryDa6(8oTZzghGRPAeIxMB_GdW(wOVj`=EhFeu+%tT%~jL7Q<%8RNS
zOyu|PK;-o*ve`u5`8XnDDze=~9w8v>iRl+rcbmu$a~<8l3BIV>Tmx~%?=K<pM%DUl
zCg=0NhR6mL*=Hi}0)vS(s>q~{y!H?xSN|r-T_ketJ3#GL|CS1DifsPaKCs?@yDy5g
zi>ilpiQ4EmA|SX$wyxW-rh47$)?FI8EK*ndfgJ!OP7hbFd*hm$)}%H7ha!>Gh6r9(
zUF)SbY+D0Xy2V?w<`xtJ5#11}Ubkiq^D at iowYFgQ#b|XsGGdrIKN`H4F|2jXb*K#d
zxG8e$C919KFG+1+A8xDt<sFx>vb8m~vMN-z4#BAE6oczYMC;l^ahEosH_TF2*Ja44
zN5sM_jXM}vb<pQkE;MS?kZR31R<DW#!;i+$%GGNzVl}#p4d~Vw&|MOS*V-_=*6CnP
zY6HQy-ZYGX1|ti>=+ZEZE(^nG17UP|7)Bc}0P!orP`a{71MT`tY@^_}x+^tKET`)=
zx-dFV5Wlv`(=+R4#06oteK(#JT&>5VD|o#giw?d)4?_p933^e2Hon_HN!qo+0B^nI
z=1Xvu(njxkJT|-Wf*=D}N>$#+$QdL5fq9AGN4&xR<KwxRZOV^w|H9NXuIcf%EfnT?
zliIce<Kx?Kg<7_=y>V__U#WIrW?`Es>f5Gf#-|r1@?O)n3UxH8T6CUmh2w=#L at 2Or
z|5P!YybY~{v&emJ;iz2Ua9Kp-0ay~|r^Y?{X~GXt4+(yw80*ap6&t5!Zo$}*VIntw
zpy?n0!}p2&q<MD>9weitf8`XjuEJFgxMit;S1^yse6F|v-4r2^8PqY}I5(eH6(M3A
zZ#w7E+4+eA?ps1m5cNWFVLuZ<LFAQJ)Je$HjXd&-63oZo)L|Azt+-%mDmPQ|jvV`s
z!;kZ5ZcgPlp~jX at 6;a4f=f{h9N5Abm`!aQ)kY{|*2xE^I4(G<_XLa}IiU;TOxe2Fx
z3c4tU9vy?PYi`<fZ+?DeR>k8+DS1VG<`tF^^NK}fUO`mlwQ+y0z-kZ%(Wx at lgR81q
zFRSX=Sk<_p>W0e?MBg4QKKGS{AADsYdS`T3bl1M<U5HpX;Z?1ws{J_rMyj at 4#z$@R
z&wl%d`=Y-s?~}C)(bEUY^Hje%`lQ4bYd^X at dUy2W&n-N>@WX9YTOcK)3KsiAdGnbo
zdRguCEnp{+$oqi_Ro*|YxS-&j8OF^3#eepNCF{_xvT%K+3rbduUWwzghv(qPIuEn~
zJ_zcYsZ+SF at E(X=wjvbrA_cvi;yhxUKy35M`VMj_$z@|I*)ERoickfe6 at dt|B7ii`
zijY336+zVF;!rDsD9P2PmjUuw<VR)p9q|U;(IY3MkRK5NhN4_{XV!KZ!K1uc%^4^z
zKs&6e0f at 7}%V}I%rXz|I0E^0dG&fb8oX#EK3PB4D;?lI at f({#aW2AcNqA9!X5NqF2
z*sejm>)ecW)*uR$tU+WDC-a=@4(145Ys77GIo;WX8T5NXrOwS3rjBK2=X6qj=E&6i
z?95 at 9Uv+m05IU8s!Qh%Xl^1<BxP%l+SXh=uPptmD7y0<}(S4_)cYpu6s?8gse-u3s
zy<67m<yfoHhpR7%K2+6=rF;4BEq{}%cgu#~`@v&BsJa2`c*A2i$g+B<_U}$bAB$dj
zD!Spj(TBeoz2XPaYk%-fRP;|e`ER1PRIiDC=rIX?hKuk~{HZSTPi=Jjsqdct#k{25
z9;DS)-MDdCA|I`N?oYlFeb+<JM>{3_Ary&Te%E8shkq^zKVn`_Rb9XFE(EG-Kg6gH
z)&3y*^kdO)wLDgxiGIJj{^nTp-iN;X*l(XX9nC(peCJ~r^XbPQdpw%`%<`S5qn9s4
zkKp~|CgFf2pMG3}<Vu3%?a{YawE!SjDQJ9R+w%o!doLSR<Eo8*S)%;f=pElhc9K3R
z`-4wB9)0^m%a46GdiO)$lPn*qJ^hX!MAP>~KMTtB&~qnFEo>Ls#5??O`Dr%mw|LpT
zL&J%|Y-VU|q&JaG>>W)E_9gmosa|HZFFU$#IN=jhvFZ^uS-?Gn<1 at u<5tsGh;yzg9
z5!;vOZE5Y!CWbSq^w1zHO*FQ(^`((CmKq#wYn5sczc2$lW+9r7vsoDHv+>cPfmCmH
zPj50lk{!*ahkAEq`$rN9zm=skiEJt})Z5a6esYboCx}NYJJp|o_+Hf8)7skB*45hF
z*4f?B-qqF7-Q1OC>jOi52~;YBKyA7sNYFjjrJH(Q>6hqiX>XSSrH4D)1#F4lp~1nC
zL_hl2=eM)~j;s|;WX5(34vh at N)7gO(fzjO5%pYLV)6v(DY#f!qymeRi-b~6%#&;*O
zJH}G!QRMGU4h<nav3Gccb7SCx#xi3A35iPg?MP=w5`C$WmKaxL!`%FAakc at sHRcNS
za&E+z7?d6d-#s)n;Y=6noSe=d%gxXGcin>kI-O!?`%*j6+13^>(Z3_L({JrUn$uEt
za5Q<r*8FUCG&wS~2gPu8ZWfm+j>JdyWwTx)o*qfW`}P4y?Q9R7C)`__IY>0w*4*tS
z(rqJ|QNNvyDpKck8F3b57C!|N3g8ONVfdm8l4EG3FENrG?i<bmt5b2#M_YRfaSLTJ
zlkAD^Mt28d`_rS at WITgZ&LMIWUcljQgTfkt<*rR7;ox4&H+#rFfEgJZ at LO8j)QrYQ
zM at LdS#zqs_;js}lb3969D#HDi2f_;?kxFM0cc}JSI!!(t_L(orf<YUjgK at Ob(v3_I
zf89l_=1L)SOH)gCPgh$@drwDOM^|fGOIK${b8G&__MW!Zw3kQ?4v!4&97$v{sEUJL
znAtzOFf*YRbANpI&`5Sih7=%IgoKO(HTmq!?9>d;`~V_ubk>i>vQA=sJxXy|3r=VD
z4fbYxhX#h at BZ+K$urHh06CciUEoZa46C;_F5Q|NsDs1u+y~$J>OQ{*D{e9U)dNejs
zkNWXv8yX$#@7s|Y&9DIwCbTe=8BO%*88W2GON<T1M|+cgdk^vza6AfZYoZWFCeE?O
znWmPmj`p7RwvOiR*4EbUu8!uep00djTX(;g0FXw9gmm<<!^1I%L|9+^i!~A-OON`3
z(CC%S6_KVtH5l|sCL0}OkNK`Ar at Otqv#Y(mxvQ<Kxu>I}rL(1DjKpdtpT|Ol5Pu{$
z%`zmNrD#w}KnKTqWwoUS(`Z?Mkr+VFQpurVzl&%-)ZY&@w=^(w$5>oZb)-$?CMM>?
zu#pu%5FZ at X^q><<b}xu>Je|lUF>#5J_~6b2*3b%UgIQ7;kS0<RL4y8tVsB~(ipNJr
z;`_1#iGdvnk~Xf;UcGAz0Fk8c!D<yy`m#6_lOWm876}j+N&CPTG6`Tv15^`Y32`Qq
zC5HGhM%`tQ$Oi)5<6q}Xcp#qH#fW<UTAUapE{(Ba%^1SV5r`}|!w!!mMiO_#4(Hy~
zaCmA)wWU(B{>?Z0EuHoLji_Bk0k5!nvi>dG(I*tC53<Bqx}KCGu{Y7{a}B3cqoaU~
zB2A<mB#=Vc6TPFaL~Wtlq9F`Co*4jHNcgeMiUrgwz^5`h((%Dvvf7AN&O~F928S}k
zy?!fup=czCen2DJ+c14XBgxn;fdv;NTTcw`O%3^-UQoo(0`#Ul3KDm-{qYQW|0|$9
zNqc_^PynW4Mu~9bA4(kYflYlQ1AcoOD at D%Xp-gHo-ZLUE=&FTRDP9ngK|0B9GpU`Z
zHk-_fyiNSXtY&%#{ces>tua+kTWeQmmx5i%#HfriAV5PzjuvT at nn-qX{Gf>W#8F42
z86HCAU_P!$Q*H$b+f|^6NuSsTNe?F2Sql9b0IGKoFbWp*n7g1!*&GNowe++$_q29{
z$~1R%x3qRp4#_um^?L`4v(x#O&e$=a^D&{>q$CwFoe5z?XUr?(xtcGLb1){&ZABoW
zblBb2M+PJ0hWz%9u at ok0P#83(NFTfPd%z5K$FWW_pkN?Cn9h9}MNK8BIWTI17B=hB
zGES~wVLAacwCvjwP+{PTFc0--hatK^MuD_73Mtg@=tSuZ at C{-Ys7gRR_hmo{(~4Tj
z1R<ZH1+89Ubnobn%s#)h(<5|?vj+`;vD}263=NM$SPgYe3n7p+Dl-O5)qXuyyhR)4
zn`}#`o;52LL6Vep-b-Xlfru(Hib0giyqE(e at x&Ujo?AhYM*4T9(rLe?jXkq$s4$lw
zCrT><3>+}s=DH>dI{0b9s%SP8%VW|Xl7a99xbjm1{U6Er-IV&sAvqCx(PV`_I;&~N
z&`>(Gl(Jd0)$I^9R5Cj`iH<qC$#lN6-I)e(aVrTbIdFfF!9cgOU7(v7PJr-eCKkwY
zV}s~4q!bqz8pdX^mH-1V2ont)OU}>FWOLI;b1)w$xr%3%5$Qv?a--2oKgjs5l^1=;
zhM9#_pF2*PM>&&=E)CJEk242M?v0Pejx`*w_mBCTH~YvY#5CJ$Xl-kAb9ZwO$otTq
z!35;yIELBQ3~CSNG79j6QTlDNGAMsRFM|x<+1`m^w>G!5G`CTR(bFgjnwrBvhMa>T
z6q(EAN0k8Hh{4QEEX?I%g$6QOtZG07IwS6S2dBG_huCo>oJ-fg0ke%W<zTag`kQ<$
zBtWgr&mfNV at C`K}Q-dD^<Gsn2o5>$#IaN(P`Xe^qDb5JZlq|)<H~K9o#07B_!USUO
zL8<HSZodAepzPuNVcgKq63Eqn%+j3XM%nvC9M&M|8yce&M4*rZfx`RUAQ|Apqa%JN
z=$uHkAi<C#Mby%&l8{VD!Ltjv3%|a#sTE|rtF61E8xO!8l(e}A5^FOqa_|c5rUxuf
zv7xY*11-5!&rP&-w+k6IBFE37<gF}rVE9G at 6guQkp-Obqh~ZWdj5W4(iF`Dg85{N!
zL&MN_ at HUJAF)y&$QB- at p#Ey91$Q`{xtSR?pckCNYh=xHy71Un~&w*4IR;5HprLr+s
z1mp0J%;Jpw4Z5vzmITx;8-$O at klc#WA`#5zkIdpe1Oy?<fUi;|NhfwE(wG%WGN4?8
z*<x(4fd-0tV_%_?C;v8Y9>fYopURiY;n at kUp_mj@(&Ub at ekgLy9Z<CUflUC|&<MCp
zmzT&4r(nHlr7BcTLqeLs0zM>>n-6R{gl&JH-v!DHO)#J*O26U2I0nNS4hn04bVgfE
zPme%fW;dkfQ`8(D7<JXCK*F?YI9L)!0_Aixj!{4-hbjp9jf)822m+`~n~tC}XM15h
zK(X}T2xwG0TOw-&@!JWNEFCD{4y)e*eIy0(Y}6OFXUr0cHMTUjwtHIRM6>$MOY{v5
zux^la(EQ%mc)dSPS~>=a1q#?Mzm158?{By~2uPAiPz)YTV&<3u#VOzg<w-fU=4H$g
zEuC1Lh}P62lf<OTng$4z>N7dfFgXELXO1My#QHHr`#K)QtpP|B0Fax+=oqY4aj3{G
z&AKll*OoAJ%q~i!qlgdp6PsBu3XB)YYtXO>B6nB=YSE%}z&eLVP+vbF01}7k?duzX
zUgdXlCHD^vVgiY%gl!l&q8#@zyF*X{u_h4mN`_FvhKEPuI|t&_u0%_xAxX3*4FnWs
zvz2X$=vTnTgb5*|8>j3bIz_0y!GDcUqG-K>VWbtHIg(RfHHjT*n08rHD4ww1yEhx(
zkuqi!OlC8fi6xnSPlr-uz+A?9Aq}PmKn<XEVzm9hq*VVt&Gk{2NPK~s4L!^ObQ#gp
zh7pI-kfQBMj0}Rjp}7>ABVaR#g-*B=Q=N^cQ#%I-5)cNl04PDoq-i-)fqez(7sg7M
zzosUSXYqxa at ggJvUr7aJ0+c%)_%hAZ<ka|7ZkqN-N-~s-ef72r?W-MY_67ki{XlC9
zvD#+XYMR at 7z;fFl3UxPkcjU2S1Wrr7y)Wap8B(L|xeDlEMg;XdyAul!kjW-SMh1sO
zk5P<bdi)?LI<(xuq25f&?`Wn76zoZ7kMPquBxT?uVT+63)lA;SzL(i6jW#m?<Ktds
zii2FSTLx<(ADEWPEs?5C5f58>dLUp(Q7yNY3aly&MnN7-rGO+WqpU^4E=S_TV|6Qq
z0L`n3S6X*ji}+>{#d**-lmd0TGchs*+ExIyo0#?Q6FvzGRx^dJi5ALfN-)W0kIYWz
zirCx4?8Y{YPfy(B&*$fE@;4!it_Ns3l=0u_Z`wY-iL%>7b3N{d+K!tl8EC0zQVs!$
zZpI522QK<S`&ltJZ4-f$F~H9Wd<3a*sGe1{An$c-##o}H!*?~`BUM6JoSi?uiGrbj
z^dNf37BD)Y(GJIO$+87gr7aGWotl|-N+Lq!5A4nzE*$W+9jLcA4pTND5Bi%)^=5EY
zmIC+KU}|p<G58e-lhQ3YbzHJmmv&XTiWEQuAXgi8c3>RUPVqL^OhO5kRtM3PLlRaX
z%sF-ur!Gi<AU8BM!<+!xm)ISLVv8Z-E0b!u8*_p-)?)2J8i%;!cM~jXA4(a#VvRN|
zoS_j40kT*HnN~?<CHA}6gl5%d_0e{q?FnS$*3^+2gcOw;#ny;)OePFiH9dP^YK9O~
zhAhpDw8)<55nC1}aR{^-qC{^JOAI0MJgG(mO+7Z&0<)J9kb=>;k-?Bad`3rL>VQc;
z4iyDTUyC=9#~!zrppm@~>L4}>I2YhT-0IF2a|aMo#t310IS7Motzzwn#rU|+Z$36T
zNqbXsbG?7dEq-fzz5f>2L``CIvr3l4?$R`sD#p_aX-t(gRLU8l-I%}^Hb;SlTMm%W
z0GLF4XFSF3d)p4;ax7Te7Qh^)w;jwKp3lK&VcWrj<8$JignGsT1GE($ESd={tnAc6
zre|rX(eGP3xSf*841?oQ)^DYuZGT=t#sCcc0uYd|1b&_E0>2WaH-MM{r@$0{7N#K~
z0J0r0Kv#lnX})$$L^z+B1C`U%S3Xlr4_Y_*Do#w0QL at 24zCt#W(PXRKs_GfrHu)-z
zLgiAuH2DA(!3|}2Twzbv7PKbG!7&)ZVlkx*)`L8YCgej##Rgvnx`mJ=Fl5c}W$j^E
zU{@$RhfmYtnzg{5;Kche&NvaKTg%f3Qbr_!!luY*a)^6bhB6!0+tJ)9Eub7EUPTjH
zTiUzYyW2Wtvy?<x3~VLBugLH5Q8BD5Q at YmVWS3v+6xCJB(XzkjkTz^VVLuKV-0>Zd
z7HRKlCc-N%@`BQ#Rm<YNu<2so(*R8E<D(LzN1Ija!{o2G3n4$i=$0B%(t`pJrJE9x
zDVCB{qBq;o(Ibl;TTDVtIawL(%XQGA7}5Y?)B`bq_5;l_0g4G}8P#jkTKRxvSI8K6
zS&`ZgwS2N~Pkf{w8eo5lyDtQ1ApL0LO$j#;S<JEnNO{W6^}lK53XELbgn}4kY-2y0
zjSHfPHG};urYvDHS)c3-CohG-Ddz<-y9kW6QPJR>%z~H&IyeEc!|g+{O=OZ|nzLa0
z-(`AAVS at Prvm!*DOqO;GsOjWXz(Jq8)&g+NYeni5xU23MUy9K?)3T%tOCH%HQiez}
z>G)3UB*5!LS#wn%jZy at W39cAmBQPF}_?yPZH=&P*x&_IybOGUDkUju094TsD>*Xmt
zKn!8NtCJ`d5qEDMoS!|4iXaidU?Vh2BnqKC(9RO^QMe136)=%M5|;0*^g){yn&wz4
z&;{1*Q#PK?=O(EHWkv>|Vs}!-4pdp}k55Qff+*EZm4MDogLydybOCRm(f1B<!yZ*S
z5*Rn;s9Tg7>t{it9Min2Dr1cTmT-(DNYF6fiYf%HVI8X0lx~fIYo8V1qcUadO~V$&
zb`?W4d{&$FHIdUYHy{XN0yB})$pkUf?uM4XDmWHt9Z%yJHZ3V&CV()#=r}sqN*RDO
zLy6Y{AEi?pxlQlMGsT*y4CcYwzB`^ml`UcoF`R}?U>_Z3F4$FI9vc`MP57PEs6>98
zoXF#Iu&~1kRCgvuhvQJZX){AP*zU2TzYo4jv=g#g7^DQ1p&0i;DL`j^=mBbPpPdIB
zFj)!&D=6lng*H4i+&eTjI4YucxxTvt)2RRq1*|tc671TO&k6|)R3<7|rJMKL{RgO3
zp+|cA9?VoW0s(QD8^kez4mhC1t>x3B6aZN`R)h`b>II=tl!EgnxJ3Q{FaVR4`HN5k
zJj)G;mZn2N1%R<(5?T(j6B5>Kq$kSWq8bVBlvmXB60NYM_+)ED{*icJiX4xfJd{7~
zE-R5&t<WkK*_IZAT-XM}>eM_R<*k%UaY6XKVUHy7dji_h-rCdN)7jP9(*ZMt(tt>>
z at SZz70aQ_{3}y(-^*=kiZ`tmbPHxx;!fzmRMWx{MCzhq*I2;wRZpA~Qo>b7GKj|`v
zCusfhJB=V>T<=h9W_D%<0%L40H=jEU-yWAX8hR}`FhHG$VjR6GxI1d?<s^XwmPle1
z1vR_Q0W8ZKvGD*wYk?aDj-5_vtYmc*z_4PqA+^6Z$t?@E#RbaMx$+jQ4AQiOy83AT
z;nD|XhsIXw66JCgWD3{;tZ#>NwDlgyW~rXIX$nGa4k|Xn(ezR=UY!&fLIguGY^A4(
zbI>rx6?VD+e{{WLRC(Ag!B>Wc_10#56fR`o at KU$ha{}$-bYnWi1#uLqiR2z^D`$|i
zrHxXoG4-?mdRwif34ULlJuvdMcXz^JuA{5DyQL$4quN%3M-%W4v;}o3(hK*O7I?^T
zV_tJd!)El}`~hpdqD)H7p^HnZvN0qir^^Hfn=^s`2Qgw4&IM#Iv at mMF9ZC|)gC_(p
z at O-^c6PUn*Y}?tiKv2((+Qe7peiA>uI_Q_G at NAeK5i4)?vy8DQ%N7?@?%v)6I88`H
zwsx!)*ome#x}h*#8XSrb4*4Qh9a5$!S>hMq(4-c6H;T~G*r*8usEFE`<|?vFwo=P#
zQEN9Q7X}Jk!g+C{xtQ7%VWz3YI9EUrAhCb~TB77Zj@^|2JH8#fO9TeP=?7AoUP2u-
zf~^JQIiTk<FiT93ne0G`L7m|x2I7HD7L1TfOBP5VNx?@A`#>XD5S~c7pg!p5j<KDB
zd;kk4{etkt035AJa}@SnQ>F{b4l+G7k2$V2j%m=m2ICj at Brw}Ov`avybp}c)4#?ZO
z>CO`G+wFHU!_gev3G(C9%99S$RBzlYM8Bu+v at fcD30<Q%A<M!L4^)Y<piniL at B_u-
zak3myLdo}FaU2l^rCWR>jF2$Wmy(SX;#!FI^`<Fokc{`IhvK7Ry?Vv9oann_YzV?%
zt8g&@*;--kTA}L4e(4>XK!x=IZ{ohSZkgU26<TrcqxjMQQXC>c?{su at _DFsnr$&wn
z7s%n1ml{tSM3PZ@?ZE;`q32-kNFICXatus32ow~KvUE2T3qqU<11D2)dn~g}hU^@4
zK0f5iIWU`ZE1dh`(^;HEo5og;GzT43D8D$L!%2}i={Q6g<U+h7G>A80SV|jqOIbH6
zZd}qtD!W*s<PE0%a;9k2Ji!|={fdu;<I`E<sjoIq1yL-WlJQs~WsHo<^Uw&);_M1W
zMzOi^7VI}<d5nyNM@#X+?yYR3%1AkJiUxASZg3|#`{rXPV{Fe>x9Y-2D-PlC$C1GQ
zm5%3BOLYR)2RvhaI=7+%<Dgc_lzAUEVh+H3oSzR?wspw>5RXt_Jx13Yi_<n){1k8U
zr)0~;`0H5H^Bgx~AbPM8lsDb5>14{xaFd^(#uqa%U&?oO6MP1b`dhji{H;f^&%+&|
zdD#RyA{#c``e899zyyHesNcBt>`3ec<q657l;h~0xGysh?;WvLtYG>@Yzd at R9;uid
zhx_sc5D00?PT(V_7kCHLRY&#|9F#IgK*G7;{lr5e>P$$3uY81IiW#J!DfC1;5XZ)u
zk-gCoFjNaYfXo%&f!$qfBKA}7Xz*1|<wmOQ)?(7OP7Kzmhi4AZZJ}6NlS=FrX_ORN
zP9X`Ji%{l}a#-kOw}reL1O|ES28w$&L!atU9zSR#&}|ftR_0&Fp<Nbk$;xM;5_3g=
zCRqN^Mi$14cFz$a`(3T~01aRp9)q{1)F^Bi5*jwz)OJftQ+snuYfpE3XM0;~dv{A$
zGrav<^NsBt<_M5joD}O1Yc_D9F*u^^Q2n%3`I{OKwE2w(4ovL#8~1?T;V<>1 at ghzX
z<NS|uZ*JTJ546TY@%VJUQBG)0$)0)Rp2PUk4ER|%uZbj+gbKv01ynnS!yZ_rjk)=$
z;z5Lu;+aRK+?i%N&x%a?jeTL+VS5XWWR`u<!9txRE8~7L;UPaqpF5d6UxJrF`A`Z*
zC}TD&6qOSw)mA=YLi3#JN at jOT*^Jb31v;cNL?)~7WQ&?R$9s2;jzF<QQK at -Mv_>r;
zL0IX>hMG7aD}VAqF<<*JdJ5ruO03(z!EOp$@@3>UB|a$im<Ub#v#0~gm)nu971mai
z=fV8JD5Y<AWatfqb4??u-En9FY1pjLZz?CfNvIlJTCkI<wWDOoKrj%yzeIY0vA}j&
zIuJ633M at 5aa29A!d%XvGo-L5=i&UT>&a!*=@;sbw-fpzQR;8>SR&Q3Lf!#(-H|R8)
zp=|I<+ckFI#=c+!M;}fQT2rdDa8%$>v-2@<u6p0HFh=1#2;x*%;GZGZB&Fl8>`zVu
zr<ygzp~B$fA}FPqKssg5CiWQ{>55f^m(1v$m;-Uy*L$o&YXkMgDp#EyIPit~xd@#t
zBw~X-oq at 9y&|I;Yd29_bDEFdyHVN!xXfVxPX$o_)KD1B0yK|(#<kZ$|H3$$f9%AHq
zJ6R`KdBy+{Y|+}y9?}ksN*e at Aec50nEcIj~HaXTe<=cWIgY0doAnm&vvg&fkIv^;m
zD+JRZ%0YOftT;C{j#qLl5%vpO*ato-alUM+Qcobo5-kDkI at D_gHNyA+afJjhQe85d
zpCKF?^uhzh0e}B&p*aS-5xKMxgJ$=?3HLULGp5h92A*t!!5=<;ZR*wpKL&Scxj!LG
z4`*QsF(IU-QViWUF?cI<Qo*{ATbvP$^#&q#JjZ9}j?)C__Rx)n<N;+KZ3OshEoNae
zqnd%K1M_)Yp+VOOC9LWN>gWr4DRPn1+LG`)T8UW3WhiiwWDM~N!t$IbihXd$8dV1O
z9;1aTYYgTiv<PA6mnnizQb-Mn!=;A0pzI;Y6e$@9loGzaO>Ld6*gD0rDL7Cx_u!mi
zXKN>f06B>1fVoU;fm at drbF}w{u~fA;^|Uv4c67FPbmJUrduK;`drKFOEVi~Qx3p2v
z-(7w;S%B?{mBwOhTI4F(%0u09T8(yPM<$ZlcMf7hu7U3!Rs{@U+9qjt9-OmJ#$Q%=
zVGOfTZ#kmlCWWSCV)su>PA?SbI?RPQ3eeHOl^7U?jjN4wLH=u9KCO2)<-~ID>;wlr
z>i8sTMo9}JHYWOLOT_jDcs~V$g|JEr{iTdCFiJCqz}Du6$O?Cpm2ZrA;)#>5QbC1y
z>K!IM5XV?j?osK;>zuL+O7xYbdDgHKyF&n&5z+xz<Lbl}O}HsL5jRgAGNtXeU<i|k
zdCnr1YuH~&BhmRFlW_udW~dYR_94X^OdjAt@^0;In*Xa44=~yatv0qoy;TPbtiDG8
zR?J~cIZ0jCzmDfMo$xInY5uK#D>O0CHh6PkO06u17daTP0}Kb%gO!n*BbQK^kjt9o
z)7n_V93|XSRy_`D;aCiP#s=cU3Tc>i1wzH%1d5<0q1<B=t}1<@Uf2ssNbTz?$B+s>
zzOb`PtnNIzrgbLq$I_=e9Jdn2tmJaSH05>zr!nV%Fc`=5p|U$10-WXIpjTY$Acbq6
z?)V_8BYp=By4vR+d$jSrFvOAh8f7tti;X6yjx|^<Qju%0B#DQsJk?7SK=Y+?pqi_|
z>bRnn*ew5$M at Ry~IgB#q;5|$<pd<7)hACEUn2 at 3o5dyi*a#$$BIDq4zt#KBhffAZ0
zP7@^d_R}q>gPDT!mVpt&)@4y&2_)S1pm(7<?@RDyl91aKLsfpSST=HSz#Ke9-*ExP
zPTZrA$&L-f%cM`aYs&Hs9e}|;uvi<&{EWANdyZ$Y5*-nfr>KiQXuygGh>@smTj(>7
zmhUR3Ux9rQd4!@*LiPzZq1mq?di%S?MtzGC%hQciYMx0Fu_R+{mBIdpTVx^+q=F!`
zg8PD-EcGeBNp=Y>ms?2DM=LU;$3g-EYxw|<t;2&oPC8JM1RPPC7tVL?+Ua+awBn2l
z-S~0$Pz<U at Ag0+kXV)L%mGxOD^92ytWi-nA))a;&wCE}uv?O*VyK6vuY%QQTuq%VZ
zWo>+cFKXQH<a8+Kca;pII`qnr;aZ)9Rjx96bDP3MAlOpm#hnr2BZA`}3)97l6Iv;o
zOh!<X>!%M$1qoX7cii~NV#JXjhir`WsHJ7JE-TOychO;SrdP at A7nENyDdN!z at xwV9
zib=HRL<4Y(UDh7sgSwEQ%Pf}q9>0rS5^+nGV97Z;*VKz)nnQ9U>D0h0tgC?mZu4Uz
zdy{gqi4+LNv!GN!j*vnerb?k-af=Q}8_euDQ4f2GV#kyP7FIfd=0ebyTsYnIGoMAX
zcu8ujyu=`d(`Q3n<PivgehaTf0PnB&xBB*Yl^{n*+6wJxqT|{-TNDy!dmu5O=)cfs
zz(7gx$PaDlm6at0HzSwG9;Sbba`m>BcpTwNjl`0vhBUs7oE~cMlPOd$z7Lokdia)X
z16wCwOIPTP%&S&#%a)Q(IQ_(6W1n%Rl3W2od>iHR$wE217AgehFbE$bG|&g>FC+Jn
zAiuS2(L(`Y!AdRpaUHWm at Me_WXb18NJ&+bCv;eXxo>(ELXVGAPSZYu{BBJaxkLj~|
zJc6cmEFZeLIE9pI^N`sv_TbbF>^ChPau!uiI68h}FcRaYoUGcYhh!p4U4_skqMCSJ
z1f1O^lrngym8RzI_EuPyyI_*Vr3mfqZLrefNDoduqo?|Mg<wi5aSGbEtVa!Ckk~Uc
z#%APzk$9VHNQE(q at RQ!S`;|Q82W?D%Ev~xQP2<4@`ZijKb5~ekozVidVPlp at qUx{+
z3VqZMpCm#SrA`-$he!fAl~i4&;sarQC^6Oxkit3x5ktCW at 1{!A5G9rbTvnO?uWhU<
zqY?<b-d0tZ27blcfFS-rK*I4HZdwCi at M6SjhJ04e9F$|D&<y1dNJ`lTt9xrV?4+H5
zY)5N%cSjHIy?`GFF7)99E07s{H`D7_L~*YYF3B6mI^`G5r;o?zEaP(V{4p%6Vob#=
zON+YrNoEBaIoQ<DfG>_F1hU<$SDFz|&hre1FxiZz1Zs(5(c9gFwk9a}IC|C5*3#YG
z3V-j;=GKlj8V)*Ia6lhi8$2G~)pR!mkx*L+jwoT|bU0yyHl!(sQk at 3#f>?kXmLT0H
z=_gGfmmEXTw}MpOgHxvwaOePD{pyHE_)LL5m(gtv-n6)IKCyjKD9#pso?8TzWw{C*
zt3+EfPJV}nA(As(N&GG`%-Dr)wn2H;LU2b87ivjU3r0qS*Z#g3C?p)^B5H0sF#QO2
zp`qX48Zv^Vo$?SGq~ve`=>gz`0btbc68Q?}YEyUkU7g-k;lO-u?jR2bV^^af*I)u)
za6SwJlq3#ysDDR4mw0bRcWiej9PavHg#|5_Q<Na<iNW0&pIKH)bjx>TQ|V!7sGuRV
z&q8V+RU1c68!P4Ua4~EVrn?0m``wAl=&=8FCvM2$T_p-`(1VB3BT}gh?t4%-MFd@!
zYw^Udl?yimB!><&Hk={+{F1Pw>kE8vHixM;gywL$4B!s)FdVi*At^VUN=XSky>zyC
zcn&HJ`hy7*#;3K2+{{E47tX at iDTU%-Vc07fg6xzYjoUtzM-vBSioAgx+1 at d6f}z1f
zCNYa+b=kxFv*Qc%*!(^Q-C8CR=lAltnT0tVg+9QWDsac=d at +Vwfr<^;$vL_wDhOt9
z%^%KgL!oQ&GKs`4`bq)=rV0ylbNTt~bZlH5`Lz)ckcc(0X|@9(iD-gD2XP$!5@}8V
zQ5I|3>lgLiOckzw!W0*zB1L_Ku#)2T?xGv8R8}zsU7X|LTepikqO^-;<+&g$*US{@
z&0rd*KK634NyZ?^Rg#5&l~7~cW0;?a;hF*k)ELut;La-mdJc{c49YeoZ*!2_w at Txo
zkC9x%iiBG_v_}i3c5)67wsJ4cLi9%-KL}?6e157l;f6}h-FPE?7NiU&Dp=56a#BFw
zz{X3bWGO3T*j<(=qt)sNx`-{RadX~IlEm=LzS95=bk84CNU6M=tY;H+A9V#J4X|<m
zKyF^nikAVVhZi&gR>{O(zZr+dB_LaPfDcX>@5pqZ*Q6hcjQEXM&cTp6!$Yb-VJhb+
zts`iFzB(bmu!53gZ*Dp_WAIm#qahfJhX!#<R5o@<Nl8W$1KC0R3CK<;#@j>50%Q!P
z?EJAQY?;V)yi&9k<`#vi@@5uM at 37hjZua!WKOsScJ3LwuR{PS at 0Cpx~s%CP4J#gC}
zrAcZmV`5F^*!3L36`8ylO36O~VI|G)BK;SfQLi#r3dwm3wsc$h`Qkzc-1!G5X96J{
zC53o1ch;5}PC~Ai0|Jsi2uh8-91{MU*kOjn65HOAr!>;zKGGqnn;Zcajs6Ve`8Y`q
zaBOgB42QPhBP;W+(s~1C<VJY7jTBcTTRx-jg|v{cu8L)V$JVWE3 at MiY;52RsV6SjP
zZC;is<y>J3a(^=y4WJ`pHidO;SIW at b2+0BCA!aOK5;iEQYFEM#D;o+Uc$g9Q1tZss
zzq5o at s~qSqoHTHXFz- at Yv&xMGAsGx;FkZYEDgYqsSf+VTs$ZkJ!8u~0jU-Fk6UQJS
zBj9wqtOCW%GFkHZL7aw0Z{&^_4ZJLOYS0Fafi(Oc!*OZcGJoKRK!qFHxN9nt5j(hr
zU3s*Ov5euBj!`n`F%}L@&1s%W4%RT!(A3mqE&-T~#TW@<eV@;au^Ey)?0aB44$?I|
zwjjS3an*62{yIV;_6>*wxtYOC5cZ%pK`bRgz~5L=6t$QPQU=RQ$9TLqX9`y?1thZL
zLSozsi698PeGlNpqH*4NIeT_8H#IH7%zm6NH7ku><@!P)5aDb;?$w#Whjbcdu!BIV
z<CxN7F|~DrIiG_EPZ7t#8hptNMuFU%c#1URv(pQQF%&iAy~8`jVxcfLHN3miE=dty
zl0&e#!{CB}V>#m_r1&U>gI*Tb49*_S&jWYCsnIqb*ojutt<y+JC`#R>)5q)YL5Hvs
za)t4!DOHkxuk#;hKGubE-`nNp&NTX5z-JsLa5k5CnG#b4JhC8FAA`_?=|k7b_*uYi
zDkmw)j0*r1Nl_2tgB9YayN!%tTcpK13W(uT4hx6p0B>II4h}UBClgwwn-F7 at 1@9oQ
zW^s3=PZZMcnhijr!|IWfuNK72rDdrMu5-e1A2PQQV4YM at Imwfy0zPi;myqivP!l$?
zXb%?jmsd~h*4cgxL{3nY;0t|gXP^%VPeb|m?tn)~Ep9|G3R)%s3c(n7)Fm+`c9|$N
zB8rcsMj`n at 5FQGR7A($EO&HJE*Km}~GOmiiSq|7n)C?n&!d7TZiTD8Ih|(A-1w9-$
z8Ur)Hj|^fN5*vefO`4(c4d-E9X}cxcr^IcLwxM3BUgYg?yaoX at H^qh_obMduX0s8#
z9r930`YUN^E9H^Fz;ednn>IB_ah(seg1#}3XWZRw)w5po30L(E_Ksxt_5%n?90#!}
zkM;yTQakS$ON_}~#WGrq#70Q-hja6X at Y#qJ7MH{7Dy%Qf=KAHnc at ki{+>meK>k-(h
z6q%l@?S^{XqJsF=Y>P_M!j<J;hGn6QeKqC?k_XZW10cOtE(oVoMku3zK#)Z#uL1!l
zEa^rfB)IfD6r?h?ts~IGkPZiv6ZR&v+>GI=NCo3?oRW5NuM4GKX;Q3Kun9_T6A;Kv
z;#wNos<d__`X*oktFb6W>RMXtr309Bo&x0_v{xVNb=nJSBgkFlbvu_U6k at _}XAi|%
z!n{?wwxbtb1 at L**%3BbWRJAyH4pzDz1hJ(G=_517lR{$Y1TY6mM0x_aBu-Ih=;d6=
z7}G#}X9}y~SU)zX=?bWP(agDRx}g<kCuX at 7C)w%UM-T{yu=qizPk8_Cq^biE38WGC
z at Q)?>EM|%1WTRJ-ozPp#)PZ7dj^LVxZXbe40hNyo$>|SGxRSg*V02(uK-h}g9C=e%
zAWekSM2E>LdI|~|7+y3F77`~m3`62b+)5=Z$zY|(se-WS3l)$Iwt$G$_AspvOAKj@
zFOmVKM<%~DJG=wJ0qzdRQDsi18v&pwA|zx<On82IR6u4N-r&j_LS)L*WVW>~ZNP7M
zX1pH<)->aDC^WFC50gW663ddRG4TnO4~k5bKP(ijEl-j_XHawq?6sM$h#01t*mPoN
zymz02_9~*JH?qGPm|!g7MwO66cfd4*n=qS?DMdYllN~Yqqbwy4T&@ChMl7aw(->uL
z%z^156e|{6bk%mxvML1 at mvfdTL5hPEIyEz;6sQs0#kkWhcpC!RDP0TTqN=436i2aO
zn}&`He~mD|S5Vs9J7#1A2UJe1t*At^w2)Hm;Hw#X1|7?(mfnR|<36AY7Be^2G@|^!
zY4HG at N+@+!NnT~KisX#qy9RW61yYlNk<H2;PH6<7RGf7LTajxuyE5XcMQ2(;oFyN|
z^&n9Y5QfbJ+<09SK1O^DC`rgL<5a6DNrhwq17+2{qk-ItcO9?IB|Q3ubz%n<5~U<-
z7zqg5P>dq#;-1iEv51B^x!^+C3hXY5h;Yi%yPtZi`ZRz=>kP<gfaC~C2SmO$EXoAz
zq{Ar$yVS}QGqi(;GBaZJLZw!A5Q~VpErbnJO!4~V6bbscH#;O3?<1!xn(BAOj5I%%
z<t;Jf;#@j<X$<dd<7iPue+rAoyr2=d-e7kavzy%mE0}C02}={2)eN5JOok3nu9ZeI
zyHdk at z;ad1<rXM5Qx?mXXf9A at EXeu&gK_~MuFF;EqrovUgcC71aY{{ATeS#E&0Z=~
zQDH3T8%*l7*JlIMeQ->`828PTYpCElW$UG*C>R%?6X)rT43cQ|DkTjqF?tBcToNa+
z5}mdc`*ox0b`R==$VyjVgH8G!-4A%|cmvPkG+;3J<Q<8%euI at -tG@dkWfzKVU}i3u
zkG-f%fdLkG0k1?E>=Le!!K3-Wig0pWVqhMT;b69jPq<WqU-r=RAH+x=Xm%;yxd6YS
zR6lf4MGVVg0S4Oz>_llQv#IfLTPrsHf}w<Ty;t0+LQQrvOXfw)nXvN<y(Rq-<&L!0
z1f<hywb`i(f;99{79_U7(xYY-`wo~)Gp{xzHPMeSJIJdAO?oIsX1{EUq*UaR492Kc
z#78veeJDP7p!gn<3`Ok3N}j||+AYzSIXB at bFN^QCNmlM<@iPf{m_CN1JYy^5@|Dlj
zfM21)GCj?&7%O?LXkZjvW-W~jYPGlkW);-x#v1yeaWK$aQLk3CQ;K^71Js2!Y_f8a
zG)#U)XK?JTF=r5TaWi0^I8_Ja#96jrquy+zBTmSP<CC$yvmJO05Q|c%s4xtnG&VuP
z!BK8y$q`Y&#db$XPdh5IUbi73UZ*R?1uha<xYXvMzNozF6pOOw at ahXI1}U|?;L-Sv
z9%cmDu;l2KfbKxEAxFZo2%<c0=M^MrZ|>o~I4muFsf=9x=mxkEjG^Lx0fVuDD(jlk
zzb1?G$H}!^lRJQpy;HPe at h}Jyb}$j+_JQFvkJ`~E0{In7)?2|QARV(^Wyeeaz;*x{
z5E(T&ncVc;L0p at Qda-M6k<HkYLQyVGkjm(}aR`=P9oXBD&25{7#B7B$K at jZHp-j=2
z{W`vRAg^?W+lvn)1^4%%lb|$%X2t4vA(dt8(vVZ9Y2vZkr_+fTHVwnXPj0{{l81F(
z($zqUf>R7I0y$8~FiW%l59oj^8=h;qF{U2Ze(8p+1|HwhD;kqVRCTeMktB>*WziMm
zuAGC at Rxw2;R0MR32R<{0qrCZrne6P$IM#q#FgO+gQqA!O>#<~qv9c^&0koB-JY>Er
zfwIH3a7Thr3&m=*{TDPJq9zC7Mwp(L2qeK$M}B-xt#3 at 33|Kq}2AE?Jp98UbtkT1>
zB$@rWeE!h5+BYLINYI*=VDx}R$*ZuJ2 at H2)S2B*ELOFDU-13y!1moag!9B1D<3ac+
zXjF)o{H=1)jIuIg)Im`CpHB2c2M2)7G}&P~EBiu;%6txzi>=<l1e}d&6btR6gg1Ky
z at W8H+0xS4tV(e57$8m+OMgHvc^u&~Vtsk&cVXGFSjfoL##e9es+i!~Gj-+-bX=@OO
zxF#hcf)n=k;665*wqz$GKz=eC2e&O|IJ~GNnb5_yAP;k6!$&3?m7)Wx2yS}M(C#%1
z6M5M9%ujW}-UiPhe7wN*8ghGMXDNiIwl`(T-X2~N3i-n|&*`WOV4oJ{g>UcSRsgJQ
z0GRCGDy&nlYOs2XM_H%CD?zQ0O715{DlPFok!a(5BIlZTd|ob8QLBm at T0ALntNeYV
ze?y=SPz&~NfC{1QxmZS~m3pIdyGA?F`?AweIRc|IfXxj$!`rw5oUrQ$k%h}B4e|09
z)2locWw*->2;f4Nm2%n4SXWGnqA+r at NPi!LsJ)W63nqrr6nq4IPLh6?cEQqJ{FU^Q
zILW7MjT$#4S188G!$q>o$su8|KC?e=@eEe=(C3I^m?wUZ;69KEDtxn(HY>Ej8C+HZ
zR~)?Y!VqM_mLOou?-i--cEmD at yG_c41f&b|TjERx#EE75W at +@pgzv|Wz#(_Sbwp^w
z0kJTd*P>5pBzI?Jqn&zrh22 at bOJ8YsHdw$RaVp?5di|ECVyjts%Na9A at 5nxU6OA?k
z*)geXBakEj$_y<K|77Ay_%7g>IW{qMKpQMIQB{w?GpIaTScj~Q5LXYy$Q)7JRc<T3
zdPwY1v3&aK;lWqX;ie3!RqXK-QTEFQ7?74wI5zbP+zV5^5~)<dwgQt3I1J`zC67^`
z1Yo5^G%dA<cW;AwfuHK+p8nvLnMB#)5&p!xn&C1<W at XeNrDle<DrD9|F{UQC9kjDB
zpwXMgsWZJa^}ECm$|-K<kT>kZ!?Sn}A0xnGlWlkg at xf}@gV#wiLCR+WW_l`Y>b5G`
zVN(Fr-ve^C1VV=V7LRA=VCBgQW+|mxD3jj$((kJ4{F1HJf8 at Ki3=uJ9RjKaCUN(wx
z=Rk~ky<n4MR4 at VXV+1R%vT_x&WTB}H(iL|T9W2%-+)Co4H+1>|`_95c9P<a!6yk&C
zbq at ClTr3-1rW81()hkb8d;*EgWOkuQZi0szac>GIl4wAZA!CT(F<=q96sVj4A%!EV
z^V4A{1na&6sVPa67FEY&|4%TAcCJ8sR#+B_6PP(N3$p}4Nrj#$-@}C&MWE?~rA at d!
zC?6_HL$Y_%tZ|ed_FVx-dEvUWRl(b%!~;a~QCh)N1)>WBBEc$1ix$Wo3G`p7NFw^+
z8)Rgx8f7abU at LE2{8+ at XhNabcKpZ(Jqn##>O;WAz1yRCYA1{1D!BWAnLY(TJYQPA+
z(&JDR&e`?*u|{575cDS#-p5-p#fYgR at jcou<g9S%rC2|G)jN3?2<~5))E<+ at vJ3xg
zvU&1K>%+9ag7?xZ7<AEQt5Fc7RU29v*DEb}7v1%G$1V(QAC-BiBq at V3I2ue6Sa{9>
zfs!}@wK4e+HrA5|?^IV&n4f$KtZXL206awANzwyyR%-qYI{=rbN at w&D0gbvg<jo#x
ziOHnk4}7~1<Y)LzG8{@({tEnT6dm4_p+mh<D&^azt%Xeu{$><>W2m55$$zGTfTywf
z at j3$au}!+H2cGJpOd|&L63*)o7@$W(2F^_YBz$18 at WHJwJfK$b(IG=tA}h|okQkGi
za3V at 01+XO&Pz6&FCR|ytl)1yp7J%W9y2Mae8Dk_#ExH80<**wZnI4{odX&V;s at ai<
z;egb917?6b=H`YPb!Z9;hly~vVzMXOJvnqi2)!%S>WEUQR&<WGio3aPtZ)^&b-Ikj
z39EEceT;;vAh{4t#yYGKxD{WkzmP{;$vV*cd@@Du`q1$L9ekQGG15!7AMq~;W-cu6
zh1O+QYFA3KUbj*w*eiDuR&<_1qH*KHhKyOp8k20;!$u+%9`Gye`atHa6!>I9T~~?$
zt26%w0c^;VYdC?qdb82YrSYwE_8^J-Wg2|giA#L9vIUrxae+nXt{vCXWYwrL7cl+7
zp>8zgk{nlUbk~O(rBEx!@L^U7292%t_&)3CEszUG8Az4rp=J|VqRsM?;-MIii<;-8
zcMd3Gs^2Bvdde}A353TL!kuzkrbA6RJTopmx5Mx<QHD2box)-O>Z|1g at gfw&NWs@}
zI!g)pp^&#HaFK#>1sUmM$js%QhoM**=)fIn*Vy2e6PDo`_M}-w5ac3A<0u`dDYO%~
z=Tb4s&^!f*m7Yha5GM}RWf_$QGG?yp at LAA?Ooz>UNGdvP!a#A&ZOq*^s&m42NN{8e
z#Sp&Av{y)A2?mE|+O_9c6t0v*QJz7x3kOhT4FsU3;Nc4sqz@~MewBRcFfI-ttIGqK
zToSbc@|D<F%X<`L5b$ZKQalAxgGqcGQ6YbYcr&qLC&t&pjjEU!OlDIp-MmGPQx6 at q
zKLt;Y+sAN)6gRWv+8)Jua7~Cl{ic*(d#<LFM{K0H5?^p5D(Ih#u>#?B#IO}pUHCX!
znIha_L8n5pz(#R+xbybzlFy+Few9Xs+X)f3uwbXBB5XGcgg<FfX}T7m#P)C$P+AL@
zhPE at Jbcb6+OyeWy(%uUkZ0)LiTtd2~w|TV-wmnK%9t~q6F1XN=7?hr%Z3o7{z;g0f
zDIINV^$D1Ts<d$BaECC2FOZH!t}Ib5*i1~Rd;{m%OfPPiCef5RcOzs&7|IzBjf$Hk
zUerKwbE7XK#tXSCtq6Ts1P+HZCP#Pzt8`i!KwU7;8kl;Qz0A$sjhFmpt4jG<*^sOu
zeZ40d(Qi^hFjvMSZxV-g;cWs3VEI_Jb|)!~l$=UOrF$-WYeSNT?NUI&K+A at la!TLD
z7AKSyrvf)xP`g|NrK*QX19gVXu8k26YVTg*B#+F*N{PS*G1yin`I3Z5NoC|sCRg)0
zhwy}A)JQ8iunDj#BuI%8za0TgNu1;ho%v>sZiJP3jPJnpcQ;=z#Y$u;slFtRqs&du
zEF6{s*5R#P@&-Yob0v at LKw!k)3GxKqGk~8eZgf}qOs=AVnzsZ#w?a{@;DhlQbnZ=;
zZp<P=x(Y;u$YeYbq`ToL+^Gw<FJU)Xb>A84rQ{6&OLqM(wc&dn;kw)ik)cF_0ekZ)
zP?-QxcBTjisE~9VP%0yA21YVXqCyGi!Dt`$|HM56^C3od=@vfgm4>X%oyI`jD~*&D
zKMD6ER4Q_WdH2T0b2HoEGt7TY>HvO7BkJ2Zg0HC%pUR_UH5vjLoQN;wG%AN#kAVs<
zj!j?yp$QKO8FspjfQsp?AfURjxaK%ln8i^HRjZi=$Q at G!F$TNDT}OmyJEsnxB?5Ve
z$D!KRDvKgGGurw}k2FX$de3qIt4_-}JBEhR@$_&qt`0!aYHViRihdNd%#rG_l%iAA
z6o&|~Oh%aeTKm1vLlMf~tMp8SiG^vyZkO5pEmE=}n9#-#;c5hX_E^}B*&Qt5Hlb)3
zDCi4GBZa^sCD#p#TRu!avAjA33X8&j+Unz;5B<*?e%!K(e}YHL=gkZka>785vSSrG
zB7`1T2>fE(9$e_H5Ja>8(ny)OjQA38 at yMHp?FfF17x;uv-X at jk-~^<MrtPF6C}%_J
zpphIJge^v0HEfm=)(~b7M>$4dFvhLW*b@*76n7?ob?`ld&ZW>4XK%oU<x~x~R=i=}
z$}urD?{C_M7x>G~VB6Fz9!-N?M`0uWyDO8<FKEQ)xb(ZAy8gI_wOa_gEsc~hyC>Fh
zueI7qE{&9&a><uDU1b8gzt%PjE+eZyyfY@{>1JtWU%yK{3B5X61)!UNq?nUIzR*DZ
zr9K&-qA(@QG7#2fxUY~$xv at -5$_+*4v^2k)p>8sgQ_`^+IrA7e0;>;WNatjQqPuct
zf+}lR?k-Ki)&{o=ob9)gQ?NSK8^%{H?ZF#>v&6GzZeboD6xC-h6_&vI0LbZgMNMFo
zm(3g~A9DJ}rM#s)LNaI;p$T<m!AnRsR<oX9XLrX$h0n60Q=-b7NjCxWO;RzN;qqF=
zSRtM8D1PryUjpBe$Kh-UFMROR$oL+!KKy|Jm9di20Z9hK^R!|<fGhtsd&mfFQ3wVG
zu8<2a!K~U-tL4*LmgLz}njTeahzc^C3UJpG5h7^{NA+Sa*}pP&F>D^-ETg at LAqZMp
z!3&^+-5PWOn_R|eTPgjMFmKMzTQ at az@DV+!d;(G*{|in)()G0D;1DTJX{7Ct+LjV|
z!W?f1sFqB-Qcw&@E5AI&RU#d!Ua#p=C0+092({0^vNep0v&;ra5Ehw9r0EMS2g#tZ
zhkF}>7W}?@SON{jNFMEH2R|S|sURq+^!b9ysxJ+Z9N{RHE5z8;MRpj8hrLpLT9YC?
zj+bE5S at sA(Ak5~0oJHpc=I2zBPy)TVyrS6~Th4}<P>YtY99h_fVx)f>Q?+w_=rDCa
zgN*OJn=GYeYgONOrPRz&jF&x9%<YHE2%Lg(^Stz*2ifHSFi*16`ksV7OeqigId~9u
z2*j^kxzvK-$OR1S3SZ!$NTaRV-4%Lm_CLxOc4-P*&yX+S=D2Q1C}nt~BSOnLu&0E5
z)k8ZK4qtNg40o>r9}x at tiW`#+?!hysmI4&En+c(=00h=kgYYl`HH~tXS84Yl9ZfCE
zaDtQwc6m^j2}nxVFcM~hEm>_BVYDni?TEFq#v&OE at kU#)R?q}umU9pkIiP~z?rzqu
zoQ%%M={S0ID_4w(DIOod48n2{Xa*)gH at p%HuWzi at F|3>TC=ADV8jEl}Oi+7A;Rz}>
zDEN#BHiJPhpVmqQe9Clgu6L7buTz66MPH5}R8750{~-1JSL}q^THqWch3(%(SXVPD
zHvl^OBi2ADV-nAHkPLir7zfPpvuiQ5D_{arhHhRCGs0FcR3nIoB^Q+$AI=MTit?JW
z1%7o;`Po2G`PuwJZ at dwbj63|WX}Fx{lsW`EJV(xbs1vU~XUhr8Ow#4o5>*obO({El
zt|LMV*%c82CeLO<5@?BzXv9y67ML6VS_q=J4~icJ1mr4R$D&iE=U8s|CabgfRLHId
zqjP7=J+;w6g>uSsksWrza at -E0Y(bjQxXG(@f_%JL$8-D?!itxXHA-{<5t`J}R(nfW
z=#}(x?uJesn8{E0`YOA?RK^Q3cz at 1~xZBvrfpGp+UsEV|CE>9sIZne_rvfJZmp5G4
z1^369Ss5U9GVSt$Xd}5w;@DAK#Gk^~j3EJI5*oA=j8`iKi%4AW@$(<Jr$3dZu7FRJ
zj_ebbpNBblc7|&y?16iqy&N7>uADw@@+W3(fZn#|Zhn-eV4<tJ$v=7!qhO7y9G$Qm
zThjdS1VqZ2S#in+dmE9D{+YV(H~NY286)L!YD03LfJTcHuBK~bMk%0V$qLDW)uY_X
zq9Y!R0GKy%5CkEijV-XY at vv|zBWi(ga`^rP?9=YoR9bb$d(29&B8K4>qW(eku|0F^
z7r$sDwyU_(X4I;+H;Y?^PBz;BhfJ`e%uxnGfr)&O!>l?J0D=@}_s>q?uHA;ohFk;g
zq=NHE`CKb^YD|Ut3?v;<XQ|c_je*PeUEt%8xYLK};*UK}tQa at biU1Df`Zr_pTcM7<
zMMAgWBg-9fQRFx;fz0uH^yB>EpZR<wI)Q?dKD$~L&HTY#R{Un9^jUC6fiHaG*37{O
zPw0Vn5u3`9BZO=#CL8Ku<=N1|b<+}AlJ(>?26OD2%N>G7;a0+Es-H{OG5ld(%KSHY
z<&Lt3$>BX?OECd8q&vd`nGLE`Sx{g#mYt{trDN={9QjUf>QKcpcVX(UCelkE-;3gO
z%l9tSWY~N60bkb{knncG(w)@MZrc(4u5PT+w280*kJW}JbK9`la#%SDt5jL8D;pwI
zT8Mu;^i|Bat`w*R?iI2qxMHe<q2Rth6_PZ|oZ5WCAP7q8N~%zWc-4}^Nx93!p4`xA
zXd@*jDB8}E3bxKrByKstYJjB?J+l`j at x`lf?R}XsX{Aq3s4*H$=PaW7F?Hfp>(w>{
zv=T`gGTrPP2rVq!FscYCrX;AkCRpmT7I~BUf_r`$Z$rw_#J$J at J1P~9nBf|}31tX#
z+xNW{kE9j&5fm^chyx{SRYU|8M|x^bw74dE_FT<e$f_YDDvvk%VrBFd&C%G=K>EY?
z)?uN_WlTI^r(FNQ^xq8geW2;9XmpS93YOx0CUE4N#6bkK_vJCg39A;c+dYp73x?Lm
z8 at 0!JNAayQ`3xBEymO6<Fo{>lpgMrdy6~M`_eL}~M)HI- at Dh2|sNYIn)mJ-L2A`Y^
zP{STmCS|NvpTh`((%t|*^^gi#TtYEGRnh2xUSk7;K338whKEl9R=S*)rb%q$tb`uu
zhdrca&ue++7tt?O-qEOeUlqjFnfGUG+>tu-{`WTSXjH%2he`XklgGS27sS<>_YdmE
ztGpw1=KWV}TzUN_?N^;V=KZlCuFkywv`RI~`px@!8&_VxN%N{rIpopr)j?dHd4I~r
z9jP<#U$b%L^=lA#x~twR!GF-g>`0w?AF^@f^_#R|Cy#m01aWod{aZHfNS%5A8yi<%
zze)RBCy#mmUqM`*dH;x=lOuKJ{Wok}dHp8sqfQ?4{+mHuoq2ypjcSzhYu?{!<I3wd
zX^T!C^ZxE2uFkygTpiSJ-jg=2ynd6Ga`Kq>bP!i(-XF7ZN9xS`X&YBwze#)C$z$F>
z62#S+_v`cuC49{L^){}&ev=k+@|gD<gSa~Le%i(zsWb17+qm-jP1=W at Jm&p3g19>K
ze&C`2{^tFljVrI;q)j<_%=>f at S7+W^E)ME9 at 2xhjynd6`=HxN&ok3ikd4F(CP``P9
zn~f{4-=sa{<T3A$1aWod{lFzb{pS7P|6AObhu3s<|KGjOIrpXnK}ZOhV~m*RASC9f
zc^)DniI71P^E}l&#MqiuQM9NUs;1UZ1Vsm4UTrB_YG~ElK}+lR`Rsd6<X-Z8-{157
z<9nYcYwf-E+H0@%S!?febI3WlvKQ at JV<~xbtaj>inU~exmMa_KWwp2G%3ic at jqS*z
zW3 at kcF7vY5QH7rSZ?&7|%3ic at jWx@oW3`(<mw8$3nYpqNURHZnuIxqoI!<JK9RI>u
zquGQe4MU4<fVOUTq+oyPnxQ$)qfm9t?l62#L}RFwhod}7OZ&Hc#lgJjj(0${$FhLq
zA{&#nf{s|MsXGRcYT25nR-lmM4R&;0D_hv`?HB|-KTGXrjA&Ct5l6eiP_gHTbGRJq
zj;ci<o+i8;o6*o6H`rYybjK6bo#ut^Wl_|zfsN2&hU3jvRQrV8$l`|Yc{a+JYZw6q
za5>RJyp2-bYf$YDMs>$yQthfJVU#>t4&(kMwUU-sF-18R<l{(U!!ZI>tL){N%bpRw
z2#2Ru#n-W04IU at ez7?e$1&UF*9H=&5mNtqX4MwYkWwQlGfq~}dSWJ~b-LZutZLKI{
zlnA$TZjKV at WevZv4WSa^@3=};-vCVnY9h#xLwwNHgB`z6(Q&f4GU+H=lD#UVx()al
zqG?sqgQ{H{ZWzMWm^2yA8e)=?*KNl3F<3H0uRzkpp`_Q^k#0s+7{Ui`7-DT{(kNx;
z8)U!`9;g#TM23*oQ<`0o0Yh|077cMfoOCn1g9K$`h{0-BcuThXM3FwOPMQdx4Y9f|
zX+e~lA#O|3!<9*=sVK6smkcpnBaKl02xWhvqAO93hB#D_bbNi%KgyFHi6jkIvsNkk
zRV_+hS8E+qme(VZzyzDX5TCRlO;T%}Y@;+Ak)8}7y at m765Ve$jtqR*Y-lR1YGCwIK
z%PF~slHYR1h-?`m8YOOsI?D3ZdTfU&&p$4~_Qxvf5elVKA(R|aqlc7NdlafZew2q)
zAZ at 99yP>>ISN;dJr+l0f?FhEtR6Z=M#`bkJcd+uop|IMnA}XX-Z>LtYH>GBEMaz_9
zdyC3WhC*zlFD0Q0)s711M=Cr13gIxd)(-42<VaaQs!)1MS(~DCB9(6waX=X2hO%5u
zd9t<?C9{;}5 at Bq|lqF442=r6POi&f#r{c<1I8Rfnq$spMQgaWgx;>>NofMsd&25PO
zD#re*!nZ5Q*;vY-sQSOCd}v>r5+79|8w1%ct at enfP<_~hl5B;;SQVp}ie<E_(j6*m
zPbyJoLlM$~D&uRMm804pDxdeM-REPc&X280hqWcWr8E~Ro88nZuPDp>UX5L;Mt at Kl
zpWBX-50uVpDyP#`O_r=dc~w<c3xe7HR9RS|bUs%Yc2PU at wwilPAt{vo3}xZA at _eFN
z<&Hlsj8T>INabsWLN83&`A5|xAcW2`wc-VZPhXYs(NSu3Rg?Es_IoRwhp8+auEWtn
zYQJpsWLr~}@T$t)-^#aX%JL+oQ&b_=SLOGds{FG`-d$y_b`UN6;!WCH)r at S&cE3ub
zhnkc2s7e~6&~BwHJW=w0R7LGoHC8i(I!9H!n_9B{x2nUADz11HMXJiq5rx=v<tN;P
z=1kS at t6~|cR*6&Xhsw`0M8j49XsZ)htITu9SWO%qfn3#NGb^va_y(W_o6rN#ldP~p
zQ;A67dZb0_(_^nVu3glh?P3pE-^G&{xp(D4pd~g at vt%LK_h~?DzHL|srRFi~r7OmQ
z`lS*5G8sgq>^f%4{|a>iB=HTrM4LgM(|&LmYc8Y_Q3(B-XF*sq(sEfuw)}1G*a|&a
z*%cpftxD%9uY8l)3g1x?v`TT>kC at N;uDXk()sk5E)vwTIjcX3jntrc<)|$y0s_pj{
zXdORdU3WjDsCSDMQ-2OUZ?Gg9wBhAuppijsKpSNTf;R3K1KPx&`cWSPeT8yB0j?3)
z8Zp>|f1%&yFK{1JT~3SD`ZL1n6S-2&9z2<9cOy;xp4ra0M9s{<n7!fe762XPKt(9K
z#g`*v_5o>F*`6=~d9x3^77m)&6%p8zb|I_wWFKH at AGFXHH02v$U>}?SEA}BhfW1A{
z2D|pOwm{CF?#;OwzoRDYL&qXZ_Sg0y1NO{;?Lf0;(b}-eL7>CGf(P~y*&H2txfSTB
zcWGhtHOj}dqMfm&bkK3_S=Ez8N4o#Ict-RWh$3`gttiTRTPOVK>|0_ft8BeE$Hm?j
zci^?LK{UVw`$o}=Rk2B2KuOu(5&xm)W?>XYZ;QCj>~0l%=)k+e6VMp%iD;zOzD?k-
zg>A-mF#!PEcZdj9#{1&e0Q7c>0qlJsrelNJcZu&IG<J)5mBEgQjkJ;@I`WV?F9vb-
z2f~YK`b7*vR*m08001 at q6e~FIZxKnG{|KUQJW~_wlO!`@OqR;Z>+;irP?;{(LNlaV
zXpY<z29<eoy9Apr<IuA&kTWUFmP@$aVl~fLB1>^AE|Xlycth4g$=TnOYQ5!>4%$~Z
z*IVgaZ=<|U=eNikC=O$%+(hK}$Uo`)NAf23-62_$o9c+Xiq-8o@(GLaqU;AvXLT*+
z3GDxjyEEV*&4fe(a--Y`q=*{!8?p}_zbUWKx!bZ0LNxBk&O8O~%1{T`Bbkl!RN3<$
ziVBw at _`jewdno?r2lnSRRzUd1SkQWLY}b$B>DyphP0-HO4bUzl7)Q^Cg+O~bYJm1F
zSQND1yMVw*ddNtU4 at ZHHZOU2W&NI^SJ5j~P1PAxg#8~dENn#GuF<tE9uAd=15r8pM
zOk;)26W^nVjrrn3p4JP*78dOyaVr9BiD*UPQV~fn*NLat7{&pyg25dXg}lIyi;K}<
zCxs`E-czDYGq7(&Y7E#9B88Ye5Y>q8 at 8Sug{6mCs^=D!?Rp!XDmB5zDXHCG?NP{kI
zlGR&)?U2O??QS`laUPUoDa?^IS$wDESb}m{#<C`^$O8=XfvivTpUP5Zk_<hAg<jxn
z8BotLfo3w^&<-$=H?>p(zFZ4qB3Edgv4M at 1+7KeSTAQyN()OXJGFV_7&(ng at q@MWS
zE4V7Ocm=d at 4lB0EWuC%bwOB7jCu2Jr#iFZ#7Vp7)dC&3#E%7!pQt}aV<P!v7mE8fG
zSq%v{2<E_+)JR-O?2{HSSIJv=cnn`t8FWNFB0X{q*B<3v7Id^kNX8fs=40$qrfS?u
zt~vogJFWY6CR)KY=tamCdRJ~g!z_P~&{h~k>lJ^Z#YzTis`B at kXjG|0NyM+rdd<=-
zh+218kF|pcSe>b~P<INqQ at z^sp#IOa-#`xnZMcPri7d`28|@}SjYrV?CjA&;)DXhj
zbOIx67F-ZCdIxhB(}a at dmndnmo*1|Mt}bY+02XfRU9{Fdok(}uODwx(VN~H)p)mJI
zt&_yR-q29cM(?oBnt9UumdhDc><&iT at hR>0s>hAr at 1iGYLhs_BDT6thJ{(7}F<d9=
zV{^)bPW+43CW{7KaEjPRt5by+3S2E*dk&VgH|xWIn*W3p*gHLAp?3QL#bxhzo2Ccg
z9YeV26h at 8PCtd+yYUV8QxFQDUiCa3@LQxP1tAPWe65To|1`zE-;y(oXu=uC|*vDc+
zFxV$z7)%;R#AfcdqhcGgeoSm3J1!!K#iwE*LpdQTv3F8@%Y>W~QS9Z2pK0^7m`g0q
zi!BJ(eou@=y!Pc<Bn}SKk at 3vvA@P*jN5nC@^`&S7x72v?Q(QgZbq8qR&vYp052&cI
zil1 at MRauIdjffT=pjEwTrCK<VsugCTP%fIgGJYxwS<P$mE|VW+W3WwIRt9YrPf1J)
zOTGCnuF~RF%r;t9WMbM}CvDr3p2WVw7~9>kd?+*URrG_lvG^Nw;c*x_q8w=B!-!X{
zR^l!_^J`$0QRoUD0u@!RE0r?sIJ4`_t23j{TpF2?NMN3fmda*7p+un5y1jlCX1`%)
zf*iSqS#Ffn3be&1+(56s%T#m?qfW2xZ9sd^B4&LKP}27X4gsf+J!+!gtPpXF{*^h6
zsa(Sx`(BJiAsY9^Q=WVe#TEkdt3Uxd=azC1yV5&p*DszMvrO at 5(6XIb&Hk5&Pe9QY
zpn;F*O;FA9pe;IaD-8ac2iRWm00pNU@!7+3$)9y<1kB~(f{?7TnXg3?;Kf?00M{bg
zFD7x_<Km6N=8O_`5um-~QVrCn1QMdG%ic_l9>NqF5roWsgXQcfNQXVfaqU+cGhGFC
z(#e8j9iX0-u$)n73BfJ=BTK2s7qsKmCmghB6n9Xu54mNEx8ND#y_=^;iSaC#l0P9`
zhL4Rk?%T%>T1rx0`W!L!JI7R&+07Cx+l?^#myw_Wf<6R(&sjlT=t*!#CM;w-R|)OY
z4m7Mjtf{E%ds?9H2uJLO$699Rm8OKXz*0t7aA*{$XWO=*g=#R8!dq#*$onlpy at KgS
zQJ?mp#j?3}@k>mS_Z3E4BAa$f+L%J0D at 4aPg8HQ*h*#<N7{A|fp0;KF6$t8opLq+M
z?+qF>s|aZD!{(qN4=R9$-ex<j6a6WN7c$`5aF|F{m_=(9zm5Q{^h*e6<rvcN)-0eZ
zR}IjJ=Jc at Y5F%Br1wF6cfsz`5^tR?DY%ZhL2Krgsle6kPWsG$v(1&`1X}|tRV%K0T
z^&7 at k1&y4J&1W>a%u~AY1p3@$Esun#5U$vCDD%-Qk`YB;Ad)ec_~oK`GPin*i_A?+
z2kW4fK?|*8xOv(<W}e#qPBdaeN!xid_E&SL- at Y#GbXd=t=s21Fbh=LjIzM7YyF}wS
zH at cQ*g>|dRqo{i-Gt%R!2HLZJb<kdAV?lfGp`_0W&g~mPO#0O)joZn%;yZG5KrC%0
zbfnHeJ1ZpdFeOR5h;#D9DxibQ76u(sh%2TQA{rSFaG0v9@>|Kg*13!Q!M;88d#=#@
z0uZvd48UfGRC1-<Tgasgn0Jo-UNL-cr{P{@>4Me`V^7x`#)YgK#)aK(7#GnBc;((O
z_LJ5PV at u7vVO-SphOt(mn0Yg}xa-YeZ|i2TIp4Y&T;e4+gB at O_;PDh$(z+eH1$|vB
zW8DQW>u^jg4UHhfu at qc)grm;1Hg?1R>+xs=`Z#(~P{eTF*fqQkCZX%?>lg~L?wGGA
zzftIp&yZVf1MV4z`Lo*@RJ&*|joZWievUEh1saZQju~M_Ho6tdILc$^>RP3;j(9d4
zXF#?6(%(@9HHLfT0j~GT4aW+|b%(lFepLioce#VKk`|QaUG89)yW9b;cez8{?sA8^
z-sKLn?s8i;op-s7bK0Uo at ampc&hZ}I^R?VLNT-ZjhSvs2_d3e!_9KojIxw(+3XZc>
zJuNCa>fkKbwR57<b7xOrujr0qA<(!XOoScv+5Jwh>==iJZalSb*aE at d_Hg@Q5sIen
zScj6uoqP{NwoSxPnJSKxlsJlpb3){im8j at OAA>q?oQLm9fS_mPiJ$}5^#V;Cjd at 1$
zXPZDbh<R`uUv}zk1v at D&QSFqNHUlh2JX{8LTBIXz<BaITv+1m;KzpAFk11g1#G+AP
z=f%i(!7hkV?|^+FM$QAfD>|T9jC<mnWUvP!nQQ+f3`|gaak}i70?90Sq%+tD^4xN;
zU9$RYu-(#=CickeH^BDFLIc1)lwZe#?UNtVt&e2;Az=IEvhH99<d_~{2jvQsmT_3N
zTMc$Z{@DlYsO&lo>{IEn3hadZ;%%^#at;GHC0i~8%aKWo!A{FQ>%h*)`fq}rl at Xo5
zK9lX^z|P4z9l_4alsRCZ%RM8(zLLj>gI$!1VOm91+MmM#>RKOYUF-2n-~Z(|(|o^T
zgogEovte>5XubZ(xxK-^30$*&Y{%?*3++}{GR)A7%~|LdP at xsh4Xr~t%(nO6ff}(-
zbtpE?(RrXbCt~Ud%&F!}OVy7snKi at GLF*J)16r>P_KAWmcsG+062t6;))@mD)@d$i
zxg9Ky at _pfhQQ<Y(s+f at pTIp|iXjJx|2^wCM{#Pmg9%w{|(V*2Eqh9Q_uCr=tFQJ9V
z^VDpzeFEsK-Dto4VkW*rm0_SAOR{)6m1ZtGx2H~*QS`Fw6K<xy$NGczYs^*R0 at i}|
zzstIczfT_qd^H_3VH at oaoR|!n_=x&RpQ&9|hn5Ge<(^4-jrxOEGtwa;OF&b5j0a6S
z$DNVhijs`TG|<=HqHmeO+#e$z(8CG8)AGdgjD3>W%S22Tg=c|H5g+yin<`?t#x(Ia
z!+l+hr{~kfq_JQ#MCMemnPNBHo+UEJfz1}%7J<zXZJCL=;unH4PZXt<`C=Cxcq|$a
z&86}i?(R?J?0#S;<e?Q{C*=v+T&Q*7Hd>~2CN9gh3WRXAwuu|(eeF0m&Q9$(chdo_
zFqh5IiZF)LTIMRSGur3fz|LyXg!?nCbw{vs+A{1dRTll!Z<_<uZ=1>LH_TC!cnXa^
zL(s=GA!HNpp!5*HB+i{D_7VK~qI7StY%z~V&_dCO2)`lvKwsJQIf246d>8OMDfK5I
zFXP9w`yYj(Jv4+4hmA+LO8Y(G!^+zx1~P)}ViFIYwfX>plcV>YY^wRGol$l<m-M&x
zhxs+%m?;Bz(9V+68TV}Y6_2?&GJ&Yil_5;UJb98w*?j5Cuog&fvTXS)S6e7Q<JMRt
zyV2RjGL&VtM0R9vsk}gA%VZmPVt-rC!)CKzmbZbdJ>RWgY5 at zR^i5V$*+05~`ZpK`
z8qkHv1{URs8GM387g__C9V2Wx^c5Oq_HZm<tkUS#m1E^LfmS$%b&c>{ERyP*=Y!V1
z!n3em>Uz-ngSq(|%x5qS7mo!^XuAw_U<?zL_|-blq_adLc_=o8TB$}5>cD7Kjrr|T
zmu1uS0DbKC+q<CMzoK6~st~%K*NI$j-+0jU^7LcOI7T)}Wbx#9UDSLBY`U1-A8fV=
zMyaS3)PDgm{(tX*<h}3l-{0}De&Ne=pP+a+Yr=<hLwD?Dr*SidOvJU=>0T8UV(?;Q
z(x~lAaH4~kg0|H9gSL(B1KPeU_hDym!rT2SVUIt(26UhwO4&$U#S|tj;@p&0q^VO!
zfet;y^C~M8iBKzfcjJ7YGy+&UjXSCAF&-;{t6l>Q`G%5mmAPpu&PoLhAGr~<>O`i$
zM$SOcIx$?kehsEG^7qZ4O*~l^&8E<1^C{~<Th(K{t?v&2jlIP}Y5x;vbsED{r|UJA
zc+aZKLHlO1`1`kJ>IWt;>B;Ts&)}_GYe?;dplJnXfMyIO3Yi^<(ePm`i4j}414r)f
z2|A|NP|)$g^mCHPW=%{LHz=Df4sid at 5~0(;=8DH}gDns?mj5D=OwFZY4e at _dc(Pts
ziWvH_MqFX&Z;Aa~z&41T+=B0jc>1+fR3zxz#Jve%?~CaKW0&ZIeBvJn;%MwcQH0lp
zed2wB^O5MpX!i at 9ARQ7qvZeA-ZzYSk{;RKpHt^v}jrvRiZQPPMX!0|wx_6JkpnZO2
zKKgo4(r-0GiaVSR+TRn~PTBfGlq3{iirsYJEAfoeuB+Q-#&^OxsBj8>yZ{4><vIeg
zTrOdlE94`_w^H_J9j%h<nb at OpA2;?f*@1~XE*qlW)JkP$@PPDRK_3I_5y{{U^d<Dd
zV$gCYxo`!85myQs0UBPAqY<l?fL7bc)oWza)mndZAJpkir0V^^yf=uawMfalH=e>}
zqte)J_6;>-N^`Vr{S?r4y_u}`>sad@`_Yrm8;D}p at 3?yRbi&^A7}MLk2dkxTP2v~l
z&%omK;h+gOX)W<>9#zSIu>w;ntOp$u%vw#ePXx{IptaX at j%M{|wuhI-v1N>$$l4lx
zj&sMh;$9tpk3LMSKp!TH#w^*XVjfp`T?8|wGsGC`%@mzj1G7b4R?=MYC6hj1gz>1$
z7T(+}i$onBb8m<igmbxQ-XCnGSjc3o7I#*FtrexS!QK+##N};KnT~7}k=)(yhy$;I
zZ4t3Oz}^#M7|3?fpR2zwh7kS_#7-WwyF~>W+bfLKVEaTphIT;gWh940xg at ZU#U<i)
zL^NOw$3!|y{Znz33!M~q*~<|t>HHbt_YT-+q8SgW^CFcFelEt)moG(eE_+ebnG5zW
zaf_N)#mZ%1--r*1>oqZosX?JK=$oQ8CwwoalHC?Jw}SmB%2V^6c$JzD#GO%KKa0OQ
zg8d at 8bOQU2@LUP at n;1V6><{6=d4Gx!R`pZi!^7hr at h$6clKitP*c4fb=gKtcOUS3o
zX6wLa$uO4Z965nGnkN&OfCaJv_v%7fa5mUtd5-Wbll!>BoAMV1y+RhI&DAo2nro$v
ze!eAVvz|7{E}OtM$-A7lS<dE`*eau0#qY`0+$P(lhsu%M%I{Mj$X-<0E%&j+_sUeJ
zYM<P}JnWYfn4^QT{#vlZvfmo8PoxJ6{iw{^0Crr~<o-S(gJ*!{$RezeGjakm{h55q
zFwe^w8DO8wqs+>eawZYHB(IJHyDa-M at Bfy23G&y{!QM65g9rF`@>7O+Q~tr;4>E-j
z-H{)y0=p}>FzEa8Z*JS4<T#psC?D~_cqHpGuwUg&rtx=qmzjPn|C$H(mkb{a_EgU0
z2Kq;CWyU6HjcIy{_Q at cyY1;41-*hdQ&d=1cnU&evM=ZX%S_{H6Uz^0UFI$_;@?NBM
zB@#=t8Kc3LY0+6=Z)zKuu@%}VVzx@#ODEQ7OIiBsv~?`#_1bXyxj_ry!L&&`#IeoV
zDf+op^WoTgS{v5cc5M*jdtX~W8SDeCKToXP+BeMRUQH0lecJEbhWoW-Ms!eHJ`3z)
z?FMsuM2q2pb4(k=pg-02aNa3RXDFw&7-sXV_AOU9r!{;V?1Hw5y)U%@rtzX?XYXIy
zx>T?$+Ikk|RV|<|*f-h(ZqaMnPVSEHwB^L?rslH@?0an|PmSAJYeM&<c9Nmo({8fZ
zA85lDf&HvCqA&l^wsGt??Fno5u{NK3<uC1rv0zWNbQb16T2GeuWPST`uxa|2tb*zK
zuAyKv^|_okTmO*=&eKnDdbYlDBiJH6ju9=_PtE~brGLvDt=4C?2V1A_<`!MAH+u(c
zquz+fZ_+#T1lyu#GjUt>0gQH=-ntjq4*l+Mu$}rt;<8IGNn?BTlx|=j>Ki!yBYoR+
zumk#E6TuGao0+Ol^s6kCqk0aj^|-!@(@*G&nfFtA08 at 2Zzw#Q`S$+CcuyguZX8M92
z#+~zp{w0s6uk>0}xumb9 at Uq^tAK1V3TlDN}y&~hgrhiL!ztcAmx|@1q?yB$gHH`1J
zz9j|hN4*n|pnH06F8e^wU>bkc at 6eZD^kww=Kl;{jV87{Ac+vPne?*Y~)CUv!C;Dp?
z{;eP5^hw4wqBO;5$a8R-ku?cyx-o1p*i7Rv%Wbx?c?Q^AWBf3%`9=<r&o<V?gDo-!
zq=79ldUXa{hD$fto5l}3QC1k=t_53V{LJmN##q8L>n-Ck7kb-Rhm%2lN67Iw$bvuZ
z(Vgs!$54f$$9<OEO^-KF_exE>+#dq(*SCOH*vfo0$YGk>*jOvwvskY~{khUqv5QK}
zMNJ+)XT?nJk{jXxjvHmE-kC`dv_8!8?OTCXlkTN}rhH8Y)86GS9CoQUv~3Ytqto!j
z5b$A{PCm$L;g1><Gl$wD(ldr7Ml@~Ky2>y-{VO6leR#y6_^d&;h=HTiG1<xSf>bp!
zA~BPHKkd?q!&qiwYCI>Ht)Z#IY!T`;-x0(3#IA at WbTF1NFn(CPEh2GHTv8 at qfih?y
z=2|`HjJWvB%=ppH8CH960 at PqVJ}o5yOJ~5K)6jsdEL%iEMp{~8I%SCih9_fAe0nne
zXx{9mq$g!q?f3x$G80Ewz0{QSM5_%<tR@~TVl~s^6Eacf|Lcz*EC~Ea)6!70Vev9<
zD^NG at Cj=b_eysU(&4$GT^D3jQyY*|MZ{Ww8|GwF<_+?X{I{bJzS+1Sx=>PugS%x)#
zrsh<zc$BH{KHn7E8lq7UKi2$H=6s8{GW&K@$6DXlG!P9=6>Gj1!NAAj3*7*7>)P5v
z_gNnQtv~Rvcnf9Ci4mLDIu^%%vi*~1{vFdni$`%1KJ=e!TmDnV4~_+erDd<eD at ts$
z_$1R|cl at mQah|x$-(0{s-{Oz+%=g5QwZ1ifEM!!nfBdYYQXXE~+0CWy^@Ho9%luEw
z`4;bQu5TIeG8-13>^48Juv5X}_kFCHPHxS!q%+XS>%V6?=ZM8kI4$+uy0rwjD607u
z{=VjXiw`#I&(gQ>v-&tyUFP$@N%3Rxubkan>W<&r7 at _~x`aLQ+RV^O-KdiqE>V(Wv
zI~5tI44jHoEH~fI-t+uh{g2Qnf*))C1#|v||8oAPm`ney`IpW4m;cN8r!kkcXU)HE
z&cANXw}7$g)571XgD>6Izuq_y5}WOMW5sNNbS}@wns4#T7|ZLwEh^Bd9pz-!K5_P5
z#P3 at S(3a)DuQ}g0$~nVi&JL)xt|hpM2G_4<2~2Ly$9Gzn4|Vym`29R>HDHoyQO-tx
zvu`nLp4ESXhP#Yox1vaGwmCeU^L*TO9T2$7sGbq)oK(sJ#<bzCTOyzNGx0r)p9ki7
z?(Ds|R**U09lzoD7RgWJ_nh3K*7_C?&u9Hzno}e2e^|e6KJ&jU;GEwi+*;YmozmyB
zqG-B7qy~%8Fg`JE6WqEAd+Y2_6HL;hsZ;Z at c|8b$yeWRH`m^eq=i|%P?-1*p|E}AC
z<-WeT+)Ek$D9vVlkIAc`VN+Y*Ph91i&HCQqD%Wk+_X$_IVY9v`xXSIh*MC>J!)9IA
zUF9A&>w4`fe<k-i>?$u{v#zhM@`Ab7Pgl98&AJ}C$_v at 7>zu2+u+6%Dxyp;!tm~4i
z+$;Bb<0>y|v#ukq@?tjYI^ilWZnMsRSGl*%I at ew0C2ZDt?J6&c^EWWBNVPQ^F6L1$
zll$7Nb2ING%~mRJH at B_X+`pALhcp|%O~3fjY-L^)LZaEq<|FsdM;?%mJn#iM_la)%
z<(c~cj}w6_?!9u(5$k(hiG1|KAeXj6HvYL9Kl`0b(U;k;i;<Vf8$m8?zP3OUe`{Me
zH|3#j@>flH1vhyQQy%UnPcY at x+~h+{c`Y|Ne%n_5)HCJQxintMeQaKC^0}sdl$)J}
zraZ<?zS5Mpa+7a>oOm8IzgL=<8QX4CUeG)kxgI~noBD5<a(-Xo=M(%;&OdnL=M&-N
zIbf9QW~mS_ew^P^d~LCA{(Ofq>JJW8YPQ8rrs&J^$bpy1e}bHL9<pHYv3AIBs#olV
zeQk%o0{hX!^hc?I6j$;W_jMV_ZMGNBjjBrj#r at tK@?!Aky6KN~jp}O3e+qK0*dBd;
zdMUZHotLKOBcGg)e1(!1vfVWCA7dKhpTh>`HEgzzL(Xfk`{%OKfAPG!33)MhW%U2Z
zM_v$tzf3<EaxdWTe(qIN`Y)dURr9eEosT>&A9<FN7qb0r)>|txmWigk5x*$lbKA*m
zvmq~vbE894ppsbobd{+e8st>8_QhLDZcfg__T?i#laKr^<iyAQdhtg-`UUYNCNR%>
zR<ktZMRDF**G=o(s|Y#kvx8Zmv&;$gO?kX|>A8tMKh43tfI|-x2dC6#Yh&uWU&s01
zDrvuuS%)*s3H?kv?s at 0$nbfbwU&ip+XF8f;%KHW?vF)Uj*~XaiJH?%X?@T$rC(%x*
znco(sd?Dn4W;-w2sPywnob3bo$S<1qZ<loHePK at hF(3UW`N)ePzM}HQ`uBr8(6pJC
z)rS0K`=~AC!Fd(UcCylc@%vbsk{7Z~<pmd?fx^ir<YWI0$X|9o*fNKwN8st!an2Wb
zM%1iPvpU{IoSBlI%qL3YZHX9l>Bl7u9c^>It0X-mZYbXgo%>RR=dX$83&i3QGKS-(
zWuo~uv84EvRQ0US+y`4(4Ll=r6dt?FZl0&`DieG)G9FkrG!d`awO&iccQ}l&UgePc
zf^@iq_q^aO=7=aRBRwH8qGp{s^=*lxQikD`*YU%KXT{m#ajTZ^Iai9#Td(F5@&{&R
z#0`p1ADEhGi;L-rhwrtHc2zSUlhrb|eY2*qd^srIr4*;$oE8Vg)RX}UaS2(&5ee=B
z6AxQbW at 2JgR7<>F1P|Scs1Z at y#y6b~iqCWv0(a{<&#nVRHZB)gJc_Gb9I}y^oRWom
z+Fja3<58W7UHG7E^VQL=vw8EFVdK$W$R1MWI*iA(0a;hsh<N8)0+L+Caf#|iv>6#*
zGM$+2roeR)hTwgzL*kg@=cBc3>S_0G2J>Vj?-R(FKTeOs3xQJkA{3i?S4Zwsu%DYH
zmPrKDRb*yC1s#_bpYnp6ZkVJEb)TP{mI25KS{#y!r+MMI=_%=P!|}|xyg61?=JH5d
z^_B%E+A3|<#=yhcva-xH&?DzNM4T_zbJ<i*Ae5OlBjP%lS&mMP&&tAm{t-zp!x2x}
z92JijLl95bNL);t|HAO1R+4(CrRz*Q_OV?w-trft06 at v*Q*fE;O#<$7=?^wQd at 7zu
g=QgG=bM<RPJV156wL!fY`uU8SENQIpT*8$9KcV+k3jhEB

literal 0
HcmV?d00001

diff --git a/ccan/stringbuilder/test/run.c b/ccan/stringbuilder/test/run.c
new file mode 100644
index 0000000..08d61a0
--- /dev/null
+++ b/ccan/stringbuilder/test/run.c
@@ -0,0 +1,68 @@
+#include <ccan/stringbuilder/stringbuilder.h>
+#include <ccan/stringbuilder/stringbuilder.c>
+#include <stdlib.h>
+#include <stdio.h>
+#include <errno.h>
+#include <ccan/tap/tap.h>
+
+/* 
+ * Even though stringbuilder is implemented using
+ * stringbuilder_va, we need to test it explicitly.
+ */
+int test_stringbuilder_va(const char* delim, char* str, size_t str_sz, ...);
+
+int test_stringbuilder_va(const char* delim, char* str, size_t str_sz, ...)
+{
+	int res;
+	va_list ap;
+	va_start(ap, str_sz);
+	res = stringbuilder_va(delim, str, str_sz, ap);
+	va_end(ap);
+	return res;
+}
+
+int main(int argc, char *argv[])
+{
+	char string[20];
+	const char* str_array[] = {
+		"xxx", "yyy"
+	};
+	int res;
+
+	res = test_stringbuilder_va(NULL, string, sizeof(string),
+			"aaa", "bbb", NULL);
+	printf("res: %s, string: %s\n",
+			strerror(res), string);
+	ok1(res == 0);
+	ok1(!strcmp(string, "aaabbb"));
+
+	res = stringbuilder(NULL, string, sizeof(string),
+			"aaa", "bbb", NULL);
+	printf("res: %s, string: %s\n",
+			strerror(res), string);
+	ok1(res == 0);
+	ok1(!strcmp(string, "aaabbb"));
+
+	res = stringbuilder(NULL, string, sizeof(string),
+			"aaaaa", "bbbbb", "ccccc", "ddddd",
+			"eeeee", "fffff", NULL);
+	printf("res: %s, string: %s\n",
+			strerror(res), string);
+	ok1(res == EMSGSIZE);
+
+	res = stringbuilder(", ", string, sizeof(string),
+			"aaa", "bbb", NULL);
+	printf("res: %s, string: %s\n",
+			strerror(res), string);
+	ok1(res == 0);
+	ok1(!strcmp(string, "aaa, bbb"));
+
+	res = stringbuilder_array(NULL, string, sizeof(string),
+			str_array, sizeof(str_array)/sizeof(str_array[0]));
+	printf("res: %s, string: %s\n",
+			strerror(res), string);
+	ok1(res == 0);
+	ok1(!strcmp(string, "xxxyyy"));
+
+	return exit_status();
+}				
-- 
1.8.5.5



More information about the ccan mailing list