Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1ucLhj-00BvWj-Fb for pgsql-hackers@arkaria.postgresql.org; Thu, 17 Jul 2025 10:19:07 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1ucLhh-000xej-LD for pgsql-hackers@arkaria.postgresql.org; Thu, 17 Jul 2025 10:19:06 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1ucLhh-000xea-4Z for pgsql-hackers@lists.postgresql.org; Thu, 17 Jul 2025 10:19:05 +0000 Received: from mail-qt1-x82a.google.com ([2607:f8b0:4864:20::82a]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1ucLhe-008EVi-1o for pgsql-hackers@lists.postgresql.org; Thu, 17 Jul 2025 10:19:05 +0000 Received: by mail-qt1-x82a.google.com with SMTP id d75a77b69052e-4ab6b3e8386so7930041cf.3 for ; Thu, 17 Jul 2025 03:19:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1752747541; x=1753352341; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=PM8R2w/wM4Gx6GrPum/ezPLhZAWgWyIf0AGyXZv3bsI=; b=Xt3GwKycMvGwskXRhQukGL7VFlZJCHx8XkVKGVP+Yd1m0kaAZZ4W/YAa3Ey5gOaVQO wGTmiZaZAapbEeO45Q1DmXYG8lWdC6rRuEwsW85dGLBEmhbW1P0zcpms5KY/47kjNYS6 Hi5KmNu51iLNnV7uysHBMvPHXO0jNh/BcthpuIsaoQR7vQ9K9pyB2lcEup9RoC8uRUQD oQSMGBM48kaYqOuBxl6EjFyRFs98z9jSaldNwCvLFQuQd9WadPlnZeqJp4OJZppaDhyG TSfhxGi+FHHgUr1wkxYfM3zq2k5X2UsmlGu+qH1r94WgbAinrjt+PaBN75sZiak8ztQ3 uwcw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1752747541; x=1753352341; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=PM8R2w/wM4Gx6GrPum/ezPLhZAWgWyIf0AGyXZv3bsI=; b=b2wVMEaI4yMDCXFx8Wa+l6XM4KaBs3OiS39OPFOwTY8SzVkEyucca6rihhpB6ngLt2 Mq1+aLWS/IuQCMKwaRZguAXC/kgtU9q/z1nRrpa9SgqDJK1OmA4Ja4qwYOwQlQ57V9iH HRomDTZz7Jg4wpt5leECPFCDuF3r/j0HZGXTyC4tSuYZRf7NMwBilQ+M2asncVcS3zeD 8OXOXAl/ip2bOgxZKU+pQ/SCglLxJcuPw9kwswURS84nttLQcbvsq0KysH3LKzg3VpQ9 zBGV+tL+jLgElXIwhpqczJBldmMTqQw4XOQJlzfO/b3n1wP4UBp3mnBgK88L4aDGh8AJ oKxA== X-Forwarded-Encrypted: i=1; AJvYcCWVJYH7YwsaT+KpuZ8sWS3UcbQuXNS1siK12wUY2Wyu2Pgpz0RXOekBZoK7PUY88bH+aiYidemVmeXEdF6y@lists.postgresql.org X-Gm-Message-State: AOJu0Yz6vIPpOzvparB0zNgltKQbe2xqdCGxGittBXsQKCGwarCv2TTm BPcD+iKFHboOYGFzmWs1TWD32udKArCy8Qx0hJUbP5JEQvYUdlIgzUUrN4Ij/HxHjghKJ+JGpFS qwCoGUQjtpxb/oRjYmKbdu5GiTaq/vjw= X-Gm-Gg: ASbGncslR6WbSu9XbP1Deyi1LeaaeHIjIaQC+PWWtSnVT/rg1H1iVyXA1RsAlDwG++G HzXTRz6Gype03vlK/HRwWjqss8p5zcetZ8GxC74Bf3zqykyQfIYf4U7ixt3pXKZtEJCx1DnSNUZ Z60sSSrF6zdMMLH7bxVOTO+yT2UbM3WEhW97KxvZUk4HGKZRTdposRTplsJ5XfP29Jt39gcHlXm YTOxcTQbJylqStbcaiP25KXNwebh/fhtaB9NC/2ug== X-Google-Smtp-Source: AGHT+IHIwqpk9/DVnlPYy4NDAEWg7womQi7eMqv5R6TxX7KtMZ+hG2K8BmnvDiydqlNdHXOEhgoTLlWr6afEW4Z2jEk= X-Received: by 2002:ac8:7f8a:0:b0:4a7:71d5:c975 with SMTP id d75a77b69052e-4ab9098e43amr100814251cf.10.1752747540782; Thu, 17 Jul 2025 03:19:00 -0700 (PDT) MIME-Version: 1.0 References: <202503311812.vxg5b7rzfgf6@alvherre.pgsql> <616efe2c-3986-43cf-b88c-4435849acf9e@dunslane.net> <948154fe-0278-4f4c-8f5a-085e12f03163@dunslane.net> <20250708212819.09.nmisch@google.com> <20250716001957.c6.nmisch@google.com> In-Reply-To: From: Mahendra Singh Thalor Date: Thu, 17 Jul 2025 15:48:48 +0530 X-Gm-Features: Ac12FXwL4VCvtg9UvhIsWPWfsL8ICZ-W3w8r4lxm53Q--6HXL1S36ZK_jrMapFQ Message-ID: Subject: Re: Non-text mode for pg_dumpall To: Noah Misch Cc: Andrew Dunstan , =?UTF-8?Q?=C3=81lvaro_Herrera?= , jian he , Srinath Reddy , pgsql-hackers@lists.postgresql.org Content-Type: multipart/mixed; boundary="0000000000008cc357063a1d56a2" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000008cc357063a1d56a2 Content-Type: text/plain; charset="UTF-8" Attaching the correct patch. Sorry, I attached the wrong patch in my last email. On Thu, 17 Jul 2025 at 15:46, Mahendra Singh Thalor wrote: > > Thanks Noah for the feedback. > > On Wed, 16 Jul 2025 at 05:50, Noah Misch wrote: > > > > On Thu, Jul 10, 2025 at 12:21:03AM +0530, Mahendra Singh Thalor wrote: > > > On Wed, 9 Jul 2025 at 02:58, Noah Misch wrote: > > > > On Fri, Apr 04, 2025 at 04:11:05PM -0400, Andrew Dunstan wrote: > > > > > Thanks. I have pushed these now with a few further small tweaks. > > > > > > > > This drops all databases: > > > > > > > > pg_dumpall --clean -Fd -f /tmp/dump > > > > pg_restore -d template1 --globals-only /tmp/dump > > > > > > > > That didn't match my expectations given this help text: > > > > > > > > $ pg_restore --help|grep global > > > > -g, --globals-only restore only global objects, no databases > > > > > > Databases are global objects so due to --clean command, we are putting > > > drop commands in global.dat for all the databases. While restoring, we > > > used the "--globals-only" option so we are dropping all these > > > databases by global.dat file. > > > > > > Please let us know your expectations for this specific case. > > > > Be consistent with "pg_dump". A quick check suggests "pg_dump --clean" > > affects plain format only. For non-plain formats, only the pg_restore > > argument governs the final commands: > > > > $ rm -r /tmp/dump; pg_dump --clean -Fd -f /tmp/dump && pg_restore -f- /tmp/dump | grep DROP > > $ rm -r /tmp/dump; pg_dump --clean -Fd -f /tmp/dump && pg_restore --clean -f- /tmp/dump | grep DROP > > DROP TABLE public.example; > > > > That said, you should audit code referencing the --clean flag and see if > > there's more to it than that quick test suggests. Note that aligning with > > pg_dump will require changes for object types beyond databases. "pg_restore > > --clean" of a global dump should emit DROP TABLESPACE and DROP ROLE as > > appropriate, regardless of whether the original pg_dumpall had --clean. > > > > For my earlier example (pg_dumpall --clean; pg_restore --globals-only) I > > expect the same outcome as plain-format "pg_dumpall --globals-only", which is > > no databases dropped or created. The help line says "no databases". Plain > > "pg_dumpall --globals-only" and even "pg_dumpall --globals-only --clean" do > > not drop or create databases. > > To pg_restore, we are giving a dump of pg_dumpall which has a > global.dat file and we have drop commands in the global.dat file so > when we are using 'globals-only', we are dropping databases as we have > DROP commands. > As of now, we don't have any filter for global.dat file in restore. If > a user wants to restore only globals(without droping db), then they > should use 'globals-only' in pg_dumpall. > Or if we don't want to DROP databases by global.dat file, then we > should add a filter in pg_restore (hard to implement as we have SQL > commands in global.dat file). I think, for this case, we can do some > more doc changes. > Example: pg_restore --globals-only : this will restore the global.dat > file(including all drop commands). It might drop databases if any drop > commands. > @Andrew Dunstan Please add your opinion. > > > > > > > commit 1495eff wrote: > > > > > --- a/src/bin/pg_dump/pg_dumpall.c > > > > > +++ b/src/bin/pg_dump/pg_dumpall.c > > > > > > > > > @@ -1612,9 +1683,27 @@ dumpDatabases(PGconn *conn) > > > > > continue; > > > > > } > > > > > > > > > > + /* > > > > > + * If this is not a plain format dump, then append dboid and dbname to > > > > > + * the map.dat file. > > > > > + */ > > > > > + if (archDumpFormat != archNull) > > > > > + { > > > > > + if (archDumpFormat == archCustom) > > > > > + snprintf(dbfilepath, MAXPGPATH, "\"%s\"/\"%s\".dmp", db_subdir, oid); > > > > > + else if (archDumpFormat == archTar) > > > > > + snprintf(dbfilepath, MAXPGPATH, "\"%s\"/\"%s\".tar", db_subdir, oid); > > > > > + else > > > > > + snprintf(dbfilepath, MAXPGPATH, "\"%s\"/\"%s\"", db_subdir, oid); > > > > > > > > Use appendShellString() instead. Plain mode already does that for the > > > > "pg_dumpall -f" argument, which is part of db_subdir here. We don't want > > > > weird filename characters to work out differently for plain vs. non-plain > > > > mode. Also, it's easier to search for appendShellString() than to search for > > > > open-coded shell quoting. > > > > > > Yes, we can use appendShellString also. We are using snprintf in the > > > pg_dump.c file also. > > > Ex: snprintf(tagbuf, sizeof(tagbuf), "LARGE OBJECTS %u..%u", > > > loinfo->looids[0], loinfo->looids[loinfo->numlos - 1]); > > > > It's true snprintf() is not banned in these programs, but don't use it to do > > the quoting for OS shell command lines or fragments thereof. dbfilepath is a > > fragment of an OS shell command line. The LARGE OBJECTS string is not one of > > those. Hence, the LARGE OBJECTS scenario should keep using snprintf(). > > > > > If we want to use appendShellString, I can write a patch for these. > > > Please let me know your opinion. > > > > Use appendShellString() for shell quoting. Don't attempt to use it for other > > purposes. > > Okay. Fixed in attached patch. > > > > > > > > --- a/src/bin/pg_dump/pg_restore.c > > > > > +++ b/src/bin/pg_dump/pg_restore.c > > > > > > > > > +/* > > > > > + * read_one_statement > > > > > + * > > > > > + * This will start reading from passed file pointer using fgetc and read till > > > > > + * semicolon(sql statement terminator for global.dat file) > > > > > + * > > > > > + * EOF is returned if end-of-file input is seen; time to shut down. > > > > > > > > What makes it okay to use this particular subset of SQL lexing? > > > > > > To support complex syntax, we used this code from another file. > > > > I'm hearing that you copied this code from somewhere. Running > > "git grep 'time to shut down'" suggests you copied it from > > InteractiveBackend(). Is that right? I do see other similarities between > > read_one_statement() and InteractiveBackend(). > > > > Copying InteractiveBackend() provides negligible assurance that this is the > > right subset of SQL lexing. Only single-user mode uses InteractiveBackend(). > > Single-user mode survives mostly as a last resort for recovering from having > > reached xidStopLimit, is rarely used, and only superusers write queries to it. > > Yes, we copied this from InteractiveBackend to read statements from > global.dat file. > > > > > > > > +/* > > > > > + * get_dbnames_list_to_restore > > > > > + * > > > > > + * This will mark for skipping any entries from dbname_oid_list that pattern match an > > > > > + * entry in the db_exclude_patterns list. > > > > > + * > > > > > + * Returns the number of database to be restored. > > > > > + * > > > > > + */ > > > > > +static int > > > > > +get_dbnames_list_to_restore(PGconn *conn, > > > > > + SimpleOidStringList *dbname_oid_list, > > > > > + SimpleStringList db_exclude_patterns) > > > > > +{ > > > > > + int count_db = 0; > > > > > + PQExpBuffer query; > > > > > + PGresult *res; > > > > > + > > > > > + query = createPQExpBuffer(); > > > > > + > > > > > + if (!conn) > > > > > + pg_log_info("considering PATTERN as NAME for --exclude-database option as no db connection while doing pg_restore."); > > > > > > > > When do we not have a connection here? We'd need to document this behavior > > > > variation if it stays, but I'd prefer if we can just rely on having a > > > > connection. > > > > > > Yes, we can document this behavior. > > > > My review asked a question there. I don't see an answer to that question. > > Would you answer that question? > > Example: if there is no active database, even postgres/template1, then > we will consider PATTEREN as NAME. This is the rare case. > In attached patch, I added one doc line also for this case. > > > > @@ -1612,9 +1683,27 @@ dumpDatabases(PGconn *conn) > > > continue; > > > } > > > > > > + /* > > > + * If this is not a plain format dump, then append dboid and dbname to > > > + * the map.dat file. > > > + */ > > > + if (archDumpFormat != archNull) > > > + { > > > + if (archDumpFormat == archCustom) > > > + snprintf(dbfilepath, MAXPGPATH, "\"%s\"/\"%s\".dmp", db_subdir, oid); > > > + else if (archDumpFormat == archTar) > > > + snprintf(dbfilepath, MAXPGPATH, "\"%s\"/\"%s\".tar", db_subdir, oid); > > > + else > > > + snprintf(dbfilepath, MAXPGPATH, "\"%s\"/\"%s\"", db_subdir, oid); > > > > Use appendShellString() instead. Plain mode already does that for the > > "pg_dumpall -f" argument, which is part of db_subdir here. We don't want > > weird filename characters to work out differently for plain vs. non-plain > > mode. Also, it's easier to search for appendShellString() than to search for > > open-coded shell quoting. > > Fixed. > > > > > > @@ -1641,19 +1727,30 @@ dumpDatabases(PGconn *conn) > > > if (filename) > > > fclose(OPF); > > > > > > - ret = runPgDump(dbname, create_opts); > > > + ret = runPgDump(dbname, create_opts, dbfilepath, archDumpFormat); > > > if (ret != 0) > > > pg_fatal("pg_dump failed on database \"%s\", exiting", dbname); > > > > > > if (filename) > > > { > > > - OPF = fopen(filename, PG_BINARY_A); > > > + char global_path[MAXPGPATH]; > > > + > > > + if (archDumpFormat != archNull) > > > + snprintf(global_path, MAXPGPATH, "%s/global.dat", filename); > > > + else > > > + snprintf(global_path, MAXPGPATH, "%s", filename); > > > + > > > + OPF = fopen(global_path, PG_BINARY_A); > > > if (!OPF) > > > pg_fatal("could not re-open the output file \"%s\": %m", > > > - filename); > > > + global_path); > > > > Minor item: plain mode benefits from reopening, because pg_dump appended to > > the plain output file. There's no analogous need to reopen global.dat, since > > just this one process writes to global.dat. > > Fixed. > > > > > > @@ -1672,17 +1770,36 @@ runPgDump(const char *dbname, const char *create_opts) > > > initPQExpBuffer(&connstrbuf); > > > initPQExpBuffer(&cmd); > > > > > > - printfPQExpBuffer(&cmd, "\"%s\" %s %s", pg_dump_bin, > > > - pgdumpopts->data, create_opts); > > > - > > > /* > > > - * If we have a filename, use the undocumented plain-append pg_dump > > > - * format. > > > + * If this is not a plain format dump, then append file name and dump > > > + * format to the pg_dump command to get archive dump. > > > */ > > > - if (filename) > > > - appendPQExpBufferStr(&cmd, " -Fa "); > > > + if (archDumpFormat != archNull) > > > + { > > > + printfPQExpBuffer(&cmd, "\"%s\" -f %s %s", pg_dump_bin, > > > + dbfile, create_opts); > > > + > > > + if (archDumpFormat == archDirectory) > > > + appendPQExpBufferStr(&cmd, " --format=directory "); > > > + else if (archDumpFormat == archCustom) > > > + appendPQExpBufferStr(&cmd, " --format=custom "); > > > + else if (archDumpFormat == archTar) > > > + appendPQExpBufferStr(&cmd, " --format=tar "); > > > + } > > > else > > > - appendPQExpBufferStr(&cmd, " -Fp "); > > > + { > > > + printfPQExpBuffer(&cmd, "\"%s\" %s %s", pg_dump_bin, > > > + pgdumpopts->data, create_opts); > > > > This uses pgdumpopts for plain mode only, so many pg_dumpall options silently > > have no effect in non-plain mode. Example: > > > > strace -f pg_dumpall --lock-wait-timeout=10 2>&1 >/dev/null | grep exec > > strace -f pg_dumpall --lock-wait-timeout=10 -Fd -f /tmp/dump3 2>&1 >/dev/null | grep exec > > Fixed. > > > > + /* If database is already created, then don't set createDB flag. */ > > > + if (opts->cparams.dbname) > > > + { > > > + PGconn *test_conn; > > > + > > > + test_conn = ConnectDatabase(db_cell->str, NULL, opts->cparams.pghost, > > > + opts->cparams.pgport, opts->cparams.username, TRI_DEFAULT, > > > + false, progname, NULL, NULL, NULL, NULL); > > > + if (test_conn) > > > + { > > > + PQfinish(test_conn); > > > + > > > + /* Use already created database for connection. */ > > > + opts->createDB = 0; > > > + opts->cparams.dbname = db_cell->str; > > > + } > > > + else > > > + { > > > + /* we'll have to create it */ > > > + opts->createDB = 1; > > > + opts->cparams.dbname = connected_db; > > > + } > > > > In released versions, "pg_restore --create" fails if the database exists, and > > pg_restore w/o --create fails unless the database exists. I think we should > > continue that pattern in this new feature. If not, pg_restore should document > > how it treats pg_dumpall-sourced dumps with the "create if not exists" > > semantics appearing here. > > Added one more doc line for this case. > > Here, I am attaching a patch. Please let me know feedback. > > -- > Thanks and Regards > Mahendra Singh Thalor > EnterpriseDB: http://www.enterprisedb.com -- Thanks and Regards Mahendra Singh Thalor EnterpriseDB: http://www.enterprisedb.com --0000000000008cc357063a1d56a2 Content-Type: application/octet-stream; name="v01-17-july-use-appendShellString-to-append-file-names.noci" Content-Disposition: attachment; filename="v01-17-july-use-appendShellString-to-append-file-names.noci" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_md78lbas0 RnJvbSA2ZmY3Yzg3M2Q0ODQyYzQ3ZGEyMjY2NmQ3ZWZhYmE3NTUxZmIxMTBiIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNYWhlbmRyYSBTaW5naCBUaGFsb3IgPG1haGk2cnVuQGdtYWls LmNvbT4KRGF0ZTogVGh1LCAxNyBKdWwgMjAyNSAxNToyNDoyNSArMDUzMApTdWJqZWN0OiBbUEFU Q0hdIHVzZSBhcHBlbmRTaGVsbFN0cmluZyB0byBhcHBlbmQgZmlsZSBuYW1lcwoKLS0tCiBkb2Mv c3JjL3NnbWwvcmVmL3BnX3Jlc3RvcmUuc2dtbCB8ICA2ICsrLQogc3JjL2Jpbi9wZ19kdW1wL3Bn X2R1bXBhbGwuYyAgICAgfCA2NyArKysrKysrKysrKysrKysrKystLS0tLS0tLS0tLS0tLQogc3Jj L2Jpbi9wZ19kdW1wL3BnX3Jlc3RvcmUuYyAgICAgfCAyOCArKysrKysrLS0tLS0tCiAzIGZpbGVz IGNoYW5nZWQsIDYwIGluc2VydGlvbnMoKyksIDQxIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBh L2RvYy9zcmMvc2dtbC9yZWYvcGdfcmVzdG9yZS5zZ21sIGIvZG9jL3NyYy9zZ21sL3JlZi9wZ19y ZXN0b3JlLnNnbWwKaW5kZXggYjY0OWJkM2E1YWUuLmY0ZWIzMWYyMzI0IDEwMDY0NAotLS0gYS9k b2Mvc3JjL3NnbWwvcmVmL3BnX3Jlc3RvcmUuc2dtbAorKysgYi9kb2Mvc3JjL3NnbWwvcmVmL3Bn X3Jlc3RvcmUuc2dtbApAQCAtMTUwLDcgKzE1MCw5IEBAIFBvc3RncmVTUUwgZG9jdW1lbnRhdGlv bgogICAgICAgICBBY2Nlc3MgcHJpdmlsZWdlcyBmb3IgdGhlIGRhdGFiYXNlIGl0c2VsZiBhcmUg YWxzbyByZXN0b3JlZCwKICAgICAgICAgdW5sZXNzIDxvcHRpb24+LS1uby1hY2w8L29wdGlvbj4g aXMgc3BlY2lmaWVkLgogICAgICAgICA8b3B0aW9uPi0tY3JlYXRlPC9vcHRpb24+IGlzIHJlcXVp cmVkIHdoZW4gcmVzdG9yaW5nIG11bHRpcGxlIGRhdGFiYXNlcwotICAgICAgICBmcm9tIGFuIGFy Y2hpdmUgY3JlYXRlZCBieSA8YXBwbGljYXRpb24+cGdfZHVtcGFsbDwvYXBwbGljYXRpb24+Lgor ICAgICAgICBmcm9tIGFuIGFyY2hpdmUgY3JlYXRlZCBieSA8YXBwbGljYXRpb24+cGdfZHVtcGFs bDwvYXBwbGljYXRpb24+IGFuZCBpZgorICAgICAgICBkYXRhYmFzZSBpcyBhbHJlYWR5IGNyZWF0 ZWQsIHRoZW4gdGhpcyB3aWxsIHJlc3RvcmUgZGF0YWJhc2Ugd2l0aG91dCBhbnkKKyAgICAgICAg ZXJyb3IuCiAgICAgICAgPC9wYXJhPgogCiAgICAgICAgPHBhcmE+CkBAIC02MjEsNiArNjIzLDgg QEAgUG9zdGdyZVNRTCBkb2N1bWVudGF0aW9uCiAgICAgICAgPC9wYXJhPgogICAgICAgIDxwYXJh PgogICAgICAgICBUaGlzIG9wdGlvbiBpcyBvbmx5IHJlbGV2YW50IHdoZW4gcmVzdG9yaW5nIGZy b20gYW4gYXJjaGl2ZSBtYWRlIHVzaW5nIDxhcHBsaWNhdGlvbj5wZ19kdW1wYWxsPC9hcHBsaWNh dGlvbj4uCisgICAgICAgIElmIHRoZXJlIGlzIG5vIGRhdGFiYXNlIGNvbm5lY3Rpb24gZXhpc3Qs IHRoZW4gPHJlcGxhY2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIiPnBhdHRlcm48L3JlcGxhY2VhYmxl PiB3aWxsIGJlIGNvbnNpZGVyZWQKKyAgICAgICAgYXMgPHJlcGxhY2VhYmxlIGNsYXNzPSJwYXJh bWV0ZXIiPm5hbWU8L3JlcGxhY2VhYmxlPiBvbmx5LgogICAgICAgIDwvcGFyYT4KICAgICAgIDwv bGlzdGl0ZW0+CiAgICAgIDwvdmFybGlzdGVudHJ5PgpkaWZmIC0tZ2l0IGEvc3JjL2Jpbi9wZ19k dW1wL3BnX2R1bXBhbGwuYyBiL3NyYy9iaW4vcGdfZHVtcC9wZ19kdW1wYWxsLmMKaW5kZXggM2Ni Y2FkNjVjNWYuLjc0NmMxZjA3M2MyIDEwMDY0NAotLS0gYS9zcmMvYmluL3BnX2R1bXAvcGdfZHVt cGFsbC5jCisrKyBiL3NyYy9iaW4vcGdfZHVtcC9wZ19kdW1wYWxsLmMKQEAgLTE2MjIsOCArMTYy Miw4IEBAIGR1bXBEYXRhYmFzZXMoUEdjb25uICpjb25uLCBBcmNoaXZlRm9ybWF0IGFyY2hEdW1w Rm9ybWF0KQogewogCVBHcmVzdWx0ICAgKnJlczsKIAlpbnQJCQlpOwotCWNoYXIJCWRiX3N1YmRp cltNQVhQR1BBVEhdOwotCWNoYXIJCWRiZmlsZXBhdGhbTUFYUEdQQVRIXTsKKwlQUUV4cEJ1ZmZl ckRhdGEJZGJfc3ViZGlyOworCVBRRXhwQnVmZmVyRGF0YQlkYmZpbGVwYXRoOwogCUZJTEUJICAg Km1hcF9maWxlID0gTlVMTDsKIAogCS8qCkBAIC0xNjUzLDIwICsxNjUzLDI4IEBAIGR1bXBEYXRh YmFzZXMoUEdjb25uICpjb25uLCBBcmNoaXZlRm9ybWF0IGFyY2hEdW1wRm9ybWF0KQogCSAqLwog CWlmIChhcmNoRHVtcEZvcm1hdCAhPSBhcmNoTnVsbCkKIAl7Ci0JCWNoYXIJCW1hcF9maWxlX3Bh dGhbTUFYUEdQQVRIXTsKKwkJUFFFeHBCdWZmZXJEYXRhIG1hcF9maWxlX3BhdGg7CiAKLQkJc25w cmludGYoZGJfc3ViZGlyLCBNQVhQR1BBVEgsICIlcy9kYXRhYmFzZXMiLCBmaWxlbmFtZSk7CisJ CWluaXRQUUV4cEJ1ZmZlcigmZGJfc3ViZGlyKTsKKwkJaW5pdFBRRXhwQnVmZmVyKCZkYmZpbGVw YXRoKTsKKwkJaW5pdFBRRXhwQnVmZmVyKCZtYXBfZmlsZV9wYXRoKTsKKworCQlhcHBlbmRTaGVs bFN0cmluZygmZGJfc3ViZGlyLCBmaWxlbmFtZSk7CisJCWFwcGVuZFBRRXhwQnVmZmVyQ2hhcigm ZGJfc3ViZGlyLCAnLycpOworCQlhcHBlbmRQUUV4cEJ1ZmZlclN0cigmZGJfc3ViZGlyLCAiZGF0 YWJhc2VzIik7CiAKIAkJLyogQ3JlYXRlIGEgc3ViZGlyZWN0b3J5IHdpdGggJ2RhdGFiYXNlcycg bmFtZSB1bmRlciBtYWluIGRpcmVjdG9yeS4gKi8KLQkJaWYgKG1rZGlyKGRiX3N1YmRpciwgcGdf ZGlyX2NyZWF0ZV9tb2RlKSAhPSAwKQotCQkJcGdfZmF0YWwoImNvdWxkIG5vdCBjcmVhdGUgZGly ZWN0b3J5IFwiJXNcIjogJW0iLCBkYl9zdWJkaXIpOworCQlpZiAobWtkaXIoZGJfc3ViZGlyLmRh dGEsIHBnX2Rpcl9jcmVhdGVfbW9kZSkgIT0gMCkKKwkJCXBnX2ZhdGFsKCJjb3VsZCBub3QgY3Jl YXRlIGRpcmVjdG9yeSBcIiVzXCI6ICVtIiwgZGJfc3ViZGlyLmRhdGEpOwogCi0JCXNucHJpbnRm KG1hcF9maWxlX3BhdGgsIE1BWFBHUEFUSCwgIiVzL21hcC5kYXQiLCBmaWxlbmFtZSk7CisJCWFw cGVuZFNoZWxsU3RyaW5nKCZtYXBfZmlsZV9wYXRoLCBmaWxlbmFtZSk7CisJCWFwcGVuZFBRRXhw QnVmZmVyQ2hhcigmbWFwX2ZpbGVfcGF0aCwgJy8nKTsKKwkJYXBwZW5kUFFFeHBCdWZmZXJTdHIo Jm1hcF9maWxlX3BhdGgsICJtYXAuZGF0Iik7CiAKIAkJLyogQ3JlYXRlIGEgbWFwIGZpbGUgKHRv IHN0b3JlIGRib2lkIGFuZCBkYm5hbWUpICovCi0JCW1hcF9maWxlID0gZm9wZW4obWFwX2ZpbGVf cGF0aCwgUEdfQklOQVJZX1cpOworCQltYXBfZmlsZSA9IGZvcGVuKG1hcF9maWxlX3BhdGguZGF0 YSwgUEdfQklOQVJZX1cpOwogCQlpZiAoIW1hcF9maWxlKQotCQkJcGdfZmF0YWwoImNvdWxkIG5v dCBvcGVuIGZpbGUgXCIlc1wiOiAlbSIsIG1hcF9maWxlX3BhdGgpOworCQkJcGdfZmF0YWwoImNv dWxkIG5vdCBvcGVuIGZpbGUgXCIlc1wiOiAlbSIsIG1hcF9maWxlX3BhdGguZGF0YSk7CiAJfQog CiAJZm9yIChpID0gMDsgaSA8IFBRbnR1cGxlcyhyZXMpOyBpKyspCkBAIC0xNjkzLDEyICsxNzAx LDE2IEBAIGR1bXBEYXRhYmFzZXMoUEdjb25uICpjb25uLCBBcmNoaXZlRm9ybWF0IGFyY2hEdW1w Rm9ybWF0KQogCQkgKi8KIAkJaWYgKGFyY2hEdW1wRm9ybWF0ICE9IGFyY2hOdWxsKQogCQl7CisJ CQlyZXNldFBRRXhwQnVmZmVyKCZkYmZpbGVwYXRoKTsKKworCQkJYXBwZW5kU2hlbGxTdHJpbmco JmRiZmlsZXBhdGgsIGRiX3N1YmRpci5kYXRhKTsKKwkJCWFwcGVuZFBRRXhwQnVmZmVyQ2hhcigm ZGJmaWxlcGF0aCwgJy8nKTsKKwkJCWFwcGVuZFNoZWxsU3RyaW5nKCZkYmZpbGVwYXRoLCBvaWQp OworCiAJCQlpZiAoYXJjaER1bXBGb3JtYXQgPT0gYXJjaEN1c3RvbSkKLQkJCQlzbnByaW50Zihk YmZpbGVwYXRoLCBNQVhQR1BBVEgsICJcIiVzXCIvXCIlc1wiLmRtcCIsIGRiX3N1YmRpciwgb2lk KTsKKwkJCQlhcHBlbmRQUUV4cEJ1ZmZlclN0cigmZGJmaWxlcGF0aCwgIi5kbXAiKTsKIAkJCWVs c2UgaWYgKGFyY2hEdW1wRm9ybWF0ID09IGFyY2hUYXIpCi0JCQkJc25wcmludGYoZGJmaWxlcGF0 aCwgTUFYUEdQQVRILCAiXCIlc1wiL1wiJXNcIi50YXIiLCBkYl9zdWJkaXIsIG9pZCk7Ci0JCQll bHNlCi0JCQkJc25wcmludGYoZGJmaWxlcGF0aCwgTUFYUEdQQVRILCAiXCIlc1wiL1wiJXNcIiIs IGRiX3N1YmRpciwgb2lkKTsKKwkJCQlhcHBlbmRQUUV4cEJ1ZmZlclN0cigmZGJmaWxlcGF0aCwg Ii50YXIiKTsKIAogCQkJLyogUHV0IG9uZSBsaW5lIGVudHJ5IGZvciBkYm9pZCBhbmQgZGJuYW1l IGluIG1hcCBmaWxlLiAqLwogCQkJZnByaW50ZihtYXBfZmlsZSwgIiVzICVzXG4iLCBvaWQsIGRi bmFtZSk7CkBAIC0xNzMxLDIzICsxNzQzLDIwIEBAIGR1bXBEYXRhYmFzZXMoUEdjb25uICpjb25u LCBBcmNoaXZlRm9ybWF0IGFyY2hEdW1wRm9ybWF0KQogCQlpZiAoZmlsZW5hbWUpCiAJCQlmY2xv c2UoT1BGKTsKIAotCQlyZXQgPSBydW5QZ0R1bXAoZGJuYW1lLCBjcmVhdGVfb3B0cywgZGJmaWxl cGF0aCwgYXJjaER1bXBGb3JtYXQpOworCQlyZXQgPSBydW5QZ0R1bXAoZGJuYW1lLCBjcmVhdGVf b3B0cywgZGJmaWxlcGF0aC5kYXRhLCBhcmNoRHVtcEZvcm1hdCk7CiAJCWlmIChyZXQgIT0gMCkK IAkJCXBnX2ZhdGFsKCJwZ19kdW1wIGZhaWxlZCBvbiBkYXRhYmFzZSBcIiVzXCIsIGV4aXRpbmci LCBkYm5hbWUpOwogCi0JCWlmIChmaWxlbmFtZSkKKwkJLyoKKwkJICogRm9yIG5vbi1wbGFpbiBt b2RlLCBubyBuZWVkIHRvIHJlLW9wZW4gZmlsZSBhcyBvbmx5IG9uY2Ugd2Ugd3JpdGUKKwkJICog ZGF0YSBpbnRvIGZpbGUuCisJCSAqLworCQlpZiAoZmlsZW5hbWUgJiYgYXJjaER1bXBGb3JtYXQg PT0gYXJjaE51bGwpCiAJCXsKLQkJCWNoYXIJCWdsb2JhbF9wYXRoW01BWFBHUEFUSF07Ci0KLQkJ CWlmIChhcmNoRHVtcEZvcm1hdCAhPSBhcmNoTnVsbCkKLQkJCQlzbnByaW50ZihnbG9iYWxfcGF0 aCwgTUFYUEdQQVRILCAiJXMvZ2xvYmFsLmRhdCIsIGZpbGVuYW1lKTsKLQkJCWVsc2UKLQkJCQlz bnByaW50ZihnbG9iYWxfcGF0aCwgTUFYUEdQQVRILCAiJXMiLCBmaWxlbmFtZSk7Ci0KLQkJCU9Q RiA9IGZvcGVuKGdsb2JhbF9wYXRoLCBQR19CSU5BUllfQSk7CisJCQlPUEYgPSBmb3BlbihmaWxl bmFtZSwgUEdfQklOQVJZX0EpOwogCQkJaWYgKCFPUEYpCiAJCQkJcGdfZmF0YWwoImNvdWxkIG5v dCByZS1vcGVuIHRoZSBvdXRwdXQgZmlsZSBcIiVzXCI6ICVtIiwKLQkJCQkJCSBnbG9iYWxfcGF0 aCk7CisJCQkJCQkgZmlsZW5hbWUpOwogCQl9CiAJfQogCkBAIC0xNzc0LDE0ICsxNzgzLDE3IEBA IHJ1blBnRHVtcChjb25zdCBjaGFyICpkYm5hbWUsIGNvbnN0IGNoYXIgKmNyZWF0ZV9vcHRzLCBj aGFyICpkYmZpbGUsCiAJaW5pdFBRRXhwQnVmZmVyKCZjb25uc3RyYnVmKTsKIAlpbml0UFFFeHBC dWZmZXIoJmNtZCk7CiAKKwlwcmludGZQUUV4cEJ1ZmZlcigmY21kLCAiXCIlc1wiICVzICVzICIs IHBnX2R1bXBfYmluLAorCQkJcGdkdW1wb3B0cy0+ZGF0YSwgY3JlYXRlX29wdHMpOworCiAJLyoK IAkgKiBJZiB0aGlzIGlzIG5vdCBhIHBsYWluIGZvcm1hdCBkdW1wLCB0aGVuIGFwcGVuZCBmaWxl IG5hbWUgYW5kIGR1bXAKIAkgKiBmb3JtYXQgdG8gdGhlIHBnX2R1bXAgY29tbWFuZCB0byBnZXQg YXJjaGl2ZSBkdW1wLgogCSAqLwogCWlmIChhcmNoRHVtcEZvcm1hdCAhPSBhcmNoTnVsbCkKIAl7 Ci0JCXByaW50ZlBRRXhwQnVmZmVyKCZjbWQsICJcIiVzXCIgLWYgJXMgJXMiLCBwZ19kdW1wX2Jp biwKLQkJCQkJCSAgZGJmaWxlLCBjcmVhdGVfb3B0cyk7CisKKwkJcHJpbnRmUFFFeHBCdWZmZXIo JmNtZCwgIiAtZiAlcyAiLCBkYmZpbGUpOwogCiAJCWlmIChhcmNoRHVtcEZvcm1hdCA9PSBhcmNo RGlyZWN0b3J5KQogCQkJYXBwZW5kUFFFeHBCdWZmZXJTdHIoJmNtZCwgIiAgLS1mb3JtYXQ9ZGly ZWN0b3J5ICIpOwpAQCAtMTc5Miw5ICsxODA0LDYgQEAgcnVuUGdEdW1wKGNvbnN0IGNoYXIgKmRi bmFtZSwgY29uc3QgY2hhciAqY3JlYXRlX29wdHMsIGNoYXIgKmRiZmlsZSwKIAl9CiAJZWxzZQog CXsKLQkJcHJpbnRmUFFFeHBCdWZmZXIoJmNtZCwgIlwiJXNcIiAlcyAlcyIsIHBnX2R1bXBfYmlu LAotCQkJCQkJICBwZ2R1bXBvcHRzLT5kYXRhLCBjcmVhdGVfb3B0cyk7Ci0KIAkJLyoKIAkJICog SWYgd2UgaGF2ZSBhIGZpbGVuYW1lLCB1c2UgdGhlIHVuZG9jdW1lbnRlZCBwbGFpbi1hcHBlbmQg cGdfZHVtcAogCQkgKiBmb3JtYXQuCmRpZmYgLS1naXQgYS9zcmMvYmluL3BnX2R1bXAvcGdfcmVz dG9yZS5jIGIvc3JjL2Jpbi9wZ19kdW1wL3BnX3Jlc3RvcmUuYwppbmRleCA2ZWY3ODljYjA2ZC4u NGJiMTA5NzE4ODQgMTAwNjQ0Ci0tLSBhL3NyYy9iaW4vcGdfZHVtcC9wZ19yZXN0b3JlLmMKKysr IGIvc3JjL2Jpbi9wZ19kdW1wL3BnX3Jlc3RvcmUuYwpAQCAtMTAzOCw3ICsxMDM4LDcgQEAgZ2V0 X2RibmFtZV9vaWRfbGlzdF9mcm9tX21maWxlKGNvbnN0IGNoYXIgKmR1bXBkaXJwYXRoLCBTaW1w bGVQdHJMaXN0ICpkYm5hbWVfb2kKIHsKIAlTdHJpbmdJbmZvRGF0YSBsaW5lYnVmOwogCUZJTEUJ ICAgKnBmaWxlOwotCWNoYXIJCW1hcF9maWxlX3BhdGhbTUFYUEdQQVRIXTsKKwlQUUV4cEJ1ZmZl ckRhdGEJCW1hcF9maWxlX3BhdGg7CiAJaW50CQkJY291bnQgPSAwOwogCiAKQEAgLTEwNTIsMTMg KzEwNTIsMTYgQEAgZ2V0X2RibmFtZV9vaWRfbGlzdF9mcm9tX21maWxlKGNvbnN0IGNoYXIgKmR1 bXBkaXJwYXRoLCBTaW1wbGVQdHJMaXN0ICpkYm5hbWVfb2kKIAkJcmV0dXJuIDA7CiAJfQogCi0J c25wcmludGYobWFwX2ZpbGVfcGF0aCwgTUFYUEdQQVRILCAiJXMvbWFwLmRhdCIsIGR1bXBkaXJw YXRoKTsKKwlpbml0UFFFeHBCdWZmZXIoJm1hcF9maWxlX3BhdGgpOworCWFwcGVuZFNoZWxsU3Ry aW5nKCZtYXBfZmlsZV9wYXRoLCBkdW1wZGlycGF0aCk7CisJYXBwZW5kUFFFeHBCdWZmZXJDaGFy KCZtYXBfZmlsZV9wYXRoLCAnLycpOworCWFwcGVuZFBRRXhwQnVmZmVyU3RyKCZtYXBfZmlsZV9w YXRoLCAibWFwLmRhdCIpOwogCiAJLyogT3BlbiBtYXAuZGF0IGZpbGUuICovCi0JcGZpbGUgPSBm b3BlbihtYXBfZmlsZV9wYXRoLCBQR19CSU5BUllfUik7CisJcGZpbGUgPSBmb3BlbihtYXBfZmls ZV9wYXRoLmRhdGEsIFBHX0JJTkFSWV9SKTsKIAogCWlmIChwZmlsZSA9PSBOVUxMKQotCQlwZ19m YXRhbCgiY291bGQgbm90IG9wZW4gZmlsZSBcIiVzXCI6ICVtIiwgbWFwX2ZpbGVfcGF0aCk7CisJ CXBnX2ZhdGFsKCJjb3VsZCBub3Qgb3BlbiBmaWxlIFwiJXNcIjogJW0iLCBtYXBfZmlsZV9wYXRo LmRhdGEpOwogCiAJaW5pdFN0cmluZ0luZm8oJmxpbmVidWYpOwogCkBAIC0xMDg2LDExICsxMDg5 LDExIEBAIGdldF9kYm5hbWVfb2lkX2xpc3RfZnJvbV9tZmlsZShjb25zdCBjaGFyICpkdW1wZGly cGF0aCwgU2ltcGxlUHRyTGlzdCAqZGJuYW1lX29pCiAKIAkJLyogUmVwb3J0IGVycm9yIGFuZCBl eGl0IGlmIHRoZSBmaWxlIGhhcyBhbnkgY29ycnVwdGVkIGRhdGEuICovCiAJCWlmICghT2lkSXNW YWxpZChkYl9vaWQpIHx8IG5hbWVsZW4gPD0gMSkKLQkJCXBnX2ZhdGFsKCJpbnZhbGlkIGVudHJ5 IGluIGZpbGUgXCIlc1wiIG9uIGxpbmUgJWQiLCBtYXBfZmlsZV9wYXRoLAorCQkJcGdfZmF0YWwo ImludmFsaWQgZW50cnkgaW4gZmlsZSBcIiVzXCIgb24gbGluZSAlZCIsIG1hcF9maWxlX3BhdGgu ZGF0YSwKIAkJCQkJIGNvdW50ICsgMSk7CiAKIAkJcGdfbG9nX2luZm8oImZvdW5kIGRhdGFiYXNl IFwiJXNcIiAoT0lEOiAldSkgaW4gZmlsZSBcIiVzXCIiLAotCQkJCQlkYm5hbWUsIGRiX29pZCwg bWFwX2ZpbGVfcGF0aCk7CisJCQkJCWRibmFtZSwgZGJfb2lkLCBtYXBfZmlsZV9wYXRoLmRhdGEp OwogCiAJCWRiaWRuYW1lID0gcGdfbWFsbG9jKG9mZnNldG9mKERiT2lkTmFtZSwgc3RyKSArIG5h bWVsZW4gKyAxKTsKIAkJZGJpZG5hbWUtPm9pZCA9IGRiX29pZDsKQEAgLTEzMDYsMjAgKzEzMDks MjMgQEAgcmVzdG9yZV9hbGxfZGF0YWJhc2VzKFBHY29ubiAqY29ubiwgY29uc3QgY2hhciAqZHVt cGRpcnBhdGgsCiBzdGF0aWMgaW50CiBwcm9jZXNzX2dsb2JhbF9zcWxfY29tbWFuZHMoUEdjb25u ICpjb25uLCBjb25zdCBjaGFyICpkdW1wZGlycGF0aCwgY29uc3QgY2hhciAqb3V0ZmlsZSkKIHsK LQljaGFyCQlnbG9iYWxfZmlsZV9wYXRoW01BWFBHUEFUSF07CisJUFFFeHBCdWZmZXJEYXRhCQln bG9iYWxfZmlsZV9wYXRoOwogCVBHcmVzdWx0ICAgKnJlc3VsdDsKIAlTdHJpbmdJbmZvRGF0YSBz cWxzdGF0ZW1lbnQsCiAJCQkJdXNlcl9jcmVhdGU7CiAJRklMRQkgICAqcGZpbGU7CiAJaW50CQkJ bl9lcnJvcnMgPSAwOwogCi0Jc25wcmludGYoZ2xvYmFsX2ZpbGVfcGF0aCwgTUFYUEdQQVRILCAi JXMvZ2xvYmFsLmRhdCIsIGR1bXBkaXJwYXRoKTsKKwlpbml0UFFFeHBCdWZmZXIoJmdsb2JhbF9m aWxlX3BhdGgpOworCWFwcGVuZFNoZWxsU3RyaW5nKCZnbG9iYWxfZmlsZV9wYXRoLCBkdW1wZGly cGF0aCk7CisJYXBwZW5kUFFFeHBCdWZmZXJDaGFyKCZnbG9iYWxfZmlsZV9wYXRoLCAnLycpOwor CWFwcGVuZFBRRXhwQnVmZmVyU3RyKCZnbG9iYWxfZmlsZV9wYXRoLCAiZ2xvYmFsLmRhdCIpOwog CiAJLyogT3BlbiBnbG9iYWwuZGF0IGZpbGUuICovCi0JcGZpbGUgPSBmb3BlbihnbG9iYWxfZmls ZV9wYXRoLCBQR19CSU5BUllfUik7CisJcGZpbGUgPSBmb3BlbihnbG9iYWxfZmlsZV9wYXRoLmRh dGEsIFBHX0JJTkFSWV9SKTsKIAogCWlmIChwZmlsZSA9PSBOVUxMKQotCQlwZ19mYXRhbCgiY291 bGQgbm90IG9wZW4gZmlsZSBcIiVzXCI6ICVtIiwgZ2xvYmFsX2ZpbGVfcGF0aCk7CisJCXBnX2Zh dGFsKCJjb3VsZCBub3Qgb3BlbiBmaWxlIFwiJXNcIjogJW0iLCBnbG9iYWxfZmlsZV9wYXRoLmRh dGEpOwogCiAJLyoKIAkgKiBJZiBvdXRmaWxlIGlzIGdpdmVuLCB0aGVuIGp1c3QgY29weSBhbGwg Z2xvYmFsLmRhdCBmaWxlIGRhdGEgaW50bwpAQCAtMTM2OSw3ICsxMzc1LDcgQEAgcHJvY2Vzc19n bG9iYWxfc3FsX2NvbW1hbmRzKFBHY29ubiAqY29ubiwgY29uc3QgY2hhciAqZHVtcGRpcnBhdGgs IGNvbnN0IGNoYXIgKm8KIAlpZiAobl9lcnJvcnMpCiAJCXBnX2xvZ193YXJuaW5nKG5nZXR0ZXh0 KCJpZ25vcmVkICVkIGVycm9yIGluIGZpbGUgXCIlc1wiIiwKIAkJCQkJCQkJImlnbm9yZWQgJWQg ZXJyb3JzIGluIGZpbGUgXCIlc1wiIiwgbl9lcnJvcnMpLAotCQkJCQkgICBuX2Vycm9ycywgZ2xv YmFsX2ZpbGVfcGF0aCk7CisJCQkJCSAgIG5fZXJyb3JzLCBnbG9iYWxfZmlsZV9wYXRoLmRhdGEp OwogCWZjbG9zZShwZmlsZSk7CiAKIAlyZXR1cm4gbl9lcnJvcnM7Ci0tIAoyLjM5LjMKCg== --0000000000008cc357063a1d56a2--