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 1jloyT-0003Bu-HC for pgsql-hackers@arkaria.postgresql.org; Thu, 18 Jun 2020 07:28:37 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1jloyS-0006Ge-5z for pgsql-hackers@arkaria.postgresql.org; Thu, 18 Jun 2020 07:28:36 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1jloyR-0006GX-QY for pgsql-hackers@lists.postgresql.org; Thu, 18 Jun 2020 07:28:35 +0000 Received: from smtp-fw-33001.amazon.com ([207.171.190.10]) by magus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1jloyO-0003Ro-Li for pgsql-hackers@postgresql.org; Thu, 18 Jun 2020 07:28:35 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amazon.com; i=@amazon.com; q=dns/txt; s=amazon201209; t=1592465313; x=1624001313; h=from:to:subject:message-id:date:mime-version; bh=N1r6u7lyiV6A9k9WetTkOtMSNb38sJtjFraGCTcAW8I=; b=LrDSjMLFjjKOslhz7ojiMUmhEU6XD8D+SmLWVEXCSGkhlstcDEryjf0B NxAFsKDpX/wFsnHWnZqEF8bNAYc5gZuOoEYCr5wog2TdajBkh4OwYwKHU /GBcWmyp/Uu0pctIyUQ0rUOMvZHy19hM302wgvZ9+uypOzPDlN/7Ug1xN U=; IronPort-SDR: 9tqOBK8377i3xXClLj1kCgzuZxIJyttiwetomo1b0v9cnlqEWaPV8Yg2ijHAVypFvBNl6u/1qG 3w3fue+mdI7g== X-Amazon-filename: v1-0001-Add-Standby-Recovery-Conflicts-Info.patch X-IronPort-AV: E=Sophos;i="5.73,525,1583193600"; d="scan'208,217";a="51877859" Received: from sea32-co-svc-lb4-vlan3.sea.corp.amazon.com (HELO email-inbound-relay-2a-538b0bfb.us-west-2.amazon.com) ([10.47.23.38]) by smtp-border-fw-out-33001.sea14.amazon.com with ESMTP; 18 Jun 2020 07:28:22 +0000 Received: from EX13MTAUEA002.ant.amazon.com (pdx4-ws-svc-p6-lb7-vlan3.pdx.amazon.com [10.170.41.166]) by email-inbound-relay-2a-538b0bfb.us-west-2.amazon.com (Postfix) with ESMTPS id CC838A1C77 for ; Thu, 18 Jun 2020 07:28:21 +0000 (UTC) Received: from EX13D03EUC003.ant.amazon.com (10.43.164.192) by EX13MTAUEA002.ant.amazon.com (10.43.61.77) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Thu, 18 Jun 2020 07:28:21 +0000 Received: from 38f9d36c4abb.ant.amazon.com (10.43.161.175) by EX13D03EUC003.ant.amazon.com (10.43.164.192) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Thu, 18 Jun 2020 07:28:18 +0000 From: "Drouvot, Bertrand" To: Subject: Add Information during standby recovery conflicts Message-ID: <9a60178c-a853-1440-2cdc-c3af916cff59@amazon.com> Date: Thu, 18 Jun 2020 09:28:13 +0200 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:68.0) Gecko/20100101 Thunderbird/68.4.1 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------BE2C525BCE693490C8EF26D9" Content-Language: en-US X-Originating-IP: [10.43.161.175] X-ClientProxiedBy: EX13D44UWC001.ant.amazon.com (10.43.162.26) To EX13D03EUC003.ant.amazon.com (10.43.164.192) List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk --------------BE2C525BCE693490C8EF26D9 Content-Type: multipart/alternative; boundary="------------7FD7A488E0C7312314DFB9E4" --------------7FD7A488E0C7312314DFB9E4 Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 7bit Hi hackers, I've attached a patch to add information during standby recovery conflicts. The motive behind is to be able to get some information: * On the apply side * On the blocker(s) side _Motivation:_ When a standby recovery conflict occurs it could be useful to get more information to be able to dive deep on the root cause and find a way to avoid/mitigate new occurrences. Adding this information would make the investigations easier, it could help answering questions like: * On which LSN was the WAL apply blocked? * What was the purpose of the bocked WAL record? * On which relation (if any) was the blocked WAL record related to? * What was the blocker(s) doing? * When did the blocker(s) started their queries (if any)? * What was the blocker(s) waiting for? on which wait event? _Technical context and proposal:_ There is 2 points in this patch: * Add the information about the blocked WAL record. This is done in standby.c (ResolveRecoveryConflictWithVirtualXIDs, ResolveRecoveryConflictWithDatabase, StandbyTimeoutHandler) * Add the information about the blocker(s). This is done in postgres.c (RecoveryConflictInterrupt) _Outcome Example:_ 2020-06-15 06:48:23.774 UTC [6971] LOG: wal record apply is blocked by 2 connection(s), reason: User query might have needed to see row versions that must be removed. 2020-06-15 06:48:23.774 UTC [6971] LOG: blocked wal record rmgr: Heap2, lsn: 0/038E2678, received at: 2020-06-15 06:48:23.774098+00, desc: CLEAN, relation: rel 1663/13586/16652 fork main blk 0 2020-06-15 06:48:54.773 UTC [7088] LOG: about to interrupt pid: 7088, backend_type: client backend, state: active, wait_event_type: Timeout, wait_event: PgSleep, query_start: 2020-06-15 06:48:14.87672+00 2020-06-15 06:48:54.773 UTC [7088] DETAIL: statement: select *, pg_sleep(120) from bdt; 2020-06-15 06:48:54.773 UTC [7088] STATEMENT: select *, pg_sleep(120) from bdt; 2020-06-15 06:48:54.773 UTC [7088] ERROR: canceling statement due to conflict with recovery 2020-06-15 06:48:54.773 UTC [7088] DETAIL: User query might have needed to see row versions that must be removed. 2020-06-15 06:48:54.773 UTC [7088] STATEMENT: select *, pg_sleep(120) from bdt; 2020-06-15 06:48:54.778 UTC [7037] LOG: about to interrupt pid: 7037, backend_type: client backend, state: active, wait_event_type: Timeout, wait_event: PgSleep, query_start: 2020-06-15 06:48:13.008427+00 2020-06-15 06:48:54.778 UTC [7037] DETAIL: statement: select *, pg_sleep(300) from bdt; 2020-06-15 06:48:54.778 UTC [7037] STATEMENT: select *, pg_sleep(300) from bdt; 2020-06-15 06:48:54.778 UTC [7037] ERROR: canceling statement due to conflict with recovery 2020-06-15 06:48:54.778 UTC [7037] DETAIL: User query might have needed to see row versions that must be removed. 2020-06-15 06:48:54.778 UTC [7037] STATEMENT: select *, pg_sleep(300) from bdt; It takes care of the other conflicts reason too. So, should a standby recovery conflict occurs, we could see: * information about the blocked WAL record apply * information about the blocker(s) I will add this patch to the next commitfest. I look forward to your feedback about the idea and/or implementation. Regards, Bertrand --------------7FD7A488E0C7312314DFB9E4 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: 7bit

Hi hackers,

I've attached a patch to add information during standby recovery conflicts.
The motive behind is to be able to get some information:

  • On the apply side
  • On the blocker(s) side
Motivation:

When a standby recovery conflict occurs it could be useful to get more information to be able to dive deep on the root cause and find a way to avoid/mitigate new occurrences.

Adding this information would make the investigations easier, it could help answering questions like:
  • On which LSN was the WAL apply blocked?
  • What was the purpose of the bocked WAL record?
  • On which relation (if any) was the blocked WAL record related to?
  • What was the blocker(s) doing?
  • When did the blocker(s) started their queries (if any)?
  • What was the blocker(s) waiting for? on which wait event?
Technical context and proposal:

There is 2 points in this patch:
  • Add the information about the blocked WAL record. This is done in standby.c (ResolveRecoveryConflictWithVirtualXIDs, ResolveRecoveryConflictWithDatabase, StandbyTimeoutHandler)
  • Add the information about the blocker(s). This is done in postgres.c (RecoveryConflictInterrupt)
Outcome Example:
2020-06-15 06:48:23.774 UTC [6971] LOG:  wal record apply is blocked by 2 connection(s), reason: User query might have needed to see row versions that must be removed.
2020-06-15 06:48:23.774 UTC [6971] LOG:  blocked wal record rmgr: Heap2, lsn: 0/038E2678, received at: 2020-06-15 06:48:23.774098+00, desc: CLEAN, relation: rel 1663/13586/16652 fork main blk 0
2020-06-15 06:48:54.773 UTC [7088] LOG:  about to interrupt pid: 7088, backend_type: client backend, state: active, wait_event_type: Timeout, wait_event: PgSleep, query_start: 2020-06-15 06:48:14.87672+00
2020-06-15 06:48:54.773 UTC [7088] DETAIL:  statement: select *, pg_sleep(120)  from bdt;
2020-06-15 06:48:54.773 UTC [7088] STATEMENT:  select *, pg_sleep(120)  from bdt;
2020-06-15 06:48:54.773 UTC [7088] ERROR:  canceling statement due to conflict with recovery
2020-06-15 06:48:54.773 UTC [7088] DETAIL:  User query might have needed to see row versions that must be removed.
2020-06-15 06:48:54.773 UTC [7088] STATEMENT:  select *, pg_sleep(120)  from bdt;
2020-06-15 06:48:54.778 UTC [7037] LOG:  about to interrupt pid: 7037, backend_type: client backend, state: active, wait_event_type: Timeout, wait_event: PgSleep, query_start: 2020-06-15 06:48:13.008427+00
2020-06-15 06:48:54.778 UTC [7037] DETAIL:  statement: select *, pg_sleep(300)  from bdt;
2020-06-15 06:48:54.778 UTC [7037] STATEMENT:  select *, pg_sleep(300)  from bdt;
2020-06-15 06:48:54.778 UTC [7037] ERROR:  canceling statement due to conflict with recovery
2020-06-15 06:48:54.778 UTC [7037] DETAIL:  User query might have needed to see row versions that must be removed.
2020-06-15 06:48:54.778 UTC [7037] STATEMENT:  select *, pg_sleep(300)  from bdt;

It takes care of the other conflicts reason too.

So, should a standby recovery conflict occurs, we could see:
  • information about the blocked WAL record apply
  • information about the blocker(s)
I will add this patch to the next commitfest. I look forward to your feedback about the idea and/or implementation.

Regards,

Bertrand

--------------7FD7A488E0C7312314DFB9E4-- --------------BE2C525BCE693490C8EF26D9 Content-Type: text/plain; charset="UTF-8"; x-mac-type=0; x-mac-creator=0; name="v1-0001-Add-Standby-Recovery-Conflicts-Info.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="v1-0001-Add-Standby-Recovery-Conflicts-Info.patch" IHNyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hsb2cuYyAgICB8ICAzICsrCiBzcmMvYmFj a2VuZC9wb3N0bWFzdGVyL3Bnc3RhdC5jICAgICAgfCAzMSArKysrKysrKysrKysrKysKIHNy Yy9iYWNrZW5kL3N0b3JhZ2UvaXBjL3Byb2NzaWduYWwuYyB8IDM2ICsrKysrKysrKysrKysr KysrKwogc3JjL2JhY2tlbmQvc3RvcmFnZS9pcGMvc3RhbmRieS5jICAgIHwgNzMgKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiBzcmMvYmFja2VuZC90Y29wL3Bvc3Rn cmVzLmMgICAgICAgICAgfCA1NiArKysrKysrKysrKysrKysrKysrKysrKysrKysKIHNyYy9p bmNsdWRlL2FjY2Vzcy94bG9nLmggICAgICAgICAgICB8ICAxICsKIHNyYy9pbmNsdWRlL3Bn c3RhdC5oICAgICAgICAgICAgICAgICB8ICAxICsKIHNyYy9pbmNsdWRlL3N0b3JhZ2UvcHJv Y3NpZ25hbC5oICAgICB8ICAxICsKIDggZmlsZXMgY2hhbmdlZCwgMjAyIGluc2VydGlvbnMo KykKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94bG9nLmMgYi9z cmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94bG9nLmMKaW5kZXggNTVjYWMxODZkYy4uZDNm OTIzZjk1MSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0veGxvZy5j CisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hsb2cuYwpAQCAtODgwLDYgKzg4 MCw4IEBAIHN0YXRpYyBib29sIGhvbGRpbmdBbGxMb2NrcyA9IGZhbHNlOwogI2lmZGVmIFdB TF9ERUJVRwogc3RhdGljIE1lbW9yeUNvbnRleHQgd2FsRGVidWdDeHQgPSBOVUxMOwogI2Vu ZGlmCisvKiBGb3IgTG9nQmxvY2tlZFdhbFJlY29yZEluZm8gKi8KK1hMb2dSZWFkZXJTdGF0 ZSAqY3VycmVudF9yZXBsYXllZF94bG9nID0gTlVMTDsKIAogc3RhdGljIHZvaWQgcmVhZFJl Y292ZXJ5U2lnbmFsRmlsZSh2b2lkKTsKIHN0YXRpYyB2b2lkIHZhbGlkYXRlUmVjb3ZlcnlQ YXJhbWV0ZXJzKHZvaWQpOwpAQCAtNzMxOSw2ICs3MzIxLDcgQEAgU3RhcnR1cFhMT0codm9p ZCkKIAkJCQkJVHJhbnNhY3Rpb25JZElzVmFsaWQocmVjb3JkLT54bF94aWQpKQogCQkJCQlS ZWNvcmRLbm93bkFzc2lnbmVkVHJhbnNhY3Rpb25JZHMocmVjb3JkLT54bF94aWQpOwogCisJ CQkJY3VycmVudF9yZXBsYXllZF94bG9nID0geGxvZ3JlYWRlcjsKIAkJCQkvKiBOb3cgYXBw bHkgdGhlIFdBTCByZWNvcmQgaXRzZWxmICovCiAJCQkJUm1nclRhYmxlW3JlY29yZC0+eGxf cm1pZF0ucm1fcmVkbyh4bG9ncmVhZGVyKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQv cG9zdG1hc3Rlci9wZ3N0YXQuYyBiL3NyYy9iYWNrZW5kL3Bvc3RtYXN0ZXIvcGdzdGF0LmMK aW5kZXggMzA5Mzc4YWU1NC4uNTEzYzljZDY0MyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQv cG9zdG1hc3Rlci9wZ3N0YXQuYworKysgYi9zcmMvYmFja2VuZC9wb3N0bWFzdGVyL3Bnc3Rh dC5jCkBAIC02NjMzLDYgKzY2MzMsMzcgQEAgcGdzdGF0X2RiX3JlcXVlc3RlZChPaWQgZGF0 YWJhc2VpZCkKIAlyZXR1cm4gZmFsc2U7CiB9CiAKKy8qIC0tLS0tLS0tLS0KKyAqIHBnc3Rh dF9nZXRfc3RhdGVfbmFtZSgpIC0KKyAqCisgKglSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50 aW5nIHRoZSBjdXJyZW50IGJhY2tlbmQgc3RhdGUuCisgKiAtLS0tLS0tLS0tCisgKi8KK2Nv bnN0IGNoYXIgKgorcGdzdGF0X2dldF9zdGF0ZV9uYW1lKEJhY2tlbmRTdGF0ZSBiYWNrZW5k X3N0YXRlKQoreworCXN3aXRjaCAoYmFja2VuZF9zdGF0ZSkKKwl7CisJCWNhc2UgU1RBVEVf SURMRToKKwkJCXJldHVybiAiaWRsZSI7CisJCWNhc2UgU1RBVEVfUlVOTklORzoKKwkJCXJl dHVybiAiYWN0aXZlIjsKKwkJY2FzZSBTVEFURV9JRExFSU5UUkFOU0FDVElPTjoKKwkJCXJl dHVybiAiaWRsZSBpbiB0cmFuc2FjdGlvbiI7CisJCWNhc2UgU1RBVEVfRkFTVFBBVEg6CisJ CQlyZXR1cm4gImZhc3RwYXRoIGZ1bmN0aW9uIGNhbGwiOworCQljYXNlIFNUQVRFX0lETEVJ TlRSQU5TQUNUSU9OX0FCT1JURUQ6CisJCQlyZXR1cm4gImlkbGUgaW4gdHJhbnNhY3Rpb24g KGFib3J0ZWQpIjsKKwkJY2FzZSBTVEFURV9ESVNBQkxFRDoKKwkJCXJldHVybiAiZGlzYWJs ZWQiOworCQljYXNlIFNUQVRFX1VOREVGSU5FRDoKKwkJCXJldHVybiAiIjsKKwkJZGVmYXVs dDoKKwkJCUFzc2VydCgwKTsKKwl9CisJcmV0dXJuICIiOworfQorCiAvKgogICogQ29udmVy dCBhIHBvdGVudGlhbGx5IHVuc2FmZWx5IHRydW5jYXRlZCBhY3Rpdml0eSBzdHJpbmcgKHNl ZQogICogUGdCYWNrZW5kU3RhdHVzLnN0X2FjdGl2aXR5X3JhdydzIGRvY3VtZW50YXRpb24p IGludG8gYSBjb3JyZWN0bHkgdHJ1bmNhdGVkCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9z dG9yYWdlL2lwYy9wcm9jc2lnbmFsLmMgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2lwYy9wcm9j c2lnbmFsLmMKaW5kZXggYzgwOTE5NmQwNi4uMmQ1ODg2ZmY4MCAxMDA2NDQKLS0tIGEvc3Jj L2JhY2tlbmQvc3RvcmFnZS9pcGMvcHJvY3NpZ25hbC5jCisrKyBiL3NyYy9iYWNrZW5kL3N0 b3JhZ2UvaXBjL3Byb2NzaWduYWwuYwpAQCAtNTc2LDMgKzU3NiwzOSBAQCBwcm9jc2lnbmFs X3NpZ3VzcjFfaGFuZGxlcihTSUdOQUxfQVJHUykKIAogCWVycm5vID0gc2F2ZV9lcnJubzsK IH0KKworZXh0ZXJuIGNvbnN0IGNoYXIgKmdldF9wcm9jc2lnbmFsX3JlYXNvbl9kZXNjKFBy b2NTaWduYWxSZWFzb24gcmVhc29uKQorCXsKKwkJY29uc3QgY2hhciAqcmVhc29uRGVzYyA9 ICJ1bmtub3duIHJlYXNvbiI7CisKKwkJc3dpdGNoIChyZWFzb24pCisJCXsKKwkJCWNhc2Ug UFJPQ1NJR19SRUNPVkVSWV9DT05GTElDVF9CVUZGRVJQSU46CisJCQkJcmVhc29uRGVzYyA9 ICJVc2VyIHdhcyBob2xkaW5nIHNoYXJlZCBidWZmZXIgcGluIGZvciB0b28gbG9uZy4iOwor CQkJCWJyZWFrOworCQkJY2FzZSBQUk9DU0lHX1JFQ09WRVJZX0NPTkZMSUNUX0xPQ0s6CisJ CQkJcmVhc29uRGVzYyA9ICJVc2VyIHdhcyBob2xkaW5nIGEgcmVsYXRpb24gbG9jayBmb3Ig dG9vIGxvbmcuIjsKKwkJCQlicmVhazsKKwkJCWNhc2UgUFJPQ1NJR19SRUNPVkVSWV9DT05G TElDVF9UQUJMRVNQQUNFOgorCQkJCXJlYXNvbkRlc2MgPSAiVXNlciB3YXMgb3IgbWlnaHQg aGF2ZSBiZWVuIHVzaW5nIHRhYmxlc3BhY2UgdGhhdCBtdXN0IGJlIGRyb3BwZWQuIjsKKwkJ CQlicmVhazsKKwkJCWNhc2UgUFJPQ1NJR19SRUNPVkVSWV9DT05GTElDVF9TTkFQU0hPVDoK KwkJCQlyZWFzb25EZXNjID0gIlVzZXIgcXVlcnkgbWlnaHQgaGF2ZSBuZWVkZWQgdG8gc2Vl IHJvdyB2ZXJzaW9ucyB0aGF0IG11c3QgYmUgcmVtb3ZlZC4iOworCQkJCWJyZWFrOworCQkJ Y2FzZSBQUk9DU0lHX1JFQ09WRVJZX0NPTkZMSUNUX1NUQVJUVVBfREVBRExPQ0s6CisJCQkJ cmVhc29uRGVzYyA9ICJVc2VyIHRyYW5zYWN0aW9uIGNhdXNlZCBidWZmZXIgZGVhZGxvY2sg d2l0aCByZWNvdmVyeS4iOworCQkJCWJyZWFrOworCQkJY2FzZSBQUk9DU0lHX1JFQ09WRVJZ X0NPTkZMSUNUX0RBVEFCQVNFOgorCQkJCXJlYXNvbkRlc2MgPSAiVXNlciB3YXMgY29ubmVj dGVkIHRvIGEgZGF0YWJhc2UgdGhhdCBtdXN0IGJlIGRyb3BwZWQuIjsKKwkJCQlicmVhazsK KwkJCWNhc2UgUFJPQ1NJR19DQVRDSFVQX0lOVEVSUlVQVDoKKwkJCWNhc2UgUFJPQ1NJR19O T1RJRllfSU5URVJSVVBUOgorCQkJY2FzZSBQUk9DU0lHX1BBUkFMTEVMX01FU1NBR0U6CisJ CQljYXNlIFBST0NTSUdfV0FMU05EX0lOSVRfU1RPUFBJTkc6CisJCQljYXNlIE5VTV9QUk9D U0lHTkFMUzoKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCX0KKwly ZXR1cm4gcmVhc29uRGVzYzsKK30KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3N0b3JhZ2Uv aXBjL3N0YW5kYnkuYyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2UvaXBjL3N0YW5kYnkuYwppbmRl eCA5ZTBkNWVjMjU3Li5hYzg1MjExYmUwIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9zdG9y YWdlL2lwYy9zdGFuZGJ5LmMKKysrIGIvc3JjL2JhY2tlbmQvc3RvcmFnZS9pcGMvc3RhbmRi eS5jCkBAIC0xNiw2ICsxNiw3IEBACiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwogI2lu Y2x1ZGUgInBvc3RncmVzLmgiCisjaW5jbHVkZSAiYWNjZXNzL3JtZ3IuaCIKICNpbmNsdWRl ICJhY2Nlc3MvdHJhbnNhbS5oIgogI2luY2x1ZGUgImFjY2Vzcy90d29waGFzZS5oIgogI2lu Y2x1ZGUgImFjY2Vzcy94YWN0LmgiCkBAIC0zNCw2ICszNSw3IEBACiAjaW5jbHVkZSAidXRp bHMvcHNfc3RhdHVzLmgiCiAjaW5jbHVkZSAidXRpbHMvdGltZW91dC5oIgogI2luY2x1ZGUg InV0aWxzL3RpbWVzdGFtcC5oIgorI2luY2x1ZGUgImFjY2Vzcy94bG9nX2ludGVybmFsLmgi CiAKIC8qIFVzZXItc2V0dGFibGUgR1VDIHBhcmFtZXRlcnMgKi8KIGludAkJCXZhY3V1bV9k ZWZlcl9jbGVhbnVwX2FnZTsKQEAgLTIxNSw2ICsyMTcsNTcgQEAgV2FpdEV4Y2VlZHNNYXhT dGFuZGJ5RGVsYXkodWludDMyIHdhaXRfZXZlbnRfaW5mbykKIAlyZXR1cm4gZmFsc2U7CiB9 CiAKKy8qCisgKiBEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IHRoZSB3YWwgcmVjb3JkCisg KiBhcHBseSBiZWluZyBibG9ja2VkCisgKi8KK3N0YXRpYyB2b2lkCitMb2dCbG9ja2VkV2Fs UmVjb3JkSW5mbyhpbnQgbnVtX3dhaXRsaXN0X2VudHJpZXMsIFByb2NTaWduYWxSZWFzb24g cmVhc29uKQoreworCVJlbEZpbGVOb2RlIHJub2RlOworCUZvcmtOdW1iZXIgZm9ya251bTsK KwlCbG9ja051bWJlciBibGtudW07CisJdWludDY0IHdhbF9yZWNvcmRfbHNuOworCVRpbWVz dGFtcFR6IHJ0aW1lOworCWJvb2wgZnJvbVN0cmVhbTsKKwljaGFyICpyZWNlaXB0X3RpbWVf c3RyOworCVJtZ3JJZCBybWdySWQgPSAtMTsKKwl1aW50OCBpbmZvID0gMDsKKwljb25zdCBj aGFyICpybV9uYW1lOworCWNvbnN0IGNoYXIgKnJtX2luZm87CisJY2hhciAqd2FsX3JlY29y ZF9pbmZvX3N0cjsKKworCWlmIChudW1fd2FpdGxpc3RfZW50cmllcyA+IDApCisJCWVyZXBv cnQoTE9HLCAoZXJybXNnKCJ3YWwgcmVjb3JkIGFwcGx5IGlzIGJsb2NrZWQgYnkgJWQgY29u bmVjdGlvbihzKSwgcmVhc29uOiAlcyIsCisJCQkJCW51bV93YWl0bGlzdF9lbnRyaWVzLCBn ZXRfcHJvY3NpZ25hbF9yZWFzb25fZGVzYyhyZWFzb24pKSkpOworCWVsc2UKKwkJZXJlcG9y dChMT0csIChlcnJtc2coIndhbCByZWNvcmQgYXBwbHkgaXMgYmxvY2tlZCwgcmVhc29uOiAl cyIsCisJCQkJCWdldF9wcm9jc2lnbmFsX3JlYXNvbl9kZXNjKHJlYXNvbikpKSk7CisKKwl3 YWxfcmVjb3JkX2xzbiA9IGN1cnJlbnRfcmVwbGF5ZWRfeGxvZy0+UmVhZFJlY1B0cjsKKwly bWdySWQgPSBYTG9nUmVjR2V0Um1pZChjdXJyZW50X3JlcGxheWVkX3hsb2cpOworCWluZm8g PSBYTG9nUmVjR2V0SW5mbyhjdXJyZW50X3JlcGxheWVkX3hsb2cpICYgflhMUl9JTkZPX01B U0s7CisKKwlybV9uYW1lID0gUm1nclRhYmxlW3JtZ3JJZF0ucm1fbmFtZTsKKwlybV9pbmZv ID0gUm1nclRhYmxlW3JtZ3JJZF0ucm1faWRlbnRpZnkoaW5mbyk7CisKKwlHZXRYTG9nUmVj ZWlwdFRpbWUoJnJ0aW1lLCAmZnJvbVN0cmVhbSk7CisJcmVjZWlwdF90aW1lX3N0ciA9IHBz dHJkdXAodGltZXN0YW1wdHpfdG9fc3RyKHJ0aW1lKSk7CisJd2FsX3JlY29yZF9pbmZvX3N0 ciA9IHBzcHJpbnRmKCJibG9ja2VkIHdhbCByZWNvcmQgcm1ncjogJXMsIGxzbjogJVgvJTA4 WCwgcmVjZWl2ZWQgYXQ6ICVzLCBkZXNjOiAlcyIsIHJtX25hbWUsICh1aW50MzIpICh3YWxf cmVjb3JkX2xzbiA+PiAzMiksICh1aW50MzIpIHdhbF9yZWNvcmRfbHNuLCByZWNlaXB0X3Rp bWVfc3RyLCBybV9pbmZvKTsKKworCWlmIChYTG9nUmVjR2V0QmxvY2tUYWcoY3VycmVudF9y ZXBsYXllZF94bG9nLCAwLCAmcm5vZGUsICZmb3JrbnVtLCAmYmxrbnVtKSkKKwkJZXJlcG9y dChMT0csIChlcnJtc2coIiVzLCByZWxhdGlvbjogcmVsICV1LyV1LyV1IGZvcmsgJXMgYmxr ICV1IiwKKwkJCQkJd2FsX3JlY29yZF9pbmZvX3N0ciwKKwkJCQkJcm5vZGUuc3BjTm9kZSwg cm5vZGUuZGJOb2RlLCBybm9kZS5yZWxOb2RlLAorCQkJCQlmb3JrTmFtZXNbZm9ya251bV0s CisJCQkJCWJsa251bSkpKTsKKwllbHNlCisJCWVyZXBvcnQoTE9HLCAoZXJybXNnKCIlcyIs IHdhbF9yZWNvcmRfaW5mb19zdHIpKSk7CisKKwlwZnJlZSh3YWxfcmVjb3JkX2luZm9fc3Ry KTsKKwlwZnJlZShyZWNlaXB0X3RpbWVfc3RyKTsKK30KKwogLyoKICAqIFRoaXMgaXMgdGhl IG1haW4gZXhlY3V0aW9uZXIgZm9yIGFueSBxdWVyeSBiYWNrZW5kIHRoYXQgY29uZmxpY3Rz IHdpdGgKICAqIHJlY292ZXJ5IHByb2Nlc3NpbmcuIEp1ZGdlbWVudCBoYXMgYWxyZWFkeSBi ZWVuIHBhc3NlZCBvbiBpdCB3aXRoaW4KQEAgLTIzMiw2ICsyODUsOCBAQCBSZXNvbHZlUmVj b3ZlcnlDb25mbGljdFdpdGhWaXJ0dWFsWElEcyhWaXJ0dWFsVHJhbnNhY3Rpb25JZCAqd2Fp dGxpc3QsCiB7CiAJVGltZXN0YW1wVHogd2FpdFN0YXJ0ID0gMDsKIAljaGFyCSAgICpuZXdf c3RhdHVzOworCVZpcnR1YWxUcmFuc2FjdGlvbklkICp0bXBXYWl0bGlzdDsKKwlpbnQgbnVt X3dhaXRsaXN0X2VudHJpZXM7CiAKIAkvKiBGYXN0IGV4aXQsIHRvIGF2b2lkIGEga2VybmVs IGNhbGwgaWYgdGhlcmUncyBubyB3b3JrIHRvIGJlIGRvbmUuICovCiAJaWYgKCFWaXJ0dWFs VHJhbnNhY3Rpb25JZElzVmFsaWQoKndhaXRsaXN0KSkKQEAgLTI0MSw2ICsyOTYsMTcgQEAg UmVzb2x2ZVJlY292ZXJ5Q29uZmxpY3RXaXRoVmlydHVhbFhJRHMoVmlydHVhbFRyYW5zYWN0 aW9uSWQgKndhaXRsaXN0LAogCQl3YWl0U3RhcnQgPSBHZXRDdXJyZW50VGltZXN0YW1wKCk7 CiAJbmV3X3N0YXR1cyA9IE5VTEw7CQkJLyogd2UgaGF2ZW4ndCBjaGFuZ2VkIHRoZSBwcyBk aXNwbGF5ICovCiAKKwl0bXBXYWl0bGlzdCA9IHdhaXRsaXN0OworCXdoaWxlIChWaXJ0dWFs VHJhbnNhY3Rpb25JZElzVmFsaWQoKnRtcFdhaXRsaXN0KSkKKwl7CisJCXRtcFdhaXRsaXN0 Kys7CisJfQorCisJbnVtX3dhaXRsaXN0X2VudHJpZXMgPSAodG1wV2FpdGxpc3QgLSB3YWl0 bGlzdCk7CisKKwkvKiBkaXNwbGF5IHdhbCByZWNvcmQgaW5mb3JtYXRpb24gKi8KKwlMb2dC bG9ja2VkV2FsUmVjb3JkSW5mbyhudW1fd2FpdGxpc3RfZW50cmllcywgcmVhc29uKTsKKwog CXdoaWxlIChWaXJ0dWFsVHJhbnNhY3Rpb25JZElzVmFsaWQoKndhaXRsaXN0KSkKIAl7CiAJ CS8qIHJlc2V0IHN0YW5kYnlXYWl0X3VzIGZvciBlYWNoIHhhY3Qgd2Ugd2FpdCBmb3IgKi8K QEAgLTM3MCw2ICs0MzYsMTAgQEAgUmVzb2x2ZVJlY292ZXJ5Q29uZmxpY3RXaXRoRGF0YWJh c2UoT2lkIGRiaWQpCiAJICogYmxvY2sgZHVyaW5nIEluaXRQb3N0Z3JlcygpIGFuZCB0aGVu IGRpc2Nvbm5lY3Qgd2hlbiB0aGV5IHNlZSB0aGUKIAkgKiBkYXRhYmFzZSBoYXMgYmVlbiBy ZW1vdmVkLgogCSAqLworCisJLyogZGlzcGxheSB3YWwgcmVjb3JkIGluZm9ybWF0aW9uICov CisJTG9nQmxvY2tlZFdhbFJlY29yZEluZm8oQ291bnREQkJhY2tlbmRzKGRiaWQpLCBQUk9D U0lHX1JFQ09WRVJZX0NPTkZMSUNUX0RBVEFCQVNFKTsKKwogCXdoaWxlIChDb3VudERCQmFj a2VuZHMoZGJpZCkgPiAwKQogCXsKIAkJQ2FuY2VsREJCYWNrZW5kcyhkYmlkLCBQUk9DU0lH X1JFQ09WRVJZX0NPTkZMSUNUX0RBVEFCQVNFLCB0cnVlKTsKQEAgLTYwOSw2ICs2NzksOSBA QCBTdGFuZGJ5VGltZW91dEhhbmRsZXIodm9pZCkKIAkvKiBmb3JnZXQgYW55IHBlbmRpbmcg U1RBTkRCWV9ERUFETE9DS19USU1FT1VUIHJlcXVlc3QgKi8KIAlkaXNhYmxlX3RpbWVvdXQo U1RBTkRCWV9ERUFETE9DS19USU1FT1VULCBmYWxzZSk7CiAKKwkvKiBkaXNwbGF5IHdhbCBy ZWNvcmQgaW5mb3JtYXRpb24gKi8KKwlMb2dCbG9ja2VkV2FsUmVjb3JkSW5mbygtMSwgUFJP Q1NJR19SRUNPVkVSWV9DT05GTElDVF9CVUZGRVJQSU4pOworCiAJU2VuZFJlY292ZXJ5Q29u ZmxpY3RXaXRoQnVmZmVyUGluKFBST0NTSUdfUkVDT1ZFUllfQ09ORkxJQ1RfQlVGRkVSUElO KTsKIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdGNvcC9wb3N0Z3Jlcy5jIGIvc3Jj L2JhY2tlbmQvdGNvcC9wb3N0Z3Jlcy5jCmluZGV4IGM5NDI0ZjE2N2MuLjE5MmFhMWRjNTIg MTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3Rjb3AvcG9zdGdyZXMuYworKysgYi9zcmMvYmFj a2VuZC90Y29wL3Bvc3RncmVzLmMKQEAgLTEyNiw2ICsxMjYsOCBAQCBjaGFyCSAgICpzdGFj a19iYXNlX3B0ciA9IE5VTEw7CiBjaGFyCSAgICpyZWdpc3Rlcl9zdGFja19iYXNlX3B0ciA9 IE5VTEw7CiAjZW5kaWYKIAorI2RlZmluZSBVSU5UMzJfQUNDRVNTX09OQ0UodmFyKSAgICAg ICAgICAgICAgKCh1aW50MzIpKCooKHZvbGF0aWxlIHVpbnQzMiAqKSYodmFyKSkpKQorCiAv KgogICogRmxhZyB0byBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgd2UgaGF2ZSBzdGFydGVkIGEg dHJhbnNhY3Rpb24uCiAgKiBGb3IgZXh0ZW5kZWQgcXVlcnkgcHJvdG9jb2wgdGhpcyBoYXMg dG8gYmUgcmVtZW1iZXJlZCBhY3Jvc3MgbWVzc2FnZXMuCkBAIC0xOTEsNiArMTkzLDcgQEAg c3RhdGljIHZvaWQgZHJvcF91bm5hbWVkX3N0bXQodm9pZCk7CiBzdGF0aWMgdm9pZCBsb2df ZGlzY29ubmVjdGlvbnMoaW50IGNvZGUsIERhdHVtIGFyZyk7CiBzdGF0aWMgdm9pZCBlbmFi bGVfc3RhdGVtZW50X3RpbWVvdXQodm9pZCk7CiBzdGF0aWMgdm9pZCBkaXNhYmxlX3N0YXRl bWVudF90aW1lb3V0KHZvaWQpOworc3RhdGljIHZvaWQgTG9nQmxvY2tpbmdXYWxSZWNvcmRB cHBseUluZm8odm9pZCk7CiAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMjg4Niw2ICsyODg5LDU4 IEBAIEZsb2F0RXhjZXB0aW9uSGFuZGxlcihTSUdOQUxfQVJHUykKIAkJCQkJICAgImludmFs aWQgb3BlcmF0aW9uLCBzdWNoIGFzIGRpdmlzaW9uIGJ5IHplcm8uIikpKTsKIH0KIAorLyoK KyAqIERpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJhY2tlbmQKKyAqIGFib3V0IHRv IGJlIGludGVycnVwdGVkIGR1ZSB0byByZWNvdmVyeSBjb25mbGljdAorICovCit2b2lkCitM b2dCbG9ja2luZ1dhbFJlY29yZEFwcGx5SW5mbyh2b2lkKQoreworCisJUGdCYWNrZW5kU3Rh dHVzICpiZWVudHJ5OworCWludCAgICAgICAgICAgICAgICAgICAgIG51bV9iYWNrZW5kcyA9 IHBnc3RhdF9mZXRjaF9zdGF0X251bWJhY2tlbmRzKCk7CisJaW50ICAgICAgICAgICAgICAg ICAgICAgY3Vycl9iYWNrZW5kOworCXVpbnQzMiByYXdfd2FpdF9ldmVudDsKKwljb25zdCBj aGFyICp3YWl0X2V2ZW50ID0gTlVMTDsKKwljb25zdCBjaGFyICp3YWl0X2V2ZW50X3R5cGUg PSBOVUxMOworCWNoYXIgKmNsaXBwZWRfYWN0aXZpdHk7CisJY29uc3QgY2hhciAqYWN0aXZp dHlfc3RhcnQ7CisJY29uc3QgY2hhciAqYmFja2VuZF9zdGF0ZV9uYW1lOworCWNvbnN0IGNo YXIgKmJhY2tlbmRfdHlwZTsKKworCUFzc2VydChNeVByb2MgIT0gTlVMTCk7CisJLyoKKwkg KiBNYWtlIHN1cmUgYW55IHN0YXRzIHNuYXBzaG90IGlzIHRocm93biBhd2F5CisJICovCisJ cGdzdGF0X2NsZWFyX3NuYXBzaG90KCk7CisKKwlmb3IgKGN1cnJfYmFja2VuZCA9IDE7IGN1 cnJfYmFja2VuZCA8PSBudW1fYmFja2VuZHM7IGN1cnJfYmFja2VuZCsrKQorCXsKKwkJYmVl bnRyeSA9IHBnc3RhdF9mZXRjaF9zdGF0X2JlZW50cnkoY3Vycl9iYWNrZW5kKTsKKwkJaWYg KGJlZW50cnktPnN0X3Byb2NwaWQgIT0gTXlQcm9jLT5waWQpCisJCQljb250aW51ZTsKKwor CQliYWNrZW5kX3N0YXRlX25hbWUgPSBwZ3N0YXRfZ2V0X3N0YXRlX25hbWUoYmVlbnRyeS0+ c3Rfc3RhdGUpOworCQliYWNrZW5kX3R5cGUgPSBHZXRCYWNrZW5kVHlwZURlc2MoYmVlbnRy eS0+c3RfYmFja2VuZFR5cGUpOworCQlhY3Rpdml0eV9zdGFydCA9IHRpbWVzdGFtcHR6X3Rv X3N0cihiZWVudHJ5LT5zdF9hY3Rpdml0eV9zdGFydF90aW1lc3RhbXApOworCQljbGlwcGVk X2FjdGl2aXR5ID0gcGdzdGF0X2NsaXBfYWN0aXZpdHkoYmVlbnRyeS0+c3RfYWN0aXZpdHlf cmF3KTsKKworCQlyYXdfd2FpdF9ldmVudCA9IFVJTlQzMl9BQ0NFU1NfT05DRShNeVByb2Mt PndhaXRfZXZlbnRfaW5mbyk7CisJCXdhaXRfZXZlbnQgPSBwZ3N0YXRfZ2V0X3dhaXRfZXZl bnQocmF3X3dhaXRfZXZlbnQpOworCQl3YWl0X2V2ZW50X3R5cGUgPSBwZ3N0YXRfZ2V0X3dh aXRfZXZlbnRfdHlwZShyYXdfd2FpdF9ldmVudCk7CisKKwkJZXJlcG9ydChMT0csCisJCQko ZXJybXNnKCJhYm91dCB0byBpbnRlcnJ1cHQgcGlkOiAlZCwgYmFja2VuZF90eXBlOiAlcywg c3RhdGU6ICVzLCB3YWl0X2V2ZW50X3R5cGU6ICVzLCB3YWl0X2V2ZW50OiAlcywgcXVlcnlf c3RhcnQ6ICVzIiwKKwkJCQlNeVByb2MtPnBpZCwgYmFja2VuZF90eXBlLCBiYWNrZW5kX3N0 YXRlX25hbWUsIHdhaXRfZXZlbnRfdHlwZSA/IHdhaXRfZXZlbnRfdHlwZSA6ICJub25lIiwg d2FpdF9ldmVudCA/IHdhaXRfZXZlbnQgOiAibm9uZSIsIGFjdGl2aXR5X3N0YXJ0KSwKKwkJ CQllcnJkZXRhaWwoInN0YXRlbWVudDogJXMiLCBjbGlwcGVkX2FjdGl2aXR5KSkpOworCQlw ZnJlZShjbGlwcGVkX2FjdGl2aXR5KTsKKwl9CisJLyoKKwkgKiBNYWtlIHN1cmUgYW55IHN0 YXRzIHNuYXBzaG90IGlzIHRocm93biBhd2F5CisJICovCisJcGdzdGF0X2NsZWFyX3NuYXBz aG90KCk7Cit9CisKIC8qCiAgKiBSZWNvdmVyeUNvbmZsaWN0SW50ZXJydXB0OiBvdXQtb2Yt bGluZSBwb3J0aW9uIG9mIHJlY292ZXJ5IGNvbmZsaWN0CiAgKiBoYW5kbGluZyBmb2xsb3dp bmcgcmVjZWlwdCBvZiBTSUdVU1IxLiBEZXNpZ25lZCB0byBiZSBzaW1pbGFyIHRvIGRpZSgp CkBAIC0yOTg2LDYgKzMwNDEsNyBAQCBSZWNvdmVyeUNvbmZsaWN0SW50ZXJydXB0KFByb2NT aWduYWxSZWFzb24gcmVhc29uKQogCQkJCQkgKGludCkgcmVhc29uKTsKIAkJfQogCisJCUxv Z0Jsb2NraW5nV2FsUmVjb3JkQXBwbHlJbmZvKCk7CiAJCUFzc2VydChSZWNvdmVyeUNvbmZs aWN0UGVuZGluZyAmJiAoUXVlcnlDYW5jZWxQZW5kaW5nIHx8IFByb2NEaWVQZW5kaW5nKSk7 CiAKIAkJLyoKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL2FjY2Vzcy94bG9nLmggYi9zcmMv aW5jbHVkZS9hY2Nlc3MveGxvZy5oCmluZGV4IGU5MTdkZmU5MmQuLmVhZmQ0MjAxZGIgMTAw NjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL2FjY2Vzcy94bG9nLmgKKysrIGIvc3JjL2luY2x1ZGUv YWNjZXNzL3hsb2cuaApAQCAtMTAwLDYgKzEwMCw3IEBAIHR5cGVkZWYgZW51bQogZXh0ZXJu IFhMb2dSZWNQdHIgUHJvY0xhc3RSZWNQdHI7CiBleHRlcm4gWExvZ1JlY1B0ciBYYWN0TGFz dFJlY0VuZDsKIGV4dGVybiBQR0RMTElNUE9SVCBYTG9nUmVjUHRyIFhhY3RMYXN0Q29tbWl0 RW5kOworZXh0ZXJuIFhMb2dSZWFkZXJTdGF0ZSAqY3VycmVudF9yZXBsYXllZF94bG9nOwog CiBleHRlcm4gYm9vbCByZWFjaGVkQ29uc2lzdGVuY3k7CiAKZGlmZiAtLWdpdCBhL3NyYy9p bmNsdWRlL3Bnc3RhdC5oIGIvc3JjL2luY2x1ZGUvcGdzdGF0LmgKaW5kZXggYzU1ZGMxNDgx Yy4uMmZjYTc2OWJjOSAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvcGdzdGF0LmgKKysrIGIv c3JjL2luY2x1ZGUvcGdzdGF0LmgKQEAgLTEzMzQsNiArMTMzNCw3IEBAIGV4dGVybiBQZ1N0 YXRfVGFibGVTdGF0dXMgKmZpbmRfdGFic3RhdF9lbnRyeShPaWQgcmVsX2lkKTsKIGV4dGVy biBQZ1N0YXRfQmFja2VuZEZ1bmN0aW9uRW50cnkgKmZpbmRfZnVuY3N0YXRfZW50cnkoT2lk IGZ1bmNfaWQpOwogCiBleHRlcm4gdm9pZCBwZ3N0YXRfaW5pdHN0YXRzKFJlbGF0aW9uIHJl bCk7CitleHRlcm4gY29uc3QgY2hhciAqcGdzdGF0X2dldF9zdGF0ZV9uYW1lKEJhY2tlbmRT dGF0ZSBiYWNrZW5kX3N0YXRlKTsKIAogZXh0ZXJuIGNoYXIgKnBnc3RhdF9jbGlwX2FjdGl2 aXR5KGNvbnN0IGNoYXIgKnJhd19hY3Rpdml0eSk7CiAKZGlmZiAtLWdpdCBhL3NyYy9pbmNs dWRlL3N0b3JhZ2UvcHJvY3NpZ25hbC5oIGIvc3JjL2luY2x1ZGUvc3RvcmFnZS9wcm9jc2ln bmFsLmgKaW5kZXggYTBjMGJjM2NlNS4uYzU3NDEzYjA2ZCAxMDA2NDQKLS0tIGEvc3JjL2lu Y2x1ZGUvc3RvcmFnZS9wcm9jc2lnbmFsLmgKKysrIGIvc3JjL2luY2x1ZGUvc3RvcmFnZS9w cm9jc2lnbmFsLmgKQEAgLTcwLDUgKzcwLDYgQEAgZXh0ZXJuIHZvaWQgV2FpdEZvclByb2NT aWduYWxCYXJyaWVyKHVpbnQ2NCBnZW5lcmF0aW9uKTsKIGV4dGVybiB2b2lkIFByb2Nlc3NQ cm9jU2lnbmFsQmFycmllcih2b2lkKTsKIAogZXh0ZXJuIHZvaWQgcHJvY3NpZ25hbF9zaWd1 c3IxX2hhbmRsZXIoU0lHTkFMX0FSR1MpOworZXh0ZXJuIGNvbnN0IGNoYXIgKmdldF9wcm9j c2lnbmFsX3JlYXNvbl9kZXNjKFByb2NTaWduYWxSZWFzb24gcmVhc29uKTsKIAogI2VuZGlm CQkJCQkJCS8qIFBST0NTSUdOQUxfSCAqLwo= --------------BE2C525BCE693490C8EF26D9--