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.98.2) (envelope-from ) id 1x79xs-000000009yZ-1EXm for pgsql-hackers@arkaria.postgresql.org; Thu, 17 Sep 2026 11:07:41 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.98.2) (envelope-from ) id 1x79xr-00000003wJV-2Lb0 for pgsql-hackers@arkaria.postgresql.org; Thu, 17 Sep 2026 11:07:39 +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.98.2) (envelope-from ) id 1x79xr-00000003wJJ-07FC for pgsql-hackers@lists.postgresql.org; Thu, 17 Sep 2026 11:07:39 +0000 Received: from mail.postgrespro.ru ([93.174.132.70]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.98.2) (envelope-from ) id 1x79xn-00000000zni-234h for pgsql-hackers@lists.postgresql.org; Thu, 17 Sep 2026 11:07:38 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mx2023; t=1789643256; bh=4olg1mQVgwG04857jMpXu4h40OiR1gxqViVDsZ3KE3Y=; h=Message-ID:Date:User-Agent:Subject:To:Cc:References:From: In-Reply-To:From; b=JLhSxWQ1d3pc3rWnsw7DnYoHThlGzX/+iU/gUrxbDfJF16SKuD4Um3myVf1WRr0NB 39NgdV3I2AgW3u/gc3q0W4B4ASFl6BCA3A11ZlVluIMA1/VPSHQEEiBfHMm2hLmzP3 dJ5a7FOJpZhVdIF9diXyIkFc6m72JdDZSxl7uoX1O21pzKG4W2tmYHgDgjDWBn5Aed g1rnBw4tHqpB5rVumD1tqdjp1xuegOctWehJo5HvrWQ6BYVor46q7T+TamH69I+Qw2 msfbBw2V1+AbNPZ4yR8uwIBiLcFO957iT94S+OrKuvdDLolDfJmqd0DA6nnpzlfnyE HIiAeq2sCtqXA== Received: from [10.8.4.218] (unknown [95.170.154.43]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange x25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (Client did not present a certificate) (Authenticated sender: d.bondar@postgrespro.ru) by mail.postgrespro.ru (Postfix/465) with ESMTPSA id A8D7B61716; Thu, 17 Sep 2026 14:07:35 +0300 (MSK) Content-Type: multipart/mixed; boundary="------------aLYWsDn2CVjoVaC8LXd9rjMC" Message-ID: <9ac169f5-5c83-4980-bd28-27e4fe682453@postgrespro.ru> Date: Thu, 17 Sep 2026 18:06:27 +0700 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Pgbench: remove synchronous prepare To: Andrey Borodin Cc: Robert Haas , pgsql-hackers mailing list References: <2da56b59-acb6-4ee3-af6b-6e800115dc7f@postgrespro.ru> <6e161344-d26a-4e3d-aa12-83a05a3ca8dc@postgrespro.ru> <6cf1ae29-0992-4a14-a52f-b769b560b92a@postgrespro.ru> <3f24365a-c440-47de-88cf-7ee7cd02c7dd@postgrespro.ru> <502eb70c-658f-ae0e-780b-e9ebe7104db3@postgrespro.ru> Content-Language: en-US From: Dmitrii Bondar In-Reply-To: X-KSMG-AntiPhishing: NotDetected X-KSMG-AntiSpam-Interceptor-Info: not scanned X-KSMG-AntiSpam-Status: not scanned, disabled by settings X-KSMG-AntiVirus: Kaspersky Secure Mail Gateway, version 3.0.0.9059, bases: 2026/09/17 08:34:00 #28593952 X-KSMG-AntiVirus-Status: NotDetected, skipped X-KSMG-LinksScanning: not scanned, disabled by settings X-KSMG-Message-Action: skipped X-KSMG-Rule-ID: 1 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------aLYWsDn2CVjoVaC8LXd9rjMC Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Hi, Andrey! > Returning to CSTATE_START_COMMAND after preparing resets stmt_begin. > This drops the prepare time from --report-per-command. In a local test, > blocking Prepare on a table lock gave 4436 ms transaction latency > but only 0.401 ms statement latency. Could we send the query without > resetting the command timer? Removed a transfer to CSTATE_START_COMMAND and just used sendCommand from the new state. > The second PQgetResult() in CSTATE_WAIT_PREPARE_RESULT can still block: > the first returns ParseComplete, but the next must wait for > ReadyForQuery if it has not arrived yet. The error path also drains > results synchronously through getSQLErrorStatus(). Similar reads > already exist elsewhere in pgbench, but this leaves a blocking window > in the new prepare path. Could we wait for completion through the > event loop? A connection failure between the two results can also > make the second call return an error rather than the asserted NULL. Spit the state into two stages to avoid blocking. Added an event loop to the error path. > I also found a way to test the main fix without PgBouncer. With > -c 2 -j 1, use client_id to make client 0 select from a table locked > by another session in ACCESS EXCLUSIVE mode, and client 1 insert into > a different table. In local runs, client 1 made progress while > client 0 was blocked in Prepare with v4, but not without the patch. > This would test the intended behavior more directly than the changed > syntax-error expectation. Implemented. > I am fine with leaving prepareCommandsInPipeline() for a separate patch. > Could the commit message describe this as a scope choice? Preparing > before PQenterPipelineMode() preserves the required ordering, but does > not require blocking the worker thread. The prepared-flag fix is also > limited to the non-pipeline path: prepareCommand() still sets the flag > after an error. Fixed the flag and added a note to the commit message. Looks much better now, thank you for reviewing the patch! -- Regards, Dmitrii Bondar. --------------aLYWsDn2CVjoVaC8LXd9rjMC Content-Type: text/x-patch; charset=UTF-8; name="v5-0001-Remove-synchronous-prepare-from-pgbench.patch" Content-Disposition: attachment; filename="v5-0001-Remove-synchronous-prepare-from-pgbench.patch" Content-Transfer-Encoding: base64 RnJvbSAzMTBmZTg1NjQ1NzIyMjgyOGRlMjc2MTE2NjY2NjA4ZGE0ZGQzOGIxIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBEbWl0cmlpIEJvbmRhciA8ZC5ib25kYXJAcG9zdGdy ZXNwcm8ucnU+CkRhdGU6IFRodSwgMTcgU2VwIDIwMjYgMTY6MzI6MzAgKzA3MDAKU3ViamVj dDogW1BBVENIIHY1XSBSZW1vdmUgc3luY2hyb25vdXMgcHJlcGFyZSBmcm9tIHBnYmVuY2gK CldpdGggdGhlIHByZXBhcmVkIHByb3RvY29sICgtTSBwcmVwYXJlZCksIHBnYmVuY2ggcHJl cGFyZXMgZWFjaCBTUUwKY29tbWFuZCB3aXRoIHRoZSBibG9ja2luZyBQUXByZXBhcmUoKSBi ZWZvcmUgZXhlY3V0aW5nIGl0LiAgTm90aGluZwplbHNlIGNhbiBiZSBwcm9jZXNzZWQgaW4g dGhlIG1lYW50aW1lLCB3aGljaCBtYWtlcyB0aGUgcHJlcGFyZWQKcHJvdG9jb2wgdW51c2Fi bGUgYmVoaW5kIHBvb2xlcnMgdGhhdCBzZXJpYWxpemUgYSBzZXNzaW9uJ3MgY29tbWFuZHMK KHN1Y2ggYXMgUGdCb3VuY2VyIGluIHNlc3Npb24gcG9vbGluZyBtb2RlKTogdGhlIHdob2xl IGNsaWVudCBzdGFsbHMKd2hpbGUgdGhlIFByZXBhcmUgd2FpdHMuCgpSZXBsYWNlIHRoZSBi bG9ja2luZyBQUXByZXBhcmUoKSBpbiBzZW5kQ29tbWFuZCgpIHdpdGggYW4gYXN5bmNocm9u b3VzClBRc2VuZFByZXBhcmUoKSwgZHJpdmVuIGJ5IGEgbmV3IENTVEFURV9XQUlUX1BSRVBB UkVfUkVTVUxUIHN0YXRlLgoKVGhlIHByZXBhcmUgZmFpbHVyZSBwYXRoIHJlYWRzIHRoZSBz cWxzdGF0ZSBmcm9tIHRoZSBlcnJvciByZXN1bHQgd2l0aAp0aGUgbmV3IGdldFNRTEVycm9y U3RhdHVzRnJvbVJlc3VsdCgpIGhlbHBlciwgd2hpY2gsIHVubGlrZQpnZXRTUUxFcnJvclN0 YXR1cygpLCBkb2VzIG5vdCByZWFkIG9yIGRpc2NhcmQgYW55dGhpbmcgZnJvbSB0aGUKY29u bmVjdGlvbi4KClRoZSBwaXBlbGluZSBwYXRoIGlzIGxlZnQgc3luY2hyb25vdXMgb24gcHVy cG9zZSAoc2NvcGUgY2hvaWNlKS4KLS0tCiBzcmMvYmluL3BnYmVuY2gvcGdiZW5jaC5jICAg ICAgICAgICAgICAgICAgICB8IDI2MSArKysrKysrKysrKysrKysrKy0tCiBzcmMvYmluL3Bn YmVuY2gvdC8wMDFfcGdiZW5jaF93aXRoX3NlcnZlci5wbCB8ICA1NSArKystCiAyIGZpbGVz IGNoYW5nZWQsIDI5MyBpbnNlcnRpb25zKCspLCAyMyBkZWxldGlvbnMoLSkKCmRpZmYgLS1n aXQgYS9zcmMvYmluL3BnYmVuY2gvcGdiZW5jaC5jIGIvc3JjL2Jpbi9wZ2JlbmNoL3BnYmVu Y2guYwppbmRleCAxODFmMGQ4OTJlZi4uZWQ5NjliZDMzYmYgMTAwNjQ0Ci0tLSBhL3NyYy9i aW4vcGdiZW5jaC9wZ2JlbmNoLmMKKysrIGIvc3JjL2Jpbi9wZ2JlbmNoL3BnYmVuY2guYwpA QCAtNTM3LDYgKzUzNywxMyBAQCB0eXBlZGVmIGVudW0KIAkgKiBDU1RBVEVfV0FJVF9SRVNV TFQgd2FpdHMgdW50aWwgd2UgZ2V0IGEgcmVzdWx0IHNldCBiYWNrIGZyb20gdGhlIHNlcnZl cgogCSAqIGZvciB0aGUgY3VycmVudCBjb21tYW5kLgogCSAqCisJICogQ1NUQVRFX1dBSVRf UFJFUEFSRV9SRVNVTFQgd2FpdHMgZm9yIHRoZSByZXN1bHQgb2YgYW4gYXN5bmMKKwkgKiBQ UXNlbmRQcmVwYXJlIGlzc3VlZCBmcm9tIENTVEFURV9TVEFSVF9DT01NQU5EIGluIFFVRVJZ X1BSRVBBUkVEIG1vZGUuCisJICogSXQgaGFzIHR3byBwaGFzZXMsIHRyYWNrZWQgYnkgc3Qt PnByZXBhcmVfcmVzdWx0X2NvbnN1bWVkOiBmaXJzdCB0aGUKKwkgKiByZXN1bHQgb2YgdGhl IFByZXBhcmUgaXRzZWxmIGlzIHJlYWQsIHRoZW4gdGhlIHRyYWlsaW5nIE5VTEwgcmVzdWx0 CisJICogdGhhdCBmb2xsb3dzIGl0LiBCb3RoIGFyZSBjb25zdW1lZCB0aHJvdWdoIHRoZSBl dmVudCBsb29wLCBhcyB3YWl0aW5nCisJICogZm9yIHRoZW0gY2FuIGJsb2NrLgorCSAqCiAJ ICogQ1NUQVRFX1NMRUVQIHdhaXRzIHVudGlsIHRoZSBlbmQgb2YgXHNsZWVwLgogCSAqCiAJ ICogQ1NUQVRFX0VORF9DT01NQU5EIHJlY29yZHMgdGhlIGVuZC1vZi1jb21tYW5kIHRpbWVz dGFtcCwgaW5jcmVtZW50cyB0aGUKQEAgLTU0OSw2ICs1NTYsNyBAQCB0eXBlZGVmIGVudW0K IAkgKi8KIAlDU1RBVEVfU1RBUlRfQ09NTUFORCwKIAlDU1RBVEVfV0FJVF9SRVNVTFQsCisJ Q1NUQVRFX1dBSVRfUFJFUEFSRV9SRVNVTFQsCiAJQ1NUQVRFX1NMRUVQLAogCUNTVEFURV9F TkRfQ09NTUFORCwKIAlDU1RBVEVfU0tJUF9DT01NQU5ELApAQCAtNjMxLDYgKzYzOSwxMyBA QCB0eXBlZGVmIHN0cnVjdAogCS8qIHdoZXRoZXIgY2xpZW50IHByZXBhcmVkIGVhY2ggY29t bWFuZCBvZiBlYWNoIHNjcmlwdCAqLwogCWJvb2wJICAqKnByZXBhcmVkOwogCisJLyoKKwkg KiBTdWItc3RhdGUgZm9yIENTVEFURV9XQUlUX1BSRVBBUkVfUkVTVUxUOiB0cnVlIG9uY2Ug dGhlIHJlc3VsdCBvZiB0aGUKKwkgKiBhc3luYyBQcmVwYXJlIGl0c2VsZiBoYXMgYmVlbiBj b25zdW1lZDsgdGhlIHRyYWlsaW5nIE5VTEwgcmVzdWx0IHN0aWxsCisJICogcmVtYWlucyB0 byBiZSByZWFkIGF0IHRoYXQgcG9pbnQuCisJICovCisJYm9vbAkJcHJlcGFyZV9yZXN1bHRf Y29uc3VtZWQ7CisKIAkvKgogCSAqIEZvciBwcm9jZXNzaW5nIGZhaWx1cmVzIGFuZCByZXBl YXRpbmcgdHJhbnNhY3Rpb25zIHdpdGggc2VyaWFsaXphdGlvbgogCSAqIG9yIGRlYWRsb2Nr IGVycm9yczoKQEAgLTMxMDMsMTEgKzMxMTgsMzYgQEAgcHJlcGFyZUNvbW1hbmQoQ1N0YXRl ICpzdCwgaW50IGNvbW1hbmRfbnVtKQogCQkJCQkJY29tbWFuZC0+YXJndlswXSwgY29tbWFu ZC0+YXJnYyAtIDEsIE5VTEwpOwogCQlpZiAoUFFyZXN1bHRTdGF0dXMocmVzKSAhPSBQR1JF U19DT01NQU5EX09LKQogCQkJcGdfbG9nX2Vycm9yKCIlcyIsIFBRZXJyb3JNZXNzYWdlKHN0 LT5jb24pKTsKKwkJZWxzZQorCQkJc3QtPnByZXBhcmVkW3N0LT51c2VfZmlsZV1bY29tbWFu ZF9udW1dID0gdHJ1ZTsKIAkJUFFjbGVhcihyZXMpOwotCQlzdC0+cHJlcGFyZWRbc3QtPnVz ZV9maWxlXVtjb21tYW5kX251bV0gPSB0cnVlOwogCX0KIH0KIAorLyoKKyAqIEFzeW5jaHJv bm91c2x5IHN0YXJ0IHByZXBhcmluZyB0aGUgU1FMIGNvbW1hbmQgZnJvbSBzdC0+dXNlX2Zp bGUgYXQKKyAqIGNvbW1hbmRfbnVtLiAgVGhlIGNhbGxlciBtdXN0IHRoZW4gd2FpdCBmb3Ig dGhlIHJlc3VsdCBpbgorICogQ1NUQVRFX1dBSVRfUFJFUEFSRV9SRVNVTFQgYW5kIHNldCB0 aGUgcHJlcGFyZWQgZmxhZyBvbmx5IGFmdGVyIHRoZQorICogcmVzdWx0IGlzIHJlYWQgc3Vj Y2Vzc2Z1bGx5LgorICoKKyAqIFRoaXMgbXVzdCBub3QgYmUgdXNlZCBpbiBwaXBlbGluZSBt b2RlOiBwaXBlbGluZSBjb21tYW5kcyBhcmUgYWx3YXlzCisgKiBwcmUtcHJlcGFyZWQgc3lu Y2hyb25vdXNseSBieSBwcmVwYXJlQ29tbWFuZHNJblBpcGVsaW5lKCkKKyAqLworc3RhdGlj IGJvb2wKK3NlbmRQcmVwYXJlQ29tbWFuZChDU3RhdGUgKnN0LCBpbnQgY29tbWFuZF9udW0p Cit7CisJQ29tbWFuZCAgICAqY29tbWFuZCA9IHNxbF9zY3JpcHRbc3QtPnVzZV9maWxlXS5j b21tYW5kc1tjb21tYW5kX251bV07CisKKwlBc3NlcnQoY29tbWFuZC0+dHlwZSA9PSBTUUxf Q09NTUFORCk7CisJQXNzZXJ0KHN0LT5wcmVwYXJlZCAhPSBOVUxMKTsKKwlBc3NlcnQoIXN0 LT5wcmVwYXJlZFtzdC0+dXNlX2ZpbGVdW2NvbW1hbmRfbnVtXSk7CisJQXNzZXJ0KFBRcGlw ZWxpbmVTdGF0dXMoc3QtPmNvbikgPT0gUFFfUElQRUxJTkVfT0ZGKTsKKworCXBnX2xvZ19k ZWJ1ZygiY2xpZW50ICVkIHByZXBhcmluZyAlcyIsIHN0LT5pZCwgY29tbWFuZC0+cHJlcG5h bWUpOworCXJldHVybiBQUXNlbmRQcmVwYXJlKHN0LT5jb24sIGNvbW1hbmQtPnByZXBuYW1l LAorCQkJCQkJIGNvbW1hbmQtPmFyZ3ZbMF0sIGNvbW1hbmQtPmFyZ2MgLSAxLCBOVUxMKSAh PSAwOworfQorCiAvKgogICogUHJlcGFyZSBhbGwgdGhlIGNvbW1hbmRzIGluIHRoZSBzY3Jp cHQgdGhhdCBjb21lIGFmdGVyIHRoZSBcc3RhcnRwaXBlbGluZQogICogdGhhdCdzIGF0IHBv c2l0aW9uIHN0LT5jb21tYW5kLCBhbmQgdGhlIGZpcnN0IFxlbmRwaXBlbGluZSB3ZSBmaW5k LgpAQCAtMzE0Nyw4ICszMTg3LDE3IEBAIHByZXBhcmVDb21tYW5kc0luUGlwZWxpbmUoQ1N0 YXRlICpzdCkKIAlzdC0+cHJlcGFyZWRbc3QtPnVzZV9maWxlXVtzdC0+Y29tbWFuZF0gPSB0 cnVlOwogfQogCisvKiBSZXN1bHQgb2Ygc2VuZENvbW1hbmQoKS4gKi8KK3R5cGVkZWYgZW51 bQoreworCVNFTkRfRkFJTEVELAorCVNFTkRfT0ssCQkJCQkvKiBzZW50OyB3YWl0IGZvciBx dWVyeSByZXN1bHQgKi8KKwlTRU5EX1BSRVBBUkVfUEVORElORywJCS8qIGFzeW5jIFByZXBh cmUgaXNzdWVkOyB3YWl0IGZvciBwcmVwYXJlCisJCQkJCQkJCSAqIHJlc3VsdCAqLworfQkJ CVNlbmRDb21tYW5kUmVzdWx0OworCiAvKiBTZW5kIGEgU1FMIGNvbW1hbmQsIHVzaW5nIHRo ZSBjaG9zZW4gcXVlcnltb2RlICovCi1zdGF0aWMgYm9vbAorc3RhdGljIFNlbmRDb21tYW5k UmVzdWx0CiBzZW5kQ29tbWFuZChDU3RhdGUgKnN0LCBDb21tYW5kICpjb21tYW5kKQogewog CWludAkJCXI7CkBAIC0zMTc5LDcgKzMyMjgsMjggQEAgc2VuZENvbW1hbmQoQ1N0YXRlICpz dCwgQ29tbWFuZCAqY29tbWFuZCkKIAl7CiAJCWNvbnN0IGNoYXIgKnBhcmFtc1tNQVhfQVJH U107CiAKLQkJcHJlcGFyZUNvbW1hbmQoc3QsIHN0LT5jb21tYW5kKTsKKwkJaWYgKCFzdC0+ cHJlcGFyZWQpCisJCQlhbGxvY0NTdGF0ZVByZXBhcmVkKHN0KTsKKworCQlpZiAoIXN0LT5w cmVwYXJlZFtzdC0+dXNlX2ZpbGVdW3N0LT5jb21tYW5kXSkKKwkJeworCQkJLyoKKwkJCSAq IElmIGEgcGlwZWxpbmUgcHJlcGFyZSBmYWlsZWQsIGl0cyBmbGFnIGlzIG5vdCBzZXQsIHNv IHRoaXMKKwkJCSAqIHN0YXRlIGlzIHJlYWNoYWJsZTsgYmFpbCBvdXQgcmF0aGVyIHRoYW4g aXNzdWluZyBhbgorCQkJICogYXN5bmNocm9ub3VzIFByZXBhcmUgaW4gdGhlIG1pZGRsZSBv ZiBhIHBpcGVsaW5lLgorCQkJICovCisJCQlpZiAoUFFwaXBlbGluZVN0YXR1cyhzdC0+Y29u KSAhPSBQUV9QSVBFTElORV9PRkYpCisJCQkJcmV0dXJuIFNFTkRfRkFJTEVEOworCisJCQlp ZiAoIXNlbmRQcmVwYXJlQ29tbWFuZChzdCwgc3QtPmNvbW1hbmQpKQorCQkJeworCQkJCXBn X2xvZ19kZWJ1ZygiY2xpZW50ICVkIGNvdWxkIG5vdCBzZW5kICVzIiwKKwkJCQkJCQkgc3Qt PmlkLCBjb21tYW5kLT5hcmd2WzBdKTsKKwkJCQlyZXR1cm4gU0VORF9GQUlMRUQ7CisJCQl9 CisJCQlyZXR1cm4gU0VORF9QUkVQQVJFX1BFTkRJTkc7CisJCX0KKwogCQlnZXRRdWVyeVBh cmFtcygmc3QtPnZhcmlhYmxlcywgY29tbWFuZCwgcGFyYW1zKTsKIAogCQlwZ19sb2dfZGVi dWcoImNsaWVudCAlZCBzZW5kaW5nICVzIiwgc3QtPmlkLCBjb21tYW5kLT5wcmVwbmFtZSk7 CkBAIC0zMTkyLDEwICszMjYyLDEwIEBAIHNlbmRDb21tYW5kKENTdGF0ZSAqc3QsIENvbW1h bmQgKmNvbW1hbmQpCiAJaWYgKHIgPT0gMCkKIAl7CiAJCXBnX2xvZ19kZWJ1ZygiY2xpZW50 ICVkIGNvdWxkIG5vdCBzZW5kICVzIiwgc3QtPmlkLCBjb21tYW5kLT5hcmd2WzBdKTsKLQkJ cmV0dXJuIGZhbHNlOworCQlyZXR1cm4gU0VORF9GQUlMRUQ7CiAJfQogCWVsc2UKLQkJcmV0 dXJuIHRydWU7CisJCXJldHVybiBTRU5EX09LOwogfQogCiAvKgpAQCAtMzIyNywxNSArMzI5 NywxNCBAQCBkaXNjYXJkQXZhaWxhYmxlUmVzdWx0cyhDU3RhdGUgKnN0KQogfQogCiAvKgot ICogRGV0ZXJtaW5lIHRoZSBlcnJvciBzdGF0dXMgYmFzZWQgb24gdGhlIGNvbm5lY3Rpb24g c3RhdHVzIGFuZCBlcnJvciBjb2RlLgorICogRGV0ZXJtaW5lIHRoZSBlcnJvciBzdGF0dXMg ZnJvbSBhbiBlcnJvciByZXN1bHQncyBzcWxzdGF0ZS4KKyAqCisgKiBVbmxpa2UgZ2V0U1FM RXJyb3JTdGF0dXMoKSwgdGhpcyBkb2VzIG5vdCByZWFkIG9yIGRpc2NhcmQgYW55dGhpbmcg ZnJvbSB0aGUKKyAqIGNvbm5lY3Rpb24sIHNvIGl0IGlzIHNhZmUgdG8gdXNlIGluIHN0YXRl cyB0aGF0IG11c3Qgbm90IGJsb2NrCiAgKi8KIHN0YXRpYyBFU3RhdHVzCi1nZXRTUUxFcnJv clN0YXR1cyhDU3RhdGUgKnN0LCBjb25zdCBjaGFyICpzcWxTdGF0ZSkKK2dldFNRTEVycm9y U3RhdHVzRnJvbVJlc3VsdChjb25zdCBjaGFyICpzcWxTdGF0ZSkKIHsKLQlkaXNjYXJkQXZh aWxhYmxlUmVzdWx0cyhzdCk7Ci0JaWYgKFBRc3RhdHVzKHN0LT5jb24pID09IENPTk5FQ1RJ T05fQkFEKQotCQlyZXR1cm4gRVNUQVRVU19DT05OX0VSUk9SOwotCiAJaWYgKHNxbFN0YXRl ICE9IE5VTEwpCiAJewogCQlpZiAoc3RyY21wKHNxbFN0YXRlLCBFUlJDT0RFX1RfUl9TRVJJ QUxJWkFUSU9OX0ZBSUxVUkUpID09IDApCkBAIC0zMjQ3LDYgKzMzMTYsMTkgQEAgZ2V0U1FM RXJyb3JTdGF0dXMoQ1N0YXRlICpzdCwgY29uc3QgY2hhciAqc3FsU3RhdGUpCiAJcmV0dXJu IEVTVEFUVVNfT1RIRVJfU1FMX0VSUk9SOwogfQogCisvKgorICogRGV0ZXJtaW5lIHRoZSBl cnJvciBzdGF0dXMgYmFzZWQgb24gdGhlIGNvbm5lY3Rpb24gc3RhdHVzIGFuZCBlcnJvciBj b2RlLgorICovCitzdGF0aWMgRVN0YXR1cworZ2V0U1FMRXJyb3JTdGF0dXMoQ1N0YXRlICpz dCwgY29uc3QgY2hhciAqc3FsU3RhdGUpCit7CisJZGlzY2FyZEF2YWlsYWJsZVJlc3VsdHMo c3QpOworCWlmIChQUXN0YXR1cyhzdC0+Y29uKSA9PSBDT05ORUNUSU9OX0JBRCkKKwkJcmV0 dXJuIEVTVEFUVVNfQ09OTl9FUlJPUjsKKworCXJldHVybiBnZXRTUUxFcnJvclN0YXR1c0Zy b21SZXN1bHQoc3FsU3RhdGUpOworfQorCiAvKgogICogUmV0dXJucyB0cnVlIGlmIHRoaXMg dHlwZSBvZiBlcnJvciBjYW4gYmUgcmV0cmllZC4KICAqLwpAQCAtMzkwNywxOCArMzk4OSwy MiBAQCBhZHZhbmNlQ29ubmVjdGlvblN0YXRlKFRTdGF0ZSAqdGhyZWFkLCBDU3RhdGUgKnN0 LCBTdGF0c0RhdGEgKmFnZykKIAkJCQkJCX0KIAkJCQkJfQogCi0JCQkJCWlmICghc2VuZENv bW1hbmQoc3QsIGNvbW1hbmQpKQotCQkJCQl7Ci0JCQkJCQljb21tYW5kRmFpbGVkKHN0LCAi U1FMIiwgIlNRTCBjb21tYW5kIHNlbmQgZmFpbGVkIik7Ci0JCQkJCQlzdC0+c3RhdGUgPSBD U1RBVEVfQUJPUlRFRDsKLQkJCQkJfQotCQkJCQllbHNlCisJCQkJCXN3aXRjaCAoc2VuZENv bW1hbmQoc3QsIGNvbW1hbmQpKQogCQkJCQl7Ci0JCQkJCQkvKiBXYWl0IGZvciByZXN1bHRz LCB1bmxlc3MgaW4gcGlwZWxpbmUgbW9kZSAqLwotCQkJCQkJaWYgKFBRcGlwZWxpbmVTdGF0 dXMoc3QtPmNvbikgPT0gUFFfUElQRUxJTkVfT0ZGKQotCQkJCQkJCXN0LT5zdGF0ZSA9IENT VEFURV9XQUlUX1JFU1VMVDsKLQkJCQkJCWVsc2UKLQkJCQkJCQlzdC0+c3RhdGUgPSBDU1RB VEVfRU5EX0NPTU1BTkQ7CisJCQkJCQljYXNlIFNFTkRfRkFJTEVEOgorCQkJCQkJCWNvbW1h bmRGYWlsZWQoc3QsICJTUUwiLCAiU1FMIGNvbW1hbmQgc2VuZCBmYWlsZWQiKTsKKwkJCQkJ CQlzdC0+c3RhdGUgPSBDU1RBVEVfQUJPUlRFRDsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNh c2UgU0VORF9QUkVQQVJFX1BFTkRJTkc6CisJCQkJCQkJc3QtPnByZXBhcmVfcmVzdWx0X2Nv bnN1bWVkID0gZmFsc2U7CisJCQkJCQkJc3QtPnN0YXRlID0gQ1NUQVRFX1dBSVRfUFJFUEFS RV9SRVNVTFQ7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIFNFTkRfT0s6CisJCQkJCQkJ aWYgKFBRcGlwZWxpbmVTdGF0dXMoc3QtPmNvbikgPT0gUFFfUElQRUxJTkVfT0ZGKQorCQkJ CQkJCQlzdC0+c3RhdGUgPSBDU1RBVEVfV0FJVF9SRVNVTFQ7CisJCQkJCQkJZWxzZQorCQkJ CQkJCQlzdC0+c3RhdGUgPSBDU1RBVEVfRU5EX0NPTU1BTkQ7CisJCQkJCQkJYnJlYWs7CiAJ CQkJCX0KIAkJCQl9CiAJCQkJZWxzZSBpZiAoY29tbWFuZC0+dHlwZSA9PSBNRVRBX0NPTU1B TkQpCkBAIC0zOTQwLDYgKzQwMjYsNyBAQCBhZHZhbmNlQ29ubmVjdGlvblN0YXRlKFRTdGF0 ZSAqdGhyZWFkLCBDU3RhdGUgKnN0LCBTdGF0c0RhdGEgKmFnZykKIAkJCQkgKiBzb21ldGhp bmcgYmFkIGhhcHBlbmVkLgogCQkJCSAqLwogCQkJCUFzc2VydChzdC0+c3RhdGUgPT0gQ1NU QVRFX1dBSVRfUkVTVUxUIHx8CisJCQkJCSAgIHN0LT5zdGF0ZSA9PSBDU1RBVEVfV0FJVF9Q UkVQQVJFX1JFU1VMVCB8fAogCQkJCQkgICBzdC0+c3RhdGUgPT0gQ1NUQVRFX0VORF9DT01N QU5EIHx8CiAJCQkJCSAgIHN0LT5zdGF0ZSA9PSBDU1RBVEVfU0xFRVAgfHwKIAkJCQkJICAg c3QtPnN0YXRlID09IENTVEFURV9BQk9SVEVEKTsKQEAgLTQwODMsNiArNDE3MCwxMzQgQEAg YWR2YW5jZUNvbm5lY3Rpb25TdGF0ZShUU3RhdGUgKnRocmVhZCwgQ1N0YXRlICpzdCwgU3Rh dHNEYXRhICphZ2cpCiAJCQkJCXN0LT5zdGF0ZSA9IENTVEFURV9BQk9SVEVEOwogCQkJCWJy ZWFrOwogCisJCQkJLyoKKwkJCQkgKiBXYWl0IGZvciB0aGUgYXN5bmMgUFFzZW5kUHJlcGFy ZSByZXN1bHQuICBUd28gcmVzdWx0cyBhcmUKKwkJCQkgKiBleHBlY3RlZDogdGhlIHJlc3Vs dCBvZiB0aGUgUHJlcGFyZSBpdHNlbGYsIHRoZW4gYSBOVUxMCisJCQkJICogcmVzdWx0LiAg Qm90aCBoYXZlIHRvIGJlIGNvbnN1bWVkIHRocm91Z2ggdGhlIGV2ZW50IGxvb3AsCisJCQkJ ICogYXMgd2FpdGluZyBmb3IgZWl0aGVyIGNhbiBibG9jay4KKwkJCQkgKi8KKwkJCWNhc2Ug Q1NUQVRFX1dBSVRfUFJFUEFSRV9SRVNVTFQ6CisJCQkJeworCQkJCQlQR3Jlc3VsdCAgICpy ZXM7CisKKwkJCQkJcGdfbG9nX2RlYnVnKCJjbGllbnQgJWQgcmVjZWl2aW5nIHByZXBhcmUg cmVzdWx0Iiwgc3QtPmlkKTsKKworCQkJCQlpZiAoUFFpc0J1c3koc3QtPmNvbikgJiYgIVBR Y29uc3VtZUlucHV0KHN0LT5jb24pKQorCQkJCQl7CisJCQkJCQljb21tYW5kRmFpbGVkKHN0 LCAiU1FMIiwgInBlcmhhcHMgdGhlIGJhY2tlbmQgZGllZCB3aGlsZSBwcmVwYXJpbmciKTsK KwkJCQkJCXN0LT5zdGF0ZSA9IENTVEFURV9BQk9SVEVEOworCQkJCQkJYnJlYWs7CisJCQkJ CX0KKwkJCQkJaWYgKFBRaXNCdXN5KHN0LT5jb24pKQorCQkJCQkJcmV0dXJuOyAvKiBkb24n dCBoYXZlIHRoZSB3aG9sZSByZXN1bHQgeWV0ICovCisKKwkJCQkJaWYgKCFzdC0+cHJlcGFy ZV9yZXN1bHRfY29uc3VtZWQpCisJCQkJCXsKKwkJCQkJCS8qIFBoYXNlIDE6IGNvbnN1bWUg dGhlIHJlc3VsdCBvZiB0aGUgUHJlcGFyZS4gKi8KKwkJCQkJCXN0LT5wcmVwYXJlX3Jlc3Vs dF9jb25zdW1lZCA9IHRydWU7CisKKwkJCQkJCXJlcyA9IFBRZ2V0UmVzdWx0KHN0LT5jb24p OworCQkJCQkJaWYgKFBRcmVzdWx0U3RhdHVzKHJlcykgPT0gUEdSRVNfQ09NTUFORF9PSykK KwkJCQkJCXsKKwkJCQkJCQlQUWNsZWFyKHJlcyk7CisJCQkJCQkJLyogcGhhc2UgMiB3aWxs IGNvbnN1bWUgdGhlIHRyYWlsaW5nIE5VTEwgKi8KKwkJCQkJCQlicmVhazsKKwkJCQkJCX0K KworCQkJCQkJaWYgKFBRc3RhdHVzKHN0LT5jb24pID09IENPTk5FQ1RJT05fQkFEKQorCQkJ CQkJeworCQkJCQkJCS8qIGNvbm5lY3Rpb24gZmFpbHVyZTogbm90aGluZyBtb3JlIHRvIGNv bnN1bWUgKi8KKwkJCQkJCQlzdC0+ZXN0YXR1cyA9IEVTVEFUVVNfQ09OTl9FUlJPUjsKKwkJ CQkJCQlzdC0+c3RhdGUgPSBDU1RBVEVfQUJPUlRFRDsKKwkJCQkJCX0KKwkJCQkJCWVsc2UK KwkJCQkJCXsKKwkJCQkJCQkvKgorCQkJCQkJCSAqIERldGVybWluZSB0aGUgZXJyb3Igc3Rh dHVzIGZyb20gdGhlIHNxbHN0YXRlCisJCQkJCQkJICogd2l0aG91dCB0b3VjaGluZyB0aGUg Y29ubmVjdGlvbjogdGhlIHJlbWFpbmluZworCQkJCQkJCSAqIHJlc3VsdHMgYXJlIGNvbnN1 bWVkIGluIHBoYXNlIDIgYmVsb3cKKwkJCQkJCQkgKi8KKwkJCQkJCQlzdC0+ZXN0YXR1cyA9 CisJCQkJCQkJCWdldFNRTEVycm9yU3RhdHVzRnJvbVJlc3VsdChQUXJlc3VsdEVycm9yRmll bGQocmVzLAorCQkJCQkJCQkJCQkJCQkJCQkJCSAgIFBHX0RJQUdfU1FMU1RBVEUpKTsKKwkJ CQkJCQlpZiAoY2FuUmV0cnlFcnJvcihzdC0+ZXN0YXR1cykgfHwKKwkJCQkJCQkJY2FuQ29u dGludWVPbkVycm9yKHN0LT5lc3RhdHVzKSkKKwkJCQkJCQl7CisJCQkJCQkJCWlmICh2ZXJi b3NlX2Vycm9ycykKKwkJCQkJCQkJCWNvbW1hbmRFcnJvcihzdCwgUFFyZXN1bHRFcnJvck1l c3NhZ2UocmVzKSk7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UKKwkJCQkJCQl7CisJCQkJCQkJ CS8qIGFueXRoaW5nIGVsc2UgaXMgdW5leHBlY3RlZCAqLworCQkJCQkJCQlwZ19sb2dfZXJy b3IoImNsaWVudCAlZCBzY3JpcHQgJWQgYWJvcnRlZCBpbiBjb21tYW5kICVkOiAlcyIsCisJ CQkJCQkJCQkJCSBzdC0+aWQsIHN0LT51c2VfZmlsZSwgc3QtPmNvbW1hbmQsCisJCQkJCQkJ CQkJCSBQUXJlc3VsdEVycm9yTWVzc2FnZShyZXMpKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJ CQkJCQlQUWNsZWFyKHJlcyk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCS8qIFBo YXNlIDI6IGNvbnN1bWUgdGhlIHRyYWlsaW5nIE5VTEwgcmVzdWx0LiAqLworCQkJCQlyZXMg PSBQUWdldFJlc3VsdChzdC0+Y29uKTsKKwkJCQkJaWYgKFBRc3RhdHVzKHN0LT5jb24pID09 IENPTk5FQ1RJT05fQkFEKQorCQkJCQl7CisJCQkJCQlwZ19sb2dfZXJyb3IoImNsaWVudCAl ZCBhYm9ydGVkIHdoaWxlIHJlY2VpdmluZyB0aGUgcHJlcGFyZSByZXN1bHQ7IHBlcmhhcHMg dGhlIGJhY2tlbmQgZGllZCB3aGlsZSBwcmVwYXJpbmciLAorCQkJCQkJCQkJIHN0LT5pZCk7 CisJCQkJCQlQUWNsZWFyKHJlcyk7CisJCQkJCQlzdC0+ZXN0YXR1cyA9IEVTVEFUVVNfQ09O Tl9FUlJPUjsKKwkJCQkJCXN0LT5zdGF0ZSA9IENTVEFURV9BQk9SVEVEOworCQkJCQkJYnJl YWs7CisJCQkJCX0KKwkJCQkJaWYgKHJlcyAhPSBOVUxMKQorCQkJCQl7CisJCQkJCQkvKgor CQkJCQkJICogVGhlIE5VTEwgcmVzdWx0IHNob3VsZCBhbHdheXMgZm9sbG93IHRoZSBwcmVw YXJlCisJCQkJCQkgKiByZXN1bHQsIGJ1dCBhIGNvbm5lY3Rpb24gZmFpbHVyZSBiZXR3ZWVu IHRoZSB0d28KKwkJCQkJCSAqIHJlYWRzIGNhbiBzdXJmYWNlIGhlcmUgYXMgYSBmYXRhbCBl cnJvciByZXN1bHQKKwkJCQkJCSAqIGluc3RlYWQuCisJCQkJCQkgKi8KKwkJCQkJCXBnX2xv Z19lcnJvcigiY2xpZW50ICVkIGFib3J0ZWQgd2hpbGUgcmVjZWl2aW5nIHRoZSBwcmVwYXJl IHJlc3VsdDsgJXMiLAorCQkJCQkJCQkJIHN0LT5pZCwgUFFlcnJvck1lc3NhZ2Uoc3QtPmNv bikpOworCQkJCQkJUFFjbGVhcihyZXMpOworCQkJCQkJc3QtPmVzdGF0dXMgPSBFU1RBVFVT X0NPTk5fRVJST1I7CisJCQkJCQlzdC0+c3RhdGUgPSBDU1RBVEVfQUJPUlRFRDsKKwkJCQkJ CWJyZWFrOworCQkJCQl9CisKKwkJCQkJaWYgKHN0LT5lc3RhdHVzID09IEVTVEFUVVNfTk9f RVJST1IpCisJCQkJCXsKKwkJCQkJCUNvbW1hbmQgICAgKmNtZCA9IHNxbF9zY3JpcHRbc3Qt PnVzZV9maWxlXS5jb21tYW5kc1tzdC0+Y29tbWFuZF07CisKKwkJCQkJCXN0LT5wcmVwYXJl ZFtzdC0+dXNlX2ZpbGVdW3N0LT5jb21tYW5kXSA9IHRydWU7CisKKwkJCQkJCXN3aXRjaCAo c2VuZENvbW1hbmQoc3QsIGNtZCkpCisJCQkJCQl7CisJCQkJCQkJY2FzZSBTRU5EX0ZBSUxF RDoKKwkJCQkJCQkJY29tbWFuZEZhaWxlZChzdCwgIlNRTCIsICJTUUwgY29tbWFuZCBzZW5k IGZhaWxlZCIpOworCQkJCQkJCQlzdC0+c3RhdGUgPSBDU1RBVEVfQUJPUlRFRDsKKwkJCQkJ CQkJYnJlYWs7CisJCQkJCQkJY2FzZSBTRU5EX1BSRVBBUkVfUEVORElORzoKKwkJCQkJCQkJ QXNzZXJ0KGZhbHNlKTsKKwkJCQkJCQkJc3QtPnN0YXRlID0gQ1NUQVRFX0FCT1JURUQ7CisJ CQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgU0VORF9PSzoKKwkJCQkJCQkJQXNzZXJ0KFBR cGlwZWxpbmVTdGF0dXMoc3QtPmNvbikgPT0gUFFfUElQRUxJTkVfT0ZGKTsKKwkJCQkJCQkJ c3QtPnN0YXRlID0gQ1NUQVRFX1dBSVRfUkVTVUxUOworCQkJCQkJCQlicmVhazsKKwkJCQkJ CX0KKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCWlmIChjYW5SZXRyeUVycm9y KHN0LT5lc3RhdHVzKSB8fAorCQkJCQkJCWNhbkNvbnRpbnVlT25FcnJvcihzdC0+ZXN0YXR1 cykpCisJCQkJCQkJc3QtPnN0YXRlID0gQ1NUQVRFX0VSUk9SOworCQkJCQkJZWxzZQorCQkJ CQkJCXN0LT5zdGF0ZSA9IENTVEFURV9BQk9SVEVEOworCQkJCQl9CisJCQkJCWJyZWFrOwor CQkJCX0KKwogCQkJCS8qCiAJCQkJICogV2FpdCB1bnRpbCBzbGVlcCBpcyBkb25lLiBUaGlz IHN0YXRlIGlzIGVudGVyZWQgYWZ0ZXIgYQogCQkJCSAqIFxzbGVlcCBtZXRhY29tbWFuZC4g VGhlIGJlaGF2aW9yIGlzIHNpbWlsYXIgdG8KQEAgLTc2NDQsNiArNzg1OSw3IEBAIHRocmVh ZFJ1bih2b2lkICphcmcpCiAJCQkJCW1pbl91c2VjID0gdGhpc191c2VjOwogCQkJfQogCQkJ ZWxzZSBpZiAoc3QtPnN0YXRlID09IENTVEFURV9XQUlUX1JFU1VMVCB8fAorCQkJCQkgc3Qt PnN0YXRlID09IENTVEFURV9XQUlUX1BSRVBBUkVfUkVTVUxUIHx8CiAJCQkJCSBzdC0+c3Rh dGUgPT0gQ1NUQVRFX1dBSVRfUk9MTEJBQ0tfUkVTVUxUKQogCQkJewogCQkJCS8qCkBAIC03 NzM0LDYgKzc5NTAsNyBAQCB0aHJlYWRSdW4odm9pZCAqYXJnKQogCQkJQ1N0YXRlCSAgICpz dCA9ICZzdGF0ZVtpXTsKIAogCQkJaWYgKHN0LT5zdGF0ZSA9PSBDU1RBVEVfV0FJVF9SRVNV TFQgfHwKKwkJCQlzdC0+c3RhdGUgPT0gQ1NUQVRFX1dBSVRfUFJFUEFSRV9SRVNVTFQgfHwK IAkJCQlzdC0+c3RhdGUgPT0gQ1NUQVRFX1dBSVRfUk9MTEJBQ0tfUkVTVUxUKQogCQkJewog CQkJCS8qIGRvbid0IGNhbGwgYWR2YW5jZUNvbm5lY3Rpb25TdGF0ZSB1bmxlc3MgZGF0YSBp cyBhdmFpbGFibGUgKi8KZGlmZiAtLWdpdCBhL3NyYy9iaW4vcGdiZW5jaC90LzAwMV9wZ2Jl bmNoX3dpdGhfc2VydmVyLnBsIGIvc3JjL2Jpbi9wZ2JlbmNoL3QvMDAxX3BnYmVuY2hfd2l0 aF9zZXJ2ZXIucGwKaW5kZXggYjY2OWFkOWQ5MmYuLmE5Y2ZlYjgxNTdlIDEwMDY0NAotLS0g YS9zcmMvYmluL3BnYmVuY2gvdC8wMDFfcGdiZW5jaF93aXRoX3NlcnZlci5wbAorKysgYi9z cmMvYmluL3BnYmVuY2gvdC8wMDFfcGdiZW5jaF93aXRoX3NlcnZlci5wbApAQCAtMTI0NSw3 ICsxMjQ1LDYgQEAgbXkgQGVycm9ycyA9ICgKIAkJMiwKIAkJWwogCQkJcXJ7RVJST1I6ICBz eW50YXggZXJyb3J9LAotCQkJcXJ7cHJlcGFyZWQgc3RhdGVtZW50IC4qIGRvZXMgbm90IGV4 aXN0fQogCQldLAogCQlxey0tIFNRTCBzeW50YXggZXJyb3IKICAgICBTRUxFQ1QgMSArIDsK QEAgLTE4NjYsNiArMTg2NSw2MCBAQCAkbm9kZS0+cGdiZW5jaCgKICMgQ2xlYW4gdXAKICRu b2RlLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgJ0RST1AgVEFCTEUgdW5pcXVlX3RhYmxlOycp OwogCisjIFRlc3QgdGhhdCBhIGNsaWVudCBibG9ja2VkIGluIGFuIGFzeW5jaHJvbm91cyBQ cmVwYXJlIGRvZXMgbm90IGJsb2NrCisjIG90aGVyIGNsaWVudHM6IHdpdGggLWMgMiAtaiAx LCBib3RoIGNsaWVudHMgYXJlIGRyaXZlbiBieSB0aGUgc2FtZSBldmVudCBsb29wLAorIyBz byBhIGJsb2NraW5nIHdhaXQgZm9yIHRoZSBwcmVwYXJlIHJlc3VsdCB3b3VsZCBwcmV2ZW50 IGNsaWVudCAxIGZyb20KKyMgcHJvY2VlZGluZywgYW5kIHRoaXMgdGVzdCB3b3VsZCBoYW5n LgorJG5vZGUtPnNhZmVfcHNxbCgncG9zdGdyZXMnLAorCSdDUkVBVEUgVEFCTEUgYmxvY2tl ZF9wcmVwYXJlX2xvY2tlZCAoaSBpbnQpOyAnCisgIC4gJ0NSRUFURSBUQUJMRSBibG9ja2Vk X3ByZXBhcmVfcHJvZ3Jlc3MgKGkgaW50KTsnKTsKKworJG5vZGUtPnBnYmVuY2goCisJJy1u IC1jIDIgLWogMSAtdCAxIC1NIHByZXBhcmVkJywgMCwKKwlbIHFye3Byb2Nlc3NlZDogMi8y fSBdLCBbcXJ7XiR9XSwKKwknY2xpZW50IGJsb2NrZWQgaW4gUHJlcGFyZSBkb2VzIG5vdCBi bG9jayBvdGhlciBjbGllbnRzJywKKwl7CisJCScwMDFfcGdiZW5jaF9hc3luY19wcmVwYXJl JyA9PiBxeworXGlmIDpjbGllbnRfaWQgPSAwCistLSB3YWl0IHVudGlsIGNsaWVudCAxIGhv bGRzIHRoZSBleGNsdXNpdmUgbG9jaywgdGhlbiBibG9jayBpbiBQcmVwYXJlCitETyAkJAor REVDTEFSRQorICBsb2NrZXJzIGludGVnZXI7CitCRUdJTgorICBMT09QCisJU0VMRUNUIGNv dW50KCopIElOVE8gbG9ja2VycyBGUk9NIHBnX2xvY2tzCisJV0hFUkUgcmVsYXRpb24gPSAn YmxvY2tlZF9wcmVwYXJlX2xvY2tlZCc6OnJlZ2NsYXNzCisJICBBTkQgbW9kZSA9ICdBY2Nl c3NFeGNsdXNpdmVMb2NrJyBBTkQgZ3JhbnRlZAorCSAgQU5EIHBpZCA8PiBwZ19iYWNrZW5k X3BpZCgpOworCUVYSVQgV0hFTiBsb2NrZXJzID0gMTsKKyAgRU5EIExPT1A7CitFTkQkJDsK K1NFTEVDVCAqIEZST00gYmxvY2tlZF9wcmVwYXJlX2xvY2tlZDsKK1xlbHNlCitCRUdJTjsK K0xPQ0sgVEFCTEUgYmxvY2tlZF9wcmVwYXJlX2xvY2tlZCBJTiBBQ0NFU1MgRVhDTFVTSVZF IE1PREU7CistLSB3YWl0IHVudGlsIGNsaWVudCAwJ3MgUGFyc2UgaXMgcXVldWVkIGJlaGlu ZCB0aGUgbG9jaworRE8gJCQKK0RFQ0xBUkUKKyAgd2FpdGVycyBpbnRlZ2VyOworQkVHSU4K KyAgTE9PUAorCVNFTEVDVCBjb3VudCgqKSBJTlRPIHdhaXRlcnMgRlJPTSBwZ19sb2Nrcwor CVdIRVJFIHJlbGF0aW9uID0gJ2Jsb2NrZWRfcHJlcGFyZV9sb2NrZWQnOjpyZWdjbGFzcwor CSAgQU5EIE5PVCBncmFudGVkOworCUVYSVQgV0hFTiB3YWl0ZXJzID0gMTsKKyAgRU5EIExP T1A7CitFTkQkJDsKK0lOU0VSVCBJTlRPIGJsb2NrZWRfcHJlcGFyZV9wcm9ncmVzcyBWQUxV RVMgKDpjbGllbnRfaWQpOworQ09NTUlUOworXGVuZGlmCit9CisJfSk7CisKKyMgQ2xlYW4g dXAKKyRub2RlLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywKKwknRFJPUCBUQUJMRSBibG9ja2Vk X3ByZXBhcmVfbG9ja2VkLCBibG9ja2VkX3ByZXBhcmVfcHJvZ3Jlc3M7Jyk7CisKICMgZG9u ZQogJG5vZGUtPnNhZmVfcHNxbCgncG9zdGdyZXMnLCAnRFJPUCBUQUJMRVNQQUNFIHJlZ3Jl c3NfcGdiZW5jaF90YXBfMV90cycpOwogJG5vZGUtPnN0b3A7Ci0tIAoyLjU0LjAKCg== --------------aLYWsDn2CVjoVaC8LXd9rjMC--