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 1rmdQZ-0092S5-Gm for pgsql-hackers@arkaria.postgresql.org; Tue, 19 Mar 2024 17:39:08 +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 1rmdQW-00HDLi-F8 for pgsql-hackers@arkaria.postgresql.org; Tue, 19 Mar 2024 17:39:04 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1rmdQV-00HDLa-GH for pgsql-hackers@lists.postgresql.org; Tue, 19 Mar 2024 17:39:04 +0000 Received: from mail.postgrespro.ru ([93.174.131.139]) by makus.postgresql.org with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1rmdQQ-005ML3-5b for pgsql-hackers@lists.postgresql.org; Tue, 19 Mar 2024 17:39:02 +0000 Received: from mail.postgrespro.ru (webmail.mstn.postgrespro.ru [192.168.2.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client did not present a certificate) (Authenticated sender: i.kartyshov@postgrespro.ru) by mail.postgrespro.ru (Postfix/587) with ESMTPSA id 66B39E20E8C; Tue, 19 Mar 2024 20:38:55 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mx2023; t=1710869935; bh=JA3FRcZFG7AtanX+4P0W3OwLJ5vJE/UENPv7EZdEyHE=; h=Date:From:To:Cc:Subject:In-Reply-To:References:User-Agent: Message-ID:From; b=MiWyHO49OXZ/U0qym/34VLiWTac18PPtnuETExADoKKMQ9K6ZPaD134GRACg29QAJ g4cUjTeU/gApLaMId6TzP4y3DaWWrUEvUOBsahe/+PLDJTYrQSZQmjQfmoRAt8C4uk 7GHjbq9SaqMcagGJH2oXkEGyh5zQ8ZP/qA+OpVXxgnh1pkSAigQi9cq9mYKtvJFXiT sVTHEqepRPAXi/BwBUuALTexDXL9lOR7ecbKq60GAN6mIFAiYNu6h9JUPQ9gJsa78h LrySdSpHPGTr3ZOVeNQulmAniOwHkAFAvx7diiwsFs98J1tnTrWvcji3N4Ju26+qm1 j9/7lk5dndSug== MIME-Version: 1.0 Date: Tue, 19 Mar 2024 20:38:55 +0300 From: Kartyshov Ivan To: Alexander Korotkov Cc: pgsql-hackers@lists.postgresql.org Subject: Re: [HACKERS] make async slave to wait for lsn to be replayed In-Reply-To: References: <22f122-655b3e80-3-688b3700@97587957> <4953563546cb8c8851f84c7debf723ef@postgrespro.ru> <31547e4e8c263392a768ea89a3f57833@postgrespro.ru> User-Agent: Roundcube Webmail/1.6.5 Message-ID: X-Sender: i.kartyshov@postgrespro.ru Content-Type: multipart/mixed; boundary="=_2624648729306eaefa055db7e850aaf5" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --=_2624648729306eaefa055db7e850aaf5 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8; format=flowed Intro ========== The main purpose of the feature is to achieve read-your-writes-consistency, while using async replica for reads and primary for writes. In that case lsn of last modification is stored inside application. We cannot store this lsn inside database, since reads are distributed across all replicas and primary. Procedure style implementation ========== https://www.postgresql.org/message-id/27171.1586439221%40sss.pgh.pa.us https://www.postgresql.org/message-id/20210121.173009.235021120161403875.horikyota.ntt%40gmail.com CALL pg_wait_lsn(‘LSN’, timeout); Examples ========== primary standby ------- -------- postgresql.conf recovery_min_apply_delay = 10s CREATE TABLE tbl AS SELECT generate_series(1,10) AS a; INSERT INTO tbl VALUES (generate_series(11, 20)); SELECT pg_current_wal_lsn(); CALL pg_wait_lsn('0/3002AE8', 10000); BEGIN; SELECT * FROM tbl; // read fresh insertions COMMIT; Fixed and ready to review. -- Ivan Kartyshov Postgres Professional: www.postgrespro.com --=_2624648729306eaefa055db7e850aaf5 Content-Transfer-Encoding: base64 Content-Type: text/x-diff; name=v12_0001-Procedure-wait-lsn.patch Content-Disposition: attachment; filename=v12_0001-Procedure-wait-lsn.patch; size=16143 ZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dtbC9mdW5jLnNnbWwgYi9kb2Mvc3JjL3NnbWwvZnVuYy5z Z21sCmluZGV4IDViMjI1Y2NmNGYuLmNiMWMxNzVjNjIgMTAwNjQ0Ci0tLSBhL2RvYy9zcmMvc2dt bC9mdW5jLnNnbWwKKysrIGIvZG9jL3NyYy9zZ21sL2Z1bmMuc2dtbApAQCAtMjc4NjEsNiArMjc4 NjEsMTkgQEAgcG9zdGdyZXM9IyBTRUxFQ1QgJzAvMCc6OnBnX2xzbiArIHBkLnNlZ21lbnRfbnVt YmVyICogcHMuc2V0dGluZzo6aW50ICsgOm9mZnNldAogICAgICAgICBleHRlbnNpb24uCiAgICAg ICAgPC9wYXJhPjwvZW50cnk+CiAgICAgICA8L3Jvdz4KKworICAgICAgPHJvdz4KKyAgICAgICA8 ZW50cnkgcm9sZT0iZnVuY190YWJsZV9lbnRyeSI+PHBhcmEgcm9sZT0iZnVuY19zaWduYXR1cmUi PgorICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgPHByaW1hcnk+cGdfd2FpdF9sc248L3By aW1hcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8ZnVuY3Rpb24+cGdfd2FpdF9s c248L2Z1bmN0aW9uPiAod2FpdF9sc24gcGdfbHNuLCB0aW1lb3V0IGJpZ2ludCkKKyAgICAgICA8 L3BhcmE+CisgICAgICAgPHBhcmE+CisgICAgICAgIElmIDxwYXJhbWV0ZXI+dGltZW91dDwvcGFy YW1ldGVyPiA8PSAwIHRoZW4gdGltZW91dCBpcyBvZmYuCisgICAgICAgIFJldHVybnMgRVJST1Ig aWYgdGFyZ2V0IDxwYXJhbWV0ZXI+d2FpdF9sc248L3BhcmFtZXRlcj4gd2FzIG5vdCByZXBsYXll ZC4KKyAgICAgICA8L3BhcmE+PC9lbnRyeT4KKyAgICAgIDwvcm93PgogICAgICA8L3Rib2R5Pgog ICAgIDwvdGdyb3VwPgogICAgPC90YWJsZT4KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2FjY2Vz cy90cmFuc2FtL3hsb2dyZWNvdmVyeS5jIGIvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0veGxv Z3JlY292ZXJ5LmMKaW5kZXggMjljNWJlYzA4NC4uMGI3ODNkYzczMyAxMDA2NDQKLS0tIGEvc3Jj L2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0veGxvZ3JlY292ZXJ5LmMKKysrIGIvc3JjL2JhY2tlbmQv YWNjZXNzL3RyYW5zYW0veGxvZ3JlY292ZXJ5LmMKQEAgLTQzLDYgKzQzLDcgQEAKICNpbmNsdWRl ICJiYWNrdXAvYmFzZWJhY2t1cC5oIgogI2luY2x1ZGUgImNhdGFsb2cvcGdfY29udHJvbC5oIgog I2luY2x1ZGUgImNvbW1hbmRzL3RhYmxlc3BhY2UuaCIKKyNpbmNsdWRlICJjb21tYW5kcy93YWl0 bHNuLmgiCiAjaW5jbHVkZSAiY29tbW9uL2ZpbGVfdXRpbHMuaCIKICNpbmNsdWRlICJtaXNjYWRt aW4uaCIKICNpbmNsdWRlICJwZ3N0YXQuaCIKQEAgLTE4MjgsNiArMTgyOSwxNCBAQCBQZXJmb3Jt V2FsUmVjb3Zlcnkodm9pZCkKIAkJCQlicmVhazsKIAkJCX0KIAorCQkJLyoKKwkJCSAqIElmIHdl IHJlcGxheWVkIGFuIExTTiB0aGF0IHNvbWVvbmUgd2FzIHdhaXRpbmcgZm9yLCBzZXQgbGF0Y2hl cworCQkJICogaW4gc2hhcmVkIG1lbW9yeSBhcnJheSB0byBub3RpZnkgdGhlIHdhaXRlci4KKwkJ CSAqLworCQkJaWYgKHdhaXRMU04gJiYKKwkJCQkoWExvZ1JlY292ZXJ5Q3RsLT5sYXN0UmVwbGF5 ZWRFbmRSZWNQdHIgPj0gcGdfYXRvbWljX3JlYWRfdTY0KCZ3YWl0TFNOLT5taW5MU04pKSkKKwkJ CQlXYWl0TFNOU2V0TGF0Y2hlcyhYTG9nUmVjb3ZlcnlDdGwtPmxhc3RSZXBsYXllZEVuZFJlY1B0 cik7CisKIAkJCS8qIEVsc2UsIHRyeSB0byBmZXRjaCB0aGUgbmV4dCBXQUwgcmVjb3JkICovCiAJ CQlyZWNvcmQgPSBSZWFkUmVjb3JkKHhsb2dwcmVmZXRjaGVyLCBMT0csIGZhbHNlLCByZXBsYXlU TEkpOwogCQl9IHdoaWxlIChyZWNvcmQgIT0gTlVMTCk7CmRpZmYgLS1naXQgYS9zcmMvYmFja2Vu ZC9jb21tYW5kcy9NYWtlZmlsZSBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL01ha2VmaWxlCmluZGV4 IDQ4ZjczNDhmOTEuLmNlZGU5MGMzYjkgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2NvbW1hbmRz L01ha2VmaWxlCisrKyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL01ha2VmaWxlCkBAIC02MSw2ICs2 MSw3IEBAIE9CSlMgPSBcCiAJdmFjdXVtLm8gXAogCXZhY3V1bXBhcmFsbGVsLm8gXAogCXZhcmlh YmxlLm8gXAotCXZpZXcubworCXZpZXcubyBcCisJd2FpdGxzbi5vCiAKIGluY2x1ZGUgJCh0b3Bf c3JjZGlyKS9zcmMvYmFja2VuZC9jb21tb24ubWsKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2Nv bW1hbmRzL21lc29uLmJ1aWxkIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvbWVzb24uYnVpbGQKaW5k ZXggNmRkMDBhNGFiZC4uNzU0OWJlNWRjMyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvY29tbWFu ZHMvbWVzb24uYnVpbGQKKysrIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvbWVzb24uYnVpbGQKQEAg LTUwLDQgKzUwLDUgQEAgYmFja2VuZF9zb3VyY2VzICs9IGZpbGVzKAogICAndmFjdXVtcGFyYWxs ZWwuYycsCiAgICd2YXJpYWJsZS5jJywKICAgJ3ZpZXcuYycsCisgICd3YWl0bHNuLmMnLAogKQpk aWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvd2FpdGxzbi5jIGIvc3JjL2JhY2tlbmQv Y29tbWFuZHMvd2FpdGxzbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAu LmY5YjcwMWM5NDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYmFja2VuZC9jb21tYW5kcy93YWl0 bHNuLmMKQEAgLTAsMCArMSwzMDkgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIHdhaXRs c24uYworICoJICBJbXBsZW1lbnRzIHdhaXRpbmcgZm9yIHRoZSBnaXZlbiBMU04sIHdoaWNoIGlz IHVzZWQgaW4KKyAqCSAgQ0FMTCBwZ193YWl0X2xzbih3YWl0X2xzbiBwZ19sc24sIHRpbWVvdXQg aW50KS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMjQsIFBvc3RncmVTUUwgR2xvYmFsIERldmVs b3BtZW50IEdyb3VwCisgKgorICogSURFTlRJRklDQVRJT04KKyAqCSAgc3JjL2JhY2tlbmQvY29t bWFuZHMvd2FpdGxzbi5jCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2luY2x1ZGUg InBvc3RncmVzLmgiCisKKyNpbmNsdWRlIDxmbG9hdC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKwor I2luY2x1ZGUgInBnc3RhdC5oIgorI2luY2x1ZGUgImZtZ3IuaCIKKyNpbmNsdWRlICJhY2Nlc3Mv dHJhbnNhbS5oIgorI2luY2x1ZGUgImFjY2Vzcy94YWN0LmgiCisjaW5jbHVkZSAiYWNjZXNzL3hs b2cuaCIKKyNpbmNsdWRlICJhY2Nlc3MveGxvZ2RlZnMuaCIKKyNpbmNsdWRlICJhY2Nlc3MveGxv Z3JlY292ZXJ5LmgiCisjaW5jbHVkZSAiY2F0YWxvZy9wZ190eXBlLmgiCisjaW5jbHVkZSAiY29t bWFuZHMvd2FpdGxzbi5oIgorI2luY2x1ZGUgImV4ZWN1dG9yL3NwaS5oIgorI2luY2x1ZGUgImZ1 bmNhcGkuaCIKKyNpbmNsdWRlICJtaXNjYWRtaW4uaCIKKyNpbmNsdWRlICJzdG9yYWdlL2lwYy5o IgorI2luY2x1ZGUgInN0b3JhZ2UvbGF0Y2guaCIKKyNpbmNsdWRlICJzdG9yYWdlL3Btc2lnbmFs LmgiCisjaW5jbHVkZSAic3RvcmFnZS9wcm9jLmgiCisjaW5jbHVkZSAic3RvcmFnZS9zaG1lbS5o IgorI2luY2x1ZGUgInN0b3JhZ2Uvc2ludmFsYWR0LmgiCisjaW5jbHVkZSAidXRpbHMvYnVpbHRp bnMuaCIKKyNpbmNsdWRlICJ1dGlscy9wZ19sc24uaCIKKyNpbmNsdWRlICJ1dGlscy9zbmFwbWdy LmgiCisjaW5jbHVkZSAidXRpbHMvdGltZXN0YW1wLmgiCisjaW5jbHVkZSAidXRpbHMvZm1ncnBy b3Rvcy5oIgorCisvKiBBZGQgdG8gLyBkZWxldGUgZnJvbSBzaGFyZWQgbWVtb3J5IGFycmF5ICov CitzdGF0aWMgdm9pZCBhZGRMU05XYWl0ZXIoWExvZ1JlY1B0ciBsc24pOworc3RhdGljIHZvaWQg ZGVsZXRlTFNOV2FpdGVyKHZvaWQpOworCitzdHJ1Y3QgV2FpdExTTlN0YXRlICp3YWl0TFNOID0g TlVMTDsKK3N0YXRpYyB2b2xhdGlsZSBzaWdfYXRvbWljX3QgaGF2ZVNobWVtSXRlbSA9IGZhbHNl OworCisvKgorICogUmVwb3J0IHRoZSBhbW91bnQgb2Ygc2hhcmVkIG1lbW9yeSBzcGFjZSBuZWVk ZWQgZm9yIFdhaXRMU05TdGF0ZQorICovCitTaXplCitXYWl0TFNOU2htZW1TaXplKHZvaWQpCit7 CisJU2l6ZQkJc2l6ZTsKKworCXNpemUgPSBvZmZzZXRvZihXYWl0TFNOU3RhdGUsIHByb2NJbmZv cyk7CisJc2l6ZSA9IGFkZF9zaXplKHNpemUsIG11bF9zaXplKE1heEJhY2tlbmRzLCBzaXplb2Yo V2FpdExTTlByb2NJbmZvKSkpOworCXJldHVybiBzaXplOworfQorCisvKiBJbml0aWFsaXplIHRo ZSBXYWl0TFNOU3RhdGUgaW4gdGhlIHNoYXJlZCBtZW1vcnkgKi8KK3ZvaWQKK1dhaXRMU05TaG1l bUluaXQodm9pZCkKK3sKKwlib29sCQlmb3VuZDsKKworCXdhaXRMU04gPSAoV2FpdExTTlN0YXRl ICopIFNobWVtSW5pdFN0cnVjdCgiV2FpdExTTlN0YXRlIiwKKwkJCQkJCQkJCQkJICAgV2FpdExT TlNobWVtU2l6ZSgpLAorCQkJCQkJCQkJCQkgICAmZm91bmQpOworCWlmICghZm91bmQpCisJewor CQlTcGluTG9ja0luaXQoJndhaXRMU04tPm11dGV4KTsKKwkJd2FpdExTTi0+bnVtV2FpdGVkUHJv Y3MgPSAwOworCQlwZ19hdG9taWNfaW5pdF91NjQoJndhaXRMU04tPm1pbkxTTiwgUEdfVUlOVDY0 X01BWCk7CisJfQorfQorCisvKgorICogQWRkIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgTFNO IHdhaXRlciBiYWNrZW5kIHRvIHRoZSBzaGFyZWQgbWVtb3J5CisgKiBhcnJheS4KKyAqLworc3Rh dGljIHZvaWQKK2FkZExTTldhaXRlcihYTG9nUmVjUHRyIGxzbikKK3sKKwlXYWl0TFNOUHJvY0lu Zm8gY3VyOworCWludAkJCWk7CisKKwlTcGluTG9ja0FjcXVpcmUoJndhaXRMU04tPm11dGV4KTsK KworCWN1ci5wcm9jbnVtID0gTXlQcm9jTnVtYmVyOworCWN1ci53YWl0TFNOID0gbHNuOworCisJ Zm9yIChpID0gMDsgaSA8IHdhaXRMU04tPm51bVdhaXRlZFByb2NzOyBpKyspCisJeworCQlpZiAo d2FpdExTTi0+cHJvY0luZm9zW2ldLndhaXRMU04gPj0gY3VyLndhaXRMU04pCisJCXsKKwkJCVdh aXRMU05Qcm9jSW5mbyB0bXA7CisKKwkJCXRtcCA9IHdhaXRMU04tPnByb2NJbmZvc1tpXTsKKwkJ CXdhaXRMU04tPnByb2NJbmZvc1tpXSA9IGN1cjsKKwkJCWN1ciA9IHRtcDsKKwkJfQorCX0KKwl3 YWl0TFNOLT5wcm9jSW5mb3NbaV0gPSBjdXI7CisJd2FpdExTTi0+bnVtV2FpdGVkUHJvY3MrKzsK KworCXBnX2F0b21pY193cml0ZV91NjQoJndhaXRMU04tPm1pbkxTTiwgd2FpdExTTi0+cHJvY0lu Zm9zW2ldLndhaXRMU04pOworCVNwaW5Mb2NrUmVsZWFzZSgmd2FpdExTTi0+bXV0ZXgpOworfQor CisvKgorICogRGVsZXRlIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgTFNOIHdhaXRlciBiYWNr ZW5kIGZyb20gdGhlIHNoYXJlZCBtZW1vcnkKKyAqIGFycmF5LgorICovCitzdGF0aWMgdm9pZAor ZGVsZXRlTFNOV2FpdGVyKHZvaWQpCit7CisJaW50CQkJaTsKKwlib29sCQlmb3VuZCA9IGZhbHNl OworCisJU3BpbkxvY2tBY3F1aXJlKCZ3YWl0TFNOLT5tdXRleCk7CisKKwlmb3IgKGkgPSAwOyBp IDwgd2FpdExTTi0+bnVtV2FpdGVkUHJvY3M7IGkrKykKKwl7CisJCWlmICh3YWl0TFNOLT5wcm9j SW5mb3NbaV0ucHJvY251bSA9PSBNeVByb2NOdW1iZXIpCisJCQlmb3VuZCA9IHRydWU7CisKKwkJ aWYgKGZvdW5kICYmIGkgPCB3YWl0TFNOLT5udW1XYWl0ZWRQcm9jcyAtIDEpCisJCXsKKwkJCXdh aXRMU04tPnByb2NJbmZvc1tpXSA9IHdhaXRMU04tPnByb2NJbmZvc1tpICsgMV07CisJCX0KKwl9 CisKKwlpZiAoIWZvdW5kKQorCXsKKwkJU3BpbkxvY2tSZWxlYXNlKCZ3YWl0TFNOLT5tdXRleCk7 CisJCXJldHVybjsKKwl9CisJd2FpdExTTi0+bnVtV2FpdGVkUHJvY3MtLTsKKworCWlmICh3YWl0 TFNOLT5udW1XYWl0ZWRQcm9jcyAhPSAwKQorCQlwZ19hdG9taWNfd3JpdGVfdTY0KCZ3YWl0TFNO LT5taW5MU04sIHdhaXRMU04tPnByb2NJbmZvc1tpXS53YWl0TFNOKTsKKwllbHNlCisJCXBnX2F0 b21pY193cml0ZV91NjQoJndhaXRMU04tPm1pbkxTTiwgUEdfVUlOVDY0X01BWCk7CisKKwlTcGlu TG9ja1JlbGVhc2UoJndhaXRMU04tPm11dGV4KTsKK30KKworLyoKKyAqIFNldCBhbGwgbGF0Y2hl cyBpbiBzaGFyZWQgbWVtb3J5IHRvIHNpZ25hbCB0aGF0IG5ldyBMU04gaGFzIGJlZW4gcmVwbGF5 ZWQKKyovCit2b2lkCitXYWl0TFNOU2V0TGF0Y2hlcyhYTG9nUmVjUHRyIGN1ckxTTikKK3sKKwl1 aW50MzIJCWksCisJCQkJbnVtV2FrZVVwUHJvY3M7CisKKwlTcGluTG9ja0FjcXVpcmUoJndhaXRM U04tPm11dGV4KTsKKworCS8qCisJICogU2V0IGxhdGNoZXMgZm9yIHByb2Nlc3MsIHdob3NlIHdh aXRlZCBMU05zIGFyZSBhbHJlYWR5IHJlcGxheWVkLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCB3 YWl0TFNOLT5udW1XYWl0ZWRQcm9jczsgaSsrKQorCXsKKwkJUEdQUk9DCSAgICpiYWNrZW5kOwor CisJCWlmICh3YWl0TFNOLT5wcm9jSW5mb3NbaV0ud2FpdExTTiA+IGN1ckxTTikKKwkJCWJyZWFr OworCisJCWJhY2tlbmQgPSBHZXRQR1Byb2NCeU51bWJlcih3YWl0TFNOLT5wcm9jSW5mb3NbaV0u cHJvY251bSk7CisJCVNldExhdGNoKCZiYWNrZW5kLT5wcm9jTGF0Y2gpOworCX0KKworCS8qCisJ ICogSW1tZWRpYXRlbHkgcmVtb3ZlIHRob3NlIHByb2Nlc3NlcyBmcm9tIHRoZSBzaG1lbSBhcnJh eS4gIE90aGVyd2lzZSwKKwkgKiBzaG1lbSBhcnJheSBpdGVtcyB3aWxsIGJlIGhlcmUgdGlsbCBj b3JyZXNwb25kaW5nIHByb2Nlc3NlcyB3YWtlIHVwIGFuZAorCSAqIGRlbGV0ZSB0aGVtc2VsdmVz LgorCSAqLworCW51bVdha2VVcFByb2NzID0gaTsKKwlmb3IgKGkgPSAwOyBpIDwgd2FpdExTTi0+ bnVtV2FpdGVkUHJvY3MgLSBudW1XYWtlVXBQcm9jczsgaSsrKQorCQl3YWl0TFNOLT5wcm9jSW5m b3NbaV0gPSB3YWl0TFNOLT5wcm9jSW5mb3NbaSArIG51bVdha2VVcFByb2NzXTsKKwl3YWl0TFNO LT5udW1XYWl0ZWRQcm9jcyAtPSBudW1XYWtlVXBQcm9jczsKKworCWlmICh3YWl0TFNOLT5udW1X YWl0ZWRQcm9jcyAhPSAwKQorCQlwZ19hdG9taWNfd3JpdGVfdTY0KCZ3YWl0TFNOLT5taW5MU04s IHdhaXRMU04tPnByb2NJbmZvc1tpXS53YWl0TFNOKTsKKwllbHNlCisJCXBnX2F0b21pY193cml0 ZV91NjQoJndhaXRMU04tPm1pbkxTTiwgUEdfVUlOVDY0X01BWCk7CisKKwlTcGluTG9ja1JlbGVh c2UoJndhaXRMU04tPm11dGV4KTsKK30KKworLyoKKyAqIERlbGV0ZSBvdXIgaXRlbSBmcm9tIHNo bWVtIGFycmF5IGlmIGFueS4KKyAqLwordm9pZAorV2FpdExTTkNsZWFudXAodm9pZCkKK3sKKwlp ZiAoaGF2ZVNobWVtSXRlbSkKKwkJZGVsZXRlTFNOV2FpdGVyKCk7Cit9CisKKy8qCisgKiBXYWl0 IHVzaW5nIE15TGF0Y2ggdG8gd2FpdCB0aWxsIHRoZSBnaXZlbiBMU04gaXMgcmVwbGF5ZWQsIHRo ZSBwb3N0bWFzdGVyIGRpZXMgb3IKKyAqIHRpbWVvdXQgaGFwcGVucy4KKyAqLwordm9pZAorV2Fp dEZvckxTTihYTG9nUmVjUHRyIGxzbiwgdWludDY0IG1pbGxpc2VjcykKK3sKKwlYTG9nUmVjUHRy CWN1ckxTTjsKKwlpbnQJCQlsYXRjaF9ldmVudHM7CisJVGltZXN0YW1wVHogZW5kdGltZTsKKwor CS8qIFNob3VsZG4ndCBiZSBjYWxsZWQgd2hlbiBzaG1lbSBpc24ndCBpbml0aWFsaXplZCAqLwor CUFzc2VydCh3YWl0TFNOKTsKKworCS8qIFNob3VsZCBiZSBvbmx5IGNhbGxlZCBieSBhIGJhY2tl bmQgKi8KKwlBc3NlcnQoTXlCYWNrZW5kVHlwZSA9PSBCX0JBQ0tFTkQpOworCisJaWYgKCFSZWNv dmVyeUluUHJvZ3Jlc3MoKSkKKwkJZXJlcG9ydChFUlJPUiwKKwkJCQkoZXJyY29kZShFUlJDT0RF X09CSkVDVF9OT1RfSU5fUFJFUkVRVUlTSVRFX1NUQVRFKSwKKwkJCQkgZXJybXNnKCJyZWNvdmVy eSBpcyBub3QgaW4gcHJvZ3Jlc3MiKSwKKwkJCQkgZXJyaGludCgiV2FpdGluZyBmb3IgTFNOIGNh biBvbmx5IGJlIGV4ZWN1dGVkIGR1cmluZyByZWNvdmVyeS4iKSkpOworCisJaWYgKG1pbGxpc2Vj cyA+IDg2NDAwMDAwKQorCXsKKwkJbWlsbGlzZWNzID0gODY0MDAwMDAKKwkJZWxvZyhXQVJOSU5H LCJUaW1lb3V0IGZvciBwZ193YWl0X2xzbigpIHJlc3RyaWN0ZWQgdG8gMSBkYXkiKTsKKwl9CisK KwllbmR0aW1lID0gR2V0Q3VycmVudFRpbWVzdGFtcCgpICsgbWlsbGlzZWNzICogMTAwMDsKKwor CWxhdGNoX2V2ZW50cyA9IFdMX1RJTUVPVVQgfCBXTF9MQVRDSF9TRVQgfCBXTF9FWElUX09OX1BN X0RFQVRIOworCWFkZExTTldhaXRlcihsc24pOworCWhhdmVTaG1lbUl0ZW0gPSB0cnVlOworCisJ Zm9yICg7OykKKwl7CisJCWludAkJCXJjOworCQlsb25nCQlkZWxheV9tczsKKworCQkvKiBDaGVj ayBpZiB0aGUgd2FpdGVkIExTTiBoYXMgYmVlbiByZXBsYXllZCAqLworCQljdXJMU04gPSBHZXRY TG9nUmVwbGF5UmVjUHRyKE5VTEwpOworCQlpZiAobHNuIDw9IGN1ckxTTikKKwkJCWJyZWFrOwor CisJCWlmIChtaWxsaXNlY3MgPiAwKQorCQkJZGVsYXlfbXMgPSAoZW5kdGltZSAtIEdldEN1cnJl bnRUaW1lc3RhbXAoKSkgLyAxMDAwOworCQllbHNlCisJCQkvKiBJZiBubyB0aW1lb3V0IGlzIHNl dCB0aGVuIHdha2UgdXAgaW4gMSBtaW51dGUgZm9yIGludGVycnVwdHMgKi8KKwkJCWRlbGF5X21z ID0gNjAwMDA7CisKKwkJaWYgKGRlbGF5X21zIDw9IDApCisJCQlicmVhazsKKworCQkvKgorCQkg KiBJZiByZWNlaXZlZCBhbiBpbnRlcnJ1cHRpb24gZnJvbSBDSEVDS19GT1JfSU5URVJSVVBUUywg dGhlbiBkZWxldGUKKwkJICogdGhlIGN1cnJlbnQgZXZlbnQgZnJvbSBhcnJheS4KKwkJICovCisJ CUNIRUNLX0ZPUl9JTlRFUlJVUFRTKCk7CisKKwkJLyogSWYgcG9zdG1hc3RlciBkaWVzLCBmaW5p c2ggaW1tZWRpYXRlbHkgKi8KKwkJaWYgKCFQb3N0bWFzdGVySXNBbGl2ZSgpKQorCQkJYnJlYWs7 CisKKwkJcmMgPSBXYWl0TGF0Y2goTXlMYXRjaCwgbGF0Y2hfZXZlbnRzLCBkZWxheV9tcywKKwkJ CQkJICAgV0FJVF9FVkVOVF9XQUlUX0ZPUl9TVEFOREJZX0NPTkZJUk1BVElPTik7CisKKwkJaWYg KHJjICYgV0xfTEFUQ0hfU0VUKQorCQkJUmVzZXRMYXRjaChNeUxhdGNoKTsKKwl9CisKKwlpZiAo bHNuID4gY3VyTFNOKQorCXsKKwkJZGVsZXRlTFNOV2FpdGVyKCk7CisJCWhhdmVTaG1lbUl0ZW0g PSBmYWxzZTsKKwkJZXJlcG9ydChFUlJPUiwKKwkJCQkoZXJyY29kZShFUlJDT0RFX1FVRVJZX0NB TkNFTEVEKSwKKwkJCQkgZXJybXNnKCJjYW5jZWxpbmcgd2FpdGluZyBmb3IgTFNOIGR1ZSB0byB0 aW1lb3V0IikpKTsKKwl9CisJZWxzZQorCXsKKwkJaGF2ZVNobWVtSXRlbSA9IGZhbHNlOworCX0K K30KKworRGF0dW0KK3BnX3dhaXRfbHNuKFBHX0ZVTkNUSU9OX0FSR1MpCit7CisJWExvZ1JlY1B0 cgl0cmdfbHNuID0gUEdfR0VUQVJHX0xTTigwKTsKKwl1aW50NjRfdAlkZWxheSA9IFBHX0dFVEFS R19JTlQzMigxKTsKKwlDYWxsQ29udGV4dCAqY29udGV4dCA9IChDYWxsQ29udGV4dCAqKSBmY2lu Zm8tPmNvbnRleHQ7CisKKwlpZiAoY29udGV4dC0+YXRvbWljKQorCQllcmVwb3J0KEVSUk9SLAor CQkJCShlcnJjb2RlKEVSUkNPREVfT0JKRUNUX05PVF9JTl9QUkVSRVFVSVNJVEVfU1RBVEUpLAor CQkJCSBlcnJtc2coInBnX3dhaXRfbHNuKCkgbXVzdCBiZSBvbmx5IGNhbGxlZCBpbiBub24tYXRv bWljIGNvbnRleHQiKSkpOworCisJaWYgKEFjdGl2ZVNuYXBzaG90U2V0KCkpCisJCVBvcEFjdGl2 ZVNuYXBzaG90KCk7CisJQXNzZXJ0KCFBY3RpdmVTbmFwc2hvdFNldCgpKTsKKworCSh2b2lkKSBX YWl0Rm9yTFNOKHRyZ19sc24sIGRlbGF5KTsKKworCVBHX1JFVFVSTl9WT0lEKCk7Cit9CmRpZmYg LS1naXQgYS9zcmMvYmFja2VuZC9zdG9yYWdlL2lwYy9pcGNpLmMgYi9zcmMvYmFja2VuZC9zdG9y YWdlL2lwYy9pcGNpLmMKaW5kZXggNTIxZWQ1NDE4Yy4uNWFlZDkwYzkzNSAxMDA2NDQKLS0tIGEv c3JjL2JhY2tlbmQvc3RvcmFnZS9pcGMvaXBjaS5jCisrKyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2Uv aXBjL2lwY2kuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgImFjY2Vzcy94bG9ncHJlZmV0 Y2hlci5oIgogI2luY2x1ZGUgImFjY2Vzcy94bG9ncmVjb3ZlcnkuaCIKICNpbmNsdWRlICJjb21t YW5kcy9hc3luYy5oIgorI2luY2x1ZGUgImNvbW1hbmRzL3dhaXRsc24uaCIKICNpbmNsdWRlICJt aXNjYWRtaW4uaCIKICNpbmNsdWRlICJwZ3N0YXQuaCIKICNpbmNsdWRlICJwb3N0bWFzdGVyL2F1 dG92YWN1dW0uaCIKQEAgLTE1Miw2ICsxNTMsNyBAQCBDYWxjdWxhdGVTaG1lbVNpemUoaW50ICpu dW1fc2VtYXBob3JlcykKIAlzaXplID0gYWRkX3NpemUoc2l6ZSwgV2FpdEV2ZW50RXh0ZW5zaW9u U2htZW1TaXplKCkpOwogCXNpemUgPSBhZGRfc2l6ZShzaXplLCBJbmplY3Rpb25Qb2ludFNobWVt U2l6ZSgpKTsKIAlzaXplID0gYWRkX3NpemUoc2l6ZSwgU2xvdFN5bmNTaG1lbVNpemUoKSk7CisJ c2l6ZSA9IGFkZF9zaXplKHNpemUsIFdhaXRMU05TaG1lbVNpemUoKSk7CiAjaWZkZWYgRVhFQ19C QUNLRU5ECiAJc2l6ZSA9IGFkZF9zaXplKHNpemUsIFNobWVtQmFja2VuZEFycmF5U2l6ZSgpKTsK ICNlbmRpZgpAQCAtMjQ0LDYgKzI0NiwxMSBAQCBDcmVhdGVTaGFyZWRNZW1vcnlBbmRTZW1hcGhv cmVzKHZvaWQpCiAJLyogSW5pdGlhbGl6ZSBzdWJzeXN0ZW1zICovCiAJQ3JlYXRlT3JBdHRhY2hT aG1lbVN0cnVjdHMoKTsKIAorCS8qCisJICogSW5pdCBhcnJheSBvZiBMYXRjaGVzIGluIHNoYXJl ZCBtZW1vcnkgZm9yIHdhaXQgbHNuCisJICovCisJV2FpdExTTlNobWVtSW5pdCgpOworCiAjaWZk ZWYgRVhFQ19CQUNLRU5ECiAKIAkvKgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9s bWdyL3Byb2MuYyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2UvbG1nci9wcm9jLmMKaW5kZXggMTYyYjFm OTE5ZC4uNGI4MzBkYzNjOCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9sbWdyL3By b2MuYworKysgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2xtZ3IvcHJvYy5jCkBAIC0zNiw2ICszNiw3 IEBACiAjaW5jbHVkZSAiYWNjZXNzL3RyYW5zYW0uaCIKICNpbmNsdWRlICJhY2Nlc3MvdHdvcGhh c2UuaCIKICNpbmNsdWRlICJhY2Nlc3MveGxvZ3V0aWxzLmgiCisjaW5jbHVkZSAiY29tbWFuZHMv d2FpdGxzbi5oIgogI2luY2x1ZGUgIm1pc2NhZG1pbi5oIgogI2luY2x1ZGUgInBnc3RhdC5oIgog I2luY2x1ZGUgInBvc3RtYXN0ZXIvYXV0b3ZhY3V1bS5oIgpAQCAtODYyLDYgKzg2MywxMSBAQCBQ cm9jS2lsbChpbnQgY29kZSwgRGF0dW0gYXJnKQogCSAqLwogCUxXTG9ja1JlbGVhc2VBbGwoKTsK IAorCS8qCisJICogQ2xlYW51cCB3YWl0aW5nIGZvciBMU04gaWYgYW55LgorCSAqLworCVdhaXRM U05DbGVhbnVwKCk7CisKIAkvKiBDYW5jZWwgYW55IHBlbmRpbmcgY29uZGl0aW9uIHZhcmlhYmxl IHNsZWVwLCB0b28gKi8KIAlDb25kaXRpb25WYXJpYWJsZUNhbmNlbFNsZWVwKCk7CiAKZGlmZiAt LWdpdCBhL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQgYi9zcmMvaW5jbHVkZS9jYXRh bG9nL3BnX3Byb2MuZGF0CmluZGV4IDE3N2Q4MWE4OTEuLjIxMjIyYmYxOGMgMTAwNjQ0Ci0tLSBh L3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQKKysrIGIvc3JjL2luY2x1ZGUvY2F0YWxv Zy9wZ19wcm9jLmRhdApAQCAtMTIxMzUsNiArMTIxMzUsMTEgQEAKICAgcHJvcmV0dHlwZSA9PiAn Ynl0ZWEnLCBwcm9hcmd0eXBlcyA9PiAncGdfYnJpbl9taW5tYXhfbXVsdGlfc3VtbWFyeScsCiAg IHByb3NyYyA9PiAnYnJpbl9taW5tYXhfbXVsdGlfc3VtbWFyeV9zZW5kJyB9LAogCit7IG9pZCA9 PiAnMTYzODcnLCBkZXNjciA9PiAnd2FpdCBmb3IgTFNOIHVudGlsIHRpbWVvdXQnLAorICBwcm9u YW1lID0+ICdwZ193YWl0X2xzbicsIHByb2tpbmQgPT4gJ3AnLCBwcm9yZXR0eXBlID0+ICd2b2lk JywKKyAgcHJvYXJndHlwZXMgPT4gJ3BnX2xzbiBpbnQ4JywgcHJvYXJnbmFtZXMgPT4gJ3t0cmdf bHNuLGRlbGF5fScsCisgIHByb3NyYyA9PiAncGdfd2FpdF9sc24nIH0sCisKIHsgb2lkID0+ICc2 MjkxJywgZGVzY3IgPT4gJ2FyYml0cmFyeSB2YWx1ZSBmcm9tIGFtb25nIGlucHV0IHZhbHVlcycs CiAgIHByb25hbWUgPT4gJ2FueV92YWx1ZScsIHByb2tpbmQgPT4gJ2EnLCBwcm9pc3N0cmljdCA9 PiAnZicsCiAgIHByb3JldHR5cGUgPT4gJ2FueWVsZW1lbnQnLCBwcm9hcmd0eXBlcyA9PiAnYW55 ZWxlbWVudCcsCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9jb21tYW5kcy93YWl0bHNuLmggYi9z cmMvaW5jbHVkZS9jb21tYW5kcy93YWl0bHNuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg MDAwMDAwMDAwMC4uMTkyZTQzNGQ4NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9pbmNsdWRlL2Nv bW1hbmRzL3dhaXRsc24uaApAQCAtMCwwICsxLDQzIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAq CisgKiB3YWl0bHNuLmgKKyAqCSAgRGVjbGFyYXRpb25zIGZvciBMU04gd2FpdGluZyByb3V0aW5l cy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMjQsIFBvc3RncmVTUUwgR2xvYmFsIERldmVsb3Bt ZW50IEdyb3VwCisgKgorICogc3JjL2luY2x1ZGUvY29tbWFuZHMvd2FpdGxzbi5oCisgKgorICot LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpZm5kZWYgV0FJVF9MU05fSAorI2RlZmluZSBXQUlUX0xT Tl9ICisKKyNpbmNsdWRlICJwb3N0Z3Jlcy5oIgorI2luY2x1ZGUgInBvcnQvYXRvbWljcy5oIgor I2luY2x1ZGUgInN0b3JhZ2Uvc3Bpbi5oIgorI2luY2x1ZGUgInRjb3AvZGVzdC5oIgorCisvKiBT aGFyZWQgbWVtb3J5IHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgV2FpdExTTlByb2NJbmZv Cit7CisJaW50CQkJcHJvY251bTsKKwlYTG9nUmVjUHRyCXdhaXRMU047Cit9CQkJV2FpdExTTlBy b2NJbmZvOworCit0eXBlZGVmIHN0cnVjdCBXYWl0TFNOU3RhdGUKK3sKKwlwZ19hdG9taWNfdWlu dDY0IG1pbkxTTjsKKwlzbG9ja190CQltdXRleDsKKwlpbnQJCQludW1XYWl0ZWRQcm9jczsKKwlX YWl0TFNOUHJvY0luZm8gcHJvY0luZm9zW0ZMRVhJQkxFX0FSUkFZX01FTUJFUl07Cit9CQkJV2Fp dExTTlN0YXRlOworCitleHRlcm4gUEdETExJTVBPUlQgc3RydWN0IFdhaXRMU05TdGF0ZSAqd2Fp dExTTjsKKworZXh0ZXJuIHZvaWQgV2FpdEZvckxTTihYTG9nUmVjUHRyIGxzbiwgdWludDY0IG1p bGxpc2Vjcyk7CitleHRlcm4gU2l6ZSBXYWl0TFNOU2htZW1TaXplKHZvaWQpOworZXh0ZXJuIHZv aWQgV2FpdExTTlNobWVtSW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIFdhaXRMU05TZXRMYXRjaGVz KFhMb2dSZWNQdHIgY3VyTFNOKTsKK2V4dGVybiB2b2lkIFdhaXRMU05DbGVhbnVwKHZvaWQpOwor CisjZW5kaWYJCQkJCQkJLyogV0FJVF9MU05fSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVj b3ZlcnkvbWVzb24uYnVpbGQgYi9zcmMvdGVzdC9yZWNvdmVyeS9tZXNvbi5idWlsZAppbmRleCBi MWViNzdiMWVjLi5iYzQ3YzkzOTAyIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWNvdmVyeS9tZXNv bi5idWlsZAorKysgYi9zcmMvdGVzdC9yZWNvdmVyeS9tZXNvbi5idWlsZApAQCAtNTEsNiArNTEs NyBAQCB0ZXN0cyArPSB7CiAgICAgICAndC8wNDBfc3RhbmRieV9mYWlsb3Zlcl9zbG90c19zeW5j LnBsJywKICAgICAgICd0LzA0MV9jaGVja3BvaW50X2F0X3Byb21vdGUucGwnLAogICAgICAgJ3Qv MDQyX2xvd19sZXZlbF9iYWNrdXAucGwnLAorICAgICAgJ3QvMDQzX3dhaXRfbHNuLnBsJywKICAg ICBdLAogICB9LAogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVjb3ZlcnkvdC8wNDNfd2FpdF9s c24ucGwgYi9zcmMvdGVzdC9yZWNvdmVyeS90LzA0M193YWl0X2xzbi5wbApuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwLi4wNGI0NWVlZmVjCi0tLSAvZGV2L251bGwKKysrIGIv c3JjL3Rlc3QvcmVjb3ZlcnkvdC8wNDNfd2FpdF9sc24ucGwKQEAgLTAsMCArMSw2MiBAQAorIyBD aGVja3Mgd2FpdGluZyBmb3IgbHNuIG9uIHN0YW5kYnkgQUZURVIKK3VzZSBzdHJpY3Q7Cit1c2Ug d2FybmluZ3M7CisKK3VzZSBQb3N0Z3JlU1FMOjpUZXN0OjpDbHVzdGVyOwordXNlIFBvc3RncmVT UUw6OlRlc3Q6OlV0aWxzOwordXNlIFRlc3Q6Ok1vcmU7CisKKyMgSW5pdGlhbGl6ZSBwcmltYXJ5 IG5vZGUKK215ICRub2RlX3ByaW1hcnkgPSBQb3N0Z3JlU1FMOjpUZXN0OjpDbHVzdGVyLT5uZXco J3ByaW1hcnknKTsKKyRub2RlX3ByaW1hcnktPmluaXQoYWxsb3dzX3N0cmVhbWluZyA9PiAxKTsK KyRub2RlX3ByaW1hcnktPnN0YXJ0OworCisjIEFuZCBzb21lIGNvbnRlbnQgYW5kIHRha2UgYSBi YWNrdXAKKyRub2RlX3ByaW1hcnktPnNhZmVfcHNxbCgncG9zdGdyZXMnLAorCSJDUkVBVEUgVEFC TEUgd2FpdF90ZXN0IEFTIFNFTEVDVCBnZW5lcmF0ZV9zZXJpZXMoMSwxMCkgQVMgYSIpOworbXkg JGJhY2t1cF9uYW1lID0gJ215X2JhY2t1cCc7Ciskbm9kZV9wcmltYXJ5LT5iYWNrdXAoJGJhY2t1 cF9uYW1lKTsKKworIyBDcmVhdGUgYSBzdHJlYW1pbmcgc3RhbmRieSB3aXRoIGEgMSBzZWNvbmQg ZGVsYXkgZnJvbSB0aGUgYmFja3VwCitteSAkbm9kZV9zdGFuZGJ5ID0gUG9zdGdyZVNRTDo6VGVz dDo6Q2x1c3Rlci0+bmV3KCdzdGFuZGJ5Jyk7CitteSAkZGVsYXkgPSAxOworJG5vZGVfc3RhbmRi eS0+aW5pdF9mcm9tX2JhY2t1cCgkbm9kZV9wcmltYXJ5LCAkYmFja3VwX25hbWUsCisJaGFzX3N0 cmVhbWluZyA9PiAxKTsKKyRub2RlX3N0YW5kYnktPmFwcGVuZF9jb25mKAorCSdwb3N0Z3Jlc3Fs LmNvbmYnLCBxcVsKKwlyZWNvdmVyeV9taW5fYXBwbHlfZGVsYXkgPSAnJHtkZWxheX1zJworXSk7 Ciskbm9kZV9zdGFuZGJ5LT5zdGFydDsKKworCisjIE1ha2Ugc3VyZSB0aGF0IEFGVEVSIHdvcmtz OiBhZGQgbmV3IGNvbnRlbnQgdG8gcHJpbWFyeSBhbmQgbWVtb3JpemUKKyMgcHJpbWFyeSdzIG5l dyBMU04sIHRoZW4gd2FpdCBmb3IgcHJpbWFyeSdzIExTTiBvbiBzdGFuZGJ5LiBQcm92ZSB0aGF0 IEFGVEVSIGlzCisjIGFibGUgdG8gc2V0dXAgYW4gaW5maW5pdGUgd2FpdGluZyBsb29wIGFuZCBl eGl0IGl0IGlmIGdpdmVuIG5vIHdhaXQgdGltZW91dC4KKyRub2RlX3ByaW1hcnktPnNhZmVfcHNx bCgncG9zdGdyZXMnLAorCSJJTlNFUlQgSU5UTyB3YWl0X3Rlc3QgVkFMVUVTIChnZW5lcmF0ZV9z ZXJpZXMoMTEsIDIwKSkiKTsKK215ICRsc24xID0KKyAgJG5vZGVfcHJpbWFyeS0+c2FmZV9wc3Fs KCdwb3N0Z3JlcycsICJTRUxFQ1QgcGdfY3VycmVudF93YWxfbHNuKCkiKTsKK215ICRvdXRwdXQg PSAkbm9kZV9zdGFuZGJ5LT5zYWZlX3BzcWwoCisJJ3Bvc3RncmVzJywgcXFbCisJQ0FMTCBwZ193 YWl0X2xzbignJHtsc24xfScsIDEwMDAwMDApOworCVNFTEVDVCBwZ19sc25fY21wKHBnX2xhc3Rf d2FsX3JlcGxheV9sc24oKSwgJyR7bHNuMX0nOjpwZ19sc24pOworXSk7CisKKyMgR2V0IHRoZSBj dXJyZW50IExTTiBvbiBzdGFuZGJ5IGFuZCBtYWtlIHN1cmUgaXQncyB0aGUgc2FtZSBhcyBwcmlt YXJ5J3MgTFNOCitvaygkb3V0cHV0IGVxIDAsICJzdGFuZGJ5IHJlYWNoZWQgdGhlIHNhbWUgTFNO IGFzIHByaW1hcnkgQUZURVIiKTsKKworbXkgJGxzbjIgPQorICAkbm9kZV9wcmltYXJ5LT5zYWZl X3BzcWwoJ3Bvc3RncmVzJywgIlNFTEVDVCBwZ19jdXJyZW50X3dhbF9sc24oKSArIDEiKTsKK215 ICRzdGRlcnI7Ciskbm9kZV9zdGFuZGJ5LT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgIkNBTEwgcGdf d2FpdF9sc24oJyR7bHNuMX0nLCAxKTsiKTsKKyRub2RlX3N0YW5kYnktPnBzcWwoCisJJ3Bvc3Rn cmVzJywKKwkiQ0FMTCBwZ193YWl0X2xzbignJHtsc24yfScsIDEpOyIsCisJc3RkZXJyID0+IFwk c3RkZXJyKTsKK29rKCAkc3RkZXJyID1+IC9jYW5jZWxpbmcgd2FpdGluZyBmb3IgTFNOIGR1ZSB0 byB0aW1lb3V0LywKKwkiZ2V0IHRpbWVvdXQgb24gd2FpdGluZyBmb3IgdW5yZWFjaGFibGUgTFNO Iik7CisKKworJG5vZGVfc3RhbmRieS0+c3RvcDsKKyRub2RlX3ByaW1hcnktPnN0b3A7Citkb25l X3Rlc3RpbmcoKTsK --=_2624648729306eaefa055db7e850aaf5--