From ab6098cfa6f891e0606a4f6285c1e4445fb08a04 Mon Sep 17 00:00:00 2001 From: larrybr Date: Fri, 12 Mar 2021 00:44:10 +0000 Subject: [PATCH 1/4] Conform description of sqlite3changeset_op() arguments to implemented behavior, some reformatting. This is a comment-only change; no code is affected. FossilOrigin-Name: 9d6e544c47b9a5d97bd02a658db5cd202bd1952f8ba3bc50e8cf47d7206041c0 --- ext/session/sqlite3session.h | 25 +++++++++++++++---------- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 23 insertions(+), 18 deletions(-) diff --git a/ext/session/sqlite3session.h b/ext/session/sqlite3session.h index 3785a77240..9ebf360ea3 100644 --- a/ext/session/sqlite3session.h +++ b/ext/session/sqlite3session.h @@ -550,18 +550,23 @@ int sqlite3changeset_next(sqlite3_changeset_iter *pIter); ** call to [sqlite3changeset_next()] must have returned [SQLITE_ROW]. If this ** is not the case, this function returns [SQLITE_MISUSE]. ** -** If argument pzTab is not NULL, then *pzTab is set to point to a -** nul-terminated utf-8 encoded string containing the name of the table -** affected by the current change. The buffer remains valid until either -** sqlite3changeset_next() is called on the iterator or until the -** conflict-handler function returns. If pnCol is not NULL, then *pnCol is -** set to the number of columns in the table affected by the change. If -** pbIndirect is not NULL, then *pbIndirect is set to true (1) if the change +** Arguments pOp, pnCol and pzTab may not be NULL. Upon return, three +** outputs are set through these pointers: +** +** *pOp is set to one of [SQLITE_INSERT], [SQLITE_DELETE] or [SQLITE_UPDATE], +** depending on the type of change that the iterator currently points to; +** +** *pnCol is set to the number of columns in the table affected by the change; and +** +** *pzTab is set to point to a nul-terminated utf-8 encoded string containing +** the name of the table affected by the current change. The buffer remains +** valid until either sqlite3changeset_next() is called on the iterator +** or until the conflict-handler function returns. +** +** If pbIndirect is not NULL, then *pbIndirect is set to true (1) if the change ** is an indirect change, or false (0) otherwise. See the documentation for ** [sqlite3session_indirect()] for a description of direct and indirect -** changes. Finally, if pOp is not NULL, then *pOp is set to one of -** [SQLITE_INSERT], [SQLITE_DELETE] or [SQLITE_UPDATE], depending on the -** type of change that the iterator currently points to. +** changes. ** ** If no error occurs, SQLITE_OK is returned. If an error does occur, an ** SQLite error code is returned. The values of the output variables may not diff --git a/manifest b/manifest index d5fcc85f69..75cfc62ceb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sTcl\sobject\sleak\sin\stest_session.c. -D 2021-03-11T15:57:25.662 +C Conform\sdescription\sof\ssqlite3changeset_op()\sarguments\sto\simplemented\sbehavior,\ssome\sreformatting.\nThis\sis\sa\scomment-only\schange;\sno\scode\sis\saffected. +D 2021-03-12T00:44:10.419 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -456,7 +456,7 @@ F ext/session/sessionrebase.test ccfa716b23bd1d3b03217ee58cfd90c78d4b99f53e6a9a2 F ext/session/sessionstat1.test 218d351cf9fcd6648f125a26b607b140310160184723c2666091b54450a68fb5 F ext/session/sessionwor.test 6fd9a2256442cebde5b2284936ae9e0d54bde692d0f5fd009ecef8511f4cf3fc F ext/session/sqlite3session.c a7c5ac1acfe21d94b37921b29b0458d64d022a66b282338eee4aafa9c018cb1c -F ext/session/sqlite3session.h f53c99731882bf59c7362855cdeba176ce1fe8eeba089e38a8cce0172f8473aa +F ext/session/sqlite3session.h f48662626e7a3176a188787a0bd360933dd46cccd98df01c208b02051c540fb7 F ext/session/test_session.c 90ccf1c30c857bd2fb3f6c990163e8f389ddbdbdc7fa5baa2f6f5f287df41c08 F ext/userauth/sqlite3userauth.h 7f3ea8c4686db8e40b0a0e7a8e0b00fac13aa7a3 F ext/userauth/user-auth.txt e6641021a9210364665fe625d067617d03f27b04 @@ -1910,7 +1910,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 41df3bbefd63151f2ddb920066777eab8e07ecfc0edb0f71f9493debe0a4a2c4 -R b666bc7b205c8c86bf444d94812f9f9d -U dan -Z 524885d968dca30473cc8b50af6a719f +P 07150cf15ad36c7fc681a911f66db23d610ddf110a7be7f1fcefbd8750cd135a +R f81dccf913eae7b6d8d57d3676a5e913 +U larrybr +Z dd58b0c8c1bef4990a7861879528581c diff --git a/manifest.uuid b/manifest.uuid index 461fef36d1..cf9d68b73e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -07150cf15ad36c7fc681a911f66db23d610ddf110a7be7f1fcefbd8750cd135a \ No newline at end of file +9d6e544c47b9a5d97bd02a658db5cd202bd1952f8ba3bc50e8cf47d7206041c0 \ No newline at end of file From 9d59e3b1bf91088e17f50843d10ea880a6423bb6 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 12 Mar 2021 01:49:08 +0000 Subject: [PATCH 2/4] Fix the ".read" command in the CLI so that SQLITE_OMIT_POPEN disables reading from a pipeline. FossilOrigin-Name: cea34f3cc35ad6dc67691799a219a30739f2296945d624d232bf76150c598ec0 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/shell.c.in | 6 ++++++ 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 75cfc62ceb..e3fb998af7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Conform\sdescription\sof\ssqlite3changeset_op()\sarguments\sto\simplemented\sbehavior,\ssome\sreformatting.\nThis\sis\sa\scomment-only\schange;\sno\scode\sis\saffected. -D 2021-03-12T00:44:10.419 +C Fix\sthe\s".read"\scommand\sin\sthe\sCLI\sso\sthat\sSQLITE_OMIT_POPEN\sdisables\nreading\sfrom\sa\spipeline. +D 2021-03-12T01:49:08.236 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -543,7 +543,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c d95db73d3e6a5c689e5f6604b4d2521350e45f2a0f0f84f5a2dc2bfee56580a0 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c fc904a7aa7ebfd5c7a57a0141d829c9f5388ac7773e0d1d9668768c1bbc87fc3 -F src/shell.c.in af18a2e980aabe739a8188266464866fe7947b100674e07480e7ba3e37595947 +F src/shell.c.in 35adf1212d759069b00e468a9304a05a67710c8f8f50e7312335e23cac985d8c F src/sqlite.h.in 3426a080ea1f222a73e3bd91e7eacbd30570a0117c03d42c6dde606f33e5e318 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 61b38c073d5e1e96a3d45271b257aef27d0d13da2bea5347692ae579475cd95e @@ -1910,7 +1910,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 07150cf15ad36c7fc681a911f66db23d610ddf110a7be7f1fcefbd8750cd135a -R f81dccf913eae7b6d8d57d3676a5e913 -U larrybr -Z dd58b0c8c1bef4990a7861879528581c +P 9d6e544c47b9a5d97bd02a658db5cd202bd1952f8ba3bc50e8cf47d7206041c0 +R 8423c0661daaf9ba8568de41b16ee2d0 +U drh +Z 4bad0f2be62fa6cc0585721a6a18ada9 diff --git a/manifest.uuid b/manifest.uuid index cf9d68b73e..231783496a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9d6e544c47b9a5d97bd02a658db5cd202bd1952f8ba3bc50e8cf47d7206041c0 \ No newline at end of file +cea34f3cc35ad6dc67691799a219a30739f2296945d624d232bf76150c598ec0 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 01d07bb7a9..9339d09396 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -9038,6 +9038,11 @@ static int do_meta_command(char *zLine, ShellState *p){ goto meta_command_exit; } if( azArg[1][0]=='|' ){ +#ifdef SQLITE_OMIT_POPEN + raw_printf(stderr, "Error: pipes are not supported in this OS\n"); + rc = 1; + p->out = stdout; +#else p->in = popen(azArg[1]+1, "r"); if( p->in==0 ){ utf8_printf(stderr, "Error: cannot open \"%s\"\n", azArg[1]); @@ -9046,6 +9051,7 @@ static int do_meta_command(char *zLine, ShellState *p){ rc = process_input(p); pclose(p->in); } +#endif }else if( notNormalFile(azArg[1]) || (p->in = fopen(azArg[1], "rb"))==0 ){ utf8_printf(stderr,"Error: cannot open \"%s\"\n", azArg[1]); rc = 1; From 0ca23aa4370dc0e2bfb9e0e737cea5eef44e10db Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 12 Mar 2021 13:49:09 +0000 Subject: [PATCH 3/4] Fix broken requirement marks. FossilOrigin-Name: 98d67152849e062c6de45b0e526daffc3d6cb29d563d40664a8d7140119a30b2 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- test/alterdropcol2.test | 18 +++++++++++++----- test/e_fkey.test | 4 ++-- test/indexedby.test | 6 +++--- 5 files changed, 27 insertions(+), 19 deletions(-) diff --git a/manifest b/manifest index e3fb998af7..aaaa164d0d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\s".read"\scommand\sin\sthe\sCLI\sso\sthat\sSQLITE_OMIT_POPEN\sdisables\nreading\sfrom\sa\spipeline. -D 2021-03-12T01:49:08.236 +C Fix\sbroken\srequirement\smarks. +D 2021-03-12T13:49:09.045 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -650,7 +650,7 @@ F test/alterauth2.test 794ac5cef251819fe364b4fe20f12f86e9c5d68070513c7fd26c17cb2 F test/altercol.test 65eef562f0eea7a1f5ddd4a140c4274c2bfc5712bb2ab2096f738852b0efce86 F test/altercorrupt.test 584d707a80e106952d6382790c8919bcf9f0db678ed3a1c09fd98b7f9d1d3a10 F test/alterdropcol.test 596623cb8a72d9570bfb8417b0f302810efe007873796f03c17a9e9ff28dade1 -F test/alterdropcol2.test 3948c805ca52f4621051b35968c18c09d107eb117e2b656c78cee3b2870650c0 +F test/alterdropcol2.test 527fce683b200d620f560f666c44ae33e22728e990a10a48a543280dfd4b4d41 F test/alterlegacy.test f38c6d06cda39e1f7b955bbce57f2e3ef5b7cb566d3d1234502093e228c15811 F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74a3fb80c9 F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b @@ -855,7 +855,7 @@ F test/e_delete.test ab39084f26ae1f033c940b70ebdbbd523dc4962e F test/e_droptrigger.test 235c610f8bf8ec44513e222b9085c7e49fad65ad0c1975ac2577109dd06fd8fa F test/e_dropview.test 74e405df7fa0f762e0c9445b166fe03955856532e2bb234c372f7c51228d75e7 F test/e_expr.test 6ba7a51ece7b3e7fc145f14f924eed25ebb5a24e7b8596c78f3838d372cf0385 -F test/e_fkey.test 0b458b85f192cdb9e9933d5891848bb19bcc44d3f49faf111a375f2844a164d3 +F test/e_fkey.test a2907f749cccd0b2c30d8576b673002eebdcc1fc9964bae61e5117b1d54733e2 F test/e_fts3.test 17ba7c373aba4d4f5696ba147ee23fd1a1ef70782af050e03e262ca187c5ee07 F test/e_insert.test f02f7f17852b2163732c6611d193f84fc67bc641fb4882c77a464076e5eba80e F test/e_reindex.test 2b0e29344497d9a8a999453a003cb476b6b1d2eef2d6c120f83c2d3a429f3164 @@ -1094,7 +1094,7 @@ F test/index6.test f172653b35b20233e59200e8b92a76db61bf7285437bf777b93b306ba26a4 F test/index7.test b8a0ba2110fd517bb48c4e76d26d60f1ab2ed9e257b18d71f820d7e71e9f8570 F test/index8.test bc2e3db70e8e62459aaa1bd7e4a9b39664f8f9d7 F test/index9.test 0aa3e509dddf81f93380396e40e9bb386904c1054924ba8fa9bcdfe85a8e7721 -F test/indexedby.test f54aac21c06948872010a956fd02de5178c362c7785a9887cf0b8616be17883b +F test/indexedby.test a3ca11f0819a9279619099f36b624bcaa315f7a1ed65c3ed2219c2a944683d2c F test/indexexpr1.test 284e119999d132cc8bf37735a928c9859b28e8e295d02b7a6a4f93977c7f9ba5 F test/indexexpr2.test dba11dbb0a58fcba4cd694f46b4004976123b81b0501f525d43c9be59f0207b1 F test/indexfault.test 98d78a8ff1f5335628b62f886a1cb7c7dac1ef6d48fa39c51ec871c87dce9811 @@ -1910,7 +1910,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 9d6e544c47b9a5d97bd02a658db5cd202bd1952f8ba3bc50e8cf47d7206041c0 -R 8423c0661daaf9ba8568de41b16ee2d0 +P cea34f3cc35ad6dc67691799a219a30739f2296945d624d232bf76150c598ec0 +R 39a4a0d8e5c6bc44cb1af4a996c13e18 U drh -Z 4bad0f2be62fa6cc0585721a6a18ada9 +Z 8f7df79a9e91c5a073fb0cc514d572c7 diff --git a/manifest.uuid b/manifest.uuid index 231783496a..6ed1e5c06b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -cea34f3cc35ad6dc67691799a219a30739f2296945d624d232bf76150c598ec0 \ No newline at end of file +98d67152849e062c6de45b0e526daffc3d6cb29d563d40664a8d7140119a30b2 \ No newline at end of file diff --git a/test/alterdropcol2.test b/test/alterdropcol2.test index 8af3677d32..d60e7db441 100644 --- a/test/alterdropcol2.test +++ b/test/alterdropcol2.test @@ -57,7 +57,7 @@ proc do_atdc_error_test {tn schema atdc error} { # and does not have a UNIQUE constraint. # -# EVIDENCE-OF: R-05184-13006 The column is a PRIMARY KEY. +# EVIDENCE-OF: R-52436-31752 The column is a PRIMARY KEY or part of one. # do_atdc_error_test 2.1.1 { CREATE TABLE x1(a PRIMARY KEY, b, c); @@ -66,6 +66,13 @@ do_atdc_error_test 2.1.1 { } { cannot drop PRIMARY KEY column: "a" } +do_atdc_error_test 2.1.2 { + CREATE TABLE x1(a,b,c,d,e, PRIMARY KEY(b,c,d)); +} { + ALTER TABLE x1 DROP COLUMN c +} { + cannot drop PRIMARY KEY column: "c" +} # EVIDENCE-OF: R-43412-16016 The column has a UNIQUE constraint. # @@ -84,7 +91,7 @@ do_atdc_error_test 2.2.2 { error in table x1 after drop column: no such column: c } -# EVIDENCE-OF: R-46731-08965: The column is indexed. +# EVIDENCE-OF: R-46731-08965 The column is indexed. # do_atdc_error_test 2.3.1 { CREATE TABLE 'one two'('x y', 'z 1', 'a b'); @@ -103,7 +110,7 @@ do_atdc_error_test 2.3.2 { error in index idx after drop column: no such column: a } -# EVIDENCE-OF: R-46731-08965: The column is indexed. +# EVIDENCE-OF: R-46731-08965 The column is indexed. # do_atdc_error_test 2.4.1 { CREATE TABLE x1234(a, b, c PRIMARY KEY) WITHOUT ROWID; @@ -114,7 +121,8 @@ do_atdc_error_test 2.4.1 { error in index i1 after drop column: no such column: a } -# EVIDENCE-OF: R-18825-17786 The column appears in a table CHECK constraint. +# EVIDENCE-OF: R-47838-03249 The column is named in a table or column +# CHECK constraint not associated with the column being dropped. # do_atdc_error_test 2.5.1 { CREATE TABLE x1234(a, b, c PRIMARY KEY, CHECK(((a+5)%10)!=0)) WITHOUT ROWID; @@ -187,7 +195,7 @@ do_atdc_error_test 2.8.3 { # if the CHECK constraint was specified as part of the column definition. # -# EVIDENCE-OF: R-60924-11170 However, the column being deleted can be used in a +# STALE-EVIDENCE: R-60924-11170 However, the column being deleted can be used in a # column CHECK constraint because the column CHECK constraint is dropped # together with the column itself. do_execsql_test 3.0 { diff --git a/test/e_fkey.test b/test/e_fkey.test index c5ac5fde38..40fa075df3 100644 --- a/test/e_fkey.test +++ b/test/e_fkey.test @@ -2055,9 +2055,9 @@ do_test e_fkey-44.5 { #------------------------------------------------------------------------- # Test SET DEFAULT actions. # -# EVIDENCE-OF: R-43054-54832 The "SET DEFAULT" actions are similar to +# EVIDENCE-OF: R-55814-22637 The "SET DEFAULT" actions are similar to # "SET NULL", except that each of the child key columns is set to -# contain the columns default value instead of NULL. +# contain the column's default value instead of NULL. # drop_all_tables do_test e_fkey-45.1 { diff --git a/test/indexedby.test b/test/indexedby.test index 18f7bb8fa3..41a52d8224 100644 --- a/test/indexedby.test +++ b/test/indexedby.test @@ -90,9 +90,9 @@ do_test indexedby-2.4 { catchsql { SELECT * FROM t1 INDEXED BY i3 WHERE a = 'one' AND b = 'two'} } {1 {no such index: i3}} -# EVIDENCE-OF: R-62112-42456 If the query optimizer is unable to use the -# index specified by the INDEX BY clause, then the query will fail with -# an error. +# EVIDENCE-OF: R-05301-32681 If the query optimizer is unable to use the +# index specified by the INDEXED BY clause, then the query will fail +# with an error. do_test indexedby-2.4.1 { catchsql { SELECT b FROM t1 INDEXED BY i1 WHERE b = 'two' } } {0 {}} From f1c43ea647124ee89416e310d11de7d2cf3b2d24 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 12 Mar 2021 15:10:09 +0000 Subject: [PATCH 4/4] Version 3.35.0 FossilOrigin-Name: acd63062eb06748bfe9e4886639e4f2b54ea6a496a83f10716abbaba4115500b --- manifest | 11 +++++++---- manifest.uuid | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/manifest b/manifest index aaaa164d0d..3a658ff085 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sbroken\srequirement\smarks. -D 2021-03-12T13:49:09.045 +C Version\s3.35.0 +D 2021-03-12T15:10:09.783 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1910,7 +1910,10 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P cea34f3cc35ad6dc67691799a219a30739f2296945d624d232bf76150c598ec0 +P 98d67152849e062c6de45b0e526daffc3d6cb29d563d40664a8d7140119a30b2 R 39a4a0d8e5c6bc44cb1af4a996c13e18 +T +sym-major-release * +T +sym-release * +T +sym-version-3.35.0 * U drh -Z 8f7df79a9e91c5a073fb0cc514d572c7 +Z 57dbd644ae30193b3f75279561c2eade diff --git a/manifest.uuid b/manifest.uuid index 6ed1e5c06b..6f063d70d6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -98d67152849e062c6de45b0e526daffc3d6cb29d563d40664a8d7140119a30b2 \ No newline at end of file +acd63062eb06748bfe9e4886639e4f2b54ea6a496a83f10716abbaba4115500b \ No newline at end of file