Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1oPKzT-0005IJ-95 for pgsql-hackers@arkaria.postgresql.org; Sat, 20 Aug 2022 09:42:04 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1oPKzR-0001aL-Pv for pgsql-hackers@arkaria.postgresql.org; Sat, 20 Aug 2022 09:42:01 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1oPKzR-0001aB-30 for pgsql-hackers@lists.postgresql.org; Sat, 20 Aug 2022 09:42:01 +0000 Received: from mail.postgrespro.ru ([93.174.131.139]) by makus.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1oPKzL-00042U-SO for pgsql-hackers@postgresql.org; Sat, 20 Aug 2022 09:41:59 +0000 Received: from mail.postgrespro.ru (cyclops.postgrespro.ru [93.174.131.138]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client did not present a certificate) by mail.postgrespro.ru (Postfix) with ESMTPSA id 5345D21C2D60; Sat, 20 Aug 2022 12:41:51 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mail; t=1660988513; bh=8ad2aI19tkAucYaLQ46dYg0nUjlCBfNx6rhcMgnKUtA=; h=Date:From:To:Cc:Subject:In-Reply-To:References; b=pr8D98I6jBbLiI7bH0p7BbvyVEeQnTzKGURMsh36E84XSOFP0YkVz9r74XwSrZA/r DAJ5yhqChoqUdRv6rfyRFH5cNg42eSk4eMSws//SqUGNtFGU3I6D51nRWbUYm4lTIG zB0enQwZnsnq/Dcn8vX7h9yK+Emi0wS707aEIxZs= MIME-Version: 1.0 Date: Sat, 20 Aug 2022 12:41:51 +0300 From: Marina Polyakova To: Julien Rouhaud Cc: pgsql-hackers@postgresql.org, Peter Eisentraut , Michael Paquier , Daniel Verite , pryzby@telsasoft.com Subject: Re: ICU for global collation In-Reply-To: <20220817165359.mcco6ufe2vchokqo@jrouhaud> References: <20220121161331.xn7fhtfg5j2ucilb@jrouhaud> <87e93704-b7f7-71f6-161d-8713e6334ed3@enterprisedb.com> <704405ed-f1fa-d2a7-b9f9-48a07fb45648@enterprisedb.com> <20220625151930.GH22452@telsasoft.com> <20220626035124.t36putp232nfl5im@jrouhaud> <54b7bd53-ae10-6258-21e6-b799f7480803@enterprisedb.com> <97f2c29e-24d9-3660-60cf-9138c0c47d90@enterprisedb.com> <20220628013205.GH19662@telsasoft.com> <20220817165359.mcco6ufe2vchokqo@jrouhaud> User-Agent: Roundcube Webmail/1.4.11 Message-ID: <78ac48c77a365908d11d19519cb6ee56@postgrespro.ru> X-Sender: m.polyakova@postgrespro.ru Organization: Postgres Professional Content-Type: multipart/mixed; boundary="=_c33c7e153b34671cd84727434784b75e" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --=_c33c7e153b34671cd84727434784b75e Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; format=flowed On 2022-08-17 19:53, Julien Rouhaud wrote: > Good catch. There's unfortunately not a lot of regression tests for > ICU-initialized clusters. I'm wondering if the build-farm client could > be > taught about the locale provider rather than assuming libc. Clearly > that > wouldn't have caught this issue, but it should still increase the > coverage a > bit (I'm thinking of the recent problem with the abbreviated keys). Looking at installchecks with different locales (e.g. see [1] with sv_SE.UTF-8) - why not?.. >> diff --git a/src/backend/commands/dbcommands.c >> b/src/backend/commands/dbcommands.c >> index >> b31a30550b025d48ba3cc250dc4c15f41f9a80be..17a2942341e528c01182fb6d4878580f2706bec9 >> 100644 >> --- a/src/backend/commands/dbcommands.c >> +++ b/src/backend/commands/dbcommands.c >> @@ -1048,6 +1048,8 @@ createdb(ParseState *pstate, const CreatedbStmt >> *stmt) >> (errcode(ERRCODE_INVALID_PARAMETER_VALUE), >> errmsg("ICU locale must be specified"))); >> } >> + else >> + dbiculocale = NULL; >> >> if (dblocprovider == COLLPROVIDER_ICU) >> check_icu_locale(dbiculocale); > > I think it would be better to do that in the various variable > initialization. > Maybe switch the dblocprovider and dbiculocale initialization, and only > initialize dbiculocale if dblocprovider is COLLPROVIDER_ICU. diff --git a/src/backend/commands/dbcommands.c b/src/backend/commands/dbcommands.c index b31a30550b025d48ba3cc250dc4c15f41f9a80be..883f381f3453142790f728a3725586cebe2e2f20 100644 --- a/src/backend/commands/dbcommands.c +++ b/src/backend/commands/dbcommands.c @@ -1012,10 +1012,10 @@ createdb(ParseState *pstate, const CreatedbStmt *stmt) dbcollate = src_collate; if (dbctype == NULL) dbctype = src_ctype; - if (dbiculocale == NULL) - dbiculocale = src_iculocale; if (dblocprovider == '\0') dblocprovider = src_locprovider; + if (dbiculocale == NULL && dblocprovider == COLLPROVIDER_ICU) + dbiculocale = src_iculocale; /* Some encodings are client only */ if (!PG_VALID_BE_ENCODING(encoding)) Then it seemed to me that it was easier to first get all the parameters from the template database as usual and then process them as needed. But with your suggestion the failed assertion will check the code above more accurately... > This discrepancy between createdb and CREATE DATABASE looks like an > oversight, > as createdb indeed interprets --locale as: > > if (locale) > { > if (lc_ctype) > pg_fatal("only one of --locale and --lc-ctype can be specified"); > if (lc_collate) > pg_fatal("only one of --locale and --lc-collate can be specified"); > lc_ctype = locale; > lc_collate = locale; > } > > AFAIK the fallback in the CREATE DATABASE case is expected as POSIX > locale > names should be accepted by icu, so this should work for createdb too. Oh, great, thanks! > > > I spent some time looking at the ICU api trying to figure out if using a > > > posix locale name (e.g. en_US) was actually compatible with an ICU locale name. > > > It seems that ICU accept any of 'en-us', 'en-US', 'en_us' or 'en_US' as the > > > same locale, but I might be wrong. I also didn't find a way to figure out how > > > to ask ICU if the locale identifier passed is complete garbage or not. One > > > sure thing is that the system collation we import are of the form 'en-us', so > > > it seems weird to have this form in pg_collation and by default another form in > > > pg_database. > > > > Yeah it seems to be inconsistent about that. The locale ID documentation > > appears to indicate that "en_US" is the canonical form, but when you ask it > > to list all the locales it knows about it returns "en-US". > > Yeah I saw that too when checking is POSIX locale names were valid, and > that's > not great. I'm sorry but IIUC pg_import_system_collations uses uloc_getAvailable to get the locale ID and then specifically calls uloc_toLanguageTag?.. > I don't think that initdb --collation-provider icu should be allowed > without > --icu-locale, same for --collation-provider libc *with* --icu-locale. > > initdb has some specific processing to transform the default libc locale to > > something more appropriate, but as far as I can see creatdb / CREATE DATABASE > > aren't doing that. It seems inconsistent, and IMHO another reason why > > defaulting to the libc locale looks like a bad idea. > > This has all been removed. The separate ICU locale option should now > be > required everywhere (initdb, createdb, CREATE DATABASE). If it's a feature and not a bug in CREATE DATABASE, why should not it work in initdb too? Here we define locale/lc_collate/lc_ctype for the first 3 databases in the cluster in much the same way... P.S. FYI there seems to be a bug for very old ICU versions: in master (92fce4e1eda9b24d73f583fbe9b58f4e03f097a4): $ initdb -D data && pg_ctl -D data -l logfile start && psql -c "CREATE DATABASE mydb LOCALE \"C.UTF-8\" LOCALE_PROVIDER icu TEMPLATE template0" postgres && psql -c "SELECT 1" mydb WARNING: database "mydb" has a collation version mismatch DETAIL: The database was created using collation version 49.192.0.42, but the operating system provides version 49.192.5.42. HINT: Rebuild all objects in this database that use the default collation and run ALTER DATABASE mydb REFRESH COLLATION VERSION, or build PostgreSQL with the right library version. See the additional output (diff_log_icu_collator_locale.patch) in the logfile: 2022-08-20 11:38:30.162 MSK [136546] LOG: check_icu_locale uloc_getDefault() en_US 2022-08-20 11:38:30.162 MSK [136546] STATEMENT: CREATE DATABASE mydb LOCALE "C.UTF-8" LOCALE_PROVIDER icu TEMPLATE template0 2022-08-20 11:38:30.163 MSK [136546] LOG: check_icu_locale icu_locale C.UTF-8 valid_locale en_US version 49.192.0.42 2022-08-20 11:38:30.163 MSK [136546] STATEMENT: CREATE DATABASE mydb LOCALE "C.UTF-8" LOCALE_PROVIDER icu TEMPLATE template0 2022-08-20 11:38:30.163 MSK [136546] LOG: get_collation_actual_version uloc_getDefault() en_US 2022-08-20 11:38:30.163 MSK [136546] STATEMENT: CREATE DATABASE mydb LOCALE "C.UTF-8" LOCALE_PROVIDER icu TEMPLATE template0 2022-08-20 11:38:30.163 MSK [136546] LOG: get_collation_actual_version icu_locale C.UTF-8 valid_locale en_US version 49.192.0.42 2022-08-20 11:38:30.163 MSK [136546] STATEMENT: CREATE DATABASE mydb LOCALE "C.UTF-8" LOCALE_PROVIDER icu TEMPLATE template0 2022-08-20 11:38:30.224 MSK [136548] LOG: make_icu_collator uloc_getDefault() c 2022-08-20 11:38:30.225 MSK [136548] LOG: make_icu_collator icu_locale C.UTF-8 valid_locale root version 49.192.5.42 2022-08-20 11:38:30.225 MSK [136548] LOG: get_collation_actual_version uloc_getDefault() c 2022-08-20 11:38:30.225 MSK [136548] LOG: get_collation_actual_version icu_locale C.UTF-8 valid_locale root version 49.192.5.42 2022-08-20 11:38:30.225 MSK [136548] WARNING: database "mydb" has a collation version mismatch 2022-08-20 11:38:30.225 MSK [136548] DETAIL: The database was created using collation version 49.192.0.42, but the operating system provides version 49.192.5.42. 2022-08-20 11:38:30.225 MSK [136548] HINT: Rebuild all objects in this database that use the default collation and run ALTER DATABASE mydb REFRESH COLLATION VERSION, or build PostgreSQL with the right library version. [1] https://buildfarm.postgresql.org/cgi-bin/show_log.pl?nm=loach&dt=2022-08-18%2006%3A25%3A17 -- Marina Polyakova Postgres Professional: http://www.postgrespro.com The Russian Postgres Company --=_c33c7e153b34671cd84727434784b75e Content-Transfer-Encoding: base64 Content-Type: text/x-diff; name=diff_log_icu_collator_locale.patch Content-Disposition: attachment; filename=diff_log_icu_collator_locale.patch; size=4269 ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9wZ19sb2NhbGUuYyBiL3NyYy9iYWNr ZW5kL3V0aWxzL2FkdC9wZ19sb2NhbGUuYwppbmRleCAxYTA0N2E5N2Q3NGU3ZmU1YjJjYWQyMmNk NTRjZjMwZjcxMjliZjg0Li4yMWNmYmZmZmRkMWI1OGRmODIxYWRiZGQ1NzdmYjU5OWJjMjc0N2Nm IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9hZHQvcGdfbG9jYWxlLmMKKysrIGIvc3Jj L2JhY2tlbmQvdXRpbHMvYWR0L3BnX2xvY2FsZS5jCkBAIC0xNDA2LDYgKzE0MDYsMTQgQEAgbWFr ZV9pY3VfY29sbGF0b3IoY29uc3QgY2hhciAqaWN1bG9jc3RyLAogI2lmZGVmIFVTRV9JQ1UKIAlV Q29sbGF0b3IgICpjb2xsYXRvcjsKIAlVRXJyb3JDb2RlCXN0YXR1czsKKwljb25zdCBjaGFyICpk ZWZhdWx0X2ljdV9sb2NhbGU7CisJVVZlcnNpb25JbmZvIHZlcnNpb25pbmZvOworCWNoYXIJCWJ1 ZltVX01BWF9WRVJTSU9OX1NUUklOR19MRU5HVEhdOworCWNvbnN0IGNoYXIgKnZhbGlkX2xvY2Fs ZTsKKworCWRlZmF1bHRfaWN1X2xvY2FsZSA9IHVsb2NfZ2V0RGVmYXVsdCgpOworCWVsb2coTE9H LCAibWFrZV9pY3VfY29sbGF0b3IgdWxvY19nZXREZWZhdWx0KCkgJXMiLAorCQkgZGVmYXVsdF9p Y3VfbG9jYWxlID8gZGVmYXVsdF9pY3VfbG9jYWxlIDogIihudWxsKSIpOwogCiAJc3RhdHVzID0g VV9aRVJPX0VSUk9SOwogCWNvbGxhdG9yID0gdWNvbF9vcGVuKGljdWxvY3N0ciwgJnN0YXR1cyk7 CkBAIC0xNDE3LDYgKzE0MjUsMjAgQEAgbWFrZV9pY3VfY29sbGF0b3IoY29uc3QgY2hhciAqaWN1 bG9jc3RyLAogCWlmIChVX0lDVV9WRVJTSU9OX01BSk9SX05VTSA8IDU0KQogCQlpY3Vfc2V0X2Nv bGxhdGlvbl9hdHRyaWJ1dGVzKGNvbGxhdG9yLCBpY3Vsb2NzdHIpOwogCisJc3RhdHVzID0gVV9a RVJPX0VSUk9SOworCXZhbGlkX2xvY2FsZSA9IHVjb2xfZ2V0TG9jYWxlQnlUeXBlKGNvbGxhdG9y LCBVTE9DX1ZBTElEX0xPQ0FMRSwgJnN0YXR1cyk7CisJaWYgKFVfRkFJTFVSRShzdGF0dXMpIHx8 IHZhbGlkX2xvY2FsZSA9PSBOVUxMKQorCQllcmVwb3J0KEVSUk9SLAorCQkJCShlcnJtc2coImZh aWxlZCB0byBnZXQgdmFsaWQgbG9jYWxlIGZvciBjb2xsYXRvciB3aXRoICIKKwkJCQkJCSJyZXF1 ZXN0ZWQgbG9jYWxlIFwiJXNcIjogJXMiLAorCQkJCQkJaWN1bG9jc3RyLCB1X2Vycm9yTmFtZShz dGF0dXMpKSkpOworCisJdWNvbF9nZXRWZXJzaW9uKGNvbGxhdG9yLCB2ZXJzaW9uaW5mbyk7CisJ dV92ZXJzaW9uVG9TdHJpbmcodmVyc2lvbmluZm8sIGJ1Zik7CisKKwllbG9nKExPRywgIm1ha2Vf aWN1X2NvbGxhdG9yIGljdV9sb2NhbGUgJXMgdmFsaWRfbG9jYWxlICVzIHZlcnNpb24gJXMiLAor CQkgaWN1bG9jc3RyID8gaWN1bG9jc3RyIDogIihudWxsKSIsIHZhbGlkX2xvY2FsZSwgYnVmKTsK KwogCS8qIFdlIHdpbGwgbGVhayB0aGlzIHN0cmluZyBpZiB0aGUgY2FsbGVyIGVycm9ycyBsYXRl ciA6LSggKi8KIAlyZXN1bHRwLT5pbmZvLmljdS5sb2NhbGUgPSBNZW1vcnlDb250ZXh0U3RyZHVw KFRvcE1lbW9yeUNvbnRleHQsIGljdWxvY3N0cik7CiAJcmVzdWx0cC0+aW5mby5pY3UudWNvbCA9 IGNvbGxhdG9yOwpAQCAtMTY1NCw2ICsxNjc2LDEyIEBAIGdldF9jb2xsYXRpb25fYWN0dWFsX3Zl cnNpb24oY2hhciBjb2xscHJvdmlkZXIsIGNvbnN0IGNoYXIgKmNvbGxjb2xsYXRlKQogCQlVRXJy b3JDb2RlCXN0YXR1czsKIAkJVVZlcnNpb25JbmZvIHZlcnNpb25pbmZvOwogCQljaGFyCQlidWZb VV9NQVhfVkVSU0lPTl9TVFJJTkdfTEVOR1RIXTsKKwkJY29uc3QgY2hhciAqZGVmYXVsdF9pY3Vf bG9jYWxlOworCQljb25zdCBjaGFyICp2YWxpZF9sb2NhbGU7CisKKwkJZGVmYXVsdF9pY3VfbG9j YWxlID0gdWxvY19nZXREZWZhdWx0KCk7CisJCWVsb2coTE9HLCAiZ2V0X2NvbGxhdGlvbl9hY3R1 YWxfdmVyc2lvbiB1bG9jX2dldERlZmF1bHQoKSAlcyIsCisJCQkgZGVmYXVsdF9pY3VfbG9jYWxl ID8gZGVmYXVsdF9pY3VfbG9jYWxlIDogIihudWxsKSIpOwogCiAJCXN0YXR1cyA9IFVfWkVST19F UlJPUjsKIAkJY29sbGF0b3IgPSB1Y29sX29wZW4oY29sbGNvbGxhdGUsICZzdGF0dXMpOwpAQCAt MTY2MSwxMCArMTY4OSwyNSBAQCBnZXRfY29sbGF0aW9uX2FjdHVhbF92ZXJzaW9uKGNoYXIgY29s bHByb3ZpZGVyLCBjb25zdCBjaGFyICpjb2xsY29sbGF0ZSkKIAkJCWVyZXBvcnQoRVJST1IsCiAJ CQkJCShlcnJtc2coImNvdWxkIG5vdCBvcGVuIGNvbGxhdG9yIGZvciBsb2NhbGUgXCIlc1wiOiAl cyIsCiAJCQkJCQkJY29sbGNvbGxhdGUsIHVfZXJyb3JOYW1lKHN0YXR1cykpKSk7Ci0JCXVjb2xf Z2V0VmVyc2lvbihjb2xsYXRvciwgdmVyc2lvbmluZm8pOwotCQl1Y29sX2Nsb3NlKGNvbGxhdG9y KTsKIAorCQlzdGF0dXMgPSBVX1pFUk9fRVJST1I7CisJCXZhbGlkX2xvY2FsZSA9IHVjb2xfZ2V0 TG9jYWxlQnlUeXBlKGNvbGxhdG9yLCBVTE9DX1ZBTElEX0xPQ0FMRSwKKwkJCQkJCQkJCQkJJnN0 YXR1cyk7CisJCWlmIChVX0ZBSUxVUkUoc3RhdHVzKSB8fCB2YWxpZF9sb2NhbGUgPT0gTlVMTCkK KwkJCWVyZXBvcnQoRVJST1IsCisJCQkJCShlcnJtc2coImZhaWxlZCB0byBnZXQgdmFsaWQgbG9j YWxlIGZvciBjb2xsYXRvciB3aXRoICIKKwkJCQkJCQkicmVxdWVzdGVkIGxvY2FsZSBcIiVzXCI6 ICVzIiwKKwkJCQkJCQljb2xsY29sbGF0ZSwgdV9lcnJvck5hbWUoc3RhdHVzKSkpKTsKKworCQl1 Y29sX2dldFZlcnNpb24oY29sbGF0b3IsIHZlcnNpb25pbmZvKTsKIAkJdV92ZXJzaW9uVG9TdHJp bmcodmVyc2lvbmluZm8sIGJ1Zik7CisKKwkJZWxvZyhMT0csCisJCQkgImdldF9jb2xsYXRpb25f YWN0dWFsX3ZlcnNpb24gaWN1X2xvY2FsZSAlcyB2YWxpZF9sb2NhbGUgJXMgIgorCQkJICJ2ZXJz aW9uICVzIiwKKwkJCSBjb2xsY29sbGF0ZSA/IGNvbGxjb2xsYXRlIDogIihudWxsKSIsIHZhbGlk X2xvY2FsZSwgYnVmKTsKKworCQl1Y29sX2Nsb3NlKGNvbGxhdG9yKTsKIAkJY29sbHZlcnNpb24g PSBwc3RyZHVwKGJ1Zik7CiAJfQogCWVsc2UKQEAgLTE5NTUsNiArMTk5OCwxNCBAQCBjaGVja19p Y3VfbG9jYWxlKGNvbnN0IGNoYXIgKmljdV9sb2NhbGUpCiAjaWZkZWYgVVNFX0lDVQogCVVDb2xs YXRvciAgKmNvbGxhdG9yOwogCVVFcnJvckNvZGUJc3RhdHVzOworCWNvbnN0IGNoYXIgKmRlZmF1 bHRfaWN1X2xvY2FsZTsKKwlVVmVyc2lvbkluZm8gdmVyc2lvbmluZm87CisJY2hhcgkJYnVmW1Vf TUFYX1ZFUlNJT05fU1RSSU5HX0xFTkdUSF07CisJY29uc3QgY2hhciAqdmFsaWRfbG9jYWxlOwor CisJZGVmYXVsdF9pY3VfbG9jYWxlID0gdWxvY19nZXREZWZhdWx0KCk7CisJZWxvZyhMT0csICJj aGVja19pY3VfbG9jYWxlIHVsb2NfZ2V0RGVmYXVsdCgpICVzIiwKKwkJIGRlZmF1bHRfaWN1X2xv Y2FsZSA/IGRlZmF1bHRfaWN1X2xvY2FsZSA6ICIobnVsbCkiKTsKIAogCXN0YXR1cyA9IFVfWkVS T19FUlJPUjsKIAljb2xsYXRvciA9IHVjb2xfb3BlbihpY3VfbG9jYWxlLCAmc3RhdHVzKTsKQEAg LTE5NjUsNiArMjAxNiwyMSBAQCBjaGVja19pY3VfbG9jYWxlKGNvbnN0IGNoYXIgKmljdV9sb2Nh bGUpCiAKIAlpZiAoVV9JQ1VfVkVSU0lPTl9NQUpPUl9OVU0gPCA1NCkKIAkJaWN1X3NldF9jb2xs YXRpb25fYXR0cmlidXRlcyhjb2xsYXRvciwgaWN1X2xvY2FsZSk7CisKKwlzdGF0dXMgPSBVX1pF Uk9fRVJST1I7CisJdmFsaWRfbG9jYWxlID0gdWNvbF9nZXRMb2NhbGVCeVR5cGUoY29sbGF0b3Is IFVMT0NfVkFMSURfTE9DQUxFLCAmc3RhdHVzKTsKKwlpZiAoVV9GQUlMVVJFKHN0YXR1cykgfHwg dmFsaWRfbG9jYWxlID09IE5VTEwpCisJCWVyZXBvcnQoRVJST1IsCisJCQkJKGVycm1zZygiZmFp bGVkIHRvIGdldCB2YWxpZCBsb2NhbGUgZm9yIGNvbGxhdG9yIHdpdGggIgorCQkJCQkJInJlcXVl c3RlZCBsb2NhbGUgXCIlc1wiOiAlcyIsCisJCQkJCQlpY3VfbG9jYWxlLCB1X2Vycm9yTmFtZShz dGF0dXMpKSkpOworCisJdWNvbF9nZXRWZXJzaW9uKGNvbGxhdG9yLCB2ZXJzaW9uaW5mbyk7CisJ dV92ZXJzaW9uVG9TdHJpbmcodmVyc2lvbmluZm8sIGJ1Zik7CisKKwllbG9nKExPRywgImNoZWNr X2ljdV9sb2NhbGUgaWN1X2xvY2FsZSAlcyB2YWxpZF9sb2NhbGUgJXMgdmVyc2lvbiAlcyIsCisJ CSBpY3VfbG9jYWxlID8gaWN1X2xvY2FsZSA6ICIobnVsbCkiLCB2YWxpZF9sb2NhbGUsIGJ1Zik7 CisKIAl1Y29sX2Nsb3NlKGNvbGxhdG9yKTsKICNlbHNlCiAJZXJlcG9ydChFUlJPUiwK --=_c33c7e153b34671cd84727434784b75e--