From ec9e8f004ec3f42b4a754ecb6d57029b29e85551 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 16 Sep 2015 12:31:39 +0000 Subject: [PATCH 01/39] Fix typo in fts5.h. FossilOrigin-Name: 07721c6c24f651d8e281c29227b113d292f6b0de --- ext/fts5/fts5.h | 2 +- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ext/fts5/fts5.h b/ext/fts5/fts5.h index 6872918e94..7d974921d1 100644 --- a/ext/fts5/fts5.h +++ b/ext/fts5/fts5.h @@ -384,7 +384,7 @@ struct Fts5ExtensionApi { ** FTS index corresponding to both forms of the first token. ** ** -** Whether is is parsing document or query text, any call to xToken that +** Whether it is parsing document or query text, any call to xToken that ** specifies a tflags argument with the FTS5_TOKEN_COLOCATED bit ** is considered to supply a synonym for the previous token. For example, ** when parsing the document "I won first place", a tokenizer that supports diff --git a/manifest b/manifest index e3335b827f..ba047d06bd 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\stest\scases\sto\scover\sfts5\sintegrity-check\scode. -D 2015-09-15T14:39:17.597 +C Fix\stypo\sin\sfts5.h. +D 2015-09-16T12:31:39.559 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in f85066ce844a28b671aaeeff320921cd0ce36239 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -105,7 +105,7 @@ F ext/fts3/unicode/UnicodeData.txt cd07314edb62d49fde34debdaf92fa2aa69011e7 F ext/fts3/unicode/mkunicode.tcl 95cf7ec186e48d4985e433ff8a1c89090a774252 F ext/fts3/unicode/parseunicode.tcl da577d1384810fb4e2b209bf3313074353193e95 F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0 -F ext/fts5/fts5.h f04659e0df5af83731b102189a32280f74f4a6bc +F ext/fts5/fts5.h 98f802fe41481f9d797fce496f0fefcad72c7782 F ext/fts5/fts5Int.h 666aba8432940a8449a3bd4636e898fe906ed95d F ext/fts5/fts5_aux.c 7a307760a9c57c750d043188ec0bad59f5b5ec7e F ext/fts5/fts5_buffer.c 64dcaf36a3ebda9e84b7c3b8788887ec325e12a4 @@ -1387,7 +1387,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P eade355fafec558fc13dc4b08ca0b07713a2cd84 -R 1694ed50f41ea37a05fbcbd009cf49d5 +P 1d018c35b9e81982df036f5e62a4a42219b54e02 +R d4dafc4d9210d5f3c145aaa752300d01 U dan -Z ab887f4a44598b0175c78de8cb058da9 +Z 39f6673add7b4bf65853408c84113225 diff --git a/manifest.uuid b/manifest.uuid index 7bd70ebd90..9518dd77e1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1d018c35b9e81982df036f5e62a4a42219b54e02 \ No newline at end of file +07721c6c24f651d8e281c29227b113d292f6b0de \ No newline at end of file From d9dfeb575ed90013fa080d7b71d4c5d9e0a9e3e7 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 16 Sep 2015 17:46:11 +0000 Subject: [PATCH 02/39] Add a "flush" to force incremental output to releasetest-out.txt while running the test/releasetest.tcl. script. FossilOrigin-Name: 0f3de2d337a3113dbd0765aa5545bb586b780121 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/releasetest.tcl | 1 + 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index ba047d06bd..d7b995bbb8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\stypo\sin\sfts5.h. -D 2015-09-16T12:31:39.559 +C Add\sa\s"flush"\sto\sforce\sincremental\soutput\sto\sreleasetest-out.txt\swhile\srunning\nthe\stest/releasetest.tcl.\sscript. +D 2015-09-16T17:46:11.531 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in f85066ce844a28b671aaeeff320921cd0ce36239 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -941,7 +941,7 @@ F test/rbu.test 168573d353cd0fd10196b87b0caa322c144ef736 F test/rdonly.test 64e2696c322e3538df0b1ed624e21f9a23ed9ff8 F test/regexp1.test 497ea812f264d12b6198d6e50a76be4a1973a9d8 F test/reindex.test 44edd3966b474468b823d481eafef0c305022254 -F test/releasetest.tcl 5af0ca3d6a12471ffd9993c3efc00a553dfb2d41 +F test/releasetest.tcl afdac5c3429dceb034295617c0a51df9954d467a F test/resolver01.test f4022acafda7f4d40eca94dbf16bc5fc4ac30ceb F test/rollback.test 458fe73eb3ffdfdf9f6ba3e9b7350a6220414dea F test/rollback2.test fc14cf6d1a2b250d2735ef16124b971bce152f14 @@ -1387,7 +1387,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 1d018c35b9e81982df036f5e62a4a42219b54e02 -R d4dafc4d9210d5f3c145aaa752300d01 -U dan -Z 39f6673add7b4bf65853408c84113225 +P 07721c6c24f651d8e281c29227b113d292f6b0de +R b1ee4cf5cafac6421f20747901ab182b +U drh +Z f1ce9a80151e2cb0c06736d3869b387d diff --git a/manifest.uuid b/manifest.uuid index 9518dd77e1..fba7447cd9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -07721c6c24f651d8e281c29227b113d292f6b0de \ No newline at end of file +0f3de2d337a3113dbd0765aa5545bb586b780121 \ No newline at end of file diff --git a/test/releasetest.tcl b/test/releasetest.tcl index 55acd215e7..dde3f039d6 100644 --- a/test/releasetest.tcl +++ b/test/releasetest.tcl @@ -297,6 +297,7 @@ proc PUTS {args} { puts [lindex $args 0] puts $::LOG [lindex $args 0] } + flush $::LOG } puts $LOG "$argv0 $argv" set tm0 [clock format [clock seconds] -format {%Y-%m-%d %H:%M:%S} -gmt 1] From cf346d7a9ceae1d50aad501bbd44d39f6d3204bb Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 17 Sep 2015 09:48:01 +0000 Subject: [PATCH 03/39] Fix a crash in FTS5 caused by specifying NULL as the rhs of a MATCH operator. FossilOrigin-Name: e8ed62f82e8acc40b818bf86fafe3d480687514e --- ext/fts5/fts5_main.c | 1 + ext/fts5/test/fts5simple.test | 16 ++++++++++++++++ manifest | 16 ++++++++-------- manifest.uuid | 2 +- 4 files changed, 26 insertions(+), 9 deletions(-) diff --git a/ext/fts5/fts5_main.c b/ext/fts5/fts5_main.c index 5590816bc2..3d4741f95f 100644 --- a/ext/fts5/fts5_main.c +++ b/ext/fts5/fts5_main.c @@ -1116,6 +1116,7 @@ static int fts5FilterMethod( rc = fts5CursorFirst(pTab, pCsr, bDesc); }else if( pMatch ){ const char *zExpr = (const char*)sqlite3_value_text(apVal[0]); + if( zExpr==0 ) zExpr = ""; rc = fts5CursorParseRank(pConfig, pCsr, pRank); if( rc==SQLITE_OK ){ diff --git a/ext/fts5/test/fts5simple.test b/ext/fts5/test/fts5simple.test index c93519e6b9..6a980c1b19 100644 --- a/ext/fts5/test/fts5simple.test +++ b/ext/fts5/test/fts5simple.test @@ -169,5 +169,21 @@ do_execsql_test 5.8 { SELECT rowid FROM tt WHERE tt MATCH 'a*'; } {1} +#------------------------------------------------------------------------- + +reset_db +do_execsql_test 6.1 { + CREATE VIRTUAL TABLE xyz USING fts5(x, y, z); + INSERT INTO xyz VALUES('x', 'y', 'z'); +} + +do_catchsql_test 6.2 { + SELECT * FROM xyz WHERE xyz MATCH '' +} {1 {fts5: syntax error near ""}} +do_catchsql_test 6.3 { + SELECT * FROM xyz WHERE xyz MATCH NULL +} {1 {fts5: syntax error near ""}} + + finish_test diff --git a/manifest b/manifest index d7b995bbb8..f1d3fe07d1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sa\s"flush"\sto\sforce\sincremental\soutput\sto\sreleasetest-out.txt\swhile\srunning\nthe\stest/releasetest.tcl.\sscript. -D 2015-09-16T17:46:11.531 +C Fix\sa\scrash\sin\sFTS5\scaused\sby\sspecifying\sNULL\sas\sthe\srhs\sof\sa\sMATCH\soperator. +D 2015-09-17T09:48:01.737 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in f85066ce844a28b671aaeeff320921cd0ce36239 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -113,7 +113,7 @@ F ext/fts5/fts5_config.c 57ee5fe71578cb494574fc0e6e51acb9a22a8695 F ext/fts5/fts5_expr.c 667faaf14a69a5683ac383acdc8d942cf32c3f93 F ext/fts5/fts5_hash.c 4bf4b99708848357b8a2b5819e509eb6d3df9246 F ext/fts5/fts5_index.c 4fdbc0a321e3a1d73741a623d7aea4db78d6a86d -F ext/fts5/fts5_main.c 3fa906f6c0177caf8f82862bc70f37b28bb3305c +F ext/fts5/fts5_main.c 53116cffeb26898832ff7700cc5ebac5fe085d32 F ext/fts5/fts5_storage.c 120f7b143688b5b7710dacbd48cff211609b8059 F ext/fts5/fts5_tcl.c 6da58d6e8f42a93c4486b5ba9b187a7f995dee37 F ext/fts5/fts5_test_mi.c e96be827aa8f571031e65e481251dc1981d608bf @@ -173,7 +173,7 @@ F ext/fts5/test/fts5rank.test 11dcebba31d822f7e99685b4ea2c2ae3ec0b16f1 F ext/fts5/test/fts5rebuild.test 03935f617ace91ed23a6099c7c74d905227ff29b F ext/fts5/test/fts5restart.test c17728fdea26e7d0f617d22ad5b4b2862b994c17 F ext/fts5/test/fts5rowid.test 400384798349d658eaf06aefa1e364957d5d4821 -F ext/fts5/test/fts5simple.test f629e24a35a9f31cfb16c9920e8c2316e3d93e94 +F ext/fts5/test/fts5simple.test 967b7144644ad4b40b2526160a5adfa896864c55 F ext/fts5/test/fts5synonym.test cf88c0a56d5ea9591e3939ef1f6e294f7f2d0671 F ext/fts5/test/fts5tokenizer.test ea4df698b35cc427ebf2ba22829d0e28386d8c89 F ext/fts5/test/fts5unicode.test fbef8d8a3b4b88470536cc57604a82ca52e51841 @@ -1387,7 +1387,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 07721c6c24f651d8e281c29227b113d292f6b0de -R b1ee4cf5cafac6421f20747901ab182b -U drh -Z f1ce9a80151e2cb0c06736d3869b387d +P 0f3de2d337a3113dbd0765aa5545bb586b780121 +R fedcc551e6201e5eaa9f1e4cebc37090 +U dan +Z 3e310c615687f1a54e1d7e8496a4b4b6 diff --git a/manifest.uuid b/manifest.uuid index fba7447cd9..92f1ed204d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0f3de2d337a3113dbd0765aa5545bb586b780121 \ No newline at end of file +e8ed62f82e8acc40b818bf86fafe3d480687514e \ No newline at end of file From 2e8f5517f773af80f313f0768a42b24f295d5536 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 17 Sep 2015 17:21:09 +0000 Subject: [PATCH 04/39] Avoid passing (signed char) values directly to isspace(), isalnum() or isdigit() in json1.c. Cast the value to (unsigned char) first. FossilOrigin-Name: 6713e35b8a8c997aa2717e86ce6dcd63bb993477 --- ext/misc/json1.c | 32 ++++++++++++++++++++------------ manifest | 14 +++++++------- manifest.uuid | 2 +- test/json102.test | 7 +++++++ 4 files changed, 35 insertions(+), 20 deletions(-) diff --git a/ext/misc/json1.c b/ext/misc/json1.c index ca6021733c..b878c0a3e4 100644 --- a/ext/misc/json1.c +++ b/ext/misc/json1.c @@ -33,6 +33,14 @@ SQLITE_EXTENSION_INIT1 #define UNUSED_PARAM(X) (void)(X) +/* +** Versions of isspace(), isalnum() and isdigit() to which it is safe +** to pass signed char values. +*/ +#define safe_isspace(x) isspace((unsigned char)(x)) +#define safe_isdigit(x) isdigit((unsigned char)(x)) +#define safe_isalnum(x) isalnum((unsigned char)(x)) + /* Unsigned integer types */ typedef sqlite3_uint64 u64; typedef unsigned int u32; @@ -585,14 +593,14 @@ static int jsonParseValue(JsonParse *pParse, u32 i){ int iThis; int x; JsonNode *pNode; - while( isspace(pParse->zJson[i]) ){ i++; } + while( safe_isspace(pParse->zJson[i]) ){ i++; } if( (c = pParse->zJson[i])==0 ) return 0; if( c=='{' ){ /* Parse object */ iThis = jsonParseAddNode(pParse, JSON_OBJECT, 0, 0); if( iThis<0 ) return -1; for(j=i+1;;j++){ - while( isspace(pParse->zJson[j]) ){ j++; } + while( safe_isspace(pParse->zJson[j]) ){ j++; } x = jsonParseValue(pParse, j); if( x<0 ){ if( x==(-2) && pParse->nNode==(u32)iThis+1 ) return j+1; @@ -603,13 +611,13 @@ static int jsonParseValue(JsonParse *pParse, u32 i){ if( pNode->eType!=JSON_STRING ) return -1; pNode->jnFlags |= JNODE_LABEL; j = x; - while( isspace(pParse->zJson[j]) ){ j++; } + while( safe_isspace(pParse->zJson[j]) ){ j++; } if( pParse->zJson[j]!=':' ) return -1; j++; x = jsonParseValue(pParse, j); if( x<0 ) return -1; j = x; - while( isspace(pParse->zJson[j]) ){ j++; } + while( safe_isspace(pParse->zJson[j]) ){ j++; } c = pParse->zJson[j]; if( c==',' ) continue; if( c!='}' ) return -1; @@ -622,14 +630,14 @@ static int jsonParseValue(JsonParse *pParse, u32 i){ iThis = jsonParseAddNode(pParse, JSON_ARRAY, 0, 0); if( iThis<0 ) return -1; for(j=i+1;;j++){ - while( isspace(pParse->zJson[j]) ){ j++; } + while( safe_isspace(pParse->zJson[j]) ){ j++; } x = jsonParseValue(pParse, j); if( x<0 ){ if( x==(-3) && pParse->nNode==(u32)iThis+1 ) return j+1; return -1; } j = x; - while( isspace(pParse->zJson[j]) ){ j++; } + while( safe_isspace(pParse->zJson[j]) ){ j++; } c = pParse->zJson[j]; if( c==',' ) continue; if( c!=']' ) return -1; @@ -658,17 +666,17 @@ static int jsonParseValue(JsonParse *pParse, u32 i){ return j+1; }else if( c=='n' && strncmp(pParse->zJson+i,"null",4)==0 - && !isalnum(pParse->zJson[i+4]) ){ + && !safe_isalnum(pParse->zJson[i+4]) ){ jsonParseAddNode(pParse, JSON_NULL, 0, 0); return i+4; }else if( c=='t' && strncmp(pParse->zJson+i,"true",4)==0 - && !isalnum(pParse->zJson[i+4]) ){ + && !safe_isalnum(pParse->zJson[i+4]) ){ jsonParseAddNode(pParse, JSON_TRUE, 0, 0); return i+4; }else if( c=='f' && strncmp(pParse->zJson+i,"false",5)==0 - && !isalnum(pParse->zJson[i+5]) ){ + && !safe_isalnum(pParse->zJson[i+5]) ){ jsonParseAddNode(pParse, JSON_FALSE, 0, 0); return i+5; }else if( c=='-' || (c>='0' && c<='9') ){ @@ -731,7 +739,7 @@ static int jsonParse( i = jsonParseValue(pParse, 0); if( pParse->oom ) i = -1; if( i>0 ){ - while( isspace(zJson[i]) ) i++; + while( safe_isspace(zJson[i]) ) i++; if( zJson[i] ) i = -1; } if( i<=0 ){ @@ -862,11 +870,11 @@ static JsonNode *jsonLookupStep( } return pNode; } - }else if( zPath[0]=='[' && isdigit(zPath[1]) ){ + }else if( zPath[0]=='[' && safe_isdigit(zPath[1]) ){ if( pRoot->eType!=JSON_ARRAY ) return 0; i = 0; zPath++; - while( isdigit(zPath[0]) ){ + while( safe_isdigit(zPath[0]) ){ i = i*10 + zPath[0] - '0'; zPath++; } diff --git a/manifest b/manifest index f1d3fe07d1..7e2b6887ec 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\scrash\sin\sFTS5\scaused\sby\sspecifying\sNULL\sas\sthe\srhs\sof\sa\sMATCH\soperator. -D 2015-09-17T09:48:01.737 +C Avoid\spassing\s(signed\schar)\svalues\sdirectly\sto\sisspace(),\sisalnum()\sor\sisdigit()\sin\sjson1.c.\sCast\sthe\svalue\sto\s(unsigned\schar)\sfirst. +D 2015-09-17T17:21:09.569 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in f85066ce844a28b671aaeeff320921cd0ce36239 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -195,7 +195,7 @@ F ext/misc/eval.c f971962e92ebb8b0a4e6b62949463ee454d88fa2 F ext/misc/fileio.c d4171c815d6543a9edef8308aab2951413cd8d0f F ext/misc/fuzzer.c 4c84635c71c26cfa7c2e5848cf49fe2d2cfcd767 F ext/misc/ieee754.c b0362167289170627659e84173f5d2e8fee8566e -F ext/misc/json1.c f35d00fbd79a7e23af18d7630a2fcf22dce3692b +F ext/misc/json1.c 4b1048a7f4f2989d27c451cef80e06d77d69921e F ext/misc/nextchar.c 35c8b8baacb96d92abbb34a83a997b797075b342 F ext/misc/percentile.c bcbee3c061b884eccb80e21651daaae8e1e43c63 F ext/misc/regexp.c af92cdaa5058fcec1451e49becc7ba44dba023dc @@ -816,7 +816,7 @@ F test/jrnlmode.test 7864d59cf7f6e552b9b99ba0f38acd167edc10fa F test/jrnlmode2.test 81610545a4e6ed239ea8fa661891893385e23a1d F test/jrnlmode3.test 556b447a05be0e0963f4311e95ab1632b11c9eaa F test/json101.test e20d2421c531db32fad59c5e06e80af0b1b002c8 -F test/json102.test 4e1403cb06481ab160cf471c3c139820498e0563 +F test/json102.test b6282433ac49c57ab00ed55e8b9fd5317e699b3d F test/keyword1.test 37ef6bba5d2ed5b07ecdd6810571de2956599dff F test/lastinsert.test 42e948fd6442f07d60acbd15d33fb86473e0ef63 F test/laststmtchanges.test ae613f53819206b3222771828d024154d51db200 @@ -1387,7 +1387,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 0f3de2d337a3113dbd0765aa5545bb586b780121 -R fedcc551e6201e5eaa9f1e4cebc37090 +P e8ed62f82e8acc40b818bf86fafe3d480687514e +R b33f39da72f7f6726ef8bfa6df3023ed U dan -Z 3e310c615687f1a54e1d7e8496a4b4b6 +Z 7dc427d84823f016abf1cb61f1158516 diff --git a/manifest.uuid b/manifest.uuid index 92f1ed204d..3e087452c2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e8ed62f82e8acc40b818bf86fafe3d480687514e \ No newline at end of file +6713e35b8a8c997aa2717e86ce6dcd63bb993477 \ No newline at end of file diff --git a/test/json102.test b/test/json102.test index da9fbd1b76..950d4196b6 100644 --- a/test/json102.test +++ b/test/json102.test @@ -278,4 +278,11 @@ do_execsql_test json102-1132 { } {123} } ;# end ifcapable vtab +#------------------------------------------------------------------------- +# Test that json_valid() correctly identifies non-ascii range +# characters as non-whitespace. +# +do_execsql_test json102-1201 { SELECT json_valid(char(32) || '"xyz"') } 1 +do_execsql_test json102-1202 { SELECT json_valid(char(200) || '"xyz"') } 0 + finish_test From 9df5ad58bb854d4bfeee199432e18dec8d6f6dda Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 18 Sep 2015 14:22:34 +0000 Subject: [PATCH 05/39] Remove a test made obsolete by the ONEPASS DELETE optimization. FossilOrigin-Name: c88b62c28cc7ac31b93f7df0c732e0bb6ca24f65 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/corruptC.test | 5 +++++ 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 7e2b6887ec..85016eb962 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\spassing\s(signed\schar)\svalues\sdirectly\sto\sisspace(),\sisalnum()\sor\sisdigit()\sin\sjson1.c.\sCast\sthe\svalue\sto\s(unsigned\schar)\sfirst. -D 2015-09-17T17:21:09.569 +C Remove\sa\stest\smade\sobsolete\sby\sthe\sONEPASS\sDELETE\soptimization. +D 2015-09-18T14:22:34.377 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in f85066ce844a28b671aaeeff320921cd0ce36239 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -541,7 +541,7 @@ F test/corrupt8.test 2399dfe40d2c0c63af86706e30f3e6302a8d0516 F test/corrupt9.test 730a3db08d4ab9aa43392ea30d9c2b4879cbff85 F test/corruptA.test 53e56dafd180addcdadb402244b8cb9771d2ba26 F test/corruptB.test 73a8d6c0b9833697ecf16b63e3c5c05c945b5dec -F test/corruptC.test 3fcc0f73d2cf2d69befe2d96332b942426a6aae2 +F test/corruptC.test 0c46574f8d4f27ecc799b1b5c4cbf9b1817bce9a F test/corruptD.test b3c205fac7952b1de645ce44bb02335cd9e3e040 F test/corruptE.test be8e5088c369fc7979c662cd644efdaafc0f7f6d F test/corruptF.test be9fde98e4c93648f1ba52b74e5318edc8f59fe4 @@ -1387,7 +1387,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P e8ed62f82e8acc40b818bf86fafe3d480687514e -R b33f39da72f7f6726ef8bfa6df3023ed -U dan -Z 7dc427d84823f016abf1cb61f1158516 +P 6713e35b8a8c997aa2717e86ce6dcd63bb993477 +R 33f6635af41fcdd0bdf04c318e3b8dad +U drh +Z 9f636cce7563de973d71aa6f965f4052 diff --git a/manifest.uuid b/manifest.uuid index 3e087452c2..9b0cbfa7ba 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6713e35b8a8c997aa2717e86ce6dcd63bb993477 \ No newline at end of file +c88b62c28cc7ac31b93f7df0c732e0bb6ca24f65 \ No newline at end of file diff --git a/test/corruptC.test b/test/corruptC.test index a7f93c46d2..80c3c09f61 100644 --- a/test/corruptC.test +++ b/test/corruptC.test @@ -189,7 +189,11 @@ do_test corruptC-2.7 { catchsql {BEGIN; UPDATE t2 SET y='abcdef-uvwxyz'; ROLLBACK;} } {1 {database disk image is malformed}} + # corruption (seed 179069) +# Obsolete. With single-pass DELETE the corruption in the +# main database is not detected. +if 0 { do_test corruptC-2.8 { db close forcecopy test.bu test.db @@ -204,6 +208,7 @@ do_test corruptC-2.8 { sqlite3 db test.db catchsql {BEGIN; DELETE FROM t1 WHERE x>13; ROLLBACK;} } {1 {database disk image is malformed}} +} # corruption (seed 170434) # From 3a84411fc4290cf475e9f093b76aee2e72652b60 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 18 Sep 2015 14:42:48 +0000 Subject: [PATCH 06/39] Fix the orderby9.test case so that it works with 32-bit versions of TCL FossilOrigin-Name: 4b6af7743034546a407a3e4722645945a4efc8a1 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/orderby9.test | 16 +++++++++++++--- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 85016eb962..291cd87061 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sa\stest\smade\sobsolete\sby\sthe\sONEPASS\sDELETE\soptimization. -D 2015-09-18T14:22:34.377 +C Fix\sthe\sorderby9.test\scase\sso\sthat\sit\sworks\swith\s32-bit\sversions\sof\sTCL +D 2015-09-18T14:42:48.399 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in f85066ce844a28b671aaeeff320921cd0ce36239 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -905,7 +905,7 @@ F test/orderby5.test 8f08a54836d21fb7c70245360751aedd1c2286fb F test/orderby6.test 8b38138ab0972588240b3fca0985d2e400432859 F test/orderby7.test 3d1383d52ade5b9eb3a173b3147fdd296f0202da F test/orderby8.test 23ef1a5d72bd3adcc2f65561c654295d1b8047bd -F test/orderby9.test 88a330ea5fc7bed7e407b28beb0d2b79485ae2cc +F test/orderby9.test 87fb9548debcc2cd141c5299002dd94672fa76a3 F test/oserror.test 14fec2796c2b6fe431c7823750e8a18a761176d7 F test/ovfl.test 4f7ca651cba5c059a12d8c67dddd49bec5747799 F test/pager1.test 1acbdb14c5952a72dd43129cabdbf69aaa3ed1fa @@ -1387,7 +1387,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 6713e35b8a8c997aa2717e86ce6dcd63bb993477 -R 33f6635af41fcdd0bdf04c318e3b8dad +P c88b62c28cc7ac31b93f7df0c732e0bb6ca24f65 +R d7ae7141144938bfc8bce5fb809aed89 U drh -Z 9f636cce7563de973d71aa6f965f4052 +Z 2e0d2113b5f408a0d1fc7870da6f8192 diff --git a/manifest.uuid b/manifest.uuid index 9b0cbfa7ba..31b18e4c37 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c88b62c28cc7ac31b93f7df0c732e0bb6ca24f65 \ No newline at end of file +4b6af7743034546a407a3e4722645945a4efc8a1 \ No newline at end of file diff --git a/test/orderby9.test b/test/orderby9.test index c998c5054e..581951c795 100644 --- a/test/orderby9.test +++ b/test/orderby9.test @@ -27,6 +27,16 @@ do_execsql_test setup { c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<100) INSERT INTO t1 SELECT x FROM c; } + +# Some versions of TCL are unable to [lsort -int] for +# 64-bit integers. So we write our own comparison +# routine. +proc bigintcompare {a b} { + set x [expr {$a-$b}] + if {$x<0} {return -1} + if {$x>0} {return +1} + return 0 +} do_test 1.0 { set l1 {} # If random() is only evaluated once and then reused for each row, then @@ -34,19 +44,19 @@ do_test 1.0 { # separately for the result set and the ORDER BY clause, then the output # order will be random. db eval {SELECT random() AS y FROM t1 ORDER BY 1;} {lappend l1 $y} - expr {$l1==[lsort -int $l1]} + expr {$l1==[lsort -command bigintcompare $l1]} } {1} do_test 1.1 { set l1 {} db eval {SELECT random() AS y FROM t1 ORDER BY random();} {lappend l1 $y} - expr {$l1==[lsort -int $l1]} + expr {$l1==[lsort -command bigintcompare $l1]} } {1} do_test 1.2 { set l1 {} db eval {SELECT random() AS y FROM t1 ORDER BY +random();} {lappend l1 $y} - expr {$l1==[lsort -int $l1]} + expr {$l1==[lsort -command bigintcompare $l1]} } {0} finish_test From ad41f5eda39ab4577bbee2b0c2f40e696315f4b6 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 18 Sep 2015 14:45:01 +0000 Subject: [PATCH 07/39] Ensure that "PRAGMA integrity_check" reports an error if the free-list count header field contains a value smaller than the actual number of pages on the database free-list. FossilOrigin-Name: 26f64986d1ed59c554a7cb9e00e86a7f148f1fc6 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/btree.c | 4 ++++ test/corrupt2.test | 48 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 61 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 291cd87061..843925a055 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sorderby9.test\scase\sso\sthat\sit\sworks\swith\s32-bit\sversions\sof\sTCL -D 2015-09-18T14:42:48.399 +C Ensure\sthat\s"PRAGMA\sintegrity_check"\sreports\san\serror\sif\sthe\sfree-list\scount\sheader\sfield\scontains\sa\svalue\ssmaller\sthan\sthe\sactual\snumber\sof\spages\son\sthe\sdatabase\sfree-list. +D 2015-09-18T14:45:01.549 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in f85066ce844a28b671aaeeff320921cd0ce36239 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -282,7 +282,7 @@ F src/auth.c b56c78ebe40a2110fd361379f7e8162d23f92240 F src/backup.c 4d9134dc988a87838c06056c89c0e8c4700a0452 F src/bitvec.c d1f21d7d91690747881f03940584f4cc548c9d3d F src/btmutex.c 45a968cc85afed9b5e6cf55bf1f42f8d18107f79 -F src/btree.c d31008cfbf83e3ae5cb96bae3a00f4b57f244a16 +F src/btree.c 0dc030ce71f62d6ec8305c660b432d8b4a7f2ae5 F src/btree.h 40189aefdc2b830d25c8b58fd7d56538481bfdd7 F src/btreeInt.h 8177c9ab90d772d6d2c6c517e05bed774b7c92c0 F src/build.c 8a86f4203ac8a9ac0734f242a96f043edffb6018 @@ -531,7 +531,7 @@ F test/conflict2.test 0d3af4fb534fa1bd020c79960bb56e4d52655f09 F test/conflict3.test dec0634c0f31dec9a4b01c63063e939f0cd21b6b F test/contrib01.test 2a1cbc0f2f48955d7d073f725765da6fbceda6b4 F test/corrupt.test 141c39ea650c1365e85a49e402fa05cb9617fb97 -F test/corrupt2.test 08cec1e5ffa68a3610306d6068f112d08bc9f090 +F test/corrupt2.test cb787825d761b0f869764d6990531382840de872 F test/corrupt3.test 4b548d0bbe2933bc81d3f54099a05fc4d28aff18 F test/corrupt4.test b99652079d542b21f4965f6248703b983e40fe80 F test/corrupt5.test 8ead52af76006f3286e9396cb41898018ccea107 @@ -1387,7 +1387,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P c88b62c28cc7ac31b93f7df0c732e0bb6ca24f65 -R d7ae7141144938bfc8bce5fb809aed89 -U drh -Z 2e0d2113b5f408a0d1fc7870da6f8192 +P 4b6af7743034546a407a3e4722645945a4efc8a1 +R 8f617f75843755643117296bdc790a84 +U dan +Z 7ed8e4f96741fa0762b4a1c2e770ca35 diff --git a/manifest.uuid b/manifest.uuid index 31b18e4c37..1895c5dfe5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4b6af7743034546a407a3e4722645945a4efc8a1 \ No newline at end of file +26f64986d1ed59c554a7cb9e00e86a7f148f1fc6 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 6e019aebd8..08233e4769 100644 --- a/src/btree.c +++ b/src/btree.c @@ -8921,6 +8921,10 @@ static void checkList( #endif iPage = get4byte(pOvflData); sqlite3PagerUnref(pOvflPage); + + if( isFreeList && N<(iPage!=0) ){ + checkAppendMsg(pCheck, "free-page count in header is too small"); + } } } #endif /* SQLITE_OMIT_INTEGRITY_CHECK */ diff --git a/test/corrupt2.test b/test/corrupt2.test index dc417339cd..9bd29cf90f 100644 --- a/test/corrupt2.test +++ b/test/corrupt2.test @@ -17,6 +17,7 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl +set testprefix corrupt2 # Do not use a codec for tests in this file, as the database file is # manipulated directly using tcl scripts (using the [hexio_write] command). @@ -558,4 +559,51 @@ ifcapable autovacuum { } } +#------------------------------------------------------------------------- +# Test that PRAGMA integrity_check detects cases where the freelist-count +# header field is smaller than the actual number of pages on the freelist. +# + +reset_db +do_execsql_test 14.0 { + PRAGMA auto_vacuum = 0; + CREATE TABLE t1(x); + INSERT INTO t1 VALUES(randomblob(3500)); + DELETE FROM t1; +} + +do_execsql_test 14.1 { + PRAGMA integrity_check; + PRAGMA freelist_count; +} {ok 3} + +# There are now 3 free pages. Modify the header-field so that it +# (incorrectly) says that just 2 are free. +do_test 14.2 { + db close + hexio_write test.db 36 [hexio_render_int32 2] + sqlite3 db test.db + execsql { PRAGMA freelist_count } +} {2} + +do_execsql_test 14.3 { + PRAGMA integrity_check; +} {{*** in database main *** +Main freelist: free-page count in header is too small}} + +# Use 2 of the free pages on the free-list. +# +do_execsql_test 14.4 { + INSERT INTO t1 VALUES(randomblob(2500)); + PRAGMA freelist_count; +} {0} + +do_execsql_test 14.5 { + PRAGMA integrity_check; +} {{*** in database main *** +Page 3 is never used}} + + +finish_test + finish_test From 59de9c0080b49632fb26257ce65dbfe19ecf5725 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 18 Sep 2015 15:13:29 +0000 Subject: [PATCH 08/39] Fix sqlilimits.test module so that it knows that the SELECT in a CREATE VIEW is not checked until the view is actually used. FossilOrigin-Name: acf5d87f9456a1d0d69fe0ebc753211e1be07eaf --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/sqllimits1.test | 6 +++++- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 843925a055..2621417804 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\s"PRAGMA\sintegrity_check"\sreports\san\serror\sif\sthe\sfree-list\scount\sheader\sfield\scontains\sa\svalue\ssmaller\sthan\sthe\sactual\snumber\sof\spages\son\sthe\sdatabase\sfree-list. -D 2015-09-18T14:45:01.549 +C Fix\ssqlilimits.test\smodule\sso\sthat\sit\sknows\sthat\sthe\sSELECT\sin\sa\sCREATE\sVIEW\nis\snot\schecked\suntil\sthe\sview\sis\sactually\sused. +D 2015-09-18T15:13:29.071 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in f85066ce844a28b671aaeeff320921cd0ce36239 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -1029,7 +1029,7 @@ F test/speedtest1.c 857439869d1cb4db35e1c720ee9c2756eb9ea2a0 F test/spellfix.test 0597065ff57042df1f138e6a2611ae19c2698135 F test/spellfix2.test e5f2bc1dae046dbdd8008f2a84ed7749ff9b325e F test/sqldiff1.test 8f6bc7c6a5b3585d350d779c6078869ba402f8f5 -F test/sqllimits1.test e05786eaed7950ff6a2d00031d001d8a26131e68 +F test/sqllimits1.test 89b3d5aad05b99f707ee3786bdd4416dccf83304 F test/stat.test 8de91498c99f5298b303f70f1d1f3b9557af91bf F test/statfault.test f525a7bf633e50afd027700e9a486090684b1ac1 F test/stmt.test 25d64e3dbf9a3ce89558667d7f39d966fe2a71b9 @@ -1387,7 +1387,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 4b6af7743034546a407a3e4722645945a4efc8a1 -R 8f617f75843755643117296bdc790a84 -U dan -Z 7ed8e4f96741fa0762b4a1c2e770ca35 +P 26f64986d1ed59c554a7cb9e00e86a7f148f1fc6 +R 82f244e470a2bb4913dd14e1882f4561 +U drh +Z 53ac50e0f18bed53a5a46f49ee27d502 diff --git a/manifest.uuid b/manifest.uuid index 1895c5dfe5..14407399fc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -26f64986d1ed59c554a7cb9e00e86a7f148f1fc6 \ No newline at end of file +acf5d87f9456a1d0d69fe0ebc753211e1be07eaf \ No newline at end of file diff --git a/test/sqllimits1.test b/test/sqllimits1.test index 39e3aedd8f..ec72723ebe 100644 --- a/test/sqllimits1.test +++ b/test/sqllimits1.test @@ -643,7 +643,8 @@ do_test sqllimits1-8.8 { for {set i 0} {$i <= $SQLITE_LIMIT_COLUMN} {incr i} { lappend cols "c$i" } - catchsql "CREATE VIEW v1 AS SELECT [join $cols ,] FROM t1;" + execsql "CREATE VIEW v1 AS SELECT [join $cols ,] FROM t1;" + catchsql {SELECT * FROM v1} } {1 {too many columns in result set}} do_test sqllimits1-8.9 { @@ -652,9 +653,12 @@ do_test sqllimits1-8.9 { for {set i 0} {$i < $SQLITE_LIMIT_COLUMN} {incr i} { lappend cols "c$i" } + execsql {DROP VIEW IF EXISTS v1} catchsql "CREATE TABLE t2([join $cols ,])" catchsql "CREATE VIEW v1 AS SELECT *, c1 AS o FROM t2;" + catchsql "SELECT * FROM v1" } {1 {too many columns in result set}} + do_test sqllimits1-8.10 { # ORDER BY columns set cols [list] From bec9d65da48fc0c433b83f5893ea2dae80dc813d Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 18 Sep 2015 15:35:16 +0000 Subject: [PATCH 09/39] Adjust two test cases so that they conform to the current code. FossilOrigin-Name: 228e3d7c8f37c722aee3b589bdd5cfaa4b1f6f03 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/wal3.test | 12 ++++++------ 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 2621417804..642f29894a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\ssqlilimits.test\smodule\sso\sthat\sit\sknows\sthat\sthe\sSELECT\sin\sa\sCREATE\sVIEW\nis\snot\schecked\suntil\sthe\sview\sis\sactually\sused. -D 2015-09-18T15:13:29.071 +C Adjust\stwo\stest\scases\sso\sthat\sthey\sconform\sto\sthe\scurrent\scode. +D 2015-09-18T15:35:16.971 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in f85066ce844a28b671aaeeff320921cd0ce36239 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -1268,7 +1268,7 @@ F test/vtab_err.test 0d4d8eb4def1d053ac7c5050df3024fd47a3fbd8 F test/vtab_shared.test ea8778d5b0df200adef2ca7c00c3c37d4375f772 F test/wal.test dbfc482e10c7263298833bb1fc60b3ac9d6340a1 F test/wal2.test 1f841d2048080d32f552942e333fd99ce541dada -F test/wal3.test 2b5445e5da44780b9b44712f5a38523f7aeb0941 +F test/wal3.test 2ab8e490afe0164bfc89b185c8b2572e0d821f23 F test/wal4.test 4744e155cd6299c6bd99d3eab1c82f77db9cdb3c F test/wal5.test 88b5d9a6a3d1532497ee9f4296f010d66f07e33c F test/wal6.test 4421cd5a2fa99d29cc91ef12fb23bed171ed3a4c @@ -1387,7 +1387,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 26f64986d1ed59c554a7cb9e00e86a7f148f1fc6 -R 82f244e470a2bb4913dd14e1882f4561 +P acf5d87f9456a1d0d69fe0ebc753211e1be07eaf +R 141d1a654d9f974ff538047620769354 U drh -Z 53ac50e0f18bed53a5a46f49ee27d502 +Z 160b1907f919b38f1bca6b1d6ca5c889 diff --git a/manifest.uuid b/manifest.uuid index 14407399fc..703dd659cf 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -acf5d87f9456a1d0d69fe0ebc753211e1be07eaf \ No newline at end of file +228e3d7c8f37c722aee3b589bdd5cfaa4b1f6f03 \ No newline at end of file diff --git a/test/wal3.test b/test/wal3.test index 33bb285c53..bd312b349c 100644 --- a/test/wal3.test +++ b/test/wal3.test @@ -34,10 +34,6 @@ db func a_string a_string # of test cases tests that nothing appears to go wrong when this is # done. # -set ans 4056 -if {[info exists G(perm:name)] && $G(perm:name)=="memsubsys1"} { - set ans 4251 -} do_test wal3-1.0 { execsql { PRAGMA cache_size = 2000; @@ -64,8 +60,12 @@ do_test wal3-1.0 { COMMIT; PRAGMA cache_size = 10; } - wal_frame_count test.db-wal 1024 -} $ans + set x [wal_frame_count test.db-wal 1024] + if {$::G(perm:name)=="memsubsys1"} { + if {$x==4251 || $x==4290} {set x 4056} + } + set x +} 4056 for {set i 1} {$i < 50} {incr i} { From e5c61f81c36b71a0d4b39439158f9f39fcbfa22d Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 18 Sep 2015 15:38:07 +0000 Subject: [PATCH 10/39] Adjustments to the spellfix2.test module so that it works reliably on windows. FossilOrigin-Name: 09a313fb7f2c16b0253a439edb901a7bb201d7d3 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/spellfix2.test | 20 +++++++++++--------- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index 642f29894a..c86df6268d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Adjust\stwo\stest\scases\sso\sthat\sthey\sconform\sto\sthe\scurrent\scode. -D 2015-09-18T15:35:16.971 +C Adjustments\sto\sthe\sspellfix2.test\smodule\sso\sthat\sit\sworks\sreliably\son\nwindows. +D 2015-09-18T15:38:07.218 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in f85066ce844a28b671aaeeff320921cd0ce36239 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -1027,7 +1027,7 @@ F test/speed4p.explain 6b5f104ebeb34a038b2f714150f51d01143e59aa F test/speed4p.test 0e51908951677de5a969b723e03a27a1c45db38b F test/speedtest1.c 857439869d1cb4db35e1c720ee9c2756eb9ea2a0 F test/spellfix.test 0597065ff57042df1f138e6a2611ae19c2698135 -F test/spellfix2.test e5f2bc1dae046dbdd8008f2a84ed7749ff9b325e +F test/spellfix2.test 1ff48bb65b6198d21674ae24d19bb136e547585a F test/sqldiff1.test 8f6bc7c6a5b3585d350d779c6078869ba402f8f5 F test/sqllimits1.test 89b3d5aad05b99f707ee3786bdd4416dccf83304 F test/stat.test 8de91498c99f5298b303f70f1d1f3b9557af91bf @@ -1387,7 +1387,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P acf5d87f9456a1d0d69fe0ebc753211e1be07eaf -R 141d1a654d9f974ff538047620769354 +P 228e3d7c8f37c722aee3b589bdd5cfaa4b1f6f03 +R 1e960e9cfbefc895c283d1719c1f0aa0 U drh -Z 160b1907f919b38f1bca6b1d6ca5c889 +Z 92d8d40833eb01893db655f9a1fecb4b diff --git a/manifest.uuid b/manifest.uuid index 703dd659cf..a978b2c316 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -228e3d7c8f37c722aee3b589bdd5cfaa4b1f6f03 \ No newline at end of file +09a313fb7f2c16b0253a439edb901a7bb201d7d3 \ No newline at end of file diff --git a/test/spellfix2.test b/test/spellfix2.test index b4614a9e1f..e9d6c693b2 100644 --- a/test/spellfix2.test +++ b/test/spellfix2.test @@ -29,32 +29,35 @@ do_execsql_test 1.0 { do_execsql_test 1.1 { SELECT word, distance, matchlen FROM demo - WHERE word MATCH 'amstedam*' AND top=3; + WHERE word MATCH 'amstedam*' AND top=3 + ORDER BY +word; } { amsterdam 100 9 - amsterdammetje 100 9 amsterdamania 100 9 + amsterdammetje 100 9 } do_execsql_test 1.2 { SELECT word, distance, matchlen FROM demo WHERE - word MATCH 'amstedam*' AND top=3 AND distance <= 100; + word MATCH 'amstedam*' AND top=3 AND distance <= 100 + ORDER BY +word; } { amsterdam 100 9 - amsterdammetje 100 9 amsterdamania 100 9 + amsterdammetje 100 9 } do_execsql_test 1.3 { SELECT word, distance, matchlen FROM demo WHERE - word MATCH 'amstedam*' AND distance <= 100; + word MATCH 'amstedam*' AND distance <= 100 + ORDER BY +word; } { amsterdam 100 9 - amsterdammetje 100 9 amsterdamania 100 9 - amsterdamweg 100 9 - amsterdamsestraat 100 9 amsterdamlaan 100 9 + amsterdammetje 100 9 + amsterdamsestraat 100 9 + amsterdamweg 100 9 } do_test 1.4 { @@ -111,4 +114,3 @@ do_execsql_test 1.7 { finish_test - From e63e8a6c78b49a1f59b721dfaf234a545026e963 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 18 Sep 2015 18:09:28 +0000 Subject: [PATCH 11/39] Fix a crash that can occur with a skip-scan on an index with expressions when SQLITE_ENABLE_EXPLAIN_COMMENTS is defined. FossilOrigin-Name: 25f34cb9b576a2d4250a06a7dbf88010b1c11675 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/wherecode.c | 4 ++-- test/indexexpr1.test | 17 +++++++++++++++++ 4 files changed, 27 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index c86df6268d..a6faf8df55 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Adjustments\sto\sthe\sspellfix2.test\smodule\sso\sthat\sit\sworks\sreliably\son\nwindows. -D 2015-09-18T15:38:07.218 +C Fix\sa\scrash\sthat\scan\soccur\swith\sa\sskip-scan\son\san\sindex\swith\nexpressions\swhen\sSQLITE_ENABLE_EXPLAIN_COMMENTS\sis\sdefined. +D 2015-09-18T18:09:28.498 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in f85066ce844a28b671aaeeff320921cd0ce36239 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -419,7 +419,7 @@ F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 F src/walker.c 2e14d17f592d176b6dc879c33fbdec4fbccaa2ba F src/where.c 882fb44b36201fafc32dd7d59366f852806b7e70 F src/whereInt.h 7892bb54cf9ca0ae5c7e6094491b94c9286dc647 -F src/wherecode.c 186b493599000e640203be0a441223b395dabd24 +F src/wherecode.c 5b534714feb301628f7123c1c424689501746811 F src/whereexpr.c 2473e4350e30f9b55d1c6a8f66ca23c689f23f1d F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd @@ -784,7 +784,7 @@ F test/index5.test 8621491915800ec274609e42e02a97d67e9b13e7 F test/index6.test 7102ec371414c42dfb1d5ca37eb4519aa9edc23a F test/index7.test 9c6765a74fc3fcde7aebc5b3bd40d98df14a527c F test/indexedby.test 9c4cd331224e57f79fbf411ae245e6272d415985 -F test/indexexpr1.test 4feec154aadacb033b41acc1760a18edc4c60470 +F test/indexexpr1.test b4dd422f6d0a515cbca6e0049d03a01f067b2bad F test/indexfault.test 31d4ab9a7d2f6e9616933eb079722362a883eb1d F test/init.test 15c823093fdabbf7b531fe22cf037134d09587a7 F test/insert.test 38742b5e9601c8f8d76e9b7555f7270288c2d371 @@ -1387,7 +1387,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 228e3d7c8f37c722aee3b589bdd5cfaa4b1f6f03 -R 1e960e9cfbefc895c283d1719c1f0aa0 +P 09a313fb7f2c16b0253a439edb901a7bb201d7d3 +R e6b57e21ee9c6a029f06101550146ce6 U drh -Z 92d8d40833eb01893db655f9a1fecb4b +Z 350cadf296cf903d8bdd5c50cd6dd61e diff --git a/manifest.uuid b/manifest.uuid index a978b2c316..63439ffff1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -09a313fb7f2c16b0253a439edb901a7bb201d7d3 \ No newline at end of file +25f34cb9b576a2d4250a06a7dbf88010b1c11675 \ No newline at end of file diff --git a/src/wherecode.c b/src/wherecode.c index 4fb6084018..b83a4fb0aa 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -514,8 +514,8 @@ static int codeAllEqualityTerms( sqlite3VdbeJumpHere(v, j); for(j=0; jaiColumn[j]>=0 ); - VdbeComment((v, "%s", pIdx->pTable->aCol[pIdx->aiColumn[j]].zName)); + testcase( pIdx->aiColumn[j]==(-2) ); + VdbeComment((v, "%s", explainIndexColumnName(pIdx, j))); } } diff --git a/test/indexexpr1.test b/test/indexexpr1.test index 0c925c9f92..8748530c3f 100644 --- a/test/indexexpr1.test +++ b/test/indexexpr1.test @@ -218,5 +218,22 @@ do_execsql_test indexexpr1-510eqp { SELECT substr(a,4,3) AS k FROM cnt, t5 WHERE k=printf('%03d',x); } {/USING INDEX t5ax/} +# Skip-scan on an indexed expression +# +do_execsql_test indexexpr1-600 { + DROP TABLE IF EXISTS t4; + CREATE TABLE t4(a,b,c,d,e,f,g,h,i); + CREATE INDEX t4all ON t4(a,b,c Date: Sat, 19 Sep 2015 03:07:30 +0000 Subject: [PATCH 12/39] Do not allow rowid in a UNIQUE or PRIMARY KEY constraint. (This restores the same behavior exhibited by all prior releases.) FossilOrigin-Name: b1278301e37220a075c1bae88c0fcca2ef7a7d5c --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/resolve.c | 9 +++++++-- test/unique2.test | 8 ++++++++ test/without_rowid6.test | 4 ++++ 5 files changed, 28 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index a6faf8df55..d338183a16 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\scrash\sthat\scan\soccur\swith\sa\sskip-scan\son\san\sindex\swith\nexpressions\swhen\sSQLITE_ENABLE_EXPLAIN_COMMENTS\sis\sdefined. -D 2015-09-18T18:09:28.498 +C Do\snot\sallow\srowid\sin\sa\sUNIQUE\sor\sPRIMARY\sKEY\sconstraint.\s\s(This\srestores\sthe\nsame\sbehavior\sexhibited\sby\sall\sprior\sreleases.) +D 2015-09-19T03:07:30.685 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in f85066ce844a28b671aaeeff320921cd0ce36239 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -338,7 +338,7 @@ F src/pragma.h 631a91c8b0e6ca8f051a1d8a4a0da4150e04620a F src/prepare.c 82e5db1013846a819f198336fed72c44c974e7b1 F src/printf.c 0c4bcdd1c2e2521024f0a69cb5eb334f86b3652a F src/random.c ba2679f80ec82c4190062d756f22d0c358180696 -F src/resolve.c 3126f7694b8ce0f97282d7dd3a5198b8fa18dce9 +F src/resolve.c 1954a0f01bf65d78d7d559aea3d5c67f33376d91 F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e F src/select.c c17613385bc6b095c421b1f30548814f5fd8a9b2 F src/shell.c 6332ef06db1390ef812cfdff1fc97b4fd76cdd42 @@ -1234,7 +1234,7 @@ F test/types.test bf816ce73c7dfcfe26b700c19f97ef4050d194ff F test/types2.test 3555aacf8ed8dc883356e59efc314707e6247a84 F test/types3.test 99e009491a54f4dc02c06bdbc0c5eea56ae3e25a F test/unique.test 93f8b2ef5ea51b9495f8d6493429b1fd0f465264 -F test/unique2.test 41e7f83c6827605991160a31380148a9fc5f1339 +F test/unique2.test 3674e9f2a3f1fbbfd4772ac74b7a97090d0f77d2 F test/unixexcl.test cd6c765f75e50e8e2c2ba763149e5d340ea19825 F test/unordered.test ca7adce0419e4ca0c50f039885e76ed2c531eda8 F test/update.test 6c68446b8a0a33d522a7c72b320934596a2d7d32 @@ -1327,7 +1327,7 @@ F test/without_rowid2.test af260339f79d13cb220288b67cd287fbcf81ad99 F test/without_rowid3.test aad4f9d383e199349b6c7e508a778f7dff5dff79 F test/without_rowid4.test 4e08bcbaee0399f35d58b5581881e7a6243d458a F test/without_rowid5.test 61256715b686359df48ca1742db50cc7e3e7b862 -F test/without_rowid6.test db0dbf03c49030aa3c1ba5f618620334bd2baf5f +F test/without_rowid6.test 1f99644e6508447fb050f73697350c7ceca3392e F test/wordcount.c 9915e06cb33d8ca8109b8700791afe80d305afda F test/zeroblob.test 3857870fe681b8185654414a9bccfde80b62a0fa F test/zerodamage.test cf6748bad89553cc1632be51a6f54e487e4039ac @@ -1387,7 +1387,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 09a313fb7f2c16b0253a439edb901a7bb201d7d3 -R e6b57e21ee9c6a029f06101550146ce6 +P 25f34cb9b576a2d4250a06a7dbf88010b1c11675 +R fd8d20dd4f43b078e61007ad89d6a2fb U drh -Z 350cadf296cf903d8bdd5c50cd6dd61e +Z 9e371c3a4b995f769acecd4879783adf diff --git a/manifest.uuid b/manifest.uuid index 63439ffff1..de66c0e978 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -25f34cb9b576a2d4250a06a7dbf88010b1c11675 \ No newline at end of file +b1278301e37220a075c1bae88c0fcca2ef7a7d5c \ No newline at end of file diff --git a/src/resolve.c b/src/resolve.c index 2c4212ba7d..ac1706b595 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -355,8 +355,13 @@ static int lookupName( /* ** Perhaps the name is a reference to the ROWID */ - if( cnt==0 && cntTab==1 && pMatch && sqlite3IsRowid(zCol) - && VisibleRowid(pMatch->pTab) ){ + if( cnt==0 + && cntTab==1 + && pMatch + && (pNC->ncFlags & NC_IdxExpr)==0 + && sqlite3IsRowid(zCol) + && VisibleRowid(pMatch->pTab) + ){ cnt = 1; pExpr->iColumn = -1; /* IMP: R-44911-55124 */ pExpr->affinity = SQLITE_AFF_INTEGER; diff --git a/test/unique2.test b/test/unique2.test index 6a320d4d7d..0ec0dd3db2 100644 --- a/test/unique2.test +++ b/test/unique2.test @@ -75,4 +75,12 @@ foreach {id sql} { } {1 {UNIQUE constraint failed: t1.y, t1.z}} } +do_catchsql_test 13.1 { + CREATE TABLE err1(a,b,c,UNIQUE(rowid)); +} {1 {no such column: rowid}} +do_catchsql_test 13.2 { + CREATE TABLE err1(a,b,c,PRIMARY KEY(rowid)); +} {1 {no such column: rowid}} + + finish_test diff --git a/test/without_rowid6.test b/test/without_rowid6.test index 8ca78ba63a..3f9fe415d8 100644 --- a/test/without_rowid6.test +++ b/test/without_rowid6.test @@ -113,5 +113,9 @@ do_execsql_test without_rowid6-520 { PRAGMA index_list(t1); } {/sqlite_autoindex_t1_1 1 pk/} +do_catchsql_test without_rowid6-600 { + CREATE TABLE t6(a,b,c,PRIMARY KEY(a,rowid,b))WITHOUT ROWID; +} {1 {no such column: rowid}} + finish_test From 4977ccf1431327925e07a09f281efd6a494faa0d Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 19 Sep 2015 11:57:26 +0000 Subject: [PATCH 13/39] Fix an off-by-one error (really off-by-2 in this case) in the buffer resize logic of json1. FossilOrigin-Name: d2a027372a5a6efc0f9b6f605093d865ae1c6788 --- ext/misc/json1.c | 3 ++- manifest | 14 +++++++------- manifest.uuid | 2 +- test/json102.test | 9 +++++++++ 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/ext/misc/json1.c b/ext/misc/json1.c index b878c0a3e4..c59b09432f 100644 --- a/ext/misc/json1.c +++ b/ext/misc/json1.c @@ -239,12 +239,13 @@ static void jsonAppendString(JsonString *p, const char *zIn, u32 N){ for(i=0; inUsed+N+1-i > p->nAlloc) && jsonGrow(p,N+1-i)!=0 ) return; + if( (p->nUsed+N+3-i > p->nAlloc) && jsonGrow(p,N+3-i)!=0 ) return; p->zBuf[p->nUsed++] = '\\'; } p->zBuf[p->nUsed++] = c; } p->zBuf[p->nUsed++] = '"'; + assert( p->nUsednAlloc ); } /* diff --git a/manifest b/manifest index d338183a16..e62f8ab030 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\sallow\srowid\sin\sa\sUNIQUE\sor\sPRIMARY\sKEY\sconstraint.\s\s(This\srestores\sthe\nsame\sbehavior\sexhibited\sby\sall\sprior\sreleases.) -D 2015-09-19T03:07:30.685 +C Fix\san\soff-by-one\serror\s(really\soff-by-2\sin\sthis\scase)\sin\sthe\sbuffer\nresize\slogic\sof\sjson1. +D 2015-09-19T11:57:26.958 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in f85066ce844a28b671aaeeff320921cd0ce36239 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -195,7 +195,7 @@ F ext/misc/eval.c f971962e92ebb8b0a4e6b62949463ee454d88fa2 F ext/misc/fileio.c d4171c815d6543a9edef8308aab2951413cd8d0f F ext/misc/fuzzer.c 4c84635c71c26cfa7c2e5848cf49fe2d2cfcd767 F ext/misc/ieee754.c b0362167289170627659e84173f5d2e8fee8566e -F ext/misc/json1.c 4b1048a7f4f2989d27c451cef80e06d77d69921e +F ext/misc/json1.c d96049b4147eb55755593bf806e27d5966b9d244 F ext/misc/nextchar.c 35c8b8baacb96d92abbb34a83a997b797075b342 F ext/misc/percentile.c bcbee3c061b884eccb80e21651daaae8e1e43c63 F ext/misc/regexp.c af92cdaa5058fcec1451e49becc7ba44dba023dc @@ -816,7 +816,7 @@ F test/jrnlmode.test 7864d59cf7f6e552b9b99ba0f38acd167edc10fa F test/jrnlmode2.test 81610545a4e6ed239ea8fa661891893385e23a1d F test/jrnlmode3.test 556b447a05be0e0963f4311e95ab1632b11c9eaa F test/json101.test e20d2421c531db32fad59c5e06e80af0b1b002c8 -F test/json102.test b6282433ac49c57ab00ed55e8b9fd5317e699b3d +F test/json102.test 796b1c59894c6e0f38fc1a3acb0e690573b952a3 F test/keyword1.test 37ef6bba5d2ed5b07ecdd6810571de2956599dff F test/lastinsert.test 42e948fd6442f07d60acbd15d33fb86473e0ef63 F test/laststmtchanges.test ae613f53819206b3222771828d024154d51db200 @@ -1387,7 +1387,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 25f34cb9b576a2d4250a06a7dbf88010b1c11675 -R fd8d20dd4f43b078e61007ad89d6a2fb +P b1278301e37220a075c1bae88c0fcca2ef7a7d5c +R f3af9f9f0faeeb27ced4a62df7fbb79b U drh -Z 9e371c3a4b995f769acecd4879783adf +Z 22c0ef8050295e4df286a766029de3a6 diff --git a/manifest.uuid b/manifest.uuid index de66c0e978..0024ef993c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b1278301e37220a075c1bae88c0fcca2ef7a7d5c \ No newline at end of file +d2a027372a5a6efc0f9b6f605093d865ae1c6788 \ No newline at end of file diff --git a/test/json102.test b/test/json102.test index 950d4196b6..f40580da4e 100644 --- a/test/json102.test +++ b/test/json102.test @@ -285,4 +285,13 @@ do_execsql_test json102-1132 { do_execsql_test json102-1201 { SELECT json_valid(char(32) || '"xyz"') } 1 do_execsql_test json102-1202 { SELECT json_valid(char(200) || '"xyz"') } 0 +# Off-by-one error in jsonAppendString() +# +for {set i 0} {$i<100} {incr i} { + set str abcdef[string repeat \" [expr {$i+50}]]uvwxyz + do_test json102-[format %d [expr {$i+1300}]] { + db eval {SELECT json_extract(json_array($::str),'$[0]')==$::str} + } {1} +} + finish_test From c02c4d49002d146b4d60ca38e0c18392f3fee681 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 19 Sep 2015 12:04:27 +0000 Subject: [PATCH 14/39] Fix a documentation typo in sqlite3_bind_parameter_index(). No code changes. FossilOrigin-Name: 650605a820f3860b1d6e955cdda23aaff01dfdb5 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/sqlite.h.in | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index e62f8ab030..0ecd01d425 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\soff-by-one\serror\s(really\soff-by-2\sin\sthis\scase)\sin\sthe\sbuffer\nresize\slogic\sof\sjson1. -D 2015-09-19T11:57:26.958 +C Fix\sa\sdocumentation\stypo\sin\ssqlite3_bind_parameter_index().\s\sNo\scode\schanges. +D 2015-09-19T12:04:27.400 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in f85066ce844a28b671aaeeff320921cd0ce36239 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -342,7 +342,7 @@ F src/resolve.c 1954a0f01bf65d78d7d559aea3d5c67f33376d91 F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e F src/select.c c17613385bc6b095c421b1f30548814f5fd8a9b2 F src/shell.c 6332ef06db1390ef812cfdff1fc97b4fd76cdd42 -F src/sqlite.h.in 50f83145c6543000b7d27525ecaec59a23d8280b +F src/sqlite.h.in 4e06cb5fed36736242c66237991db6f3e2395eb9 F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad F src/sqlite3ext.h 64350bf36833a56ad675e27392a913f417c5c308 F src/sqliteInt.h 5afc6e50402be1e0a870f28e1cd8b32eb9db590f @@ -1387,7 +1387,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P b1278301e37220a075c1bae88c0fcca2ef7a7d5c -R f3af9f9f0faeeb27ced4a62df7fbb79b +P d2a027372a5a6efc0f9b6f605093d865ae1c6788 +R c41e9a084ff64ab3e810b45fed1e48ed U drh -Z 22c0ef8050295e4df286a766029de3a6 +Z 080732f46e4b4495cad0623b9691645c diff --git a/manifest.uuid b/manifest.uuid index 0024ef993c..50d45ada46 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d2a027372a5a6efc0f9b6f605093d865ae1c6788 \ No newline at end of file +650605a820f3860b1d6e955cdda23aaff01dfdb5 \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 7a51ec109f..45a11e3b9c 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -3630,7 +3630,7 @@ const char *sqlite3_bind_parameter_name(sqlite3_stmt*, int); ** ** See also: [sqlite3_bind_blob|sqlite3_bind()], ** [sqlite3_bind_parameter_count()], and -** [sqlite3_bind_parameter_index()]. +** [sqlite3_bind_parameter_name()]. */ int sqlite3_bind_parameter_index(sqlite3_stmt*, const char *zName); From d7f2beab86e0cb91af99a767d19955225eb5b7c5 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 19 Sep 2015 14:32:51 +0000 Subject: [PATCH 15/39] Include json1.c in fuzzcheck and fuzzershell. FossilOrigin-Name: c4b68eff7f8f5402a9abf378157767b1c96a6101 --- Makefile.in | 21 ++++++++++++++------- Makefile.msc | 19 +++++++++++++------ main.mk | 23 +++++++++++++++-------- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- test/fuzzcheck.c | 6 ++++++ tool/fuzzershell.c | 7 +++++++ 7 files changed, 66 insertions(+), 32 deletions(-) diff --git a/Makefile.in b/Makefile.in index 99af3e44e5..f62b76ed61 100644 --- a/Makefile.in +++ b/Makefile.in @@ -540,6 +540,12 @@ FUZZDATA = \ $(TOP)/test/fuzzdata2.db \ $(TOP)/test/fuzzdata3.db +# Extra arguments for including json1 in the build of tools +# +JSON1_DEP = $(TOP)/ext/misc/json1.c sqlite3ext.h +JSON1_OPT = -DSQLITE_ENABLE_JSON1 +JSON1_SRC = $(TOP)/ext/misc/json1.c + # Standard options to testfixture # TESTOPTS = --verbose=file --output=test-out.txt @@ -566,19 +572,20 @@ libtclsqlite3.la: tclsqlite.lo libsqlite3.la -version-info "8:6:8" \ -avoid-version -sqlite3$(TEXE): $(TOP)/src/shell.c libsqlite3.la sqlite3.h $(TOP)/ext/misc/json1.c - $(LTLINK) $(READLINE_FLAGS) -DSQLITE_ENABLE_JSON1 -o $@ \ - $(TOP)/src/shell.c $(TOP)/ext/misc/json1.c libsqlite3.la \ +sqlite3$(TEXE): $(TOP)/src/shell.c libsqlite3.la sqlite3.h $(JSON1_DEP) + $(LTLINK) $(READLINE_FLAGS) $(JSON1_OPT) -o $@ \ + $(TOP)/src/shell.c $(JSON1_SRC) libsqlite3.la \ $(LIBREADLINE) $(TLIBS) -rpath "$(libdir)" sqldiff$(TEXE): $(TOP)/tool/sqldiff.c sqlite3.c sqlite3.h $(LTLINK) -o $@ $(TOP)/tool/sqldiff.c sqlite3.c $(TLIBS) -fuzzershell$(TEXE): $(TOP)/tool/fuzzershell.c sqlite3.c sqlite3.h - $(LTLINK) -o $@ $(TOP)/tool/fuzzershell.c sqlite3.c $(TLIBS) +fuzzershell$(TEXE): $(TOP)/tool/fuzzershell.c sqlite3.c sqlite3.h $(JSON1_DEP) + $(LTLINK) -o $@ $(JSON1_OPT) \ + $(TOP)/tool/fuzzershell.c $(JSON1_SRC) sqlite3.c $(TLIBS) -fuzzcheck$(TEXE): $(TOP)/test/fuzzcheck.c sqlite3.c sqlite3.h - $(LTLINK) -o $@ $(TOP)/test/fuzzcheck.c sqlite3.c $(TLIBS) +fuzzcheck$(TEXE): $(TOP)/test/fuzzcheck.c sqlite3.c sqlite3.h $(JSON1_DEP) + $(LTLINK) -o $@ $(JSON1_OPT) $(TOP)/test/fuzzcheck.c $(JSON1_SRC) sqlite3.c $(TLIBS) mptester$(TEXE): sqlite3.c $(TOP)/mptest/mptest.c $(LTLINK) -o $@ -I. $(TOP)/mptest/mptest.c sqlite3.c \ diff --git a/Makefile.msc b/Makefile.msc index 7b971aa2f1..c361a6828c 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -1209,6 +1209,12 @@ FUZZDATA = \ $(TOP)\test\fuzzdata2.db \ $(TOP)\test\fuzzdata3.db +# Extra arguments for including json1 in the build of tools +# +JSON1_DEP = $(TOP)\ext\misc\json1.c sqlite3ext.h +JSON1_OPT = -DSQLITE_ENABLE_JSON1 +JSON1_SRC = $(TOP)\ext\misc\json1.c + # Standard options to testfixture # TESTOPTS = --verbose=file --output=test-out.txt @@ -1224,18 +1230,19 @@ libsqlite3.lib: $(LIBOBJ) libtclsqlite3.lib: tclsqlite.lo libsqlite3.lib $(LTLIB) $(LTLIBOPTS) $(LTLIBPATHS) /OUT:$@ tclsqlite.lo libsqlite3.lib $(LIBTCL:tcl=tclstub) $(TLIBS) -sqlite3.exe: $(TOP)\src\shell.c $(TOP)\ext\misc\json1.c $(SHELL_CORE_DEP) $(LIBRESOBJS) sqlite3.h - $(LTLINK) $(SHELL_COMPILE_OPTS) $(READLINE_FLAGS) $(TOP)\src\shell.c $(TOP)\ext\misc\json1.c \ +sqlite3.exe: $(TOP)\src\shell.c $(JSON1_DEP) $(SHELL_CORE_DEP) $(LIBRESOBJS) sqlite3.h + $(LTLINK) $(SHELL_COMPILE_OPTS) $(JSON1_OPT) $(READLINE_FLAGS) $(TOP)\src\shell.c $(JSON1_SRC) \ /link /pdb:sqlite3sh.pdb $(LTLINKOPTS) $(SHELL_LINK_OPTS) $(LTLIBPATHS) $(LIBRESOBJS) $(LIBREADLINE) $(LTLIBS) $(TLIBS) sqldiff.exe: $(TOP)\tool\sqldiff.c sqlite3.c sqlite3.h $(LTLINK) $(NO_WARN) $(TOP)\tool\sqldiff.c sqlite3.c -fuzzershell.exe: $(TOP)\tool\fuzzershell.c sqlite3.c sqlite3.h - $(LTLINK) $(NO_WARN) $(TOP)\tool\fuzzershell.c sqlite3.c +fuzzershell.exe: $(TOP)\tool\fuzzershell.c sqlite3.c sqlite3.h $(JSON1_DEP) + $(LTLINK) $(NO_WARN) $(JSON1_OPT) \ + $(TOP)\tool\fuzzershell.c $(JSON1_SRC) sqlite3.c -fuzzcheck.exe: $(TOP)\test\fuzzcheck.c sqlite3.c sqlite3.h - $(LTLINK) $(NO_WARN) $(TOP)\test\fuzzcheck.c sqlite3.c +fuzzcheck.exe: $(TOP)\test\fuzzcheck.c sqlite3.c sqlite3.h $(JSON1_DEP) + $(LTLINK) $(NO_WARN) $(JSON1_OPT) $(TOP)\test\fuzzcheck.c $(JSON1_SRC) sqlite3.c mptester.exe: $(TOP)\mptest\mptest.c $(SHELL_CORE_DEP) $(LIBRESOBJS) sqlite3.h $(LTLINK) $(NO_WARN) $(SHELL_COMPILE_OPTS) $(TOP)\mptest\mptest.c \ diff --git a/main.mk b/main.mk index 3668c84321..cadb1d10e2 100644 --- a/main.mk +++ b/main.mk @@ -450,6 +450,12 @@ FUZZDATA = \ $(TOP)/test/fuzzdata2.db \ $(TOP)/test/fuzzdata3.db +# Extra arguments for including json1 in the build of tools +# +JSON1_DEP = $(TOP)/ext/misc/json1.c sqlite3ext.h +JSON1_OPT = -DSQLITE_ENABLE_JSON1 +JSON1_SRC = $(TOP)/ext/misc/json1.c + # Standard options to testfixture # TESTOPTS = --verbose=file --output=test-out.txt @@ -463,23 +469,24 @@ libsqlite3.a: $(LIBOBJ) $(AR) libsqlite3.a $(LIBOBJ) $(RANLIB) libsqlite3.a -sqlite3$(EXE): $(TOP)/src/shell.c libsqlite3.a sqlite3.h $(TOP)/ext/misc/json1.c - $(TCCX) $(READLINE_FLAGS) -DSQLITE_ENABLE_JSON1 -o sqlite3$(EXE) \ - $(TOP)/src/shell.c $(TOP)/ext/misc/json1.c \ +sqlite3$(EXE): $(TOP)/src/shell.c libsqlite3.a sqlite3.h $(JSON1_DEP) + $(TCCX) $(READLINE_FLAGS) $(JSON1_OPT) -o sqlite3$(EXE) \ + $(TOP)/src/shell.c $(JSON1_SRC) \ libsqlite3.a $(LIBREADLINE) $(TLIBS) $(THREADLIB) sqldiff$(EXE): $(TOP)/tool/sqldiff.c sqlite3.c sqlite3.h $(TCCX) -o sqldiff$(EXE) -DSQLITE_THREADSAFE=0 \ $(TOP)/tool/sqldiff.c sqlite3.c $(TLIBS) $(THREADLIB) -fuzzershell$(EXE): $(TOP)/tool/fuzzershell.c sqlite3.c sqlite3.h +fuzzershell$(EXE): $(TOP)/tool/fuzzershell.c sqlite3.c sqlite3.h $(JSON1_DEP) $(TCCX) -o fuzzershell$(EXE) -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION \ - $(TOP)/tool/fuzzershell.c sqlite3.c $(TLIBS) $(THREADLIB) + $(JSON1_OPT) $(TOP)/tool/fuzzershell.c $(JSON1_SRC) sqlite3.c \ + $(TLIBS) $(THREADLIB) -fuzzcheck$(EXE): $(TOP)/test/fuzzcheck.c sqlite3.c sqlite3.h +fuzzcheck$(EXE): $(TOP)/test/fuzzcheck.c sqlite3.c sqlite3.h $(JSON1_DEP) $(TCCX) -o fuzzcheck$(EXE) -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION \ - -DSQLITE_ENABLE_MEMSYS5 \ - $(TOP)/test/fuzzcheck.c sqlite3.c $(TLIBS) $(THREADLIB) + -DSQLITE_ENABLE_MEMSYS5 $(JSON1_OPT) \ + $(TOP)/test/fuzzcheck.c $(JSON1_SRC) sqlite3.c $(TLIBS) $(THREADLIB) mptester$(EXE): sqlite3.c $(TOP)/mptest/mptest.c $(TCCX) -o $@ -I. $(TOP)/mptest/mptest.c sqlite3.c \ diff --git a/manifest b/manifest index 0ecd01d425..13ab712bed 100644 --- a/manifest +++ b/manifest @@ -1,9 +1,9 @@ -C Fix\sa\sdocumentation\stypo\sin\ssqlite3_bind_parameter_index().\s\sNo\scode\schanges. -D 2015-09-19T12:04:27.400 +C Include\sjson1.c\sin\sfuzzcheck\sand\sfuzzershell. +D 2015-09-19T14:32:51.442 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f -F Makefile.in f85066ce844a28b671aaeeff320921cd0ce36239 +F Makefile.in 8c58e3fb3db4deba588aeaf52ec7360127a108d1 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 -F Makefile.msc b268d8be2e800b9d35f074b1ed6b2f698deebdd6 +F Makefile.msc 2973da92ee9fb51cbe239a6e6b8fcb6ec59f22b1 F Makefile.vxworks e1b65dea203f054e71653415bd8f96dcaed47858 F README.md 8ecc12493ff9f820cdea6520a9016001cb2e59b7 F VERSION ccfc4d1576dbfdeece0a4372a2e6a2e37d3e7975 @@ -261,7 +261,7 @@ F ext/userauth/userauth.c 5fa3bdb492f481bbc1709fc83c91ebd13460c69e F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk 58eb74de702467c3b71cdf06f213cefe7f5ce544 +F main.mk 4608fb4595a7fefea3cd75b9512f04640c7eb53a F mkopcodec.awk c2ff431854d702cdd2d779c9c0d1f58fa16fa4ea F mkopcodeh.awk 0e7f04a8eb90f92259e47d80110e4e98d7ce337a F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 @@ -749,7 +749,7 @@ F test/fuzz2.test 76dc35b32b6d6f965259508508abce75a6c4d7e1 F test/fuzz3.test 53fabcd5f0f430f8b221282f6c12c4d0903c21eb F test/fuzz_common.tcl a87dfbb88c2a6b08a38e9a070dabd129e617b45b F test/fuzz_malloc.test 328f70aaca63adf29b4c6f06505ed0cf57ca7c26 -F test/fuzzcheck.c 79980bbc00e19ad44c3ba6699e643348572757a2 +F test/fuzzcheck.c 01d2ca69f8ccfabd9bd7902e7db08e13a048dc32 F test/fuzzdata1.db 7ee3227bad0e7ccdeb08a9e6822916777073c664 F test/fuzzdata2.db f03a420d3b822cc82e4f894ca957618fbe9c4973 F test/fuzzdata3.db 1d6044c33a114007f02b6e6846f1fa232f607bfd @@ -1338,7 +1338,7 @@ F tool/diffdb.c 7524b1b5df217c20cd0431f6789851a4e0cb191b F tool/extract.c 054069d81b095fbdc189a6f5d4466e40380505e2 F tool/fast_vacuum.c 5ba0d6f5963a0a63bdc42840f678bad75b2ebce1 F tool/fragck.tcl 5265a95126abcf6ab357f7efa544787e5963f439 -F tool/fuzzershell.c f2fc86dd22df654b28851b85019d3bd007361751 +F tool/fuzzershell.c 237521ed274d4415e99da45279f2c741a002c085 F tool/genfkey.README cf68fddd4643bbe3ff8e31b8b6d8b0a1b85e20f4 F tool/genfkey.test 4196a8928b78f51d54ef58e99e99401ab2f0a7e5 F tool/getlock.c f4c39b651370156cae979501a7b156bdba50e7ce @@ -1387,7 +1387,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P d2a027372a5a6efc0f9b6f605093d865ae1c6788 -R c41e9a084ff64ab3e810b45fed1e48ed +P 650605a820f3860b1d6e955cdda23aaff01dfdb5 +R d0993aaef717be33182c6b3fe246bf7b U drh -Z 080732f46e4b4495cad0623b9691645c +Z 5bec8cd0af94eb356b04bad4a020f93f diff --git a/manifest.uuid b/manifest.uuid index 50d45ada46..27f2f4f2e5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -650605a820f3860b1d6e955cdda23aaff01dfdb5 \ No newline at end of file +c4b68eff7f8f5402a9abf378157767b1c96a6101 \ No newline at end of file diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index c678e2af7a..92ce63bea3 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -1039,6 +1039,12 @@ int main(int argc, char **argv){ } rc = sqlite3_open_v2("main.db", &db, openFlags, zVfs); if( rc ) fatalError("cannot open inmem database"); +#ifdef SQLITE_ENABLE_JSON1 + { + extern int sqlite3_json_init(sqlite3*); + sqlite3_json_init(db); + } +#endif if( cellSzCkFlag ) runSql(db, "PRAGMA cell_size_check=ON", runFlags); setAlarm(iTimeout); #ifndef SQLITE_OMIT_PROGRESS_CALLBACK diff --git a/tool/fuzzershell.c b/tool/fuzzershell.c index 2778c9d2f7..e7d5dbdf46 100644 --- a/tool/fuzzershell.c +++ b/tool/fuzzershell.c @@ -601,6 +601,13 @@ int main(int argc, char **argv){ zIn = malloc(nAlloc); if( zIn==0 ) fatalError("out of memory"); +#ifdef SQLITE_ENABLE_JSON1 + { + extern int sqlite3_json_init(sqlite3*); + sqlite3_auto_extension((void(*)(void))sqlite3_json_init); + } +#endif + /* Loop over all input files */ for(jj=0; jj Date: Sat, 19 Sep 2015 14:57:00 +0000 Subject: [PATCH 16/39] Adjust fuzzershell so that it adds the json1 extension separately for each no connection. FossilOrigin-Name: ca2d1e9036387d1514fe596a0b82a3d8409797c3 --- manifest | 12 ++++++------ manifest.uuid | 2 +- tool/fuzzershell.c | 13 ++++++------- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 13ab712bed..9b1d25c77a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Include\sjson1.c\sin\sfuzzcheck\sand\sfuzzershell. -D 2015-09-19T14:32:51.442 +C Adjust\sfuzzershell\sso\sthat\sit\sadds\sthe\sjson1\sextension\sseparately\sfor\seach\nno\sconnection. +D 2015-09-19T14:57:00.533 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 8c58e3fb3db4deba588aeaf52ec7360127a108d1 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -1338,7 +1338,7 @@ F tool/diffdb.c 7524b1b5df217c20cd0431f6789851a4e0cb191b F tool/extract.c 054069d81b095fbdc189a6f5d4466e40380505e2 F tool/fast_vacuum.c 5ba0d6f5963a0a63bdc42840f678bad75b2ebce1 F tool/fragck.tcl 5265a95126abcf6ab357f7efa544787e5963f439 -F tool/fuzzershell.c 237521ed274d4415e99da45279f2c741a002c085 +F tool/fuzzershell.c 0e2a1dd0f955cf8d8b8ccc026241d64d19211f89 F tool/genfkey.README cf68fddd4643bbe3ff8e31b8b6d8b0a1b85e20f4 F tool/genfkey.test 4196a8928b78f51d54ef58e99e99401ab2f0a7e5 F tool/getlock.c f4c39b651370156cae979501a7b156bdba50e7ce @@ -1387,7 +1387,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 650605a820f3860b1d6e955cdda23aaff01dfdb5 -R d0993aaef717be33182c6b3fe246bf7b +P c4b68eff7f8f5402a9abf378157767b1c96a6101 +R dd789be15f70c114ac3c8e5f362a9dfd U drh -Z 5bec8cd0af94eb356b04bad4a020f93f +Z de9e033a4646ac6291b261f0172dd95e diff --git a/manifest.uuid b/manifest.uuid index 27f2f4f2e5..fa1e5eb9e1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c4b68eff7f8f5402a9abf378157767b1c96a6101 \ No newline at end of file +ca2d1e9036387d1514fe596a0b82a3d8409797c3 \ No newline at end of file diff --git a/tool/fuzzershell.c b/tool/fuzzershell.c index e7d5dbdf46..e483a5ff2e 100644 --- a/tool/fuzzershell.c +++ b/tool/fuzzershell.c @@ -601,13 +601,6 @@ int main(int argc, char **argv){ zIn = malloc(nAlloc); if( zIn==0 ) fatalError("out of memory"); -#ifdef SQLITE_ENABLE_JSON1 - { - extern int sqlite3_json_init(sqlite3*); - sqlite3_auto_extension((void(*)(void))sqlite3_json_init); - } -#endif - /* Loop over all input files */ for(jj=0; jj Date: Sat, 19 Sep 2015 16:45:43 +0000 Subject: [PATCH 17/39] Adjust Makefiles to use SQLITE_CORE when statically linking json1.c into test shells. FossilOrigin-Name: 91682ac39e7db6a5dc8b75695a757449f068184a --- Makefile.in | 2 +- Makefile.msc | 2 +- main.mk | 2 +- manifest | 16 ++++++++-------- manifest.uuid | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Makefile.in b/Makefile.in index f62b76ed61..3731741b99 100644 --- a/Makefile.in +++ b/Makefile.in @@ -543,7 +543,7 @@ FUZZDATA = \ # Extra arguments for including json1 in the build of tools # JSON1_DEP = $(TOP)/ext/misc/json1.c sqlite3ext.h -JSON1_OPT = -DSQLITE_ENABLE_JSON1 +JSON1_OPT = -DSQLITE_ENABLE_JSON1 -DSQLITE_CORE JSON1_SRC = $(TOP)/ext/misc/json1.c # Standard options to testfixture diff --git a/Makefile.msc b/Makefile.msc index c361a6828c..a280543460 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -1212,7 +1212,7 @@ FUZZDATA = \ # Extra arguments for including json1 in the build of tools # JSON1_DEP = $(TOP)\ext\misc\json1.c sqlite3ext.h -JSON1_OPT = -DSQLITE_ENABLE_JSON1 +JSON1_OPT = -DSQLITE_ENABLE_JSON1 -DSQLITE_CORE JSON1_SRC = $(TOP)\ext\misc\json1.c # Standard options to testfixture diff --git a/main.mk b/main.mk index cadb1d10e2..dbadd0c06f 100644 --- a/main.mk +++ b/main.mk @@ -453,7 +453,7 @@ FUZZDATA = \ # Extra arguments for including json1 in the build of tools # JSON1_DEP = $(TOP)/ext/misc/json1.c sqlite3ext.h -JSON1_OPT = -DSQLITE_ENABLE_JSON1 +JSON1_OPT = -DSQLITE_ENABLE_JSON1 -DSQLITE_CORE JSON1_SRC = $(TOP)/ext/misc/json1.c # Standard options to testfixture diff --git a/manifest b/manifest index 9b1d25c77a..89a900f2dd 100644 --- a/manifest +++ b/manifest @@ -1,9 +1,9 @@ -C Adjust\sfuzzershell\sso\sthat\sit\sadds\sthe\sjson1\sextension\sseparately\sfor\seach\nno\sconnection. -D 2015-09-19T14:57:00.533 +C Adjust\sMakefiles\sto\suse\sSQLITE_CORE\swhen\sstatically\slinking\sjson1.c\sinto\ntest\sshells. +D 2015-09-19T16:45:43.239 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f -F Makefile.in 8c58e3fb3db4deba588aeaf52ec7360127a108d1 +F Makefile.in 2047811644c5bac91ccdfc2720e49b60965a63a7 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 -F Makefile.msc 2973da92ee9fb51cbe239a6e6b8fcb6ec59f22b1 +F Makefile.msc 5f0e6b3a39f5c6a5e17ad41d7ea2ac816fb63743 F Makefile.vxworks e1b65dea203f054e71653415bd8f96dcaed47858 F README.md 8ecc12493ff9f820cdea6520a9016001cb2e59b7 F VERSION ccfc4d1576dbfdeece0a4372a2e6a2e37d3e7975 @@ -261,7 +261,7 @@ F ext/userauth/userauth.c 5fa3bdb492f481bbc1709fc83c91ebd13460c69e F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk 4608fb4595a7fefea3cd75b9512f04640c7eb53a +F main.mk 436f9b2442178303478e30eb9003b6afd08ce22a F mkopcodec.awk c2ff431854d702cdd2d779c9c0d1f58fa16fa4ea F mkopcodeh.awk 0e7f04a8eb90f92259e47d80110e4e98d7ce337a F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 @@ -1387,7 +1387,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P c4b68eff7f8f5402a9abf378157767b1c96a6101 -R dd789be15f70c114ac3c8e5f362a9dfd +P ca2d1e9036387d1514fe596a0b82a3d8409797c3 +R 60742f729d8d1b5355e0fe1beff285a6 U drh -Z de9e033a4646ac6291b261f0172dd95e +Z 07ca9ba6c04d9f6e1ad4ec3897f0a1e8 diff --git a/manifest.uuid b/manifest.uuid index fa1e5eb9e1..150c105df1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ca2d1e9036387d1514fe596a0b82a3d8409797c3 \ No newline at end of file +91682ac39e7db6a5dc8b75695a757449f068184a \ No newline at end of file From 8faee877cbb783d2f7edb38b5f4eae1a5cee9a4d Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 19 Sep 2015 18:08:13 +0000 Subject: [PATCH 18/39] Fix compiler warnings. FossilOrigin-Name: 5c31ee62a196b914673384a611534fd778dc64b0 --- manifest | 17 ++++++++--------- manifest.uuid | 2 +- src/pcache1.c | 4 ++-- src/vdbeapi.c | 23 ++++++++++++----------- src/wherecode.c | 4 ++-- 5 files changed, 25 insertions(+), 25 deletions(-) diff --git a/manifest b/manifest index f1bfc32136..33fb415fc4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sjson1.c\sto\sthe\sfuzzer\stest\sshells. -D 2015-09-19T16:51:58.703 +C Fix\scompiler\swarnings. +D 2015-09-19T18:08:13.197 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2047811644c5bac91ccdfc2720e49b60965a63a7 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -332,7 +332,7 @@ F src/pager.h 6d435f563b3f7fcae4b84433b76a6ac2730036e2 F src/parse.y f599aa5e871a493330d567ced93de696f61f48f7 F src/pcache.c 24be750c79272e0ca7b6e007bc94999700f3e5ef F src/pcache.h 9968603796240cdf83da7e7bef76edf90619cea9 -F src/pcache1.c a0c0bb29f7bd720743a16a95eb5dedba3ade15bc +F src/pcache1.c e822007159d53a7ea7aa040d6e28964ddb6de083 F src/pragma.c d71b813e67bf03f3116b9dd5164fbfd81ec673a2 F src/pragma.h 631a91c8b0e6ca8f051a1d8a4a0da4150e04620a F src/prepare.c 82e5db1013846a819f198336fed72c44c974e7b1 @@ -406,7 +406,7 @@ F src/vacuum.c 2ddd5cad2a7b9cef7f9e431b8c7771634c6b1701 F src/vdbe.c 5048103aa6bc9c01bf1a4620729256d1e873bb6c F src/vdbe.h 4bc88bd0e06f8046ee6ab7487c0015e85ad949ad F src/vdbeInt.h 8b867eac234e28627ffcace3cd4b4b79bbec664b -F src/vdbeapi.c 0d890f57caf143b114a95ce699e59af51359c508 +F src/vdbeapi.c 020681b943e77766b32ae1cddf86d7831b7374ca F src/vdbeaux.c fd00b489ab3f44f2dca1e4344faf289b7bfcf649 F src/vdbeblob.c 1d7b97115e7bbac4c318db416d2ca83fc779544a F src/vdbemem.c 19b3036aa4d676e7103b0fb5efd6327da455f915 @@ -419,7 +419,7 @@ F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 F src/walker.c 2e14d17f592d176b6dc879c33fbdec4fbccaa2ba F src/where.c 882fb44b36201fafc32dd7d59366f852806b7e70 F src/whereInt.h 7892bb54cf9ca0ae5c7e6094491b94c9286dc647 -F src/wherecode.c 5b534714feb301628f7123c1c424689501746811 +F src/wherecode.c 7660e1ad16817a921b099af553f3e1349352d16f F src/whereexpr.c 2473e4350e30f9b55d1c6a8f66ca23c689f23f1d F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd @@ -1387,8 +1387,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 650605a820f3860b1d6e955cdda23aaff01dfdb5 91682ac39e7db6a5dc8b75695a757449f068184a -R 60742f729d8d1b5355e0fe1beff285a6 -T +closed 91682ac39e7db6a5dc8b75695a757449f068184a +P 809d67b61164b83bbb6962f0edee1793a483ccab +R bab8c56b96d20ed3c77321003b4b9a52 U drh -Z 24e2ef08db7fcb908a9735efd5bb2f32 +Z 6a9fa43b557b8b4a775a8ba25a8484d8 diff --git a/manifest.uuid b/manifest.uuid index 015d066316..426b3831bd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -809d67b61164b83bbb6962f0edee1793a483ccab \ No newline at end of file +5c31ee62a196b914673384a611534fd778dc64b0 \ No newline at end of file diff --git a/src/pcache1.c b/src/pcache1.c index 00a0205f5a..ee6ac0b955 100644 --- a/src/pcache1.c +++ b/src/pcache1.c @@ -413,7 +413,7 @@ static PgHdr1 *pcache1AllocPage(PCache1 *pCache, int benignMalloc){ assert( pCache->pGroup==&pcache1.grp ); pcache1LeaveMutex(pCache->pGroup); #endif - if( benignMalloc ) sqlite3BeginBenignMalloc(); + if( benignMalloc ){ sqlite3BeginBenignMalloc(); } #ifdef SQLITE_PCACHE_SEPARATE_HEADER pPg = pcache1Alloc(pCache->szPage); p = sqlite3Malloc(sizeof(PgHdr1) + pCache->szExtra); @@ -426,7 +426,7 @@ static PgHdr1 *pcache1AllocPage(PCache1 *pCache, int benignMalloc){ pPg = pcache1Alloc(pCache->szAlloc); p = (PgHdr1 *)&((u8 *)pPg)[pCache->szPage]; #endif - if( benignMalloc ) sqlite3EndBenignMalloc(); + if( benignMalloc ){ sqlite3EndBenignMalloc(); } #ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT pcache1EnterMutex(pCache->pGroup); #endif diff --git a/src/vdbeapi.c b/src/vdbeapi.c index 06b14e1276..33c6ba3b28 100644 --- a/src/vdbeapi.c +++ b/src/vdbeapi.c @@ -912,18 +912,19 @@ static const Mem *columnNullValue(void){ #endif = { /* .u = */ {0}, - /* .flags = */ MEM_Null, - /* .enc = */ 0, - /* .n = */ 0, - /* .z = */ 0, - /* .zMalloc = */ 0, - /* .szMalloc = */ 0, - /* .iPadding1 = */ 0, - /* .db = */ 0, - /* .xDel = */ 0, + /* .flags = */ (u16)MEM_Null, + /* .enc = */ (u8)0, + /* .eSubtype = */ (u8)0, + /* .n = */ (int)0, + /* .z = */ (char*)0, + /* .zMalloc = */ (char*)0, + /* .szMalloc = */ (int)0, + /* .uTemp = */ (u32)0, + /* .db = */ (sqlite3*)0, + /* .xDel = */ (void(*)(void*))0, #ifdef SQLITE_DEBUG - /* .pScopyFrom = */ 0, - /* .pFiller = */ 0, + /* .pScopyFrom = */ (Mem*)0, + /* .pFiller = */ (void*)0, #endif }; return &nullMem; diff --git a/src/wherecode.c b/src/wherecode.c index b83a4fb0aa..77b8be4bee 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -65,7 +65,7 @@ static const char *explainIndexColumnName(Index *pIdx, int i){ ** ** "a=? AND b>?" */ -static void explainIndexRange(StrAccum *pStr, WhereLoop *pLoop, Table *pTab){ +static void explainIndexRange(StrAccum *pStr, WhereLoop *pLoop){ Index *pIndex = pLoop->u.btree.pIndex; u16 nEq = pLoop->u.btree.nEq; u16 nSkip = pLoop->nSkip; @@ -166,7 +166,7 @@ int sqlite3WhereExplainOneScan( if( zFmt ){ sqlite3StrAccumAppend(&str, " USING ", 7); sqlite3XPrintf(&str, 0, zFmt, pIdx->zName); - explainIndexRange(&str, pLoop, pItem->pTab); + explainIndexRange(&str, pLoop); } }else if( (flags & WHERE_IPK)!=0 && (flags & WHERE_CONSTRAINT)!=0 ){ const char *zRangeOp; From 80b7198f2bc3933d4f870a60832e009e9830723f Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 19 Sep 2015 18:11:18 +0000 Subject: [PATCH 19/39] Add an assert() statement to delete.c. FossilOrigin-Name: 40fce67ecf0e71db3c8f3da3f72cc80a3d0f8fb2 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/delete.c | 1 + 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 33fb415fc4..a10210ace8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\scompiler\swarnings. -D 2015-09-19T18:08:13.197 +C Add\san\sassert()\sstatement\sto\sdelete.c. +D 2015-09-19T18:11:18.686 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2047811644c5bac91ccdfc2720e49b60965a63a7 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -291,7 +291,7 @@ F src/complete.c addcd8160b081131005d5bc2d34adf20c1c5c92f F src/ctime.c 5a0b735dc95604766f5dac73973658eef782ee8b F src/date.c fb1c99172017dcc8e237339132c91a21a0788584 F src/dbstat.c e637e7a7ff40ef32132a418c6fdf1cfb63aa27c7 -F src/delete.c 5ab483f15aaf202290227d5dd1f10a7ecce3d6b1 +F src/delete.c 371df4fc86e96efeaed3d37565aef77f956be109 F src/expr.c 3a76afcdac925294c39903b7002ddb9e5fd29863 F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb F src/fkey.c 83e1baba999bed3144ea5a2143fc922edf51135f @@ -1387,7 +1387,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 809d67b61164b83bbb6962f0edee1793a483ccab -R bab8c56b96d20ed3c77321003b4b9a52 -U drh -Z 6a9fa43b557b8b4a775a8ba25a8484d8 +P 5c31ee62a196b914673384a611534fd778dc64b0 +R 4ce047a31774a6a4781364ff4ecf8f55 +U dan +Z 15395d5bafcc929901d2af1e98ec30be diff --git a/manifest.uuid b/manifest.uuid index 426b3831bd..a9d23a9229 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5c31ee62a196b914673384a611534fd778dc64b0 \ No newline at end of file +40fce67ecf0e71db3c8f3da3f72cc80a3d0f8fb2 \ No newline at end of file diff --git a/src/delete.c b/src/delete.c index 860b2cf115..c387c20bef 100644 --- a/src/delete.c +++ b/src/delete.c @@ -412,6 +412,7 @@ void sqlite3DeleteFrom( if( pWInfo==0 ) goto delete_from_cleanup; eOnePass = sqlite3WhereOkOnePass(pWInfo, aiCurOnePass); assert( IsVirtual(pTab)==0 || eOnePass==ONEPASS_OFF ); + assert( IsVirtual(pTab) || bComplex || eOnePass!=ONEPASS_OFF ); /* Keep track of the number of rows to be deleted */ if( db->flags & SQLITE_CountRows ){ From dc38495715fc2dca049e963d5150d4ba4b6e53d7 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 19 Sep 2015 18:54:39 +0000 Subject: [PATCH 20/39] Fix a memory leak in json1.c that could occur after misuse of json_object(). FossilOrigin-Name: 394b81b11f261a9b179a034bc2a2d2dff0765e3b --- ext/misc/json1.c | 2 +- manifest | 16 ++++++++-------- manifest.uuid | 2 +- test/json101.test | 6 +++--- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/ext/misc/json1.c b/ext/misc/json1.c index c59b09432f..e115470f87 100644 --- a/ext/misc/json1.c +++ b/ext/misc/json1.c @@ -1206,7 +1206,7 @@ static void jsonObjectFunc( for(i=0; i Date: Sat, 19 Sep 2015 19:36:13 +0000 Subject: [PATCH 21/39] Add the --disable-lookaside option to the fuzzershell utility program. FossilOrigin-Name: 0b04374449c8279ad038def7c18cd74f180a0515 --- manifest | 12 ++++++------ manifest.uuid | 2 +- tool/fuzzershell.c | 6 ++++++ 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 2d76ba5e00..40e9deeb32 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\smemory\sleak\sin\sjson1.c\sthat\scould\soccur\safter\smisuse\sof\sjson_object(). -D 2015-09-19T18:54:39.661 +C Add\sthe\s--disable-lookaside\soption\sto\sthe\sfuzzershell\sutility\sprogram. +D 2015-09-19T19:36:13.945 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2047811644c5bac91ccdfc2720e49b60965a63a7 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -1338,7 +1338,7 @@ F tool/diffdb.c 7524b1b5df217c20cd0431f6789851a4e0cb191b F tool/extract.c 054069d81b095fbdc189a6f5d4466e40380505e2 F tool/fast_vacuum.c 5ba0d6f5963a0a63bdc42840f678bad75b2ebce1 F tool/fragck.tcl 5265a95126abcf6ab357f7efa544787e5963f439 -F tool/fuzzershell.c 0e2a1dd0f955cf8d8b8ccc026241d64d19211f89 +F tool/fuzzershell.c 87cc3d6f00239d786d231954289f106131989cc7 F tool/genfkey.README cf68fddd4643bbe3ff8e31b8b6d8b0a1b85e20f4 F tool/genfkey.test 4196a8928b78f51d54ef58e99e99401ab2f0a7e5 F tool/getlock.c f4c39b651370156cae979501a7b156bdba50e7ce @@ -1387,7 +1387,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 40fce67ecf0e71db3c8f3da3f72cc80a3d0f8fb2 -R 6ee97186014c02a7619b2c663f4e3b82 +P 394b81b11f261a9b179a034bc2a2d2dff0765e3b +R 443476cdd6af13a6899d0e88c3fa1c6f U drh -Z 8aa08af4f5f205f4477c5ca72006e16f +Z 50620285dcaba2caeb5f39eeec9cdbf4 diff --git a/manifest.uuid b/manifest.uuid index f3323c6dcd..d434077a94 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -394b81b11f261a9b179a034bc2a2d2dff0765e3b \ No newline at end of file +0b04374449c8279ad038def7c18cd74f180a0515 \ No newline at end of file diff --git a/tool/fuzzershell.c b/tool/fuzzershell.c index e483a5ff2e..fa80b3561f 100644 --- a/tool/fuzzershell.c +++ b/tool/fuzzershell.c @@ -322,6 +322,7 @@ static void showHelp(void){ "Options:\n" " --autovacuum Enable AUTOVACUUM mode\n" " --database FILE Use database FILE instead of an in-memory database\n" +" --disable-lookaside Turn off lookaside memory\n" " --heap SZ MIN Memory allocator uses SZ bytes & min allocation MIN\n" " --help Show this help text\n" " --lookaside N SZ Configure lookaside for N slots of SZ bytes each\n" @@ -457,6 +458,7 @@ int main(int argc, char **argv){ const char *zDbName = 0; /* Name of an on-disk database file to open */ iBegin = timeOfDay(); + sqlite3_shutdown(); zFailCode = getenv("TEST_FAILURE"); g.zArgv0 = argv[0]; zPrompt = ""; @@ -473,6 +475,10 @@ int main(int argc, char **argv){ zDbName = argv[i+1]; i += 1; }else + if( strcmp(z,"disable-lookaside")==0 ){ + nLook = 1; + szLook = 0; + }else if( strcmp(z, "f")==0 && i+1 Date: Sat, 19 Sep 2015 20:27:08 +0000 Subject: [PATCH 22/39] Do not allow table-valued function syntax to be used on a view. FossilOrigin-Name: 97cfe346e140e42a604375551f8168276bdbea11 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/select.c | 5 ++++- test/tabfunc01.test | 15 +++++++++++++++ 4 files changed, 27 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 40e9deeb32..a9717c8cde 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\s--disable-lookaside\soption\sto\sthe\sfuzzershell\sutility\sprogram. -D 2015-09-19T19:36:13.945 +C Do\snot\sallow\stable-valued\sfunction\ssyntax\sto\sbe\sused\son\sa\sview. +D 2015-09-19T20:27:08.425 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2047811644c5bac91ccdfc2720e49b60965a63a7 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -340,7 +340,7 @@ F src/printf.c 0c4bcdd1c2e2521024f0a69cb5eb334f86b3652a F src/random.c ba2679f80ec82c4190062d756f22d0c358180696 F src/resolve.c 1954a0f01bf65d78d7d559aea3d5c67f33376d91 F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e -F src/select.c c17613385bc6b095c421b1f30548814f5fd8a9b2 +F src/select.c 36ee14d729e182cd8b6796f980b7ab3fc9bcee72 F src/shell.c 6332ef06db1390ef812cfdff1fc97b4fd76cdd42 F src/sqlite.h.in 4e06cb5fed36736242c66237991db6f3e2395eb9 F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad @@ -1042,7 +1042,7 @@ F test/superlock.test 1cde669f68d2dd37d6c9bd35eee1d95491ae3fc2 F test/sync.test a34cd43e98b7fb84eabbf38f7ed8f7349b3f3d85 F test/syscall.test d2fdaad713f103ac611fe7ef9b724c7b69f8149c F test/sysfault.test fa776e60bf46bdd3ae69f0b73e46ee3977a58ae6 -F test/tabfunc01.test fa9d8dfc75747019e0be98d3b6ac68d18632d328 +F test/tabfunc01.test 83e63be7b6e3f67b6a03519c9c61bc68efb25f31 F test/table.test b708f3e5fa2542fa51dfab21fc07b36ea445cb2f F test/tableapi.test 2674633fa95d80da917571ebdd759a14d9819126 F test/tableopts.test dba698ba97251017b7c80d738c198d39ab747930 @@ -1387,7 +1387,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 394b81b11f261a9b179a034bc2a2d2dff0765e3b -R 443476cdd6af13a6899d0e88c3fa1c6f +P 0b04374449c8279ad038def7c18cd74f180a0515 +R dcc2e297f6f735858cfc1dccdf44c182 U drh -Z 50620285dcaba2caeb5f39eeec9cdbf4 +Z 508cc03a4319db6f58dd52d6ddeb8415 diff --git a/manifest.uuid b/manifest.uuid index d434077a94..f456320197 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0b04374449c8279ad038def7c18cd74f180a0515 \ No newline at end of file +97cfe346e140e42a604375551f8168276bdbea11 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 0dea56ba12..a4aaa0ecaf 100644 --- a/src/select.c +++ b/src/select.c @@ -4267,9 +4267,12 @@ static int selectExpander(Walker *pWalker, Select *p){ pTab->nRef++; #if !defined(SQLITE_OMIT_VIEW) || !defined (SQLITE_OMIT_VIRTUALTABLE) if( pTab->pSelect || IsVirtual(pTab) ){ - /* We reach here if the named table is a really a view */ if( sqlite3ViewGetColumnNames(pParse, pTab) ) return WRC_Abort; assert( pFrom->pSelect==0 ); + if( pFrom->fg.isTabFunc && !IsVirtual(pTab) ){ + sqlite3ErrorMsg(pParse, "'%s' is not a function", pTab->zName); + return WRC_Abort; + } pFrom->pSelect = sqlite3SelectDup(db, pTab->pSelect, 0); sqlite3SelectSetName(pFrom->pSelect, pTab->zName); sqlite3WalkSelect(pWalker, pFrom->pSelect); diff --git a/test/tabfunc01.test b/test/tabfunc01.test index 07b3c80442..5bd729b87d 100644 --- a/test/tabfunc01.test +++ b/test/tabfunc01.test @@ -55,6 +55,21 @@ do_execsql_test tabfunc01-1.10 { SELECT rowid, * FROM generate_series(0,32,5) ORDER BY +value DESC; } {7 30 6 25 5 20 4 15 3 10 2 5 1 0} +do_execsql_test tabfunc01-1.20 { + CREATE VIEW v1(a,b) AS VALUES(1,2),(3,4); + SELECT * FROM v1; +} {1 2 3 4} +do_catchsql_test tabfunc01-1.21 { + SELECT * FROM v1(55); +} {1 {'v1' is not a function}} +do_execsql_test tabfunc01-1.22 { + CREATE VIEW v2(x) AS SELECT value FROM generate_series(1,5); + SELECT * FROM v2; +} {1 2 3 4 5} +do_catchsql_test tabfunc01-1.23 { + SELECT * FROM v2(55); +} {1 {'v2' is not a function}} + do_execsql_test tabfunc01-2.1 { CREATE TABLE t1(x); INSERT INTO t1(x) VALUES(2),(3); From 78ac109c7f7946dd0ac1e67a11cb577210cb2d34 Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 20 Sep 2015 22:57:47 +0000 Subject: [PATCH 23/39] Fix an overly-strict assert() in the btree logic. FossilOrigin-Name: 825ce3201df21c6b9d5c57dcc6726c306df05220 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 3 ++- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index a9717c8cde..659721948a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\sallow\stable-valued\sfunction\ssyntax\sto\sbe\sused\son\sa\sview. -D 2015-09-19T20:27:08.425 +C Fix\san\soverly-strict\sassert()\sin\sthe\sbtree\slogic. +D 2015-09-20T22:57:47.045 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2047811644c5bac91ccdfc2720e49b60965a63a7 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -282,7 +282,7 @@ F src/auth.c b56c78ebe40a2110fd361379f7e8162d23f92240 F src/backup.c 4d9134dc988a87838c06056c89c0e8c4700a0452 F src/bitvec.c d1f21d7d91690747881f03940584f4cc548c9d3d F src/btmutex.c 45a968cc85afed9b5e6cf55bf1f42f8d18107f79 -F src/btree.c 0dc030ce71f62d6ec8305c660b432d8b4a7f2ae5 +F src/btree.c 164583151135a3764672c2c25aa8e4fa06bdb12b F src/btree.h 40189aefdc2b830d25c8b58fd7d56538481bfdd7 F src/btreeInt.h 8177c9ab90d772d6d2c6c517e05bed774b7c92c0 F src/build.c 8a86f4203ac8a9ac0734f242a96f043edffb6018 @@ -1387,7 +1387,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 0b04374449c8279ad038def7c18cd74f180a0515 -R dcc2e297f6f735858cfc1dccdf44c182 +P 97cfe346e140e42a604375551f8168276bdbea11 +R e5931d5a57c10bca565f8c3b4aa29af4 U drh -Z 508cc03a4319db6f58dd52d6ddeb8415 +Z 432e10bd3b5a58fe33b21908c7a72458 diff --git a/manifest.uuid b/manifest.uuid index f456320197..238fad3e65 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -97cfe346e140e42a604375551f8168276bdbea11 \ No newline at end of file +825ce3201df21c6b9d5c57dcc6726c306df05220 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 08233e4769..c7d6fabba6 100644 --- a/src/btree.c +++ b/src/btree.c @@ -8186,7 +8186,8 @@ int sqlite3BtreeDelete(BtCursor *pCur, int bPreserve){ if( rc==SQLITE_OK ){ if( bSkipnext ){ assert( bPreserve && pCur->iPage==iCellDepth ); - assert( pPage->nCell>0 && iCellIdx<=pPage->nCell ); + assert( pPage==pCur->apPage[pCur->iPage] ); + assert( (pPage->nCell>0 || CORRUPT_DB) && iCellIdx<=pPage->nCell ); pCur->eState = CURSOR_SKIPNEXT; if( iCellIdx>=pPage->nCell ){ pCur->skipNext = -1; From a8f39a9b5d0f824b9eb5f29055a0bf6d5ca25cba Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 21 Sep 2015 22:53:16 +0000 Subject: [PATCH 24/39] Simplifications to the json1.c logic. FossilOrigin-Name: 1646a2bd85f87d03a14fcaec288107f5f6411c6f --- ext/misc/json1.c | 203 ++++++++++++++++++++++++----------------------- manifest | 12 +-- manifest.uuid | 2 +- 3 files changed, 110 insertions(+), 107 deletions(-) diff --git a/ext/misc/json1.c b/ext/misc/json1.c index e115470f87..4e21b151a7 100644 --- a/ext/misc/json1.c +++ b/ext/misc/json1.c @@ -343,7 +343,8 @@ static void jsonRenderNode( sqlite3_value **aReplace /* Replacement values */ ){ switch( pNode->eType ){ - case JSON_NULL: { + default: { + assert( pNode->eType==JSON_NULL ); jsonAppendRaw(pOut, "null", 4); break; } @@ -441,7 +442,8 @@ static void jsonReturn( sqlite3_value **aReplace /* Array of replacement values */ ){ switch( pNode->eType ){ - case JSON_NULL: { + default: { + assert( pNode->eType==JSON_NULL ); sqlite3_result_null(pCtx); break; } @@ -468,10 +470,16 @@ static void jsonReturn( break; } case JSON_STRING: { +#if 0 /* Never happens because JNODE_RAW is only set by json_set(), + ** json_insert() and json_replace() and those routines do not + ** call jsonReturn() */ if( pNode->jnFlags & JNODE_RAW ){ sqlite3_result_text(pCtx, pNode->u.zJContent, pNode->n, SQLITE_TRANSIENT); - }else if( (pNode->jnFlags & JNODE_ESCAPE)==0 ){ + }else +#endif + assert( (pNode->jnFlags & JNODE_RAW)==0 ); + if( (pNode->jnFlags & JNODE_ESCAPE)==0 ){ /* JSON formatted without any backslash-escapes */ sqlite3_result_text(pCtx, pNode->u.zJContent+1, pNode->n-2, SQLITE_TRANSIENT); @@ -604,7 +612,7 @@ static int jsonParseValue(JsonParse *pParse, u32 i){ while( safe_isspace(pParse->zJson[j]) ){ j++; } x = jsonParseValue(pParse, j); if( x<0 ){ - if( x==(-2) && pParse->nNode==(u32)iThis+1 ) return j+1; + if( x==(-2) ) return j+1; return -1; } if( pParse->oom ) return -1; @@ -634,7 +642,7 @@ static int jsonParseValue(JsonParse *pParse, u32 i){ while( safe_isspace(pParse->zJson[j]) ){ j++; } x = jsonParseValue(pParse, j); if( x<0 ){ - if( x==(-3) && pParse->nNode==(u32)iThis+1 ) return j+1; + if( x==(-3) ) return j+1; return -1; } j = x; @@ -829,7 +837,12 @@ static JsonNode *jsonLookupStep( zKey = zPath + 1; for(i=1; zPath[i] && zPath[i]!='"'; i++){} nKey = i-1; - if( zPath[i] ) i++; + if( zPath[i] ){ + i++; + }else{ + *pzErr = zPath; + return 0; + } }else{ zKey = zPath; for(i=0; zPath[i] && zPath[i]!='.' && zPath[i]!='['; i++){} @@ -969,6 +982,7 @@ static JsonNode *jsonLookup( ){ const char *zErr = 0; JsonNode *pNode = 0; + char *zMsg; if( zPath==0 ) return 0; if( zPath[0]!='$' ){ @@ -977,18 +991,17 @@ static JsonNode *jsonLookup( } zPath++; pNode = jsonLookupStep(pParse, 0, zPath, pApnd, &zErr); - return pNode; + if( zErr==0 ) return pNode; lookup_err: pParse->nErr++; - if( zErr!=0 && pCtx!=0 ){ - char *z = jsonPathSyntaxError(zErr); - if( z ){ - sqlite3_result_error(pCtx, z, -1); - sqlite3_free(z); - }else{ - sqlite3_result_error_nomem(pCtx); - } + assert( zErr!=0 && pCtx!=0 ); + zMsg = jsonPathSyntaxError(zErr); + if( zMsg ){ + sqlite3_result_error(pCtx, zMsg, -1); + sqlite3_free(zMsg); + }else{ + sqlite3_result_error_nomem(pCtx); } return 0; } @@ -1111,23 +1124,22 @@ static void jsonArrayLengthFunc( JsonParse x; /* The parse */ sqlite3_int64 n = 0; u32 i; + JsonNode *pNode; if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return; - if( x.nNode ){ - JsonNode *pNode; - if( argc==2 ){ - const char *zPath = (const char*)sqlite3_value_text(argv[1]); - pNode = jsonLookup(&x, zPath, 0, ctx); - }else{ - pNode = x.aNode; - } - if( pNode==0 ){ - x.nErr = 1; - }else if( pNode->eType==JSON_ARRAY ){ - assert( (pNode->jnFlags & JNODE_APPEND)==0 ); - for(i=1; i<=pNode->n; n++){ - i += jsonNodeSize(&pNode[i]); - } + assert( x.nNode ); + if( argc==2 ){ + const char *zPath = (const char*)sqlite3_value_text(argv[1]); + pNode = jsonLookup(&x, zPath, 0, ctx); + }else{ + pNode = x.aNode; + } + if( pNode==0 ){ + x.nErr = 1; + }else if( pNode->eType==JSON_ARRAY ){ + assert( (pNode->jnFlags & JNODE_APPEND)==0 ); + for(i=1; i<=pNode->n; n++){ + i += jsonNodeSize(&pNode[i]); } } if( x.nErr==0 ) sqlite3_result_int64(ctx, n); @@ -1240,17 +1252,16 @@ static void jsonRemoveFunc( if( argc<1 ) return; if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return; - if( x.nNode ){ - for(i=1; i<(u32)argc; i++){ - zPath = (const char*)sqlite3_value_text(argv[i]); - if( zPath==0 ) goto remove_done; - pNode = jsonLookup(&x, zPath, 0, ctx); - if( x.nErr ) goto remove_done; - if( pNode ) pNode->jnFlags |= JNODE_REMOVE; - } - if( (x.aNode[0].jnFlags & JNODE_REMOVE)==0 ){ - jsonReturnJson(x.aNode, ctx, 0); - } + assert( x.nNode ); + for(i=1; i<(u32)argc; i++){ + zPath = (const char*)sqlite3_value_text(argv[i]); + if( zPath==0 ) goto remove_done; + pNode = jsonLookup(&x, zPath, 0, ctx); + if( x.nErr ) goto remove_done; + if( pNode ) pNode->jnFlags |= JNODE_REMOVE; + } + if( (x.aNode[0].jnFlags & JNODE_REMOVE)==0 ){ + jsonReturnJson(x.aNode, ctx, 0); } remove_done: jsonParseReset(&x); @@ -1278,22 +1289,21 @@ static void jsonReplaceFunc( return; } if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return; - if( x.nNode ){ - for(i=1; i<(u32)argc; i+=2){ - zPath = (const char*)sqlite3_value_text(argv[i]); - pNode = jsonLookup(&x, zPath, 0, ctx); - if( x.nErr ) goto replace_err; - if( pNode ){ - pNode->jnFlags |= (u8)JNODE_REPLACE; - pNode->iVal = (u8)(i+1); - } - } - if( x.aNode[0].jnFlags & JNODE_REPLACE ){ - sqlite3_result_value(ctx, argv[x.aNode[0].iVal]); - }else{ - jsonReturnJson(x.aNode, ctx, argv); + assert( x.nNode ); + for(i=1; i<(u32)argc; i+=2){ + zPath = (const char*)sqlite3_value_text(argv[i]); + pNode = jsonLookup(&x, zPath, 0, ctx); + if( x.nErr ) goto replace_err; + if( pNode ){ + pNode->jnFlags |= (u8)JNODE_REPLACE; + pNode->iVal = (u8)(i+1); } } + if( x.aNode[0].jnFlags & JNODE_REPLACE ){ + sqlite3_result_value(ctx, argv[x.aNode[0].iVal]); + }else{ + jsonReturnJson(x.aNode, ctx, argv); + } replace_err: jsonParseReset(&x); } @@ -1328,27 +1338,26 @@ static void jsonSetFunc( return; } if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return; - if( x.nNode ){ - for(i=1; i<(u32)argc; i+=2){ - zPath = (const char*)sqlite3_value_text(argv[i]); - bApnd = 0; - pNode = jsonLookup(&x, zPath, &bApnd, ctx); - if( x.oom ){ - sqlite3_result_error_nomem(ctx); - goto jsonSetDone; - }else if( x.nErr ){ - goto jsonSetDone; - }else if( pNode && (bApnd || bIsSet) ){ - pNode->jnFlags |= (u8)JNODE_REPLACE; - pNode->iVal = (u8)(i+1); - } - } - if( x.aNode[0].jnFlags & JNODE_REPLACE ){ - sqlite3_result_value(ctx, argv[x.aNode[0].iVal]); - }else{ - jsonReturnJson(x.aNode, ctx, argv); + assert( x.nNode ); + for(i=1; i<(u32)argc; i+=2){ + zPath = (const char*)sqlite3_value_text(argv[i]); + bApnd = 0; + pNode = jsonLookup(&x, zPath, &bApnd, ctx); + if( x.oom ){ + sqlite3_result_error_nomem(ctx); + goto jsonSetDone; + }else if( x.nErr ){ + goto jsonSetDone; + }else if( pNode && (bApnd || bIsSet) ){ + pNode->jnFlags |= (u8)JNODE_REPLACE; + pNode->iVal = (u8)(i+1); } } + if( x.aNode[0].jnFlags & JNODE_REPLACE ){ + sqlite3_result_value(ctx, argv[x.aNode[0].iVal]); + }else{ + jsonReturnJson(x.aNode, ctx, argv); + } jsonSetDone: jsonParseReset(&x); } @@ -1367,19 +1376,18 @@ static void jsonTypeFunc( ){ JsonParse x; /* The parse */ const char *zPath; + JsonNode *pNode; if( jsonParse(&x, ctx, (const char*)sqlite3_value_text(argv[0])) ) return; - if( x.nNode ){ - JsonNode *pNode; - if( argc==2 ){ - zPath = (const char*)sqlite3_value_text(argv[1]); - pNode = jsonLookup(&x, zPath, 0, ctx); - }else{ - pNode = x.aNode; - } - if( pNode ){ - sqlite3_result_text(ctx, jsonType[pNode->eType], -1, SQLITE_STATIC); - } + assert( x.nNode ); + if( argc==2 ){ + zPath = (const char*)sqlite3_value_text(argv[1]); + pNode = jsonLookup(&x, zPath, 0, ctx); + }else{ + pNode = x.aNode; + } + if( pNode ){ + sqlite3_result_text(ctx, jsonType[pNode->eType], -1, SQLITE_STATIC); } jsonParseReset(&x); } @@ -1399,9 +1407,7 @@ static void jsonValidFunc( int rc = 0; UNUSED_PARAM(argc); - if( jsonParse(&x, 0, (const char*)sqlite3_value_text(argv[0]))==0 - && x.nNode>0 - ){ + if( jsonParse(&x, 0, (const char*)sqlite3_value_text(argv[0]))==0 ){ rc = 1; } jsonParseReset(&x); @@ -1754,15 +1760,6 @@ static int jsonEachFilter( if( idxNum==0 ) return SQLITE_OK; z = (const char*)sqlite3_value_text(argv[0]); if( z==0 ) return SQLITE_OK; - if( idxNum&2 ){ - zRoot = (const char*)sqlite3_value_text(argv[1]); - if( zRoot==0 ) return SQLITE_OK; - if( zRoot[0]!='$' ){ - sqlite3_free(cur->pVtab->zErrMsg); - cur->pVtab->zErrMsg = jsonPathSyntaxError(zRoot); - return cur->pVtab->zErrMsg ? SQLITE_ERROR : SQLITE_NOMEM; - } - } n = sqlite3_value_bytes(argv[0]); p->zJson = sqlite3_malloc64( n+1 ); if( p->zJson==0 ) return SQLITE_NOMEM; @@ -1783,12 +1780,18 @@ static int jsonEachFilter( JsonNode *pNode; if( idxNum==3 ){ const char *zErr = 0; + zRoot = (const char*)sqlite3_value_text(argv[1]); + if( zRoot==0 ) return SQLITE_OK; n = sqlite3_value_bytes(argv[1]); p->zRoot = sqlite3_malloc64( n+1 ); if( p->zRoot==0 ) return SQLITE_NOMEM; memcpy(p->zRoot, zRoot, (size_t)n+1); - pNode = jsonLookupStep(&p->sParse, 0, p->zRoot+1, 0, &zErr); - if( p->sParse.nErr ){ + if( zRoot[0]!='$' ){ + zErr = zRoot; + }else{ + pNode = jsonLookupStep(&p->sParse, 0, p->zRoot+1, 0, &zErr); + } + if( zErr ){ sqlite3_free(cur->pVtab->zErrMsg); cur->pVtab->zErrMsg = jsonPathSyntaxError(zErr); jsonEachCursorReset(p); @@ -1815,7 +1818,7 @@ static int jsonEachFilter( p->iEnd = p->i+1; } } - return p->sParse.oom ? SQLITE_NOMEM : SQLITE_OK; + return SQLITE_OK; } /* The methods of the json_each virtual table */ diff --git a/manifest b/manifest index 659721948a..202dddea71 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\soverly-strict\sassert()\sin\sthe\sbtree\slogic. -D 2015-09-20T22:57:47.045 +C Simplifications\sto\sthe\sjson1.c\slogic. +D 2015-09-21T22:53:16.694 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2047811644c5bac91ccdfc2720e49b60965a63a7 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -195,7 +195,7 @@ F ext/misc/eval.c f971962e92ebb8b0a4e6b62949463ee454d88fa2 F ext/misc/fileio.c d4171c815d6543a9edef8308aab2951413cd8d0f F ext/misc/fuzzer.c 4c84635c71c26cfa7c2e5848cf49fe2d2cfcd767 F ext/misc/ieee754.c b0362167289170627659e84173f5d2e8fee8566e -F ext/misc/json1.c a1f7dd9b533bcd04160a5eaf2ae93cf7c64f3744 +F ext/misc/json1.c 54f067ea34f6a7426b998ca0fb411d2eefaeb25e F ext/misc/nextchar.c 35c8b8baacb96d92abbb34a83a997b797075b342 F ext/misc/percentile.c bcbee3c061b884eccb80e21651daaae8e1e43c63 F ext/misc/regexp.c af92cdaa5058fcec1451e49becc7ba44dba023dc @@ -1387,7 +1387,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 97cfe346e140e42a604375551f8168276bdbea11 -R e5931d5a57c10bca565f8c3b4aa29af4 +P 825ce3201df21c6b9d5c57dcc6726c306df05220 +R 0407e29107979175c5ef95d6530fb773 U drh -Z 432e10bd3b5a58fe33b21908c7a72458 +Z 3c9b1b14e7e53f7b1522a534f080ce63 diff --git a/manifest.uuid b/manifest.uuid index 238fad3e65..cd9700253a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -825ce3201df21c6b9d5c57dcc6726c306df05220 \ No newline at end of file +1646a2bd85f87d03a14fcaec288107f5f6411c6f \ No newline at end of file From c978f2d2c207d9b1f7c9103d3387bb4a14982b5c Mon Sep 17 00:00:00 2001 From: mistachkin Date: Mon, 21 Sep 2015 23:49:35 +0000 Subject: [PATCH 25/39] Fix compilation under older versions of MSVC. FossilOrigin-Name: 17150ada1474e70d7c5ffe6ba5667f45671a434b --- Makefile.msc | 6 ++++-- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/Makefile.msc b/Makefile.msc index a280543460..5612faca39 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -1211,7 +1211,7 @@ FUZZDATA = \ # Extra arguments for including json1 in the build of tools # -JSON1_DEP = $(TOP)\ext\misc\json1.c sqlite3ext.h +JSON1_DEP = sqlite3ext.h $(TOP)\ext\misc\json1.c JSON1_OPT = -DSQLITE_ENABLE_JSON1 -DSQLITE_CORE JSON1_SRC = $(TOP)\ext\misc\json1.c @@ -1284,7 +1284,6 @@ mptest: mptester.exe sqlite3.c: .target_source $(TOP)\tool\mksqlite3c.tcl $(TCLSH_CMD) $(TOP)\tool\mksqlite3c.tcl $(MKSQLITE3C_ARGS) copy tsrc\shell.c . - copy tsrc\sqlite3ext.h . sqlite3-all.c: sqlite3.c $(TOP)\tool\split-sqlite3c.tcl $(TCLSH_CMD) $(TOP)\tool\split-sqlite3c.tcl @@ -1592,6 +1591,9 @@ parse.c: $(TOP)\src\parse.y lemon.exe $(TOP)\addopcodes.awk sqlite3.h: $(TOP)\src\sqlite.h.in $(TOP)\manifest.uuid $(TOP)\VERSION $(TCLSH_CMD) $(TOP)\tool\mksqlite3h.tcl $(TOP:\=/) > sqlite3.h +sqlite3ext.h: .target_source + copy tsrc\sqlite3ext.h . + mkkeywordhash.exe: $(TOP)\tool\mkkeywordhash.c $(BCC) $(NO_WARN) -Fe$@ $(REQ_FEATURE_FLAGS) $(OPT_FEATURE_FLAGS) $(OPTS) \ $(TOP)\tool\mkkeywordhash.c /link $(NLTLINKOPTS) $(NLTLIBPATHS) diff --git a/manifest b/manifest index 202dddea71..d5737d5984 100644 --- a/manifest +++ b/manifest @@ -1,9 +1,9 @@ -C Simplifications\sto\sthe\sjson1.c\slogic. -D 2015-09-21T22:53:16.694 +C Fix\scompilation\sunder\solder\sversions\sof\sMSVC. +D 2015-09-21T23:49:35.330 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2047811644c5bac91ccdfc2720e49b60965a63a7 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 -F Makefile.msc 5f0e6b3a39f5c6a5e17ad41d7ea2ac816fb63743 +F Makefile.msc fce864fae74a0805dd93b9c7e90556a3d17e5575 F Makefile.vxworks e1b65dea203f054e71653415bd8f96dcaed47858 F README.md 8ecc12493ff9f820cdea6520a9016001cb2e59b7 F VERSION ccfc4d1576dbfdeece0a4372a2e6a2e37d3e7975 @@ -1387,7 +1387,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 825ce3201df21c6b9d5c57dcc6726c306df05220 -R 0407e29107979175c5ef95d6530fb773 -U drh -Z 3c9b1b14e7e53f7b1522a534f080ce63 +P 1646a2bd85f87d03a14fcaec288107f5f6411c6f +R 551d8f52dc496e765eba216fa325841c +U mistachkin +Z 2a24f449d0c791892ffb0b69bdeb0617 diff --git a/manifest.uuid b/manifest.uuid index cd9700253a..0c640d68ff 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1646a2bd85f87d03a14fcaec288107f5f6411c6f \ No newline at end of file +17150ada1474e70d7c5ffe6ba5667f45671a434b \ No newline at end of file From 357e42d48fc842fc0974313b3cb5b69bc859bc78 Mon Sep 17 00:00:00 2001 From: mistachkin Date: Mon, 21 Sep 2015 23:53:42 +0000 Subject: [PATCH 26/39] For MSVC, have the 'sqlite3.c' target depend on 'sqlite3ext.h' as well as other targets may depend on this behavior (e.g. extensions). FossilOrigin-Name: 737ac3faf4e5fcb5855f5f9a1c1ddfc5424e6292 --- Makefile.msc | 2 +- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Makefile.msc b/Makefile.msc index 5612faca39..4eb60751f6 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -1281,7 +1281,7 @@ mptest: mptester.exe move vdbe.new tsrc\vdbe.c echo > .target_source -sqlite3.c: .target_source $(TOP)\tool\mksqlite3c.tcl +sqlite3.c: .target_source sqlite3ext.h $(TOP)\tool\mksqlite3c.tcl $(TCLSH_CMD) $(TOP)\tool\mksqlite3c.tcl $(MKSQLITE3C_ARGS) copy tsrc\shell.c . diff --git a/manifest b/manifest index d5737d5984..1f51760739 100644 --- a/manifest +++ b/manifest @@ -1,9 +1,9 @@ -C Fix\scompilation\sunder\solder\sversions\sof\sMSVC. -D 2015-09-21T23:49:35.330 +C For\sMSVC,\shave\sthe\s'sqlite3.c'\starget\sdepend\son\s'sqlite3ext.h'\sas\swell\sas\sother\stargets\smay\sdepend\son\sthis\sbehavior\s(e.g.\sextensions). +D 2015-09-21T23:53:42.233 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2047811644c5bac91ccdfc2720e49b60965a63a7 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 -F Makefile.msc fce864fae74a0805dd93b9c7e90556a3d17e5575 +F Makefile.msc 5ccd966f7866e922765a9b7f90dd80675445407e F Makefile.vxworks e1b65dea203f054e71653415bd8f96dcaed47858 F README.md 8ecc12493ff9f820cdea6520a9016001cb2e59b7 F VERSION ccfc4d1576dbfdeece0a4372a2e6a2e37d3e7975 @@ -1387,7 +1387,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 1646a2bd85f87d03a14fcaec288107f5f6411c6f -R 551d8f52dc496e765eba216fa325841c +P 17150ada1474e70d7c5ffe6ba5667f45671a434b +R 82ab9439819ba02031a617b27cced325 U mistachkin -Z 2a24f449d0c791892ffb0b69bdeb0617 +Z aaf6fe237967240a8a938b8bfbc1f2fb diff --git a/manifest.uuid b/manifest.uuid index 0c640d68ff..46572cea15 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -17150ada1474e70d7c5ffe6ba5667f45671a434b \ No newline at end of file +737ac3faf4e5fcb5855f5f9a1c1ddfc5424e6292 \ No newline at end of file From 8cb0c83cce2abc8e0a303877253ca17a19d6017a Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 22 Sep 2015 00:21:03 +0000 Subject: [PATCH 27/39] Fix json_set() so that it can overwrite a value that was previously overwritten during the same call. FossilOrigin-Name: 0f16041647993975c316203c7e11f06e27640136 --- ext/misc/json1.c | 18 +++++++++++++++--- manifest | 16 ++++++++-------- manifest.uuid | 2 +- test/json101.test | 3 +++ 4 files changed, 27 insertions(+), 12 deletions(-) diff --git a/ext/misc/json1.c b/ext/misc/json1.c index 4e21b151a7..c3e21dd508 100644 --- a/ext/misc/json1.c +++ b/ext/misc/json1.c @@ -807,6 +807,20 @@ static int jsonParseFindParents(JsonParse *pParse){ return SQLITE_OK; } +/* +** Compare the OBJECT label at pNode against zKey,nKey. Return true on +** a match. +*/ +static int jsonLabelCompare(JsonNode *pNode, const char *zKey, int nKey){ + if( pNode->jnFlags & JNODE_RAW ){ + if( pNode->n!=nKey ) return 0; + return strncmp(pNode->u.zJContent, zKey, nKey)==0; + }else{ + if( pNode->n!=nKey+2 ) return 0; + return strncmp(pNode->u.zJContent+1, zKey, nKey)==0; + } +} + /* forward declaration */ static JsonNode *jsonLookupAppend(JsonParse*,const char*,int*,const char**); @@ -855,9 +869,7 @@ static JsonNode *jsonLookupStep( j = 1; for(;;){ while( j<=pRoot->n ){ - if( pRoot[j].n==nKey+2 - && strncmp(&pRoot[j].u.zJContent[1],zKey,nKey)==0 - ){ + if( jsonLabelCompare(pRoot+j, zKey, nKey) ){ return jsonLookupStep(pParse, iRoot+j+1, &zPath[i], pApnd, pzErr); } j++; diff --git a/manifest b/manifest index 1f51760739..808d022b9f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C For\sMSVC,\shave\sthe\s'sqlite3.c'\starget\sdepend\son\s'sqlite3ext.h'\sas\swell\sas\sother\stargets\smay\sdepend\son\sthis\sbehavior\s(e.g.\sextensions). -D 2015-09-21T23:53:42.233 +C Fix\sjson_set()\sso\sthat\sit\scan\soverwrite\sa\svalue\sthat\swas\spreviously\soverwritten\nduring\sthe\ssame\scall. +D 2015-09-22T00:21:03.350 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2047811644c5bac91ccdfc2720e49b60965a63a7 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -195,7 +195,7 @@ F ext/misc/eval.c f971962e92ebb8b0a4e6b62949463ee454d88fa2 F ext/misc/fileio.c d4171c815d6543a9edef8308aab2951413cd8d0f F ext/misc/fuzzer.c 4c84635c71c26cfa7c2e5848cf49fe2d2cfcd767 F ext/misc/ieee754.c b0362167289170627659e84173f5d2e8fee8566e -F ext/misc/json1.c 54f067ea34f6a7426b998ca0fb411d2eefaeb25e +F ext/misc/json1.c c5e7018b8fe23ba778a24d918724b5963ecaa689 F ext/misc/nextchar.c 35c8b8baacb96d92abbb34a83a997b797075b342 F ext/misc/percentile.c bcbee3c061b884eccb80e21651daaae8e1e43c63 F ext/misc/regexp.c af92cdaa5058fcec1451e49becc7ba44dba023dc @@ -815,7 +815,7 @@ F test/journal3.test ff8af941f9e06161d3db1b46bb9f965ff0e7f307 F test/jrnlmode.test 7864d59cf7f6e552b9b99ba0f38acd167edc10fa F test/jrnlmode2.test 81610545a4e6ed239ea8fa661891893385e23a1d F test/jrnlmode3.test 556b447a05be0e0963f4311e95ab1632b11c9eaa -F test/json101.test b33f38882794a3e3f6f1c39f2f1c55a0e8aaf56d +F test/json101.test bfc81e4bdb412a1659160a4284448bd212ba6df1 F test/json102.test 796b1c59894c6e0f38fc1a3acb0e690573b952a3 F test/keyword1.test 37ef6bba5d2ed5b07ecdd6810571de2956599dff F test/lastinsert.test 42e948fd6442f07d60acbd15d33fb86473e0ef63 @@ -1387,7 +1387,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 17150ada1474e70d7c5ffe6ba5667f45671a434b -R 82ab9439819ba02031a617b27cced325 -U mistachkin -Z aaf6fe237967240a8a938b8bfbc1f2fb +P 737ac3faf4e5fcb5855f5f9a1c1ddfc5424e6292 +R 95f992a7687b0db3b0df98a691005bc0 +U drh +Z 7a61ae480ab77880b942dd9dc8577d84 diff --git a/manifest.uuid b/manifest.uuid index 46572cea15..12b88baa1d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -737ac3faf4e5fcb5855f5f9a1c1ddfc5424e6292 \ No newline at end of file +0f16041647993975c316203c7e11f06e27640136 \ No newline at end of file diff --git a/test/json101.test b/test/json101.test index 762e708ec9..4f1b7056d9 100644 --- a/test/json101.test +++ b/test/json101.test @@ -74,6 +74,9 @@ do_execsql_test json1-3.3 { do_execsql_test json1-3.4 { SELECT json_type(json_set('{"a":1,"b":2}','$.b',json('{"x":3,"y":4}')),'$.b'); } {object} +do_execsql_test json1-3.5 { + SELECT fullkey, atom, '|' FROM json_tree(json_set('{}','$.x',123,'$.x',456)); +} {{$} {} | {$.x} 456 |} # Per rfc7159, any JSON value is allowed at the top level, and whitespace # is permitting before and/or after that value. From 3d1d2a97a579cfac6b5423fae4fc31dc0389363a Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 22 Sep 2015 01:15:49 +0000 Subject: [PATCH 28/39] Futher simplifications to json1.c. Also an obscure bug-fix in the initial output of json_tree() when using a path to an object contained within an array. FossilOrigin-Name: fcb1e327a64134e5ac539ec3d52733422d3061fd --- ext/misc/json1.c | 29 ++++++++++++----------------- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 19 insertions(+), 24 deletions(-) diff --git a/ext/misc/json1.c b/ext/misc/json1.c index c3e21dd508..db8d09b9bc 100644 --- a/ext/misc/json1.c +++ b/ext/misc/json1.c @@ -156,11 +156,9 @@ static void jsonReset(JsonString *p){ /* Report an out-of-memory (OOM) condition */ static void jsonOom(JsonString *p){ - if( !p->bErr ){ - p->bErr = 1; - sqlite3_result_error_nomem(p->pCtx); - jsonReset(p); - } + p->bErr = 1; + sqlite3_result_error_nomem(p->pCtx); + jsonReset(p); } /* Enlarge pJson->zBuf so that it can hold at least N more bytes. @@ -567,10 +565,6 @@ static int jsonParseAddNode( JsonNode *pNew; if( pParse->oom ) return -1; nNew = pParse->nAlloc*2 + 10; - if( nNew<=pParse->nNode ){ - pParse->oom = 1; - return -1; - } pNew = sqlite3_realloc(pParse->aNode, sizeof(JsonNode)*nNew); if( pNew==0 ){ pParse->oom = 1; @@ -899,16 +893,16 @@ static JsonNode *jsonLookupStep( }else if( zPath[0]=='[' && safe_isdigit(zPath[1]) ){ if( pRoot->eType!=JSON_ARRAY ) return 0; i = 0; - zPath++; - while( safe_isdigit(zPath[0]) ){ - i = i*10 + zPath[0] - '0'; - zPath++; + j = 1; + while( safe_isdigit(zPath[j]) ){ + i = i*10 + zPath[j] - '0'; + j++; } - if( zPath[0]!=']' ){ + if( zPath[j]!=']' ){ *pzErr = zPath; return 0; } - zPath++; + zPath += j + 1; j = 1; for(;;){ while( j<=pRoot->n && (i>0 || (pRoot[j].jnFlags & JNODE_REMOVE)!=0) ){ @@ -936,7 +930,7 @@ static JsonNode *jsonLookupStep( } return pNode; } - }else if( zPath[0]!=0 ){ + }else{ *pzErr = zPath; } return 0; @@ -1696,7 +1690,7 @@ static int jsonEachColumn( sqlite3_result_text(ctx, zRoot, -1, SQLITE_STATIC); break; } - default: { + case JEACH_JSON: { assert( i==JEACH_JSON ); sqlite3_result_text(ctx, p->sParse.zJson, -1, SQLITE_STATIC); break; @@ -1820,6 +1814,7 @@ static int jsonEachFilter( pNode->u.iKey = 0; p->iEnd = p->i + pNode->n + 1; if( p->bRecursive ){ + p->eType = p->sParse.aNode[p->sParse.aUp[p->i]].eType; if( p->i>0 && (p->sParse.aNode[p->i-1].jnFlags & JNODE_LABEL)!=0 ){ p->i--; } diff --git a/manifest b/manifest index 808d022b9f..f12a1c2b12 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sjson_set()\sso\sthat\sit\scan\soverwrite\sa\svalue\sthat\swas\spreviously\soverwritten\nduring\sthe\ssame\scall. -D 2015-09-22T00:21:03.350 +C Futher\ssimplifications\sto\sjson1.c.\s\sAlso\san\sobscure\sbug-fix\sin\sthe\sinitial\noutput\sof\sjson_tree()\swhen\susing\sa\spath\sto\san\sobject\scontained\swithin\san\sarray. +D 2015-09-22T01:15:49.994 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2047811644c5bac91ccdfc2720e49b60965a63a7 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -195,7 +195,7 @@ F ext/misc/eval.c f971962e92ebb8b0a4e6b62949463ee454d88fa2 F ext/misc/fileio.c d4171c815d6543a9edef8308aab2951413cd8d0f F ext/misc/fuzzer.c 4c84635c71c26cfa7c2e5848cf49fe2d2cfcd767 F ext/misc/ieee754.c b0362167289170627659e84173f5d2e8fee8566e -F ext/misc/json1.c c5e7018b8fe23ba778a24d918724b5963ecaa689 +F ext/misc/json1.c 8eefcbdc172e9eff3c613016260c2d82893c12f2 F ext/misc/nextchar.c 35c8b8baacb96d92abbb34a83a997b797075b342 F ext/misc/percentile.c bcbee3c061b884eccb80e21651daaae8e1e43c63 F ext/misc/regexp.c af92cdaa5058fcec1451e49becc7ba44dba023dc @@ -1387,7 +1387,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 737ac3faf4e5fcb5855f5f9a1c1ddfc5424e6292 -R 95f992a7687b0db3b0df98a691005bc0 +P 0f16041647993975c316203c7e11f06e27640136 +R 062ca531bf3a825489a40d6145bed1f2 U drh -Z 7a61ae480ab77880b942dd9dc8577d84 +Z 6b7ed4fd95fc512864c2dd577eb1b3dd diff --git a/manifest.uuid b/manifest.uuid index 12b88baa1d..26ccba6500 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0f16041647993975c316203c7e11f06e27640136 \ No newline at end of file +fcb1e327a64134e5ac539ec3d52733422d3061fd \ No newline at end of file From 9cdd1029e5da062f420e381e1f6f778391460dba Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 22 Sep 2015 17:46:11 +0000 Subject: [PATCH 29/39] Fix a typo in the --help screen of the fuzzcheck utility. FossilOrigin-Name: b6ae61fe3b3de3aa296b3e56cd2ec425a5141c73 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzcheck.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index f12a1c2b12..e3d2e7de02 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Futher\ssimplifications\sto\sjson1.c.\s\sAlso\san\sobscure\sbug-fix\sin\sthe\sinitial\noutput\sof\sjson_tree()\swhen\susing\sa\spath\sto\san\sobject\scontained\swithin\san\sarray. -D 2015-09-22T01:15:49.994 +C Fix\sa\stypo\sin\sthe\s--help\sscreen\sof\sthe\sfuzzcheck\sutility. +D 2015-09-22T17:46:11.412 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2047811644c5bac91ccdfc2720e49b60965a63a7 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -749,7 +749,7 @@ F test/fuzz2.test 76dc35b32b6d6f965259508508abce75a6c4d7e1 F test/fuzz3.test 53fabcd5f0f430f8b221282f6c12c4d0903c21eb F test/fuzz_common.tcl a87dfbb88c2a6b08a38e9a070dabd129e617b45b F test/fuzz_malloc.test 328f70aaca63adf29b4c6f06505ed0cf57ca7c26 -F test/fuzzcheck.c 01d2ca69f8ccfabd9bd7902e7db08e13a048dc32 +F test/fuzzcheck.c ae800b0288688e403b9d41ae6666b49a5b4c174a F test/fuzzdata1.db 7ee3227bad0e7ccdeb08a9e6822916777073c664 F test/fuzzdata2.db f03a420d3b822cc82e4f894ca957618fbe9c4973 F test/fuzzdata3.db 1d6044c33a114007f02b6e6846f1fa232f607bfd @@ -1387,7 +1387,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 0f16041647993975c316203c7e11f06e27640136 -R 062ca531bf3a825489a40d6145bed1f2 +P fcb1e327a64134e5ac539ec3d52733422d3061fd +R f5e3ce74d9e1f17ec1b801d8a8e1e8b9 U drh -Z 6b7ed4fd95fc512864c2dd577eb1b3dd +Z b2d72598222b1fd845b80ebe0256ddec diff --git a/manifest.uuid b/manifest.uuid index 26ccba6500..5e7bb9aff3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fcb1e327a64134e5ac539ec3d52733422d3061fd \ No newline at end of file +b6ae61fe3b3de3aa296b3e56cd2ec425a5141c73 \ No newline at end of file diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index 92ce63bea3..7718326785 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -763,7 +763,7 @@ static void showHelp(void){ " --rebuild Rebuild and vacuum the database file\n" " --result-trace Show the results of each SQL command\n" " --sqlid N Use only SQL where sqlid=N\n" -" --timeline N Abort if any single test case needs more than N seconds\n" +" --timeout N Abort if any single test case needs more than N seconds\n" " -v Increased output\n" " --verbose Increased output\n" ); From 40e0e0dbe7f7a70b437325aae41c865bcb87ab24 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 22 Sep 2015 18:51:17 +0000 Subject: [PATCH 30/39] Add the --export-sql and --export-db options to the fuzzcheck utility program. FossilOrigin-Name: 760af4455115669b934c3115d45cffe89c085faf --- manifest | 12 +++---- manifest.uuid | 2 +- test/fuzzcheck.c | 88 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 95 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index e3d2e7de02..43c8af7630 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\stypo\sin\sthe\s--help\sscreen\sof\sthe\sfuzzcheck\sutility. -D 2015-09-22T17:46:11.412 +C Add\sthe\s--export-sql\sand\s--export-db\soptions\sto\sthe\sfuzzcheck\sutility\sprogram. +D 2015-09-22T18:51:17.054 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2047811644c5bac91ccdfc2720e49b60965a63a7 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -749,7 +749,7 @@ F test/fuzz2.test 76dc35b32b6d6f965259508508abce75a6c4d7e1 F test/fuzz3.test 53fabcd5f0f430f8b221282f6c12c4d0903c21eb F test/fuzz_common.tcl a87dfbb88c2a6b08a38e9a070dabd129e617b45b F test/fuzz_malloc.test 328f70aaca63adf29b4c6f06505ed0cf57ca7c26 -F test/fuzzcheck.c ae800b0288688e403b9d41ae6666b49a5b4c174a +F test/fuzzcheck.c b8eb7ee40f6d28548a0b028e0676293522f3427f F test/fuzzdata1.db 7ee3227bad0e7ccdeb08a9e6822916777073c664 F test/fuzzdata2.db f03a420d3b822cc82e4f894ca957618fbe9c4973 F test/fuzzdata3.db 1d6044c33a114007f02b6e6846f1fa232f607bfd @@ -1387,7 +1387,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P fcb1e327a64134e5ac539ec3d52733422d3061fd -R f5e3ce74d9e1f17ec1b801d8a8e1e8b9 +P b6ae61fe3b3de3aa296b3e56cd2ec425a5141c73 +R 67147fe50bd6bcd304574882b2915749 U drh -Z b2d72598222b1fd845b80ebe0256ddec +Z f2fe8ea148ad21aa4f5e236ec8c81968 diff --git a/manifest.uuid b/manifest.uuid index 5e7bb9aff3..36534fefd4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b6ae61fe3b3de3aa296b3e56cd2ec425a5141c73 \ No newline at end of file +760af4455115669b934c3115d45cffe89c085faf \ No newline at end of file diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index 7718326785..4597891c3a 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -296,6 +296,38 @@ static void readfileFunc( fclose(in); } +/* +** Implementation of the "writefile(X,Y)" SQL function. The argument Y +** is written into file X. The number of bytes written is returned. Or +** NULL is returned if something goes wrong, such as being unable to open +** file X for writing. +*/ +static void writefileFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + FILE *out; + const char *z; + sqlite3_int64 rc; + const char *zFile; + + (void)argc; + zFile = (const char*)sqlite3_value_text(argv[0]); + if( zFile==0 ) return; + out = fopen(zFile, "wb"); + if( out==0 ) return; + z = (const char*)sqlite3_value_blob(argv[1]); + if( z==0 ){ + rc = 0; + }else{ + rc = fwrite(z, 1, sqlite3_value_bytes(argv[1]), out); + } + fclose(out); + sqlite3_result_int64(context, rc); +} + + /* ** Load a list of Blob objects from the database */ @@ -751,6 +783,8 @@ static void showHelp(void){ "Options:\n" " --cell-size-check Set the PRAGMA cell_size_check=ON\n" " --dbid N Use only the database where dbid=N\n" +" --export-db DIR Write databases to files(s) in DIR. Works with --dbid\n" +" --export-sql DIR Write SQL to file(s) in DIR. Also works with --sqlid\n" " --help Show this help text\n" " -q Reduced output\n" " --quiet Reduced output\n" @@ -799,6 +833,8 @@ int main(int argc, char **argv){ int sqlFuzz = 0; /* True for SQL fuzz testing. False for DB fuzz */ int iTimeout = 120; /* Default 120-second timeout */ int nMem = 0; /* Memory limit */ + char *zExpDb = 0; /* Write Databases to files in this directory */ + char *zExpSql = 0; /* Write SQL to files in this directory */ iBegin = timeOfDay(); #ifdef __unix__ @@ -818,6 +854,14 @@ int main(int argc, char **argv){ if( i>=argc-1 ) fatalError("missing arguments on %s", argv[i]); onlyDbid = integerValue(argv[++i]); }else + if( strcmp(z,"export-db")==0 ){ + if( i>=argc-1 ) fatalError("missing arguments on %s", argv[i]); + zExpDb = argv[++i]; + }else + if( strcmp(z,"export-sql")==0 ){ + if( i>=argc-1 ) fatalError("missing arguments on %s", argv[i]); + zExpSql = argv[++i]; + }else if( strcmp(z,"help")==0 ){ showHelp(); return 0; @@ -943,6 +987,50 @@ int main(int argc, char **argv){ sqlite3_close(db); return 0; } + if( zExpDb!=0 || zExpSql!=0 ){ + sqlite3_create_function(db, "writefile", 2, SQLITE_UTF8, 0, + writefileFunc, 0, 0); + if( zExpDb!=0 ){ + const char *zExDb = + "SELECT writefile(printf('%s/db%06d.db',?1,dbid),dbcontent)," + " dbid, printf('%s/db%06d.db',?1,dbid), length(dbcontent)" + " FROM db WHERE ?2<0 OR dbid=?2;"; + rc = sqlite3_prepare_v2(db, zExDb, -1, &pStmt, 0); + if( rc ) fatalError("cannot prepare statement [%s]: %s", + zExDb, sqlite3_errmsg(db)); + sqlite3_bind_text64(pStmt, 1, zExpDb, strlen(zExpDb), + SQLITE_STATIC, SQLITE_UTF8); + sqlite3_bind_int(pStmt, 2, onlyDbid); + while( sqlite3_step(pStmt)==SQLITE_ROW ){ + printf("write db-%d (%d bytes) into %s\n", + sqlite3_column_int(pStmt,1), + sqlite3_column_int(pStmt,3), + sqlite3_column_text(pStmt,2)); + } + sqlite3_finalize(pStmt); + } + if( zExpSql!=0 ){ + const char *zExSql = + "SELECT writefile(printf('%s/sql%06d.txt',?1,sqlid),sqltext)," + " sqlid, printf('%s/sql%06d.txt',?1,sqlid), length(sqltext)" + " FROM xsql WHERE ?2<0 OR sqlid=?2;"; + rc = sqlite3_prepare_v2(db, zExSql, -1, &pStmt, 0); + if( rc ) fatalError("cannot prepare statement [%s]: %s", + zExSql, sqlite3_errmsg(db)); + sqlite3_bind_text64(pStmt, 1, zExpSql, strlen(zExpSql), + SQLITE_STATIC, SQLITE_UTF8); + sqlite3_bind_int(pStmt, 2, onlySqlid); + while( sqlite3_step(pStmt)==SQLITE_ROW ){ + printf("write sql-%d (%d bytes) into %s\n", + sqlite3_column_int(pStmt,1), + sqlite3_column_int(pStmt,3), + sqlite3_column_text(pStmt,2)); + } + sqlite3_finalize(pStmt); + } + sqlite3_close(db); + return 0; + } /* Load all SQL script content and all initial database images from the ** source db From f27cd1f3aa7852d29a27eac7228769ce93b80635 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 23 Sep 2015 01:10:29 +0000 Subject: [PATCH 31/39] Do not allow a comma at the end of a JSON array or object. FossilOrigin-Name: 7c7a3f3e9bc2f7a7334d8d6eae183d83f22097be --- ext/misc/json1.c | 4 ++-- manifest | 14 +++++++------- manifest.uuid | 2 +- test/json101.test | 12 ++++++++++++ 4 files changed, 22 insertions(+), 10 deletions(-) diff --git a/ext/misc/json1.c b/ext/misc/json1.c index db8d09b9bc..3dd831f9c5 100644 --- a/ext/misc/json1.c +++ b/ext/misc/json1.c @@ -606,7 +606,7 @@ static int jsonParseValue(JsonParse *pParse, u32 i){ while( safe_isspace(pParse->zJson[j]) ){ j++; } x = jsonParseValue(pParse, j); if( x<0 ){ - if( x==(-2) ) return j+1; + if( x==(-2) && pParse->nNode==(u32)iThis+1 ) return j+1; return -1; } if( pParse->oom ) return -1; @@ -636,7 +636,7 @@ static int jsonParseValue(JsonParse *pParse, u32 i){ while( safe_isspace(pParse->zJson[j]) ){ j++; } x = jsonParseValue(pParse, j); if( x<0 ){ - if( x==(-3) ) return j+1; + if( x==(-3) && pParse->nNode==(u32)iThis+1 ) return j+1; return -1; } j = x; diff --git a/manifest b/manifest index 43c8af7630..d85cf93eac 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\s--export-sql\sand\s--export-db\soptions\sto\sthe\sfuzzcheck\sutility\sprogram. -D 2015-09-22T18:51:17.054 +C Do\snot\sallow\sa\scomma\sat\sthe\send\sof\sa\sJSON\sarray\sor\sobject. +D 2015-09-23T01:10:29.723 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2047811644c5bac91ccdfc2720e49b60965a63a7 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -195,7 +195,7 @@ F ext/misc/eval.c f971962e92ebb8b0a4e6b62949463ee454d88fa2 F ext/misc/fileio.c d4171c815d6543a9edef8308aab2951413cd8d0f F ext/misc/fuzzer.c 4c84635c71c26cfa7c2e5848cf49fe2d2cfcd767 F ext/misc/ieee754.c b0362167289170627659e84173f5d2e8fee8566e -F ext/misc/json1.c 8eefcbdc172e9eff3c613016260c2d82893c12f2 +F ext/misc/json1.c 7659013d8d84a263ae60cd01cdc25d3596cf5063 F ext/misc/nextchar.c 35c8b8baacb96d92abbb34a83a997b797075b342 F ext/misc/percentile.c bcbee3c061b884eccb80e21651daaae8e1e43c63 F ext/misc/regexp.c af92cdaa5058fcec1451e49becc7ba44dba023dc @@ -815,7 +815,7 @@ F test/journal3.test ff8af941f9e06161d3db1b46bb9f965ff0e7f307 F test/jrnlmode.test 7864d59cf7f6e552b9b99ba0f38acd167edc10fa F test/jrnlmode2.test 81610545a4e6ed239ea8fa661891893385e23a1d F test/jrnlmode3.test 556b447a05be0e0963f4311e95ab1632b11c9eaa -F test/json101.test bfc81e4bdb412a1659160a4284448bd212ba6df1 +F test/json101.test 07f0d847d943bf5ad6e8fb60699a7f4c57317321 F test/json102.test 796b1c59894c6e0f38fc1a3acb0e690573b952a3 F test/keyword1.test 37ef6bba5d2ed5b07ecdd6810571de2956599dff F test/lastinsert.test 42e948fd6442f07d60acbd15d33fb86473e0ef63 @@ -1387,7 +1387,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P b6ae61fe3b3de3aa296b3e56cd2ec425a5141c73 -R 67147fe50bd6bcd304574882b2915749 +P 760af4455115669b934c3115d45cffe89c085faf +R 6b381fff3f89ce025323ce04ac2d6070 U drh -Z f2fe8ea148ad21aa4f5e236ec8c81968 +Z 8b081193fe15e32207901b3f263d0f6d diff --git a/manifest.uuid b/manifest.uuid index 36534fefd4..5101911d89 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -760af4455115669b934c3115d45cffe89c085faf \ No newline at end of file +7c7a3f3e9bc2f7a7334d8d6eae183d83f22097be \ No newline at end of file diff --git a/test/json101.test b/test/json101.test index 4f1b7056d9..22bbb4d5e4 100644 --- a/test/json101.test +++ b/test/json101.test @@ -305,6 +305,18 @@ do_execsql_test json-5.8 { WHERE jx.value<>jx.atom AND type NOT IN ('array','object'); } {} +do_execsql_test json-6.1 { + SELECT json_valid('{"a":55,"b":72,}'); +} {0} +do_execsql_test json-6.2 { + SELECT json_valid('{"a":55,"b":72}'); +} {1} +do_execsql_test json-6.3 { + SELECT json_valid('["a",55,"b",72,]'); +} {0} +do_execsql_test json-6.4 { + SELECT json_valid('["a",55,"b",72]'); +} {1} finish_test From 64ff56f91aead7ba1d27421e5a6d5b050e9dd533 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 23 Sep 2015 11:59:50 +0000 Subject: [PATCH 32/39] Capture AFL-generated fuzz tests for json1.c into the test/fuzzdata4.db file. FossilOrigin-Name: 10a214fdb3c13b25e0bdd15c975c21c8890c47ee --- Makefile.in | 3 ++- Makefile.msc | 3 ++- main.mk | 3 ++- manifest | 17 +++++++++-------- manifest.uuid | 2 +- test/fuzzdata4.db | Bin 0 -> 2021376 bytes 6 files changed, 16 insertions(+), 12 deletions(-) create mode 100644 test/fuzzdata4.db diff --git a/Makefile.in b/Makefile.in index 3731741b99..424d839750 100644 --- a/Makefile.in +++ b/Makefile.in @@ -538,7 +538,8 @@ TESTPROGS = \ FUZZDATA = \ $(TOP)/test/fuzzdata1.db \ $(TOP)/test/fuzzdata2.db \ - $(TOP)/test/fuzzdata3.db + $(TOP)/test/fuzzdata3.db \ + $(TOP)/test/fuzzdata4.db # Extra arguments for including json1 in the build of tools # diff --git a/Makefile.msc b/Makefile.msc index 4eb60751f6..7e69589705 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -1207,7 +1207,8 @@ TESTPROGS = \ FUZZDATA = \ $(TOP)\test\fuzzdata1.db \ $(TOP)\test\fuzzdata2.db \ - $(TOP)\test\fuzzdata3.db + $(TOP)\test\fuzzdata3.db \ + $(TOP)\test\fuzzdata4.db # Extra arguments for including json1 in the build of tools # diff --git a/main.mk b/main.mk index dbadd0c06f..128f07dd1c 100644 --- a/main.mk +++ b/main.mk @@ -448,7 +448,8 @@ TESTPROGS = \ FUZZDATA = \ $(TOP)/test/fuzzdata1.db \ $(TOP)/test/fuzzdata2.db \ - $(TOP)/test/fuzzdata3.db + $(TOP)/test/fuzzdata3.db \ + $(TOP)/test/fuzzdata4.db # Extra arguments for including json1 in the build of tools # diff --git a/manifest b/manifest index d85cf93eac..a5c5555486 100644 --- a/manifest +++ b/manifest @@ -1,9 +1,9 @@ -C Do\snot\sallow\sa\scomma\sat\sthe\send\sof\sa\sJSON\sarray\sor\sobject. -D 2015-09-23T01:10:29.723 +C Capture\sAFL-generated\sfuzz\stests\sfor\sjson1.c\sinto\sthe\stest/fuzzdata4.db\sfile. +D 2015-09-23T11:59:50.725 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f -F Makefile.in 2047811644c5bac91ccdfc2720e49b60965a63a7 +F Makefile.in e1afa6fb2de2bddd50e0ddae8166c2ee9d69b301 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 -F Makefile.msc 5ccd966f7866e922765a9b7f90dd80675445407e +F Makefile.msc f090cdf036f3c07fb13aa2f4494e388c0b1ed1e4 F Makefile.vxworks e1b65dea203f054e71653415bd8f96dcaed47858 F README.md 8ecc12493ff9f820cdea6520a9016001cb2e59b7 F VERSION ccfc4d1576dbfdeece0a4372a2e6a2e37d3e7975 @@ -261,7 +261,7 @@ F ext/userauth/userauth.c 5fa3bdb492f481bbc1709fc83c91ebd13460c69e F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk 436f9b2442178303478e30eb9003b6afd08ce22a +F main.mk d12601118f1d1dadebe1329a53a6d5c512b36d44 F mkopcodec.awk c2ff431854d702cdd2d779c9c0d1f58fa16fa4ea F mkopcodeh.awk 0e7f04a8eb90f92259e47d80110e4e98d7ce337a F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 @@ -753,6 +753,7 @@ F test/fuzzcheck.c b8eb7ee40f6d28548a0b028e0676293522f3427f F test/fuzzdata1.db 7ee3227bad0e7ccdeb08a9e6822916777073c664 F test/fuzzdata2.db f03a420d3b822cc82e4f894ca957618fbe9c4973 F test/fuzzdata3.db 1d6044c33a114007f02b6e6846f1fa232f607bfd +F test/fuzzdata4.db 1882f0055fb63214d8407ddc7aca9b0b1c59af21 F test/fuzzer1.test d4c52aaf3ef923da293a2653cfab33d02f718a36 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98 @@ -1387,7 +1388,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 760af4455115669b934c3115d45cffe89c085faf -R 6b381fff3f89ce025323ce04ac2d6070 +P 7c7a3f3e9bc2f7a7334d8d6eae183d83f22097be +R 64646de8f025fcbfbac14050e58f6d8a U drh -Z 8b081193fe15e32207901b3f263d0f6d +Z 8d3625ca1ecc6df3eff60cf48fea0eb8 diff --git a/manifest.uuid b/manifest.uuid index 5101911d89..5e8156b16c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7c7a3f3e9bc2f7a7334d8d6eae183d83f22097be \ No newline at end of file +10a214fdb3c13b25e0bdd15c975c21c8890c47ee \ No newline at end of file diff --git a/test/fuzzdata4.db b/test/fuzzdata4.db new file mode 100644 index 0000000000000000000000000000000000000000..b97ca104e7791d7b727db61aa91485619f3bd244 GIT binary patch literal 2021376 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

%d;x<;b5Pw zXb8R5nZ}U0+)sAVIT|sbvj4v=Dt)}Px%kKE{r?K%|92G5j(!n+JlaMA-@@af3O*w& zPqOGEm>2ruK|v=q*di}jdAL`LCSO#cF8~_^A_sIB%jM?KKeR1`Xifx6!AEudfffvwcS@*el=y&MBGM1)eCnaTmI?nA zJxDxi%zoPZOFE2icMEf{mC{RAPLSGH?a$C)m_fPZu0dV&OAt{^0 znHW5Hh^OXcts2?347Yz9e;0_y$#6RDm$1~tQ!^VX_?)nOdE9~!#@j#i&dvvd~S+&+k#%EU4MG8Ltv)sOlYRmCd$z z)mK;W&7fZY>tN+I*9M7;I;Rtq8!SkX#>Mz{*q9_YVN~R);=LS8KvR`rt0j%+gp`m$& zQdFFEY+9q2;^ua$w7!XZ6(s+~!Uv<`_i$<-W0L~?bE^2*^bvceIYlSl@A8kivbZSb zipys)w(d^#*#CxL+idM~vJnJJH%<{4S;%yD?iq@ejOQ?IP>k4mc;5W^;vMhgmF)Kw z`p>8qLA8X=g70!F*n7P);__#C?m|W31*a~qa*)-)SvplQ==8Q-cclv4+=h5=Nt^n_ zwGR|G%`FeQPb4A#(H}>J|HNth9Q_wmC!%fd&erOCu&B2ehoOj-a>?nC$~8aY9n%a7 z1YUO=$^sp1Rw~bZBLvgN%H|ChB?0GbyF^Yq^@ywdM~U6SHnKGEN;doAMQB)$|{8<$wqFi{FEBB zTWe&SzWs{9JEnPfYvb^)tRi+vj>^79<7d^kL&BS>egD&|h&A%a#hILU=KG)sT)DBX zl#<{dtH9hIxF>}GH9>%DsWAxFz$@8rKa&3mh3Qf0ouxu?D-!J^fdc(Yst8W;2L0ho z;=lyvubEY38{em;8|rNdM9Mtgl=95vqLhl>%wrp>8H9ao(Kq`DhM%4-t4VdI~l={vent@aF%>UGtZLJeM<11VZ9 zF=NgWVhBqy-M{(vgxg&+y43f%Vj`8~|Cs31sQ9CcsQ-u($tWr#$ zY-2$RPiaV5tyRDKZc}GGOomB}K z9z{f=9K)kTdHb*^7o%<3Glf)|#>q`@#wV@3v}br9?nS!x6Z8L*qs39_p3*tRZx(OE z4uG}7lIUmAhj26FxUEX@dN`P7x;QVskk^oig%0LYO?XPN!PcW<@gmlLk*7(PLkRiu z>X|4hyT?jmy?F8Yt}bNIN(n8mB6Lq~Sd6uYrpD`x24Kxd#cO4?1F-UGow&lMO1hf8 zJgJJXJN@~H##U7*a&|7bF}8Jfp2LS?O3T!UsaEir=_UjuerxqKR4%YQD5RI!l)jH8 zptJKd3q0MmuLH$hS4EJYaxR;0i?>xs0O%D}iq~^|9{II_c6Od0>ot{+s-BFtu@{^s z^y!=iG4wDg3+L#%nCvf_7(&lSH` z{8I5xiwBCIEIw8INbv*3_Y~h%{Egxpi;ouf79S|?DsC@sE^aKYE#6qXrg&xXlH!u$ z1;shVp5ocXj^athR}^1TJf>L03dEmd9O8w--xvP2@a@9a3tz>G#LpEzRd~AaQGA*B zzQSXLcNE?VE%iv@;lh1|y9!$iuPZGpEiBC|%`8nTb(T&ky|Of=G`TdP_`k*fF8-|e zuf=~X{$1&J3hN86DO_JzRk)&XQDJf6{KBll^upA_X@wIC#}yC&g^to4^?Pt$U*CoE ztLr;)URJ*o=f(9MI4`Jg$N9YaHk@bHx8mGg--7eBI#y1U&aQ)ur8DaoIVqi5@5TA# z`g)vCtm8ZC;-)(EY4Nr7g*dORUx4$P`nfp2rrw3~E%noJzPWxp&NtQJlofBR1E=B* z^%voMeSI>{tLu|+zOIfYD_&cB5a(-Zz_xgG4OkUd)o#OiWo;wQD{8mkd{u2V&R5n} z;k>+tIF7|DYM0`Cc@4X|6fdh?i1Vd2!sn9Oe4Ht`TmFYDeL`uvWl%L3KCI7gPzK`BhM+czzWWD4tin8RvOb!eMUp zGMr~um*70BN+q6Koq_X=>QtP2s#MB3)#GrUUVRD9-BqgTv}y_Gt}2yscI9E5&#F*a zQ!Dr4d}f8p>a0+$spb4TS$oKLST#rd?#JkWn){WVAr)d`bd)^Ec3zv`6pC-oa} z{&D?!oWE5kT79a14bHz`UxD)n>jdXLb)wtbGd#I&iB-p;k>O* zH9EC24d+uTXXAWwg=%zCg=%zSgqit9KBlULeVZ39jyh`o>Fvwz&n+vDJVv^d#=0H(!;9i&V^^x!}-v6yQ12i z&!Wl#Hfv)@M$aGDoCZ+2yr+NF2ir&jf3pj3c@?3na(anNv~L^s5?5Bw&Wl^u;w7Se z(2z1=ysFza8*lim+_)t=+RB3^`JaraMCkwj1}rWlzc2&e|9n6CBizh&+*zf73id}2 z%9X)_Or7FIJR)-1vFD(#Fz>wi!JBgLWf>5&``8P%Tz$>83+DXK+_`ekbYQe>(d4tL z=a-@Ye{R^gbJ{|hl2WezS=I9r^NFb|oo`-ZKGC;V`4&{?24$Ga?V54D^+nBM+*;N( z1LFd-^}BPD-|Y^*JComCTt&p8J#pQ!6ya^u@WG?IOuAP@LdC#{YUA?s>MZEPz>=!@ z&KC=oKD=kSC$z$0bl96a+W0`B6<`*K14?0e_1pyRPE+2Cso%I*jTve07XAO33H|>x zV5*)iFa#Uf65K`2AuU0?9cLdpWJvyxj{cPF{~E;qpNZYSUXIIgbgZgUOdvbzz^%Ks zB6^n?kHAOC{~JFj(1i&hR>XeyUEPTAHFYL^4~P)4RRjalAz}rbM2HZ-#Am8tl=jMa zX{ir2D#un4B}m5^mZ*@-3RF86(g)EqDd^b7=?mvvh!GRI-?N44fhcJv)$=|2NO&iP zSH!#Wb#rq%0Tegqc5du?K?YbOXjAcB*`}NNx~9&LHgzxR=`0^xMUbIZ;$w>LHuxAM zv+y~wx)Auxw?%4Kh(1h=4%97;SoA!EM-p;V5{MOnST|NFOww!{H|WaQJ=T|r37!M| z9PbG$TQwR+0g>VZJ9|C9i~POdu>8$kJ7y`fM1uZg+99G9;`C)s2KXag+|#-Ni1@>30KDB&B72l<{Bl#{uLR!! z1Nryo`!`x}z0ijdVHD*P)?q(?-W;MOgYAYV;+^L)dmlaj{P&+i07T4|Y;4OFNh)+5cmr%P}%loKpBSM%Cs;e-%A~8;u`>n-3gfhS6ii)e zz-5RWL0?vPQXq6;Ze>8t1N)a(FZK1Ah~bDx>v(%!&wSA*==ulsUg$1;=O59h{2Qv5 z0G6}nQ^F!pBGM;e#BtVP;->8A5{Ja;(|jp!#?B&K!0PJ7D8u=tJ=4V1A(qF-Ozq%`gk5Aom8-QXWxa4qJPsj z7z_J1W@YpZol6>#n{T#^iA*YUgE7H5QvNaj_tDZTiytWbU13Y%r05gbbAO~Bc2z0v zk{z2$#$JsH{FjAr?YissZN$Zk=XG@VSQp@JqamD&kh=Kn{!LYi&$KcoDHas-BKG$& zz`J(O0Ve(}(nv9_^x6F@s}#4%8Br1v<-lWg=D}3ACsC(DYPrwu-&v)=O?Tu#``x4- zlL%z02H=92A(H7*%gd?=$hdD}O0fWQ<^~kGSQN?ShGA1SN2go5UekG40ELl|_Tfv^ z9ed)l`*&2AgL2Mi%3ez}SYnS;g+PhrS5&V+zhcI)skWJcyHw-5U=LIhq|Tio^a&I&?Xk$pfhaz(AI(=F3t%tr^dY@ zT$}~f)!t~OOC&DGr##hjNA)`378h6f&I1Uxp6Y^~kl}&_usx-EZ7B*713UqQZmd%D zLf;ALn`SimA1D9R05og$Nb#(*Ei1!L)8H*RMTC5Lm?*b7VF&?g33`X8iT@R?dvA2LFB#~0&kNY%| zv=9-ek|?r@2052kDO_Pd8JRuhB(0^~%Y71_k$SpMDUykAkm1v&S6^F-*2G%X-kz@O z1kQX#m0}S(t7z;ZbT>_uX!TO4s$?LnzRDF<3Obk!O4%94(%U&FdGYXvFOo3>+blBw=RS`q5-yck{l(_2$+O;9Y=3H-dN((Skh?CwWI}&nU zXLa>;sA`geCceckj+V(ew`=aDSk}#&Hlf8Ul@z_4Yvfu4yeIarBT<1FPDb5x`;9Yr9MXWX ztR@Fpx;i@Vd+8k3p0=;5+t`0Td3BZI{-vp}-JQ1x_4Ole*O{In4CsH7|B2BvQSlC} zwS7yW8_98TY_B48U8JO>$bCTStGwo(sG`Y7* zk>{?;YG$o|&+g(~NBCDXMv_vXhj7a;t0MGV`DHmvxl=Kfs+Mi+$}g?n2iqGTDvIkY zBEe=C646eEU7n|o^Q4n@{Kjb=yqVThPc5C-L1Q;Ko|8Z3JsGZ9s3mqa_r0u&@UM?L z%Q9UbN?3L7^Z8z(ZOe1gN7)b5jSy?lqZro9yE{8Ko)~j%N4pAyMclo%u@K+?9EIiY zrIp3MD&AiB&%#Dt3qLN@KueKaT|?x93=M1h_%s&KndZuMl1P_dT*Dk~f4s{UmPE;R zot^hXTWMt>!#kVk&rY~!`@+p4c1z&Fkj26u1VTHj2#6J!h)BcdRY}JL`M^fjDOHY_ zpwvxO#D5IT+N70At1otg!rYaEjywyZEN@KxC#CkBQJ4p+h|XAc)>)_M7(whafV{K| zyII@uFX;@e(M45^`Xjn_NR_KJ+~o4PRfJk}1FB|}er7e}Agg8b0lX-?!R@ppynV+` zhnq#(e|-P@tKy}FH$~r4U;awDDxY6F3iU}Fu=A}fB;tN5HN?L*Hk@`Dmhbw%-_hCZ z9YI8{aJ9;FY7>F^?F|_Ufw@a<9}#t}(Ghj^Gi~4-I$K_>=hY?v>-dannvf9It)=$& za^ro8^jgYuYbD@)N2An^qx}sgo%5^l36fi9)!A~AyFaQ?fUx-7Xezn4ryp-kf82tn zT3adYgfWV)slqW+<6uuc1j zsYW4qa`xSoXL!vuGq2fWiECIB+*G4zJPksgdCi(^$g67GaXKH3C9n%sh#x6t7{axt}z|ICQZk$5naNg zYlvXyePQCvZaX6(vP*a!b0WLkv?rE$?|x{Lg)~@|W~s%vKJD`Ny>CHnQ@2iOZ(*|?`$6M!-}{cV<*ef6wtsz{ z3(r(ic$ye2+fqYtm$LI&TSjk7j)#JPl5lHg^AIeH)W*)))Zq#Yl=)Ybp88p4k~l6U-3N*yysgM){MYW&aGEyKnb?~|i2immPO zzb@(j??!xt;{d^qGF!+fz zgdFoe5X+&oc*G^=mZe%zC8{-g;B-(hBz9fx1Q4Jxe;5Q{+~V_5!nT}HL-ex#^BVPo zgqmIoCqt-duR>qfhx0%?<6JlW)Tyc-1B3~oKxo4>A-a%2qG604sv!v4zCBG*3&N(U zWrYhJndD5vQV*hkZAA2)_Z2RRp2v;WAGg&g@Yd=^Nv)^sjyLiy z=3_e{?`DA3mijF<3d_~7W1vgIEc&;mzb3+j)N=*2VIa z#cN?Ko_Ipc{~e93K1;t-T3GyU@#@0A6qe(13?Jo}*AO+Pzsbhk-Rbw1cj>?I!M|clDm(uHL7PqQk~brk&ZTXE)R+q)jva78DhsV=F7Y z#Kc`CQ9incST_y!Y_;TJZc8mY2=;6nTW+wfMp1H_)N3y}m->oAO{u7*E<(aKNIBEDj{DUCdi%hEw>NM!j^%LQXaKoDR;shBS@zAZ zA!690JDZb*-JQHbYP|gBG#NjX+#$}3Rr(t?>6)ci&hj-|qHHeTZ#t6yqocE<(z@c; zi(ae)mXCc?kjKu58xE80zq>XYns7(+ zG_z5dI<#j9CFEJQRzAB%(X-OlVzZfchUi%lxpklV0_r_Ys*?AH%75IfFwr?bnGe(Z zY7{x^?iNw#g~vskAAz=-wflCv3q}6ISpYSZ^lz{}ZG4WBw2Q|7C@b zAUW2K{!$GQ1|NA*vsARSrNvb2J8S-?)=RMZiw-=~idb+B!8q{TGDrVCTRyIKKA5TD z;XFi-30wtCMT zyj(qXq0WyF985olPp<0e3@x}JYD!;_QXbKcuFVB{!&XsxH~|QWcr%2G*Gu|>{OnJm z?xP~U|0@*`|94CA&+*ef4g(65x7H99Z(sU1lTs@tcr2Etn8V&$V+s>8dB%txjyOI2 zY`L?BNPGRuTWlamZawP|TUK}AK(Lz_)JezHE@*|Ogb$sqDIYsudy1(J|M`8L-MF2;A4DB%=Why`Iw{=ZFL#QNm zMace7h&~?`{~x~lUxCDUJ0Q1+9y*-96v^$b&4_Oquw6l2nncTTv33binKV3YX}RRn zergWw^Tob9bHV^UF}eTD8p4x4(&WSx4`qs3klkbENNE~d^t2_wCJ@B+dOn6OTxrCp z(nT#8RU%&C;kJ?g%}0ihX);i?aiowz%K!D)|GTghBmdY7Y52$L8pUgD+I;EN7l_Yc z#kDBEtVS^zn^vD@^o{J}ayb%~LePMrAX>UywC|)EA~HVOd@pBc&+N|TP|0no9rGpz zig|&v7WTX=$%z1q>4f7Dl)qRM{PckjP%Feb4fK#&C)yiDVsXo}{ioM1gN!#l{!WZC zcPt%h{1#kmc{><^I7?fHBv0$WN9kY^b?s4~EQ{~|CL+{l>E_})3eOdeYcA@i(HZ3> zH3S9T*YGlVc5+5zjTEnlqLr@JN8D;f6l#F@!ehDyda5V9rVBM#FYQEt`#W3UO^|idyb`7~+5d^rny9p-_+a4~#J|8Ege^MCXVq4N z1Py;A$EqOR`Ba_U>A{s^p|NUVJJiWF;^kR2M6B)aYu0aXUT3LL^S!-kjZLkH3Mrgf zOD(Hi3khj@MMm>DYgEtIsd$2L#@utJrbS@hu_EQK^=l#P;NJCHVM&bw0FPm7m(>O& z|3^hvMWtJd&lJ}e)+lwp&a2%F`D`dG#v1EG z8Sf(r{fUJ62;0jcE_F8hkTyuw|;J8sZSV z5do(kr2Ynt5bIGj*S1Rk|1nzs^IUOB;bYkMW6T`*U>otHbA7Ol-LzCxAlQ8oJOTX! z794Rs8WAbBwgQWcuh`3zY6xT9|EgR{=psWD*{hP*$L|@E<3xK%^*MorMb9a>Ld2TH zJ|L5CO=1!@2;-zsh@{JO9Xs{mfx8Yf_VjiUdji|ocOvHN+*M|o-5K`nqzcKL)F!v1H* zyTIPa6t2OyhojY?9U!#o*(ix9NkUe|E@!#_(j`cO#ub}ZF)<|8LuL#<8$XTDl0Xy} z4j+Quv6_5!Z8w@OHT=HD#Zi6no*M3Sbze4lR_%e%{=mY#ioMfz(_|)9W4f?Tq#IAH zVLO5J=tr@5LhK>~aZ|iE*w*tpi^@+eH zc|)ge(bd)+@1&+ubz5DZ0B9*A8WwLmi&)O;D!>l;44|Qw(xEO8o7~LeLyfL2+xei` zom+beo?UpCO2N2UsGvAdmVCLS))A)ngAx1>a+dQ(NQkq@ckUB|8*sj&EyD{HUO1XyJM3x%Et z|Jz3f1>SH?9TETQXT^+wlsjA84rTg(y3Xe9xqG?_p7eS$GdMVJ4kYRlOR7W?+30(r zSZ==2ywPPB2uIS|WUt9h&1YbRd{9`YXaUlPe+HcFhl$5so4-O{EfAlvI{Xg7}M?31r zPKe$ZA3q&Yd;LGQ2REk0?@HT8-A+-O8ul!@1mC={~8RNwLZp;73baBR;{2vodi;C|lo{b0qk75VF??tc&Gyr1&{>(iPI(`2Yb!-S!K0aYIfJq`|L!8B<9^*)ukR1xNGaQnMI0lE$wJnxbCdeW)*#@dSvx9 z`FI(|i-kt%|MoY&O`=6hys(IAw-%p{+ugkS0ZmY{zFAX08AZm!V`{2^&Mp`b#VgVy zk^`MKc1nl7N>vD}K+n}G(yCAx`Z;KVtLxa&DKIu~9lebf2N-i16xUt#sVF7>{bPD5EJ8+^$<>b{us7|Tq#l^(Of024 z@2H=NV%IcAEbQSS6?j(D__qF`I&BZNCueEARRC8)RBfx{Yxp1eWe~YMrG5q&G--Bc z_mU0Xp4#@>QOp17e89oU^?w?~>DGD&XcCWKqE$|A`*?PO=PBj?&Ztx=omBko;`xQa z!pi8!(VY#;cg`2?u2YQqcohG1R-W^a;U;j`;ujt_*I~i;xocw`@#)L)#b#OMqO_sC z6bV0%!0f40Wj>z^cSP*cSH`RMk&G?Gm9Mzoq0x40Z z=2vX)#$DGh-&n`qEX`39@&Ira^hEXZU>%!^1U{3@RhP$;mnow7hlcWKKWsDAsP=k7Xok7`0Ll&*bLAL$11(|$|J^?%Ev(i@6DE55II9d-bGd*N(+0kABe zKtEikpvLh42(pph5i_XLTsvpm7zPPvF-x3q8|&B{Aej{vuYJ%)B(soDX)4_#-G;4o zgx)W&OA>5mXcThYPSg$82cFYCVp*KNKS)n)0hnWoTP=&*Qb$bv@-0clp%_Jymyx@m zJfvwId(@IhX{X*7a)?Oh$d`ZvWcrD>?O$0(sQjER5xH33{FQ^egkyRCE9;1D-v~UH z7y)?LdL}=-#fW>H$}r`Z*0GUHe|+g>Sg*JN^*;~v82r(!xpV{UE)IyLp6)yJig@Sp z#WH>uE?sqcUmZKl1U7C7Vz%=x-rf#z9UMQ6BjCN;6oOM<$hX8p)FUqni3?YLEWns?B~1zVt&e$2 z?0)H2&$;F$ctdJc3jk*>mdR=iE?^cXc2gqQ7=j_FGS3H()=>3M#-ka|YY>GgTvozw zGbo70_D{SrPYiWX|N*LG!PCu3#HLB4t+oX%hrdytQ&(9h;fFHK~WJ zMdwr$N~=p;sL%3(&W|t(>KEB!bwhFM@VDN8&=sMPWvk7=y?Z@?-en5+8t_)iqvcP; zBb%u>uNE9;CN5ZJpexR5ehqEida&KnKzn-=6)~3+`*o|jL9$JUZbXBHN_kb4ckQYs zqQF&dPJYPLh)?q!zE0zJbgZmF!W5L;KDao0(q}iYyU9$ zu++S%Xe@>fR-}y$9QiC$(>?*C5{Khm>FLOhfcS3@XTrovW zZ%$CJ$C~k@>H#A%)xyFWPRE(nlp?Bi-Z09wAAjU8hN`nBq7 zB1W5j4ft3pMsv>5G|kgUZ6g&(`>YLInB-0+_DCcd#RUE&m)|OcE0)fqm&-R2+tLE) zCb!?>UR$_R$@DP92V+}eRh2TRVOq)1*d+#W;KZTE9SNct!=%>cblgOsybX4lDXhdm zoZq~1aQD`&b}>kYT2;2UQ-HWI(jD-rn4L4I?G;a#%~$qs39Uv|*);|QSw*@QsgKi{ z{69KOWdok70nu1Wg4XBIXaOxvSdP^cu>ZYUn`Y6wc@k<|WWux}F@XY`gGb)Xa7LVL zKeP@mRQ@U(i8yM&ayrL zLzf06PNk_~{X*c?04RWDQx#wSE5H9O7A8lw1 zX(o*2Lj{xWi;WRxWF4y?mt5R*+Za-&=_~hTx=NGiK+AuQ-r=$+?Hx~A?84dTH`u;O zN(Sw|5r414^8gC6MD3m1r8wyn<_oH}tN~94xP6gQkVhSP8RVx?7fdv9GlAu^IlHy?;%p3vJQNXt53-PX7#kOih=<0J)#7| zH@_hjENO;3`8de{%eCCZ&aTsLg(U)X9@lNAYIpdzSIVF}HKJCichi;NLWi^DT{=6> zEpvj1ctg|h1!fryHtC&oZg+<^(oL|zFPLJC0>3U>TN!kHf)H`juazGE1F8r0+tOU5 znL!V}ZVHKu2S_8RiR-;?E;S%^%b_6PI1Q}fs)R?Dlqs7=z)0Y#hV1{xXvOv7--daVX*IUS6!tcA$f_t3jbi_Q z@6gbYQd@}nWz-b63IFQ0NfAM2Y56;1{r^R7Ip(T4vG6?%)VT4=G7?#G&*bD^PoX6D zGx&v;=m5r6{obRm)6mzMRDv;5ziIt{@%?Y{)TsDhIJJ*91#AkucUgT2mPAd=yC{f1 zJ`M0AyB>`$iCT5TiWPdiN%Qq4vf|AxiGsts{k=Qu7ouKw9Kw2qw?i66y%cQ>>628h zP@y6lNP#$i#T`w&YKl>*w9>}VkfExor`y{@hHiVJF%_Xg9SUApf-Ef6I=7whi7cM6 zrx|=mIr12I+ok6cmG$LI=hrJN*_0C*(hMy@HKdX}Kk`F{sxEQV3@S2}f_kw3fgwZ4 z|D7r1^h>a=Qwnp4&lg@J$lJ^gsVJ~+X%87%qZrn>1yh)R6GUiKh71)B8U-4nFvDZM zL*E`U^uJ@Y)Qcr+Ig`u)f#0C?As^)b^+x9=mBSLq&t(D5NQfB1NLw+0ck-AEF2ee4 ziKZcx4Od#w?W9vrOW53GpJ`;i74JlC;do{4pMiI(agiw zroL_}sb*tq{7>SH`ZmqFqd5NOD4jfQlOi*2W3|WsK#vBwAX#m&__RdI-G;KR((Hqk zO(Yp3^_w>S2m8O%%TAZs3feC-Ndcs*Ht7)lvyFkaUvYL$4?;6s6B=(}Myn+)%fLq4 z!!tJ3Z?eF33YP^NGHcOED0-DBHl-j=`6Vws)|9g8I zbkqC+2~*`(sHB#vBdDc3bRTgE4HAavmME><5NyP>48zm8!@C^1yu@<5z^Lmn=8JWUkvH)yS z^q535V5Vd*Gpm+9RXy33j~n!y$G@2ZYu|;x`+Vxi>&(_LtmCD!TEk=?pFAh=&#I-Q z;?fHyjm;&+y$Hrh z50*4n$;P|~vGs}Qu|xjv=dQc?&Cw{_Cc)nn7I4}M4iFvO90q~4YcJcfUF=`HK<#iP z%aQq$&I~8fGmAAJAO)rZ%}!ZCp{3$=QC$D#n$2GjV?&PH`UZJ3TsgvC9$w|f2yZe$ z<*(sXn>l2<^;|k~pKrymH`V0k2>g02WOBsV&w!JuE6oj8828!}pS``1{|5|MPHFIQ z9+Yqco>*@ScO?NHnJBQpjr_b0YluUux`w?|kwBm8LM=^A$y8)^q5E%fSFyOJMcXNU zBlbH!hS$gLzD-aSt7GbdZU{7jpvgrTRJl{IKDA%q|%BPNqBBA#fz&|D_<2ab_Y#q0Wv zJ#z~Ae^9G*)-5A%QmuB$B#voTFEz^iW|c0{ryE?6lv<>F?T5`W38sYm+q}3jGcwtk z=0-atNfW;ze(ep9!VKdgtgjLvGe0 zzpF?Eb{_FHQSuN!=3^xI7bfmlM)e6J4lLs}#-}Yi%x7W}qw1YJSZZRl`vwEgKev|G$UPwtiD+=2Xh_CTve4YXCn} zj02+;EM69-ZZZXLY68m4qRB7P{UgGYNF1pk3W(zn>bv$x1vi5J4Yme7)sn+3obsC@ z5JHe4|9f?bGNHjI^{+zq^{^fMw}_KTn8bESX$1?uNjBf~A?@aRwJEh|k5rf@Fey#2 zq~=Ycxe?SPNlJnkvva_PyFq#FZ@&2g>RH6&D{0TBZG%Di)>EU=-u!ofgU4k7{%j?e z8SqvruUb0H_Wu?Xh<5|V#mEBTo;I=|gui`>ifq{KiLxEqgG#bcp&o@Oyd{ovt`R#^*Fc%7 z9wNS_J;sqM9UD>7&_>2VG~lgNUej&J;Q1SBD2tw3U{%r#Y6a%3Qd&Q~!;$6%$8o?N zuaa?-&2MRsuDMDMXXMThSfm)Ez^_*ulS32KgB7|AFtgKrBAgb6i(xR=rj2E3I*(+6RV;l%=CL^_DHchjn- zpKPAvnIE_;2^p#?lbQLA*l$Xk1y!I5h2ok70o6m!)H(-pIc@V04poB`ys2c$Wg$df zsd%vk6dNB4KSkrQ4m53HrGjiYe6^%YfLi*P%O)9DqJgYNqiYRqWLVsQw^BjE&~wem z0@J|BLw-b@i9oUTtqi%aswtCRW#i67qG&c(+15A}vlc9{c|%kst^W`E|L7taKdJ4y z+3b>?j&Y2+;qi`nkSQoAmU2_+<}FUO-R$gE3Flx627ZUtR$N+&atSu%n2DPP`5)lz zJT-A*-J_tJt+S6QH+$Zt^SMz-f*LpURIN-g%~tUmM7*<*-s>I1KE5VwRzkBzJkh+k zCDGipR-Dush&Cy_oAhPWsv_$tdUyl>sr*xmmIM!cw09(eLumV zvhgVyV}lW2_G*>*HA){jx;aqi6BA5sxHcG-5njj&!1RYpIVL zQ!$57my-va$IS8~wIY*Nrz>pu`kD2{P}P89y8EV`q^6H|q9CX@y|pH{bNxQmd7mrwO5R z+T&-T*3bmg&FLkQXg>O8-yH@LXnM$*3hHXb`GD(}=tXdb*lz}-Q+^L2-D4RBwUXw? zMP=ERIUTRi<>6ve?i(JCwfpuxTa$#7`;gZ7Oc1 zf`p;xy4m7o$U9zxYuOA+5k*L)PCuYdePKL~wFr{2;!Gk*{5f80d|Gf^@}*%IOU@0U z#xP%wTb=}U8x}%Q+19N85sfS4!kn_l|K1Z7-qRlb8+#P^z?Jn&CPZI8u{|6a+}h7* zGB1^)*n*aD><=ffP6@2U`IM3L##Z9M_pjmat%HrdCf&?DV|A9%AspkD*lRYr2a9a|+TzN+es) zA8j$$IxSy+0`mVGiK1;k@Y~M1ZhbSh#e8t^H`_;>0wYcV>hq3xA%}SZrenk2=NK`_ zz9(wyb4vTqq0<{57$rl{cFREoO;6?mCO1(?`q(mMpUo#-`Rp~rO#QVBKssyuuM~Yd zDtxtYIereC<6W<;Up^svYW66MoWX^9*Y9krUp687{H>!!n(vZ(BD$1fF>d{@&hhHm{w$%Q4n$ zV`sRwC4?dQ)*R?jUSB3jeNaAi7kDhrY0D}#SDzNT2uwK0|2vckaevyKdTJ@qB!@@* zn1_k96w=-QiNQ#Tm@ILKQ+f1d}VT73~fBzHm|4wJ!Sjxrt zm>QbLjPL(8r*p@m4Y3SnlC#@fWm{-qSnS7}a_Y@5J1L^#JQ~Y#LmhsLoqU<$>*m<0 zEjvuV#(qazcH{@fnK&|9f#0@aC+dMPW5Td|4U{(i2mAk9UUqe<`(#NbCXrvV+*$Kt zl3FnxLR~o9k*viEDTN0;;KOAwr^!))zX~_LWfF7?$ei)sifK-nN@)SFu;;{e>vc!4 zp~v*7Kn{8*$x3=NO%NC`hlCXn~u7 zeLy{B$%CPDQWFOV(N>4UaMUkx+;ej=ICx0aq2&AF%8_9wmZKoYD|JZz{~`SNhxQ)x zDr`7AQ~Zej3FN%QF@#Ys=0ZHu@~gE`fwxFfEkOn78PizsAW|a~5(bk6anN zjV~Q>NAv|0XZLd{n}?8^Yd}`6MBY-b;6i&x@-yc>PL*_#GT}e-s%wa?Qb8VTXc9=U z^iN}e)s2Q1aEoeqEnEdu}l@dF3+LyJv3qVQ#-#L=LUa7qr9I>IU_4+>1SbS=|x zlR$=Jo{k|+CSjQRyvYM!$1F8q+M;QSP^loV(ld>M2HhK$fBl>(#W!RLxVl%BWnjj~ z5JoD73l|;#O|SXfx$~!TMf~5Sil)`ihv8kPNKw#vRsGXOErAT|?~VajA`YEQ?!&a8 zx%Dtk=7zz+*XKH5AcsM*yw>2=z9}-Cpjq5uN0+85oU>K=l%_JEtyGZD#)&lu>15y9 zTUC|GV1?|FM1!jvURAo!MGQ!>Wh!_Gic8QN&d3w*SyR7aLiFiH4HxH@)&j0| zw8Svodr?D!p=(h#H}5S=kPUAcU@!@#@~YaH*Ke9ti+)2y%q60x5P#%IK540{-R4_| zU->uW^`-JhP}6N()wYCNb3`GSjS|M9QA(*0x8KI!@7TFbItklNgw3)L-|)RGY&l0xn@CTuE2gAeJ|L&rVn><|&M7{?Gws^ls9hOD{M zt7T$nu#OtXoBR%^)C;K$rwjBGDX4q!MKK{#L;l}K4>iJm8Ty(EyHZ~X_#uU&Dl{Sj zreRYeWeCo~QY2I86|In!bZuY6Iv1TO5sBzn>oMTB%$^=)&&wF#tsPKI6{Ud?r5A)L8gw4 zrQ*ftJG%1vj!J0y%c3Cv?~fOnq_zCk8=FqHuCiCxjCv-R@74_5$I4FNW{ta_$lIW? zg8cE&BopKpsIN5@QzVw{S0z4zsNvWNuQmz(U6U5tkU$m*c{FukEVRrg@%ng@VpC&I zCDrPnp@dLGG~$;m#VZ*c|7xz4Wb}YBZF6`NGFmr-6}0v&j|L_Z#4uO8w+085NnXd? z7o5jnO2piC2il&Y-bDFNdXV7b3=Y;Uesk5m<~mbzmExH_O<{E(SY{H&sR>_j+nA1` zS0)pNZ_5|yib0rPW4;`lCo^zKd8hcfz&J4gFR`-N+1l^4C94g_To=(?Wo6?Te7#g! zTX|W1nx>7(heqK?@?Jt0s24Jd9W#?#gosRXx!)f_{7u}{Oz}ERiCLW5O$o0>)VvEl zA-K;658IQYoOHAV7!^548=-2nL&h#&uHKs@V)psY-g$H8%*CBFmJ#5+6VcbMwSKG- zea_b~rh{r@VA6R|_~=l^(8-~|X>jlxTz$`fpxb{So}D*u{`~VUm^DA3i*^VScx)#* z_|VjbE90xRT(yzy>D30JL-#dcnMl($a{s?|QDNOkYM3Jw_M2W+zj8wK?z#ErGO59Q z3;3)U>*(#hL^ioO2lC1WSLc9`;7Ko*-sDjM4k&bO#VE7ZItmN8P41x>awG2EKu;tT zld_@uP6g$14uz(GIXcEjY3akr7&!!$7i^5s_x}L?e)nDeVH)+I--1E2{Cv9p44KjZ zTD^Dj%^-WyL&aSxpXMbn`sWCRf6#YSLbGcOg{F<`-Umuq)ekBTV6{O(*Sp1r* z+T?xA>-qoE0qkG62wPVKT#V>_Q{DW&`qgC#PzULp;!onae2?-`>d^7+upFt@@vS1G z{{#8|J=37}Qj}x9_wkHv)8r{j-HC?2+?^E#((VDhjA#KhnH;- z#z~#h9T3Wt+(8!JWxRt-BXfztFQ(Xq2hx@a6Hmd}mOT#hdHgQ!v^&WG>IQr)MZBDT z%|QZsDE%6{Qt7;#$9YEOdq<5UQCQHx6B46`Mapc3q^&FO?6?mO{!DR-_{kdoFGlA^ zg`;uGK0ZIIzG7lj?(c1ENSlb(s^M!?ycxZt`T=sNbFV$(2^Z)O{%~FWstM8emLBqI z*>i_zyi9fKRLicFmo9kMExD|;1WFsoC{o~It1K}7hw%4@)~)7~O5r3cOCkmKuk&@snu!&BB%%;enz72)OKsRnKY%jG2?D+ z+okoUV+8F2^FEOOk4n1Q@~0_m60Kut1Jg^5W4E?>z1e=VO@Tv50m%Q8hp_n86%AeT zw9zNp4Pl$1gS%+cuAazu=)%0ssivkhET08%G97q((vLf8DP2$Hpm4QfzqS@{dr?dt zMK#^_Zo`b`z((@p3#9=i! z$n_P!+5osS>!UV!r^_cY)1k0qK^q(+Q$3LXj}dCxYH1xQ(FWcsp?~5zBmiAURaN?F z%7TjbiBO_wapjyE2Rf#vWmjoR#uB#mcB(8dTGt0_8$_bL%gLJHETc!jutG27|Kn+9 z092B6A$n0NdF@MkfmJw=qRVAOMWUsB#B&g(DF^+!N8`$m-*0PFriA%DVl^uJCy@V7 zILpsqD)rI2-gz6+kw^hBQhQ8>J?qh(*&-Qc8F%Cx_ZcHHFf`>)zxv2GjG(g{3v~o} zO+;LEs9GPUAK`E<+d~M}bQ%+7koxdO5UiByUFkb`BXb^$p0S9f<$*9lWLc6Bd$;)(sR|9>PLL+1^;Anco|NZu7GN1{P&*SSrBu|)yM|0f&7 z2)bd^y}FZAL;Q$-a;AoD&$P*T9_NcFsrHZ9ZZK6pkDIJbIVBD!7a8*Z$C3wdZZE@k z+F4y_^7skzn;c;}QrzTQM*Q$eEw00Usuo|MS`y|TnUW!soTC8UjcX+l!sa5Cmvs`49h z$p4=t_wpMEJoASr9CRPw%Vrwv3AM8~K>_f|sCOS1wY!hOk;?66{9oH^v`=PN+VOg& z)@fUvv1xT=>)?E(bWU`IDWN+DhiDlfP#BFd{Ok{RlX6h}&k510sPwi%PxNUdhIKsk z^7=IsqQ5(56h5Pcd@p#T(2+mB~;Ji3c}$P74#vI$N2@R0vcYg0jq zwjY0J{P-tTD~t(`RpP?T?Xa42k?e~!FmgnNq1NMjIk0-vdF8F?P(yxDqc#+j2m|*bJUDw z#v!!k+1Ln$FP0t#PQV-oq`b&y$RYoql`DeN1GXz<5C#)r;qZ&d^5@wW)`8b&d3iiT4s3WdN1Nr|P3!C*T#eLlNY8+jV zPZ8!r>zJ1E$g>+s>K58Ci6K`?mO0% zcs*$C+BaKD0nmIrIuDTlKh>Ri;v4>0C}rx@*O9LNaD}FYF{nOeu{Dy!*{Vn7BS6;* z$pl;Nf}*RKoXIS$lkhM?w(f3r*PV7`P-Xz#tjrubgvXQWkxlPbI3rx5W;nhf7)oE* zi80`eFgo)4U&WbWTd74U(Jg45h%j2Q-h#S`!NmL5oE z_6^$K|F+bxYy)dkU<4@u|Nk!<1P>)J9(y|6SrCeL?DldzJHR#@x3!(O65&oox}|9^ z-gar6oL_cIqZ8S+;9hZK$31y zTO_YT&@IJ@WXADbH&t3X@8;ZwYaA~6P}OG=n=et5iG4)GvxNMAk(tT-wikX_{Ng5s zTpb1rKl0CanlQOw5X-n6CZj3byuQK|m8FL~nj$l5Az{x<4>9tSWSu5x znFEz}yqxxeZJYY7i_(Yw|6lVopEfxt%4(cO25nROdE;7$+Q{do0N5wDz9H?xhvaa& za(G=_wDnD#CgKjyDd2+XX#c9dy(`*3F&~IP{=e=+ZjpzdgI`3+?a^d=j1{fukH@I? zOz$%cO}w~$j64OxOl?b?n-0pK9{F#XX+@!0#0i0etV8L7q%3JZ6!QNKqYbnsNbWZ^ z#hiqNgP+mxtiS9It)Kf~-r9`0nh1g>6H|9W*Aa!{hfi#Pvm7(sS~@|*3?9wT?EbAT zvVp;1!U45D0z&$>Xv9Zrgm~+*fY6iHn@Y(4b3W8K4!9F$EzR17cV}@jzDfg6By7q; zsU)p5ad6~6z8ZO3(JrA)ff1vC6r{je>x*1#2O$5?i=IOZO%08Aj^(ujKb2Gy8jUrP zOUTB1n}Ucw4GFk?i0AEZ2SMwDF1-goZZ92|&%*N+f}ANP=3sskZg*3Lu&ql*dP zNLGZPP{KW0C!$InX|;=TEG_6;od80I(CWlgzOP%A*1MCnpZ{D`mLBTri=3L)+?e)I zi+Gr1b@ZEIsvIQnBW;UYLzN7kv}YQ1rIV;Ks_XbhdhG!1|5=KTiwf69Kf(`=&rhqb z#x9rrs}F-+F5%t$?NhI=UpFE8;nAZ|9TfNNzc{*nEy!1U*(j7p0v$g{Dub#aLkQY| z8(ZqDjD28WSBn4jopHrRir`e+e}YsUoi0A#39K4cLf_a&|RkjA%91}?9P~TZ^yn-X=6C9C;<8Y-nc^eP$LW7 z*B*jmW777bTqCPYtR8<6CRTfiW6_I({QphLR}#L@psJg12+9o8lgA*AhKHcWk0;gk zqEs8}u9;w#gLG~W5(-*4CttKcJ!`01(bD<}_tITrivm)Jjpq^~Wu(;ekpJ%oSK(0S zb>tV}SoL$0tSAO^tzsCJ6%1w`SnGE|Z=$41=%08FsvbRdt4UXlFE(Hpf+bo7w7r5s zx1LOlKV#m6A*T_4u6Ix)(L$L8Vx|DEZl6JECbX$qS}>(=TRm|iL;?;a#<#~AOnRF$@Y zwJ9*t6oCByaHPu^Y51fibs5kl?eTe6iw|>&Xg*Jxl(B!LJ1w5p$7M|M%Pg%kIq3); zNnRA&e8~TgxYMRufO=qFv6F-0X7hscXk{q6SPtslD9aE;rCAl}z} zqY_DdSD}qaN40Dqx0x~5;SYP*L+X%!q4pB$42mQRlb}cJBnT9{iyH}>3d)wj^OP3_ zxUt%W8WVzV5j|wlXe`B%mn2B@5gz~iI20DdOQb-483cKj!GV}Gjde_ zBewDn!3O3I=Ru4kj!|>;lpWT5jHa@t7@F<7K>q(hR%DEsf&|BdaMdIbh%1?u{=<0e zyCi&UzUqb*D^S5P`@OTKI})w%Fpfy^6C8Xfy)c>wlt`#^diR1d9cJR^)IO!RGlG*a z?H+`!Ohh`NKPo$mZj;HYbiU0uhUsFFjKY)<0@l42cbP|a@6h5uQMJk3{?e*KJelr) zxTK@2ST~fjXu6s*QhX0&k}pzjN+mBTIntLa##XKPO{NGQAMtWkx=(R#IQcsg{R7Ps zNmWpo$A4rM9aq>!ceJJs>@sCK#{OX+Nz^EX{SW$$k<9)v9P&`LLHj>$^{6CHyi?(G zR5Pl(x#euizxNSf6i0!jV+_MLa`G;CbIgq(GWiTyQ7NmR%vChMRM`ew@G!Ff6#t`8 zm>%JO`$(n0+b^qMKOy@4aU0hIY@Taj1W69^X3C6_AWqSn&FD|FPB9mPVP}PqAW;q; zEnZdIR4r{CGeWzWSar|i_+aesAMy7By_W1&w7u$Zcz(%-G(;zlwpT4i&mZ%)G9BSg z<=FJ9nJ2{WoqW}dZnU+A7Vl)oKFc%V-UNXX+7j~rFB-0uXlqQH$fL~E+zuKA=Acw} z8=2&bl$%m*oz8?*zj_5q(lA5ZwJ?;Isdx^8%@lXbYvD-A9)_%0BB=^K!umQqQUdw^ zSBBlXUB%cz($qo`nGU6K1Ce`N==Ek4x+b=rXnuQ+JcMn~hNxN{iQ^Mr52?)N$fxB_ zB}T>z2&x|0yI>2xz``WXE!5?;Inhj`^WCx0S0QYucR9lDBv)FiSwp;8oE+o(ns60j zzj~m{UjIqCbY)$ea#3@=`B=GhW4v14@S=n)FS~_yVKn0Z7NWfo{XZ1Phc?%5m=OKt z4dXRhE_gfFpcN?(m+f=4R`ej8et?tkC}`Tv<_X|SB@eE1lxbu=mEDS#6|Nq9?V(jk!+x+*iKQ5_i z+OpHwx}G?l)E&XQquZ-(_sz$9-`or>3`>a*b3~2i{PKO&qfLmFP)>uk*N}%ygXRok zNdX!&R>vDvJJPL=R(Qkjn`>KqL(Cqx#={xDzpQJk61Jf@;H+w%Vu?T~*x-M3{Fh3n zL(@OrjgXH(3D!yahNKReZDPLMV^vLgVWaC8G*Q|!O}ul&ymC>a$EHSKICS}=sQ6R- z{Q_bzA?1+5V$LKs*LQ5$xnujSyM)l;nkCHSvQl2x&OFf?Rtqr_+L=%{Wp=tSFY45n zEibT1H%b*F;b+#PHO5MpncN*0MAMFue!)&OW@cF1Y1$z%XYSnL6ELy$HTJ4V-P~xY zw4N8T`(z$5L~VM?be2z>A}JGW+ERK9iAusa8RY-Jf#_i)M|=Fvj4MZ~fdZWPZF)pw zl(|RXlvHN5fUV!5Ip!ZF?V6euy{(ND+{DcN)1Qc z73%SNtFkiq$x)imDq!L#-ZbiQZ*NTJXe6A*@p%&%d5yCYFSfFAq@OBk9`7vEZM%X< zXO90BPKofpeRvf3;EMW96QXBNZFG22k{^6DZw?yc646lBsVQ!t_dT|vX3k`*yn?I^ zf<{!-DJCJCsa&fV34`zf0z!g=snm{WVmVxj8bNv0vncLXj zlhg@{r~K}3D|8%RUlgTo*P<4Bq}mEUwG{^x2Zj)lK?Q;2C}NuT^r3Ck_l(cx+1;;s z?`eDAT2-}Ht(x|(J)N`9`D=gwe`?hps#dM3R#mNC+gDu4r#eKE69rFl>Q(YKUB~GO4B0>4nd0u_U4XZx(=6hP|@Tw=>NYq%+NezV@GndSjM;!$MKGu z2qCE(QMha5Jb6RKke`qbWeaNXloqR%2cnQXlH>S9h2~VZYE$i=Y(-ADu0Ut>eMmsL zU;`&Z22F;jB(B*8Qs}3?2-tYcjLa^dxceHG4kf-UcsS(kYfr9}FJ>L7i&@M~1hjaH zAJn072LV&LjooZRfmQUU7RBt9FOec=Pzba~6BEfe?;f?GH=RYFmWcn`|2PGI^{5mW zM1i0C#$!)Ap#Jb-bC@sHZ;SP@WZ5xp{BX}ta0N{22Z8VZ&q^)! zx$2VZhC`-?Wzne_rav$@usb6903Ynb%Fq+kb>-O@R^cN+DE8}=v=h48+%Rtw;^j{( zhtv%6`5r&G5wez1=}B#1vgd~d87YtmuhlI(Md(*FQY;X^*GXCc@)@q0He$=#H9)Dw z{*f3}T{FoZ2X|SUHmtM1WgPUl*KN9?bhnVrO{l~}hi)y@i4HJfDIvUszoFb zN)GG_Uox-C#TG2@8au^@!M;&?ii*HXs$^1IH4{W4GO0 zw2-0u-=Gahq3zWK-62r7Aeh}2|GQs(gHrFoAMg03R~&oB0re-B&ty7Rsl}b%^N?dt zKcN2NWivsEr=pPP`bdbIU_|pI@k0YIx6QNl3Jw+nYe+74>}I`j{Xqh^X#S93xO6_V zmr5-_;TPaqhI5Zqj6LP*7DB@NauUxCb>oi6)-mZCPoM^f($$1ll;#nQZY7c7!FMP! z!MwYd^@s}@bWR##BR&@1-?-K`rWutLrVKFwUE7GH*~ znE&K`=*C&vuUmT@K|?4_U_>*#ljWtS_P`e<#L=QX;!Xt1HX8?w&2xx4LPN$?rlh{p zXvITWtY)b5zJ_TQz)~xlrHYr(^nT#Y$$LgNLrN{aJQ^X%`ZTg@F-2JG{LN5L3AxRq zDe;+?x3*{^?(u#4GOzWNsZ$TZ0{sT87wG?25IF8H1-^2OCTMsOL7JHF{V2F z-EH}FOcD^9&5l$IspRNqpu9ITosIqrZj!Epa|X}@YLLwOT9@Yvdn2nL6Hrihul_&_ zXZ*4wQ}cL=7y1fWiOIc{uo*VLBU0~Lm!tHPiln}$XX2_yhdwT%mW52RaquOss_ERm$e+{1ZnPfxs5C;m>du@IE70@A2!(ddSlKhwYZCc zcw*sUy~S4(aE+|B46CdSOrl}vxNOz5h9Voxi;>-aN#BqkoFr$a1WtVf$is;;>6z0$D=g{p z|HL6u(@TONI)hs)3Gj(06vpI{mW163q+ja_Ac#w#rgPrD6V-Rnf#3f*puSBl-n{S2 z)K3ABJzjs>v1cDpZ+ce0*gF(nuqtIcVk)(`$Lr5L_AIFGCH<=7s(zW(-vEF{)MrC= zcmM5+jvYOq{{H(1R>zfu%Br2z@FeD;H+jHlfq$;CP;%5xS$)=^gg5nb=N%#r!jdr; zsMpnSx)s$@gH|{owvF@$#G9W;QfhJXyY7DMnFrKIP9H@OJ>o}1hU)GN|6i@CA?ATP z`o@pNTJnymF1=uQrtiaorW)!XnoWqB>+;u1YCO!b@)L|~ysW*26I8fO&jVRxe6eQ? z0pK~Hjv}Cm7U=Z}Ny)@iZfa_N^+k(Kl>tqNrd~r&fe#+)Dz*3;$tVE_{7mx8vWt-& zueZ>M&&8)t{rHcv&deV!#{`wZJdK^HnOk`&ID-%2gM)+(`_*I3iqjHPs5 z%|ljD|LtD-2IM`*#_NQGjBO|<=-3%i~E zF18khNwh?%#oYoe!7QtY1*)cK7T6!#Vc@vH5lU;L%Q^_8yN0Z7vyIlQEH%_lPT(=G z)lMP|gaQ+q2z^DGL;bNc`(!B!sd{sL1?d0R*cfqb~~q!nRrWjaXNshMN|Y zjwTLKqlQmUI|PKk0Tbs%OEcTvEy>0+T;k0d`kO}(M#$^-Ig{>OWIn>*jz`VY4t?GDgq$7ECl%L7^R2q!Xj_U_VzB1bYD_`K`b!+G;r;(YeTUljEcFMFbUNO2<+0@f z^|Ph4f3$Q2w#vBuVTpa{)6$XOP};3pTw0pa-lth|k1Cfr|JdMc$cr#S zo}wOx79( zdka-%(=H~0AB`JkYvQD^;anm%yjX(&7H%#@A=`Hp>A9^)_^xoKwKIZyf&=MNNRlqH z5Pc)X(7%5dQ8+?iHW#;w>CuVN_*7hls9l3VSSr4Y{)}mIb^lLD_~RhxTKPh@EhCuS z-{M*{ActZ%-~7{jak)G>q+gIPlv6GdX`Vbvhg~lZ5b&}V8y0D(sa5|<9jdeh=%o(8 z!L$jHL5Ta=Kl`))?%-mRg+)xseJo!bKKG>nwsF7jR$o2zx($_)1@Vl-S?k8qWkoOP zPq*~{_p#5$Tn4_hiR_)m5hQ~Ge3{CSE?aNV_uZ_;MT-v$4!36MwB&_wGA0#1hj(M@ zG($pVjZ1vI1IfmSyp*6&F7SM*nV^{LejNp((2W3ps_D?10MulizVsTK4G92*7Xo%B zGQvAHtDAq0xOD6!+Aa7gaCp>#jK>;F0Tzw$X3jTLlZ(ms2f$+N|4HJr%(g{^Ne}Ma znUPNeQIqZ`1tdgZ5O>fQ*GHq}Kr}t>K;ArtR}doV`DvDxG)=WG@5&&{zr`PT#^wb_ z#2in1xe5k4s*dn8km8k4gXaG)$5%Vg*1Txy|8@MIdac60O&ve^qGQiLpnh$@&VtxX z-tsSyT2xZe$!LnKR(IGGlC+p&DVLt-mz6BZ6{JgQ?*ORGtXaVxqT^v-;eLB^M)9%B z%y65W55nlGrUs_0eU}|A@cD^|L->o-*s9g)eVaW_I`O5{!gk=sCYB$KRG|+brf@|2 z2(&iY$kG#Zk95)z(zj3YR+Qug!O0~z0dyv$;t%DvxkVKv9F1 zVUdsda2M%8>J~GDJ|EQL9d{l{j-`T@U_;|s&bQ?BS()uI`a7c7=Ue8kWf*Hz$uPW+ zJYO`SH=ZDXC)K@#s*`jRb+**hOdy|yh9^740u;@33x?KN!!yo6>Chnz&@VxPSns8! z6VWWDZbD0x)8_y0S0~iIx5LlgJKk`YV=sWnp>G}*p(AMR^&=TC?6muxd@*y(Od`k< zR!S`nzV&IxE;yjxedaL4n#M#}Wn_U-9g+u2V%)RWuGpwJ&<(kYgvkFZ-HT z$KfE}&bxYLq;RNm070O}SP33|s5s7Sp{buy$Pzg*AYx(p>0r?}Gy444$3AxXOD?6hGSz{=qcL`J z*LP#C1*=CitU8%lm+gKwHaXv%fB5#>@AIuUA3XKc(+=K~whh4fzy14eQv1II zKlRum3cTj*V;3G!uPutczR%SkzwP5|J05@f1!tcvYXgA~SFrWB239BFNXhL7QYYKa z@q&)K@fr;##QrrW9eW`V@2(~8)qU(r#A9Vg>gwnSy~p04Y`3}gpE0@J-iM%8+tUt? zgGfgIPp$gDMamDTUjM>l7aveJKBYv2W9@U&1yH)Pac7lUeA^E_<=90B)Q>!%XLTQ! z6+)=GJ6ts(bP=66&D?Dh_vmW%9WoQccQ>c}ZZNpb^~UnTs0I6;Mk~3o+1z%bLAO*k zW%bv$m~5*5S8DM9F4{iz`Fe~?0ZrGe5IO<$_XaO`_R&T+YM)yI>r?Ip1^f?R%5EyVL5w-JPc7TJm3W7iM_=(7JGv#;4IfHTZdG zcVsyO7At%CdKj6XJ2v3!t&4TFo=SmX6v!zJp6}pynEC&6)V{ylch2T~knOGc-CuF+ zMF-Sp@6~f!j5$TX__G8`EgtyRuQ+ze0rg93$FfOC{cF^Imqv3J*V}96LGIJw>>B4L zcB#Jt$v6%Ed7+g!;&?z%#0$C*@PbNME_ZYu=`*p>zV<|XuAUi%0;hlP;~pmq`eT`? za2E=ko;g7OGgl@%{iMlCt_2UIzr`q1?es}r`}scfiC19 z;ofR~Mrt|xDlFwM^4o)~bn#U1#y*IcDQrNAaBAXRy4{nz{d?E5hV zfA!cn1&+Vq*ozOSpE_^8tBF!J5$3Ljfx1?-N!!t-ZlxAy!2jWUZ_#maJt_q%1xBL) z=>J)x6;=zX6bLA=MO{mbs_|($g=B5p%T4I=cJUeNy#WQhjq%tC7CQoqnxgcpq?(_k;HKJk?s(OUsU zcDv=>$KIDOkL&W%8D~EzDR#4753vo%HfjVX=Gjg)jCNq1K85?|&};4gbbT_WKw#GA z;5m(G(u4Na^}m21?b+K}Z;|>w>G=Q0Z~Tyn|NSnt@4IF&e%(eCZg{}4mmW|zJ#(xv zcdK;h9><7C;h6iAwv%$nl--q--a6)PW#zbr`?c_1I55?$~8e-SywFmg>IywMUMEoaNRmdT8#CLx5dwp*!JmAsH{{Ke|&*@`MQLS{MF|XHcriNR1f%lsazUWPD(?ixW*4?AS<1YTJFQ0Y$R71 zBS|PY0XX;KOAnuU)}g~^Lv47~uN`yc0$@r%FD@dokV%smoYbW`M0M5`&9Z&R4R6cX z@a6K!OXC|D#Foq35kSdvd1KrNS{g>nxw#HCXB|3pXbj~g93TxE*{HnNXm3t8GOxT)CN?-YM2%TCv`~*r6lH~= zYmHKibAzkdin(M5Q1?Y=peWMnBr{Jt_|S8qe3HW7wNYZeAIwvQ;*(1 zb#e{oPO!<9tkrPRJsH<;6CTy;Qo_?9Hh?0{Iy%ggDC1=osZ=d^PAFt)fBg?QEXeoQ z8Y`|>iZWb@H6ldJYdU&aN-ZAkv__YX2)JXw{4JDr;>3w-9GUXy(tyAq(77cRU3i-G zp9^wE`REHLzff>ezfnLr6KW%{NCvUBn1)Z`dK(>7{xpet1ogKl;YV^>q zY`l8)16w7Bs2#62zR1sBKn~oOK-;xCnL$P;@$1x3jfYr~L%j@wDCU3U=jTT!!mE%m)SfOjAkn1Lr{D!57U@BWTpIf)_ zNFf&(bZ!5@Al;_K&zbFmTE}*uFlB6?atfb@=m`l8QO(+hvR1%dP@?k@5|r#TuszdSdfVT`V%TT zOu7ADaUv7jq3fXxyrD(_Y4bR{2%xKpd%!vX0|u^si$s7~ADJ;;oa=2HxCE$dJllYn zvu=3Ph2O<`pJ){jq0e-oUD{J>@dP57OB2<&iw>IJW`xUo&m-=OlO+PyMj292H$RMPQB#W1yE41a$S-qbqtGRfnmjYg>dTBM}LAJW{25 znWb8|9tAA3hq(bW8luyX8Xkvd#SLX3VUS4o;F9}q5E;Urtig=(B~9?aI#79@y3Bb} zO{v9`a+1T1X*b$o5dm4O%HmyICD*&s0K&Pt(poWS>!$$X?YIG;A|Lch^A~W~T zZrB9;8QpVPcJor4uCVphfEJ=aTc{=Onb>3D0bG136h&Qy__5cy1fdhIW&xS$q2Ci{ z04$Q^bqxW1)G(J2g7~JLjqYq*8qLQYND3vbZxPc;nAbJ@Q)=;Kjd_meXq@X1(0>WX zuo{g5F};C$-WX$aLps6`(CNE1u5%gw39D;qo%cSH3|PwoXL%)Si|%xNx0cV?zgqHJ zs7fuKV(3gAUwspml-f&Kz^qgbo`)`%n_hPgTX+AlblAo?y%W<_2xjPrnR|S14|3c3 zl9d%2NQi_0dJbM=UjjFe-g6j~lv+TTD(SvHw^`SmQ3)j?z|x@a{qm#YEXWac8Z34M z7}uO~Htp!8@k^&Bm_XF*fyDLQ4hepD-@~I7XKE~Q<4~mZVq+|^Qj6~`Eoi#?-ua;p zWtYbipMJsF9mL2A6oCh6# z0gwx=_mOA>9iPzbrN>`Xs z^hlIOUBMS@SC9!h9;GYLSk!F?>$ZbJPQ3-ANKDOKT^N*h4hO+fL7WD18U&>&wRk${ z4BgFYqWgpV?qvckqc^$$akeu^7$nj?7?{RX2rXpXeaB}s?MpiJd|=vVmvepFlPMF( zHJ{JB;sHr)&y3V^4-@42=!9lvI+<+@N>gfq`<=rqO1^XWn1uo zuK>|jl3b+&qK@2+>AY6jiny`XRjGRtVka(S1XG zX~~;+veX0pKg!$j3JQ9I5Ogt1jCe5E=fQ-gzx=6DYlhTG5uVvBelBY5-+OohudB$A z{y@r{m0};m8(CbEj8kgyESVn-&WTOm3ijq!mcih@oOqR70qGLi8cevt_kW%(%$5V$ zfE9P@WZk^+_qLCks8Kov>SR}k`;VBM^UUjdHJH$&yT}x-4ZfuN7|DMkKVs7N749#3 zj$i0}avT$=)S^6|Zmsy&{YBSG?)g`yCvQ{sSD1$Y+;Ci=|DxwC;{q}MM{I;==x1XC zoihNCKM$YqrV^)gY1F-0*0@52hw-*Q;jS;(@8rp|U5MKF(5-whum|sq;sTxAB^M+5 z#sa0}Hjwzjb;d+2P+-l9vK?cA@cZBU)RhYV)_UCf%wt!;=dy1&yW|7bC*aUuDDCxi zZpV5L684AQcDo*L@TM&kn5N9133|J^Fr~kYOVX5Uc8*q{-z?F5*ZL2 z-iK)uy^K3mKYZ*9FUzhKSdvOhZ>1LB5C7)}^rmb=KcILj!l7ISZ{u@u2T|;W`Ciii4AJ|Iu zFGzOgVZ5QFxa8#3gBpdGnd*Q})3#lA?>3m3$`E$d64WQmke;P99GQ1|=R>K*^9`E% zm&%O0bGkBs1vQX93Ze+2u|XxWfmP&45Vs6NFh{J>>9zPvVl}(ny9xQwjVv4^v%lz? z++an#fCR3Y0c|S6K>G4|gP3)M6sw44*}Q}3m0Datc&~0g!l@BKF27`Bu*am|Ak@=Lo^M+u+!`` zv=D@K#j;i0)>%T^l%$qsJtcUE8BbbTCj?JUh=mZE9M~|#7kw6&%@UU@j~GJN&6Aj; zGPnreO+lV|V+?d8qahv@lJ$0+Xb=XRP9G<))Z#*mVX~Dl%3;aPd!K)wXe2ix33OdO z|6w86|!)4VjulS#6tOq&EeTf=pE<%Xt9CE=VWft`>c0tq+fjvJb$yQkYX=J!2XaE5zki*Y9DI^ggc>}KO98pqlf5X{O^ACzpBNX;b*6gTkd@92Oz-s9rv13fU%a| z7y=GftN;N-bWr zy7bt~L2Pe)&h%mn)jbdXU#w9W`HOsaHihcn8uG=?3IO4PxV)CpUU|!BF*E(T3{}a! zq~NCy#!78%)!=Zi+`gz7Q`(D)iN^SQ1ewh>p?zd8p(bZ|A#=rrml0)j8ch1dF+tfS z$eaOps}8z?sl&OHT3qV2h%!OT=(KQ)eKGK+G4&<$2!ifmg8H)0TW$#vuQE2U{(2p z?@uW1Df(ivAf*;B!9oMF6b^#Q<1t4K=?bU-tz#oC2ZlrvrnhcnJ{}Y9UoJlp6fQZN zq+kK{xJbe%ktWz??#fomr8*$n7h}ufO0nn~&c*SpKp+&A9^qVHN+^OQcUQhTMRd@F z%YsTRUYhuvffFf$wtWe3?}T*mpg&Uh>4yy?y!83(ahF5#OMsF*NiCIqN!U^QeF`Ya z$WaabBZ(5`tKt1l(EpbKA-MmPL?Jjy9K6U~6Wu9OzDO3NA??v`>1}{>MGDiYZ!vfw zNEkA9@p`^D#z4=KCYR}1kv0^Q!EK6=E>jgZ+TfQ&tt^}?)xb=1?CD)uT{+<`sLVZ_ ztMn^z4XZ0kEiOyy_a=>B4e1gZD8Zyo!wuXUWwq3^u;cl1{rYNchErWmG!Au*FKBwU zk1nH%y$h;Lp{6kbP3gHUJ{ji@;bB>F-HY8 zaA5noOw(xHSZbf}XQWe5yG*Z7Y{~3_E_0{4OQjZ9Xf0SScQ^{#Oxo5++iZ88m;%b~ zpyIg_R(6)JLcr@o*sS)~m%4+BCa*_U?2m7=v~B2-i7#zF5r+KGy)F$|4E1GwBE-e_ zi#}n{%Z(s*a2FLvIrf$^-UN`Qqq7cW!$XGrW=VayylLfY@k2ZqurTtLyvIXL5EM zFSG56*qi%=G~GyOno2Nds}o7Ds1Wfyg43^YP=!njYFdnO~5*D zjwVFFvUV3kr$Q3xe0%7W|JeLkI#NK5Qj1s0rUng-0~+aOHU`@Cv;@^e;zp%F+E*#K zOi@+{2CZ?Ivz2nG4#-+@R4Z2`L0q&|!9jZ@ef5dRIqTRx|B4&h6Na1`@9X@s=sCQr zcwvUCK%hStM7Or~H{+cEAT-{Ri9bssB`A~}A|k6=ya9)}?CIX3+X(b!jW#;PPU2fjn_eS21<3rMm7~L5{VJ|$2ouMfBKM|rQ z)P!Zzo&yrJO};xSNr(kk6z+lGUMaPB6>ZNxsPmQ;1I%?xrGfLs4vRr_+ubgY+|c|i zBm28t-!Og9p$9+Y(3xi(K78g`ht8TcNhUT{G#tDM?Cr3`3<2cMYLhC-gJ z>DuAKCVE)#b1%LWCGqgtV6?H-(smoT#e(Ddzxe)V`MV=*=^FsehvH6vaQ9q<`u)$n zJs{}Y`k?~}8t`uS`oB@BzlP+C@c-f4Z@sF8QNs{k|@9CItXfWgiW<1Ra^} zYoX6=kcX~cy>pc&`*L_++f0D_yN|Kp6~}C@aOWkEke9=M>YG0((hbc@5lo!(Y3=)M zpVasDp{1xG1vXT=23ij7Z)yycm2KahjD+Qg+cka*YY=zScuAVW9s%6hAGwpY)GLH*5Z|uPv8xrx9&(W>N#cgh^}I8VL$Z7<5OP zBw;)h+`SHB{J4k80}Vsb#=b09V!PwY*u`NRo=1ud>dAy0a^}3(xcc z>cbPRW`cUnm(asDZJfG%kx(cBYV?Bs(G?qZi(413#=O{4faBG+5C3^bjNx+s+-R!p zLdx|PHY5Oh2YTgooUVu|rPP=rKqSa|?krq`LQ@T+x^R`?L!2QXYn5G5ZgqMSL1bd7 zgS!Mmp3~4O3*(ywH8qQ^GF2rwwp^A5keSiku7~?1qI(uULUaq#u+yW<9(eaCBUP^r z*eq5U(?6f+JZY?Jj6B9A>VCBs1@=9f_|$ zbTFQERi0!{r0tWdPCN`0$ekTq;x$pM1v@H!1f&5wTFsQi#Nm#@z2Ec z<1=+to=M?=Kz8e@Jo{8ES3oQpyd?EAaL&eEm4DwVJE8)-7+EqXC13U!c~yRWEApWK zZ*-E&5O-h9u>c_A!0D0Kch6{ya1PLLSO6E$2B;* zWR_ifnlz;r$7Ir z@gtEAal(~a9QTUMYQofP9ce>D*_c3fH|2<1l(Lj1*0)obi;x{H6c1+98=9g`?rDt) znRH6FPY1RP^s;JrjyI*ZnGERvk8Y;sqFN`ORb4r@k)U8>*Gp!n@l~_o&FaqctM!p?*CEVgDqM@b@f1(JW#hajjMk&=e01qgQ zB6f78y(hbMvG@bUkZMFtf@=+fUsJ^TBX<5kw>-IK)Dp4dB)k!N7GIroIIroq?f$h9 z0$+|SfBXbYY|lj#GDPfOZ(zp`zb!V`+ox7)@n&k3C7`RIRpXfCA&|8vvxwNaUya!D z7(n>J3fJxov^w(jmi0n(^NDexA35Cs!yca~A1BF$QG z^mgJ(SsLuh#JCYVs~WKbB=65xAymP{u2PG)5H~{}!g&w~^gv7Mj+dl_G^IdK!nWP{ z+{K6;l8fxfi*GPMZzoiUCkl!yHk8O3vEyhXq5jc2N-f?hOJX=AJzYSbsW4*4Dm^?& z!+I*jOWVzwce~9nezumT#IrPTBNRaxNok{MT8j?k)e00g=L6 z=DmkUh;5gAxc=Ye*|pv4dF;;0>FEh$9HQTuh66M&w92Mg7<_~p4#10`=2hvSCv;Rx zI6eBJa0%*$ApZA%p#Oh6E06vv$RwWp8&8<<0paa9wlP#bjWOc7_(j}&2Y3?(14qwR zcy-|*xp#K8fa7+XZF_;__I75uLa2+TJ(%PY09#YOE`E1-lJ$x-lG&SE7dO=*MzUf9 zmpiRVhxM~q%JdE^;mvJl@`ivXM5e`t{DarPb6=%62axMXMWq%$Wtx;|(B^igFeud* z-k3GstYIi=mUS~;$9`3ea@!fx^yF`19osV~x2{s(w93AU>5QUVeq~EmJ}e*nEl#nG znjy}4iPnb}&iO`pNS8)7+S1(?t<>Tj0E+(SZOKnj;Zsju`Y#IHjwjK|CD4>5M&Ccj z=imr?v_vtCmw6)h%TFez)K1YCvjqiYv2DSMxKIW<+E)GC)I&u^_qafCnHfM8jDMUK@zk&v4*+q z$=4vly+nuz*Uh zly^^3S9(SqCCpc!FMNE^h)t3(c!~AZ+~@!DMX8J#xJSRGbsB@)RQh!9v-j`)WctAe zrcXy_Cz;Qj$ncHug^$-cjdPHvb8s5$fE)Ds)=THw4WBF9hlnt6c5<%(P!&4u79PIIaj{H4LEB=7fM@=YIEIibv*`m=%|mTKDPUV zKqhpoX*-a+fC1RQ@4u=2=fh7u_5uYyd8cDnousaN(_NqP$j3eM$Wu?b`0|%r`kX7S zeCY-Ezv8lsUVQ(9|9tSYGfuha3HLvUGmR(UFrOGY=MiLwC}qn>#(`4s+VD8MQfl$D zpStYWtDw4{c;WQbnQEioq|Ji62H1M6Lz97R^tTwQn99L!rYpUKXqQT(p5+4#-mRE~ z&dmXML%$=UMq80mi?_l5e=s;lzv&i?Og4*E1KBXBX?1Vl)tCNtbJP>Wa~(cY?EN$d z;WH9QPNo$tuhfCFraSAH;X)8KnWQAE(m=l!Y6Mocv3ION^9G_Om0J9q7S>>-U0rOc z!W!;1pONTeHWyV1eYsH~QY35_!d_cz)TJQ@u+Cc%m83JUwlXu0x{NW7&M39``S7GC z4SuFZUgl<*(&sg4z5eS;p=`p#+O?=lBR1T?P{cfvz(vwHf~3@icK37MMfasJGb6Q0 zbp*u1hH~39(tYW{rOKuUaMI1hd$N^csY)$=flD_4`%d;e6hRJ&H4SJXleN%NibY~%p)y5#Sa&x0bX1^WL> z_73)RoJIza=eBOUKj*a#NI?CCM=#7k?^Qm*iw`g%opkdX>*?3%2p4*whB&r{5%j(x z|6YtP@`Bz4&*Q<4`#UMMc=x&ypD0>oU^B9NJY74m;QBaIK)cT=LrVrQPJ3_U1VwrM z739G-rz%IAtq-vD&6_QqF8xeblnd1F9L&C4Zg$%M40v&)#Te2Ip>D}?hsY%y`#WxE zn!tXjeb6MgV}h)4|RL zsC(B#_y)$TEq(z+Oyl_Qm;eBdYQUm;%sNo zql}-aQ5Uge+H^+KK9EvJQ6Y6rPOBd)bvu?hlGEx?@gT-aqo4iZXA-L_-S@guYVm7O zBG$$QGtkHO?!bOm{Y@V;jY${-3AUM=3i+?=Xc*Zh8ChdA;w~n&$jJdYatdOyd2*lZ5rerH(G&Zu|RZ>fnuMk*TvLPTX z9d)VlDs*FLqJp?5(j31Ls}W)}K8pVTudi%iiKy2DlQhFS7(4HFo8gPTc}eDabZ2%O ztd}RtBVN%(gA(QlQ^qb(Bp|Fe^ccV&s@zY<4c|cYjvgI5bc2WlDbvYsMVQ;onbf(5 zZj7)6mQst~Nb2|IY~sA5GXRd{AAS zUAs)t*-7=PJ4bd|#oGg2=1z5&p#Q(A^?$kC;hiJRTyBl3%l6WB<3R2%xwn*^09@_p zO^oMb#jiWvW|1vGwaq8O-~p@uB580im`)PtsvX43~e^GP9?^p^_ zG3fQD`;+Nt7cg*e4WoQZ)gg^}ooP)Dc!vcGT1>QC3!teF4K&2M(j3yefw;s@|@!&$e2dsPT=M`cyN-aL5AtA9kZyraG3gTjF zm+3}KL>!SaoirV@KQ&~&q)#4ux5E)a=69;QRBCav710|12TI&$Zd2&K2G=&st{)CY zdT+^UJ7DVd1)Y}D{rR#Q|EKkgf3`zu3Edk1SJLqhyr;(hp}3XC|2_}^N=nrnAmki^E~CA3V1`B1SGLD+<3)NhoExa@x=aWi-O&h zT6`26E)Hrrq%0!hvIbiy$hV8KLNG8#?sB$LF4X}&RzhmP+nx@1b4xee#W`^zXzv8O zDYf`m??uhYm$vmLUw0&28nzL^TBNfg8VWnjBl*6PuV@(v?3*h#thffeIoe35e5}ia z?;B^;E#M81%r5U^1KPVK*-V02EXaa1q&@m9yV+g3&_Grb-V9?GXbV_Cr4}Er0dK@c zNSRh?V$<2WdS5a@Usvy)b<07U-RutZUwlKS-T0CGhp8|^lY0fAr47ED#muv^Y0f4D$ec=yUCtv}2vbk~;o@qQ+%7?> z#UHTDCDmWf4rT@JjVBEAcpD!sQv&5q;YRmG0F*syP8_MBhd1%mQ&Rs+I^8wivj+m? z`|AXCiJdkKw}O{dG*2*PCf4`XaSnzuE4BDTsiLb@PT!js{-BILGo^mj(Hm+Fjj9TR zdR`suoLlYAZ`Q$f5}vdqtKTjda*`zheIMJo#z+@4%XWkNpe5iuYX|%2`15$grjG3f zj=+<~vp1XbQ9+!h*$$VvgO_Gp!h-Gk^lEiIJcgjZ|KD4B9$7z=EZ0kjxCQ?@1>TyqhPdNGr`1c4X||5ETQtb z6KB&B`V0Dh3l*DCe0>RZxCUAJ8$TPGwU|w!o;SW2-H_HD1r0Nj;yc|6L$8v@4w$%G zFD%4Ep#QguEP{25BqLAg6$!()!`mZ)=JfW0&;%}*M{JlkggAJiT0P@Nna<@N>Mi}t_9|2Xe92aPap z-(A~}YyK0)|2*H?v+|FJHJW*Qae`qc8KQ>y3fq*dP1;!e&(&Ag?|%k9?1O6j4@z`l z{LjAMQ}9=h?W4f&-|M)7AgkA(S%a)sRBG`_`2Q^R(RK$Pn;maRhtu;l zGRI$JaXcD0Y^sqtI}(|5qHTg%i%i$;(O9=Vz(wgOwfIvfivsGta!kvvRFf$TbD~%a z_7ZyV&Apj)s>r3S>?-`Il3KN`r88ItHF~;_c)rlIdQ=@hKxn+_%Oq1SjZY2yK;CW)w z*AnyPyCZG63|3fslcIEs)B*j!4GL^qD#S|TgVBgD2^_PU=`Qr>x2D??%^PDNlX^13 zHBUk{TE_?r%Z`l93}^8-oF6+{XNIe_N-h4=?2KPsu}v9NIG0o!IM2P2v@{; zIlo6O&1IugJf|1&cXTLddT-y*qZCw`?G0_vjKd0{j&1@6{5-U!3-hq@G9EJxl?Y`? zGD4F{=M`cyN-aLGA@XDB9`i8fqGF`QhKu2}TUbus8J`skzSp64C zgM)$PM@J{W=cA@u1<}DMAy$vDY0-3eR-@#LH3M-RBG|R0T&WJ>E=EJdt#DE z$hv=-wn9exXu8-bpnw8PZ$1<&XSwNKmKr^Z+r5v(eh)O%QOYe&@L+YdYM$w((d}}1 z?!}iLKJ%89t8lkyxb`UpQ)1-65+h5ST%jn2i|PLy?h4gn%TL zYk0*`hoEx)@e0s3eJBimq&y2HE^DxbdVISmD+B{mhoyp6QMBPGBF@wqw6^$zVBw7JiM_-v7 zVc(174tC4_8$i@J$6TDF_Hz3LcSZ8FGrN*0wfHMk8tL9;*9^#@Z)vO}G}C!=*y!MB z?`(nxbe2sG+MkA_M=#V8AksEWV$5Pw-cJquJ)+tBj~ZQL9F3qP84#~kZ1Rj!i~szf zJrL)Z)a^|gy&B_~GNy1YsWfmtZ*Iu`cow$CI9jrJRI%rPoVF(f{r~Hj5uh!&IhcQR z)D|A)mQ9g7)u9H}V#co>bA5)`VJXwE^IPBWQzZiXF5T)HoC71XY1X)`R0X^k&p3or zM2*2YS{4N=Sx1|(4uMdap~N zNfw|513GVt!<<*J&h#4G1N*$GY^unm+Mv}f!7RP&mSBEpt(KEON}Xu3T;FlSt_Hp+ zwfNsNud4=Ru_}uca}*+|kMhcTpSU}6+IdpI@JWex4Nk;Ca;1{N} zN7Q(=v?%c92s1*HcuN9blv?~BnhY#ciRN?5d|=$+LERFpPk54v%RI@GuxatlM>5xd$R#Pi zgF=&&g~3VU1zk7zVU93m>|(>`4K4a;C)5$smQbltGKK{n1HyUyjpp}2T#QnSJFGI_ zN*bZlOjmOTVJAV21d7}{5 zI&4Q^uiZt$A=~Q?h?(}<4pq_s$<=P5wZ_GGSa}(bnQ%p*?D{o_Jd@5V#AK9O{DX!9 z!rSf$wEkuse$U9&%R|F4q1z1#j@f8`&E3hKvgNm9`#s6tV zG}!;^Tz$I1)KEcQnj09j4+4Y%8hyL-y8l-VF$CwOh8RY}Q4IKqyQm&oUmh>Kwh%*O zn7BI*+!oJl<=z?dJ>D><2`B6p=3TM5it{r9#E2~U>;7MfEoNKV3rE?AT z^9O8NMgl1nB1uchyBqA62=oK}|0kqNK$g*!w+8zmm7TOjP^hh0IL+GE!Af=*$%yw05odkE0~{{|0cBOZ`QN#fuIwxXB`55DLs&q5(qP!?g7>$mFO zSU_Ow-(Kzr>$t%5m+Ky|m#?t#VJwY%m?193Rgr>fFhg<`A~@MCm?3yLksTqJL8--m zPwKZce)pCl1fszrM5Bh0Bb{sfAM2kFur}rxlG06m&a<%N`EuFLwef15z#3!`zU zyI9cl(44WDmQlst1y!a{)0lv!6s>dXqDVQsOoy$*vsgDp>v!!gm0JAY9)eV>p*-e@ z2MrwXrsev0wopf&TQyMLupr5RM7OZXQ+ps}zO}o|+99$CGwLptTKo^I@#zK{o;RbUzpU%*|0zYVlv-|Nk|;&bSUsjsL?L4L5n>grQgH zlY6|z|JC?EmIkA_^0!C)-~Y$ONuc{cUJT$hMy50bWw{3Kr35fT=uI@rb{kkb&Ncqe z(!0k0+4WJIXc-Bl)QP5;W7*Zs{?hS(|BQ4A$YNC%uQ&=3)JJ)1{9l@uMAHEir&zE( zvJ(gBjBr&9pvc$wzwir;doBL&UuygxYXktLYrOmnFIbZ7`um1XQ+V6Pw(nwQu^u`8&%BF62vV(v@|YtYG;qM1maFl9iFpMoT!K=D62+-27N|LXpK&@Jui{(nE;-zTc^f7ZR3{zDk#NAc*% z`2qptIqPr@o-{6LjsGk08StJO|A*pMCL4ZJD>)6&!087^fy4|W%e`*jQ_lnm@7n#o*AlqGj5hQ_$$v{S0LI1y8mnVc(=gor% zQW0E2JYMi-yk#dzVdKaCFFaxuE}F zVb!a~|A7_iGp$JmlG5oziR%7;L~BUrwybW{X<+|k)m@hrbj@}DKf!zrZimtm)`25q zt*=b7u3e4)EA>Na{2z*2Y5d<4)V?RIEmCfWE4t-Q$M1wefOoB%0M<_vjJy@_ z{rAKFUFdzn8c2D={lm>*T(^9Y0~zu<>Tx~38as(oLT>iSY0*G$uWq0yH&6uq|0>vI z<|Id6f*Pj#SpF@rx%f$g?6sJXSe&@V*J3S2KE_=)NhFeZX>!3tBSJA`ex=d0_UPeN zIECuX#D)mik;jZZK*x)qOLs2hDS7YZlNCf>qIYDfF zN+^5e7Z=7yKFN??lle;tC*yBS-CcR>#K}S9e>Di&-(gFcaovBp@ay=~#1Sjx9Wb^} zSe>9(d8AIbngs;RD*xCEKF1TDlSe_+*vO*L3vmZ1jrj1!W68{rh!1OK zb~xIjo8M;X;aS)rzT69#V_352YCC}5z{K?!=t>EP7t41SxjTu&^YBJI622km|JRy} z*(yLJxmG& zl73H7%=mV0m|>)Bh;d-sV5ZDTep!5Pv-It!%(j?ZViftcd>QIG3H1MNCz^vL$_IPR zU-pFRigi#f!&#D066j!Pov=~1L9rD`lC{juN#7N;IDJ#MvqSx<>OVOp%R$wDB5lH8 z9D;3{R1&zx(>QEELcr6-@yuk2<8<^$j@RP6#y7IL)cld!4V6HN#s-;qJ*t4yWWR}5 z8HJFtln;=Hny!b(@ajz~pG@!cv(35ZG+!21p)N#J9*nefJf+POkEcO-^K@`?FDF}M z;LwpFf9KP5>pyBByiImpMrF+X$Rv8wrLIS8UA4vn+7EAuvn>8^zxr#n|BdjolgFp7 zI{sx4llK#^sxf)9jmZNq^zNT}%<+GNe7Z;F)0+4MRR2o&zsFwO7O_V2Q6JQ4x+WO! z1iM~-Y?Yp_DeC|e%fm_6f)LkfjpmcleBC4YK>zOiJ@!(s0B6{FgkKtsRRAL7e=|%Xg;lRZOZHD zXQ7Pp)@Z)8A!PdXp90ZhZGOD@CO8G9=jVRS>`MLIu|Gcn`v3KpE^9QOkSYz1H+va6 z3akQdwlD7Z37y1>EnUi_RwrsS-)a@C6a`bnG@a-8vC4I-n$&GQDaVT1%^4c!%XzG$ zi;h0d^z8IJY2UNi@V?aw^#2=}0!gFXKEDZVAmWVtAy8mQf=z^Prtj5+Pgu0;oW?YC z98|cMCJBRgFbdx7Hp3TP#aXBUqohxgd&h_>Acj!hpoBTXl(CDgj~;gXjyR|kRFIww zp(6aWZtY~)kz~enOChdg(Eo3AxmIZC;&fO+r^V{u44;nk4~$PG&kS7)@|`HFyrgp@ z8^O9*O(rWylS%{ktZ|`wyMq0E+pBY+|KB7}hy4&<1Cr9PD&TdDys&*9tfdb@{C@m4p7@n+0^lr64F% zPI_|{1mxOG*KHc;U_+yvV@pLOt4MkSn>#twpX%g46*RN@Pb58PAbAiuua_lWVQ@rU zCu|e44p$3?YZ&rl-kS8|kK+CTtCNSPi{nj~mCSJjGdaGkrJTk!vbhZe)0aB78!Cav zjA5<8erRA?`Bz|tM!03@0FP!lItTlKLIg3sw*&^8r~JNA&;pY$%Y}TT1HHYqVaC)lE4$;Z^ZRKh_bx_dBtN4u+!k3M^=KZ6z80a5! zgKXq-`3ZN~Kvc>~d*CL46NtiEkq@h7*2x&-1q9D@5L;5OfjiiYf;j*Zi zvgBPuCWZ;K0+Zo!xQd#>=LImA=s0`;C8nryqT?@S(XZ^~yh=Y?=$p19~1 z1*pX{iVy<*zn>N8Y?RQ|t|b{A+CYquz^O@15>{>AaX>$;MTvi)nQh(KXd8X~C>cym zTd;lJ>jz_+P~E&5`(tD{DZV32fff}3`v0v(H^OJ#G`gubzzPc}y=~VPwG5l}Z~50B zY}c~I!9UM4MojdIlRE@JV=!B~8n&Pjz^*J_8M1J-^}#>Te$fAa%M|h`W6uIfsRI&n zY{34mAqmB1clvU}pr~m<;K2kdj=h6_@`HS81rJ-iFS;ni z<4#{E;Lz>xS^;N3FfvLE`hT#8GN-(NrBLP?{8QlU)Zm{)IH=V_Ox7Joy)PFC!-L2- z3+xyyS2k8OGSq&`0|72N0I1i5(`i>q+|S_zaIRtKhVeg$1=k&~Jc&Y6px68+i%Av; z%@I}StRzBMyqI0ff)n({#EH0T4BPCr_cCEyYy1z|yohNR1ZN5i;|RCxwfLW8gks_M zKliJ@RQoT2pWQn?_3YzcftyNwXWdk4O`A&5&_WJ9z{x!IQR%jZ#~XbD}S}=o^cGI#I+EPX~$=3 z44^-FZp&$k2U4o{|2U0EN`rC;Q>c-DKoq1H(Z;2Hly~aLzt!}Se{RmEtLbA^cQlNk zF(UtH{dWv}jmQl_m zYqXd@UMA8)5RNfMH>5S@&sdM7tsi08qjM3U|4n;73|*oQ@!7S|J{@i`vft?Qt1wpR65kqwv58LLy%Y&iyhNd-*$&^{P4(iG(G2&qr8T9{ji7 zx3H)mVw%T|#p_rt7mmQS_(LHBC$90WK*GphWf5;qJR^@a_(#wxcad8a7GKyJT@tnC zejQm?qn8{bR-24odamF;=>M6Rbpmki#g`sF^Q=RM&jxJqia^?eZ~i8WqbFcmrNtMfx6-1Cm@OC7~bHhLr^*ITvX`RL@x=N7?4^GX~3$l)a9cIq^^tdPziNiNk)zny#)II5U5d9CK{I;qv9=5M_4jzbADF0qYERf zf)ORXw1Lc`el*0$26zf;cVOlQxtxy5?YV=au#|$I&(I>Rv3o*nz z@yl97(Er20I%188U^2bGE&_j=1Kcj>`@#xD;ks&YvDtLQBH^%Ohy}}4k%FFuCmWPo zw%nA>1xtx7onczjeRH44Dka0v*Ky@eEzD+;?2?`*tsu#>BlJAUw{aVUlZ9OZU3(s< z6+{>~(-waL`hS*_e|P{%GH&dw#mj5{w)aSm)&K$1$WxR2(=afxXFM%2QS7Rc-guXA zp$F>s(XtD9gD>RcX?4-zUI&Bgo4f$f|Fiu{Uhik;mV0Lxgr3vo<{|e!=+J{7a_G!6 z4&%(pS+byOWv0SID3CR@WB}u|*=e=CzkZC2=knQ9iq~Jk$tEk0rXDQ)hqTF;KXL?p zy6b0UhvDYlI$QeXa`0pwuK&|aJWNiT#?NZP?xDmGo!*YW$Qnsyf|DLSTx5^24me63 z_HDm!=zxP<;9dXz*IhvW5A3_Q+W&?9_ucoS0MtWJ;6J_O_*cQEHNXD6={KzbHazZ= z7azY1RQKlZpT0UWnL!#_P{8WQN5A&?R{~bAIdwKz5z@l0W4GWRfcir}`h&;s45%yjwVbkX&nm06yeO#Jt8gN2Ygo|GO6*cJdAy`Mm5(W z)gVVyua}NEE0YT|B013b!H=mQa~>u-lUbDgTXPW>`cfN{2F3IYI|BWGm>YpuWL?n( z+_KMvNtPuXdgN+BD5-IHfl&x+pnOc}>)|oHdJ{hH9T`fSd$=Y!P=iYe`Kw_^9$8JM zI}2mhVM)lkxcI)Tt6@iimQmOd=>NlmXtG>X4Jq-<@x8z9r76nwiVD+IfsQ=MJE9N+8t-cl1fw`I3!(Cs1VR75({Yn!()EB)L|qbebWA{2d~1-(WI-w* zmNecH0V)Yrm{S~4uCp!g_6=E)(9h7UQ^yBST3KuEQ=^JzS(xi{}|HzH6&kz{}11O`+dIk=7Xo6dfLHzo_zknQy+Tc zjUR&k{}JXcZ{QY+t<5(|Z;Ch8Hvt7^k2dCwj7dmT+)!!K_sOi6vf4tB!1pAo;p=>@ z?bAm|@4aYFr+x`3B`ovYA&<1fq&fCB?~a!X5-?>VE&N(ASMI|P@!vuJ9~m3oGh9p_g3f!=)Z|!xiGYX*}i%^!awwvARUt>v}eLUTu=4?DOO^&|s7IR8;n|WX&Vb+O z17Zn3&W;%VVf!s(U~N&Q7rX5iCMMMAsnDbW8% zyQ=^(j#^opfBL!zxl)NKblo6^IYN=Ki-px2(xLok!~=_JD2D0|(sOLyYx2OpZ2nO- z-6KP46bPFbmLL$gE&~vfbs?r)Q~(Ht@uGSg6$Z+1>H+%y7+0Zyx~mA`Hl~UoqHyS< zMPo7Va4kU9TP1@hV?Bf;X%Y@?qnsz^EALF5RBH;ALr)iVr=el^94 zIc8nG@xIv6Hr3mDJs;JpAKku;RymHjCOEsnK`;AN`F9sgqtQcL{L<9%z&Iqs<9v9@Q8;!LCI)VDheW}Y^c z%HA=qbp2sMam(;b+`6egq)Ai~A$-go2kgDQL~gT+6TLJxqB}*Jct~Gu=;H@2q5(dC0sn}3 zXloo^1!!d)MO|+C$Lhqo0z!V@5^@R-nf>KBn4+Cwy#N95+>|AryUKwL=yYJ#v+_7A;JtuG2h#h9W@!pWJY{;L^~U*4^LtLrA>^+YMh%D}({+8SxQg zBegNMS~*PYdC$TQ_vNsQ(j|+AV%}lRh9i$^Z(q)~$s|x^cEJxAIM$@!YPE@dKj@u7 z(Eq16+7dJmf6lOBCi{NuOvJ~wEcZ9yS+eg(!{g7E|Gq$r`gB*dy8*EYr}#*sT)Kz48`tOn+Bgj~rwmfyi8aUU zdY+i;Yur+k2+e96#{azyn|ER7mi-iW-w@(Z1_p>gS zb7aEUrrgw@E{Uf8x@>6J7)NO|V@{qs>8h`!eW}N#IYvZKFl+0sXDj7W9gwx)n~I|Z z{eOlC#>lOyQh!jgT}u6~n%8%*csSaEJfP!1{;Crth7u3yYusl!ks@f@*WT9^M`>t` zR3mC9hz(c!aA^DDC_(?9NfIPe_679G&3$u&c!X)v0?%W&Cy6G(39-_bP={+A<+R^V zGr`h8?j|Nkd3W&M+UW`O|0vCCI*ZsS!gBmr;n672Jgq_;ap@)v-&1=#FA2lvRIl$l zFrRc(u@I}hDBJ_dp@oxsI*tjR;*v*DmkGx>cm)b3D?@c~3f+3i zq~Xo{0HZ)m4zt*ImEGRKF zXAT{PxD<_V_Gb&%5`SkjXJz&U4fUpIw7KhRiFX10->>ei)X(5gczphG$4@>}xdUvlYluDJ507u^4f%PxBH{SW^0!PCw-<)SCt{~%6$oPcAsf)^5( z=R6|R8c;50@mSLU0JDOJ_olx&1)j-sKK$_GcRir~=e`Y8Z;)VH&}5^+#_D|N1wna^ z0{V`?F!GFk)0nmHfn@j+{+7Q6`z-FFNX5glAU_h@r<{_#&7xg^YS`yd2MZeZ{qX-> zQ&K@eNkOO5+(js_in?WwO|pIpWuK+opa|?^J^Ls_SU~@u#}+XFG^q${OE*{c1oom+7z<#+D1=O< ze1JSK_j-5?uhuXY9j;nm4kA%Wq}nv>_{%|{|K~fMPKB|2&RvF=gNA+u@N%|(<#Tm| zCpp9fhhcNL;5Gi(bL*_ssL0Iyz-^(54r?rW`I1LD)L^w!@9Lmdnss3OgEU zf;nOJVXK3ch(MTv{y*R3bL5hD0~~gfaxjtXBjKbboe)0EW3k3M%zLtTU%78W-9P>$Tn}EumZ)R z;l$rUBZnt}{$HR)XZ|0fi~WtH$?CW?^{9^bx7~jKwi_n8K6Jq=IY61nFs(0qNcJst z(10dH_E-Re{=Yz;N_Jv+1M6C3k>V3$3>w6n&1?*d#S!r3ht9hoMo^z=z*0~o*@4^Z zTt_itU~0GU^$35&fy5&Mu~fu9cGwNlBYxUYfMr{k*Cd8?pSHSW;)zNxKNQ;OduX~I zk{es8BTYM5!m&$;cTlwD7~Z98q1!?KU&!2a^)oaZdjJ@*x>c1X_HpV-s9~~OgJo_y zz*lK^K4<5hI60_JB53k^lL+q-V#>@30n4m8Od^2(U&wKPfF~NM;z6Sj8w=*_R&eL0 zClOZ5-!nXTU&tEHhYE!kpcPrA0zJ7C#1Bx~iSPf;leF83Ro4DmGnh!$xf?8W0L^=e_5J>D+%D&W z4PF|@h~Fuf$KBfvwi&K_5uL!8%i~aN*q`yhAztxu=rF{1#e|nM(Sx}>asS{#BsGkb3f@COy8Kw;by_5u8L~p?&7FaE(I~NTM`u}34TmYn^ zfhE0%M*}Z+EgE=thdV4A-B*Ni{@+;2TNn1zhOmTXp#PWJ@qcXcqBGgP8XXp{j)BlA zsL{YU6A=g3Njf)>nCU8kuIlKN(Lvk0koPpPsII9f8ijdBsZbW_O2gccxFk6wV9TsI zEadfE!~^|*35R|S-o7yVnxSBm2Wnat^Q>gEo4RqKN8oHG8e5P;G|vSkj8}~e_D1Us zhQ=FVAZL0qL2C`nx%fw~$Y9X_m$rNmPgZCnnTKiJP&ri$@uYBn`cjjx*p#PUmN5vr} z*Z7|y)SKJ0zr9Tdyfrio-QO7Y_!^(a_@6aaH@K=l8eBpxV2dd*H?uYdKIXfjLEMd= zQgGgAIrK`nm0i>J_#fQ=bD@4#EndC26D0FHK6Cc*uZ1m0-~RHt2dEu2)X*rFZx8S$ zpR@Cxc){BP6g=RoKl!-hUjst+=5_9K3-w;{$?rS<)mZNXHzM4C!Nu_Za*v8lL3u4! zC>%0Fxo)_upQWKL6=Z4#gT>PxffNhSa0jnqxtnqfa(8H`1V>%%rsB1_91x>x0t1=~FmdbP~ zDM^=)o8n}vxA?|2F`(si=fe9O*?fpY`#}F+K{N>1TEqK%CsLEC#6oW4+e|DTeU+Dl zh*TEyTqpy5l(&ZWrD@4T?angCEYN>cdvj#_>e0gczPGg^Zq+LP@g%s19S>5-l7-?e z+EQ_u851-GR5%&_d`lrMGK>x2qN(~PE zYxu^11sq{G4DuOfNF|~Dcs#TuNC$*RGFOv1}3g$zpsm(CqMIezx(QMp*V^* zaEyF8?rlPTtzd#G#Su|DTz{9&zD)nJS2jA3ck^^r+Z_rB`hV5cSMzpYqZ7|B@P&T1 zG`Fjvfa{UpQYvrJeY!VDnPzDpe7J4}wn|ODV!#jgtX{`z$T#RqS-OalZhRYO%P{2)-E|NbXE zyH8G#@De?Zm|`vvSjeVa5WcIy-dszCr&Dcj_FnJ?5d+vd?pIptzD#0;8L8a;E3F{R z;iQHzf#D_A0SB-)5SP;_KhRHcLH|A7GR0w4TrdMg%3HtGs$bpEL}QLI31gr;+qhH* zc>b2*9gU8YjI3X2jo0T!-j``hKClA%e_defoLC_=rT0$Sz@{$26^l)1FoiAk@#UP= ziER(iKpM>{IK%AW7IKUx^qbhiqZG}e)U5qAC&rtD%+K1B)M1*mzRBQ>E&OKdvS4Q> z(Ery+f=D+UU3-93qnT#zTUwl zA|l@94hED6idZG0Z3=oaDj`g3FV;i>(ErzZ8xRcX$-J&B$ar1-wht=2wt>LWU^|q( z4sVItM-y7fD=&smUfm)?YP_Z>Ay3icj7E%5vRFFmg!a-7AGRszXLr8;_qu`o(?pN& zYS7O_WEIDCI08R#FORnb_9_%t{ex65@8EBv+n|4BaM6bpswGWqi~Pcp4UE8ZMy)PaHk^+wvDMOth7)f`%o{(N=(>;W^?ObH8XY zJfuQUOvk-?w7;S$M=j79iCt?Cc+@^Z35@?=PjK|c1)w`+1QyqeEw~;k!xJ|JH0mES zB#PHy&~%cwOYD8zSc||F7hdL}63n8kd9NN#8_}Yt5812dmt4bwR=Eo-Nup8>2C_H4 zl7P47EyaWgSZ{7mhkHqbG-#h5(Em4_(A(;>HC(OACYqMZ!CxPz09N>Tk>T>7*A2uh zR7z44vVF%5Eh7&hd$%Jzi;)L6WVrH*_E}Jy#ZBrKv@XU<%6nhS#HBL*VxT)kxl{*G z&q8OQ8k)9{eKpn2?Xj-+TECJ9`u|4i_sO!CtQ^*@bhMP_cnIf#`)H7Qu7Q#41nIUf zoYZKn)oOaLze6+@=>IWma8nUkL*{G4XX`rlvLqslOiGxxcTM3FnCH$VFeIsL-+n7q z7M`R2gsvO>Fh`g&cJZu}Hv|~nke*|45>5Ut8|wPH6LRj5aMx+`a>87rv2JbfJ`RHZ z9}l9zHFMTFi+g5kZ8hR+w1_V;N;>LKi3nxT;tqm9ek&;~q{-;ml~-zzsbOP+d=hLh zf1cfmGajpkIEA49KkC?}D+sXS|l!d!WjM;AuoY2i;)#v@brw zC{VjPPjsv)qGo-L;WowDgkI!!<=3^bjz^WB^m0v^cU}$p|6@&e1lOJujl zsP0XF^w{HfgX-S0##WMPu_^aEv5(@bc$91Kr|jIm^BBy-x=LvF55xbP13W0Zc6`9* zx%ujt2sI9oIOC@^4zXd@so_$jM&?ALGWnF(xlR*Ovx`Fn{r_>@jOkY;iFQ08mtjDB z9iBAf(P?&q6L{1(#MSCrWEAq*JaDq1CCd=wz3s-DX!R zLDZW1&A^a~p#N_P&k@xUDa;)EN5IxWv4}Me(Nf&AfIGYOoD?L}a6A(WT_5GG-waIC zlBrAf7WDtEe3Ah6{3VMraD%&)WG0z&>))?6*s%sW+NoZjm#!yu&@%abnNO$2XHXc< z@Y9SL36V%yp5j5BkBQ3-S<{}wdiJ&iI)eWHgymF{OLN+K&fpoM*&*0*2Lc@yg+fw$d0+fd?e#?buo{N~sdez`yvME8@V0y@2Wm0cQ-ZGE^ z{eOFx_$`tGTeZWv0NvqhF<2{9nF>zRm~>i;!6y>Z%|RGtZ$a1K;OW8|^KXplI=B1F zo9p}PCNoIu2>)n}1^xdi0EVk36zkMdTZh0@Sf2_MxWQD^HGXD~2h4hnUt?-JghWyv z9Ly3k=OA2aAtO6H2$utJ_pN;!3=H-%b9^Igg+ZjTsb>;gS6c@YZG(wjxju9pLem<% z9)uf4T&^{L;GJGi$?=8UF!%2Zu_0!;@d@EcD=p%4L& zFgt6Xpzllcc1|-TEUVRRmI@6Hq!FvQi(%T*4N=-Cyb1Dm8f(rj?oT%eV*bGY|7lN< zj<{LnER^OB(Wrns5%JB5EDLJfA9aO90DDx}SWMQxkIo z<~8Il*pQa+thk{W1pU8(?jS4@X{5g927zcX!|11gsW|u==Cvixt8Us*)LUXOWdDj67K(XV-S+7 zFV(m|UNtEO^2=3DB{JF)zJ9*W75M%-oG@SYLw(TwxekymuOEGdli@?+hlYHlPb|}c zSc3k)OJmF?xOurI6+={F=fed?sSy@tS}`g~U^n;Om{t7Hfc1x=Q~v8Td^Pk)>;KOt zbTR4h>HBz!BB`8s(sNt4-JkPX2?TI44gu9VO$Xz%Oek``>%N3_U&3NvbKs4YA!BH+bN}3?dg)&gr|3mTz0yWb5|9^B8r;K-GP4ld((QF@JK?$E?vG$pWWQYs>(jda?|D6#;SM`5S9oR1#vx_Hke#`!uK%Mbmwo?lzk0G# zpTnOqj*mR!_&wo6YS$f}{=041#NYsb=2!pl!0~$k2FKU%<+z}B%CZTGr+u1@O631S zi7s?PKTE>}D#+9conu3#bz3#!jGuZtUo5q(!a^kxtiLIOduoMB%CnQ2XkFfutKhXd8 z96ee${Ryemi_$tW@@Y;-06OaBxO>0Eo`!0jv4qSO7hdLJ5-jQ0O@AESfKHh4$fYxV zS+{qB{wxuZcA)>i9+S|VsX>42^c4Y`tbu#(Xe&G{yXnvE`l1(3T|f5s0D2qcBu6@e z1PNuZdi~g6+7J@iRzWYq=fUd-{r`>RN8!juc&X>~!4)Wpy04@q4kC-{$Np;2pC?Z? zv+aw-+ZOaE)Drany}ai_4f^Z899Dz=YS15agJ{X9U(L8FaF73D5jvF}W)sKT^hX5z zf&Tv{ppFZrguY1|8ey$=F7cd%Z8z;+BY`sH?)b!l9Qau8i%u3z{LzS^?*CEu|0wQ% zv|N(pSRq}liXWHzfBaVQQ)|7k#{aC9-1D!@8*WNd>)B{8Q{#WymJFtj|9PU=WmdDs zF-~|G+qesMjsKZ*uuzTvK}Bni{{jF1cdSbCMD%%{4HX&BvxoDm)%&ylFczAecP#RW zH@+BdX%Z#EXvryP9NP&(rNHny6zzzo9|+tzJDvnGH&j|9dmbfuD~s8)tUYG9 z1{EP|f+Oi{;yqaw#;n8Jk#(5*M=u2dgE#k}BGCU2V2kZxoK)R(I@KrjY3Jo?P*G7V z5#OZAkCOU2#|TGImhHNe7z?eV4neWaIeJMbwcBr&nZ|JC@vX`IoxR2l#G zyYb~YoT>4DbKt^^aPYi5w!7MrdRAIwYW!c@%HGuRe{ya}GsZDablWxlZ)U@htw(2% z#{WHL`AX0-*0J{Zzq^0|*th?fg1>rH3T%=BpMB)<}3)_ZJ zuuh0!WLSPLB?;F_q){-iHVwP+T}EnLNI8*DMN)~lmesARYsB3IW?#Q>M%0bjI!{S1 zm*-x5>EScaI&}DKsBkFr4H3>G)I}OvNWWJ~=X7a-l)56Re*@FJjiXU+NJqs5{r?yc zCLqgje;hmT*lmDpd;J3NDpXmjZ&2hk=Om?l#x`rp#z+|_hRhH z`Dw*Yot?|Keg2d=8~{vwkAp%Hg-V{d25vIX+dzsq^4G^YsVNDQ)`di@=XIKx`lq22;8Gj_`v3bS z*1|pEAm+ZSJPS2oK)Wl&?p#Oh>8W0?Fai99T#lk>L=suCLu|7(tek;Ct?4HbGw>NsSl3wgO=9dGw zpP;U!A>F-R4D|mG{lH++{CwcBxG4fXB5nJ)!D}4|jhiKN5~LxpRPPH;tybB|Hn=mP zmG%3dSy3cD%;x)_7slp$i_XaSzfa5)?;8I%PrhsnD?PMJ*3I1}DK}rz&Tg4;_FBx8XAY$PVCiIS_S4xykoUthQjlhgdB&jjt;%da8{iA)Rh! zK)m&Vd24FG9*zH7_KN>gw=4YH(c_kv9shcWD|_b!HLeW1CKz|rO#@{gy;}X3Q4cD6 z_FE9b*#Gz7KZ+x9{hj9nO*xd`-u>9DN*S7w7s;O7$5v)fFGo`UMmld~26H4mF6|X8 zND>r_H2S3zvCX!#)uwo>0MMc*uCe?{%e1Xp}i%jYf?q zT&=D}(vnD>xCZq9(|(jBa4C~e8-NEb2?xqG= z^_BwTW@%a7(-DP|*0(y6YG}b2fXsm+w!%;B1W9 z508-SbRCV{n1N^|%lA~bOc_7c#5|B4dEl@`7HZ(uq5}(Ki@^G+FfJkE_G%#7nx?I{zM7%)?#b^3ke-bkfm?&zRx8kdvQ>WC zV7W3ThfaG|w%HGVRa@Mvb?bD|Bn7q}hi(C?&si4||37T4FNtO|`6~e={=_JW(M~i<;zEoh`4r=p7*S*F|GCRK_uQ?vSM~b6?y6t+yGz|V z_uRAHbCj-lHB zLpxBh3$V@x#!MYTmzTcdsX&Wa#a7>Z?(_zWt&hA0lA>>RaFNLpjz9nmL9r_K66yPY zJ`@;H5@0@xtJ~v$a@`d~;M;>rMZHMTID^m`yY8^{D}J|CMTyRp1pYc#N>v%?z&f;|J6xuPg>K- z4r*?r&xaj4cb-xI4jmZpeEGpcyU&B_-nnid)qU<0H*^n$>fZjE`l~Z?WyOMq z2TG8{1|>;kx}zX?i1%DjA|~ueqNixRMOm5XbAku-U!56M|0ECMUOMNxM`#}xXk!}6pe(r?%-H}%U(Q~?o% zSa@qGB7-i+R-IuziWQ0Z|1YRSe}?3T1HOnt*jz81H#5b>PQ$5su8?Mms|H*RysWoG zXZNyt=6;rVAH$~qXsdq^p#NX&AIgwHkk%2Me=>Ct@r(pzl<-E2&lJ;`gQ}GgwA9vM zy4gP|XcL`dvnj|@dJr;d`|##!4<6|MLo}D5Ba)g%C}q-U5ec!L#m=*KOMCJG*82y2 zO;3jonXA%djrPVr!&)om@)>Um&#T$^H#^I0jvkha9HdeT^@d~P-^^!Z13>@(QMV+$ z3ryYkx1O(P0STCQ?pkmp5DSS`8j(nlzThS*WiVxw0CV)}SZyi;vpL$X=A-T0ZVl4S zjz3pLK>x*>rnrLI0{KjtBbrGQzv6!Sjz1`nZf8pQAQFEYRoCudE0iw~YKYYeT>xN) z#u2if2QJneV?B3 z7vW-_V|1&NKk%%3UtjijJ@aqm8~chjbZ$`5cmOI=~+9oi!_0fHVDbNYwSC| z>mFoKXvP%~#c{%Pv;W6l`6t3?`uc%2fU0vCIJ&1rJ(EiqDgkW@jGY#xG*b{<#rSW3 z!#%P7|5XXD+5e;HdnZss#O~olmhn=Q4rtAS|K_AeS;%m<#+V}13kjz13$+LH)FUEg z9>!Q%)>%{aSdj^(!5hTsP-0WRyu3z|d?7i=nB?0Z1p5E*^mH??RNvrvVa_YnN6%uA zv*wiM_5Pq7qyqi_=N!f6R}p7Kg1v<5_|eqbVTnbHW`9u0&&MM_sO#s;w{VmCyk>vU zM4|I8k+3=xEJNr3x<9DduA^sJ13?}?IiM`fcAfdMT}O9H>Ag{r ztvaCp|B_}<9g`uFWR~q7(oK!XJbK>gmqWg8qx+ z0nGHgXrrad>9(fmilF?^JkqfWN6y04YYEl_VY6MQf>*Q{$1K8|MDyBJC1d45y>VloBae|d z6$`Efx+ibpRER#HtJ%ntf5(qqa_rv%Ge*Xr3&pHK1QY~FM z{++#r#)VH{wW{-bjKBm)lFI@Fj|wkFa+|!NR81sDaugzYKX1;&woHNl|L@2ErW(;b zkchY!S}lRQ05prm`OnKv-!=tR!3K}Q9WQ@iDNn3e@wNGV*^Tv5{qC_1Dkk;_1J@HIWp>F>S;e z73fU>A2l@k5j1*)ka7BXSpf9^|53@A`ZodU)j;^>sM~Hs5f#fhk#rwnPavC}yUosB zAwwV;gYAOUfm}ttKuN+2k;OBv{<$i`8swXXpqhKO-OT{~|Aw0vN#7I6=h=reS3`k@ z0>eiE?UR936r&uRJdxl3`6f3)GLELC^9|OKEQl`xURv$ke0=XOr+LtgbmzN@JJp}T zI&gv^G`@}H83{os6ryyX2Z}d@|229$jozrdP5ldPL6^brVRQKP8G{M{pF%zBZ3A0P zk;W9JfUz2665%fbLjV70z*91hK`ecyCv~@xB_r^vCHd(7)=g@fiBKagbiBko+i9fz zsbSx6bPV(R9F_nFQHxfr=yx{Zn9!$TP|pg?Cd4cq&#&NopxYf<$YhEmZ={{Yf<1z` zpQ#Z@7^pVah9l7bZ^4c84N$pRzMZQDXR#M( zKy~+RI!hUgM0g=`fy!BED1c^bEe>rzHWNK1Yf%xi!d~%+iXq!b9 zejmKwA3eCZ`$F+G*u&}yY(tsHULoxvY(_XCQBI$sspee2M^Q1^ zGJqrGri6^;m{tY-|GqcpC)w?IF$Q#~{o-yxL4r!)A*IUE?|OdBRLf(80uxLt>L3p_ z-3iZ&BF(vea;9*0uWbba{$}%CPZTK-9qe+r6jI!ouNM<)Gc$a?9!rvnNcoKKYQ~Bo zRDG!gz;X*m5d${_{r^wMgZ;SnWep={WYz^HDIvC;G&gDMVI6SV`5qbIe_exmMCMhk*x344erwcu*|xki6$N zjoM%5@B#74ftJ-cvd0rO@)h_a|4k;K`pJ^d)i79=+YXWM^aqSdy#HvY#?3W;PKXfD}<=c1&Bqo>*>5<%Tr8n^z)+O;$LX)1pUcN|%)LS z(%f64>ZBQ!K*B&yuC2S3Y}*C>|Di#_k6AwIs5@^~^T1fymXcX7=);?>wnoDw-I#ca zw4oN6dOdWg{1tD$Vi%47TJ+AXx7NN8no{=wZuN6kAn5;N13)qBtUwEe{2NrP$BHMK zkA4=XSw&9-JXK{;EE{bleCL%ruG(73C&*M4{{(|JYtR9Vaq6*NW0N*UqDm|4-tTwFzP>7lg> zm%W*fw(k{*jQzMGlO6<<)$uR%?=J<3HlH(xwd1EzjIEL6O3>mG+|L}Iqd}12KJkmD zVc7OvfdBs!(_+(Fm8aSv;wr{}u|BRC zjra_2T)Kfx-50UmZy`cgv%>+bNx z;lYr9p9u7S*3vHQzjLU9^Bg8EOVDf?$|NM(v%)V(ZPgT4QYjLyq?&o>LbJ34rqIC$ z6%=NpP?RPoY|c)oWG;zj8IxpDQVGP$fi$y>m6LR|0ZQ|R<5n_J5OGWdOQw(Mw8JdR zqY<87U|WX7PJs!1c4YIGtduJ1u$dqQq9ZaMZ`^loDnxufx$nMQ7Tz+nsO=I+r%4Z@ zgW=#==YWzm0)R9CGX4~XSi6!!~LKrGG{DpPWK?mu~~(w z;#wFGFsq{k{U3uePyzPPLH%?(%TYSrp_Ej7apuyWSA?^4oV2*3ylbvwEadcEWL(ocnEt90oc2O zgb}3(1@94l(^MRdrC^lWkHr8w7RL4GICg%AP;^&I3&>E~EU6Y`7}uCa)i*u0%uVsQzJX?y_F ziV`AaXo9g)b0zq&4hQPXU52d+heNWW&z-wbjMIvKG2}u2AD8yTH6wQ2SRUUi%RkyY z*-&6KDFFKa_|e3?!8$;JG*e#dy}3WLsn+Jr0q~a=uk*U%kBI$0MV^XI`h=Z3kz0Bb zmT_8XBB6%y03i<5WzA-#p9y8nh!{|2P*-9+P~|5O%rW|gvMT0|2hvwe)Llt8XW(Ms z=HS@$^tsa;i25S(i1-nMO#?^9)Np#VPw!Dp`Z@&Ph5!2>d1U;E`z9tQrzW1gc>BcU zhP&>%SE%B^FY*1qc57qOc^CXNS78eL?GfE^_?+9Xo;mlQbCb4Fi5dKo0t%gqUn4U2 zx-fPzf;0YvPo33$5eU?sFRWjnpt=_PKhc|;?sv);7oT#x`{b_a23A~1r0EbPtD_aS zm4f=%5(K|u13@Edf7h*vF59u5K<{aI=Nmv%ZAje~1ORbe4NP`VE z108KpWe{;c%y_}X=F@R{rn_P7lbMP*BFf36;-!{!fEm_?15-7|B(pM((gXc}5=Y2c zxy=75!{#`>BJaQYnuJWla7dQLnvaB+wamGmtEErRRkJPx`v2r$`KC_~l4TH?(QXxO zgCCZjV+Bxi)2A0WnT33b`0TGsk&2Gf6JVW=+;o;X&~gW=KCxZIH8b*UItEmvKh6*Z|^jlj`Ij8CnLs5 zdR>JKq*Dy0(IEt!VMWPxvO&c`{tY(LH0XE0!c{8bV zmeCxCr&cM`e&>3(Fq#Nw%#GQ_EJw-R!l3_8H5Ia0ipdF>M4pvtCwSp9y93no2G<;@ zmUhG}T%pSFY!}=p?}(xKFT6XTIsYr>LiL{?cfus>c{42n`v0{4sZ|GrIiDH{HmaEx z36f_}S4F3N!`)*m|6!%TSvH*tF zDULW%rvEdsX8(`r*A|)14r4?~K74?i&~I6D|E&AcQ8^Kpz5nM~Sd$2yxyWY!Pmx_c z`OAi!4x53^{-3fY(R!}rYw;G08WXkj=|%8`{{Pv*@=c!}B+DQ&7et>ApR}Dn>Rz+|XJ!WU|4_6tRv46aC=s_4(ssd*WgbKO1hJqDOYB@%&l_xW zpz1EKI9OU3sf5)EeIKesLvL!=v1b2I{@IUc$vkX%uVlt+Oy|wH^`m?%*NOf}wej zh>}>Aa0CJ^B`5)bVp+}ppCK9Q1ko7a78VpCa$d5>^Y{pCHhT%%ea8=IW0F=VT5$i5 zIRC5F`r`!tnrrwe0LP6T)*LrB6IA&MGZ)NpV^4?i{|lkRI5~TM=VEC%9cygBQa|rcs%BVRcWwY+s(FDwHPCr1 zI9D$U5DKvh9pqs`_)d6Cl)gtiZ(XJ)b%(QD?PVhRQ>Vw@5#N6_}7vFj*!>HyPVw(R_Ut!OjGY48i);lOlyM2n5$HxCzv= z#u9=R5hj5CA11)1fWrEnF!#0~>$&t5nLVZ~wlRVljAlr3r>C*sHxH@UH%$gL&{PqM znOS}LXoYi1Re;)D1rP?K*(GGG)Wz4aIEz-`f5C2K|4K0zMrv8CykE@>iPy7({vWO? zAq6qU1dtYlh?oxXSl}TEjp?S}a+zZ_e^mT3MJfGTuvewUo$&lAk_nkr|KUEW8G(7# z^O^JqqY_s{R3mOk5g@_Z0m1ybtpG(aJq^2DvT${rWTpQfQ{^IqxwoTjQx z$2r+~AeOw;Oc2fR&qQYUT?wt=^bxl9si60}^I-L=HEY(bSg~^Da)6gdLepl*@_n32 z%7ZKOC?w1dqL1;9G9!^e`JURD2RkqmRJ7%AwZ?>U9d z3G-n{gjMM300eag6qW<{rdN@fVbKA>VYTZS>5T%r7l6<`_A^|XL%3FmwPWVY-Bf8% zAR`AelXRbhfZWh(jX(~r{L=-Okf$-)?&cR&!vhRcH;9h@sFmGvX{*y7FS!8eig^HI zhLlg(gYW+W_@9W)jg3%KKs~rQF0qAylMUj=F4HWZDd8)lxyNDw*P4Vp7Lkm0tbhR- ztGExzX|^nQ_NMQyUNF%x4PwK)WdZbmsWvVuaAZ%n!)uXjUMVF3S+yo7t=eTmTDgpK zOE`IHW@NR@_1TAoNlj!Uhj^0%UyT0j%y4gVIQ-Ep3#mBV@6Zk{riA85DKglakQ)5Z z&YXASgT>}Wh+e&}Z>w6Ya0n$>K6*gKm#sqWvr&CkM|`0KdHKM@A4 zZ*ZCBVf7d>9rbnCHa~1*y1C!PQ+fza4~ho~BkoRs{=Woge5g2!kZ737qp=jMQv0nK zKx7Ku2ef`ct+^nAgq<;+@)q#b8eL|!)JZeTw{vFVIk3p8W4;G z78fMruxs?WNPsy5a1K6a*lcRBC$9wGNb*nzQVr8*@=vqsQ50=z0R5k0f?}dU&T7o6 z^{wK@2@O+FSRoUM1JMe5ZF}nWt7bEtVhVOiCBv$FGR?7K0#jgKUJFclZ!{n*we(~t zEJlP)jD$HRNi2T=y_i%ZV@wGu3fQi~ zJ3;1fuaYrO5Zh#>%5cottK>1mWDL#u%vY4`h}2`C|3~))pn`|f&S);fL{tf;TTz)e z40U3S+94Tdveq#hwW~l01`C2z4)p(+!B(BOwyg8NEI5~0sTvc_`Cl~>HyyM!6+y-c zB97%|$qdIc)Va*bF5J1>fh+d>RlW-s-7v`s^eQ!54CC0aXM~n&_u^{K+)S3`oKsuy z#fESHuaJKu{1`J^Xy$VN?~jrM{ua{pg$uezz(HCcSUKnWiI0d+7HE^{2JX-VWXa41 z$ij}zrM)2b)F!==BvtJkjOL$PAGIya;QPNA{#QUti6*YBQQBt<3EimjAGL(dcOlbRIDh#c+xLx)XAT-a z1&0eu|MMzPS(bWNHJuqdx(?+4WnHyjq>vIOH2rnTt~r+~=5ZOznomLZnTHZL2T=ny z2dA)cP6+zHGOF4G*c&d|AW$-G!B{Cu=eJ|{&J0v%$zOAvUHJWENA}32sFHQoo()G( zAt~jw%)W3XQuAP6ctA~1UBa86#9cBDE=2`PLH}3rd<9PA5MYX=Xe0-r<8#g}z&n5z zwI+iw{89Cc$dNI+#bCM7pjRpiMY%yxO(bfVMa$e88EEZuSG^I~)EI1CE}t9Ch_jz1 z@5XZ8B|7oQ_CJf}fx*ZE-<|;aznbr(k;11KEuzSBl3JgF%xLecVb`+O21^x!JDGJs z8I+j!RgYtPePzNs%)`iV^TZQGH;$bjFFu#ZKy#MN(|NyrbKS0I%ryda)eriAY&Ed^ zopBAmQy=LrP#JZYe~7O84BGza08&X(TCQ1eOQ?RJyI|^USt-behpfScTV1dp6@>@| z2Hc7wVIZ@%t&jHnpjEw}u$n%k2AbJ!zX38ww_*UVnIHq%{$vaj3iq^yg~ohFg`n=>Yu5|^Qwtz@sMn|N?)VqcQ0(Nh61@Mz$IsZak1t% z!0O6X741mT7W!d{5rEqHVJx6!Cz*|8y@)#kV7DYnuk#SIx=FYT)n$1I>JTS`*UU`8 zkv8F;w}aWV>*_VD*DhPL4k{Hb;B~8btb>tvV}x_SxSfkLo)0D^J)NG=fQ?mbvBmwO zoCGP@V&KS_^36Vtx&G{7l=%*R8nCDbftk<{vX1qCRnOOTb@xB=$oLWWO-xQsO+0(? z_KC?2cinZbIRC5NIz4HBAAXvvJO%C@>rRX%KRl%F{RG)VhQO#r%6RlA)h5ZOViIk} zDOFY))RQXq6M(b3?k}$DzIZJ8uZtQ!iEsZbhyV4G#WOQ?ZL>h(VIv)5|0tG!3_ohy zEat&7yJI>mgHgv=A3E~P-j&2@zAfv2mvkbRKjZL5B`pp?7JyW4rn{sM`oBTfm))}j ztAb3_aJ;VoiWD`4BIxiOl6hcLvQYL9_m!DibI}P6+z{(j5Iasfuj|#FCh0 z-32>JGQvU3Nm{BHVnoe#QO&~?BPjSxIBeGct676?pcJJ5=>PFWp9z<5 z*8i<(W~u042e88?lfWb8y#(f>H0%GBznw5&*Z-yLQJ*CGa?t-1*l3LlC&b+)ntqO& zRG_WOq2hVG{$Fmbv+k$p`jZ@;aLCo@w3J; za2wi_3&Yi*R5}AlmAaq(|N{~;N zqrMdT7i6R}rHPdi!On@bJf$K8Vuiuh72Ig$e>nYlRL9&-X)?~(gaQ3ODXSN{v&6fF zSYfu-lJqoFi{`Tw)lDr*M%X;J_&p!Bj+AbW&pAdVfG~vv23r;jnj>+a)P(`JqQx{0 z^#5e%&6{RIANk<3&7!nnD;|KG$DOb0Gzga`dU&B~Ao zyNq-Nvm~>em%0$=gp9U`nB^~gMBgj8?iAm^HRD*qD~0|>ugBmFaBc) z)A?pgLH}Ro;HX4PHq*IND9O0tM(dw39Z5F-tDqBZA*yduyxA<|$uU|}ya9a3>eXGD zE_^D}aBLO={Xe79LoM&LJz7pCGMPwbH_X;r0+C^L2jIm%GCgg)*iTYBtv1cgDg@zT zB1AU}yQdhRE#gV}UT<`=!=Y8qr61cChj-I^w4{u|?c&K~oM9HmiZhMc zB_mRSv&N-g#M-<$LZ5Y5l+2%GS-x?pjherU=X9q)z9eE42PoBW3*)g6dIn^y zVyn$_x&P-i3Rh(+W!$KJe?1d%GqArj>-^tNYjM*0X{!gpg1_#*u=|p+N85pW3IyfrM_t?EQvOcq#EUrmGF&N z)U)LESn-rfgI#*0*QVB${RXmyR49=TQILU6@P9Vvh>5$r!8?R~sA8FyQoDYCHM4^m zCEkd`A=a*5wMHD7zZR)vLTiB^vuj)6k9VE?j_151UODFT^0B@AOw8=;>|VrG*5wFG zAyg}sBU3Yr&5gGw38SzOQHGC>8o$E+0+77TR2%gF9P9Wb2bAli)v&<-Ays9ccE!P4 zB!ikKZczIr83R9#$WhI47)E8%9@;}6ETe?ild5M*q@lE+!)a<(kz~BH4$zA zEaZ1kHM9@=+!%uMc6m=QucVNb`bgwPm#dhrRpUVaUqR=8+fxwGM-|pO6eYyn3Y~@w zcEXtJK>oOezn#cGVJsxczm)C)%&7J{R-+0paLM1B^yP$Zm$68+EWX zx1;RwDdg;}&uv`M#ABu89oBDLLI1Z>3u87O1=0CvJEE(@xo~R&JRsuHJ;1MsT{6ug z!c6ZWU{(YPgPH14kwPE@!l!Lv;|j2%l7bj`q1E3HnM;F23WP*AuR(r>)kL@r;E>;j z5vC3T?XyI|u3zgiQ9!|}UE@Ii&oiW9ol$@|rQ8}0+=`bsxJVq71O-;4u!0o&Hd=>7 z@(m>t6vGt7LLgQMES-auPl>Iq!%@7;gPc7I2y*Y#lmhP_{B4{27=!PB`Gu*Nr)S`QJsQEC(gs{EWAE^*U zauSyy&W+3u;Q<|6rRYdHI_xG|k(8ynF>|>Z5!Mw6v9a@W#cyz1rxniyk&*i*G`)E- z)>)%QpMR2dBRMq+`hTI{o=A?NqZi9R8?GJ=_L1UNR8t3`p`*&?=9OMgV$qu74G^uY zUR_Bh|K(0wbj*T+8Jeqm9zh$R(^h1j4)p)$vs|7#Yu!mh3hz6`mO2VQqvU!l%0M`@ zBxOjwSP~->A-aWIW#w8;ggXEQl_A(mW(@=v(hRwwIP08zS*`RX`aE)OF_4jRcn)h}=wzyb1A|>fIjKg142^B8Dp)csa7`numiML^H6jpXpxZ%ZVHal(z(KlH_}Tj1u_ z4tBT9bQFRS%L_U_g4Qp>EXZa{oPuVkJz@}HF8R1)`j9Z@nG~-eNGWR$O)lO=%PNO-S}GS$h-Ov<#zKOE&xFF1(}IEv1AWiK8U!1G z*J3XCV#uOm#5`YOEy4GBDkat)0!WZ^NbbF}98F85RMWE@FPAzFjW~23A1V6+`u{3G zzE&Hf>6jv1NWQAS< zn4umS0Y;3v*DLr9R}PN4JrYR?W3L^xm<_j}9u!GgsrxfGGdvP!Kn3)FI|L%>A_ny7 zXJ%1@Yi1Q~+Ad(3Tfno5Qr)bd6f+T2#hSKcfc^&*zZr!4#!%)22_x>1T3bwJiIEx= z0^URFrp&kg7eq%0i4-pDr{cbs`M1_67W97ylhU*k3@r385mbm~x-QSGFef{YHIoO_S?@Gnsc{N$ourJrJTm3 z-wcuBeRxFBD<3OI>IrziAIX}#L(-Wr?EUVL1&F{%CAK@uK%iK?tEb@mUjqMZ)mGCb zh2Df3L}FBIcHiM9lh;i%{w|E&cSoe3Q8w=n_mFy_6=)cgoD`N!kEOPt|5xw~OZA&M zAez>T^;rQHr|9`vXc!F16@NsUI7N}ZMs^y?2(G_S`-789;x4hp(9w<|TQFCF6e$8u zkr0(<_v+hJQ%nG`1}{WS8t(U5K>x2KN_cIEWC)*#-wKR52qr{|v#~$+z1~!w!oK1g z+KRY>{%{eIB0DS_3HuE2QUyfH6vcaXs6_7^mlWbftthgm5L+Zg2Z%w3-#$9T)So9ZV zH4gM&IVg?R*%PpHt92(?3`TQ=nM!Iz3gw5S$2Y2$pED2MSkX;RX)%(iPuro$i;9Jm zwnFG(>N)T@o8tzL(D;S!#>j*P#FV#=kKjlVIqipYvx$}*2p=JxWA#pu2ehwM!kQUK zps>Z3c|QYbdIhc6S?ho81daiExA=))pW5C%8rH1t++6>f6}TiDbCl zj5$Fvj`sd|P_)Yzb>5p?-MSnU|Dba^Kk59S^PSE&I$!U6rSrwk-*x_`^NG&=ox3|9 z>U^;C{?4y=eyMXu=WU%gb>7f z;r5@j|DgT5?cZwuYWo-3-S%7B``WK>U*EpEeMNhF`{MR1+h@05);^_ue0yzsMSH6K z;`WmEbK6gEKdJq=b{oD#{=?SyT93B=we@i8A6uVm{cY=$t&g?tY5jTYk6ORidSB}| zTffqJXX_oU+gfjI-PF3SwYznBXJco5XI1Cu&eG0!=XsrHb{2OI?u@m6*8WlZKimJ& z{`dCRTBo&6Y8}@)wzW*Pr*&lO@YV}D?{7W3_0-OLTTfJ$@1X1MSPBH$ddIVY9@pIQ zjL!R$)9!d0#CPBE6!^XBjzc;hOpd*y1M$o6Xv6Q0-d^~f?%fK%+k0<--&gf+>D-?@ zwYLZ27xb=!-}8H~h2P2EneaQ&+XBBY?wtX@NAz9>zlZluhu_0`r@`-wdYj?*g+2Hx z^Fc4@oeICt@0|j_&+DBGzt8QR1i#PeZG_)v_g)IW&+2V}->3K1!|&62>)`jPy*2Rr zl-^4CeR6L({64974E!F_I~snU*gFb-pU`^={2tsp0)8Lgdk*|QuJ470~k< zx9`*G%uZrDcBS-2de=bA%4YXWu{zUc2ZOdd^M#67O@8Yt+a#hWPd)}xiESbX@T$x- zq&iJU{^nVq3HT$;jHG4-aVsV-wqy?3j3ns)wE>yJEV2R7#+e(wUXTk{P62ls*j6m1 zBE;JYn{@z-93~MYjJTc2cC<{$7X?$K5ITYIZAal5$*hq8)+xeaUzHoO8CcN&*8~?Pq(cZT?V_Ba3C8-G zm(@T z`hNq|5gnvA3f(BQ=~aBK^@PyQutajmroN4md9k{+Zg?~f^#66Ck2O(m(QJXYC7K9> z*-Cgs3dM+|$5$7tlPlSc=AXQhC=RLC6>NnfZ&r`rOalvY>5f8YsEIo=R|2AU}$numjeI)X5$S+ZDtG$+S@cg*Gczc zy8~vMlR0QSMS&H zNU#|6pB2QgL#-@SbN~(j8G=`09c}`fQl%Ar$~y&V@QyJ z@96HmljPw)mc%H6&1VBfVlXqJ1}u-+;QZxrM}xI;h!RK^QbMpip#N`h=Kq^HY9tgn zvYftFTr1XA%!DUVu@HzALWf=X9JSc}MhfoQGQ@0+lbDtIGG@dwBPlvE+wm z4!q^4KjaVfH+`mhR5NCiJqeml>{e8r(D&9-X|PYvoI*z2+|VD+MNg*yA-WO%_cbJy zM4Y2DuYmeAI6}c=eKsI<@&P|% z4;a}oT6zvAG68bbL|`^t;fL~o*eVo63Xw6P@gx?ROpL`0*9_?Yek`QI5gZ0k1A^;e z;x4rxDd~o_Q#!vKHWMJkPacV~a1gAUw-X?s|8H`2A)4mwaN@)NHYOoVg5-OSqsr!H zD}^VsC3y%P8tD4}ZO!_>)|=9c=gs;*s2mw2->;JNjSPR`<@1=?s@=0U zhC;>`;LsQP|J#B5wNtto{%Rqwd~tXXtQ*yF5zt(DBvQR&W+qR*V<~vD{-H1WXaZ4Q zvx=9S_|tI2a+i*dp!JJ$Zf@Lk6t_5DB^>0+Hw;FwV}_)8!5BSoe8D(yu5i>_WQ3HY zR{ABPTGLoyl((++|C#9e{{~q9hyMSqh)$LR7m*vtPL*o;Sd1o_USp|BgOtu3)W)jv zTNhnYm87g>AaF_-okv9-1yo7s|GN+ygmWFN-(;deXokN5JIl1oP)x-J z!8)r;a1qcm8_oN_NSMl(c+p1_75KtomJkX|M+zdI}`7E|bG$cl!Q8$L%jweb^Z88yWiGlQZ4x)UNUu9=z27wtT^ z2~ksu4yJ^RHGPJmt%-3WIaKDi;yrWIUkGBtH7wq*%{GyW zDG0C*^#5JM)@KCVd_`gZR~c&AV*h6T9G_&AGr)}vyA;BzY7r+SC{k8K`(&}RLZtAN zeL7*LBlZp~RS8V7_`*q!<((ElWa#9SPB87%`_9^#2zk zEsAE3q@n9m16(=JmaS%K&R$B@g&zd9`st zZzC}>L@}Zpsu6@cSe!=-Y8=)Ps)B=6rVaG}mw0YUWeC^`oqkZ=t6S@K>%-zA0j}Lx zh^hn;#qT{vbORUmTB3c>Ygv8Zg4R0f!nt@`@e;B=0&`=w)W-x~mb!0dNwfa%j2#X6 zVx(h&Wv!el1+*m0PYkcjZD)j#>;ED>$Thr(HMg=QK^dYVU5I0Ieg3yWR>jP0guMz^ zm^)!LW9Uvtd?1wL^>cg3P)|JzqK2Wbn1V7Aq_oiZoIfO1oSdX{O# zgQq^@(<;n_5kb{7W;iDW!T0aM|GNo&)9f5go=<%rZI(k)C`yQwp$W!}$u6+>(+Z)jGcivD@I^2lAp~A*HPl zWZjw}=_##hB4~ij_5r1i(ZFxYY|A z6b`N4qH;eAeE(m8|MyH6bbAD$3Q=1%Zf?3{!&Mn0*V!dF>;2>{=Q)!b7)lp#k0J`77;*uL5W$hCxEp0T61#RP=Qo)HUzPy<|1BJ0W{6dN8x)9# z5Gl^aL9ox7%tE;_p|sP@@&OVgWBFhw=Qoc>HML=}Boort4V9aaTEu+>)1d!%VO)fq z9Zo!^nO}*rjRV$k%cD{Cp;Zr6PN1C;-6^;ZaZYm*8#wr zCiyp-lmk_76M%UdV+4h2h)2>j4)p)M2$ezt?`R#-vo5WB?6JqLDmb>-G5rB^tRl4l zBLf`Ce zW0(Mz>g9uf(^-F#c0rl+LH5N;0+8SAXqEWd0sxi5N3tiT;1EF(l8VQ~3p-wQpG+nz zZoqkhrf(IjL}DCN7gnniotw#q${I#AG(tmJS#qHbej&NobIs0m_yACH6z2bl;gT?a zA%1ho+qu&l=uwIYnlS>4sItKG5;%!$2UTJ~hK1&}xbbFyf<(LVOqQDQEM7TN;g}N-|+(}P@{=eTTp@ASVnvNb=VKg7-%r!%@o!X|ON8{LZ z^dL#7R-kkP?dYYFE1?xpExt3L|Nj@`(7(}_t%sVjznRHP6*^=ZB_N^=tM@jzG{+iWaNHAbu&j|aJ$FO)PiMx*+^ z*joQfkt;+u>g!+uFLV^=5oi)u98o?dOVM8U25v^Z8bwCa>mpH`Ubnhl*E$3sstQPX z6ij6ZMaq~&j2Y9I*5e|i9ARK+n|c0MvOf`jb8>z7vhM1!$wpP^S2WyfY#|4+q(^8|+)Y`8iLJ5GLqpghf$#r5`2PdK z(TiA3gu9K9g``X84VRGV4u%<$Xn*Cg9Wzqcuff{^j3Vq8~j=;LG5SK_RGP47&o0dKqG-GtJ8wn{whE2*R zJ0M6E5X3e`!=zVYB};`1yr>vbp2$iyB1Eh|G`E5&FY!{+V1G3COO?C+HUhq%6K>BmSsf>sjUB`gQ9jwMLB~l z#>_-;paY9__~K#k;O_qWE4pid-oNvT{^)H@@E~F$d}s#7zv2S38opu}W?Sl1izsOt zBV)vy)1yS7%OAb(;O?f$8Z@yRH^r z!CkWsYTcN9f&Tw#cB!UBLxF|@MJXUu*3x~Mz@FsrN3#ZcO6AY-L3j=Z`JpKh3C-9E znUtf)4`Bt&{d>1_8k0gr{GL0ld}z#hL_~zKMJPOE5WQ2X#B*@Dy)S=U#|eshBKAv9 zIz7I~Um|Zt0XbyRZ4ng_P>ST|A1!6itX;NjS=!7zR3!VWIe&fUQ!a6-*)#i_YaUVn z`u{(hhs|o5G)xq5P7whcBl;=N|2MXV3^kuNQ&6%xO=ENoI2EgZRDQRvl7=g;HH9?c zFYn2Pmg!r~b*YI~5xY4GM57A&|K~Cq=rjxO-5TD7{QZU#IDddS(0ViU(p2F=kT9YE z2`Mj)ak`1sq=YFL1sxFF${Pcj?adH&T)zNy5ZrwiGO%UTRDoeYcyyyqSWWJ8YEz#N zE+8ZI8FP3GVS<6FW_6zDC8BPtNeUN~D~^~#F~|UKnlg}aN+7SFEYSb|FXj2oDfi0U zT3Y6zlxL1fxyNs*(^`ypuvk#Pqq8*dAh82@KIbnQ~H6ai)A zFwr1k#BCB@s=Zs^L_t7N-T=rU^kjt~6xHuXp-(wkn4lDG z)wzlqBB5gZx6GiNKQH0~^ABO-*b+#q)hcoI^m}E*^ABywGAADs$a4bFWR_dy%t$P= z3RN53WmdV`tQj(#%dDXPAF&l7*7cpAsAXoavcd>xOA-A-cU*N0fU%uHC_fQx~5sx`m8OR*xb@ zHW)b*G!}4^`cVseo`|wtZK%KsD6E9-5&^#1!Y0gb*va(NW$CxsU7!XvLq~#iGxlx8 z3ifz7$_wX?pPRd+F4*sY4<{%85eeXLPKY|(j?ifu3Kk+T6Pivlb6*J;!g$=;S0X-8 zJToKS|Nk!hhxY$M|Nj?o3$J>7U_p>5wW3WCiZ;;Cfqez3ph8E~6)oWwn1~wI@{$&P zh`|>%M2xJH6tVa|7>Q+ousivyUxEAivk)Uc{HO8;k5wPFvV#78r4FyC01>Q@qxcAz zj8N;i+su6CgQJ3uW+CL>JdY~LxBJxY`_Nd?@tXwA%+;8Q7I{+;Mobrh{@=sMuA)#P zG6C>s@?oNZsYk_#4IW6Hfi%GT>M@aWLD}PpkGZ$0ra-$8csNAKitQhCYjPUvD`zId z5f5xEgbq+sC$$S7nqHz}WhsZC37%Gos$W%kdVMGPyi2IARTE7%L$*g_vfu^d9tIp;C)0Vz4mK}sf(1~QRz_2LDsQSSz&a@MW)D`(c7uU?Ik?6y>2NGOTP3xhF_5%#Q(Skxjf z6aqL($pQLe4phYnG_g+&plWnAKgqCQu4YIORU=WBrK|baV?TqBDh4ieHR%>LAx0{2 z8e8UGX>pJXeYQYmr}ApldG}fEp*2y1H;YAiPcZCAac2N4LzZ9~;Qq7FP$_S?qk}|B z)e8K`V_5FjIQo)FV6av%1pWW0%Ctza{Y_d84$-h7u%1=(dHclO99D)sYT)HSmo!~J zl}A8jUASgwl-bm4#ekuO)-ylxoA-geJQpfKhSJ++GwN-#!=X-wXXz#o%>Z9?IxN&N z@i%{NHzB2Re1wIX3$H(%>WfD#5rJX=1~HQf23ABh=z|OimY=s}3!_f;?hwbIxTWMz zTk-eL$4l}V^dHQJ;9`AE{6u}A`-l9i{eu`i2){XcC=Uc<{Z%hZ_c7sg{n|=mFTiaf zJ|Vh+y8Ca1hGm$^Elcmam6s0s|CfL}_QmLiNwCy5RS7kVN*lwj?xplR?3SjS8|XH; zJvaA#4F(V^+H=ngVbAS2AB;#YX|1NK#Ax^2+F@|CO0{etJ@<}*Sd?L}1oZ!7aU6%b z=Z>R2On3GrgT@Aj^=QlUgluq4uY=y+|0UE}_?GeUtz3k1y8@H8IyT7G@RXSd{07a5 zD2E+fXqa<_sL$!_L``ssJ1WLNlpCez03&L%FL{26%|Kbe!4_esBB>ysWxsI?`VVXV ze86fWK&eRgY-)C5g}Z0!{IG3<9$4>iT2S1>z$V-*A*G1inIR?yM9yGj_KDC7Wb9^& zeh~wM5!9~|i=krKsDi~%qhG8&aE$b?0Qo#8$Zf;RA;a>p?E>@xrvWbUDGXFwL>yZs zq@ft=QW_=zOV(wq;(ixvhtM&NnsuQ6ABUSLt5_Z-S((M+8%+>D)qH_&*$Xk!;YSwu zwIf;J1Sr*fE<{_g zRv=Ugb8l8>uZu{qPQwWxMzr@!!w-0fCe^hMFW}I9{Tw;XvJ&rSG3+OCGU352B`>r( zZN~A~M1K%%qX7ED8euo0VP1 z{9Z&|sy0hd4KyWgcr8*IvxKin1}&3By&t}^Xa5h2-yShbu$ak9HStlPzz~`xv4wU{ zNmt4r?(3mk%{8`;d3CPCX9`hFd(36G)8)c#poP}1UbSY~Kx-^o8S5T|6(&~Dq_)d8 z#!<1AbAzi1bC8bxMtVWEy8~uH zcZ+?wPlRxn=7;kj9h55-#&$5JAEKkbS7I+H*nq1(We4>CucbrF=177LuE-3ju0bzF zbuGsGiKyxh^hgcU5)~`8P!rG+MK)?RHWrN;RA!7LBr5!V$*g@;yK0s|M8)*4e2D`a z+kD@I80AMK>oS(yIcaH*US;~bC9p6_jqDfW%k2y$B}Nhe%PkxQ{dcfLoMaeUEd2*o zqOxzCNSJbs$+mv1LB?m`-#8Hk7(zOV;yfH5SwQ@lg-rXvg6)t#B3dZ8jZk>VAkOUv z78Fv1j=-5;hIcAg6&G>d8Vw}RN8~r+iiCQm&kroXvWIs$YSF*)LJgcGI?n1XOFe?h zV7XDJHFO*F|I^0lCP?uJc3)TmAYu0vWTvwzbw7;)+<6!RhI|)|F`9#-H_+ex8*5RqKpuAl5pq_xab!& z3$#R;&jZ1Cl%Pfn@0yO`v+7`pce8j(bj7lj$1a0eJn>n$wY=Ouo>)+EZ28`rTP=G; z>>jy%TK3*bl$aK|6afS}4pS*t74vm3(Erb{p0ej=Vd_uKZ}hsAvGU$+6|E@n6DlcDFi|w?17qa%JXa;i-Gx+ zzCq%F7*M!T$1G#mr+evqV#YpzAN7lIkP}_;D&`tA_nU2MpEJ=zKS_p#Ogtb!(U;S-mObgCu4- z`IfL!B2#M7pg<+_$WnAQ1=K_?Sy*Ny(CNOMJk>)kMh0nA>aUt~@o6{J`!_Gsl2sMr9QDz0A!BI(1mu z+$0M0J3_~C8EwP&cltz~P)Fjm8zfJ(_a}R`qGy$&@}t^ z$Rp!N+&3{fIW_U@#oH$)H{5mCy+ZBfbqM^9CC^Mc@9K=V9)*a!e({v(Uq zZaMYjtxI<8x#sH2uD|)(olCF3?#kCJo%o-LsZ~p^JZtI1t=Kpg1_yK8I%ZOnSw{x< zk8~Wi>1+$wB6Zj19oU@~m}0rLXL|Y+m%8wXG0vu@U<1T$X2z_|b`~}$P6i&uV$aiD zs*50{-7yV-)R^ac7QDQ#-t+YChOy)aM`iMK;<$-fxD?ek=B1kaezIt4Ve;i`0?`5@ zruh()H)4ty$oh2;3!DGy98xP9V7?!PmGc27PZ*H zYP`NcyjTMTq1;`@D^{*#&Ew7>6!t0T;-C;96?e({4VhsWM09-g!%N|{U@9&u`iTqM zO6!&q&EZkYAdaP6RE>@Ze6XjWd!n{t?h*UYJ#!$d@=%bu0)@p`S0pT>KpMCm=skdIYzJ)ESVMGi+pWn{k~PY( z1f^qodT5!$MATOXK@gk6@>9PeEBvWn<=i{Jiyq=~2hXDM@_@s=IH5GRhTyGPBvg19 zA*ds+{HJ7JLjHZsEdp?vgyBTC;+B}tn^hMe3CfY6ws%1%Sk<56NgIwaX9@J^(5O6PBI^H#0HJe7>H za1gAs*1H|ifuuBm^XskJAP-b#=#AQdK_UpnwXzUPLI3|L&-<3P&p6ZP`tgK8B06PNu|D_zB5=pH;nPpjb!Hxy% zC3|Abh6Og&-Bj@vMh2R*gjU6xNJD`<6afAIa-MS8W%^x*ZC*!V_Ji!LYbh|zoV>y9 zlE%tIq17*q`ZUG>-epAwvRSHpd*zV$N?JsU$&HT2S2~~o$(HCiK>xqO){Gob?pC1c zr!?}s&#GE{_4IpXM4n7O?d?FTEQ7X9R0eUV0M&IG!%#J{YGk52KC7;1;PAv^z`!dl zTA?-a6{h$WCWha@9r1=N`Ej@NCgcRgi-6W);IvmoQnpq4++WrDv!I3uM zp0|Uka<3^>&KjknZs%f#^6{9YDt4Wk#0GEQlBb-PhD$1&Qw0u^a8&i{Q_(@_TS zge8yWoiW zH#dePDpm<$1mQ>s+!{nWCOX7qM*39OmCErs56G;&q5f>NGa+tJDA!nf$4_YDIz-rD z9udip_;M}!e_bw>g=uUw%+F-Y?5rHE65c8D7ZeU>h8tU0E&u-(!1|Pe%(DG1qRGMm z&Ttd4gOL;tFmz2cNEmUuwD^P=4M&wJXC>d)r9{gVig8Kkv!Ou?@Z{7MkJD~O!I;i$FNVHD;!2d>*sU7KW7pU)OzdX4>CBT)$eQd znh^azcB-f~ZWwEsG5MK_ITHQ8ph>WM8xae@MjRxSE-xuviD?uRBi$s>P9!Eiq3*DT zejl;vv%x`2F#7$!djIdCq0onGUF}( z08ZQ&@4N4oamZXgH4f+Gu7Di*zU1NfzU18(c25{fzP~00aN;=qLL_Jd*t+5`&k0R} z%QHW)KJ%>y&*&ZxuY|oTgalxdizM$H#|KfSwm%>Y+$3)va2QPsl zezD<`Z})_KD)AC1R^)R8?~vVdIzKaG1F--{v!3^xfEEnHxFsw0EHL?>;r|iDNQbe8 z6$37i1%PHyA+eA31*R8qs0o!e-~DnJq?0inumn&h=F1xlU(7F|(dju zs`J0W@JxU~`h!Y9OaHMq7*xdqQy&F0ap1np2xVg`?0^BY5BmSFmLOHX#E+Fy`#sWQ zMwA8aTMHVb*IQy$)P98QhR6cUpP9K6o)xKk5C(;%C>>~Q^BpiEsfiS4q0c%2O|Z^D z#aLO^S$kRqX#0|KIzQf60R8_rY#dT85N5r#(0m8X?sX+e9Z5B0CG+&?dq(j*Bx=a; zDR1*$ijX{FkRNeb2KxW+REp#hEka5d?W=_?CWsUv(AvLmz5^yaguu%ujN~aKCc5&7 z%Uilf#Am=EYV4DV4e-om8yTHyb`BG>{E@JtQKkF6LI3|B&j0fYhv`c=N{(H+k) zLnBGKx!XBRnh24gmKI!LXx^P8ijr6a&550vVo+22EE|eRF|#Q%6;dLK=n-~Yx8Noi ze`|~(yvK-W2v8|t3^rD5qfS{(4j5O^|8K~_6Fr^2bJqD1j%sHP^xXLv^`P}jPzaS^ zr1-mX1eh}+`-P@~mT110F*V`J2+g6Oo>lyfndYNJa{lj|mKI_ns5Eesm=aV@k(p(3 zikKTcs+M)36zGZ((OlLsDq0$tA6Tt0Rhsn-Q@@Nsx1N7GSUf?5!gkSg@XSoUjrz@J z1d6^$lD~Y$TVOl$LmJAG^cEQO|BntOhPMv*W4bws5PcI2Pr%O!rzuvL0@AAv*^YG|W-NRKqxr9u##z=w5rO_PeS;A}Nhhn8idN-pI6dvgz!4(c7Mc7cJ)LsX% z|3~d?COB?KKa?AS2wOW6oLd(~$jTrk-4I!W`3kN`*)>RDB@Rq9!+os53sIY5N0_>Z zIE@W%P#>OGRrX?gt#-#!l&qV}4M9LJgN+?iVkHS`-;gQL z|L+8{!&w2YU{=-!AuNZXBfOZMqNxp=C6R)h*|{^AT_V#k!iyDWS)hJ2a(D}BK~FJg zYC~(&@C;3!o)c?%N=07FL`JZ6eJ{&CkLt2E*&4qrH5S22z@!e1uW3QPAWV^6C7}P` zm4rtw5W*&MXP7vm0HJ~Wbi-_|B@li~EUPOhRgxesQg+&slp*zE4KpZ4bhBF%Oj%8Y z5GJs-7>XjI@U4@MD73Rw}Yvp8U|WwD?+68AINUQFXa|G(!PV$f(E@_~Appi+rU ztys7c#}x~KSRt^r@>N3C8xH71vT{ur#^JBUoS6kU^acI@KFD#l(J+)MHPJw-lBG)1 z&G6Tdn#H1ae-Ny*x&)tt(h82`@YiokB!_Xrjn+T(MITMz=GG1#L7C|&1S8h}bbJJ@ zUxZnZU1H@|0YkztPs<;eV7>isD}w6K6E`)pSRD=nV()~^kjS0V3JXz);iIE{$()Aa z%A4`P<1vXcL)6BOY-F5c&H111hrk#8mnNbmhmz1CYHMKtp~yvT1Bb<`9*#25b~L3T zU#1}^IO-}m3B*p}@#+}hB#=!AH&qE?MDs`p+!`?LC@YCiWmYA>XNf2Q+Lo-lY;vSv z$QM?yRWfv&!qQHw^c~&*mu908fHa$H;fRS884LJUU^}>{j7=27MNU6pOM9ib0 zTWRqLGP;aE+gJf6_C}OtEbaVHasF4k{obUr8h)Cqp}>$);O&p^o-~&H!n4AMkS#xQ z86H9gCP*Fg~P&1aO4uCVIJ}+aJVU4$l2vwnTWfP=uiP#r{S2a|<7V#(}#RXAVjCDoAGAJlY zIlrq{!D*Chm#vA;Gx_uuC^=BF`u|qz_yqo%t1ty_KfZhNSaP5h=?HeNTW5|1)h}7> z*UZ@qXM~E&=(kGi-)+11?1U%^*hTt!59H0x&hE3y&dhupu74Ikvivph`zmqmmB0QE zLZwiHGifd|V0S?NoEmjz7&VHuQebW?Bs7BR4sK1$+CD0*~k^0Yg z>K~*fJ}A_`FZ~w;Sz!8qYNP)Z>HjgAJ^;$82pj$9)Ue~jr~hNg+NAaQ*8bLNh~&KX z-`qWYEP3;d!OqogFr{F@*S$6-xaLmO= z3mlj3w#n|MvE*&%=Kx7>e!GpPwB=fmTGMSEi40=&UDXrQ9!cFXmkH8coz#J^GeB`# zP(?ExkeI9qbeI=`TszAZ7UBOtAvrneJkUA4{a@`{THkK{R%?0k)8yggPRP!4o!;Hb zwc+}kuid#+e_8{+u^~Q8p(IfUOLk4%+HsVEzO%8V`wD>dd=lO7UcFSP&-U^4t5!^n z-*of%`iri*=xmCOc<`3)%Pn$T13PfSj&OGNb|e)Xnnwr|J8@88fp6B>7o zp`_sK&1){W=xX@8K`^&tF;{XvmMUOV(0wM^V^?mzps5;dvp8X)*rWSZ>@n_^XJ;!-3B~*nKz%nhHTDInx ziIpqYC_TUa0s8{ByZ3?DAHM6}GrF$=NQW{=6Y%7AC_i!8^$&7QP6&2_ins} zAr$$-13DMLO-^(#>m=uKU{FF``(UZz zzyt0L0r$h=e{y~I5+g=}HWNX}0?=`ykyZ=VcQ4NSu%wXn@S)v{jFpx(OCmq;0L)C? zb?;H#pYJ5wc#B^kaG2Z>$olZ)hbK?#UI-+5hI4m`g8RVb-jiO2f)1cgUDLgwliXlI zS~GQoU2n`PoKKw)RVU^A$Wqho4Z#)Q@I&gH6>~me!k=|Dz9v{z}d)i0?9;~ZZIRq zc3<5|u+I<@x@vOklngNf>p!b7zG`xV=pHt_@9p1S_$4@? zQiNdDd{$lGQ^B9=WWfMvD+vs6F$$ry3;NClfYM#}?BCVh4kKIi@H}MjVTNC^ET`5D z5-T^eUg)x+@<-_Zlateu&c{2i>AbXaNc*ep-)&#mo^1UX`u}&ej%z(F`8~Lud0oBnFlT%Bszwx|PQ%jbwhX0?R zm|A!672TTwKK7BqppqYKoZdi|ahA_w(aWx}Andv3EaoM@xO-D4d4(2Q@JU4%ygqcD z+r1HRnl$3QTwbTB!2G84q^vXSDbsXl_jPt>s02_7$>al@yEj0UmgzYjOe|QRRY$8( zTU%jkgSodzCoa2G8oOC-pYOW&wC;6)Des06Lm6U1 z<0yepeBz?>1vF{u_X;cdTE|N2sy!gigGY6*4daXt8e-`-UK1`)U6^bnwehI#)o%GI zyUVl7pWA(nEig-|lM)5(Udv6ZPDOVuvM>9(=vJUF+a2i3M8E694T_zT|AEYx=JQD*w9Z$0u)HcGJXH z7kzj3#XmcF>+DT;ZpP=JY|>smxwHF5fQ?8WGM;Q?ZCdo> z#R7M@mcakFc27;5ppag@Ys*{U*(brjXx9GccW(tkq9>qhIDUNm;m7Q2Ng~tYG2X5< zr@!%vWS=1D_*2H)yT->CZ=0F`zdKniT08TVnV$!we*7GPOoABw_{TVRC-(e&c`w*U z%$S}^z+C?F8UT0VJ>%O2f=}$e0T9F~9f9D4qOgYvvUdDw3KJ9o#bt?)5(GgO_j0%l z1k+sB1QWFhg1zYp-CM?z+YTkJPbd%XriqD(@ujj9{20DWtvg4^in_4_BwybWY)F7y z3aYFQL=g%q{>btqc9)3`5fD04fI@_xt{$CQchSKEu2~=_aD$qa{;y9u=eF-@zp(YS z);p5*`PBPOTY3kLCAVwF9`@*xP3OM+%q7zQ-MMZ03N_YIJ@Qe)uUxrC42##QrPG(L zonm=*{_^F^j$Q`+KK#h-PrU4sqeM3R!o>L0l9#}&-?C*>6W3h56I}c2Z@fnQUNN;~ z&D4^$Q%j)0asg*K{DT|4d?keFQyhB? zW5u@Z(>r!v4wAX+s@<=-`sHVzbM7m)p7+Z0FSroA5}4A`H!VPCY&r8RQSj<(u6^xw zd)|4&>u$XHrq`c%(#fZsx@q%ir@stu8#wFMfm46*D|(B-V&M4hQQ@G-Iif!hF*Yg5 zXQ!Z(7X(ikOdi)8>m+-%u)i_m;=ZmJi)^@O|Fe1>(B74#Ew{k@s+j)zGG5<;3wSG& zpT|rqyc<%^L;OBI1jW8Di+QEh!{bX<-3k@K#Fv_I+yC@l8&ErnP}{CAGT}nZg$e%> zT~GYdm!zrd$G|*UbtB5ae46R=Gn7{CKeE>Xym0&g2JiCJi*+2fVSe=$ZLnG%ErQsyR+sOj$G zdIygs-_tWH)qcYqSHi$zicOH zK>s`PhL$3Hm&pQcVoLf`CCT%=7=bC+Vxfxkowj99)2WCH!NdUYhR z2@9U`;D3j8=nwpL2m|_0AIT*$+!=c-jXBjwb~kj?h5UXa&}7&B7iKN1D?AcUr3lAt z_uj>f(w3wQsTXV7Nim`uH6$Lfnh3=J2r7eN1VPTG<&Yn{+4^tDXs#j@fK4CI zGMheVX@1G3ZPSz6E}L4r#4Oj#yj_0I&daPaS55BPxy{O%p0tv(fY@oZOT6y5bK8~n zE`TLFoU}mY4gqw>iVeMI(w0%g^{Cw21vd1a5q^5otueH%VMFiffv1nixtn7{?`i(i z=jPoDa&GUbfjt`Mx@hO$Tq1T(yu9}m0IFZ$CTgyowDx4Udo<+c7r94+?T8WkUj)P} zdyCEbzkz6@=|W_?KGw>(Q((EM^6?f@P+42(e>-_n(*8O4N#1-z?>S@1TlG7cSoOBc zuQH-1#E9f@$IsXurkdm;pjjbhcb*Tc!#y~6>x-eH&mT!U40ST%{nCppOdPw5>7 zUG+p5VJL0E(g_GWsGB}2vlQ%4mVNM}vYlu2#-W{hQ@U)Y+$brDICbvJ&j;uq`shcg z2Qb8iTzLT$4EKEVjNXgVpb4}KKs&v+1fc1c^IY7D!Ah3*Uf4;lWTa=!R3uh(Hm%x| zoZfpuy#6DnHWg?KzfN`VaKSbO=VJM`2Xw#ZZ#`khHs3IBOyGUrq)nBB+ktTaWutP{O0vV7 zw$08`!tUE`2vmq%jcTBrx&_hPwCzgnEA2?AO1F2wVs?Sq*}b#y%Cq!Po@9VxXE`nC z#vO`(ciaocgN-aMqJkS=e}Ry4fN}vqu_%S!$kL@3_KpMr*Dq$dR=-b6du(r#UM6%w z3pE%2)Ln5ibZl>F=7ZFC@dvl|CZIL?J%vz}x<;xMP&k+;LijwKoZNdcfPDh989Dl0 z*+PTd!*KQo`2Ve!C9UtnPjmG_f&GW|jsm~p49yU0q_yNkR3D*OEDl!SF|JIPU-fv> zMle{>f!DUrfah*$&!$-hR;rS$2Y$qmpFD>xU}~r0rj}-jr>DV0qJeN#9?)_$TPru< z-k4fpJZ%$c*htKk1%|-X3jJ@jUzfmNb2Stg5Cz_RQ19rm7Gutht0nb6S(%8xoYz}V z?;SIi+=&B1yQ7oL!^RPkRx8Q#MOU0*naW0nKVw`K;EaLZdV)jHfz?z_v>8pJjj)^W z<*O!3RAq56FPEYi4TG}PD>wN_Tmd1O@@%`jsQzF1ko5my^1uB$_-U?%N`bd+>@6Ql z-nA&+A)`&-c8)PQrBn#!n-)X=zbw7~r|PT&kE>q?qAqF}Oj6b6z?qpbjKlu_p@)RP zM@K7OXPD2brH>qm;+p^;Vzb>xrPT8Z){0UdQVML#mZptEQR3aiF6t<#-xia&Wyms2$R*&6mp&si9ye91HtyDSub~$ z*)3`Tk_x^wM{g$k|70dHL{Y>wk%QAZQ#} zKJ?K3D|*MmNv`_P&~#Zh&!?hod82%IYgyk-cCoykMBZ`+S8VIjrTd@LTMaD2HM87? z&tuUf>Q3J*GRVF8S-n-@?(0*;3NWG+4nQ7k1DBYJ`~cFSk<K?5HR|3eSm z*6FPUN1%8!9(&J%xMCEHo20U2DPEJyZNuMG`7yqdP@F#?zr43fjQs-KL1$I-5T8xzDkwK=jFLK-9Ks z(TiDtw#D+r%U^Q-uhsfm0)Ndl4=M0Vi+dZ!lHbEOs0z$hFio@MDKY?tPc>K$6o00` zj9+|wW7`3=lWEo3er@B#;aeTpUx4rb47L9E_etwNlfR!A;twl;FDhf|wDsP~{2zsxPbn9^5+)CjOpN;nYJ|HPZ=1Sf_dQ=a+#@9j8Q~ zs6k1`+J?>P>#fgI1I1(;TNbO@4%x8tqa=S=uq z7Wc;(fmHv$OuYZIERXWvc2e)8vE=QKpX1)cHhL9Mu>ue=b#ygJuoD zEYNn3=ajP`)aqg)5w9Lem0mTf_S5nU630 zx+G@ov+T5^|Lx@o{54lYfouxA`HbEsI4RgVs!{h$aCn|jUL4gAt}7p0P4$^0&+L_` zO6fS!KYRY~O8NdjoOoHqrZmolfqBb7rP72VhsrXOC46k&@;UMz=croCPqh;1Z`0E} zu+{ZD-ItTJy;=8W#G8l<;)0_Xm-4TQZ$?bR!SBldKP73Ml5P5%5@8DTmi0D|CBMFN zzO9LJfr-z+lrXo)~f?85(ml-j0)aVfX*|;TPHex35g#uellu)JK5>Pw1UCmi$UHZ(z^F&!wS< z{(oGp|8P8r85$Moe;x&iwsrXRKW2O_LRu$@znrdtit*!Z-AroNrJxVLD*yjA zNdkYhUvGVKZ_8M6hyGS_jc<3&5YxWHLb9xvwhFj2qMGaox5-Ykjbk>H=F zFTOgf)M>hC-_!H|RvYaS_Sm5R_UGe3|Mm3i{|lX0Jwe~NcpT411B>YvhXA9^WKpeR z<)x6pBf*1rDk9l@VLzuyFN0?tlrxH12BV4`^uEX{71WmRbn`%~e2kuPt~L5k>;LU< zCGgi=4F%>i1>W)a-kD>`FXi}d9XI>+nu)>H6zGg${$HK{H9YfwXEpPGqcQ*Y`>bm( z(JRlX+$(>#Ud0ZmTfoik+vj#1VJB(tm}LI0J^$ZMo-gMA;m5h&y0>@sSn|%!0H)T! z7EQtW-^&~QuR;HfvMQm^C!E%}!5x^*li>w#2GfuJ^)erc`>)3y9~IYsq49aou^Wa# zVM&S^4Pax#BFbxEXD-xAk*n7&2!e&dQRKW@zA0$4Tbso1NacmgJD_ z|2e1W|NH3wjg_KkEMW`wwo+|i;GA|dOJ(1g zSFM}&H5xwCW08{hD#$?m3_ke(v-c)|RbA(S@Ok&iVDN_Rc;B97Y$T9C8%QiRwlUb4 z%{E{gY>Xe`fe-=#0%MFZJb{TFo407%CTWv8Nz+W+xc$>M&7`$6Nt0>PX_HB(n>+Kj zX*+3~rR}t7J8|2;Q~lp}w)>rPmv`SLp2WR~`|iDG`_8wY-9M_2E)GJwYyVN^Ev-Q) zQtPt{Dxzt8ZdIk`GKl;WBhh8Bu8eA$#;ANq9b2Pj7n(ltR|^Wa6iu%D^Y(uN_W%C| z+~TVw240(W?g?1N+E{y_8g_)z*>E;p|I)`&xIRW@Zbd{T9aW|c&82+rFtB0#xcdVw z=N^X%KAR`M%V$)dywsL9fHS`9-}2gKYq=8?eC^h7Qr4DjY2IO)pBfo6Uep}4o{jCY z>B3g6dIBlXYI=?_4gJ~^nlJrY5C*He_8$#iEdRWv9s7=I=uwNI@*NvNho?wiM=bxf zl7BJ&_nXYw$$qn>^V`4?z%Snt`{m$P8G3$Ix&i$1ML?S;W7;$%ZF*w+uf3+&{x`J! zr(+#~_TTL|_lTR>g3wgIVA^oBaTfdkrACrXGkT%(P9ymLk>o#Ehg&@evHZK|e>>p% zPXYh`so2N#7`;aD{}+S*zcr>!L(--<_W!jd2(}%SjgJtc8FlDQcf0|!)OzlP&bz<- zz9Ui<150&-(IYIT2Nvl68_=CMAMRW7>hG`D_(%mbjQxLPs{Ymn=N+w%>Lyzi@Xq9w ze^(Su4WiL}fw%vsQ2+n7*vIsk%|`J5mx2HPbWEFuqzymyHy;0w$N#lGM5ozqDo~fn z@UZLVqj-eHwB8gT)5{0YU6W5;-V44BN0AZt|Hu9RRN{$$UrYHXk{D$UFRYCt^Mg&f zE<^rl#UPnn@fXWKC9>TATde<`BK`l{V;|FFHXFhJUk?8NGcj!%k~Vk8{r|3oh-!Uw ziVLRiXs>pvl}T5>3#nD1E@nkbkD^i_)c@Dy3G*Oyqzi_IlsK{fAN&7W0zgbGAvPM( zAZt|I3?IEA+yAs;vH!oaUkvve%FvbnDb)X;j(yCA^fB)T|Nq&THVsLedt?7!n+wCT z8R~LM_8ln?zQ5nk{tK)q+d=#T152^}S4$@Rxu|aVk%ZBu`ucDt4P*ZwHSmQt|HqYb z-L|fPcVhX+g_Y%xVKlz{Pa*%mKlU+E!%;oo5bJ+eg8#oGrcFcAW<~7(Yahz+Y)vsT zN1t^HpT1*aZ;8>I?6!kc#lTYC?3+heObXBrNt06A%PEmV7!7q;)ngcS!%u(tYdEM~ zaQpu*2>B;Md7=6LgqPLanhJO)mjBrQM@`YV7x=%l}lB zf9(HHvMpl&pDm~jYIMD_=G;IND^A3@ez1@ETJSM<$3CV<^)-V3zXoWtE2d3D(q=VE zyXpTcYyGYMexLqr(w`J@YuVU#On%!D({S?BFr@$gJe}BK`sG@)#9BuzPMDIj4mFj1 zW~{}ddgZswcI{P7YT2wahC|J9K0nVM{r?2}YleSQ{5pH(xjk?q=$!a?C~68KPZ5fJ zfKony@|Aw$d8-yex92RxLOzc7chq+yQo;GGh z_=!x1Nx|@>Hg)!>CIvcN2MqTBX%X{(zsa0E?3{eRfsD)#?Mu1hw`sblx?S zf0X&y{>S_OYI#6$ve}G^n`?uhol!UbhP+L=j^!Uv;^Mw$^3VJK;qWi`i?0|1b-@61 z%j}E0Wjrbkx@Fv+n2^l{lp_xr)K=d@`~NX9{`W)1;O~OC&R%kEKePnmekjwvQWM`$ zo~}o1Oiw`jEj97u!*=+9a^+Uy;g~ZqNg5E09XZ(LS z9{=~qlgY1P5}=vT<>Z>%B;wUTZxUZ;7oIx^@;w~) z@0d&e zC?}1gw8vsi5w}_^W}x|I`Tk)4-+h<&|0UkX;4i);23{UGH`2sj+Z@YCL&!)F6Hiz# zL>&c?h@^>Y<^Pv9>Sl|@L>9g+?CI@Y+|||H-AM{F?f(Ta|L1Vr{s(3X@4MCxqRsLy z>r^jwL#AI&IM&G9gcJbK-S0#;YSQZ;1VNP1HjOc#{yT)zH}5i>`ZA)HRuwL=mi&L7 zG5DK2*V$F)jx@1zSH>3Fv>Jrl>OF{8(cZX?D#hXykD&e$1FLqMI^6uWYNh28N=sp6 zC0hjmx-dhXy6b|)`2Qr7|L0=)Kdn!~Va#irSm3-2{tM~hi&yPX5&ZnMW)Jpleq~qrQx&KwU~U?CPN+Pt}?2 z|6eHk{~QAyFs1kZF&VDDLgP+e*Nn|suudw$BMCvwZD^@yed5;1ApGVUPz}TM4eO77DHdEN@AV-g54RCU$1|RG^-& zsUgOOwku)(-QGyu|Bnn01QPhE@#v5VXC2w#Ys3^-_^2%_+X|H;j=+EwuOwTjGgvma~C#8iTIwzKY zkIpdNov=Q;3D$092z9Bbr(Hu+h5WzC5^r9Z;y-C>eP-ji6HV;Zd6Py@RV#h9u>Y58 z!LIjo2wjlvf)fv|5|^-){1ZpBV)=L22y^DZZDOw1TF#w>7WKqTuN^<-62RmrO%0B> z+O`uaYU@PX3DT|3&Izg;w4*bpH=lb6Mg=E+|1@h~3^Mg^CnaD_<^dAaQsq?>5Gdfa zoo*8B&pO8TF+}QoyA`%bgU=%B%6Cd5pt=EuMpmxA??>VPH?a=f|NrOMK70tj zmgFu@vPgqvpV5GV_k*Jpr`VF*^oWVw%J9T5!c65QxoMRp#$yi7UX#11{Q1AHOv!6q zXJ+x@$z3zeTB-NmtH5Ommnofj-5OqHbn2H8mG@&4g#Z$7zO`;pszWISA^%Qdh&kVa zTYS|O1Ebq>Gn?4UD@xlcLboY5u5Sw;sVmy3YPz#qT1MM*Gr%3#UK+)QJ*OSuWD?8ary;KFoZMy5NwP7Rh_bqrSD?}M2Nq^@b-xC^ zT)VmMTV>BHOZWHmELPcJHx17dZiAWh&dXOlwqc#pnSH5Mq`3?+-fGEiA8pQE3jDUZ zB&eY|X+WV8?*&z&Y98f8Pg^*vYjKYVY_^=fE_X>2JKJ3nOZ9DeTUD>A#I6m!?EW0L zAF9@B$mAaL&2_4k{EPj+n%Eo6`M1RXNGyYg#=5dM zWZvZ(U{o|Msp!}kA0I#IFUal7(O%gFX>RCykANdBnP;eHyHfISL0#e%(mS7VAgNY`Zc598r(ZgT%!2P@~LZ) zhqgaG5-IvjKN>SUT2@k zT?51a0qw^Z&JV#W6|u6#qo(atL-IUTC{dJBFI9I%Tv((0!EO8+AkxqVB~*oGJ>DDv zS4E8fC)s>h|L=SPeo9^%>db?28PPo0C<-)6b%enX!kvLa zSC-}07>ZiKz+w&h87~o0Y*x=Se>QXm`_dQbOz(MjN$$F!abFl#_V;-pacdd}jYn_E zT?;J}fB)&BiY~K0m6-Ern6Ck{?eRa&BPjo;7!Hi{_CLFovDfitUwd;mHnFVlUT`1P z6DExZSDd^$-YtIDSvQ{2Men|Q_CW3iF!R3JrE_jaZ02Evw-T=KXtD|zuxh<)DFqKq zggJ;Bs9ya9*0u4qtJ~*nwkHVgEOlzVhRQ#7RS5fkIa|z&U41-QB(75d#+Xb;!4lwoaN}W)E544_UX7g2D>yVD}F1hnX*{ zb8|qYT_?ew7k;($xL0d>{mwZj<}Bz+?OEP(6Iyza(4m@?Ft5wPNi4BH$MmczT;-tLd;lZ1>oHLoO~A9w&Z3f*%SV` zT2UX!-2o6>X2g9!m2Cf#wBoT_Rb)}FImt$JF8Toxp^;%?;C7CImATuY{3~PvU&OgM zY-s_!x6OHnSN5uFuewU)i0`X&DMC$~T=VP?NWVKJ{ceAQQnRn4uQhjDl5J5SxrFcW zq5S>1TcO+;DsqP#8zawau|8l)EjL^xf1n0%z43Ny?iNy@PZGjvt+|^?+;+1(S`nV_ zO*F2Xu}?+N{$IhKX35`4rjwUD-*$e+S>Q}dd@gY+u_kdVNdFhu`ysfZt0mW~`LVr) zqf!05#&>0$4q1nM>kmW;7?}Q4Dw+L`V#Se}nMdbW}ncQ3qvz5ujqxFgv>TY>s)`naM zFrQpj6PhS2LzVeGkmFss1xY67TeP>d+{Y{VSMsN)l{t+4>s9}f`02L~=H^4uyHzD6 zQ4wkFEgb?ig3jyRv3Ju!FEzN_~dxHFV~)AM`e-C^Sd%Vz1yCi-^`ZubUobs z{4xBpsJE^CRnNDjGuv}*NtPB#=k43GzGcq#!(TP89dlZje*TTGew8KI8*e|7n+Mgq zQzjT38Q#DB@Ua7#7XCDnIovYmcyqdWNoQO0j^-s@z*@7v+lFEI{rTo4-EGasnwRvP znA6(YHfQ#H%zEZfZZ2fGO=j7}$Nf?~zf8J+AhjLuJdX%Zslm13QBzynbFFTTJ8-6F zPYUYY)7Cq`udTOj&hd^N&3AUT&7Ot8z46A|DF4&hPqXBINxtO#zs?7oC5ex~YlB?b z7jpMBvD3#S@eQ5{W2sX7CU{R}r+zsXhh?kTvZaSSa@Gb@BYw-tgrwl9d0LqdFn;#N z+}+?}$>~X^#Dsv^V#CIVrz%e_q`OD{2$%u7b-880*m5PCnY%)-{nf5-`@ECmd)ALX zc-2l&%VeUSdS0+#WRW;>kKPPx?Ia+J^!TTM8!XqFtWlr)z5t4-PEIP%9nv|iSDhIsf zP~UlY!$k0-AI8UbqoX0dS}~RZxB>waP!vKXfq6T-FLy8KbvaGfhj1yEE}8;mLt2we zILa)%0oDLvlm%MTOT2Mtg|Epi2VErhPtg_Td4#BPEJ7($L0g`J>X(XBgZer74{4PD zS!_8=elB@DxzPD{=f69ja&|jQoQo2_n%I@NnEes^3>$z5{?}c(jjrR^)79P#|M2HB zakV!y)(rny>fYRApdRE@D;`Be>_DHoyL)~IzvwsULFi}~pF4OKb90Zn&Nwdwb3gU& z;7ISb8O^8A{eyyrPBC=5+H;R+KM0CzYhEZogQo?}w}Ez&?<=6A0n(+O%54DnmP$>G z2_O|jTEKtdO}@+DkRX}_x;J?4kL1=v?$WR1;E3EsZkW3Z5f;r0`zP^>d0=eviU6<9 zt%EFOKZeSZmaTK_Ss74|o|QcUysq3@x8>5)br%$j{}H>v7@nJ3L&>2M_>*HTV+6%GB7O z-d>%1fRLV;Rxr8U-OBEYU(_0|*#uiV=bd-nIeACAS(;mv|I67rmV7t)q2#*c3>XI- zb?#2Qn|L9yE|Fq?&3+sLqh2d>X#h<504SnDygPX3pp2$YrDn0prTkz3sX ziFItGcf0l440VPKeF8clCS)gnQeC<2l*`Rb6+9G31Z8gS8Oly7(R^MbshxO@MC5JW z$RtM{<{kf+g^EF!F5N_|)&C#Yr z19RwDW5@EwaZ9;Bw-ri}yrR>rHd8KOJxA^-268;Cc9?lH_?hwfm``tFgpbib7z zt%JC7t|?PpQxD~K6Dg3HwdlEteSL>q;$rcwQ0z{&X}LFmJ)7GFS*);4mlRF4d+$3@1Nh_iUeCF9eF6wuL zy>d#kP9Hv;IW*F|FU)_Uzx?yhMSt&;V)u@P1Mpgb{ci97?~Cfov4C5W3JU zYvYmKv?>tT>jpkDd~|2#P-bV!8*7mpOIJ8`bkE^|)W!pc_Uzv~lo>IKB=y(vjR>Uv z>(U2?pgK@*SHX}9SqkQ{^qvu@Unv!%5Enqp2}W|Y=pgAWbZi)cC3NYLfjz(yRbxdF zAdtgrk2X@X=!~)rd$wxpmZSZj&i;)hzmObCb~(S}9CNOR*9+nry*`JBLoF1hh0i0J z2eX#Y$!&+JOKqvtT;dF%TPX&D(}xbFkF~U?)^A?Bwk_4w3IDs=aK2Js8~RwCZF8P@ za?4ieYDw?t-+6i$%sm*~3-g-fL?v24duOI^aa(F$7d8VsA*0SN_}>lxd*J^<_`eAL z_rm|awoZs>l$h#*h+Pn|3nF$c0;nNkS0DU`nBA-4f9H{*AqmN@;R6Q`jT}DmTE4NWzXc`tiFFryur(Dv$Y`IOL`d(L&t-2(U%P7%Nd zJs-fB3a~nN1YlELwr)~^H>jC&Xj;?mC=va3|KYZO-*-+i#cjB~2 zKS6f|83dRLG9<86${Fu9tUpPy-tfqyk8NDHp8xnuIA}jO_{h+HP}5lZq4onVfI}Y* zE&$6g6}f=RKik5bze^l}pW0oc*XNnVUTRiv#ey_djO*xgIXD63W!VAh;}=xscnG{| zRg(dCwrvjh$6!icJvt2c!voNv0cNHx1s(%<7NBOpT`0rH@K;S~;o=PK+b^7q(dUj@ zPKH+zfoGIa$+T}`Cks$wG_5T1NN|zK?-93V^s*eBV{%5$S`wHq*T?JTv)skx^@Sb2 z=sxU=?#DQ~!8r>w0)Ss|08PIx5a)jQejKkA5A;bZaIe1=*wGK(sqphq{+nRy&*UNJ z@x&>3XxJ6jb)7TmX(nTJymMrD^Q=i_Df5x;Agv-e!k63e7J#=!3N^@9F}_T;I5 zg{j!R3t{kd*YKLPmV#W*HQk)_VXa&ra2tAB2Wy3hL$E^rZ)VB4&Za~kyP1kVQ1N09 z6$PXfOWc$(;n(M<```wu*L}geH=xs|`RFv%)OSx_od&gnEu=k~8f$geukdnnDgg#1-h}(J1rw&X8YjYp?&2x5-4V_&*P@Rw4WC|$EqBSK`O!=Bmjl`4u5xt}>fSch1s{c*fn7y!f21~=>Q<-i)oR#yK_0e6 zJ|kC2)(sz8z(GVh%`O|=){TOz62lddBp(J&s+0U%^SC{;9LAU!l+A~VPn>Qn6GQj% zVJV^;h5x^k+yBIRwzD1@AiFCM+aVggsi1#lZ|YsZW)*aIL8{W+IN^Qj$MUdSaaOKX zRqR&3iq1(BN{(Kehuw&M?SI8y_mr{!xD~RW{jUZyQ_KE;Gw~~pX8*6v!>)f8Lochb zQ$IN!+V|yQSI{$Z8nM9u=C4VycW650dmEd|nwaHb^|8#!e`ESl|I$v?#aX#;S*7-T-ldziTL(Z72lhfyPTABqw_xJa_3^lN&H*lM~S~r{2=ic ziEk(VDDk_n6WP}iUrziQ>`L?tiBBg!k@!gBClZCk2NGuzFD0H&97+r&c7?;1yf?Wd z*^``~Y)LjJZ%$sDoRyrJY=YI!|LpvO^Eb|40TTE%?Hk2jz{GDC7s36viVNZXo5dcu zf4$fR_y1Ca9a5)#wb%~#UoW=7{Y%BUaR1N6JK+As;w^B0r+6dW-!5JU_g^bs4fkIy z!n~?!UnpJ*_y1IcC0^5hrFaqCf4S(u{g(n*TjBoc!X~)?$HH2;f2yzw?mt_&7w(@d+ynQYDclYB zPZXBG{o@6!(Z>qiaDSuF3HP5aU@bmcxC`zdDZom+X+KqXAKZVkFb(b>&coF3X&=gC zSwE5A4EG<;KLYn3%ddg^f5<-s_pv;dSj;~F_d*`a%I7ivTz&!E&*d@y*YhoKe=U#r z`9L04$4q-Ak7d0-54%lHJDa}=?q~AX!~Jyr8n}<vPwC4A}%G2)|1N=;1Hr4_6rDH(x=}X3-F4OzQ zfa22^jRD1{caOoLThqJ7pmx(c#^yj-BRS-pLpiMP!Q72-hrM#)KAgjP?av`@_vNmJ z`%vymxbMwf2KT|-Ot|mKVI2o@SjXMDB;0r9kT-UoI|=vxb6DRU=U#;Sv*(V(efzm% zaDV0;a?7@JN8$eTIpmqA&K-gK)^ms9zU3TZ=E-x1;Qqw9gK&TR+yS_6J~s^aP3MrW zHlEuDK(HiB!TdkxUik4`XKv2l)Wlx7TlFeiGbk^}S1@VH-&j!T$WO(#byj1|6NXVS z*dmsUiovD=a#lvgz8H8b0ew3YHY;OS9(JN7JyzVqtgayuTr1)tdD}VAPm0sIA+_b8 z>KUKzLj|)yh5Y{|%6}XCOON+<5t+lXiTYqn%+!niks9-&6*1NzY^O2 z>=XmPguT*|hpkx)o29|;Mk2!oJ>AQQsb9&T;R`Z6UL>re!-&d5L?n5aap!e_e>LsZ zGtcHzaH4=*;yvFj?lL#es)|#vL3sjz4*%?6vMj$ML7&3hO4hV?MQdDmFe&Q<<8ai7ed7s+W&;}F$RC}6=R^`FfjUbz8RWss{hIL z52f_rPmK(hlrlRvYEA4gKf?prl$(UqMLDSf!1xqco$BE7&;Ad?zYFF%J3SA_U%Y;G zz1uj7u7a5IEkI4#0vU9tohR4W`S(}|IE z3{M1~`g-Ennaq4Le-~g`4N^mJW-*omTNT|c6Z0+#X#p?@9s`5AyO(s$;Wt>$zAlgF z4XH)1ShAh@;*QP^t33P!7cEcaclyEn>?Zd95dB%U1&m@@2@buzQuQm5qgvb)VWTJz z0 zPH)XG0Q)BQ<`xRd z3cy%?1wdXhy>43QVxVC94BKDHQ3U9b)X$R|c&@_1 zJ`yKEXj62N;qbHUZvRm+i~+}DhK2{nP%c3)OYl|&Xg5U*`Go_Dg}^nh12Vn#n{(lp@mnAkOrm>I1Lz&kz`EF2KYJn9ga<2OZlSkMh0Hdm7Jhci3k0)j080UiSXN9I4ERPMAg#^ zaDB>`DpfScQJeA8W$RN`W7buS2UAV1lp*^6Guc8s|7Re1qw@{tC1(Nb0zL*UfrWvp zAbU6u2h*J<&WfO~W;v6x-5e>#H~b_nv$s@zh2PLrDxSet@}q|Y!jrEciE9FdvfPo! zBkwF-q(D&p6!)lt@Yn9XFv9qYOs+cb?#XUVzOQ6myH|>2rR%yT-&;C2 znO&6J7DdQSWLG-3)%k^xo9S~%beKP~w(dusx4DmKz9(8rwJA0S|l=}HCY-*5!Tat&Aj8q?4UtOE}2jfMlrw8~PIQw)8k;-UabaBj}yL40~V zQN{3*#1|Ymkk0j9R9g6z4QC7$h@^j7&UpgZ!YkG^6wZ<0DruJq#%5haebxI2)5E;m=+cu2Eqa>9ae(VtM;GN zNeon>3JbUdFy2}kDg`6yobf?cLI3y#a`i7`1l83|hc#QoO#|v1F8{2RB|ZeVuxoU0 z{vqI^r$ViVTZ#+1govJghmnwuJ*CLB!O7WH!5nVtCu zVP5pQO3^KA#eXIa-BGbz4s?d`3!xn584zrI<}ZkF{nZa@(fKFgBtoSi55XzqThHtj z1R8vN@B$hT41EBGTZr(oBR+GYGfz)_TGg{I(oCS@(+WXthN!*(Fm}j#9G(I11py$4%6tP z`PE>7$UGDQmI)JLNoT@QCSS#~dnd?-d@8O7^yzEt;DaonTo8OAttf9h5klns2KtX9 z73KdTb~|(KgH`s;EC-L~HJE<{8YEkMnA)wZpnzz8^r?k35-q&FRe zLonNkW;Y_)B9}{4**e201|dj{aB^Wvej%Vj6z21!B|( zRe&f(dk`wj6a|_0?9YF2O9wuvkEn6r#g^NFU_xQ zVrP#Bpof>o^NB2BI<|sUe{g{&G7s2=H;g0W3(-@FZQds-Mg1BCE(N^}uT;vm60;@R zsJq5RASyI>3;BPVB{zTva4zxh>}gZ{t9d(pYko7Zh8!GRzz@@6eA(6ZS&Sd1_3HlZ zbH!m=e8YQpt6AhfewY^7eir=}wOAJh^1XJu?FOc#OZ0SjmA~s1Chf&;=-ipQhyeaJHKpwDCL6}++3 zzS>gR_WYv&qhJ4>HWW2gXG(2^`x~~laGffY?-FN5mOLGiL?Fi+#^--}4oHQ5>G=H5 za*jhK>=d8>x$Q)q&i}lGEn&%`^OQ3q@rQ~3kl2;zV*d;F0vv$PA=kY8vq`p1xP41d zSzpF&xY7H$sF^M4VvBm0&Rm_}4!)@z|8%3v*r`eZkAkJL)@8&fx|BSa}qg)z$ zU49#sEGNG&>FFH*(fE&gmu_4+1g8k$Yj5Y@+FwX0L^adZf#WO5K~Nl#mQ^L$>k zaKQNdyaE2)yKTO%{oMRh`bhRAJ$JP?r@AtWdbhQ;|JSE6QcqXgt*<^ke?ER(I`iKA zRsi@SiCIAGv&Wj}HD{U^z<=?A*!FysG0wa@IP$9<`7KGdTjtOSvFCTq@LZW@c3sc$ zk$LuSt4i1rJNBg%kG!gWN)WEhY8?jLBwCp?37aTlIo zmi!)A?Df={!-H`S!(nHzd(NAF7j8=ULp11D>OEE#{W=)_^_!n|k919S{Rq;_16IG6 zdYT3kp|*(iE~A= zGk?G@4T|n(=`>p^#+~`$pfnwyB~x>0n)dwuBuf)DN!10J87a~%o!Ob+7gz?srM*a6 zMrVE~IE_$DJ}PN1QAq;NBB~A4_{o`b^MiI|q(ECcXf3Y49&UdA80rDkB%S#^7BqZN zOk^H_rJM2t+VkhuAw@m^dHLNQg}=z+E!R9eklzIyc^N@DTBaT|{vuGNzMq-0So883 zPoXeQ>8eA>&@FUcey4wI+M}ZF!MuEb$=Dqv_KuL)9lRH)kHk&~##T6R;TG~gpC#Xh z{XCZ?FLwTi^OkecdCZxecrWo=u+!#n;(k~e@ICf6+sfv*7N#Yc>%LZTu`Pd&5q z6#O7l{$TN`@vh$S@n;HfT#}j@%p(JT^afqr8hW|OKRQNUI&*HJ$!5yTqD28rIk%AX zMh0qj_xf<~+=Ancd`V!=2~T9zHRq9yxdqs5@hQTZfRk=GXwX-X=H*YCl!VA#edsoL z5e4YTzvRifs|#ZD$k+9BNg3tVes2DRH!_gVH}bsviyk;SL*O{>$+~l4Ko#faU+_lm z4vc)v6S-Y>f_gCBmVZ9UWIJ4PUypRUJlJEWKxrMdloqHAjW* zO}ozLyuwu`&kA6<6HO9u_^xhSRlsvQtYYV*^NS#YqdWX;%bXD`jl*QZPc7BM1vrBv zE6;XR@T-it(+)2r!$bEj5t-f8yKM-OK{MM`fMYANa^OK_1}%Yk*c_PGyA3M?KcXdI ze7xzsf8VQu)vrbyBUnEIJ!?13TwQ>JmW;-kPo97ZU1UgJ>kDv5QC6<&=0LCHgi8;N zWK^3$J>AApdQZ;-SGPTXQZ^$9aGBz#fhBqhmnNB9E6VeOuHhiw?&?}1nR{ku;Sy6g zZHIy9VG6@T1vo*?5KiAjfu$3<>MYC%E8f>DxVdm~k}W6ljP1PVxoj+LUHZPq3UK0N zwv~i?0Ws?%Tum#M5rxnHxr{Af$&VyAChv5u7w$B# zfe>z#zTN|6+n>7T6>cWF41lA#39sADpzFZ`Y}lNYYxA)@BZm3LzOLPZ46u54ciV2_ z$Zspa*1lPnA@7l$4nox^VNNhti7N$h%12euctY)LFTf_d*%gW$zyn8t2ZYwu51@XJ z3=O&Jm#gD(cxO#S9iM_Oh%X3pLOJJw0vr@!GzHSUFU3%nQjH2l&w$~H3KD?MD_lni z0C1u)5qD`Llu5yHid6+TZNOz$8GWuWCMu%Td|jaVDBo*ih#92|aQ;p9L4qGFcdqY+ zeKD?9#@wm76jFtZ&orw`3Op+=q-cHBya3RVo9>mMFUAI|WhhV)v$Yy717_11Oi14EEto6fVN z{iGjq`bj=u=bv~yV+LUp14cKS?`eh#FKJ#eux`UTS^1IS%wqV&hn+5Mes<(Q zrjHHaM_$owbFLNgKb`fk`Xg2M5~5#i!Om_-$)}PTK+OyTwTSMLmZn#psYs=E^&OTittqD}+MKx0sY#x&*wj=1h!}Piyq}O{98u+@GfSRWLSPPQt_&e$e@fjS2H~Q z>GcSts6=XOmK9)2j#1gmzr0uAP)Be}PYptvf2!!pq|X9kHi?V&oNq^FN^MW)9d|JokiMj9%j<--k#*UYXe;NBIo`2@4dMMH;=3J9wjwfU57E5KG$qjFSf zxz+Zb_}9<&@zI8sbbo7Gi{Pudg4y4B=be@%E!letu#45{gk-sSewP#vmn#LSNsqhP-&5;g=1=?K79}F^XKE|j|0ZW9gY$j1IB&y4d|jXz$hH??69hGN zMQL@-wpsu%1m(fiRZ=n_fQO)xQ_>O^c~yEt>)^pB43>7YT9x)MLZku!2D3L7V4HQcCO2Lw7QTU0DFzRmYMMCoj240Vtr8OGLeD44Xy2PmEzly`CUI1uECLYlb{+( zNG(C1-?{2Vu|oTwWFKYDc;dV8(^%K&ssil6pmvvQ6n#^s&%@>_4GS44$-@1O%Xd;pW@KW`NEr=|h|-z+M`sPfobXuUd@~ z*^cN$Ej2MF7=!!&Y!yo`b(SO^hlh%;(Mt=k&CHowqM&hnJd7v-EDkbZx);8gr2Bn8 zqr+N}yp?iI1H~=-YytMkIW4EEhl|^(0AE_eY_dB_bBN=(rYwUVk#k&?vdHz8vL_0# zc~3Oa35U5nC!}nc0b>E$A%rP_Wx`UehZ<$?E5Lq3r>93@`jRlzzs&?)ZZ4#j{fF~E z#+@zfV-*R1T@#&NSb(j@&dTv$k0h!)SVs=@uZRIX=n z+wkDXK@ldzO2v{bK51LjSIkzX?G-s=$ad0JROwVnSfB)_VF1B}Q`r6$zuZBm737Nu z7q{(@;k<^2puyWZ7%id7m?y-RGBh%wgR{8+o28Aec6kmviQPAU!f8S-^aEHR76_uS zjiCF+v{-^xO+Yv@0CWT>PZVIcwP;GLQp4q^M<&ivy~W8AXsOWtClde6;4i)|APk&o zD!@iluUzH|WEAlX(5s+bCQz@UR`ONvRe(XX4eA!9)lC}_!5SPk0Yf#kR_nBSLXG}| zRO;l>E!wT1sisl>9d-vxOoyBQ1Y&U3;m7V*&3qiR!wJweVnXJDM*CX%Y?={KYcfkfxW!a}M%#h|V<1?y6?{#g)`OO8U{#eF^-YKo1ebVXA{*+^ zkpXM~!FH?VHh|EN;`u1E=~F2MG->meXxsV7zBGJ7{$c%Z#`$gM(!?Q{{};OI*HsPK zL;*H_84c?GfH7hp9*;8oDiZ>Yd@``bU_k-)+#2l<;u^m^tZ!mS*eJ?7N?c;ZxGa#b zE#TH#oh3l#n&35LD6RGcdkL&~I5?x_*&755Wp|PgR^?2~MQ~{WHrN_H9tAQ;|3!cd zfH^z>gAV9V2zFHNgjCf8=En%Xa)Tej=~_M5(x|c*lD3DcqwKW>*r75SVmVk55sTOh z0oAR#@NQil;3D?A0&M13u^rKcOAVvpMjkn(LnUKKKKPJl7K6m8vUfu5qWoXXI#_ZP z_WwTN%uIYRF`E_OL%_AI02{_+<(zOooi7DRK=ItjurNK+GdfcriB$VB4M|;S`_J5kbjZc%L}-hn_Qn% zl7WFtgmMGh71xmO%2=Q-ZLoTF*h7@Xpr>FhuO_T)IdIRKosrAE~Phc6+a&{bBU2h;8# z5zg_0A!7Ff&h9f@@~X=hMTm)HCkwDw$Y?U4s;gcj#_cO#`3g{gyIkB!N)7TKi~;h7 zq42QSHwH!#vjR~fO-uMf0ruU<9t(wF5VjzJ^vD1Rgv?ER9ONJh88@7F8(vIp7yeuU zcFM~h3@ZFgzo&tBhEpG#w3r{ZqSP~2I)t*4Xc>WMOtzzS@Ub+^F5I3-3;DmFC66bk zIX?mO|LhpvQi}VSWZ+4{C{&g#A$tr@zuJF|__xa4IZz zUjg@Q+FlB&v{I1D(y0DLc;W$S(uWF9LwS2b%S+pG1%L+dBJhl48=o|&+F@dECJhbf zrvUvy4QPRWSnMq7u@eoX3m}A|+*_aA*C9DkBN##y%bi^QlZhEDImej=KNs#bnk@9g z6sAjD6dT4)P$LAJAwj-s>;Sc`K}v>uMJ`049OthsBWu5d!aR&#UDyF=u-0~I5NeJF zANYiQ^ssxm2=?TxD}mUya}%)*cSjIKpe4JxkOm{Sz|Es(++jnaC-w!{KTo}k4>;G& zSoIdfT9V#q|1V$DD@K}Y_Q0&GbY)~>LUnYnVy23uSQ2nNC%9!eICaRgmo$N)GC zD`(~a^Ib8=qEVLmXQ;3frhKavfVSIPl6bpEV08}|MjyjV`NT%BUwpu8S^Bqv{9ThC zB&L1PMIlz(kQfyv)2nt6i$wmXu}+p;?c9-g6TJT~!%Nr&yu3d$FY`g4(q44cl={0Mmn2wkglz%7j z0CRo{Zt+zS21Yj)o&%pXpv~MHI6;yRmFm%YcLE=oOS=#{iUvoj$$=YW6qcZQtu7S2 zOI^#jO5>gNT32vDJIJYNqv-Y!t0h`5KqT*wNEY(HnmKPKR#(LQaUy|% z(WeW~1GnDoZvjhl>nT2ghAII%U50*#1x$JkQ;2@Bl5n?yZxszwYWIr?w|vA(89E{F z6>EbbIsXSI!N}}+k>2^qM7{Ybr#-?y5a1APu(5D-VwLOw)I@1tp*~GjSfU=%lv zYFbsqY0?B_d&XC0Q0ez{zl&BO|JO6;gNf^7QFbvfdc5!guv@^i3}116*_E9DMtOZZ zm)Ecri$~>jGC%31g5k3iKn#foTKX4g&Lk_&<6?y%Xa(;BEK=|@_~k8KfU*_$LD5_$ z%yM-pFq94J@aziK>;sN%YV; zfZdo_@4iTLvF4J%R)i-261o*3S^SES%urCke3W*S2Q`!HF_aTka;Z%P1?U1kWlQC^ zkgW=BU}qIx1YiTETt)|0fMHC1Q5sR>9Clt5m6h5+0c+2P0r@{(w*2ojvfghpK7{$H z-zSBQw^m}Es=fO4Y8Lb@8btmNGdS&|pM8fNo(QRbWp&YMVnulvnBB0Ga;oLhD;+^n z!FfwcvrGkxn?84Htl5LqLdH}|?yZ#MAsf07z~$;dDbNOaZOV&WeJo}f#fbvE3Ffb}r6@)i zS8u@xL)kP;c@S@kDYp{mQfCIZQ#D{rE+fQunj~Q2%C2Cmj{biVru-&;0N#I@Gk-;{ zqqB-|(ASv|_mP-4>FfSd-DQ9H%-T9?7G=|b8#wpb<`qnSQ)H7L;{QkUIsApihUv^z z#Uz;g*3j0GvI7Aym1hk(Y65b?7QuPa_M|a_IP!9*TvMa@r*^eI+z_><&MC?;QDoy3 zIcMe%av_qE1PXh;FVTDxwQUcMpGA%pO5MBLen>hKIL$A*V*0uH7X5#B!1>>apJbo)-2*5)qc{VM znSXQrAlBJbp?-%T)Z!ad2O876iWkE~Z2x&dfxxInjDLjiPypQ%fmdfnaHa6DyTH)k zbZ#Hv!F5|tj}+m&xA*%`C<9*MYtn`3e*jR!pGYTD8kdYAWvun-eB{rwX524_uUje0 z-DAQnA9^?4Zb84IY6I*cGGbaeuw)!l?BEy)Sqk%NZ;o=y2b(-FycI@1UU{H64LZjH zHfBR<`vuo}f^%g!E2hciUCSZi&^h*b?*AuVWyxEe9{7o`^M!%zoZ_XRWjFe|=LdHN zXj!ZCl<2oW^%D{hQ8R%KzNCB|tjqnXehPd*Md%6i{itGDpqsCMqGG}C2Kj8pa3dHx zIQvWyP6R#ezeN>6wrc6P*+hB*4M~;}Ri9s^LUkl=Plf&e1atZlUxnR&K5@R-Ke*iN z+9I5(d)nGt{PEY(=IIl~;9xO*qL}BTF$j}qj?r_*;CM0^cJl^7zUIkgVikx^>J0}# zARE!?-nv~RPaVdy(8w`m1L~Nv^+i0@*Rwi_cVBI`_DkV=g7F<4a1WD{K$-%`Gvgs6OybQ6N*|UpO(`P6ycoT_xqZu z)vo0)ZA?}9`_piwOob_>qq4}{7#Qcm1e)O*6bEC3tAR}>qo%vTga|FK^2GgNv05JO zPK%Va<7NR4p=>L{QS$l(Luuj5uNRaWy((3}EA0ObEb-mMXyQ(GgXZ$li;LGmxBfLI zfk1&^C!m}&%6GWJXF1^9vK0)fPq0paEf;Ag)3f>Yi@*4bpM?MX(%GP0_RB`5wQ_kl z@PZOlc~R1gV@3ijbq92uObu@>;)%}IL36>VcnpabPzMdiL&6_O4eu!8DbLpGy1@|( z1FGsl`KDn7FhF!z%^cEb7W;~wxu*C&==`_VukUzWXRAO)umMJSkn0d;2d~<<;zDk* z1Z466x8f}-6E_1%Y(9Ge_Pp2m$o%<4Cr|z+3@D=`l5aFJ2j&`=s&96n-f{!BV|Sg@uKKAJGEk!CqbAW3VG(XF^a(Ya`>yny-!E#8)NppN zcmq^^ON}beAv0kBXt0X1mVOEj1yZ4*s><8y-K;iLIJ>WSJ=E6Pc?b&kvqvEiYxOHj za4{bERC`jFsO<;;@W=mD$Ui&DoHr61;b)?+>?6fn0N>W+fy(eLS)>Bg2hzkFU~-K0 zCM0I`q2kRjceOmvDL`FlwkHDM_pJ<-;;qxeL?Ot~>hl})DaZO`Vb6S(xZGB}32?c* z7TQPR4aa7bG6~V5KC%6EmsP3YSBm8tW))nZ<;$A*1q;$Tcn_EVX|U;ca*1;WJb+B% za(J0M*V^J8;5=J>gRX#x9Yy&9Y4@Yg6ZnQ7fd30N6`LVDt5K@sll@8cw^nMKTp@Lz zAlu<=U-5Qm6dv(#v9KViN2GZH3hiINgp|h(l0#pb6(;8e;@C=&7KK(N(++&|~#rLISf4tROAp)VSgN98NzE!MvDP%eb<> zareDKKI<+@ffxn#{l#0sbj>J%85?S=T_@chsSiSA*$ASl#0YqJ7k#xP-h36fNB@61 z+k)r+Jq$a5eJZgIRsn3Ofda@*E6xR?T8nYKTyV5)EB3Ld&9YSl_1hwvEShOrK%UOP z#>e=<^$PuBNk1U9b$789IM^CkQ~A4j1OQS_Nskv>prlR@M+h+okoy5pqhz=E&?>Ac z&Vh`reTm(SET36+K5WmpxetJzYQ+VhsE#%k?}FT{?Fs^O)15rBi$PaLJ6a;wY-jOK zAo%W}+FL-{1Sha^Vtc!QxTdxIB!EG*z+Lb|pP>2>zFP?L;K=6eiQ;S!Vry}Tn}rQ@ zDQ&O$lvD@Hi~uA=1NwM6j_OB_f+%{tBMo;y5#xI0b zpJuMyvXp=XbHgWHhRb>cy`C}=i-LlpT2V{4t0tf^;L|zFGN2$3YE_(DFn^*c?YwoB z{27A-KB>_bgcOd{%BokA&_QK32qA*Ns{$oKf)lUF87;37LCFk(f?r0F50?hvh?x>beQ%Fgno%i4 zVQgt(!>*WB885fm323=0age%n1;JApJ6oQWRH;;(rfIDwUKqnk=nrUP4z$l_RFpI|@9@UOA1vpb6IP3)X!U|c8)%^7~SMajF5 z$EeydWhPU4K_HXLIxT~e$mUp^oED5Fh4BfRxk_B6LOW|#tD1(AnNy4)E`fqPZT!Hf z0Q$qWZ>~wHS&Oe+`M-}b_^ar8|I*_8CYG}{%BsqnC#VXOx7R{lUXlr@J}RYkz;~@3 z2x|O-fcI!H1q4+Twbnug%4?*BbOi;mtI|1 zV3?)clKZ1s9$7!H__-B#pEwE{fvbUBN|yW^IBU*j;LD~{`;EM&Wo}~B5`#j6r79Wr%_S5+j zI77rhC>y~4Z%XW8&T(f>;@9CJzUqU4&BZPlbhjqp^JWsCo@5U+!Y|T_Oru2nbIbV>k%r^p`o^`U5^&PRCRX2_x}x?|KlW{VTo_T zExu}ufmbdr_B64=H5Q9&X)d{LBye5I;>CQ6VmW67@&{u6*E0)>-LT51zxKt6Zd0&T zDA{T|6uG!fDkr|0&RT8*){PI&`qZOpMsLriklmIGfot>#*;Mfk{@N$z3MA+*0_gC+u-D@ zy1la5Rvo3ng}UeKe-iBL4F4wab#`HKQ4@RJZc9dTw4o^);41owOn~=`>>k4M<(AsjJEu=~$?FZs*+lHFKb0?VoF zrDd+|LRE*Yq;&sjjmOh)1hV_x?Ka@N0Rh^qehJ*YfqtG|^yOeO8H(CbhRF?~ur-TW zaK|W<-VVFCbDw9xKO9=Wq74ko=33P=PXOz8mlPMn(zauPjOv2_ysnmK8$yi4tIn$^ z(Lk#EsCe#obHM1lT5bbfw%BYitZ}-FY2V^i>78XpTi$m!KeD{Pb>yw> z8J${v&ZJuhpHHtgHcMU1kG$Us!lHnSkj2h`EOZ{JRY!2N%FPr$z+vfl+Il8Er??`? zHml<9hn-vD&$WyAl;J(8TW>7hpJX}&W9paG*2Ts9l1!_TUL&-3Rd273iZ2V>J_vu? zGcS$9=AVhJt;KtjOmD?wrKLHIr?##rE{7qzOBB3DM;?t zaxL$mE;B7sBE3QMY(vginl1?jF5r_72oSJwLu>mi4x@&3L+ju{1g^EXj9_2z(zsB* z!~0+20Ph%i0e@ki`q{;$U^0UHZvde2ac&Mwld%Vvyte!!+KLwI;^x4#34I-Xh%{on z@HzeD0D$!*{^w>w*$N-yfd2n9b{+2jbu#h&M2dY1UKsFA@nHb}CPny6pPvMr zFz5=-I3fsokK8X@qB#-mxI842Hl-11!l`2Afbsf|7FPo=kJ!-2jII2IBB)Wx*_FkI zfP=44MJuLUu}Q({YCEN``W9kUJZdaNPpXum3ed!ts{j=sfI*M;+N`x#_NwB8K+)FV ziXhlFj9es9``U#E24EhjmcyWOb!zs~;wpejZ{XrZZ(q2DsRDCv5g3)8hyA}+0=f16 zU$ujWn#GENR>Tu5F6^RBnFs`U)g=JR|8%yTB|nvHaX#;~CN{9I!E4kjn=C#G^wU;G zXbDRoX8=f+aHF<>?J1NRNwxD2X^YJ~IsszY8YYuIeQta9qT(X}hL+MmFw9aBRiHh~ zEA>7K16GYIV7wt9j~6!p|L841$^pbrW6AsprYeG2COUntWM$#>r2rJqD6R(->r-HK z%|zY^Arf(!AZgiH6}dnjB`Jbv9xko}d!XkzNLX;gb&EZIsic{4Q+QKjEilW|AJ~4p zxE4x0t^_c+L`Y*wq?d`Yt{P7I+?OH&n2sX@N`Iob21@UCOTQ2Bt=>#&yHh3eLcw!e zIwJh3-fr%H3Hd+9l0(jSoaddHi5J+vuwzlhzlwM#icdn7^u{ZiosflO&6W}FN8Xa^ zqFmn6n1U<>a*%~yDn0@1oKQ$4C$TM(}rFyMU$z$iX?=5Zyf;<(55W$jOnc}n&3Fo?;-DiFl1@Ujd(F4UzP?~N{ z`Bh#Dz}~dBm z#{dw$*`3uC)}W-6(tSIz z0ze*4B7eHuMI$YYT$w5c0llD{xn0*M_igL(3f)c9#?%D#J~XD zte8V>^j< zd$c@mVekel7fF3S>`|XkX(L+$aI7svKyHK|eB5Ip$kHTd5eqraMqSxEi@N~x8%)g0 zw;-*Z;Ua>@fbtuM0!(Z98dEt5Ms}Rkkew9A(S^kfj8y6QUxvO50@Sih+zxpPaceO? zzAAkx#8x3lZfvA4(QnjxMIdu^uvioYNLGTfFnLcR5as_O_A*O8?R+fp?ZnmaIPq6@ zW^o^|nPshrFwW%$r{$e@-m!*6Du0zs+=itn_I?kAr6v1daR`L?YV}p{5`iWq2P)vx z;8D9P0Fb@Q(kZ4|G1X6aTq?=$84bSo%vTAK0$F)?*?Wq6p(<7{M?h7;yjhx|ZdG}Y zUq*$3YS3341lBmBY8FZizZ!VZ{atZsLC1nk3K>{epb}k;pCZAYD((T;E!VRQ?0aA@ z7idzG0Q{o-Cle2{HzFr36;4Y3f=?HaCg^Cz*EBcQH+ zv=dP{$g`PfxuIc$>&$h#@5y+y%Gf3p=3K((@|8-P6GL%HO^@>}{_v)jSg?T=vW zHdb!hyeTE$`4~Hte+Rn!6JLVcg>+@_FCGGk)yFrKC9z?wIS72On9krp&RX_a8z}Ep zFw~j5iw9wDpEZm^7&@wenc`7F28LLBBs5r{yz(|quv-Osi2B*(<`@+pR&~DUs;uQv zQFWhN>T-fmO9O_YYB5ch-b=A)233m1wcP%*dCd8K;*a1b>^j|AJkrF@KB0_Q%_IhK z8!RztS7bJ>JXY@Yt#6quB*&5nUMu7XPK$|xI#Z4#z%9+_WyQnLAiiw^iRC&pgz<&t z=ImKhI+lTuqXHpU7e@dgdTM(8xz}{^JUDUD70yZ#Jd$0Uo#9rN!^qKs^54YnX3oz* z@Bbz6P|gLt%*VinmTI>v9;_T88(n0Xtn?k1slJu|R&};C`%v+DsLeGB-1>8fAT6na z`)F#dGPqs#VLVhk+BkJdRpsN1ZYe$oEf2kZVdCi$ZgeT#SuqCHUqW8qU& zm5d_n{|}k--NYZWAC@EhlQeF2ckxA#41F9}O}R;`4&r(mYQIKJ$@lmGhGHk*Ok2{Y zp~*hIcpOY#a7SjXTp!C>4!38kh(jmzU669;pLeJS47QnCGa5t;f zh0)VV62apYB2W>>V;|h;wBiX+2Upfb9mq_5r1T?y_ zD&F^pv_O#uSSYJSH5d2!!PFXGF$Q7`RDuEAtH9HfGDEvwAeN?-Qt_kXe>hFOM3Vb6Q+ku@hl=_~$5 z-ae?(;g!e*2;8?(;>Fr8vD8_}c_q1dy$Bz8Wl>aJ#gc&X9a+2A3tbTR$PQmEG$6?G!0`nzr5~7SDw?8M7e=O z{vBv=H%(lF`_ED21Km%J!P>M3bau7z2+Px{vG|lZJCsmsl8Db#mRieW!=m!G*snEul&aU3JN*83o z9qb2I4>!ph?SG}KlgzmYai1R8AA2A*ZqsZ2_8HuA!^)Fs!oTJ4u3KD9dL(B=?$Zmj zk=5PYk1VDQB0|E#shdgKI}uj$Pb1D)55R8YJT8J-!qOpJ?ox#M>F;JI@Cj6=JKNz^_H zt$huNTWcskUw9%`SNqg3-ockSO0pRZtEyMMj7}SyS>F1eN2|SpRGBZ)2^Q+S{s(-3 zA6TxYYtllSY+W{ah;gDzx(wC`8{e|}H8c(gn|T1L4Aw92Z6&~ZDxyoK)v&gGp`M=+ z4f|Zj zLJ)K0mF8~Xr!lzHfHfkH0CJ7INK`|Y-EZEp%OakVCkqBCsXdj@SfWf&DT@&y3ZKPG zBHGdx5=3>4ry`0PrR|7{$-60a{UdQnm2?6X>0}b|3M4j{fXa7w7^SwS8?;$)lKYYg7;Qf4!ieivIl7>YfE_@zs~$g z$q>XRfT16KeCF6yP3$Yd-7@F3k^td96x+wHY+|3#N7s280Ou7#V1JJ)kkSjl|9#={ zu~|**&D7cUvR0&ry=;!&64%5j$fw7)4lJa#!?qIyQt5)>qHeNf!@ z;s4*dwtjBx)6;GOwZ%>;-O3pUZV`O?Kc{xyMSSejhuTM*02SDMf@?|wOFVaJsiDfC z*1npbGSmfAixkx{pu1Xz0q*rA(bSVJ7J^s`N04PiqMa9P*4MY!o!w%5mR7M&{{34@ z)%Y4o0zku2!fI1{;4jJ7N6bkRl&&-M^(g2*a21@CEV=(Gm?u3CpST zz+aND8>?F3Oh#5y z{r?r|?n*T3#IhTK&>p$>m^l*HHXYPRS(qZJ>=Jecx$1WIBo8|XO2)1Pt)d%FXIV^d zVTX7QRP$0lDefWA#5H>1DUQl%wh(6WY5(`YTIa=GIB!Rf|G$TCB$bB+wHp@}D=Y)T z1r~oyk_NR=ahF`k`x-e`&5Vv2%KKD;=eo&_BCHu1lXR@W?tLQ2vb07JenR&{w7TXs zA;K_O8J8Ng^w3!sOlv`;mokYFg*qJ42dUL8XNqcCXTom+EN=gKU!td8Bo7KU<=^Eb zKUz#A{w4VvBqMoJ)EV$Kj2BTO8?SlDsAct1LU9~x5xEHj;nXRJA5uFX`>z?zwg3NO zNh`^~;|dUb)tFN~MY)iM02C4ws5{cTE^x1-Dy?nPsWJ*wXHn5%rR1gN$uo{ZShjk7 zYS+HebZX#QpCB1W`(OF$PKtQLFPIYD_mNqQ$UvR?0F*NHoHJjC52~#2Mj;WaFiYSG z)45aLA>Q&-mF>`ac?KK(v1B)>DBp#Jsir;(yLI9E-;3A_xc>K75}!?61CJAQ!5Yl# z8*&ZibO%7Yt}#Jl#Uo?a!eZ-TpFZmvHz93PN0`kHqKeWZ@I+Bik+0NTz<|}ifB2!X zYns?E2Ol8Xs7swo%(R8N{eQ6j_kA^4|GQ32XbJQQptygA|NjqOU>z|8L;V458|Zbkl{IhC1quxDhEk zvJ9d?T3f3tD>YPHn=bQ@`V&LidLE^3=V<&~5p7^_SLNlcc91w*R%@apIOnZ3nna zPPD1F2h-&>B1d*7U`S91hZ?PHkEH2>E5T1}|8+MTB|s&pYykWJ7Of1jI^o#Z{%ehI z$P*>?)WcCZ^PP!uiZuU!`bBco13Lsbr@<{~ddUg`UZn`$^VFdT(Dw|GW z84#`r;}}nvE|~ICtlac&dsX450hJpc|I?MCI;9=oB5eg5PG6leLsgsp8VQGM-k zXow?3b$J8o(Fu2rfuK$Be@2XHR|6XZ@swd|p^oDo7I(n{kxP%vYJapA1Rw=PRn3GQ z!qkoiv(|321!ryXL(ONpALM_gTir(0tp4j!CQmPm2d{Nxoe4K1we3E>K=&wjWiU*c z)V^m92(NZFW$g$*;O$b6yIi)$#DRy|7tR zIh0?CnU5RqVg^tMX+wf2Z46A-mDS!O^g}mI6PpG^BDI$^3lNyM|c}SxqIE9Bjk)L zfbd#?@aBew@JfL4IzRJI97L*=8qSZ2H~w|4N5wrdYWOoW1Hus=BOex~TT7IW;{HG3 zj0HNgp~nABjnk@|#~}aLTP_@>Q$6H8?*Frl8f5}Yv?lrBMm+N{tZ%D9`u}c-XhFi1 zd{~%PR#dS>H2_sBxCvHnRhd%NDN}LZ2w!mmby&1DM`!yY3dk-(A%RM*J1M)oUi2R1-E5ZeDYgOE26 zH&fGZupMF4{?>Hp6r-xV@Cnt{MBc1&qv1i@ERQkLAtACK7DU~8kHsQjd%|?Vv<6eP zy*JsF7|8!E6UjQ0yhAIhP*BznR$^LGCXxb%jjyfn+E#>UiCDRTm2JSzEFA2vpDCs8 zWJRn-ylRh(5biSauDVbv!PgJm?{Gtbhw9rOxc86*U@cuFlkAb0O$Un~Ig#wezVn-7_s4UvJvD_V>c< zSd~yjdqg1r&0ntaMeZc;|<<)XI!EaO=x%wfDS`}~=g@x!(O%rp1#GkYR zAOLgY+lGL8g{X{>pc-nEFi9cIVCV#w_#{S2%`Q|m#Y4mzHl{8mz(+Wz59PEz*Yw%- z-GAjgD3>sm;tA85fhwD*26FNnfb*gJ4H{4{!U#Ygtt#T6|7XuXrcy_bV{1$UKoAg& zjjE~%{{Ni>C$_2#38K{T(2W32#mcY(!HR*T_W1Y03ILp%HLCHlCQ*Hj?OZFPOFZ_W zT3r+3cZ5lWCrq<5m6xbysPdLB$p2mI6ju6D6fdz9^3IG9Q40wQ(T=ecDt@EfW@}>7 zb|Yw}JV`!#5|elyNec@*Pf|!Ea22W61mFkT6h6EEXdLN>O^vg2Z;j^FXj+GH2-U_B zy%!HN>Vm@PNyzTWfDj=JR!^8NSl1$~wN4Tjte;js{vA@FGgk7)PJa&5%E8HErb<4UIWhgutBNCx`JD~3#Je-zKIb*3N z_Kg{##c63V8Wcy}HfWS-5Vq_RjN3sWE`q@>r79>ZMU@LdPjCaO25cR>GKxbf_C18w zoJC_%8r6VHJR+hCrTk+wC_pmqK#BKZplDUFW1XLBl<2;k+&w^)V{CN$yU2E|h9nA6 zs%a_+pcBa}<=iRYeAURPtBJccGuDr7@Oo{E@AR7SbpHS!Dbs2tz#6uzl)ScP);cYX zgZ%0SP@_o6Zz!(iwSvTQ@$QzJGP&S{2v0~5t%OG}6aKE}!fSmeBu9Nj?)J>Rd1lHs+W(ITwHm?RZ8 zIlE5X{DFP#=>I1Y-(&C>UsD(ZuU|UW+{8X~OK1y-ngOK)CtjbYR-M1HmzQJJT5Ek7 z%96ZTv(;*4Ho*UHMV2>>w6JSR;cN2|+kb0`Ol<#!_mrLh`!7n0?SI8>*--oMux)7n zx7FPIot{26yNR8>x-pGTxT}Q|10~$bsgb>2nfj1hwmn@jWIB5w zjhFYewt)S=BewsNpawPS)RvUW(bHOLAhQAXe;&%bcrQ8ziplWUx8;>~(8 zi8smS=e4uR+MCU0vT@;x)wn%|?+nbFeWfaI z0wh)B#UTDKAoh>$NBC3v3_^gmxx0{W!Sz@j#x#|+O;tqU1i*_Iioy+a{;z)NhJ^}o4Dn>)!xUrzEL+hR5((335(T1|>eLL|T+3td=A1}8^T zDB;X61ppt=W?!mQzsh35ZV9V&$|~okT-GEXDt?mG#wTLJ)o6dVqol3kE9R-YawZ;B z&Qb}Zcy9Q*T%~I2oOoO;;d-?PB`!>Qjydz5^H&}?Y&wpxnD?cKRYuljsV0=N33B3> z4;8P^=dU&}v6ZFX99yUNDTau?zbx{AU_s~q=*I|urrz>_OUxS+=!J$jaW5iqpKOVt zn-9QyPStmNP06CG90)^WB;@|B*yic2iuk!gf*q_>lL#KyfU#~WFu&xp$n)#!t_)^j z)tm{xic@TmiuKExkMK|w3oGXa_-;Gi#<>T%|4&DkAw3N%y1>2S>9X7_&W}Hlo>{o% zd(u2^Mnbqlt$H$F?ETt5!h_%%1UGFaH-ST}=zQ{abAAGS@bb!JQyc}n-gulP*UmG+ z=Z>Af;l5K9XMawwe{bq+k z8`&^RV6(guMxW`FG?s}G-V-;SM3g7BETw&CBpGLaHzv|9)}49jdU|xm3TjmX`A!6! zC!A-0l2T^PF(mTsQvR=@4+dsd{{nILYX<}Q5d5!e5?WDvi6 zDe$&EzAd-SO+et5j~HGz%k@075D0IOatm-v!HBDEd-6r@SYd*xfBEHf{SYn0PwBV^ zVgm`dx2uYf6C7x`@p)B&oOg&Fh!+qzxdh3~bIeI{cxifS1Fi-N&GMRODcrBaP^)xZ z8&_KB`~R{?%a%L(pU3?_eUaG;@BEt`Cq8BNmepl>WoDN55H7Jeq6}xPsqfU#L#lZsRHcLIfZu?0>p9rFRK1W@_%D4f=|4}2*e1e5O{op z*`7ew6szAXf%$)Tb=?2cG4<~Mi9(&faKtLP_x6$y5?7B+)PAnyF(3q9h8tG&q4(JB6ABaU`f+L}p(C&%l)! zeCSklddj}cpz5@0y-BTOeziW^A z-Jrso0k_S)|3^dr4dKtEUY?n6b|uhh5%s6ig?vnUYCBSl|FEbaztYAUW<{6;#0f(YyFmaeEG|ZIV9OC@n zPRxt+Q=C!3s5er^wZ^-QS;h<_ zq5o0;C;jjB-{?Qrf2#jL|DOJB{Tup!)?e1Yq<>ETjQ&aeqxy$*Q-4Z7qo2?p(MR^%_?S0x4+G*{Wc1Sy*4Qjiz2efV4CT+cTyLOAVM7v3A zB5dd3^lHC&ZU*4=g>x9Ke{UUu^^4XaSbyGvx2M#;U_A)ye`oE2^=GU;Sby5;h4rVb z2VnhgtR1laq_q{+pRn$M^>Y@~Tx$Q!+5qd1TkBx`QELsXKVq$d^`BbZuzuFM71n=Z zt%UW5tXp9HerpA+pRnM5t=h*dT*J*-i(&n!)dlNEtWH=Tv^rotWVOM1z-or|9;*S? z{nibz-fdkA>s{8>u+Canz`D ziPUa4;cn5|Z6@Yxi@6Qfn@!BoJtpR5lerew8%@m1-R5nuzRSeC+-YJiHkg?H^(Ll& zow*d&cbJ&|H72J2b`#Ton~CXPWy0I(YHu}fg7r!h^Ky&X3hU)&3#^x!n6I17MX+9C zHoO&$!TOD{ z%SQTZK?U*7{uM0?~Z}C)cp0> z{jmP4v8}NF&e&bBetirutoimB=s?YX9|L@9zBLAz)coZbU{dqVF~Fqe8)JY;&3_#O zG-_TO0|aVb9RmbvzBUF3)cmJ0K%nL;W3yrX%Gh>XAzj;m zjCaE-UW!HF)OvGi0-b$#kKRDMaB;skC=FBCfRohO#6ANAa2 z9F|O<_w7_A8kM}x)*YEo_@Hp%A`H*VIITL~=7XaES4R>aDoCEn_2jmjOA_eR;^-1} z`!7lw4wYim1_g=AY83Wt`=5*S+3_!c`5J%j5px;nz~SgR;I--!sX3=yobF<`5vCR| zu{=JEtO z-N~qrq#+U-ytNhVXMjGn_n?v9a~JMyF27;U-AxwqOmFP?KO5s0LKk~YA3A$e<;`2BWn?<|N99Rp}W95A&yW5v@93isc_rH4^);%9uya5Iih(F$zA``(f7gr zVKs#o(6#QobS;w6#<~`K6F{J@Jr6RuwQ6J{_!iDEV*8&GUI29MwyM!JK4mP$6-F-j zMGI;rjx`0oYYt?xDwc_ps!vE>=2U^W_-~*Nq`#%T0{uxktpGb>y3I+d(;+XSRrU*gJ84yHZuDc82G|1^L0PpxK#pUk^u~+zV&b z;e})Ty3n4JX>&D9ZFdwe1dgmcU*d+RZ#36J4KMl=1Dv)NWkmVo7F=d8f$lmASAxEHY=lyI zU>QoDzL%Y46`9>D)qAniTVvh<<(R9AcY0;^bU6ITkwI|mcrInTP|8chD>J-@DX!yG(~jZ(jpQx$)j zcyAT-vPQlgw@ni@TtI_LEAYixa@U&oB+$vF z%=Wz3PFzEh@9cmhye0)x%|T_m&9~pq^nQ!8Lu|k=uidp*&UTWW3s`T|}*M(JY= zBtHfHD8k=wBx*%}!BdwMzN`v5ua|2o(?RYo0R~d$MqnV|rJl~*tnm1=;gWDSz@)G!CY|pun*sm zLm;~=1TrDj?kIp5DFlh*m$f8r}E1^I&4Nw4lo{c89|7mCr zGH%sJwAay#u<2QHGt6zki!$T79qv&ch0w5bUHwM>=i~V8)%=%;+Y~o~5yQ~_#d33| zd2a%J@&>k7fh>oYltw!$Du5%U6x``Sk0pzO=$kt6OtPb1R4{;3pF@ z5Ne8ZfMCS?IaWoV5yhLVGq=FqR6zo?^_mbmD8-fE2$BP16vK=!Vd81Lh&_D>RuzSz z4s$brelS2I?JfxoJRuZ2*rgDO%v!z?6kp+ReX=MfJAyv>L=Pyps(#>HM@)d1 zvmMkw%dGe|vep%(PdL~YEnArq|2NKWiD*EarU*LDE1_^eFl|8sVtnuwR8hCT1VA5f zh^NKF42J;Ej%;lwA_A(^GFfgVpw+{NGceCZbdLmH;{;QFk0c{v#IY4*KmJ+NvC)aIk(c>4zrjG*ht(oloNiElJ6%ZJ_O*VqL@Sl4sOeniRJkZwn)Qp zwCDd>&G~E;3Keq-4sXJUOVAb@Yt^a zjfW10Pghx&n0>&&QBgoaC(eU|N?#O67w4A)c#}&=qG)B_up#C;&0e5i`dRdX=noi7 z5P(3WP`#B2bl?_QcELYx?t}unA%c$wlM@&YTY(l(VIEmt`2}KxsUeeIYiBdPcYb0j z>*T?~l$infsY<)RC{%OZCsp9P=YEslWXc^~MzO=k_Fs$UVf+7*zC%xFN8n9B@N~4e zSe78QhJiy80-fLhdK;AfP;+wctTw67U1?d$>?CHp_d4Iul@d2kS)Dvc36 zl@t6omP5c`FcQ9+V%z@%$T+FLsqfN$sr8_@(F3CO7xOK5sW}2D%x9oy!9@@a;ZUE4 zWkn2Ic|?uKemB<_afHsezJ)Kg3S@xota$)5bAv-w=0`SNb_=|{fb>HM8rWU11>~lg z`$Ze)0I)l^nuE)OabUj#NJ z|JN2H<4=rs{a1Q3Y{pA81ac$hA(#Q~Wj6Ieak0HP#L@mn987z#ohJv@W;1x({+h0b z1FFN$2_z1aQyVgK>}8F#;FO^R-AKLSuXI4?UvGcIKyoEDooEQ1Zd|u0+nMgc|A>bJ@5k@!biE2(dFY34 z_6d%YRPM2R$kL9W?I7tJ_vP2Qs$<{AJS7{km%{;8Nr`V41N;f}bV6O`dEA#@e_rlG zMsR2=CniLOOeAa57>>072N9kO~=N4a(tpfmk22PS2VlcK}R@Lv?a z_$fkkQTV@`Gj46l$Z_c&O>8Sy-x*Ree1t!=t z3Pf&T0nD=ur&4LCDM`tLt*aTS*+@I-xxXiiPZ}ZSi1mi_;T{B2>`$e5fh;tS7${5g zl-|3zM6w%3@w~b%>@$+jTuF47 zWnvvJ=@>ZPR}hIv`>HQWF_%PK=ENXstF8~CQ2BoV+y4b<1u{Ns+^7Gu{%L)$ey#RX z?UdGv{x|FnUvf!nI@k;=#SZnX%Jii9!mC~7^6ts@xH%ZKA*I;9=H^~e2c)_fYY0_a zg&{&wd_d^bo`E*6wcY`q;W}y{L+J@H!$+Mp~jbC@t$luTDb?I%URp38t9Hyr-pFj-v)H|cm7L89%x`zr!~z$haJux zzPzLgL{UBy5}(7qe5x2t3S9yzhCs?7l|U3yHds24GMl+YPjnIAo%FTWUw7g{w~yC+ zz|x>crnbs>b#Ryn!_Ii{jNP-t#@la*4HgO{dVtg#T$!ng0xvic!vSi8dA#Tz-SKdb z*#6&v{uvoZjO*at+$*);Ywy?Az>cZDthX)(DCvuOmy=gawRbeNrytz2zP{C7FPe~BIt@fbrs%KYlEj7yLaz?(*0WN zozOjXhXr-dU?JV*YOR?N0q6}%1@(vfabRu2#Ctj7;7+sgd9mO=)>;>GoHeBvr57wp zHyvu~gXLE8A>V~BO?{8_^_@U)yrnOlT!b4mHl&lI58tzVyLAC{M_>KBJg7V0W3>0Z zir#aYH3M*Cuh96Zn71Wi0uSZW-6O8OilL2M+u0w`puu)r;#s65i_*9-OV-%_4RiqM zU(<%*Uj>%jA?q?Io71NymU~|(TY@`8)^$L>+7 zKe@rW6dvHEajZPND@RV#x9GJ?N*3_kX#{r2%@+9~4NuUCl_(%rpm>w#1(wV0TY1E* zy!1{ZcqV$WbqU;QM6YZ{fK+(#mn(SbUT9oR3zDV4gunn3b^$M!hyr1tD4RP{a))gRCdQVCOsj_M()-P^5KdDxO=(20OvA+8XEH`Yu3*2Wf z%`-~nKK=DQ#1I;a0}X!o0@?PhG@|+pJfnVct93be&9)M=ESPY$MU3CV-T7|^_yc?# z6rH&!JCK3$=j%Rg``?80k82O1P0@@qtkucut*gO!R}>^K;kHkIt#rb)J;<`+v@qD$ zH`HfJ>~&Ahv#tV!?kWhO0QZJ<0;{#1J9=&;V(6!~rSO=?k$s2*w)2(aa z-DULE7?Bc{6;-!5Q$)!tL`&_7>jj=l&l&ER7nGX?g}Tyvbj&8nt?c-JG15K?*Z$!5-%#!* z>jvOqf7H+$(JbJfBRe zXy>xB=pIN1{QY}^Q5EAZaL;#2dgkxoUD_&cjM*;QOz+zmdw(5iPXdM}UE z;XDvtp zV2hkchtcTyJVikGrB(_Er_YxV-6@jr`3DCF8J(>|^3)t1Aq^LMGYnhmtY7T&QWS>`W*e_gGAh0rXN>e@auIFdbjeZ%4z_0}R! zQ+$G=X{XiXT>pN6EH~T#@H%riwK4TzdUIoQc2WC|^dNIq4@C3XUV?ombvXE_i6R+1o<3_jfgGAQ!8deg2+qB%-_uR)`I%F*XePUN*21ed^ z1C78vOGndJH(m*(+>%bWrS@$FmhVf=LT|tV&jr>U#2bTyJKMVInt{e6sli>Dy5@B1 zklk<)da)ZGNo7bQ=g7hjtocA2eOzGq zy1n3{vAbgyy=OgGp1iBxyT^7$V7Cp_MZ1Q71KlJp8W?BG&&S7q2iyM&f7r+3Ws7wq z?@nN3GGig`ZUyne%&T~!4YYOKiRWMg{$=DrqORRZtm0j*3zDGmWR*8!2*Y7C`yPMuR6)!8@;%Fk4OAAm*>|6fFdynjjCBMLgf^U55dF5 z$ER`0bi#$7s25Ql(OzVM+5GY6`D&b_*;IAak^}pH5Gy#}Ww5O&sN_%frAI|Z@JP@t z9gO!5K0=`yPDrVo1a0%&ou`$?R*l6J-P?l}1Usjy(h15Mp%_*Qdnv-I^S2_!_#A~e z$+t;lgz~l)VYCq05dJ3z6y=0LkzdU5O-c=Y_I9lw9~= z|NFfP;A?6yzJf}g4|13_;)9Axfr7&zbV~>0`w2E6LQ3T%XuHmM{$F0bfZl_{MOEnp zZw)24>in&Unh@_*I11zWzdM5^NU2;-1km$W(MdA@ClBGnjKv2W7rm-ibw3s&U2w`@ zzCs+Ya9DB;oXs_vTFc)d{*O5Mf5|s0Hlc7C_SICin0+&y;M9azgP5unOhWKT&@COT zWJwV1QYb@FUdm8`BFOn|FgM}pNE(Txybpx{GD9?)1E-awR#8qiy$G--SZr_S zde!RKf;r>Ek8icw6Ud_X?p8Ckg<%FfJ_J18G{t!w#p+%dLcwR1CH{Yb-K-nOe>~@` zrZ^MN^4(mhn&cwKd-;35_FuGJFB9sbauLV{(cQ{3uMeIB`^hG(h!dd@6p7;CD^=XR z`ELTHl8pxx=M;}J2m9xOk5)_pZ2qT!@UhB4t<@_}HWdfO;RWyN5k3=6C713z!nY49 z1drc^io0ap;|*tgul?5^CWG+RWtFm5U!ffM0s{$9kYHOQFi*sk%wyM7P_i$y`6Fb8 zaY~K@6eJIipW2%5F&2s6=D?v^L0U_WKMS#@enPbDq@ zZ&OgIUnX8oZ1am}e#VwGSUfTw|I8}Xhj!bl-7DC$F#jbaG z@%$e<1maby9*Uw|7vqwspWPGns^p7eei+aHL&Br0H*StJVWBC1`A(wwKl&8HpXyyc zy2@ITK(AaJPw-xIql>%cH^FlpuWLZyl+;gmOqgW_ut5(&ep*!lK4^OHf2?8?|4>)O z94qAhC*kibra2g3{|qxgdN>q1(>93yu@b_(wTP>R!bRH2cCR@|U(AP?5>~ffgxXTD z-C*Vlc(j+ChU*+k$go|NtO5e|{~jU=+9yfXeMg8^Q($B>@Z!*7i_39_zW7qBj_V14 z5CKV1+@X%c7ekd}ku(s_4c7C?Zq?B(8tnh^2#87EAxJjrc|Pd?yEA;MZ$4Mz=$NM+ z?W?{N4Z{{+n!y1j)MoRrY0^}o!*ZHyk16Rse5I%6d5ehDk79hOMZqK4bbDrnw0pZ- z;sBFy4KTj{Cj>4hYy)JjH5MIG;`(1m5H4+4f*W6m#W}`{(D*owMiE8|)sZSq8RYwY zl@73{*cM`?uZ2zn99 zMpfwqWsPtRE8?NWDugUBn?L?MauPe0N6VT2s$iQC$$|Ypjq@;?*iyPg%O00_Q(z*s zfUmR>&%KIiaU{~(#B3V$uo!uXz}9%VgxkNz_}K2{g3EjuzE!RJ%1IA>wh6e z9RYPtk+Gf!tGa!dHR3}`gpu->uMkoRp_L0uE-rGtPyP<^|9#NfB~69Jgv?C1SqYWv z6v!0(s|xBPai)M(nb>SxYsl}H4V@e~(4xWq$B6aYD3drCJSQ)slck~#4#si*A2wfe zVGNC0fx1yOdJ)P-Rq2EaKS5VvFBO_#L#&6v72|Uh#`%Ao{|9DTA-3nDSM^g}+Y*>P z#Q8sXfv#4F{}$O`6|>0^5jYR#FV?Dx3hMkmY;T zKtu$_F0fW4&~w+6^rqOS!=^)_$6-4A0l4dY`P9Gbd>Jcb1l_sA`2j8xllTLt16U^f zeJ~K!ip@Y>T4~LaF&LIC##bjpYIM%bnF$`C#ut1k;;_wCN+v?8vc`+BKfZB!)uxzGO%C6=Lbg`5I3dGNTFw**q?tNq#_~hf)i*-uuV-V(e!+gsKUO zr_5s1j}()m0%zolZ~8%VZ31OAQ11udCxy$CpJ;}i&zQ~oERL!0#BxC zR#JG1!!B(@eUSKeQZytlu2c4Hdrul3_`GiNs)>?MoC`*dbsUCR9>Gavcnfwu4{zDi z&MKI1#DV}R`(ECW?cdJ-KZy{0s&#qhPHR;HePr(WGbd2$aO^ahcj0PloYS0;z*C;< zW|gT9!L|PnWBX5_FGK#XeOX%#8#Whi}4@Co)QrOD#;&Nq-gr!mT z!{;+uWMxpne^|(xM~c%a=V<k07n?t-9+N}8iG*yreT|XmGhqi-=PwMt8b^(m$bBNz zQ_k?^?_z+*@!!yXh>T78PvBp?OdSMHB5Pd&ou20A2*h)NVzzT3%h&UBZLltT-7MP) z&eszjLKUC45@jq&v+nb{dy)DhC%hf7)xs zW{-ZamDP^&^uLqX$U^h7koJSQRbZ(7aYJmtFG?RhW5YPLivLd zP`(Q5c%u<(BTQBH`iT!{Dn-_`d4tJTa~Ufl65z8Du=PR zm0jVs9JT8jDA%%yF5&&lP@WvNwt$E0^++%h28?ZzEwC>_K0(LB7_cPWA%UI1&JNUO z7e#yG3B3esZP@X0%>OY*wjKodypuOun*nmI0+4f1&v($p{=;#8csqjTjtUc_uGSv} zFKn#PhQZyyQ6fc$4Z4Bte;WECG7|bZy<7VtY*zo0d(_&IK&QN+Zdqvx4ip=Yos=<` z;3AQ)4mnOcccFD36qvZ1@Q7@a$+GdknCLc9Z*Uc|60NniL+J97<7gapAoi)is{5VU z40c>AH$ekf9<;VWcRe1XrcByrV;bCU;2Znydw`wpkk7`;9kT8Pbvo!7(8qB%H8;1w zD8y&(T_6T8pu*2-W5SZ<30#E-Ej#|th2H?w5t{2``lq&755Ps=76~B25JS^(eb33u ztK5zk$@XxRWlYsbxpR2Wf>#?cL2UpsYhb!GMp$j%3rf+=7oZ6zGkNoj~3-fSvtys+Z|{M+__CDP|=S#+gq|4*#2dK2jV&aY8oYzur7Lg0H0iaA*H zt4WqM@p5Smp{2FGJ*0)|Fx;&3d~S)g6XG?Wuh@7h1k=$5S!YYU6}vJ7Ozs7ruf^a08ciRg+TI}i;=q(p0&iN2kE4* z&T<-nr%8CO#aw%A|E~VITd^jBrSX0%wtxRyWI=5xRKatOiSW9ZFrgkH+dt0#HPnpo zC))DfTdckW`q*?<46uhNEMF*fXb+*Hunaz=)4;=}W-yMT6JbS@9Cbepg{kSk#rChG zcOtzJR_OG#)~*D4&r)XFU9GDpbg^Bl8;h8qm2-I5Z#RN9j@_&sam-H53l7qsIcLXx zZ+@i>SUdPndrl_DRoJ$wGuf@ui9*M>IU;hvlu`Y2^6v|o?r;F{(;}y#BN(os z-`xiStporzik;=F1mxuZ*#2u#64(E)MZZIzM-QPp;H$ILTMrs&3zhdVwhW9657pNl zXVey)JYfx;;S{+IqzOe_3q) zQkhg&Yhrw8`~dF1uAu>;T0>rCJ;JE z*UkC);%V@1=sn!Kp_jQb@^g}9-T!J(??vYhq8-XUld?`+me&qJD?a=9R;xdOtTrmA zi3TeOtAdUJkADvJ|J_{ufA&wo|mP$BnTE-sKY-wS$zoLBo0=zEIJPK9-tE{5`ss9Zs}k= zD_&W8)Fo86%8)4#_7vF2UI&`^cpP9iTxh|FDaJ3AY;3v%WeGXU5jfU#C%70a#3k_wXO3kzk?vvK|Lo6EX|8vamGVmtM$wqS4 zRV6{&Y~$bm1J!{KRvb?@LLCP=%o_0tjmoh|8pssWw~wmQ30{k(XktU;`K1k;KmI&l zP9vZt^+USyl?%@QZK;$;HYA#o%(&{IC?^bxXwj?L|ETZX{|K$M4gqcC`HojNB^e_bz`3|A zuW$!wbsOB8eQ3{MUEN4>)$l-H>gbN6F!b=geS3y>yCk(yl6Df3)(;OIq4WTOaEznp zw!zFJK!r`MeYDLTYvaM)n3Wbv2%OrE!F0dgKh(9I0{1yWgaBhX7*snM8Rmt6%3Y#)03?tJ z$6CH1ai_XmcBr^)YU0GXF0*eC1_lZ#s@F6%x#!CWY#8iIuF8z`?*VFMAb1T0Al@qj zq1I4aftyc^kB{35%uyT)TbBnmkl-vfkV3awHoJ>!36yng{|4HHj0U|H{*`Gtb)9tt zo=wLO|7TZj!WMrwws^RT*fV+{n@y9gY^Jw=CSIPLIdgcZuCB3ew61Yv*gf1sT6~s2 zI@;RWDfJ+p?HM4S)2o)SP~c_(a30o0Y@x|$V^dR8x^C;e+fH6@Jp#{fuP8u3%3+@P zwOWKAVNn2HDnsNaGEvva=||~1rwH8u2<0|fhaqX4??EV<7AsNWSq*IvDo`*M5NJBN zsBu2TT`X8|Sat9!*R#WQ={m@Zv)Q_IYdYDMPTrJGwx^RFz!tXuY3Na8?9jiUy{OHA z&5A9#8RsBTJb4v`RE0pJ>?$q{a1|k*gn)xRifW*l+j4WP<3PTInfJVXsgjj&7py!@KtQc{0voR4tt{eHth2ef z)=`kuh5`}Dgy@MIaC+C_7a@!BC?8I9H&~AXq4>pkd5empqU1i4bNtx;XQ1yRU6@ zn6}(HW6rth2HJ3-do7+Gpsp1DJOcBT-W}I=r8K;GpcUpV_2=FJ)2i(HK7>zun_JM^ zZx5zBzj86E>)YKwIJkI5!?{`m-Mh7J@5uby5z6kmki7UsQ>5z6c zbXx=6ZmokUGo3ljb7oFiaprWzxoHM!!|K#KT2KE0VekQ8n#k9ex@p$}IjW9?*hrW! zopH`6oSKC?2gI2f=d?;u!%_l&YOwt$^aqgscl!JFW3Uk~ zF#;t-;F@#qG|$*ay?00~q3NcUQJ#YmE?g;i#gRDs^3qRfqU)$c%8hTmS@~nU8zV-@!8vO TK_}Y}Ti2(CPVInN+;9Is0`3N{ literal 0 HcmV?d00001 From 58cb6dbe0d9d32386a61fba1812dfbacc594aa46 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 23 Sep 2015 19:17:23 +0000 Subject: [PATCH 33/39] Take care that the number of reserved bits per page is consistent between the source and destination databases when doing the back-copy on a VACUUM. FossilOrigin-Name: 5b61b72f5424a2d9bb4e68eb95026cd63f003db9 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/backup.c | 4 ++++ src/pager.c | 14 ++++++++++++++ src/pager.h | 3 +++ 5 files changed, 30 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index a5c5555486..bf24e71000 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Capture\sAFL-generated\sfuzz\stests\sfor\sjson1.c\sinto\sthe\stest/fuzzdata4.db\sfile. -D 2015-09-23T11:59:50.725 +C Take\scare\sthat\sthe\snumber\sof\sreserved\sbits\sper\spage\sis\sconsistent\sbetween\s\nthe\ssource\sand\sdestination\sdatabases\swhen\sdoing\sthe\sback-copy\son\sa\sVACUUM. +D 2015-09-23T19:17:23.388 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1afa6fb2de2bddd50e0ddae8166c2ee9d69b301 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -279,7 +279,7 @@ F src/alter.c 4911e1f18fc11b60edbc6410643e938762969a6a F src/analyze.c 4c308880cf53c558070cb8513bdff4ffb1a38a77 F src/attach.c e944d0052b577703b9b83aac1638452ff42a8395 F src/auth.c b56c78ebe40a2110fd361379f7e8162d23f92240 -F src/backup.c 4d9134dc988a87838c06056c89c0e8c4700a0452 +F src/backup.c c3a9c4209439b806c44cf30daf466955727bf46c F src/bitvec.c d1f21d7d91690747881f03940584f4cc548c9d3d F src/btmutex.c 45a968cc85afed9b5e6cf55bf1f42f8d18107f79 F src/btree.c 164583151135a3764672c2c25aa8e4fa06bdb12b @@ -327,8 +327,8 @@ F src/os_setup.h c9d4553b5aaa6f73391448b265b89bed0b890faa F src/os_unix.c 76f493ed71c4154338049dee1bf6e47f69c74a55 F src/os_win.c 40b3af7a47eb1107d0d69e592bec345a3b7b798a F src/os_win.h eb7a47aa17b26b77eb97e4823f20a00b8bda12ca -F src/pager.c 4784012f80b2197c61ff6eaf4f5c7026d93253fd -F src/pager.h 6d435f563b3f7fcae4b84433b76a6ac2730036e2 +F src/pager.c 2fbeeba28f4e6d08a15bc106f36c43346a81f09e +F src/pager.h ac213f8143ebfee6a8bfb91cf4ca02c9a83343c5 F src/parse.y f599aa5e871a493330d567ced93de696f61f48f7 F src/pcache.c 24be750c79272e0ca7b6e007bc94999700f3e5ef F src/pcache.h 9968603796240cdf83da7e7bef76edf90619cea9 @@ -1388,7 +1388,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 7c7a3f3e9bc2f7a7334d8d6eae183d83f22097be -R 64646de8f025fcbfbac14050e58f6d8a +P 10a214fdb3c13b25e0bdd15c975c21c8890c47ee +R 2b1245a60b251810f1e390834307b519 U drh -Z 8d3625ca1ecc6df3eff60cf48fea0eb8 +Z 954cd22d559279a8020d621e1b476fcf diff --git a/manifest.uuid b/manifest.uuid index 5e8156b16c..5731652f02 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -10a214fdb3c13b25e0bdd15c975c21c8890c47ee \ No newline at end of file +5b61b72f5424a2d9bb4e68eb95026cd63f003db9 \ No newline at end of file diff --git a/src/backup.c b/src/backup.c index 94e578d9df..69e3c52822 100644 --- a/src/backup.c +++ b/src/backup.c @@ -769,6 +769,10 @@ int sqlite3BtreeCopyFile(Btree *pTo, Btree *pFrom){ b.pDest = pTo; b.iNext = 1; +#ifdef SQLITE_HAS_CODEC + sqlite3PagerAlignReserve(sqlite3BtreePager(pTo), sqlite3BtreePager(pFrom)); +#endif + /* 0x7FFFFFFF is the hard limit for the number of pages in a database ** file. By passing this as the number of pages to copy to ** sqlite3_backup_step(), we can guarantee that the copy finishes diff --git a/src/pager.c b/src/pager.c index 2f7c330d60..399070af01 100644 --- a/src/pager.c +++ b/src/pager.c @@ -2116,6 +2116,20 @@ static void pagerReportSize(Pager *pPager){ # define pagerReportSize(X) /* No-op if we do not support a codec */ #endif +#ifdef SQLITE_HAS_CODEC +/* +** Make sure the number of reserved bits is the same in the destination +** pager as it is in the source. This comes up when a VACUUM changes the +** number of reserved bits to the "optimal" amount. +*/ +void sqlite3PagerAlignReserve(Pager *pDest, Pager *pSrc){ + if( pDest->nReserve!=pSrc->nReserve ){ + pDest->nReserve = pSrc->nReserve; + pagerReportSize(pDest); + } +} +#endif + /* ** Read a single page from either the journal file (if isMainJrnl==1) or ** from the sub-journal (if isMainJrnl==0) and playback that page. diff --git a/src/pager.h b/src/pager.h index e3b57f435e..99a7aebc78 100644 --- a/src/pager.h +++ b/src/pager.h @@ -118,6 +118,9 @@ int sqlite3PagerReadFileheader(Pager*, int, unsigned char*); /* Functions used to configure a Pager object. */ void sqlite3PagerSetBusyhandler(Pager*, int(*)(void *), void *); int sqlite3PagerSetPagesize(Pager*, u32*, int); +#ifdef SQLITE_HAS_CODEC +void sqlite3PagerAlignReserve(Pager*,Pager*); +#endif int sqlite3PagerMaxPageCount(Pager*, int); void sqlite3PagerSetCachesize(Pager*, int); void sqlite3PagerSetMmapLimit(Pager *, sqlite3_int64); From 9567794fd931511bff5bcff1fe4c2749a28b65a4 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 24 Sep 2015 01:06:37 +0000 Subject: [PATCH 34/39] Performance optimizations on the JSON parser. FossilOrigin-Name: 7dd4b07a42eb84589d34430b9d7bfa88fbd743eb --- ext/misc/json1.c | 78 ++++++++++++++++++++++++++++++++++++++++-------- manifest | 12 ++++---- manifest.uuid | 2 +- 3 files changed, 72 insertions(+), 20 deletions(-) diff --git a/ext/misc/json1.c b/ext/misc/json1.c index 3dd831f9c5..cf766120cd 100644 --- a/ext/misc/json1.c +++ b/ext/misc/json1.c @@ -37,10 +37,34 @@ SQLITE_EXTENSION_INIT1 ** Versions of isspace(), isalnum() and isdigit() to which it is safe ** to pass signed char values. */ -#define safe_isspace(x) isspace((unsigned char)(x)) #define safe_isdigit(x) isdigit((unsigned char)(x)) #define safe_isalnum(x) isalnum((unsigned char)(x)) +/* +** Growing our own isspace() routine this way is twice as fast as +** the library isspace() function, resulting in a 7% overall performance +** increase for the parser. (Ubuntu14.10 gcc 4.8.4 x64 with -Os). +*/ +static const char jsonIsSpace[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; +#define safe_isspace(x) (jsonIsSpace[(unsigned char)x]) + /* Unsigned integer types */ typedef sqlite3_uint64 u64; typedef unsigned int u32; @@ -548,6 +572,44 @@ static void jsonReturn( } } +/* Forward reference */ +static int jsonParseAddNode(JsonParse*,u32,u32,const char*); + +/* +** A macro to hint to the compiler that a function should not be +** inlined. +*/ +#if defined(__GNUC__) +# define JSON_NOINLINE __attribute__((noinline)) +#elif defined(_MSC_VER) && _MSC_VER>=1310 +# define JSON_NOINLINE __declspec(noinline) +#else +# define JSON_NOINLINE +#endif + + +static JSON_NOINLINE int jsonParseAddNodeExpand( + JsonParse *pParse, /* Append the node to this object */ + u32 eType, /* Node type */ + u32 n, /* Content size or sub-node count */ + const char *zContent /* Content */ +){ + u32 nNew; + JsonNode *pNew; + assert( pParse->nNode>=pParse->nAlloc ); + if( pParse->oom ) return -1; + nNew = pParse->nAlloc*2 + 10; + pNew = sqlite3_realloc(pParse->aNode, sizeof(JsonNode)*nNew); + if( pNew==0 ){ + pParse->oom = 1; + return -1; + } + pParse->nAlloc = nNew; + pParse->aNode = pNew; + assert( pParse->nNodenAlloc ); + return jsonParseAddNode(pParse, eType, n, zContent); +} + /* ** Create a new JsonNode instance based on the arguments and append that ** instance to the JsonParse. Return the index in pParse->aNode[] of the @@ -561,17 +623,7 @@ static int jsonParseAddNode( ){ JsonNode *p; if( pParse->nNode>=pParse->nAlloc ){ - u32 nNew; - JsonNode *pNew; - if( pParse->oom ) return -1; - nNew = pParse->nAlloc*2 + 10; - pNew = sqlite3_realloc(pParse->aNode, sizeof(JsonNode)*nNew); - if( pNew==0 ){ - pParse->oom = 1; - return -1; - } - pParse->nAlloc = nNew; - pParse->aNode = pNew; + return jsonParseAddNodeExpand(pParse, eType, n, zContent); } p = &pParse->aNode[pParse->nNode]; p->eType = (u8)eType; @@ -1783,7 +1835,7 @@ static int jsonEachFilter( jsonEachCursorReset(p); return SQLITE_NOMEM; }else{ - JsonNode *pNode; + JsonNode *pNode = 0; if( idxNum==3 ){ const char *zErr = 0; zRoot = (const char*)sqlite3_value_text(argv[1]); diff --git a/manifest b/manifest index bf24e71000..28c26272cb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Take\scare\sthat\sthe\snumber\sof\sreserved\sbits\sper\spage\sis\sconsistent\sbetween\s\nthe\ssource\sand\sdestination\sdatabases\swhen\sdoing\sthe\sback-copy\son\sa\sVACUUM. -D 2015-09-23T19:17:23.388 +C Performance\soptimizations\son\sthe\sJSON\sparser. +D 2015-09-24T01:06:37.957 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1afa6fb2de2bddd50e0ddae8166c2ee9d69b301 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -195,7 +195,7 @@ F ext/misc/eval.c f971962e92ebb8b0a4e6b62949463ee454d88fa2 F ext/misc/fileio.c d4171c815d6543a9edef8308aab2951413cd8d0f F ext/misc/fuzzer.c 4c84635c71c26cfa7c2e5848cf49fe2d2cfcd767 F ext/misc/ieee754.c b0362167289170627659e84173f5d2e8fee8566e -F ext/misc/json1.c 7659013d8d84a263ae60cd01cdc25d3596cf5063 +F ext/misc/json1.c 7d0000e380785587d463087aa9b35969727bd441 F ext/misc/nextchar.c 35c8b8baacb96d92abbb34a83a997b797075b342 F ext/misc/percentile.c bcbee3c061b884eccb80e21651daaae8e1e43c63 F ext/misc/regexp.c af92cdaa5058fcec1451e49becc7ba44dba023dc @@ -1388,7 +1388,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 10a214fdb3c13b25e0bdd15c975c21c8890c47ee -R 2b1245a60b251810f1e390834307b519 +P 5b61b72f5424a2d9bb4e68eb95026cd63f003db9 +R 573d7fd2b2ba49c88643e63838f29bfa U drh -Z 954cd22d559279a8020d621e1b476fcf +Z e6052053910d25a8548d981b3aa4b989 diff --git a/manifest.uuid b/manifest.uuid index 5731652f02..799899d2bd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5b61b72f5424a2d9bb4e68eb95026cd63f003db9 \ No newline at end of file +7dd4b07a42eb84589d34430b9d7bfa88fbd743eb \ No newline at end of file From 8cb15cc5ae65aa9f0a3bda7752e12e6a9c70e066 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 24 Sep 2015 01:40:45 +0000 Subject: [PATCH 35/39] Another (smaller) performance optimization for the JSON parser. FossilOrigin-Name: c43daa8c78df99f62dd4d3c83708a3a8eff92496 --- ext/misc/json1.c | 5 +++-- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/ext/misc/json1.c b/ext/misc/json1.c index cf766120cd..89b70f0838 100644 --- a/ext/misc/json1.c +++ b/ext/misc/json1.c @@ -649,8 +649,7 @@ static int jsonParseValue(JsonParse *pParse, u32 i){ int x; JsonNode *pNode; while( safe_isspace(pParse->zJson[i]) ){ i++; } - if( (c = pParse->zJson[i])==0 ) return 0; - if( c=='{' ){ + if( (c = pParse->zJson[i])=='{' ){ /* Parse object */ iThis = jsonParseAddNode(pParse, JSON_OBJECT, 0, 0); if( iThis<0 ) return -1; @@ -770,6 +769,8 @@ static int jsonParseValue(JsonParse *pParse, u32 i){ return -2; /* End of {...} */ }else if( c==']' ){ return -3; /* End of [...] */ + }else if( c==0 ){ + return 0; /* End of file */ }else{ return -1; /* Syntax error */ } diff --git a/manifest b/manifest index 28c26272cb..2c5938e495 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Performance\soptimizations\son\sthe\sJSON\sparser. -D 2015-09-24T01:06:37.957 +C Another\s(smaller)\sperformance\soptimization\sfor\sthe\sJSON\sparser. +D 2015-09-24T01:40:45.848 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1afa6fb2de2bddd50e0ddae8166c2ee9d69b301 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -195,7 +195,7 @@ F ext/misc/eval.c f971962e92ebb8b0a4e6b62949463ee454d88fa2 F ext/misc/fileio.c d4171c815d6543a9edef8308aab2951413cd8d0f F ext/misc/fuzzer.c 4c84635c71c26cfa7c2e5848cf49fe2d2cfcd767 F ext/misc/ieee754.c b0362167289170627659e84173f5d2e8fee8566e -F ext/misc/json1.c 7d0000e380785587d463087aa9b35969727bd441 +F ext/misc/json1.c 557d6b2d0c3d26625e686a4b4ef8d4a50b8cec94 F ext/misc/nextchar.c 35c8b8baacb96d92abbb34a83a997b797075b342 F ext/misc/percentile.c bcbee3c061b884eccb80e21651daaae8e1e43c63 F ext/misc/regexp.c af92cdaa5058fcec1451e49becc7ba44dba023dc @@ -1388,7 +1388,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 5b61b72f5424a2d9bb4e68eb95026cd63f003db9 -R 573d7fd2b2ba49c88643e63838f29bfa +P 7dd4b07a42eb84589d34430b9d7bfa88fbd743eb +R 35931ccc4bad18cd2e2cb0703934d351 U drh -Z e6052053910d25a8548d981b3aa4b989 +Z 66f4794fa30512464c1e57a2a59bf55d diff --git a/manifest.uuid b/manifest.uuid index 799899d2bd..c10e1de96f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7dd4b07a42eb84589d34430b9d7bfa88fbd743eb \ No newline at end of file +c43daa8c78df99f62dd4d3c83708a3a8eff92496 \ No newline at end of file From b7601461e04934e679e43df7f4cd6aee8a14d999 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 24 Sep 2015 11:06:26 +0000 Subject: [PATCH 36/39] Fix a JSON1 test case so that it works on builds that omit virtual tables. FossilOrigin-Name: a4444c0f662058bdd5267e616c31cef828bc1fc5 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/json101.test | 50 ++++++++++++++++++++++++----------------------- 3 files changed, 33 insertions(+), 31 deletions(-) diff --git a/manifest b/manifest index 2c5938e495..36640d48c0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Another\s(smaller)\sperformance\soptimization\sfor\sthe\sJSON\sparser. -D 2015-09-24T01:40:45.848 +C Fix\sa\sJSON1\stest\scase\sso\sthat\sit\sworks\son\sbuilds\sthat\somit\svirtual\stables. +D 2015-09-24T11:06:26.506 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1afa6fb2de2bddd50e0ddae8166c2ee9d69b301 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -816,7 +816,7 @@ F test/journal3.test ff8af941f9e06161d3db1b46bb9f965ff0e7f307 F test/jrnlmode.test 7864d59cf7f6e552b9b99ba0f38acd167edc10fa F test/jrnlmode2.test 81610545a4e6ed239ea8fa661891893385e23a1d F test/jrnlmode3.test 556b447a05be0e0963f4311e95ab1632b11c9eaa -F test/json101.test 07f0d847d943bf5ad6e8fb60699a7f4c57317321 +F test/json101.test e8b50fbcdbf283cfafbc42632bf2c7dfa4541c46 F test/json102.test 796b1c59894c6e0f38fc1a3acb0e690573b952a3 F test/keyword1.test 37ef6bba5d2ed5b07ecdd6810571de2956599dff F test/lastinsert.test 42e948fd6442f07d60acbd15d33fb86473e0ef63 @@ -1388,7 +1388,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 7dd4b07a42eb84589d34430b9d7bfa88fbd743eb -R 35931ccc4bad18cd2e2cb0703934d351 +P c43daa8c78df99f62dd4d3c83708a3a8eff92496 +R 58ea6ba9d04066436f9d8f6b2170ec8e U drh -Z 66f4794fa30512464c1e57a2a59bf55d +Z 759cfd5c38ee08c1a1303bbe88ed012d diff --git a/manifest.uuid b/manifest.uuid index c10e1de96f..3cc65b4202 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c43daa8c78df99f62dd4d3c83708a3a8eff92496 \ No newline at end of file +a4444c0f662058bdd5267e616c31cef828bc1fc5 \ No newline at end of file diff --git a/test/json101.test b/test/json101.test index 22bbb4d5e4..943292640d 100644 --- a/test/json101.test +++ b/test/json101.test @@ -16,28 +16,28 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl load_static_extension db json -do_execsql_test json1-1.1.00 { +do_execsql_test json101-1.1.00 { SELECT json_array(1,2.5,null,'hello'); } {[1,2.5,null,"hello"]} -do_execsql_test json1-1.1.01 { +do_execsql_test json101-1.1.01 { SELECT json_array(1,'{"abc":2.5,"def":null,"ghi":hello}',99); -- the second term goes in as a string: } {[1,"{\\"abc\\":2.5,\\"def\\":null,\\"ghi\\":hello}",99]} -do_execsql_test json1-1.1.02 { +do_execsql_test json101-1.1.02 { SELECT json_array(1,json('{"abc":2.5,"def":null,"ghi":"hello"}'),99); -- the second term goes in as JSON } {[1,{"abc":2.5,"def":null,"ghi":"hello"},99]} -do_execsql_test json1-1.1.03 { +do_execsql_test json101-1.1.03 { SELECT json_array(1,json_object('abc',2.5,'def',null,'ghi','hello'),99); -- the second term goes in as JSON } {[1,{"abc":2.5,"def":null,"ghi":"hello"},99]} -do_execsql_test json1-1.2 { +do_execsql_test json101-1.2 { SELECT hex(json_array('String "\ Test')); } {5B22537472696E67205C225C5C2054657374225D} -do_catchsql_test json1-1.3 { +do_catchsql_test json101-1.3 { SELECT json_array(1,printf('%.1000c','x'),x'abcd',3); } {1 {JSON cannot hold BLOB values}} -do_execsql_test json1-1.4 { +do_execsql_test json101-1.4 { SELECT json_array(-9223372036854775808,9223372036854775807,0,1,-1, 0.0, 1.0, -1.0, -1e99, +2e100, 'one','two','three', @@ -49,39 +49,41 @@ do_execsql_test json1-1.4 { 99); } {[-9223372036854775808,9223372036854775807,0,1,-1,0.0,1.0,-1.0,-1.0e+99,2.0e+100,"one","two","three",4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,null,21,22,23,24,25,26,27,28,29,30,31,"abcdefghijklmnopqrstuvwyxzABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwyxzABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwyxzABCDEFGHIJKLMNOPQRSTUVWXYZ",99]} -do_execsql_test json1-2.1 { +do_execsql_test json101-2.1 { SELECT json_object('a',1,'b',2.5,'c',null,'d','String Test'); } {{{"a":1,"b":2.5,"c":null,"d":"String Test"}}} -do_catchsql_test json1-2.2 { +do_catchsql_test json101-2.2 { SELECT json_object('a',printf('%.1000c','x'),2,2.5); } {1 {json_object() labels must be TEXT}} -do_catchsql_test json1-2.3 { +do_catchsql_test json101-2.3 { SELECT json_object('a',1,'b'); } {1 {json_object() requires an even number of arguments}} -do_catchsql_test json1-2.4 { +do_catchsql_test json101-2.4 { SELECT json_object('a',printf('%.1000c','x'),'b',x'abcd'); } {1 {JSON cannot hold BLOB values}} -do_execsql_test json1-3.1 { +do_execsql_test json101-3.1 { SELECT json_replace('{"a":1,"b":2}','$.a','[3,4,5]'); } {{{"a":"[3,4,5]","b":2}}} -do_execsql_test json1-3.2 { +do_execsql_test json101-3.2 { SELECT json_replace('{"a":1,"b":2}','$.a',json('[3,4,5]')); } {{{"a":[3,4,5],"b":2}}} -do_execsql_test json1-3.3 { +do_execsql_test json101-3.3 { SELECT json_type(json_set('{"a":1,"b":2}','$.b','{"x":3,"y":4}'),'$.b'); } {text} -do_execsql_test json1-3.4 { +do_execsql_test json101-3.4 { SELECT json_type(json_set('{"a":1,"b":2}','$.b',json('{"x":3,"y":4}')),'$.b'); } {object} -do_execsql_test json1-3.5 { +ifcapable vtab { +do_execsql_test json101-3.5 { SELECT fullkey, atom, '|' FROM json_tree(json_set('{}','$.x',123,'$.x',456)); } {{$} {} | {$.x} 456 |} +} # Per rfc7159, any JSON value is allowed at the top level, and whitespace # is permitting before and/or after that value. # -do_execsql_test json1-4.1 { +do_execsql_test json101-4.1 { CREATE TABLE j1(x); INSERT INTO j1(x) VALUES('true'),('false'),('null'),('123'),('-234'),('34.5e+6'), @@ -90,32 +92,32 @@ do_execsql_test json1-4.1 { ('{"a":true,"b":{"c":false}}'); SELECT * FROM j1 WHERE NOT json_valid(x); } {} -do_execsql_test json1-4.2 { +do_execsql_test json101-4.2 { SELECT * FROM j1 WHERE NOT json_valid(char(0x20,0x09,0x0a,0x0d)||x); } {} -do_execsql_test json1-4.3 { +do_execsql_test json101-4.3 { SELECT * FROM j1 WHERE NOT json_valid(x||char(0x20,0x09,0x0a,0x0d)); } {} # But an empty string, or a string of pure whitespace is not valid JSON. # -do_execsql_test json1-4.4 { +do_execsql_test json101-4.4 { SELECT json_valid(''), json_valid(char(0x20,0x09,0x0a,0x0d)); } {0 0} # json_remove() and similar functions with no edit operations return their # input unchanged. # -do_execsql_test json1-4.5 { +do_execsql_test json101-4.5 { SELECT x FROM j1 WHERE json_remove(x)<>x; } {} -do_execsql_test json1-4.6 { +do_execsql_test json101-4.6 { SELECT x FROM j1 WHERE json_replace(x)<>x; } {} -do_execsql_test json1-4.7 { +do_execsql_test json101-4.7 { SELECT x FROM j1 WHERE json_set(x)<>x; } {} -do_execsql_test json1-4.8 { +do_execsql_test json101-4.8 { SELECT x FROM j1 WHERE json_insert(x)<>x; } {} From 7269443281194f8aec38c782971f339777780ab4 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 24 Sep 2015 11:26:45 +0000 Subject: [PATCH 37/39] Correctly handle the case of a WHERE-clause term with indexed expressions on both sides of the == sign. FossilOrigin-Name: d9b716a6bd6145b2e7733c04d86227df777cd473 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/where.c | 3 +-- test/indexexpr1.test | 10 ++++++++-- 4 files changed, 17 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 36640d48c0..96b2f90caf 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sJSON1\stest\scase\sso\sthat\sit\sworks\son\sbuilds\sthat\somit\svirtual\stables. -D 2015-09-24T11:06:26.506 +C Correctly\shandle\sthe\scase\sof\sa\sWHERE-clause\sterm\swith\sindexed\sexpressions\son\nboth\ssides\sof\sthe\s==\ssign. +D 2015-09-24T11:26:45.688 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1afa6fb2de2bddd50e0ddae8166c2ee9d69b301 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -417,7 +417,7 @@ F src/vxworks.h c18586c8edc1bddbc15c004fa16aeb1e1342b4fb F src/wal.c 18b0ed49830cf04fe2d68224b41838a73ac6cd24 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 F src/walker.c 2e14d17f592d176b6dc879c33fbdec4fbccaa2ba -F src/where.c 882fb44b36201fafc32dd7d59366f852806b7e70 +F src/where.c 64a80b1c0a042488b4827844d5a438ee152f6e18 F src/whereInt.h 7892bb54cf9ca0ae5c7e6094491b94c9286dc647 F src/wherecode.c 7660e1ad16817a921b099af553f3e1349352d16f F src/whereexpr.c 2473e4350e30f9b55d1c6a8f66ca23c689f23f1d @@ -785,7 +785,7 @@ F test/index5.test 8621491915800ec274609e42e02a97d67e9b13e7 F test/index6.test 7102ec371414c42dfb1d5ca37eb4519aa9edc23a F test/index7.test 9c6765a74fc3fcde7aebc5b3bd40d98df14a527c F test/indexedby.test 9c4cd331224e57f79fbf411ae245e6272d415985 -F test/indexexpr1.test b4dd422f6d0a515cbca6e0049d03a01f067b2bad +F test/indexexpr1.test b750682e07d40bd0446082143f7ae2b1bf68e405 F test/indexfault.test 31d4ab9a7d2f6e9616933eb079722362a883eb1d F test/init.test 15c823093fdabbf7b531fe22cf037134d09587a7 F test/insert.test 38742b5e9601c8f8d76e9b7555f7270288c2d371 @@ -1388,7 +1388,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P c43daa8c78df99f62dd4d3c83708a3a8eff92496 -R 58ea6ba9d04066436f9d8f6b2170ec8e +P a4444c0f662058bdd5267e616c31cef828bc1fc5 +R c64af61f6d16f1b4c50f6ad30b9369d7 U drh -Z 759cfd5c38ee08c1a1303bbe88ed012d +Z b270a072167f90d001d31028f02a3bdb diff --git a/manifest.uuid b/manifest.uuid index 3cc65b4202..e04a732b5d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a4444c0f662058bdd5267e616c31cef828bc1fc5 \ No newline at end of file +d9b716a6bd6145b2e7733c04d86227df777cd473 \ No newline at end of file diff --git a/src/where.c b/src/where.c index 69b7c064e8..39f99001fb 100644 --- a/src/where.c +++ b/src/where.c @@ -193,10 +193,9 @@ static WhereTerm *whereScanNext(WhereScan *pScan){ ){ if( (pTerm->eOperator & WO_EQUIV)!=0 && pScan->nEquivaiCur) + && (pX = sqlite3ExprSkipCollate(pTerm->pExpr->pRight))->op==TK_COLUMN ){ int j; - pX = sqlite3ExprSkipCollate(pTerm->pExpr->pRight); - assert( pX->op==TK_COLUMN ); for(j=0; jnEquiv; j++){ if( pScan->aiCur[j]==pX->iTable && pScan->aiColumn[j]==pX->iColumn ){ diff --git a/test/indexexpr1.test b/test/indexexpr1.test index 8748530c3f..63940892d7 100644 --- a/test/indexexpr1.test +++ b/test/indexexpr1.test @@ -233,7 +233,13 @@ do_execsql_test indexexpr1-600 { SELECT i FROM t4 WHERE e=5; } {9} - - +do_execsql_test indexexpr1-700 { + DROP TABLE IF EXISTS t7; + CREATE TABLE t7(a,b,c); + INSERT INTO t7(a,b,c) VALUES(1,2,2),('abc','def','def'),(4,5,6); + CREATE INDEX t7b ON t7(+b); + CREATE INDEX t7c ON t7(+c); + SELECT *, '|' FROM t7 WHERE +b=+c ORDER BY +a; +} {1 2 2 | abc def def |} finish_test From c5de2d0a0544294046414c432f88e8fda9b2bfa5 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 24 Sep 2015 12:19:17 +0000 Subject: [PATCH 38/39] Make sure joins work correctly when both sides of the join are connected using indexed expressions. FossilOrigin-Name: c2fcb03299f2872d7f97a540ea145519f8b2e5cc --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/where.c | 2 +- test/indexexpr1.test | 13 +++++++++++++ 4 files changed, 22 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 96b2f90caf..f74f0f10ad 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Correctly\shandle\sthe\scase\sof\sa\sWHERE-clause\sterm\swith\sindexed\sexpressions\son\nboth\ssides\sof\sthe\s==\ssign. -D 2015-09-24T11:26:45.688 +C Make\ssure\sjoins\swork\scorrectly\swhen\sboth\ssides\sof\sthe\sjoin\sare\sconnected\nusing\sindexed\sexpressions. +D 2015-09-24T12:19:17.384 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1afa6fb2de2bddd50e0ddae8166c2ee9d69b301 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -417,7 +417,7 @@ F src/vxworks.h c18586c8edc1bddbc15c004fa16aeb1e1342b4fb F src/wal.c 18b0ed49830cf04fe2d68224b41838a73ac6cd24 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 F src/walker.c 2e14d17f592d176b6dc879c33fbdec4fbccaa2ba -F src/where.c 64a80b1c0a042488b4827844d5a438ee152f6e18 +F src/where.c d5eed2584542e7f3bc78ddef7809a9d76d14d811 F src/whereInt.h 7892bb54cf9ca0ae5c7e6094491b94c9286dc647 F src/wherecode.c 7660e1ad16817a921b099af553f3e1349352d16f F src/whereexpr.c 2473e4350e30f9b55d1c6a8f66ca23c689f23f1d @@ -785,7 +785,7 @@ F test/index5.test 8621491915800ec274609e42e02a97d67e9b13e7 F test/index6.test 7102ec371414c42dfb1d5ca37eb4519aa9edc23a F test/index7.test 9c6765a74fc3fcde7aebc5b3bd40d98df14a527c F test/indexedby.test 9c4cd331224e57f79fbf411ae245e6272d415985 -F test/indexexpr1.test b750682e07d40bd0446082143f7ae2b1bf68e405 +F test/indexexpr1.test 203c83a05accf6f2b748834192f3564321b8c0d8 F test/indexfault.test 31d4ab9a7d2f6e9616933eb079722362a883eb1d F test/init.test 15c823093fdabbf7b531fe22cf037134d09587a7 F test/insert.test 38742b5e9601c8f8d76e9b7555f7270288c2d371 @@ -1388,7 +1388,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P a4444c0f662058bdd5267e616c31cef828bc1fc5 -R c64af61f6d16f1b4c50f6ad30b9369d7 +P d9b716a6bd6145b2e7733c04d86227df777cd473 +R 59628b7ea7f835d00524019d5851df4e U drh -Z b270a072167f90d001d31028f02a3bdb +Z 3e6728e37d51c43c629584a154f06e88 diff --git a/manifest.uuid b/manifest.uuid index e04a732b5d..20d67b18bc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d9b716a6bd6145b2e7733c04d86227df777cd473 \ No newline at end of file +c2fcb03299f2872d7f97a540ea145519f8b2e5cc \ No newline at end of file diff --git a/src/where.c b/src/where.c index 39f99001fb..1e13cf0ed0 100644 --- a/src/where.c +++ b/src/where.c @@ -182,7 +182,7 @@ static WhereTerm *whereScanNext(WhereScan *pScan){ while( pScan->iEquiv<=pScan->nEquiv ){ iCur = pScan->aiCur[pScan->iEquiv-1]; iColumn = pScan->aiColumn[pScan->iEquiv-1]; - assert( iColumn!=(-2) || pScan->pIdxExpr!=0 ); + if( iColumn==(-2) && pScan->pIdxExpr==0 ) return 0; while( (pWC = pScan->pWC)!=0 ){ for(pTerm=pWC->a+k; knTerm; k++, pTerm++){ if( pTerm->leftCursor==iCur diff --git a/test/indexexpr1.test b/test/indexexpr1.test index 63940892d7..1945059f2b 100644 --- a/test/indexexpr1.test +++ b/test/indexexpr1.test @@ -233,6 +233,8 @@ do_execsql_test indexexpr1-600 { SELECT i FROM t4 WHERE e=5; } {9} +# Indexed expressions on both sides of an == in a WHERE clause. +# do_execsql_test indexexpr1-700 { DROP TABLE IF EXISTS t7; CREATE TABLE t7(a,b,c); @@ -241,5 +243,16 @@ do_execsql_test indexexpr1-700 { CREATE INDEX t7c ON t7(+c); SELECT *, '|' FROM t7 WHERE +b=+c ORDER BY +a; } {1 2 2 | abc def def |} +do_execsql_test indexexpr1-710 { + CREATE TABLE t71(a,b,c); + CREATE INDEX t71bc ON t71(b+c); + CREATE TABLE t72(x,y,z); + CREATE INDEX t72yz ON t72(y+z); + INSERT INTO t71(a,b,c) VALUES(1,11,2),(2,7,15),(3,5,4); + INSERT INTO t72(x,y,z) VALUES(1,10,3),(2,8,14),(3,9,9); + SELECT a, x, '|' FROM t71, t72 + WHERE b+c=y+z + ORDER BY +a, +x; +} {1 1 | 2 2 |} finish_test From 22c733da644bcf8d614b7caf058c7a2b51286ab8 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 24 Sep 2015 12:40:43 +0000 Subject: [PATCH 39/39] Strengthen the implementations of xShmMemoryBarrier on both the unix and windows VFSes, so that they likely work even if SQLITE_THREADSAFE=0 is used. FossilOrigin-Name: c6ab807b72ddfc1462f61aa91442b6fac04ace8a --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/os_unix.c | 3 ++- src/os_win.c | 4 ++-- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index f74f0f10ad..54da3e3420 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\ssure\sjoins\swork\scorrectly\swhen\sboth\ssides\sof\sthe\sjoin\sare\sconnected\nusing\sindexed\sexpressions. -D 2015-09-24T12:19:17.384 +C Strengthen\sthe\simplementations\sof\sxShmMemoryBarrier\son\sboth\sthe\sunix\sand\nwindows\sVFSes,\sso\sthat\sthey\slikely\swork\seven\sif\sSQLITE_THREADSAFE=0\sis\sused. +D 2015-09-24T12:40:43.573 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1afa6fb2de2bddd50e0ddae8166c2ee9d69b301 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -324,8 +324,8 @@ F src/os.c 8fd25588eeba74068d41102d26810e216999b6c8 F src/os.h 3e57a24e2794a94d3cf2342c6d9a884888cd96bf F src/os_common.h abdb9a191a367793268fe553d25bab894e986a0e F src/os_setup.h c9d4553b5aaa6f73391448b265b89bed0b890faa -F src/os_unix.c 76f493ed71c4154338049dee1bf6e47f69c74a55 -F src/os_win.c 40b3af7a47eb1107d0d69e592bec345a3b7b798a +F src/os_unix.c fc93d55f96bb978f0b0168c6ea7d6fc60b0e172c +F src/os_win.c 1716291e5ec2dbfc5a1fe0b32182030f1f7d8acf F src/os_win.h eb7a47aa17b26b77eb97e4823f20a00b8bda12ca F src/pager.c 2fbeeba28f4e6d08a15bc106f36c43346a81f09e F src/pager.h ac213f8143ebfee6a8bfb91cf4ca02c9a83343c5 @@ -1388,7 +1388,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P d9b716a6bd6145b2e7733c04d86227df777cd473 -R 59628b7ea7f835d00524019d5851df4e +P c2fcb03299f2872d7f97a540ea145519f8b2e5cc +R 48a05a5fcfc27e989d0482f8603455ad U drh -Z 3e6728e37d51c43c629584a154f06e88 +Z 5529d899992d962be9e3269522b69c12 diff --git a/manifest.uuid b/manifest.uuid index 20d67b18bc..8b729d0105 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c2fcb03299f2872d7f97a540ea145519f8b2e5cc \ No newline at end of file +c6ab807b72ddfc1462f61aa91442b6fac04ace8a \ No newline at end of file diff --git a/src/os_unix.c b/src/os_unix.c index 53a4fd31bd..fb2a8ca916 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -4660,7 +4660,8 @@ static void unixShmBarrier( sqlite3_file *fd /* Database file holding the shared memory */ ){ UNUSED_PARAMETER(fd); - unixEnterMutex(); + sqlite3MemoryBarrier(); /* compiler-defined memory barrier */ + unixEnterMutex(); /* Also mutex, for redundancy */ unixLeaveMutex(); } diff --git a/src/os_win.c b/src/os_win.c index 41bd94098c..251107528b 100644 --- a/src/os_win.c +++ b/src/os_win.c @@ -3850,8 +3850,8 @@ static void winShmBarrier( sqlite3_file *fd /* Database holding the shared memory */ ){ UNUSED_PARAMETER(fd); - /* MemoryBarrier(); // does not work -- do not know why not */ - winShmEnterMutex(); + sqlite3MemoryBarrier(); /* compiler-defined memory barrier */ + winShmEnterMutex(); /* Also mutex, for redundancy */ winShmLeaveMutex(); }