From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id 7A37B1FF165 for ; Thu, 14 Aug 2025 09:54:59 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id B7A5EB709; Thu, 14 Aug 2025 09:56:39 +0200 (CEST) From: Lukas Wagner To: pdm-devel@lists.proxmox.com Date: Thu, 14 Aug 2025 09:56:17 +0200 Message-ID: <20250814075622.51786-2-l.wagner@proxmox.com> X-Mailer: git-send-email 2.47.2 In-Reply-To: <20250814075622.51786-1-l.wagner@proxmox.com> References: <20250814075622.51786-1-l.wagner@proxmox.com> MIME-Version: 1.0 X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1755158155008 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.021 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: [pdm-devel] [PATCH proxmox-datacenter-manager v6 1/6] remote tasks: implement improved cache for remote tasks X-BeenThere: pdm-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Datacenter Manager development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Proxmox Datacenter Manager development discussion Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: pdm-devel-bounces@lists.proxmox.com Sender: "pdm-devel" VGhpcyBjb21taXQgYWRkcyBhIG5ldyBpbXBsZW1lbnRhdGlvbiBmb3IgYSBjYWNoZSBmb3IgcmVt b3RlIHRhc2tzLCBvbmUKdGhhdCBzaG91bGQgaW1wcm92ZSBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJp c3RpY3MgaW4gZm9yIHByZXR0eSBtdWNoIGFsbAp1c2UgY2FzZXMuCgpJbiBnZW5lcmFsIHN0b3Jh Z2Ugd29ya3MgcHJldHR5IHNpbWlsYXIgdG8gdGhlIHRhc2sgYXJjaGl2ZSB3ZSBhbHJlYWR5Cmhh dmUgZm9yIChsb2NhbCkgUERNIHRhc2tzLgoKcm9vdEBwZG0tZGV2Oi92YXIvY2FjaGUvcHJveG1v eC1kYXRhY2VudGVyLW1hbmFnZXIvcmVtb3RlLXRhc2tzIyBscyAtbAp0b3RhbCA0MAotcnctci0t ci0tIDEgd3d3LWRhdGEgd3d3LWRhdGEgICAgIDAgTWFyIDEzIDEzOjE4IGFjdGl2ZQotcnctci0t ci0tIDEgd3d3LWRhdGEgd3d3LWRhdGEgIDE2NzYgTWFyIDExIDE0OjUxIGFyY2hpdmUuMTc0MTM1 NTQ2Mi56c3QKLXJ3LXItLXItLSAxIHd3dy1kYXRhIHd3dy1kYXRhICAgICAwIE1hciAxMSAxNDo1 MSBhcmNoaXZlLjE3NDE0NDE4NjIuenN0Ci1ydy1yLS1yLS0gMSB3d3ctZGF0YSB3d3ctZGF0YSAg MjUzOCBNYXIgMTEgMTQ6NTEgYXJjaGl2ZS4xNzQxNTI4MjYyLnpzdAotcnctci0tci0tIDEgd3d3 LWRhdGEgd3d3LWRhdGEgIDg0MjggTWFyIDExIDE1OjA3IGFyY2hpdmUuMTc0MTYxNDY2Mi56c3QK LXJ3LXItLXItLSAxIHd3dy1kYXRhIHd3dy1kYXRhIDExNzQwIE1hciAxMyAxMDoxOCBhcmNoaXZl LjE3NDE3MDEwNjIKLXJ3LXItLXItLSAxIHd3dy1kYXRhIHd3dy1kYXRhICAzMzY0IE1hciAxMyAx MzoxOCBhcmNoaXZlLjE3NDE3ODgyNzAKLXJ3LXItLXItLSAxIHd3dy1kYXRhIHd3dy1kYXRhICAg ICAwIE1hciAxMyAxMzoxOCBqb3VybmFsCi1ydy1yLS1yLS0gMSB3d3ctZGF0YSB3d3ctZGF0YSAg IDI4NyBNYXIgMTMgMTM6MTggc3RhdGUKClRhc2tzIGFyZSBzdG9yZWQgaW4gdGhlICdhY3RpdmUn IGFuZCBtdWx0aXBsZSAnYXJjaGl2ZScgZmlsZXMuIFJ1bm5pbmcKdGFza3MgYXJlIHBsYWNlZCBp bnRvIHRoZSAnYWN0aXZlJyBmaWxlLCB0YXNrcyB0aGF0IGFyZSBmaW5pc2hlZCBhcmUKcGVyc2lz dGVkIGludG8gb25lIG9mIHRoZSBhcmNoaXZlIGZpbGVzLiBUaGUgYXJjaGl2ZSBmaWxlcyBhcmUg c3VmZml4ZWQKd2l0aCBhIFVOSVggdGltZXN0YW1wIHdoaWNoIHNlcnZlcyBhcyBhIGxvd2VyLWJv dW5kIGZvciBzdGFydCB0aW1lcyBmb3IKdGFza3Mgc3RvcmVkIGluIHRoaXMgZmlsZS4gRW5jb2Rp bmcgdGhpcyBsb3dlci1ib3VuZCBpbiB0aGUgZmlsZSBuYW1lCmluc3RlYWQgb2YgdXNpbmcgYSBt b3JlIHRyYWRpdGlvbmFsIGluY3JlYXNpbmcgZmlsZSBpbmRleCAoLjEsIC4yLCAuMykKZ2l2ZXMg dXMgdGhlIGJlbmVmaXQgdGhhdCB3ZSBjYW4gZGVjaWRlIGluIHdoaWNoIGZpbGUgYSBuZXdseSBh cnJpdmVkCnRhc2tzIGJlbG9uZ3MgZnJvbSBhIHNpbmdsZSByZWFkZGlyIGNhbGwsIHdpdGhvdXQg ZXZlbiByZWFkaW5nIHRoZSBmaWxlCml0c2VsZi4KCk9sZGVyIGFyY2hpdmUgZmlsZXMgYXJlIGFk ZGl0aW9uYWxseSBjb21wcmVzc2VkIHVzaW5nIHpzdGQuCgpUaGUgc2l6ZSBvZiB0aGUgZW50aXJl IGFyY2hpdmUgY2FuIGJlIGNvbnRyb2xsZWQgYnkgZG9pbmcgZmlsZQoncm90YXRpb24nLCB3aGVy ZSB0aGUgYXJjaGl2ZSBmaWxlIHdpdGggdGhlIG9sZGVzdCB0aW1lc3RhbXAgaXMgZGVsZXRlZAph bmQgYSBuZXcgZmlsZSB3aXRoIHRoZSBjdXJyZW50IHRpbWVzdGFtcCBpcyBhZGRlZC4gSWYgJ3Jv dGF0aW9uJwpoYXBwZW5zIGF0IGZpeGVkIGludGVydmFscyAoZS5nLiBvbmNlIGRhaWx5KSwgdGhp cyBnaXZlcyB1cyBhCmNvbmZpZ3VyYWJsZSBudW1iZXIgb2YgZGF5cyBvZiB0YXNrIGhpc3Rvcnku IFRoZXJlIGlzIG5vIGRpcmVjdCBjYXAgZm9yCnRoZSB0b3RhbCBudW1iZXIgb2YgdGFza3MsIGJ1 dCB0aGlzIGNvdWxkIGJlIGVhc2lseSBhZGRlZCBieSBjaGVja2luZwp0aGUgc2l6ZSBvZiB0aGUg bW9zdCByZWNlbnQgYXJjaGl2ZSBmaWxlIGFuZCBieSByb3RhdGluZyBlYXJseSBpZiBhCnRocmVz aG9sZCBpcyBleGNlZWRlZC4KClRoZSBmb3JtYXQgaW5zaWRlIHRoZSBmaWxlcyBpcyBhbHNvIHNp bWlsYXIgdG8gdGhlIGxvY2FsIHRhc2sgYXJjaGl2ZSwKd2l0aCBvbmUgdGFzayBjb3JyZXNwb25k aW5nIHRvIG9uZSBsaW5lIGluIHRoZSBmaWxlLiBPbmUga2V5IGRpZmZlcmVuY2UKaXMgdGhhdCBo ZXJlIGVhY2ggbGluZSBpcyBhIEpTT04gb2JqZWN0LCB0aGF0IGlzIHRvIG1ha2UgaXQgZWFzaWVy IHRvCmFkZCBhZGRpdGlvbmFsIGRhdGEgbGF0ZXIsIGlmIG5lZWRlZC4gVGhlIEpTT04gb2JqZWN0 IGNvbnRhaW5zIHRoZSB0YXNrcwpVUElELCBzdGF0dXMsIGVuZHRpbWUgYW5kIHN0YXJ0dGltZSAo dGhlIHN0YXJ0dGltZSBpcyB0ZWNobmljYWxseSBhbHNvCmVuY29kZWQgaW4gdGhlIFVQSUQsIGJ1 dCBoYXZpbmcgaXQgYXMgYSBzZXBhcmF0ZSB2YWx1ZSBzaW1wbGlmaWVkIGEKY291cGxlIG9mIHRo aW5ncykgRWFjaCBmaWxlIGlzIHNvcnRlZCBieSB0aGUgdGFzaydzIHN0YXJ0IHRpbWUsIHRoZQp5 b3VuZ2VzdCB0YXNrIGNvbWluZyBmaXJzdC4KCk9uZSBrZXkgZGlmZmVyZW5jZSBiZXR3ZWVuIHRo aXMgdGFzayBjYWNoZSBhbmQgdGhlIGxvY2FsIHRhc2sgYXJjaGl2ZSBpcwp0aGF0IHdlIG5lZWQg dG8gaGFuZGxlIHRhc2tzIGNvbWluZyBpbiBvdXQtb2Ytb3JkZXIsIGUuZy4gaWYgcmVtb3Rlcwp3 ZXJlIG5vdCByZWFjaGFibGUgZm9yIGEgY2VydGFpbiB0aW1lLiBUbyBtYWludGFpbiB0aGUgb3Jk ZXJpbmcgaW4gdGhlCmZpbGUsIHdlIGhhdmUgdG8gbWVyZ2UgdGhlIG5ld2x5IGFycml2ZWQgdGFz a3MgaW50byB0aGUgZXhpc3RpbmcgdGFzawpmaWxlLiBUaGlzIHdhcyBpbXBsZW1lbnRlZCBpbiBh IHdheSB0aGF0IGF2b2lkcyByZWFkaW5nIHRoZSBlbnRpcmUgZmlsZQppbnRvIG1lbW9yeSBhdCBv bmNlLCBleHBsb2l0aW5nIHRoZSBmYWN0IHRoYXQgdGhlIGNvbnRlbnRzIG9mIHRoZQpleGlzdGlu ZyBmaWxlIGFyZSBhbHJlYWR5IHNvcnRlZC4gVGhpcyBhbGxvd3MgdG8gZG8gYSB6aXBwZXIvbWVy Z2Utc29ydApsaWtlIGFwcHJvYWNoIChzZWUgTWVyZ2VUYXNrSXRlcmF0b3IgZm9yIGRldGFpbHMp LiBUaGUgZXhpc3RpbmcgZmlsZSBpcwpvbmx5IHJlYWQgbGluZS1ieS1saW5lIGFuZCBmaW5hbGx5 IHJlcGxhY2VkIGF0b21pY2FsbHkuCgpTaW5jZSB3ZSBhbHdheXMgbmVlZCB0byByZXdyaXRlIHRo ZSBlbnRpcmUgYXJjaGl2ZSBmaWxlLCBldmVuIGlmIHRoZXJlCmlzIG9ubHkgYSBzaW5nbGUgbmV3 IHRhc2sgYWRkZWQsIHRoZXJlIGlzIGFsc28gYSBqb3VybmFsL1dBTCBmaWxlLgpXaGVuIGFkZGlu ZyBuZXcgdGFza3MsIHRoZXkgd2lsbCBiZSBmaXJzdCBhcHBlbmRlZCB0byB0aGUgam91cm5hbCBm aWxlCmFuZCB0aGVuIGxhdGVyIGFwcGxpZWQgdG8gdGhlIGFjdHVhbCBhcmNoaXZlIGZpbGVzLiBU aGUgam91cm5hbCBpcwphcHBsaWVkIGFmdGVyIGEgY2VydGFpbiB0aW1lIG9yIGlmIHRoZSBqb3Vy bmFsIGZpbGUgaXRzZWxmIGdyb3dzIHRvbwpsYXJnZS4KClRoZSBjYWNoZSBhbHNvIGhhcyBhIHNl cGFyYXRlIHN0YXRlIGZpbGUsIGNvbnRhaW5pbmcgYWRkaXRpb25hbAppbmZvcm1hdGlvbiwgZS5n LiBjdXQtb2ZmIHRpbWVzdGFtcHMgZm9yIHRoZSBwb2xsaW5nIHRhc2suIFNvbWUgb2YgdGhlCmRh dGEgaW4gdGhlIHN0YXRlZmlsZSBpcyB0ZWNobmljYWxseSBhbHNvIGNvbnRhaW5lZCBpbiB0aGUg YXJjaGl2ZQpmaWxlcywgYnV0IHJlYWRpbmcgdGhlIHN0YXRlIGZpbGUgaXMgbXVjaCBmYXN0ZXIu CgpUaGlzIGNvbW1pdCBhbHNvIGFkZHMgYW4gZWxhYm9yYXRlIHN1aXRlIG9mIHVuaXQgdGVzdHMg Zm9yIHRoaXMgbmV3CmNhY2hlLiBXaGlsZSBhZGRpbmcgc29tZSBhZGRpdGlvbmFsIHdvcmsgdXAg ZnJvbnQsIHRoZXkgcGFpZCBvZmYKdGhlbXNlbHZlcyBkdXJpbmcgZGV2ZWxvcG1lbnQgcXVpdGUg cXVpY2tseSwgc2luY2UgdGhlIG92ZXJhbGwgYXBwcm9hY2gKZm9yIHRoZSBjYWNoZSBjaGFuZ2Vk IGEgY291cGxlIG9mIHRpbWVzLiBUaGUgdGVzdCBzdWl0ZSBnYXZlIG1lCmNvbmZpZGVuY2UgdGhh dCB0aGUgZGVzaWduIGNoYW5nZXMgZGlkbid0IHNjcmV3IGFueXRoaW5nIHVwLCBjYXRjaGluZyBh CmNvdXBsZSBvZiBidWdzIGluIHRoZSBwcm9jZXNzLgoKRmluYWxseSwgc29tZSBjb25jcmV0ZSBu dW1iZXJzIGFib3V0IHRoZSBwZXJmb3JtYW5jZSBpbXByb3ZtZW50cy4KQmVuY2htYXJraW5nIHdh cyBkb25lIHVzaW5nIHRoZSAnZmFrZS1yZW1vdGUnIGZlYXR1cmUuIFRoZXJlIHdlcmUgMTAwCnJl bW90ZXMsIDEwIFBWRSBub2RlcyBwZXIgcmVtb3RlLiBUaGUgdGFzayBjYWNoZSBjb250YWluZWQK YWJvdXQgMS41IG1pbGxpb24gdGFza3MuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBiZWZvcmUgICAgICAgICBhZnRlcgpsaXN0IG9mIGFjdGl2ZSB0YXNrcyAo Kik6ICAgICAgICAgICAgICAgICAgICAgfjEuM3MgICAgICAgICB+MzAwwrVzCmxpc3Qgb2YgNTAw IHRhc2tzLCBvZmZzZXQgMCAoKiopOiAgICAgICAgICAgICB+MS4zcyAgICAgICAgIH4xLjVtcwps aXN0IG9mIDUwMCB0YXNrcywgb2Zmc2V0IDEgbWlsbGlvbiAoKioqKTogICAgfjEuM3MgICAgICAg ICB+MjAwbXMKbGlzdCBvZiA1MDAgdGFza3MsIG9mZnNldCAwLAogICAgMjAwMCB0YXNrcyBpbiBq b3VybmFsICgqKioqKTogICAgICAgICAgICAgICAgICAgICAgICAgICB+NC41bXMKU2l6ZSBvbiBk aXNrOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH41MDBNQiAgICAgICAgfjQwTUIK CigqKTogIFJlcXVlc3RlZCBieSB0aGUgVUkgZXZlcnkgM3MKKCoqKTogUmVxdWVzdGVkIGJ5IHRo ZSBVSSB3aGVuIHZpc2l0aW5nIFJlbW90ZXMgPiBUYXNrcwooKioqKTogRS5nLiB3aGVuIHNjcm9s bGluZyB0b3dhcmRzIHRoZSBib3R0b20gb2YgJ1JlbW90ZXMgPiBUYXNrcycKKCoqKiopOiBlLmcu IHdoZW4gdGhlIGpvdXJuYWwgaGFzIG5vdCBiZWVuIGFwcGxpZWQgZm9yIGEgd2hpbGUuIFJlYWRp bmcgdGFza3MKICAgICAgIGZyb20gdGhlIGpvdXJuYWwgaXMgYSBiaXQgbGVzcyBlZmZpY2llbnQg dGhhbiBmcm9tIHRoZSB0YXNrIGFyY2hpdmUsIHNpbmNlCiAgICAgICB3ZSBoYXZlIHRvIGZ1bGx5 IGxvYWQgaXQgaW50byBtZW1vcnkgc28gdGhhdCB3ZSBjYW4gc29ydCB0aGUgdGFza3MgYW5kCiAg ICAgICBhbHNvICByZW1vdmUgcG90ZW50aWFsIGR1cGxpY2F0ZXMKCkluIHRoZSBvbGQgaW1wbGVt ZW50YXRpb24sIHRoZSBhcmNoaXZlIGZpbGUgd2FzICphbHdheXMqIGZ1bGx5CmRlc2VyaWFsaXpl ZCBhbmQgbG9hZGVkIGludG8gUkFNLCB0aGlzIGlzIHRoZSByZWFzb24gd2h5IHRoZSB0aW1lIG5l ZWRlZAppcyBwcmV0dHkgaWRlbnRpYWwgZm9yIGFsbCBzY2VuYXJpb3MuIFRoZSBuZXcgaW1wbGVt ZW50YXRpb24gcmVhZHMgdGhlCmFyY2hpdmUgZmlsZXMgb25seSBsaW5lIGJ5IGxpbmUsIGFuZCBv bmx5IDUwMCB0YXNrcyB3ZXJlIGxvYWRlZCBpbnRvIFJBTQphdCB0aGUgc2FtZSB0aW1lLiBUaGUg aGlnaGVyIHRoZSBvZmZzZXQsIHRoZSBtb3JlIGFyY2hpdmUgbGluZXMvZmlsZXMgd2UKaGF2ZSB0 byBzY2FuLCB3aGljaCBpbmNyZWFzZXMgdGhlIHRpbWUgbmVlZGVkIHRvIGFjY2VzcyB0aGUgZGF0 YS4gVGhlCnRhc2tzIGFyZSBzb3J0ZWQgZGVzY2VuZGluZyBieSBzdGFydHRpbWUsIGFzIGEgcmVz dWx0IHRoZSByZXF1ZXN0cyBnZXQKc2xvd2VyIHRoZSBmdXJ0aGVyIHlvdSBnbyBiYWNrIGluIGhp c3RvcnkuCgpTaWduZWQtb2ZmLWJ5OiBMdWthcyBXYWduZXIgPGwud2FnbmVyQHByb3htb3guY29t PgotLS0KCk5vdGVzOgogICAgQ2hhbmdlcyBzaW5jZSB2NToKICAgICAgLSBDaGFuZ2UgZm9ybWF0 IG9mIHN0YXRlIGZpbGUsIGluY2x1ZGUgYSBwZXItbm9kZSBjdXRvZmYgdGltZQogICAgICAtIENo YW5nZSBsb2NraW5nIGFwcHJvYWNoLCB1c2luZyBzZXBhcmF0ZSB0eXBlcyB0byByZXByZXNlbnQK ICAgICAgICBhIGxvY2tlZCBjYWNoZWQgKFJlYWRhYmxlVGFza0NhY2hlLCBXcml0YWJsZVRhc2tD YWNoZSkKICAgICAgICAoYXMgc3VnZ2VzdGVkIGJ5IFdvbGZnYW5nIGFuZCBEb21pbmlrIGluZGVw ZW5kZW50bHkpCiAgICAgIC0gUmVuYW1lICdhZGRfdGFza3MnIHRvICd1cGRhdGUnLCBzaW5jZSBp dCBhbHNvIGRyb3BzCiAgICAgICAgdHJhY2tlZCB0YXNrcyBmcm9tIHRoZSBzdGF0ZSBmaWxlLCBt b3ZlcyB0YXNrcyBmcm9tCiAgICAgICAgdGhlIGFjdGl2ZSBmaWxlIHRvIHRoZSBhcmNoaXZlLCBl dGMuCiAgICAKICAgICAgLSBJbnN0ZWFkIG9mIGFkZGluZyBuZXcgdGFza3MgZGlyZWN0bHkgdG8g dGhlIGFyY2hpdmUsIHRoZXkKICAgICAgICBhcmUgYWRkZWQgdG8gYW4gYXBwZW5kLW9ubHkgam91 cm5hbCBhdCBmaXJzdC4gVGhpcyBhbGxvd3MgdXMgdG8KICAgICAgICBiZXR0ZXIgcmVjb3ZlciBm cm9tIGEgY3Jhc2gvc2h1dGRvd24gd2hpbGUgd2UgYXJlIGFkZGluZyB0YXNrcywKICAgICAgICBh cyB3ZWxsIGFzIHJlZHVjZSBkaXNrIHdyaXRlcy4gVGhlIGxhdHRlciBpcyBkdWUgdG8gdGhlIGZh Y3QgdGhhdAogICAgICAgIHdlIGhhdmUgdG8gcmV3cml0ZSB0aGUgYXJjaGl2ZSBmaWxlIGluIGl0 cyBlbnRpcmV0eSwgZXZlbiBpZgogICAgICAgIG9ubHkgYSBzaW5nbGUgdGFzayBpcyBhZGRlZC4K ICAgIAogICAgICAtIFVzZSB6c3RkIGNvbXByZXNzaW9uIGZvciBvbGRlciBhcmNoaXZlIGZpbGVz LCBncmVhdGx5IHJlZHVjaW5nCiAgICAgICAgc3BhY2UgY29uc3VtcHRpb24KICAgIAogICAgICAt IFNvbWUgZ2VuZXJhbCByZWZhY3RvcmluZyB0byBtYWtlIHRoZSBjb2RlIGEgYml0IG5pY2VyCiAg ICAKICAgIENoYW5nZXMgc2luY2UgdjQ6CiAgICAgIC0gUmViYXNlZAogICAgCiAgICBDaGFuZ2Vz IHNpbmNlIHYzOgogICAgICAtIEluY2x1ZGVkIGJlbmNobWFyayByZXN1bHRzIGluIHRoZSBjb21t aXQgbWVzc2FnZQogICAgICAtIERyb3AgYHB1YmAgZm9yIFRhc2tDYWNoZTo6d3JpdGVfc3RhdGUK ICAgIAogICAgQ2hhbmdlcyBzaW5jZSB2MjoKICAgICAgLSBJbmNvcnBvcmF0ZSBmZWVkYmFjayBm cm9tIFdvbGZhbmcgKHRoeCEpCiAgICAgICAgIC0gZWxpbWluYXRlIG9uZSAuY2xvbmUoKQogICAg ICAgICAtIGdldF90YXNrc193aXRoX2xvY2s6IGRpcmVjdGx5IGNyZWF0ZSBpdGVyYXRvciBvdmVy IFBhdGhCdWYKICAgICAgICAgICBpbnN0ZWFkIG9mIGZpcnN0IGNyZWF0aW5nIEFyY2hpdmVGaWxl IHZlYyBhbmQgdGhlIG1hcHBpbmcKICAgICAgICAgLSBGaXhlZCBUT0NUT1UgcmFjZSBjb25kaXRp b24gKGNoZWNrZWQgUGF0aDo6ZXhpc3RzIGluc3RlYWQgb2YKICAgICAgICAgICB0cnlpbmcgdGhl IGFjdHVhbCBvcGVyYXRpb24gYW5kIHJlYWN0aW5nIHRvIEVycm9yS2luZDo6Tm90Rm91bmQpCiAg ICAgICAgIC0gaGFuZGxlIGVycm9yIHdoZW4gcmVwbGFjaW5nICdhY3RpdmUnIGZpbGUKICAgICAg ICAgLSB1bmxpbmsgdGVtcCBmaWxlIHdoZW4gcmVwbGFjaW5nIHRoZSBhcmNoaXZlIGZpbGUgZGlk IG5vdCB3b3JrCiAgICAgICAgIC0gYXZvaWQgVVRGOCBkZWNvZGluZyB3aGVyZSBub3QgcmVhbGx5 IG5lY2Vzc2FyeQogICAgICAtIEFkZGVkIGEgY291cGxlIG9mIC5jb250ZXh0KCkvLndpdGhfY29u dGV4dCgpIGZvciBiZXR0ZXIgZXJyb3IKICAgICAgICBtZXNzYWdlcwogICAgICAtIEV4dHJhY3Rl ZCB0aGUgZmlsZSBuYW1lcyBpbnRvIGNvbnN0cwogICAgICAtIEZpeGVkIHNvbWUgY2xpcHB5IGlz c3VlcyAoLmNsb25lKCkgZm9yIENyZWF0ZU9wdGlvbnMgLSB3aGVuCiAgICAgICAgdGhpcyBzZXJp ZXMgd2FzIHdyaXR0ZW4sIENyZWF0ZU9wdGlvbnMgd2VyZSBub3QgQ29weSB5ZXQpCgogQ2FyZ28u dG9tbCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDIgKy0KIHNlcnZlci9DYXJnby50 b21sICAgICAgICAgICAgICAgICAgICAgfCAgICAxICsKIHNlcnZlci9zcmMvcmVtb3RlX3Rhc2tz L21vZC5ycyAgICAgICAgfCAgICAyICsKIHNlcnZlci9zcmMvcmVtb3RlX3Rhc2tzL3Rhc2tfY2Fj aGUucnMgfCAxNDg2ICsrKysrKysrKysrKysrKysrKysrKysrKysKIDQgZmlsZXMgY2hhbmdlZCwg MTQ5MCBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9uKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgc2Vy dmVyL3NyYy9yZW1vdGVfdGFza3MvdGFza19jYWNoZS5ycwoKZGlmZiAtLWdpdCBhL0NhcmdvLnRv bWwgYi9DYXJnby50b21sCmluZGV4IDY1OGM1M2E3Li4wOGI5MzczNyAxMDA2NDQKLS0tIGEvQ2Fy Z28udG9tbAorKysgYi9DYXJnby50b21sCkBAIC0xMjgsNyArMTI4LDcgQEAgdXJsID0gIjIuMSIK IHdhbGtkaXIgPSAiMiIKIHdlYmF1dGhuLXJzLWNvcmUgPSAiMC41IgogeGRnID0gIjIuMiIKLXpz dGQgPSB7IHZlcnNpb24gPSAiMC4xMiIsIGZlYXR1cmVzID0gWyAiYmluZGdlbiIgXSB9Cit6c3Rk ID0geyB2ZXJzaW9uID0gIjAuMTMiIH0KIAogIyBMb2NhbCBwYXRoIG92ZXJyaWRlcwogIyBOT1RF OiBZb3UgbXVzdCBydW4gYGNhcmdvIHVwZGF0ZWAgYWZ0ZXIgY2hhbmdpbmcgdGhpcyBmb3IgaXQg dG8gdGFrZSBlZmZlY3QhCmRpZmYgLS1naXQgYS9zZXJ2ZXIvQ2FyZ28udG9tbCBiL3NlcnZlci9D YXJnby50b21sCmluZGV4IDJkMWZhNWQyLi4yNGEyZTQwYyAxMDA2NDQKLS0tIGEvc2VydmVyL0Nh cmdvLnRvbWwKKysrIGIvc2VydmVyL0NhcmdvLnRvbWwKQEAgLTMyLDYgKzMyLDcgQEAgdG9raW8g PSB7IHdvcmtzcGFjZSA9IHRydWUsIGZlYXR1cmVzID0gWyAiZnMiLCAiaW8tdXRpbCIsICJpby1z dGQiLCAibWFjcm9zIiwgIm4KIHRva2lvLXN0cmVhbS53b3Jrc3BhY2UgPSB0cnVlCiB0cmFjaW5n LndvcmtzcGFjZSA9IHRydWUKIHVybC53b3Jrc3BhY2UgPSB0cnVlCit6c3RkLndvcmtzcGFjZSA9 IHRydWUKIAogcHJveG1veC1hY2Nlc3MtY29udHJvbCA9IHsgd29ya3NwYWNlID0gdHJ1ZSwgZmVh dHVyZXMgPSBbICJpbXBsIiBdIH0KIHByb3htb3gtYXN5bmMud29ya3NwYWNlID0gdHJ1ZQpkaWZm IC0tZ2l0IGEvc2VydmVyL3NyYy9yZW1vdGVfdGFza3MvbW9kLnJzIGIvc2VydmVyL3NyYy9yZW1v dGVfdGFza3MvbW9kLnJzCmluZGV4IDIzNGZmYTc2Li43YzhlMzFlZiAxMDA2NDQKLS0tIGEvc2Vy dmVyL3NyYy9yZW1vdGVfdGFza3MvbW9kLnJzCisrKyBiL3NlcnZlci9zcmMvcmVtb3RlX3Rhc2tz L21vZC5ycwpAQCAtMTgsNiArMTgsOCBAQCB1c2UgdG9raW86OnRhc2s6OkpvaW5IYW5kbGU7CiAK IHVzZSBjcmF0ZTo6e2FwaTo6cHZlLCB0YXNrX3V0aWxzfTsKIAorbW9kIHRhc2tfY2FjaGU7CisK IC8vLyBHZXQgdGFza3MgZm9yIGFsbCByZW1vdGVzCiAvLyBGSVhNRTogZmlsdGVyIGZvciBwcml2 aWxlZ2VzCiBwdWIgYXN5bmMgZm4gZ2V0X3Rhc2tzKG1heF9hZ2U6IGk2NCwgZmlsdGVyczogVGFz a0ZpbHRlcnMpIC0+IFJlc3VsdDxWZWM8VGFza0xpc3RJdGVtPiwgRXJyb3I+IHsKZGlmZiAtLWdp dCBhL3NlcnZlci9zcmMvcmVtb3RlX3Rhc2tzL3Rhc2tfY2FjaGUucnMgYi9zZXJ2ZXIvc3JjL3Jl bW90ZV90YXNrcy90YXNrX2NhY2hlLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw MDAwLi4xYmFkYzQyMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZlci9zcmMvcmVtb3RlX3Rhc2tz L3Rhc2tfY2FjaGUucnMKQEAgLTAsMCArMSwxNDg2IEBACisvLyEgVGFzayBjYWNoZSBpbXBsZW1l bnRhdGlvbiwgYmFzZWQgb24gcm90YXRpbmcgZmlsZXMuCit1c2Ugc3RkOjp7CisgICAgY21wOjpP cmRlcmluZywKKyAgICBjb2xsZWN0aW9uczo6e0hhc2hNYXAsIEhhc2hTZXR9LAorICAgIGZzOjp7 RmlsZSwgT3Blbk9wdGlvbnN9LAorICAgIGlvOjp7QnVmUmVhZCwgQnVmUmVhZGVyLCBCdWZXcml0 ZXIsIEVycm9yS2luZCwgTGluZXMsIFdyaXRlfSwKKyAgICBpdGVyOjpQZWVrYWJsZSwKKyAgICBv czo6dW5peDo6ZnM6Ok1ldGFkYXRhRXh0LAorICAgIHBhdGg6OntQYXRoLCBQYXRoQnVmfSwKKyAg ICB0aW1lOjp7RHVyYXRpb24sIEluc3RhbnR9LAorfTsKKwordXNlIGFueWhvdzo6e0NvbnRleHQs IEVycm9yfTsKK3VzZSBzZXJkZTo6e0Rlc2VyaWFsaXplLCBTZXJpYWxpemV9OworCit1c2UgcHJv eG1veF9zeXM6OmZzOjpDcmVhdGVPcHRpb25zOworCit1c2UgcGRtX2FwaV90eXBlczo6UmVtb3Rl VXBpZDsKK3VzZSBwdmVfYXBpX3R5cGVzOjpQdmVVcGlkOworCisvLy8gRmlsZW5hbWUgZm9yIHRo ZSBmaWxlIGNvbnRhaW5pbmcgcnVubmluZyB0YXNrcy4KK2NvbnN0IEFDVElWRV9GSUxFTkFNRTog JnN0ciA9ICJhY3RpdmUiOworLy8vIEZpbGVuYW1lIHByZWZpeCBmb3IgYXJjaGl2ZSBmaWxlcy4K K2NvbnN0IEFSQ0hJVkVfRklMRU5BTUVfUFJFRklYOiAmc3RyID0gImFyY2hpdmUuIjsKKy8vLyBG aWxlbmFtZSBmb3IgdGhlIHN0YXRlIGZpbGUuCitjb25zdCBTVEFURV9GSUxFTkFNRTogJnN0ciA9 ICJzdGF0ZSI7CisvLy8gRmlsZW5hbWUgb2YgdGhlIGFyY2hpdmUgbG9ja2ZpbGUuCitjb25zdCBM T0NLRklMRV9GSUxFTkFNRTogJnN0ciA9ICIubG9jayI7CisvLy8gV3JpdGUtYWhlYWQgbG9nLgor Y29uc3QgV0FMX0ZJTEVOQU1FOiAmc3RyID0gImpvdXJuYWwiOworCisvLy8gRmlsZSBuYW1lIGV4 dGVuc2lvbiBmb3IgenN0ZCBjb21wcmVzc2VkIGFyY2hpdmUgZmlsZXMKK2NvbnN0IFpTVERfRVhU RU5TSU9OOiAmc3RyID0gInpzdCI7Citjb25zdCBaU1REX0VYVEVOU0lPTl9XSVRIX0RPVDogJnN0 ciA9ICIuenN0IjsKKworLy8vIEl0ZW0gd2hpY2ggY2FuIGJlIHB1dCBpbnRvIHRoZSB0YXNrIGNh Y2hlLgorI1tkZXJpdmUoQ2xvbmUsIERlYnVnLCBTZXJpYWxpemUsIERlc2VyaWFsaXplLCBIYXNo LCBQYXJ0aWFsRXEsIEVxKV0KKyNbc2VyZGUocmVuYW1lX2FsbCA9ICJrZWJhYi1jYXNlIildCitw dWIgc3RydWN0IFRhc2tDYWNoZUl0ZW0geworICAgIC8vLyBUaGUgdGFzaydzIFVQSUQKKyAgICBw dWIgdXBpZDogUmVtb3RlVXBpZCwKKyAgICAvLy8gVGhlIHRpbWUgYXQgd2hpY2ggdGhlIHRhc2sg d2FzIHN0YXJ0ZWQgKHNlY29uZHMgc2luY2UgdGhlIFVOSVggZXBvY2gpLgorICAgIC8vLyBUZWNo bmljYWxseSB0aGlzIGlzIGFsc28gY29udGFpbmVkIHdpdGhpbiB0aGUgVVBJRCwgZHVwbGljYXRp bmcgaXQgaGVyZQorICAgIC8vLyBhbGxvd3MgdXMgdG8gZGlyZWN0bHkgYWNjZXNzIGl0IHdoZW4g c29ydGluZyBpbiBuZXcgdGFza3MsIHdpdGhvdXQgaGF2aW5nCisgICAgLy8vIHRvIHBhcnNlIHRo ZSBVUElELgorICAgIHB1YiBzdGFydHRpbWU6IGk2NCwKKyAgICAjW3NlcmRlKHNraXBfc2VyaWFs aXppbmdfaWYgPSAiT3B0aW9uOjppc19ub25lIildCisgICAgLy8vIFRoZSB0YXNrJ3Mgc3RhdHVz LgorICAgIHB1YiBzdGF0dXM6IE9wdGlvbjxTdHJpbmc+LAorICAgICNbc2VyZGUoc2tpcF9zZXJp YWxpemluZ19pZiA9ICJPcHRpb246OmlzX25vbmUiKV0KKyAgICAvLy8gVGhlIHRhc2sncyBlbmR0 aW1lIChzZWNvbmRzIHNpbmNlIHRoZSBVTklYIGVwb2NoKS4KKyAgICBwdWIgZW5kdGltZTogT3B0 aW9uPGk2ND4sCit9CisKKyNbZGVyaXZlKFNlcmlhbGl6ZSwgRGVzZXJpYWxpemUsIERlZmF1bHQp XQorI1tzZXJkZShyZW5hbWVfYWxsID0gImtlYmFiLWNhc2UiKV0KKy8vLyBQZXIgcmVtb3RlIHN0 YXRlLgorc3RydWN0IFJlbW90ZVN0YXRlIHsKKyAgICAvLy8gUGVyLW5vZGUgc3RhdGUgZm9yIHRo aXMgcmVtb3RlLgorICAgIG5vZGVfc3RhdGU6IEhhc2hNYXA8U3RyaW5nLCBOb2RlU3RhdGU+LAor fQorCisjW2Rlcml2ZShTZXJpYWxpemUsIERlc2VyaWFsaXplLCBEZWZhdWx0KV0KKyNbc2VyZGUo cmVuYW1lX2FsbCA9ICJrZWJhYi1jYXNlIildCitzdHJ1Y3QgTm9kZVN0YXRlIHsKKyAgICAvLy8g Q3V0b2ZmIHRpbWVzdGFtcCBmb3IgdGhpcyBub2RlIHdoZW4gZmV0Y2hpbmcgYXJjaGl2ZWQgdGFz a3MuCisgICAgY3V0b2ZmOiBpNjQsCit9CisKKy8vLyBTdGF0ZSBuZWVkZWQgZm9yIHRhc2sgcG9s bGluZy4KKyNbZGVyaXZlKFNlcmlhbGl6ZSwgRGVzZXJpYWxpemUsIERlZmF1bHQpXQorI1tzZXJk ZShyZW5hbWVfYWxsID0gImtlYmFiLWNhc2UiKV0KK3B1YiBzdHJ1Y3QgU3RhdGUgeworICAgIC8v LyBNYXAgb2YgcmVtb3RlIC0+IG1vc3QgcmVjZW50IHRhc2sgc3RhcnR0aW1lIChVTklYIGVwb2No KSBpbiB0aGUgYXJjaGl2ZS4KKyAgICAvLy8gVGhpcyBjYW4gYmUgdXNlZCBhcyBhIGN1dC1vZmYg d2hlbiByZXF1ZXN0aW5nIG5ldyB0YXNrIGRhdGEuCisgICAgI1tzZXJkZShkZWZhdWx0KV0KKyAg ICByZW1vdGVfc3RhdGU6IEhhc2hNYXA8U3RyaW5nLCBSZW1vdGVTdGF0ZT4sCisgICAgLy8vIFRy YWNrZWQgdGFza3Mgd2hpY2ggYXJlIHBvbGxlZCBpbiBzaG9ydCBpbnRlcnZhbHMuCisgICAgI1tz ZXJkZShkZWZhdWx0KV0KKyAgICB0cmFja2VkX3Rhc2tzOiBIYXNoU2V0PFJlbW90ZVVwaWQ+LAor fQorCitpbXBsIFN0YXRlIHsKKyAgICAvLy8gR2V0IHRyYWNrZWQgdGFza3MuCisgICAgcHViIGZu IHRyYWNrZWRfdGFza3MoJnNlbGYpIC0+IGltcGwgSXRlcmF0b3I8SXRlbSA9ICZSZW1vdGVVcGlk PiB7CisgICAgICAgIHNlbGYudHJhY2tlZF90YXNrcy5pdGVyKCkKKyAgICB9CisKKyAgICAvLy8g R2V0IHRoZSBjdXRvZmYgdGltZXN0YW1wIGZvciBhIG5vZGUgb2YgYSByZW1vdGUuCisgICAgcHVi IGZuIGN1dG9mZl90aW1lc3RhbXAoJnNlbGYsIHJlbW90ZV9pZDogJnN0ciwgbm9kZTogJnN0cikg LT4gT3B0aW9uPGk2ND4geworICAgICAgICBzZWxmLnJlbW90ZV9zdGF0ZQorICAgICAgICAgICAg LmdldChyZW1vdGVfaWQpCisgICAgICAgICAgICAuYW5kX3RoZW4ofHJlbW90ZV9zdGF0ZXwgcmVt b3RlX3N0YXRlLm5vZGVfc3RhdGUuZ2V0KG5vZGUpKQorICAgICAgICAgICAgLm1hcCh8c3RhdGV8 IHN0YXRlLmN1dG9mZikKKyAgICB9CisKKyAgICAvLy8gQWRkIGEgbmV3IHRyYWNrZWQgdGFzay4K KyAgICBmbiBhZGRfdHJhY2tlZF90YXNrKCZtdXQgc2VsZiwgdXBpZDogUmVtb3RlVXBpZCkgewor ICAgICAgICBzZWxmLnRyYWNrZWRfdGFza3MuaW5zZXJ0KHVwaWQpOworICAgIH0KKworICAgIC8v LyBSZW1vdmUgYSB0cmFja2VkIHRhc2suCisgICAgZm4gcmVtb3ZlX3RyYWNrZWRfdGFzaygmbXV0 IHNlbGYsIHVwaWQ6ICZSZW1vdGVVcGlkKSB7CisgICAgICAgIHNlbGYudHJhY2tlZF90YXNrcy5y ZW1vdmUodXBpZCk7CisgICAgfQorCisgICAgLy8vIFVwZGF0ZSB0aGUgcGVyLW5vZGUgY3V0b2Zm IHRpbWVzdGFtcCBpZiBpdCBpcyBoaWdoZXIgdGhhbiB0aGUgY3VycmVudCBvbmUuCisgICAgZm4g dXBkYXRlX2N1dG9mZl90aW1lc3RhbXAoJm11dCBzZWxmLCByZW1vdGVfaWQ6ICZzdHIsIG5vZGU6 ICZzdHIsIHN0YXJ0dGltZTogaTY0KSB7CisgICAgICAgIG1hdGNoIHNlbGYucmVtb3RlX3N0YXRl LmdldF9tdXQocmVtb3RlX2lkKSB7CisgICAgICAgICAgICBTb21lKHJlbW90ZV9zdGF0ZSkgPT4g bWF0Y2ggcmVtb3RlX3N0YXRlLm5vZGVfc3RhdGUuZ2V0X211dChub2RlKSB7CisgICAgICAgICAg ICAgICAgU29tZShub2RlX3N0YXRlKSA9PiB7CisgICAgICAgICAgICAgICAgICAgIG5vZGVfc3Rh dGUuY3V0b2ZmID0gbm9kZV9zdGF0ZS5jdXRvZmYubWF4KHN0YXJ0dGltZSk7CisgICAgICAgICAg ICAgICAgfQorICAgICAgICAgICAgICAgIE5vbmUgPT4geworICAgICAgICAgICAgICAgICAgICBy ZW1vdGVfc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC5ub2RlX3N0YXRlCisgICAgICAg ICAgICAgICAgICAgICAgICAuaW5zZXJ0KG5vZGUudG9fc3RyaW5nKCksIE5vZGVTdGF0ZSB7IGN1 dG9mZjogc3RhcnR0aW1lIH0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sCisg ICAgICAgICAgICBOb25lID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgbm9kZV9zdGF0ZSA9Cisg ICAgICAgICAgICAgICAgICAgIEhhc2hNYXA6OmZyb21faXRlcihbKG5vZGUudG9fc3RyaW5nKCks IE5vZGVTdGF0ZSB7IGN1dG9mZjogc3RhcnR0aW1lIH0pXSk7CisKKyAgICAgICAgICAgICAgICBz ZWxmLnJlbW90ZV9zdGF0ZQorICAgICAgICAgICAgICAgICAgICAuaW5zZXJ0KHJlbW90ZV9pZC50 b19zdHJpbmcoKSwgUmVtb3RlU3RhdGUgeyBub2RlX3N0YXRlIH0pOworICAgICAgICAgICAgfQor ICAgICAgICB9CisgICAgfQorfQorCisvLy8gQ2FjaGUgZm9yIHJlbW90ZSB0YXNrcy4KKyNbZGVy aXZlKENsb25lKV0KK3B1YiBzdHJ1Y3QgVGFza0NhY2hlIHsKKyAgICAvLy8gUGF0aCB3aGVyZSB0 aGUgY2FjaGUncyBmaWxlcyBzaG91bGQgYmUgcGxhY2VkLgorICAgIGJhc2VfcGF0aDogUGF0aEJ1 ZiwKKyAgICAvLy8gRmlsZSBwZXJtaXNzaW9ucyBmb3IgdGhlIGNhY2hlJ3MgZmlsZXMuCisgICAg Y3JlYXRlX29wdGlvbnM6IENyZWF0ZU9wdGlvbnMsCisKKyAgICAvLy8gTWF4aW11bSBzaXplIG9m IHRoZSBqb3VybmFsLiBJZiBpdCBncm93cyBsYXJnZXIgdGhhbiBzaXplIGFmdGVyCisgICAgLy8v IHRhc2tzIGhhdmUgYmVlbiBhZGRlZCwgaXQgd2lsbCBiZSBhcHBsaWVkIGltbWVkaWF0ZWx5Lgor ICAgIGpvdXJuYWxfbWF4X3NpemU6IHU2NCwKKworICAgIC8vLyBNYXhpbXVtIG51bWJlciBvZiBh cmNoaXZlIGZpbGVzLiBJZiB0aGUgYXJjaGl2ZSBpcyByb3RhdGVkIGFuZCBgbWF4X2ZpbGVzYCBp cyBleGNlZWRlZCwgdGhlCisgICAgLy8vIG9sZGVzdCBmaWxsIHdlIGRyb3BwZWQKKyAgICBtYXhf ZmlsZXM6IHUzMiwKKworICAgIC8vLyBOdW1iZXIgb2YgdW5jb21wcmVzc2VkIGFyY2hpdmUgZmls ZXMgdG8ga2VlcC4gVGhlc2Ugd2lsbCBiZSB0aGUgbW9zdCByZWNlbnQgb25lcy4KKyAgICB1bmNv bXByZXNzZWRfZmlsZXM6IHUzMiwKKworICAgIC8vLyBSb3RhdGUgYXJjaGl2ZSBmaWxlIGlmIGl0 IGlzIG9sZGVyIHRoYW4gdGhpcyBudW1iZXIgb2Ygc2Vjb25kcy4KKyAgICByb3RhdGVfYWZ0ZXI6 IHU2NCwKK30KKworLy8vIEEgW2BUYXNrQ2FjaGVgXSBsb2NrZWQgZm9yIHdyaXRpbmcuCitwdWIg c3RydWN0IFdyaXRhYmxlVGFza0NhY2hlIHsKKyAgICBjYWNoZTogVGFza0NhY2hlLAorICAgIGxv Y2s6IFRhc2tDYWNoZUxvY2ssCit9CisKKy8vLyBBIFtgVGFza0NhY2hlYF0gbG9ja2VkIGZvciBy ZWFkaW5nLgorcHViIHN0cnVjdCBSZWFkYWJsZVRhc2tDYWNoZSB7CisgICAgY2FjaGU6IFRhc2tD YWNoZSwKKyAgICBsb2NrOiBUYXNrQ2FjaGVMb2NrLAorfQorCisvLy8gTG9jayBmb3IgdGhlIGNh Y2hlLgorI1thbGxvdyhkZWFkX2NvZGUpXQorc3RydWN0IFRhc2tDYWNoZUxvY2soRmlsZSk7CisK Ky8vLyBXaGljaCB0YXNrcyB0byBmZXRjaCBmcm9tIHRoZSBhcmNoaXZlLgorcHViIGVudW0gR2V0 VGFza3MgeworICAgIC8vLyBHZXQgYWxsIHRhc2tzLCBmaW5pc2hlZCBhbmQgcnVubmluZy4KKyAg ICBBbGwsCisgICAgLy8vIE9ubHkgZ2V0IHJ1bm5pbmcgKGFjdGl2ZSkgdGFza3MuCisgICAgQWN0 aXZlLAorICAgICNbY2ZnKHRlc3QpXSAvLyBVc2VkIGJ5IHRlc3RzLCBtaWdodCBiZSB1c2VkIGJ5 IHByb2R1Y3Rpb24gY29kZSBpbiB0aGUgZnV0dXJlCisgICAgLy8vIE9ubHkgZ2V0IGZpbmlzaGVk IChhcmNoaXZlZCkgdGFza3MuCisgICAgQXJjaGl2ZWQsCit9CisKKy8vLyBNYXAgdGhhdCBzdG9y ZXMgd2hldGhlciBhIHJlbW90ZSBub2RlJ3MgdGFza3Mgd2VyZSBzdWNjZXNzZnVsbHkKKy8vLyBm ZXRjaGVkLgorI1tkZXJpdmUoRGVmYXVsdCldCitwdWIgc3RydWN0IE5vZGVGZXRjaFN1Y2Nlc3NN YXAoSGFzaE1hcDwoU3RyaW5nLCBTdHJpbmcpLCBib29sPik7CisKK2ltcGwgTm9kZUZldGNoU3Vj Y2Vzc01hcCB7CisgICAgLy8vIE1hcmsgYSBub2RlIG9mIGEgZ2l2ZW4gcmVtb3RlIGFzIHN1Y2Nl c3NmdWwuCisgICAgcHViIGZuIHNldF9ub2RlX3N1Y2Nlc3MoJm11dCBzZWxmLCByZW1vdGU6IFN0 cmluZywgbm9kZTogU3RyaW5nKSB7CisgICAgICAgIHNlbGYuMC5pbnNlcnQoKHJlbW90ZSwgbm9k ZSksIHRydWUpOworICAgIH0KKworICAgIC8vLyBNYXJrIGEgbm9kZSBvZiBhIGdpdmVuIHJlbW90 ZSBhcyBmYWlsZWQuCisgICAgcHViIGZuIHNldF9ub2RlX2ZhaWx1cmUoJm11dCBzZWxmLCByZW1v dGU6IFN0cmluZywgbm9kZTogU3RyaW5nKSB7CisgICAgICAgIHNlbGYuMC5pbnNlcnQoKHJlbW90 ZSwgbm9kZSksIGZhbHNlKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB3aGV0aGVyIHRhc2tz IGZyb20gYSBnaXZlbiBub2RlIG9mIGEgcmVtb3RlIHdlcmUgc3VjY2Vzc2Z1bGx5IGZldGNoZWQu CisgICAgcHViIGZuIG5vZGVfc3VjY2Vzc2Z1bCgmc2VsZiwgcmVtb3RlOiAmc3RyLCBub2RlOiAm c3RyKSAtPiBib29sIHsKKyAgICAgICAgbWF0Y2hlcyEoc2VsZi4wLmdldCgmKHJlbW90ZS5pbnRv KCksIG5vZGUuaW50bygpKSksIFNvbWUodHJ1ZSkpCisgICAgfQorCisgICAgLy8vIE1lcmdlIHRo aXMgbWFwIHdpdGggYW5vdGhlci4KKyAgICBwdWIgZm4gbWVyZ2UoJm11dCBzZWxmLCBvdGhlcjog U2VsZikgeworICAgICAgICBzZWxmLjAuZXh0ZW5kKG90aGVyLjApOworICAgIH0KK30KKworaW1w bCBSZWFkYWJsZVRhc2tDYWNoZSB7CisgICAgLy8vIEl0ZXJhdGUgb3ZlciBjYWNoZWQgdGFza3Mu CisgICAgcHViIGZuIGdldF90YXNrcygmc2VsZiwgbW9kZTogR2V0VGFza3MpIC0+IFJlc3VsdDxU YXNrQXJjaGl2ZUl0ZXJhdG9yPCdfPiwgRXJyb3I+IHsKKyAgICAgICAgc2VsZi5jYWNoZQorICAg ICAgICAgICAgLmdldF90YXNrc19pbXBsKG1vZGUsICZzZWxmLmxvY2spCisgICAgICAgICAgICAu Y29udGV4dCgiZmFpbGVkIHRvIGNyZWF0ZSB0YXNrIGFyY2hpdmUgaXRlcmF0b3IiKQorICAgIH0K K30KKworaW1wbCBXcml0YWJsZVRhc2tDYWNoZSB7CisgICAgLy8vIENyZWF0ZSBpbml0aWFsIHRh c2sgYXJjaGl2ZXMgdGhhdCBjYW4gYmUgYmFja2ZpbGxlZCB3aXRoIHRoZQorICAgIC8vLyByZWNl bnQgdGFzayBoaXN0b3J5IGZyb20gYSByZW1vdGUuCisgICAgLy8vCisgICAgLy8vIFRoaXMgZnVu Y3Rpb24gb25seSBoYXMgYW4gZWZmZWN0IGlmIHRoZXJlIGFyZSBubyBhcmNoaXZlIGZpbGVzIHll dC4KKyAgICBwdWIgZm4gaW5pdCgmc2VsZiwgbm93OiBpNjQpIC0+IFJlc3VsdDwoKSwgRXJyb3I+ IHsKKyAgICAgICAgaWYgc2VsZi5jYWNoZS5hcmNoaXZlX2ZpbGVzKCZzZWxmLmxvY2spPy5pc19l bXB0eSgpIHsKKyAgICAgICAgICAgIGZvciBpIGluIDAuLnNlbGYuY2FjaGUubWF4X2ZpbGVzIHsK KyAgICAgICAgICAgICAgICBzZWxmLm5ld19maWxlKAorICAgICAgICAgICAgICAgICAgICBub3cg LSAoaSBhcyB1NjQgKiBzZWxmLmNhY2hlLnJvdGF0ZV9hZnRlcikgYXMgaTY0LAorICAgICAgICAg ICAgICAgICAgICBpID49IHNlbGYuY2FjaGUudW5jb21wcmVzc2VkX2ZpbGVzLAorICAgICAgICAg ICAgICAgICk/OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgT2soKCkpCisg ICAgfQorCisgICAgLy8vIFN0YXJ0IGEgbmV3IGFyY2hpdmUgZmlsZSB3aXRoIGEgZ2l2ZW4gdGlt ZXN0YW1wLgorICAgIC8vLyBgbm93YCBpcyBzdXBwb3NlZCB0byBiZSBhIFVOSVggdGltZXN0YW1w IChzZWNvbmRzKS4KKyAgICBmbiBuZXdfZmlsZSgmc2VsZiwgbm93OiBpNjQsIGNvbXByZXNzOiBi b29sKSAtPiBSZXN1bHQ8QXJjaGl2ZUZpbGUsIEVycm9yPiB7CisgICAgICAgIGxldCBzdWZmaXgg PSBpZiBjb21wcmVzcyB7CisgICAgICAgICAgICBaU1REX0VYVEVOU0lPTl9XSVRIX0RPVAorICAg ICAgICB9IGVsc2UgeworICAgICAgICAgICAgIiIKKyAgICAgICAgfTsKKworICAgICAgICBsZXQg bmV3X3BhdGggPSBzZWxmCisgICAgICAgICAgICAuY2FjaGUKKyAgICAgICAgICAgIC5iYXNlX3Bh dGgKKyAgICAgICAgICAgIC5qb2luKGZvcm1hdCEoIntBUkNISVZFX0ZJTEVOQU1FX1BSRUZJWH17 bm93fXtzdWZmaXh9IikpOworCisgICAgICAgIGxldCBtdXQgZmlsZSA9IEZpbGU6OmNyZWF0ZSgm bmV3X3BhdGgpPzsKKyAgICAgICAgc2VsZi5jYWNoZS5jcmVhdGVfb3B0aW9ucy5hcHBseV90bygm bXV0IGZpbGUsICZuZXdfcGF0aCk/OworCisgICAgICAgIGlmIGNvbXByZXNzIHsKKyAgICAgICAg ICAgIGxldCBlbmNvZGVyID0genN0ZDo6c3RyZWFtOjp3cml0ZTo6RW5jb2Rlcjo6bmV3KGZpbGUs IHpzdGQ6OkRFRkFVTFRfQ09NUFJFU1NJT05fTEVWRUwpPzsKKyAgICAgICAgICAgIGVuY29kZXIu ZmluaXNoKCk/OworICAgICAgICB9CisKKyAgICAgICAgT2soQXJjaGl2ZUZpbGUgeworICAgICAg ICAgICAgcGF0aDogbmV3X3BhdGgsCisgICAgICAgICAgICBjb21wcmVzc2VkOiBjb21wcmVzcywK KyAgICAgICAgICAgIHN0YXJ0dGltZTogbm93LAorICAgICAgICB9KQorICAgIH0KKworICAgIC8v LyBSb3RhdGUgdGFzayBhcmNoaXZlIGlmIHRoZSB0aGUgbmV3ZXN0IGFyY2hpdmUgZmlsZSBpcyBv bGRlciB0aGFuIGByb3RhdGVfYWZ0ZXJgLgorICAgIC8vLworICAgIC8vLyBUaGUgb2xkZXN0IGFy Y2hpdmUgZmlsZXMgYXJlIHJlbW92ZWQgaWYgdGhlIHRvdGFsIG51bWJlciBvZiBhcmNoaXZlIGZp bGVzIGV4Y2VlZHMKKyAgICAvLy8gYG1heF9maWxlc2AuIGBub3dgIGlzIHN1cHBvc2VkIHRvIGJl IGEgVU5JWCB0aW1lc3RhbXAgKHNlY29uZHMpLgorICAgIHB1YiBmbiByb3RhdGUoJnNlbGYsIG5v dzogaTY0KSAtPiBSZXN1bHQ8Ym9vbCwgRXJyb3I+IHsKKyAgICAgICAgbGV0IG11dCBkaWRfcm90 YXRlID0gZmFsc2U7CisgICAgICAgIGxldCBtdXQgYXJjaGl2ZV9maWxlcyA9IHNlbGYuY2FjaGUu YXJjaGl2ZV9maWxlcygmc2VsZi5sb2NrKT87CisKKyAgICAgICAgbWF0Y2ggYXJjaGl2ZV9maWxl cy5maXJzdCgpIHsKKyAgICAgICAgICAgIFNvbWUoYm91bmQpID0+IHsKKyAgICAgICAgICAgICAg ICBpZiBub3cgPiBib3VuZC5zdGFydHRpbWUgJiYgbm93IC0gYm91bmQuc3RhcnR0aW1lID4gc2Vs Zi5jYWNoZS5yb3RhdGVfYWZ0ZXIgYXMgaTY0IHsKKyAgICAgICAgICAgICAgICAgICAgbGV0IG5l d19maWxlID0gc2VsZi5uZXdfZmlsZShub3csIHNlbGYuY2FjaGUudW5jb21wcmVzc2VkX2ZpbGVz ID09IDApPzsKKyAgICAgICAgICAgICAgICAgICAgYXJjaGl2ZV9maWxlcy5pbnNlcnQoMCwgbmV3 X2ZpbGUpOworICAgICAgICAgICAgICAgICAgICBkaWRfcm90YXRlID0gdHJ1ZTsKKworICAgICAg ICAgICAgICAgICAgICBzZWxmLmFwcGx5X2pvdXJuYWwoKT87CisgICAgICAgICAgICAgICAgfQor ICAgICAgICAgICAgfQorICAgICAgICAgICAgTm9uZSA9PiB7CisgICAgICAgICAgICAgICAgbGV0 IG5ld19maWxlID0gc2VsZi5uZXdfZmlsZShub3csIHNlbGYuY2FjaGUudW5jb21wcmVzc2VkX2Zp bGVzID09IDApPzsKKyAgICAgICAgICAgICAgICBhcmNoaXZlX2ZpbGVzLmluc2VydCgwLCBuZXdf ZmlsZSk7CisgICAgICAgICAgICAgICAgZGlkX3JvdGF0ZSA9IHRydWU7CisKKyAgICAgICAgICAg ICAgICBzZWxmLmFwcGx5X2pvdXJuYWwoKT87CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwor ICAgICAgICBsZXQgbXV0IGFyY2hpdmVfZmlsZXMgPSBzZWxmLmNhY2hlLmFyY2hpdmVfZmlsZXMo JnNlbGYubG9jayk/OworCisgICAgICAgIHdoaWxlIGFyY2hpdmVfZmlsZXMubGVuKCkgPiBzZWxm LmNhY2hlLm1heF9maWxlcyBhcyB1c2l6ZSB7CisgICAgICAgICAgICAvLyBVbndyYXAgaXMgc2Fm ZSBiZWNhdXNlIG9mIHRoZSBsZW5ndGggY2hlY2sgYWJvdmUKKyAgICAgICAgICAgIGxldCB0b19y ZW1vdmUgPSBhcmNoaXZlX2ZpbGVzLnBvcCgpLnVud3JhcCgpOworICAgICAgICAgICAgc3RkOjpm czo6cmVtb3ZlX2ZpbGUoJnRvX3JlbW92ZS5wYXRoKQorICAgICAgICAgICAgICAgIC53aXRoX2Nv bnRleHQofHwgZm9ybWF0ISgiZmFpbGVkIHRvIHJlbW92ZSB7fSIsIHRvX3JlbW92ZS5wYXRoLmRp c3BsYXkoKSkpPzsKKyAgICAgICAgfQorCisgICAgICAgIGZvciBmaWxlIGluIGFyY2hpdmVfZmls ZXMKKyAgICAgICAgICAgIC5pdGVyX211dCgpCisgICAgICAgICAgICAuc2tpcChzZWxmLmNhY2hl LnVuY29tcHJlc3NlZF9maWxlcyBhcyB1c2l6ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYg IWZpbGUuY29tcHJlc3NlZCB7CisgICAgICAgICAgICAgICAgZmlsZS5jb21wcmVzcyhzZWxmLmNh Y2hlLmNyZWF0ZV9vcHRpb25zKQorICAgICAgICAgICAgICAgICAgICAud2l0aF9jb250ZXh0KHx8 IGZvcm1hdCEoImZhaWxlZCB0byBjb21wcmVzcyB7fSIsIGZpbGUucGF0aC5kaXNwbGF5KCkpKT87 CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBPayhkaWRfcm90YXRlKQorICAg IH0KKworICAgIC8vLyBJdGVyYXRlIG92ZXIgY2FjaGVkIHRhc2tzLgorICAgIHB1YiBmbiBnZXRf dGFza3MoJnNlbGYsIG1vZGU6IEdldFRhc2tzKSAtPiBSZXN1bHQ8VGFza0FyY2hpdmVJdGVyYXRv cjwnXz4sIEVycm9yPiB7CisgICAgICAgIHNlbGYuY2FjaGUKKyAgICAgICAgICAgIC5nZXRfdGFz a3NfaW1wbChtb2RlLCAmc2VsZi5sb2NrKQorICAgICAgICAgICAgLmNvbnRleHQoImZhaWxlZCB0 byBjcmVhdGUgdGFzayBhcmNoaXZlIGl0ZXJhdG9yIikKKyAgICB9CisKKyAgICAvLy8gVXBkYXRl IHRhc2sgY2FjaGUgY29udGVudHMuCisgICAgLy8vCisgICAgLy8vIFRoaXMgaXMgbW9zdGx5IHVz ZWQgZm9yIGFkZGluZyBuZXcgdGFza3MgdG8gdGFza3MgdG8gdGhlIGNhY2hlLCBidXQKKyAgICAv Ly8gd2lsbCBhbHNvIGhhbmRsZSBkcm9wcGluZyBmaW5pc2hlZC9mYWlsZWQgdHJhY2tlZCB0YXNr cyBmcm9tIHRoZQorICAgIC8vLyBzdGF0ZSBmaWxlIGFuZCBhY3RpdmUgZmlsZS4gVGhpcyBpcyBk b25lIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byB1cGRhdGUKKyAgICAvLy8gdGhlc2UgZmlsZXMg bXVsdGlwbGUgdGltZXMuCisgICAgLy8vCisgICAgLy8vIFJ1bm5pbmcgdGFza3MgKHRhc2tzIHdp dGhvdXQgYW4gZW5kdGltZSkgYXJlIHBsYWNlZCBpbnRvIHRoZSAnYWN0aXZlJyBmaWxlIGluIHRo ZQorICAgIC8vLyB0YXNrIGNhY2hlIGJhc2UgZGlyZWN0b3J5LiBGaW5pc2hlZCB0YXNrcyBhcmUg c29ydGVkIGludG8gYGFyY2hpdmUuPHN0YXJ0aW1lPmAgYXJjaGl2ZQorICAgIC8vLyBmaWxlcywg d2hlcmUgYDxzdGFydHRpbWVzPmAgZGVub3RlcyB0aGUgbG93ZXN0IHBlcm1pdHRlZCBzdGFydCB0 aW1lIHRpbWVzdGFtcCBmb3IgYSBnaXZlbgorICAgIC8vLyBhcmNoaXZlIGZpbGUuIElmIGEgdGFz ayB3aGljaCB3YXMgYWRkZWQgYXMgcnVubmluZyBwcmV2aW91c2x5IGlzIGFkZGVkIGFnYWluLCB0 aGlzIHRpbWUgaW4KKyAgICAvLy8gYSBmaW5pc2hlZCBzdGF0ZSwgaXQgd2lsbCBiZSByZW1vdmVk IGZyb20gdGhlIGBhY3RpdmVgIGZpbGUgYW5kIGFsc28gc29ydGVkIGludG8KKyAgICAvLy8gb25l IG9mIHRoZSBhcmNoaXZlIGZpbGVzLgorICAgIC8vLyBTYW1lIGdvZXMgZm9yIHRoZSBsaXN0IG9m IHRyYWNrZWQgdGFza3M7IHRoZSBlbnRyeSBpbiB0aGUgc3RhdGUgZmlsZSB3aWxsIGJlIHJlbW92 ZWQuCisgICAgLy8vCisgICAgLy8vIENyYXNoIGNvbnNpc3RlbmN5OgorICAgIC8vLworICAgIC8v LyBUaGUgc3RhdGUgZmlsZSwgd2hpY2ggY29udGFpbnMgdGhlIGN1dC1vZmYgdGltZXN0YW1wcyBm b3IgZnV0dXJlIHRhc2sgZmV0Y2hpbmcsIGlzIHVwZGF0ZWQgYXQgdGhlCisgICAgLy8vIGVuZCBh ZnRlciBhbGwgdGFza3MgaGF2ZSBiZWVuIGFkZGVkIGludG8gdGhlIGFyY2hpdmUuIEFkZGluZyB0 YXNrcyBpcyBhbiBpZGVtcG90ZW50CisgICAgLy8vIG9wZXJhdGlvbjsgYWRkaW5nIHRoZSAqc2Ft ZSogdGFzayBtdWx0aXBsZSB0aW1lcyBkb2VzIG5vdCBsZWFkIHRvIGR1cGxpY2F0ZWQgZW50cmll cyBpbiB0aGUKKyAgICAvLy8gdGFzayBhcmNoaXZlLiBJbmRpdmlkdWFsIGFyY2hpdmUgZmlsZXMg YXJlIHVwZGF0ZWQgYXRvbWljYWxseSwgYnV0IHNpbmNlCisgICAgLy8vIGFkZGluZyB0YXNrcyBj YW4gaW52b2x2ZSB1cGRhdGluZyBtdWx0aXBsZSBhcmNoaXZlIGZpbGVzLCB0aGUgYXJjaGl2ZSBj b3VsZCBlbmQgdXAKKyAgICAvLy8gaW4gYSBwYXJ0aWFsbHktdXBkYXRlZCwgaW5jb25zaXN0ZW50 IHN0YXRlIGluIGNhc2Ugb2YgYSBjcmFzaC4KKyAgICAvLy8gSG93ZXZlciwgc2luY2UgdGhlIHN0 YXRlIGZpbGUgd2l0aCB0aGUgY3V0LW9mZiB0aW1lc3RhbXBzIGlzIHVwZGF0ZWQgbGFzdCwKKyAg ICAvLy8gdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBhcmNoaXZlIHNob3VsZCBiZSByZXN0b3JlZCBh dCB0aGUgbmV4dCB1cGRhdGUgY3ljbGUgb2YgdGhlIGFyY2hpdmUuCisgICAgcHViIGZuIHVwZGF0 ZSgKKyAgICAgICAgJnNlbGYsCisgICAgICAgIG5ld190YXNrczogVmVjPFRhc2tDYWNoZUl0ZW0+ LAorICAgICAgICB1cGRhdGVfc3RhdGVfZm9yX3JlbW90ZTogJk5vZGVGZXRjaFN1Y2Nlc3NNYXAs CisgICAgICAgIGRyb3BfdHJhY2tlZDogSGFzaFNldDxSZW1vdGVVcGlkPiwKKyAgICApIC0+IFJl c3VsdDwoKSwgRXJyb3I+IHsKKyAgICAgICAgbGV0IHRhc2tfaXRlciA9IHNlbGYKKyAgICAgICAg ICAgIC5nZXRfdGFza3MoR2V0VGFza3M6OkFjdGl2ZSkKKyAgICAgICAgICAgIC5jb250ZXh0KCJm YWlsZWQgdG8gY3JlYXRlIGFyY2hpdmUgaXRlcmF0b3IgZm9yIGFjdGl2ZSB0YXNrcyIpPzsKKwor ICAgICAgICBsZXQgbXV0IGFjdGl2ZV90YXNrcyA9IEhhc2hNYXA6OmZyb21faXRlcih0YXNrX2l0 ZXIuZmlsdGVyX21hcCh8dGFza3wgeworICAgICAgICAgICAgaWYgIWRyb3BfdHJhY2tlZC5jb250 YWlucygmdGFzay51cGlkKSB7CisgICAgICAgICAgICAgICAgU29tZSgodGFzay51cGlkLmNsb25l KCksIHRhc2spKQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBOb25lCisg ICAgICAgICAgICB9CisgICAgICAgIH0pKTsKKworICAgICAgICBsZXQgbXV0IG5ld19maW5pc2hl ZF90YXNrcyA9IFZlYzo6bmV3KCk7CisKKyAgICAgICAgZm9yIHRhc2sgaW4gbmV3X3Rhc2tzIHsK KyAgICAgICAgICAgIGlmIHRhc2suZW5kdGltZS5pc19ub25lKCkgeworICAgICAgICAgICAgICAg IGFjdGl2ZV90YXNrcy5pbnNlcnQodGFzay51cGlkLmNsb25lKCksIHRhc2spOworICAgICAgICAg ICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBuZXdfZmluaXNoZWRfdGFza3MucHVzaCh0YXNr KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGxldCBtdXQgc3RhdGUgPSBz ZWxmLnJlYWRfc3RhdGUoKTsKKworICAgICAgICBmb3IgdXBpZCBpbiBkcm9wX3RyYWNrZWQgewor ICAgICAgICAgICAgc3RhdGUucmVtb3ZlX3RyYWNrZWRfdGFzaygmdXBpZCk7CisgICAgICAgIH0K KworICAgICAgICBzZWxmLndyaXRlX3Rhc2tzX3RvX2pvdXJuYWwoCisgICAgICAgICAgICBuZXdf ZmluaXNoZWRfdGFza3MsCisgICAgICAgICAgICAmbXV0IGFjdGl2ZV90YXNrcywKKyAgICAgICAg ICAgIHVwZGF0ZV9zdGF0ZV9mb3JfcmVtb3RlLAorICAgICAgICAgICAgJm11dCBzdGF0ZSwKKyAg ICAgICAgKT87CisKKyAgICAgICAgbGV0IG11dCBhY3RpdmU6IFZlYzxUYXNrQ2FjaGVJdGVtPiA9 IGFjdGl2ZV90YXNrcy5pbnRvX3ZhbHVlcygpLmNvbGxlY3QoKTsKKworICAgICAgICBhY3RpdmUu c29ydF9ieShjb21wYXJlX3Rhc2tzX3JldmVyc2UpOworICAgICAgICBzZWxmLndyaXRlX2FjdGl2 ZV90YXNrcyhhY3RpdmUuaW50b19pdGVyKCkpCisgICAgICAgICAgICAuY29udGV4dCgiZmFpbGVk IHRvIHdyaXRlIGFjdGl2ZSB0YXNrIGZpbGUgd2hlbiBhZGRpbmcgdGFza3MiKT87CisgICAgICAg IHNlbGYud3JpdGVfc3RhdGUoc3RhdGUpCisgICAgICAgICAgICAuY29udGV4dCgiZmFpbGVkIHRv IHVwZGF0ZSB0YXNrIGFyY2hpdmUgc3RhdGUgZmlsZSB3aGVuIGFkZGluZyB0YXNrcyIpPzsKKwor ICAgICAgICBzZWxmLmFwcGx5X2pvdXJuYWxfaWZfdG9vX2xhcmdlKCkKKyAgICAgICAgICAgIC5j b250ZXh0KCJjb3VsZCBub3QgYXBwbHkgam91cm5hbCBlYXJseSIpPzsKKworICAgICAgICBPaygo KSkKKyAgICB9CisKKyAgICBmbiB3cml0ZV90YXNrc190b19qb3VybmFsKAorICAgICAgICAmc2Vs ZiwKKyAgICAgICAgdGFza3M6IFZlYzxUYXNrQ2FjaGVJdGVtPiwKKyAgICAgICAgYWN0aXZlX3Rh c2tzOiAmbXV0IEhhc2hNYXA8UmVtb3RlVXBpZCwgVGFza0NhY2hlSXRlbT4sCisgICAgICAgIG5v ZGVfc3VjY2Vzc19tYXA6ICZOb2RlRmV0Y2hTdWNjZXNzTWFwLAorICAgICAgICBzdGF0ZTogJm11 dCBTdGF0ZSwKKyAgICApIC0+IFJlc3VsdDwoKSwgRXJyb3I+IHsKKyAgICAgICAgbGV0IGZpbGVu YW1lID0gc2VsZi5jYWNoZS5iYXNlX3BhdGguam9pbihXQUxfRklMRU5BTUUpOworICAgICAgICBs ZXQgbXV0IGZpbGUgPSBPcGVuT3B0aW9uczo6bmV3KCkKKyAgICAgICAgICAgIC5hcHBlbmQodHJ1 ZSkKKyAgICAgICAgICAgIC5jcmVhdGUodHJ1ZSkKKyAgICAgICAgICAgIC5vcGVuKGZpbGVuYW1l KT87CisKKyAgICAgICAgZm9yIHRhc2sgaW4gdGFza3MgeworICAgICAgICAgICAgLy8gUmVtb3Zl IHRoaXMgZmluaXNoZWQgdGFzayBmcm9tIG91ciBzZXQgb2YgYWN0aXZlIHRhc2tzLgorICAgICAg ICAgICAgYWN0aXZlX3Rhc2tzLnJlbW92ZSgmdGFzay51cGlkKTsKKworICAgICAgICAgICAgLy8g VE9ETzo6IEhhbmRsZSBQQlMgdGFza3MgY29ycmVjdGx5LgorICAgICAgICAgICAgLy8gVE9ETzog VGhpcyBpcyBhd2t3YXJkLCBtYXliZSBvdmVyaGF1bCBSZW1vdGVVcGlkIHR5cGUgdG8gbWFrZSB0 aGlzIGVhc2llcgorICAgICAgICAgICAgbWF0Y2ggdGFzay51cGlkLnVwaWQucGFyc2U6OjxQdmVV cGlkPigpIHsKKyAgICAgICAgICAgICAgICBPayh1cGlkKSA9PiB7CisgICAgICAgICAgICAgICAg ICAgIGxldCBub2RlID0gJnVwaWQubm9kZTsKKyAgICAgICAgICAgICAgICAgICAgbGV0IHJlbW90 ZSA9IHRhc2sudXBpZC5yZW1vdGUoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiBub2RlX3N1 Y2Nlc3NfbWFwLm5vZGVfc3VjY2Vzc2Z1bChyZW1vdGUsIG5vZGUpIHsKKyAgICAgICAgICAgICAg ICAgICAgICAgIHN0YXRlLnVwZGF0ZV9jdXRvZmZfdGltZXN0YW1wKHRhc2sudXBpZC5yZW1vdGUo KSwgbm9kZSwgdGFzay5zdGFydHRpbWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAg ICAgICAgICAgfQorICAgICAgICAgICAgICAgIEVycihlcnJvcikgPT4geworICAgICAgICAgICAg ICAgICAgICBsb2c6OmVycm9yISgiY291bGQgbm90IHBhcnNlIFBWRSBVUElEIC0gbm90IHNhdmlu ZyB0byB0YXNrIGNhY2hlOiB7ZXJyb3I6I30iKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGlu dWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzZXJk ZV9qc29uOjp0b193cml0ZXIoJm11dCBmaWxlLCAmdGFzayk/OworICAgICAgICAgICAgd3JpdGVs biEoJmZpbGUpPzsKKyAgICAgICAgfQorCisgICAgICAgIGZpbGUuc3luY19hbGwoKT87CisKKyAg ICAgICAgT2soKCkpCisgICAgfQorCisgICAgLy8vIFJldHVybnMgdGhlIGN1cnJlbnQgc2l6ZSBv ZiB0aGUgam91cm5hbCBmaWxlLgorICAgIGZuIGpvdXJuYWxfc2l6ZSgmc2VsZikgLT4gUmVzdWx0 PHU2NCwgRXJyb3I+IHsKKyAgICAgICAgbGV0IG1ldGFkYXRhID0gc2VsZgorICAgICAgICAgICAg LmNhY2hlCisgICAgICAgICAgICAuYmFzZV9wYXRoCisgICAgICAgICAgICAuam9pbihXQUxfRklM RU5BTUUpCisgICAgICAgICAgICAubWV0YWRhdGEoKQorICAgICAgICAgICAgLmNvbnRleHQoImZh aWxlZCB0byByZWFkIG1ldGFkYXRhIG9mIGpvdXJuYWwgZmlsZSIpPzsKKworICAgICAgICBPayht ZXRhZGF0YS5zaXplKCkpCisgICAgfQorCisgICAgLy8vIEFwcGx5IHRoZSBqb3VybmFsIGVhcmx5 IGlmIGl0IGhhcyBncm93biBsYXJnZXIgdGhhbiB0aGUgbWF4aW11bSBhbGxvd2VkIHNpemUuCisg ICAgZm4gYXBwbHlfam91cm5hbF9pZl90b29fbGFyZ2UoJnNlbGYpIC0+IFJlc3VsdDwoKSwgRXJy b3I+IHsKKyAgICAgICAgbGV0IHNpemUgPSBzZWxmLmpvdXJuYWxfc2l6ZSgpPzsKKworICAgICAg ICBpZiBzaXplID4gc2VsZi5jYWNoZS5qb3VybmFsX21heF9zaXplIHsKKyAgICAgICAgICAgIGxv Zzo6aW5mbyEoInRhc2sgY2FjaGUgam91cm5hbCBzaXplIHtzaXplfSBieXRlcywgYXBwbHlpbmcg ZWFybHkiKTsKKyAgICAgICAgICAgIHNlbGYuYXBwbHlfam91cm5hbCgpPzsKKyAgICAgICAgfQor CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIC8vLyBBcHBseSB0aGUgdGFzayBqb3VybmFs LgorICAgIC8vLworICAgIC8vLyBUaGlzIHdpbGwgbWVyZ2UgYWxsIHRhc2tzIGluIHRoZSBqb3Vy bmFsIGZpbGUgaW50byB0aGUgdGFzayBhcmNoaXZlLgorICAgIHB1YiBmbiBhcHBseV9qb3VybmFs KCZzZWxmKSAtPiBSZXN1bHQ8KCksIEVycm9yPiB7CisgICAgICAgIGxldCBzdGFydCA9IEluc3Rh bnQ6Om5vdygpOworICAgICAgICBsZXQgZmlsZW5hbWUgPSBzZWxmLmNhY2hlLmJhc2VfcGF0aC5q b2luKFdBTF9GSUxFTkFNRSk7CisKKyAgICAgICAgbGV0IGZpbGUgPSBtYXRjaCBGaWxlOjpvcGVu KCZmaWxlbmFtZSkgeworICAgICAgICAgICAgT2soZmlsZSkgPT4gQm94OjpuZXcoQnVmUmVhZGVy OjpuZXcoZmlsZSkpLAorICAgICAgICAgICAgRXJyKGVycikgaWYgZXJyLmtpbmQoKSA9PSBFcnJv cktpbmQ6Ok5vdEZvdW5kID0+IHJldHVybiBPaygoKSksCisgICAgICAgICAgICBFcnIoZXJyKSA9 PiByZXR1cm4gRXJyKGVyci5pbnRvKCkpLAorICAgICAgICB9OworCisgICAgICAgIGxvZzo6aW5m byEoImFwcGx5aW5nIHRhc2sgY2FjaGUgam91cm5hbCIpOworICAgICAgICBsZXQgaXRlcmF0b3Ig PSBBcmNoaXZlSXRlcmF0b3I6Om5ldyhmaWxlKTsKKworICAgICAgICBsZXQgbXV0IHRhc2tzOiBW ZWM8VGFza0NhY2hlSXRlbT4gPSBpdGVyYXRvcgorICAgICAgICAgICAgLmZpbHRlcl9tYXAofHRh c2t8IG1hdGNoIHRhc2sgeworICAgICAgICAgICAgICAgIE9rKHRhc2spID0+IFNvbWUodGFzayks CisgICAgICAgICAgICAgICAgRXJyKGVycikgPT4geworICAgICAgICAgICAgICAgICAgICBsb2c6 OmVycm9yISgiY291bGQgbm90IHJlYWQgdGFzayBmcm9tIGpvdXJuYWwgZmlsZToge2VycjojfSIp OworICAgICAgICAgICAgICAgICAgICBOb25lCisgICAgICAgICAgICAgICAgfQorICAgICAgICAg ICAgfSkKKyAgICAgICAgICAgIC5jb2xsZWN0KCk7CisKKyAgICAgICAgLy8gVGhlIFdBTCBjb250 YWlucyB0YXNrcyBpbiBhcmJpdHJhcnkgb3JkZXIgc2luY2Ugd2UgYWx3YXlzIGFwcGVuZC4KKyAg ICAgICAgdGFza3Muc29ydF9ieShjb21wYXJlX3Rhc2tzX3JldmVyc2UpOworICAgICAgICB0YXNr cy5kZWR1cCgpOworCisgICAgICAgIGxldCBjb3VudCA9IHRhc2tzLmxlbigpOworCisgICAgICAg IHNlbGYubWVyZ2VfdGFza3NfaW50b19hcmNoaXZlKHRhc2tzKT87CisKKyAgICAgICAgLy8gdHJ1 bmNhdGUgdGhlIGpvdXJuYWwgZmlsZQorICAgICAgICBPcGVuT3B0aW9uczo6bmV3KCkKKyAgICAg ICAgICAgIC53cml0ZSh0cnVlKQorICAgICAgICAgICAgLnRydW5jYXRlKHRydWUpCisgICAgICAg ICAgICAub3BlbihmaWxlbmFtZSkKKyAgICAgICAgICAgIC5jb250ZXh0KCJmYWlsZWQgdG8gdHJ1 bmNhdGUgam91cm5hbCBmaWxlIik/OworCisgICAgICAgIGxvZzo6aW5mbyEoCisgICAgICAgICAg ICAiY29tbWl0ZWQge2NvdW50fSB0YXNrcyBpbiB7Oi4zfS5zIHRvIHRhc2sgY2FjaGUgYXJjaGl2 ZSIsCisgICAgICAgICAgICBzdGFydC5lbGFwc2VkKCkuYXNfc2Vjc19mMzIoKQorICAgICAgICAp OworCisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIC8vLyBNZXJnZSBhIGxpc3Qgb2YgKmZp bmlzaGVkKiB0YXNrcyBpbnRvIHRoZSByZW1vdGUgdGFzayBhcmNoaXZlIGZpbGVzLgorICAgIC8v LyBUaGUgbGlzdCBvZiB0YXNrIGluIGB0YXNrc2AgKm11c3QqIGJlIHNvcnRlZCBieSB0aGVpciB0 aW1lc3RhbXAgYW5kIFVQSUQgKGRlc2NlbmRpbmcgYnkKKyAgICAvLy8gdGltZXN0YW1wLCBhc2Nl bmRpbmcgYnkgVVBJRCkuCisgICAgZm4gbWVyZ2VfdGFza3NfaW50b19hcmNoaXZlKCZzZWxmLCB0 YXNrczogVmVjPFRhc2tDYWNoZUl0ZW0+KSAtPiBSZXN1bHQ8KCksIEVycm9yPiB7CisgICAgICAg IGRlYnVnX2Fzc2VydCEodGFza3MKKyAgICAgICAgICAgIC5pdGVyKCkKKyAgICAgICAgICAgIC5p c19zb3J0ZWRfYnkofGEsIGJ8IGNvbXBhcmVfdGFza3MoYSwgYikuaXNfZ2UoKSkpOworCisgICAg ICAgIGxldCBmaWxlcyA9IHNlbGYKKyAgICAgICAgICAgIC5jYWNoZQorICAgICAgICAgICAgLmFy Y2hpdmVfZmlsZXMoJnNlbGYubG9jaykKKyAgICAgICAgICAgIC5jb250ZXh0KCJmYWlsZWQgdG8g cmVhZCBhY2hpdmUgZmlsZXMiKT87CisKKyAgICAgICAgbGV0IG11dCBmaWxlcyA9IGZpbGVzLml0 ZXIoKS5wZWVrYWJsZSgpOworCisgICAgICAgIGxldCBtdXQgY3VycmVudCA9IGZpbGVzLm5leHQo KTsKKyAgICAgICAgbGV0IG11dCBuZXh0ID0gZmlsZXMucGVlaygpOworCisgICAgICAgIGxldCBt dXQgdGFza3NfZm9yX2N1cnJlbnRfZmlsZSA9IFZlYzo6bmV3KCk7CisKKyAgICAgICAgLy8gVGFz a3MgYXJlIHNvcnRlZCB5b3VuZ2VzdCB0byBvbGRlc3QgKGJpZ2dlc3Qgc3RhcnQgdGltZSBmaXJz dCkKKyAgICAgICAgZm9yIHRhc2sgaW4gdGFza3MgeworICAgICAgICAgICAgLy8gU2tpcCBhaGVh ZCB1bnRpbCB3ZSBoYXZlIGZvdW5kIHRoZSBjb3JyZWN0IGZpbGUuCisgICAgICAgICAgICB3aGls ZSBuZXh0LmlzX3NvbWUoKSB7CisgICAgICAgICAgICAgICAgaWYgbGV0IFNvbWUoY3VycmVudCkg PSBjdXJyZW50IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgdGFzay5zdGFydHRpbWUgPj0gY3Vy cmVudC5zdGFydHRpbWUgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG5leHQgZW50cnkncyBj dXQtb2ZmIGlzIGxhcmdlciB0aGVuIHRoZSB0YXNrJ3Mgc3RhcnQgdGltZSwgdGhhdCBtZWFucwor ICAgICAgICAgICAgICAgICAgICAvLyB3ZSB3YW50IHRvIGZpbmFsaXplZCB0aGUgY3VycmVudCBm aWxlIGJ5IG1lcmdpbmcgYWxsIHRhc2tzIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgLy8gc2hv dWxkIGJlIHN0b3JlZCBpbiBpdC4uLgorICAgICAgICAgICAgICAgICAgICBzZWxmLm1lcmdlX3Np bmdsZV9hcmNoaXZlX2ZpbGUoCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1lbTo6dGFr ZSgmbXV0IHRhc2tzX2Zvcl9jdXJyZW50X2ZpbGUpLAorICAgICAgICAgICAgICAgICAgICAgICAg Y3VycmVudCwKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAud2l0 aF9jb250ZXh0KHx8IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCEoImZhaWxlZCB0 byBtZXJnZSBhcmNoaXZlIGZpbGUge30iLCBjdXJyZW50LnBhdGguZGlzcGxheSgpKQorICAgICAg ICAgICAgICAgICAgICB9KT87CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAg Ly8gLi4uIGFuZCB0aGUgYGN1cnJlbnRgIGZpbGUgdG8gdGhlIG5leHQgZW50cnkuCisgICAgICAg ICAgICAgICAgY3VycmVudCA9IGZpbGVzLm5leHQoKTsKKyAgICAgICAgICAgICAgICBuZXh0ID0g ZmlsZXMucGVlaygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiBsZXQgU29tZShj dXJyZW50KSA9IGN1cnJlbnQgeworICAgICAgICAgICAgICAgIGlmIHRhc2suc3RhcnR0aW1lIDwg Y3VycmVudC5zdGFydHRpbWUgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAg ICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0YXNrc19mb3JfY3VycmVu dF9maWxlLnB1c2godGFzayk7CisgICAgICAgIH0KKworICAgICAgICAvLyBNZXJnZSB0YXNrcyBm b3IgdGhlIGxhc3QgZmlsZS4KKyAgICAgICAgaWYgbGV0IFNvbWUoY3VycmVudCkgPSBjdXJyZW50 IHsKKyAgICAgICAgICAgIHNlbGYubWVyZ2Vfc2luZ2xlX2FyY2hpdmVfZmlsZSh0YXNrc19mb3Jf Y3VycmVudF9maWxlLCBjdXJyZW50KQorICAgICAgICAgICAgICAgIC53aXRoX2NvbnRleHQofHwg eworICAgICAgICAgICAgICAgICAgICBmb3JtYXQhKCJmYWlsZWQgdG8gbWVyZ2UgYXJjaGl2ZSBm aWxlIHt9IiwgY3VycmVudC5wYXRoLmRpc3BsYXkoKSkKKyAgICAgICAgICAgICAgICB9KT87Cisg ICAgICAgIH0KKworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICAvLy8gQWRkIGEgbmV3IHRy YWNrZWQgdGFzay4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyB3aWxsIGluc2VydCB0aGUgdGFzayBp biB0aGUgbGlzdCBvZiB0cmFja2VkIHRhc2tzIGluIHRoZSBzdGF0ZSBmaWxlLAorICAgIC8vLyBh cyB3ZWxsIGFzIGNyZWF0ZSBhbiBlbnRyeSBpbiB0aGUgYGFjdGl2ZWAgZmlsZS4KKyAgICBwdWIg Zm4gYWRkX3RyYWNrZWRfdGFzaygmc2VsZiwgdGFzazogVGFza0NhY2hlSXRlbSkgLT4gUmVzdWx0 PCgpLCBFcnJvcj4geworICAgICAgICBsZXQgbXV0IHN0YXRlID0gc2VsZi5yZWFkX3N0YXRlKCk7 CisKKyAgICAgICAgbGV0IG11dCB0YXNrczogVmVjPFRhc2tDYWNoZUl0ZW0+ID0gc2VsZgorICAg ICAgICAgICAgLmdldF90YXNrcyhHZXRUYXNrczo6QWN0aXZlKQorICAgICAgICAgICAgLmNvbnRl eHQoImZhaWxlZCB0byBjcmVhdGUgYWN0aXZlIHRhc2sgaXRlcmF0b3IiKT8KKyAgICAgICAgICAg IC5jb2xsZWN0KCk7CisKKyAgICAgICAgdGFza3MucHVzaCh0YXNrLmNsb25lKCkpOworICAgICAg ICB0YXNrcy5zb3J0X2J5KGNvbXBhcmVfdGFza3NfcmV2ZXJzZSk7CisKKyAgICAgICAgc3RhdGUu YWRkX3RyYWNrZWRfdGFzayh0YXNrLnVwaWQpOworCisgICAgICAgIHNlbGYud3JpdGVfYWN0aXZl X3Rhc2tzKHRhc2tzLmludG9faXRlcigpKQorICAgICAgICAgICAgLmNvbnRleHQoImZhaWxlZCB0 byB3cml0ZSBhY3RpdmUgdGFza3MgZmlsZSB3aGVuIGFkZGluZyB0cmFja2VkIHRhc2siKT87CisK KyAgICAgICAgc2VsZi53cml0ZV9zdGF0ZShzdGF0ZSkKKyAgICAgICAgICAgIC5jb250ZXh0KCJm YWlsZWQgdG8gd3JpdGUgc3RhdGUgd2hlbiBhZGRpbmcgdHJhY2tlZCB0YXNrIik/OworCisgICAg ICAgIE9rKCgpKQorICAgIH0KKworICAgIC8vLyBSZWFkIHRoZSBzdGF0ZSBmaWxlLgorICAgIC8v LyBJZiB0aGUgc3RhdGUgZmlsZSBjb3VsZCBub3QgYmUgcmVhZCBvciBkb2VzIG5vdCBleGlzdCwg dGhlIGRlZmF1bHQgKGVtcHR5KSBzdGF0ZQorICAgIC8vLyBpcyByZXR1cm5lZC4KKyAgICBwdWIg Zm4gcmVhZF9zdGF0ZSgmc2VsZikgLT4gU3RhdGUgeworICAgICAgICBzZWxmLmNhY2hlLnJlYWRf c3RhdGUoKQorICAgIH0KKworICAgIC8vLyBXcml0ZSB0aGUgc3RhdGUgZmlsZS4KKyAgICBmbiB3 cml0ZV9zdGF0ZSgmc2VsZiwgc3RhdGU6IFN0YXRlKSAtPiBSZXN1bHQ8KCksIEVycm9yPiB7Cisg ICAgICAgIGxldCBwYXRoID0gc2VsZi5jYWNoZS5iYXNlX3BhdGguam9pbihTVEFURV9GSUxFTkFN RSk7CisKKyAgICAgICAgbGV0IGRhdGEgPSBzZXJkZV9qc29uOjp0b192ZWNfcHJldHR5KCZzdGF0 ZSk/OworCisgICAgICAgIHByb3htb3hfc3lzOjpmczo6cmVwbGFjZV9maWxlKHBhdGgsICZkYXRh LCBzZWxmLmNhY2hlLmNyZWF0ZV9vcHRpb25zLCB0cnVlKT87CisKKyAgICAgICAgT2soKCkpCisg ICAgfQorCisgICAgLy8vIFdyaXRlIHRoZSBwcm92aWRlZCB0YXNrcyB0byB0aGUgJ2FjdGl2ZScg ZmlsZS4KKyAgICAvLy8KKyAgICAvLy8gVGhlIHRhc2tzIGFyZSBmaXJzdCB3cml0dGVuIHRvIGEg dGVtcG9yYXJ5IGZpbGUsIHdoaWNoIGlzIHRoZW4gdXNlZAorICAgIC8vLyB0byBhdG9taWNhbGx5 IHJlcGxhY2UgdGhlIG9yaWdpbmFsLgorICAgIGZuIHdyaXRlX2FjdGl2ZV90YXNrcygmc2VsZiwg dGFza3M6IGltcGwgSXRlcmF0b3I8SXRlbSA9IFRhc2tDYWNoZUl0ZW0+KSAtPiBSZXN1bHQ8KCks IEVycm9yPiB7CisgICAgICAgIGxldCAoZmQsIHBhdGgpID0gcHJveG1veF9zeXM6OmZzOjptYWtl X3RtcF9maWxlKAorICAgICAgICAgICAgc2VsZi5jYWNoZS5iYXNlX3BhdGguam9pbihBQ1RJVkVf RklMRU5BTUUpLAorICAgICAgICAgICAgc2VsZi5jYWNoZS5jcmVhdGVfb3B0aW9ucywKKyAgICAg ICAgKT87CisgICAgICAgIGxldCBtdXQgZmQgPSBCdWZXcml0ZXI6Om5ldyhmZCk7CisKKyAgICAg ICAgU2VsZjo6d3JpdGVfdGFza3MoJm11dCBmZCwgdGFza3MpPzsKKworICAgICAgICBpZiBsZXQg RXJyKGVycikgPSBmZC5mbHVzaCgpIHsKKyAgICAgICAgICAgIGxvZzo6ZXJyb3IhKCJjb3VsZCBu b3QgZmx1c2ggJ2FjdGl2ZScgZmlsZToge2VycjojfSIpOworICAgICAgICB9CisgICAgICAgIGRy b3AoZmQpOworCisgICAgICAgIGxldCB0YXJnZXQgPSBzZWxmLmNhY2hlLmJhc2VfcGF0aC5qb2lu KEFDVElWRV9GSUxFTkFNRSk7CisKKyAgICAgICAgbGV0IHJlcyA9IHN0ZDo6ZnM6OnJlbmFtZSgm cGF0aCwgJnRhcmdldCkud2l0aF9jb250ZXh0KHx8IHsKKyAgICAgICAgICAgIGZvcm1hdCEoCisg ICAgICAgICAgICAgICAgImZhaWxlZCB0byByZXBsYWNlIHt9IHdpdGgge30iLAorICAgICAgICAg ICAgICAgIHRhcmdldC5kaXNwbGF5KCksCisgICAgICAgICAgICAgICAgcGF0aC5kaXNwbGF5KCks CisgICAgICAgICAgICApCisgICAgICAgIH0pOworCisgICAgICAgIGlmIGxldCBFcnIoZXJyKSA9 IHJlcyB7CisgICAgICAgICAgICBpZiBsZXQgRXJyKGVycikgPSBzdGQ6OmZzOjpyZW1vdmVfZmls ZSgmcGF0aCkgeworICAgICAgICAgICAgICAgIGxvZzo6ZXJyb3IhKAorICAgICAgICAgICAgICAg ICAgICAiZmFpbGVkIHRvIGNsZWFudXAgdGVtcG9yYXJ5IGZpbGUge306IHtlcnI6I30iLAorICAg ICAgICAgICAgICAgICAgICBwYXRoLmRpc3BsYXkoKQorICAgICAgICAgICAgICAgICk7CisgICAg ICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBFcnIoZXJyKTsKKyAgICAgICAgfQorCisg ICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIC8vLyBNZXJnZSBgdGFza3NgIHdpdGggYW4gZXhp c3RpbmcgYXJjaGl2ZSBmaWxlLgorICAgIC8vLyBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBg dGFza3NgIGFuZCB0aGUgcHJlLWV4aXN0aW5nIGNvbnRlbnRzIG9mIHRoZSBhcmNoaXZlCisgICAg Ly8vIGZpbGUgYXJlIGJvdGggc29ydGVkIGRlc2NlbmRpbmcgYnkgc3RhcnR0aW1lIChtb3N0IHJl Y2VudCB0YXNrcyBjb21lIGZpcnN0KS4KKyAgICAvLy8gVGhlIHRhc2sgYXJjaGl2ZSBtdXN0IGJl IGxvY2tlZCB3aGVuIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAgICBmbiBtZXJnZV9zaW5nbGVf YXJjaGl2ZV9maWxlKAorICAgICAgICAmc2VsZiwKKyAgICAgICAgdGFza3M6IFZlYzxUYXNrQ2Fj aGVJdGVtPiwKKyAgICAgICAgZmlsZTogJkFyY2hpdmVGaWxlLAorICAgICkgLT4gUmVzdWx0PCgp LCBFcnJvcj4geworICAgICAgICBpZiB0YXNrcy5pc19lbXB0eSgpIHsKKyAgICAgICAgICAgIHJl dHVybiBPaygoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiBNaWdodCBiZSBuaWNl IHRvIGFsc28gbW92ZSB0aGlzIHRvIEFyY2hpdmVGaWxlCisgICAgICAgIGxldCAodGVtcF9maWxl LCB0ZW1wX2ZpbGVfcGF0aCkgPQorICAgICAgICAgICAgcHJveG1veF9zeXM6OmZzOjptYWtlX3Rt cF9maWxlKCZmaWxlLnBhdGgsIHNlbGYuY2FjaGUuY3JlYXRlX29wdGlvbnMpPzsKKyAgICAgICAg bGV0IG11dCB3cml0ZXIgPSBpZiBmaWxlLmNvbXByZXNzZWQgeworICAgICAgICAgICAgbGV0IGVu Y29kZXIgPQorICAgICAgICAgICAgICAgIHpzdGQ6OnN0cmVhbTo6d3JpdGU6OkVuY29kZXI6Om5l dyh0ZW1wX2ZpbGUsIHpzdGQ6OkRFRkFVTFRfQ09NUFJFU1NJT05fTEVWRUwpPworICAgICAgICAg ICAgICAgICAgICAuYXV0b19maW5pc2goKTsKKyAgICAgICAgICAgIEJveDo6bmV3KEJ1ZldyaXRl cjo6bmV3KGVuY29kZXIpKSBhcyBCb3g8ZHluIFdyaXRlPgorICAgICAgICB9IGVsc2UgeworICAg ICAgICAgICAgQm94OjpuZXcoQnVmV3JpdGVyOjpuZXcodGVtcF9maWxlKSkgYXMgQm94PGR5biBX cml0ZT4KKyAgICAgICAgfTsKKworICAgICAgICBsZXQgYXJjaGl2ZV9pdGVyID0gZmlsZQorICAg ICAgICAgICAgLml0ZXIoKT8KKyAgICAgICAgICAgIC5mbGF0X21hcCh8aXRlbXwgbWF0Y2ggaXRl bSB7CisgICAgICAgICAgICAgICAgT2soaXRlbSkgPT4gU29tZShpdGVtKSwKKyAgICAgICAgICAg ICAgICBFcnIoZXJyKSA9PiB7CisgICAgICAgICAgICAgICAgICAgIGxvZzo6ZXJyb3IhKCJjb3Vs ZCBub3QgcmVhZCB0YXNrIGNhY2hlIGl0ZW0gd2hpbGUgbWVyZ2luZzoge2VycjojfSIpOworICAg ICAgICAgICAgICAgICAgICBOb25lCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkK KyAgICAgICAgICAgIC5wZWVrYWJsZSgpOworICAgICAgICBsZXQgdGFza19pdGVyID0gdGFza3Mu aW50b19pdGVyKCkucGVla2FibGUoKTsKKworICAgICAgICBTZWxmOjp3cml0ZV90YXNrcygmbXV0 IHdyaXRlciwgTWVyZ2VUYXNrSXRlcmF0b3I6Om5ldyhhcmNoaXZlX2l0ZXIsIHRhc2tfaXRlcikp PzsKKworICAgICAgICBpZiBsZXQgRXJyKGVycikgPSB3cml0ZXIuZmx1c2goKSB7CisgICAgICAg ICAgICBsb2c6OmVycm9yISgiY291bGQgbm90IGZsdXNoIEJ1ZldyaXRlciBmb3Ige2ZpbGU6P306 IHtlcnI6I30iKTsKKyAgICAgICAgfQorICAgICAgICBkcm9wKHdyaXRlcik7CisKKyAgICAgICAg aWYgbGV0IEVycihlcnIpID0gc3RkOjpmczo6cmVuYW1lKCZ0ZW1wX2ZpbGVfcGF0aCwgJmZpbGUu cGF0aCkud2l0aF9jb250ZXh0KHx8IHsKKyAgICAgICAgICAgIGZvcm1hdCEoCisgICAgICAgICAg ICAgICAgImZhaWxlZCB0byByZXBsYWNlIHt9IHdpdGgge30iLAorICAgICAgICAgICAgICAgIGZp bGUucGF0aC5kaXNwbGF5KCksCisgICAgICAgICAgICAgICAgdGVtcF9maWxlX3BhdGguZGlzcGxh eSgpCisgICAgICAgICAgICApCisgICAgICAgIH0pIHsKKyAgICAgICAgICAgIGlmIGxldCBFcnIo ZXJyKSA9IHN0ZDo6ZnM6OnJlbW92ZV9maWxlKCZ0ZW1wX2ZpbGVfcGF0aCkgeworICAgICAgICAg ICAgICAgIGxvZzo6ZXJyb3IhKAorICAgICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIGNsZWFu IHVwIHRlbXBvcmFyeSBmaWxlIHt9OiB7ZXJyOiN9IiwKKyAgICAgICAgICAgICAgICAgICAgdGVt cF9maWxlX3BhdGguZGlzcGxheSgpCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0K KworICAgICAgICAgICAgcmV0dXJuIEVycihlcnIpOworICAgICAgICB9CisKKyAgICAgICAgT2so KCkpCisgICAgfQorCisgICAgLy8vIFdyaXRlIGFuIGl0ZXJhdG9yIG9mIFtgVGFza0NhY2hlSXRl bWBdIHRvIGEgc29tZXRoaW5nIHRoYXQgaW1wbGVtZW50cyBbYFdyaXRlYF0uCisgICAgLy8vIFRo ZSBpbmRpdmlkdWFsIGl0ZW1zIGFyZSBlbmNvZGVkIGFzIEpTT04gZm9sbG93ZWQgYnkgYSBuZXds aW5lLgorICAgIGZuIHdyaXRlX3Rhc2tzKAorICAgICAgICB3cml0ZXI6ICZtdXQgaW1wbCBXcml0 ZSwKKyAgICAgICAgdGFza3M6IGltcGwgSXRlcmF0b3I8SXRlbSA9IFRhc2tDYWNoZUl0ZW0+LAor ICAgICkgLT4gUmVzdWx0PCgpLCBFcnJvcj4geworICAgICAgICBmb3IgdGFzayBpbiB0YXNrcyB7 CisgICAgICAgICAgICBzZXJkZV9qc29uOjp0b193cml0ZXIoJm11dCAqd3JpdGVyLCAmdGFzayk/ OworICAgICAgICAgICAgd3JpdGVsbiEod3JpdGVyKT87CisgICAgICAgIH0KKworICAgICAgICBP aygoKSkKKyAgICB9Cit9CisKK2ltcGwgVGFza0NhY2hlIHsKKyAgICAvLy8gQ3JlYXRlIGEgbmV3 IHRhc2sgY2FjaGUgaW5zdGFuY2UuCisgICAgLy8vCisgICAgLy8vIFJlbWVtYmVyIHRvIGNhbGwg YGluaXRgIG9yIGBuZXdfZmlsZWAgb24gYSBsb2NrZWQsIHdyaXRhYmxlIFRhc2tDYWNoZQorICAg IC8vLyB0byBjcmVhdGUgdGhlIGluaXRpYWwgYXJjaGl2ZSBmaWxlcy4KKyAgICBwdWIgZm4gbmV3 PFA6IEFzUmVmPFBhdGg+PigKKyAgICAgICAgcGF0aDogUCwKKyAgICAgICAgY3JlYXRlX29wdGlv bnM6IENyZWF0ZU9wdGlvbnMsCisgICAgICAgIG1heF9maWxlczogdTMyLAorICAgICAgICB1bmNv bXByZXNzZWQ6IHUzMiwKKyAgICAgICAgcm90YXRlX2FmdGVyOiB1NjQsCisgICAgICAgIGpvdXJu YWxfbWF4X3NpemU6IHU2NCwKKyAgICApIC0+IFJlc3VsdDxTZWxmLCBFcnJvcj4geworICAgICAg ICBPayhTZWxmIHsKKyAgICAgICAgICAgIGJhc2VfcGF0aDogcGF0aC5hc19yZWYoKS5pbnRvKCks CisgICAgICAgICAgICBjcmVhdGVfb3B0aW9ucywKKyAgICAgICAgICAgIGpvdXJuYWxfbWF4X3Np emUsCisgICAgICAgICAgICBtYXhfZmlsZXMsCisgICAgICAgICAgICByb3RhdGVfYWZ0ZXIsCisg ICAgICAgICAgICB1bmNvbXByZXNzZWRfZmlsZXM6IHVuY29tcHJlc3NlZCwKKyAgICAgICAgfSkK KyAgICB9CisKKyAgICAvLy8gTG9jayB0aGUgY2FjaGUgZm9yIHJlYWRpbmcuCisgICAgcHViIGZu IHJlYWQoc2VsZikgLT4gUmVzdWx0PFJlYWRhYmxlVGFza0NhY2hlLCBFcnJvcj4geworICAgICAg ICBsZXQgbG9jayA9IHNlbGYubG9ja19pbXBsKGZhbHNlKT87CisKKyAgICAgICAgT2soUmVhZGFi bGVUYXNrQ2FjaGUgeyBjYWNoZTogc2VsZiwgbG9jayB9KQorICAgIH0KKworICAgIC8vLyBMb2Nr IHRoZSBjYWNoZSBmb3Igd3JpdGluZy4KKyAgICBwdWIgZm4gd3JpdGUoc2VsZikgLT4gUmVzdWx0 PFdyaXRhYmxlVGFza0NhY2hlLCBFcnJvcj4geworICAgICAgICBsZXQgbG9jayA9IHNlbGYubG9j a19pbXBsKHRydWUpPzsKKworICAgICAgICBPayhXcml0YWJsZVRhc2tDYWNoZSB7IGNhY2hlOiBz ZWxmLCBsb2NrIH0pCisgICAgfQorCisgICAgZm4gbG9ja19pbXBsKCZzZWxmLCBleGNsdXNpdmU6 IGJvb2wpIC0+IFJlc3VsdDxUYXNrQ2FjaGVMb2NrLCBFcnJvcj4geworICAgICAgICBsZXQgbG9j a2ZpbGUgPSBzZWxmLmJhc2VfcGF0aC5qb2luKExPQ0tGSUxFX0ZJTEVOQU1FKTsKKworICAgICAg ICBPayhUYXNrQ2FjaGVMb2NrKHByb3htb3hfc3lzOjpmczo6b3Blbl9maWxlX2xvY2tlZCgKKyAg ICAgICAgICAgIGxvY2tmaWxlLAorICAgICAgICAgICAgRHVyYXRpb246OmZyb21fc2VjcygxMCks CisgICAgICAgICAgICBleGNsdXNpdmUsCisgICAgICAgICAgICBzZWxmLmNyZWF0ZV9vcHRpb25z LAorICAgICAgICApPykpCisgICAgfQorCisgICAgLy8vIFJlYWQgdGhlIHN0YXRlIGZpbGUuCisg ICAgLy8vIElmIHRoZSBzdGF0ZSBmaWxlIGNvdWxkIG5vdCBiZSByZWFkIG9yIGRvZXMgbm90IGV4 aXN0LCB0aGUgZGVmYXVsdCAoZW1wdHkpIHN0YXRlCisgICAgLy8vIGlzIHJldHVybmVkLgorICAg IHB1YiBmbiByZWFkX3N0YXRlKCZzZWxmKSAtPiBTdGF0ZSB7CisgICAgICAgIGZuIGRvX3JlYWRf c3RhdGUocGF0aDogJlBhdGgpIC0+IFJlc3VsdDxTdGF0ZSwgRXJyb3I+IHsKKyAgICAgICAgICAg IG1hdGNoIHN0ZDo6ZnM6OnJlYWQocGF0aCkgeworICAgICAgICAgICAgICAgIE9rKGNvbnRlbnQp ID0+IHNlcmRlX2pzb246OmZyb21fc2xpY2UoJmNvbnRlbnQpLm1hcF9lcnIofGVycnwgZXJyLmlu dG8oKSksCisgICAgICAgICAgICAgICAgRXJyKGVycikgaWYgZXJyLmtpbmQoKSA9PSBFcnJvcktp bmQ6Ok5vdEZvdW5kID0+IE9rKERlZmF1bHQ6OmRlZmF1bHQoKSksCisgICAgICAgICAgICAgICAg RXJyKGVycikgPT4gRXJyKGVyci5pbnRvKCkpLAorICAgICAgICAgICAgfQorICAgICAgICB9CisK KyAgICAgICAgbGV0IHBhdGggPSBzZWxmLmJhc2VfcGF0aC5qb2luKFNUQVRFX0ZJTEVOQU1FKTsK KyAgICAgICAgZG9fcmVhZF9zdGF0ZSgmcGF0aCkudW53cmFwX29yX2Vsc2UofGVycnwgeworICAg ICAgICAgICAgbG9nOjplcnJvciEoImNvdWxkIG5vdCByZWFkIHN0YXRlIGZpbGU6IHtlcnI6I30i KTsKKyAgICAgICAgICAgIERlZmF1bHQ6OmRlZmF1bHQoKQorICAgICAgICB9KQorICAgIH0KKwor ICAgIGZuIGdldF90YXNrc19pbXBsPCdhPigKKyAgICAgICAgJnNlbGYsCisgICAgICAgIG1vZGU6 IEdldFRhc2tzLAorICAgICAgICBsb2NrOiAmJ2EgVGFza0NhY2hlTG9jaywKKyAgICApIC0+IFJl c3VsdDxUYXNrQXJjaGl2ZUl0ZXJhdG9yPCdhPiwgRXJyb3I+IHsKKyAgICAgICAgbGV0IGpvdXJu YWxfZmlsZSA9IHNlbGYuYmFzZV9wYXRoLmpvaW4oV0FMX0ZJTEVOQU1FKTsKKyAgICAgICAgbGV0 IGFjdGl2ZV9wYXRoID0gc2VsZi5iYXNlX3BhdGguam9pbihBQ1RJVkVfRklMRU5BTUUpOworCisg ICAgICAgIG1hdGNoIG1vZGUgeworICAgICAgICAgICAgR2V0VGFza3M6OkFsbCA9PiB7CisgICAg ICAgICAgICAgICAgbGV0IG11dCBhcmNoaXZlX2ZpbGVzID0gc2VsZi5hcmNoaXZlX2ZpbGVzKGxv Y2spPzsKKyAgICAgICAgICAgICAgICBhcmNoaXZlX2ZpbGVzLnJldmVyc2UoKTsKKworICAgICAg ICAgICAgICAgIGlmIGFjdGl2ZV9wYXRoLmV4aXN0cygpIHsKKyAgICAgICAgICAgICAgICAgICAg YXJjaGl2ZV9maWxlcy5wdXNoKEFyY2hpdmVGaWxlIHsKKyAgICAgICAgICAgICAgICAgICAgICAg IHBhdGg6IHNlbGYuYmFzZV9wYXRoLmpvaW4oQUNUSVZFX0ZJTEVOQU1FKSwKKyAgICAgICAgICAg ICAgICAgICAgICAgIGNvbXByZXNzZWQ6IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAg c3RhcnR0aW1lOiAwLAorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICB9 CisKKyAgICAgICAgICAgICAgICBUYXNrQXJjaGl2ZUl0ZXJhdG9yOjpuZXcoU29tZShqb3VybmFs X2ZpbGUpLCBhcmNoaXZlX2ZpbGVzLCBsb2NrKQorICAgICAgICAgICAgfQorICAgICAgICAgICAg R2V0VGFza3M6OkFjdGl2ZSA9PiB7CisgICAgICAgICAgICAgICAgbGV0IG11dCBhcmNoaXZlX2Zp bGVzID0gVmVjOjpuZXcoKTsKKworICAgICAgICAgICAgICAgIGlmIGFjdGl2ZV9wYXRoLmV4aXN0 cygpIHsKKyAgICAgICAgICAgICAgICAgICAgYXJjaGl2ZV9maWxlcy5wdXNoKEFyY2hpdmVGaWxl IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IHNlbGYuYmFzZV9wYXRoLmpvaW4oQUNU SVZFX0ZJTEVOQU1FKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzZWQ6IGZhbHNl LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnR0aW1lOiAwLAorICAgICAgICAgICAgICAg ICAgICB9KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBUYXNrQXJjaGl2 ZUl0ZXJhdG9yOjpuZXcoTm9uZSwgYXJjaGl2ZV9maWxlcywgbG9jaykKKyAgICAgICAgICAgIH0K KyAgICAgICAgICAgICNbY2ZnKHRlc3QpXQorICAgICAgICAgICAgR2V0VGFza3M6OkFyY2hpdmVk ID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgbXV0IGZpbGVzID0gc2VsZi5hcmNoaXZlX2ZpbGVz KGxvY2spPzsKKyAgICAgICAgICAgICAgICBmaWxlcy5yZXZlcnNlKCk7CisKKyAgICAgICAgICAg ICAgICBUYXNrQXJjaGl2ZUl0ZXJhdG9yOjpuZXcoU29tZShqb3VybmFsX2ZpbGUpLCBmaWxlcywg bG9jaykKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyBSZXR1cm5z IGEgbGlzdCBvZiBleGlzdGluZyBhcmNoaXZlIGZpbGVzLCB0b2dldGhlciB3aXRoIHRoZWlyIHJl c3BlY3RpdmUKKyAgICAvLy8gY3V0LW9mZiB0aW1lc3RhbXAuIFRoZSByZXN1bHQgaXMgc29ydGVk IGFzY2VuZGluZyBieSBjdXQtb2ZmIHRpbWVzdGFtcCAobW9zdCByZWNlbnQgb25lCisgICAgLy8v IGZpcnN0KS4KKyAgICAvLy8gVGhlIHRhc2sgYXJjaGl2ZSBzaG91bGQgYmUgbG9ja2VkIGZvciBy ZWFkaW5nIHdoZW4gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICAgIGZuIGFyY2hpdmVfZmlsZXMo JnNlbGYsIF9sb2NrOiAmVGFza0NhY2hlTG9jaykgLT4gUmVzdWx0PFZlYzxBcmNoaXZlRmlsZT4s IEVycm9yPiB7CisgICAgICAgIGxldCBtdXQgbmFtZXMgPSBWZWM6Om5ldygpOworCisgICAgICAg IGZvciBlbnRyeSBpbiBzdGQ6OmZzOjpyZWFkX2Rpcigmc2VsZi5iYXNlX3BhdGgpPyB7CisgICAg ICAgICAgICBsZXQgZW50cnkgPSBlbnRyeT87CisKKyAgICAgICAgICAgIGxldCBwYXRoID0gZW50 cnkucGF0aCgpOworCisgICAgICAgICAgICBpZiBsZXQgU29tZShmaWxlKSA9IFNlbGY6OnBhcnNl X2FyY2hpdmVfZmlsZW5hbWUoJnBhdGgpIHsKKyAgICAgICAgICAgICAgICBuYW1lcy5wdXNoKGZp bGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbmFtZXMuc29ydF9ieV9r ZXkofGV8IC1lLnN0YXJ0dGltZSk7CisKKyAgICAgICAgT2sobmFtZXMpCisgICAgfQorCisgICAg Zm4gcGFyc2VfYXJjaGl2ZV9maWxlbmFtZShwYXRoOiAmUGF0aCkgLT4gT3B0aW9uPEFyY2hpdmVG aWxlPiB7CisgICAgICAgIGxldCBmaWxlbmFtZSA9IHBhdGguZmlsZV9uYW1lKCk/LnRvX3N0cigp PzsKKyAgICAgICAgbGV0IGZpbGVuYW1lID0gZmlsZW5hbWUuc3RyaXBfcHJlZml4KEFSQ0hJVkVf RklMRU5BTUVfUFJFRklYKT87CisKKyAgICAgICAgaWYgbGV0IFNvbWUoc3RhcnR0aW1lKSA9IGZp bGVuYW1lLnN0cmlwX3N1ZmZpeChaU1REX0VYVEVOU0lPTl9XSVRIX0RPVCkgeworICAgICAgICAg ICAgbGV0IHN0YXJ0dGltZTogaTY0ID0gc3RhcnR0aW1lLnBhcnNlKCkub2soKT87CisKKyAgICAg ICAgICAgIFNvbWUoQXJjaGl2ZUZpbGUgeworICAgICAgICAgICAgICAgIHBhdGg6IHBhdGgudG9f cGF0aF9idWYoKSwKKyAgICAgICAgICAgICAgICBjb21wcmVzc2VkOiB0cnVlLAorICAgICAgICAg ICAgICAgIHN0YXJ0dGltZSwKKyAgICAgICAgICAgIH0pCisgICAgICAgIH0gZWxzZSB7CisgICAg ICAgICAgICBsZXQgc3RhcnR0aW1lOiBpNjQgPSBmaWxlbmFtZS5wYXJzZSgpLm9rKCk/OworCisg ICAgICAgICAgICBTb21lKEFyY2hpdmVGaWxlIHsKKyAgICAgICAgICAgICAgICBwYXRoOiBwYXRo LnRvX3BhdGhfYnVmKCksCisgICAgICAgICAgICAgICAgY29tcHJlc3NlZDogZmFsc2UsCisgICAg ICAgICAgICAgICAgc3RhcnR0aW1lLAorICAgICAgICAgICAgfSkKKyAgICAgICAgfQorICAgIH0K K30KKworLy8vIENvbXBhcmlzb24gZnVuY3Rpb24gZm9yIHNvcnRpbmcgdGFza3MuCisvLy8gVGhl IHRhc2tzIGFyZSBjb21wYXJlZCBiYXNlZCBvbiB0aGUgdGFzaydzIHN0YXJ0IHRpbWUsIGZhbGxp bmcKKy8vLyBiYWNrIHRvIHRoZSB0YXNrJ3MgVVBJRCBhcyBhIHNlY29uZGFyeSBjcml0ZXJpb24g aW4gY2FzZSB0aGUKKy8vLyBzdGFydCB0aW1lcyBhcmUgZXF1YWwuCitmbiBjb21wYXJlX3Rhc2tz KGE6ICZUYXNrQ2FjaGVJdGVtLCBiOiAmVGFza0NhY2hlSXRlbSkgLT4gT3JkZXJpbmcgeworICAg IGEuc3RhcnR0aW1lCisgICAgICAgIC5jbXAoJmIuc3RhcnR0aW1lKQorICAgICAgICAudGhlbl93 aXRoKHx8IGIudXBpZC50b19zdHJpbmcoKS5jbXAoJmEudXBpZC50b19zdHJpbmcoKSkpCit9CisK Ky8vLyBDb21wYXJpc29uIGZ1bmN0aW9uIGZvciBzb3J0aW5nIHRhc2tzLCByZXZlcnNlZAorLy8v IFRoZSB0YXNrcyBhcmUgY29tcGFyZWQgYmFzZWQgb24gdGhlIHRhc2sncyBzdGFydCB0aW1lLCBm YWxsaW5nCisvLy8gYmFjayB0byB0aGUgdGFzaydzIFVQSUQgYXMgYSBzZWNvbmRhcnkgY3JpdGVy aW9uIGluIGNhc2UgdGhlCisvLy8gc3RhcnQgdGltZXMgYXJlIGVxdWFsLgorZm4gY29tcGFyZV90 YXNrc19yZXZlcnNlKGE6ICZUYXNrQ2FjaGVJdGVtLCBiOiAmVGFza0NhY2hlSXRlbSkgLT4gT3Jk ZXJpbmcgeworICAgIGNvbXBhcmVfdGFza3MoYSwgYikucmV2ZXJzZSgpCit9CisKKy8vLyBJdGVy YXRvciBvdmVyIHRoZSB0YXNrIGFyY2hpdmUuCitwdWIgc3RydWN0IFRhc2tBcmNoaXZlSXRlcmF0 b3I8J2E+IHsKKyAgICBpbm5lcjogQm94PGR5biBJdGVyYXRvcjxJdGVtID0gVGFza0NhY2hlSXRl bT4+LAorCisgICAgLy8vIExvY2sgZm9yIHRoaXMgYXJjaGl2ZS4gVGhpcyBjb250YWlucyB0aGUg bG9jayBpbiBjYXNlIHdlCisgICAgLy8vIG5lZWQgdG8ga2VlcCB0aGUgYXJjaGl2ZSBsb2NrZWQg d2hpbGUgaXRlcmF0aW5nIG92ZXIgaXQuCisgICAgX2xvY2s6ICYnYSBUYXNrQ2FjaGVMb2NrLAor fQorCitpbXBsPCdhPiBUYXNrQXJjaGl2ZUl0ZXJhdG9yPCdhPiB7CisgICAgLy8vIENyZWF0ZSBh IG5ldyB0YXNrIGFyY2hpdmUgaXRlcmF0b3IuCisgICAgLy8vCisgICAgLy8vIGBmaWxlc2Agc2hv dWxkIGJlIHNvcnRlZCB3aXRoIHRoZSBtb3N0IHJlY2VudCBhcmNoaXZlIGZpbGUgKmxhc3QqLgor ICAgIGZuIG5ldygKKyAgICAgICAgam91cm5hbDogT3B0aW9uPFBhdGhCdWY+LAorICAgICAgICBm aWxlczogVmVjPEFyY2hpdmVGaWxlPiwKKyAgICAgICAgbG9jazogJidhIFRhc2tDYWNoZUxvY2ss CisgICAgKSAtPiBSZXN1bHQ8U2VsZiwgRXJyb3I+IHsKKyAgICAgICAgbGV0IGlubmVyID0gSW5u ZXJUYXNrQXJjaGl2ZUl0ZXJhdG9yOjpuZXcoZmlsZXMpCisgICAgICAgICAgICAuZmlsdGVyX21h cCh8cmVzfCBtYXRjaCByZXMgeworICAgICAgICAgICAgICAgIE9rKHRhc2spID0+IFNvbWUodGFz ayksCisgICAgICAgICAgICAgICAgRXJyKGVycikgPT4geworICAgICAgICAgICAgICAgICAgICBs b2c6OmVycm9yISgiY291bGQgbm90IHJlYWQgdGFzayBmcm9tIGFyY2hpdmUgZmlsZToge2Vycjoj fSIpOworICAgICAgICAgICAgICAgICAgICBOb25lCisgICAgICAgICAgICAgICAgfQorICAgICAg ICAgICAgfSkKKyAgICAgICAgICAgIC5wZWVrYWJsZSgpOworCisgICAgICAgIGlmIGxldCBTb21l KGpvdXJuYWwpID0gam91cm5hbCB7CisgICAgICAgICAgICBsZXQgam91cm5hbF9yZWFkZXIgPSBC b3g6Om5ldyhCdWZSZWFkZXI6Om5ldyhGaWxlOjpvcGVuKGpvdXJuYWwpPykpOworICAgICAgICAg ICAgbGV0IGpvdXJuYWxfdGFza19pdGVyYXRvciA9IEpvdXJuYWxJdGVyYXRvcjo6bmV3KGpvdXJu YWxfcmVhZGVyKS5wZWVrYWJsZSgpOworICAgICAgICAgICAgbGV0IG1lcmdlX3Rhc2tfaXRlciA9 IE1lcmdlVGFza0l0ZXJhdG9yOjpuZXcoam91cm5hbF90YXNrX2l0ZXJhdG9yLCBpbm5lcik7CisK KyAgICAgICAgICAgIE9rKFNlbGYgeworICAgICAgICAgICAgICAgIGlubmVyOiBCb3g6Om5ldyht ZXJnZV90YXNrX2l0ZXIpLAorICAgICAgICAgICAgICAgIF9sb2NrOiBsb2NrLAorICAgICAgICAg ICAgfSkKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE9rKFNlbGYgeworICAgICAgICAg ICAgICAgIGlubmVyOiBCb3g6Om5ldyhpbm5lciksCisgICAgICAgICAgICAgICAgX2xvY2s6IGxv Y2ssCisgICAgICAgICAgICB9KQorICAgICAgICB9CisgICAgfQorfQorCitpbXBsIEl0ZXJhdG9y IGZvciBUYXNrQXJjaGl2ZUl0ZXJhdG9yPCdfPiB7CisgICAgdHlwZSBJdGVtID0gVGFza0NhY2hl SXRlbTsKKworICAgIGZuIG5leHQoJm11dCBzZWxmKSAtPiBPcHRpb248U2VsZjo6SXRlbT4gewor ICAgICAgICBzZWxmLmlubmVyLm5leHQoKQorICAgIH0KK30KKworc3RydWN0IElubmVyVGFza0Fy Y2hpdmVJdGVyYXRvciB7CisgICAgLy8vIEFyY2hpdmUgZmlsZXMgdG8gcmVhZC4KKyAgICBmaWxl czogVmVjPEFyY2hpdmVGaWxlPiwKKyAgICAvLy8gQXJjaGl2ZSBpdGVyYXRvciB3ZSBhcmUgY3Vy cmVudGx5IHVzaW5nLCBpZiBhbnkKKyAgICBjdXJyZW50OiBPcHRpb248QXJjaGl2ZUl0ZXJhdG9y PiwKK30KKworaW1wbCBJbm5lclRhc2tBcmNoaXZlSXRlcmF0b3IgeworICAgIC8vLyBDcmVhdGUg YSBuZXcgdGFzayBhcmNoaXZlIGl0ZXJhdG9yLgorICAgIHB1YiBmbiBuZXcoZmlsZXM6IFZlYzxB cmNoaXZlRmlsZT4pIC0+IFNlbGYgeworICAgICAgICBTZWxmIHsKKyAgICAgICAgICAgIGZpbGVz LAorICAgICAgICAgICAgY3VycmVudDogTm9uZSwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1w bCBJdGVyYXRvciBmb3IgSW5uZXJUYXNrQXJjaGl2ZUl0ZXJhdG9yIHsKKyAgICB0eXBlIEl0ZW0g PSBSZXN1bHQ8VGFza0NhY2hlSXRlbSwgRXJyb3I+OworCisgICAgZm4gbmV4dCgmbXV0IHNlbGYp IC0+IE9wdGlvbjxTZWxmOjpJdGVtPiB7CisgICAgICAgIGxvb3AgeworICAgICAgICAgICAgbWF0 Y2ggJm11dCBzZWxmLmN1cnJlbnQgeworICAgICAgICAgICAgICAgIFNvbWUoY3VycmVudCkgPT4g eworICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IGN1cnJlbnQubmV4dCgpOworICAgICAg ICAgICAgICAgICAgICBpZiBuZXh0LmlzX3NvbWUoKSB7CisgICAgICAgICAgICAgICAgICAgICAg ICByZXR1cm4gbmV4dDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAg ICAgICAgICAgICAgIHNlbGYuY3VycmVudCA9IE5vbmU7CisgICAgICAgICAgICAgICAgICAgIH0K KyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTm9uZSA9PiAnaW5uZXI6IGxvb3Ag eworICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm5zIGBOb25lYCBpZiBubyBtb3JlIGZpbGVz IGFyZSBhdmFpbGFibGUsIHN0b3BwaW5nIGl0ZXJhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAg bGV0IG5leHRfZmlsZSA9IHNlbGYuZmlsZXMucG9wKCk/OworCisgICAgICAgICAgICAgICAgICAg IG1hdGNoIG5leHRfZmlsZS5pdGVyKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgT2soaXRl cikgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VycmVudCA9IFNvbWUo aXRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgJ2lubmVyOworICAgICAg ICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgRXJyKGVycikgPT4g eworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZzo6ZXJyb3IhKCJjb3VsZCBub3QgY3Jl YXRlIGFyY2hpdmUgaXRlcmF0b3Igd2hpbGUgaXRlcmF0aW9uIG92ZXIgdGFzayBhcmNoaXZlIGZp bGVzLCBza2lwcGluZzoge2VycjojfSIpCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAg ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgfQorICAg ICAgICB9CisgICAgfQorfQorCisvLy8gQXJjaGl2ZSBmaWxlLgorI1tkZXJpdmUoQ2xvbmUsIERl YnVnKV0KK3N0cnVjdCBBcmNoaXZlRmlsZSB7CisgICAgLy8vIFRoZSBwYXRoIHRvIHRoZSBhcmNo aXZlIGZpbGUuCisgICAgcGF0aDogUGF0aEJ1ZiwKKyAgICAvLy8gVGhpcyBhcmNoaXZlIGZpbGUg aXMgY29tcHJlc3NlZCB1c2luZyB6c3RkLgorICAgIGNvbXByZXNzZWQ6IGJvb2wsCisgICAgLy8v IFRoZSBhcmNoaXZlJ3MgbG93ZXN0IHBlcm1pdHRlZCBzdGFydHRpbWUgKHNlY29uZHMgc2luY2Ug VU5JWCBlcG9jaCkuCisgICAgc3RhcnR0aW1lOiBpNjQsCit9CisKK2ltcGwgQXJjaGl2ZUZpbGUg eworICAgIC8vLyBDcmVhdGUgYW4gW2BBcmNoaXZlSXRlcmF0b3JgXSBmb3IgdGhpcyBmaWxlLgor ICAgIGZuIGl0ZXIoJnNlbGYpIC0+IFJlc3VsdDxBcmNoaXZlSXRlcmF0b3IsIEVycm9yPiB7Cisg ICAgICAgIGxldCBmZCA9IEZpbGU6Om9wZW4oJnNlbGYucGF0aCkKKyAgICAgICAgICAgIC53aXRo X2NvbnRleHQofHwgZm9ybWF0ISgiZmFpbGVkIHRvIG9wZW4gYXJjaGl2ZSBmaWxlIHt9Iiwgc2Vs Zi5wYXRoLmRpc3BsYXkoKSkpPzsKKworICAgICAgICBsZXQgaXRlciA9IGlmIHNlbGYuY29tcHJl c3NlZCB7CisgICAgICAgICAgICBsZXQgcmVhZGVyID0genN0ZDo6c3RyZWFtOjpyZWFkOjpEZWNv ZGVyOjpuZXcoZmQpLndpdGhfY29udGV4dCh8fCB7CisgICAgICAgICAgICAgICAgZm9ybWF0ISgK KyAgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBjcmVhdGUgenN0ZCBkZWNvZGVyIGZvciBh cmNoaXZlIGZpbGUge30iLAorICAgICAgICAgICAgICAgICAgICBzZWxmLnBhdGguZGlzcGxheSgp CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSk/OworICAgICAgICAgICAgQXJjaGl2 ZUl0ZXJhdG9yOjpuZXcoQm94OjpuZXcoQnVmUmVhZGVyOjpuZXcocmVhZGVyKSkpCisgICAgICAg IH0gZWxzZSB7CisgICAgICAgICAgICBBcmNoaXZlSXRlcmF0b3I6Om5ldyhCb3g6Om5ldyhCdWZS ZWFkZXI6Om5ldyhmZCkpKQorICAgICAgICB9OworCisgICAgICAgIE9rKGl0ZXIpCisgICAgfQor CisgICAgZm4gY29tcHJlc3MoJm11dCBzZWxmLCBvcHRpb25zOiBDcmVhdGVPcHRpb25zKSAtPiBS ZXN1bHQ8KCksIEVycm9yPiB7CisgICAgICAgIGxldCB1bmNvbXByZXNzZWRfZmlsZV9wYXRoID0g JnNlbGYucGF0aDsKKworICAgICAgICBsZXQgKHRlbXBfZmlsZSwgdGVtcF9maWxlX3BhdGgpID0K KyAgICAgICAgICAgIHByb3htb3hfc3lzOjpmczo6bWFrZV90bXBfZmlsZSh1bmNvbXByZXNzZWRf ZmlsZV9wYXRoLCBvcHRpb25zKQorICAgICAgICAgICAgICAgIC5jb250ZXh0KCJmYWlsZWQgdG8g Y3JlYXRlIHRlbXBvcmFyeSBmaWxlIik/OworCisgICAgICAgIGxldCB1bmNvbXByZXNzZWRfZmls ZSA9CisgICAgICAgICAgICBGaWxlOjpvcGVuKHVuY29tcHJlc3NlZF9maWxlX3BhdGgpLmNvbnRl eHQoImZhaWxlZCB0byBvcGVuIHVuY29tcHJlc3NlZCBmaWxlIik/OworCisgICAgICAgIHpzdGQ6 OnN0cmVhbTo6Y29weV9lbmNvZGUoCisgICAgICAgICAgICB1bmNvbXByZXNzZWRfZmlsZSwKKyAg ICAgICAgICAgIHRlbXBfZmlsZSwKKyAgICAgICAgICAgIHpzdGQ6OkRFRkFVTFRfQ09NUFJFU1NJ T05fTEVWRUwsCisgICAgICAgICkKKyAgICAgICAgLmNvbnRleHQoInpzdGQ6OnN0cmVhbTo6Y29w eV9lbmNvZGUgZmFpbGVkIik/OworCisgICAgICAgIGxldCBtdXQgbmV3X3BhdGhfZm9yX2NvbXBy ZXNzZWQgPSB1bmNvbXByZXNzZWRfZmlsZV9wYXRoLmNsb25lKCk7CisgICAgICAgIG5ld19wYXRo X2Zvcl9jb21wcmVzc2VkLnNldF9leHRlbnNpb24oZm9ybWF0ISgie30ue1pTVERfRVhURU5TSU9O fSIsIHNlbGYuc3RhcnR0aW1lKSk7CisKKyAgICAgICAgc3RkOjpmczo6cmVuYW1lKCZ0ZW1wX2Zp bGVfcGF0aCwgJm5ld19wYXRoX2Zvcl9jb21wcmVzc2VkKQorICAgICAgICAgICAgLmNvbnRleHQo ImZhaWxlZCB0byBtb3ZlIGNvbXByZXNzZWQgdGFzayBhY2hpdmUgZmlsZSIpPzsKKyAgICAgICAg c3RkOjpmczo6cmVtb3ZlX2ZpbGUodW5jb21wcmVzc2VkX2ZpbGVfcGF0aCkKKyAgICAgICAgICAg IC5jb250ZXh0KCJmYWlsZWQgdG8gcmVtb3ZlIHVuY29tcHJlc3NlZCBhcmNoaXZlIGZpbGUiKT87 CisKKyAgICAgICAgc2VsZi5wYXRoID0gbmV3X3BhdGhfZm9yX2NvbXByZXNzZWQ7CisgICAgICAg IHNlbGYuY29tcHJlc3NlZCA9IHRydWU7CisKKyAgICAgICAgT2soKCkpCisgICAgfQorfQorCisv Ly8gSXRlcmF0b3IgdGhhdCBtZXJnZXMgdHdvIF9zb3J0ZWRfIGBJdGVyYXRvcjxJdGVtID0gVGFz a0NhY2hlSXRlbT5gLCByZXR1cm5pbmcgdGhlIGl0ZW1zCisvLy8gZnJvbSBib3RoIGl0ZXJhdG9y cyBzb3J0ZWQuCisvLy8gVGhlIHR3byBpdGVyYXRvcnMgYXJlIGV4cGVjdGVkIHRvIGJlIHNvcnRl ZCBkZXNjZW5kaW5nbHkgYmFzZWQgb24gdGhlIHRhc2sncyBzdGFydHRpbWUgYW5kCisvLy8gYXNj ZW5kaW5nbHkgYmFzZWQgb24gdGhlIHRhc2sncyBVUElEJ3Mgc3RyaW5nIHJlcHJlc2VudGF0aW9u LiBUaGlzIGNhbiBiZQorLy8vIGFjaGlldmVkIGJ5IHVzaW5nIHRoZSBbYGNvbXBhcmVfdGFza3Nf cmV2ZXJzZWBdIGZ1bmN0aW9uIHdoZW4gc29ydGluZyBhbiBhcnJheSBvZiB0YXNrcy4KK3N0cnVj dCBNZXJnZVRhc2tJdGVyYXRvcjxUOiBJdGVyYXRvcjxJdGVtID0gVGFza0NhY2hlSXRlbT4sIFU6 IEl0ZXJhdG9yPEl0ZW0gPSBUYXNrQ2FjaGVJdGVtPj4geworICAgIGxlZnQ6IFBlZWthYmxlPFQ+ LAorICAgIHJpZ2h0OiBQZWVrYWJsZTxVPiwKK30KKworaW1wbDxULCBVPiBNZXJnZVRhc2tJdGVy YXRvcjxULCBVPgord2hlcmUKKyAgICBUOiBJdGVyYXRvcjxJdGVtID0gVGFza0NhY2hlSXRlbT4s CisgICAgVTogSXRlcmF0b3I8SXRlbSA9IFRhc2tDYWNoZUl0ZW0+LAoreworICAgIC8vLyBDcmVh dGUgYSBuZXcgbWVyZ2luZyBpdGVyYXRvci4KKyAgICBmbiBuZXcobGVmdDogUGVla2FibGU8VD4s IHJpZ2h0OiBQZWVrYWJsZTxVPikgLT4gU2VsZiB7CisgICAgICAgIFNlbGYgeyBsZWZ0LCByaWdo dCB9CisgICAgfQorfQorCitpbXBsPFQsIFU+IEl0ZXJhdG9yIGZvciBNZXJnZVRhc2tJdGVyYXRv cjxULCBVPgord2hlcmUKKyAgICBUOiBJdGVyYXRvcjxJdGVtID0gVGFza0NhY2hlSXRlbT4sCisg ICAgVTogSXRlcmF0b3I8SXRlbSA9IFRhc2tDYWNoZUl0ZW0+LAoreworICAgIHR5cGUgSXRlbSA9 IFQ6Okl0ZW07CisKKyAgICBmbiBuZXh0KCZtdXQgc2VsZikgLT4gT3B0aW9uPFQ6Okl0ZW0+IHsK KyAgICAgICAgbGV0IG9yZGVyID0gbWF0Y2ggKHNlbGYubGVmdC5wZWVrKCksIHNlbGYucmlnaHQu cGVlaygpKSB7CisgICAgICAgICAgICAoU29tZShsKSwgU29tZShyKSkgPT4gU29tZShjb21wYXJl X3Rhc2tzKGwsIHIpKSwKKyAgICAgICAgICAgIChTb21lKF8pLCBOb25lKSA9PiBTb21lKE9yZGVy aW5nOjpHcmVhdGVyKSwKKyAgICAgICAgICAgIChOb25lLCBTb21lKF8pKSA9PiBTb21lKE9yZGVy aW5nOjpMZXNzKSwKKyAgICAgICAgICAgIChOb25lLCBOb25lKSA9PiBOb25lLAorICAgICAgICB9 OworCisgICAgICAgIG1hdGNoIG9yZGVyIHsKKyAgICAgICAgICAgIFNvbWUoT3JkZXJpbmc6Okdy ZWF0ZXIpID0+IHNlbGYubGVmdC5uZXh0KCksCisgICAgICAgICAgICBTb21lKE9yZGVyaW5nOjpM ZXNzKSA9PiBzZWxmLnJpZ2h0Lm5leHQoKSwKKyAgICAgICAgICAgIFNvbWUoT3JkZXJpbmc6OkVx dWFsKSA9PiB7CisgICAgICAgICAgICAgICAgLy8gRGVkdXAgYnkgY29uc3VtaW5nIHRoZSBvdGhl ciBpdGVyYXRvciBhcyB3ZWxsCisgICAgICAgICAgICAgICAgbGV0IF8gPSBzZWxmLnJpZ2h0Lm5l eHQoKTsKKyAgICAgICAgICAgICAgICBzZWxmLmxlZnQubmV4dCgpCisgICAgICAgICAgICB9Cisg ICAgICAgICAgICBOb25lID0+IE5vbmUsCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBJdGVy YXRvciBmb3IgYSBzaW5nbGUgdGFzayBhcmNoaXZlIGZpbGUuCisvLy8KKy8vLyBUaGlzIGl0ZXJh dG9yIGltcGxlbWVudHMgYEl0ZXJhdG9yPEl0ZW0gPSBSZXN1bHQ8VGFza0NhY2hlSXRlbSwgRXJy b3I+YC4gV2hlbiBpdGVyYXRpbmcsCisvLy8gdGFza3MgYXJlIHJlYWQgbGluZSBieSBsaW5lLCB3 aXRob3V0IGxlYWRpbmcgdGhlIGVudGlyZSBhcmNoaXZlIGZpbGUgaW50byBtZW1vcnkuCitzdHJ1 Y3QgQXJjaGl2ZUl0ZXJhdG9yIHsKKyAgICBpdGVyOiBMaW5lczxCb3g8ZHluIEJ1ZlJlYWQ+PiwK K30KKworaW1wbCBBcmNoaXZlSXRlcmF0b3IgeworICAgIC8vLyBDcmVhdGUgYSBuZXcgaXRlcmF0 b3IuCisgICAgcHViIGZuIG5ldyhyZWFkZXI6IEJveDxkeW4gQnVmUmVhZD4pIC0+IFNlbGYgewor ICAgICAgICBsZXQgbGluZXMgPSByZWFkZXIubGluZXMoKTsKKworICAgICAgICBTZWxmIHsgaXRl cjogbGluZXMgfQorICAgIH0KK30KKworaW1wbCBJdGVyYXRvciBmb3IgQXJjaGl2ZUl0ZXJhdG9y IHsKKyAgICB0eXBlIEl0ZW0gPSBSZXN1bHQ8VGFza0NhY2hlSXRlbSwgRXJyb3I+OworCisgICAg Zm4gbmV4dCgmbXV0IHNlbGYpIC0+IE9wdGlvbjxTZWxmOjpJdGVtPiB7CisgICAgICAgIHNlbGYu aXRlci5uZXh0KCkubWFwKHxyZXN1bHR8IHsKKyAgICAgICAgICAgIHJlc3VsdAorICAgICAgICAg ICAgICAgIC5hbmRfdGhlbih8bGluZXwgT2soc2VyZGVfanNvbjo6ZnJvbV9zdHIoJmxpbmUpPykp CisgICAgICAgICAgICAgICAgLm1hcF9lcnIoSW50bzo6aW50bykKKyAgICAgICAgfSkKKyAgICB9 Cit9CisKKy8vLyBJdGVyYXRvciBmb3Igam91cm5hbCBmaWxlcy4gVGhpcyBpdGVyYXRvciB1c2Vz IFtgQXJjaGl2ZUl0ZXJhdG9yYF0gaW50ZXJuYWxseSwgYnV0IHdpbGwgZWFnZXJseQorLy8vIGxv YWQgYWxsIHRhc2tzIGludG8gbWVtb3J5IHRvIHNvcnQgYW5kIGRlZHVwbGljYXRlIHRoZW0uCitz dHJ1Y3QgSm91cm5hbEl0ZXJhdG9yIHsKKyAgICBpbm5lcjogQm94PGR5biBJdGVyYXRvcjxJdGVt ID0gVGFza0NhY2hlSXRlbT4+LAorfQorCitpbXBsIEpvdXJuYWxJdGVyYXRvciB7CisgICAgZm4g bmV3KGZpbGU6IEJveDxkeW4gQnVmUmVhZD4pIC0+IFNlbGYgeworICAgICAgICBsZXQgaXRlciA9 IEFyY2hpdmVJdGVyYXRvcjo6bmV3KGZpbGUpOworCisgICAgICAgIGxldCBtdXQgdGFza3M6IFZl YzxUYXNrQ2FjaGVJdGVtPiA9IGl0ZXIKKyAgICAgICAgICAgIC5mbGF0X21hcCh8dGFza3wgbWF0 Y2ggdGFzayB7CisgICAgICAgICAgICAgICAgT2sodGFzaykgPT4gU29tZSh0YXNrKSwKKyAgICAg ICAgICAgICAgICBFcnIoZXJyKSA9PiB7CisgICAgICAgICAgICAgICAgICAgIGxvZzo6ZXJyb3Ih KCJjb3VsZCBub3QgcmVhZCB0YXNrIHdoaWxlIGl0ZXJhdGluZyBvdmVyIGFyY2hpdmUgZmlsZTog e2VycjojfSIpOworICAgICAgICAgICAgICAgICAgICBOb25lCisgICAgICAgICAgICAgICAgfQor ICAgICAgICAgICAgfSkKKyAgICAgICAgICAgIC5jb2xsZWN0KCk7CisKKyAgICAgICAgdGFza3Mu c29ydF9ieShjb21wYXJlX3Rhc2tzX3JldmVyc2UpOworICAgICAgICB0YXNrcy5kZWR1cCgpOwor CisgICAgICAgIFNlbGYgeworICAgICAgICAgICAgaW5uZXI6IEJveDo6bmV3KHRhc2tzLmludG9f aXRlcigpKSwKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbCBJdGVyYXRvciBmb3IgSm91cm5h bEl0ZXJhdG9yIHsKKyAgICB0eXBlIEl0ZW0gPSBUYXNrQ2FjaGVJdGVtOworCisgICAgZm4gbmV4 dCgmbXV0IHNlbGYpIC0+IE9wdGlvbjxTZWxmOjpJdGVtPiB7CisgICAgICAgIHNlbGYuaW5uZXIu bmV4dCgpCisgICAgfQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisgICAgdXNlIHN0 ZDo6aW86OkN1cnNvcjsKKworICAgIHVzZSBjcmF0ZTo6dGVzdF9zdXBwb3J0Ojp0ZW1wOjpOYW1l ZFRlbXBEaXI7CisKKyAgICB1c2Ugc3VwZXI6Oio7CisKKyAgICAjW3Rlc3RdCisgICAgZm4gYXJj aGl2ZV9maWxlbmFtZSgpIHsKKyAgICAgICAgbGV0IGEgPSBUYXNrQ2FjaGU6OnBhcnNlX2FyY2hp dmVfZmlsZW5hbWUoJlBhdGhCdWY6OmZyb20oIi90bXAvYXJjaGl2ZS4xMDAwMCIpKS51bndyYXAo KTsKKworICAgICAgICBhc3NlcnRfZXEhKGEucGF0aCwgUGF0aEJ1Zjo6ZnJvbSgiL3RtcC9hcmNo aXZlLjEwMDAwIikpOworICAgICAgICBhc3NlcnRfZXEhKGEuc3RhcnR0aW1lLCAxMDAwMCk7Cisg ICAgICAgIGFzc2VydCEoIWEuY29tcHJlc3NlZCk7CisKKyAgICAgICAgbGV0IGEgPSBUYXNrQ2Fj aGU6OnBhcnNlX2FyY2hpdmVfZmlsZW5hbWUoJlBhdGhCdWY6OmZyb20oIi90bXAvYXJjaGl2ZS4x MjM0LnpzdCIpKS51bndyYXAoKTsKKworICAgICAgICBhc3NlcnRfZXEhKGEucGF0aCwgUGF0aEJ1 Zjo6ZnJvbSgiL3RtcC9hcmNoaXZlLjEyMzQuenN0IikpOworICAgICAgICBhc3NlcnRfZXEhKGEu c3RhcnR0aW1lLCAxMjM0KTsKKyAgICAgICAgYXNzZXJ0IShhLmNvbXByZXNzZWQpOworICAgIH0K KworICAgICNbdGVzdF0KKyAgICBmbiBhcmNoaXZlX2l0ZXJhdG9yKCkgLT4gUmVzdWx0PCgpLCBF cnJvcj4geworICAgICAgICBsZXQgZmlsZSA9IHIjIgorICAgICAgICAgICAgeyJ1cGlkIjoicHZl LXJlbW90ZSFVUElEOnB2ZTowMDAzOUU0RDowMDI2MzhCODo2N0I0QTlEMTpzdG9wYWxsOjpyb290 QHBhbToiLCJzdGF0dXMiOiJPSyIsImVuZHRpbWUiOjEyMzQ1LCAic3RhcnR0aW1lIjogMTIzNH0K KyAgICAgICAgICAgIHsidXBpZCI6InBicy1yZW1vdGUhVVBJRDpwYnM6MDAwMDAyQjI6MDAwMDAx NTg6MDAwMDAwMDA6Njc0RDgyOEM6bG9ncm90YXRlOjpyb290QHBhbToiLCJzdGF0dXMiOiJPSyIs ImVuZHRpbWUiOjEyMzQ1LCAic3RhcnR0aW1lIjogMTIzNH0KKyAgICAgICAgICAgIGludmFsaWQi IworICAgICAgICAgICAgLnRyaW1fc3RhcnQoKTsKKworICAgICAgICBsZXQgY3Vyc29yID0gQm94 OjpuZXcoQ3Vyc29yOjpuZXcoZmlsZS5hc19ieXRlcygpKSk7CisgICAgICAgIGxldCBtdXQgaXRl ciA9IEFyY2hpdmVJdGVyYXRvcjo6bmV3KGN1cnNvcik7CisKKyAgICAgICAgYXNzZXJ0X2VxIShp dGVyLm5leHQoKS51bndyYXAoKS51bndyYXAoKS51cGlkLnJlbW90ZSgpLCAicHZlLXJlbW90ZSIp OworICAgICAgICBhc3NlcnRfZXEhKGl0ZXIubmV4dCgpLnVud3JhcCgpLnVud3JhcCgpLnVwaWQu cmVtb3RlKCksICJwYnMtcmVtb3RlIik7CisgICAgICAgIGFzc2VydCEoaXRlci5uZXh0KCkudW53 cmFwKCkuaXNfZXJyKCkpOworICAgICAgICBhc3NlcnQhKGl0ZXIubmV4dCgpLmlzX25vbmUoKSk7 CisKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gdGFzayhzdGFydHRpbWU6IGk2NCwg ZW5kZWQ6IGJvb2wpIC0+IFRhc2tDYWNoZUl0ZW0geworICAgICAgICBsZXQgKHN0YXR1cywgZW5k dGltZSkgPSBpZiBlbmRlZCB7CisgICAgICAgICAgICAoU29tZSgiT0siLmludG8oKSksIFNvbWUo c3RhcnR0aW1lICsgMTApKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKE5vbmUsIE5v bmUpCisgICAgICAgIH07CisKKyAgICAgICAgVGFza0NhY2hlSXRlbSB7CisgICAgICAgICAgICB1 cGlkOiBmb3JtYXQhKAorICAgICAgICAgICAgICAgICJwdmUtcmVtb3RlIVVQSUQ6cHZlOjAwMDM5 RTREOjAwMjYzOEI4OntzdGFydHRpbWU6MDhYfTpzdG9wYWxsOjpyb290QHBhbToiCisgICAgICAg ICAgICApCisgICAgICAgICAgICAucGFyc2UoKQorICAgICAgICAgICAgLnVud3JhcCgpLAorICAg ICAgICAgICAgc3RhcnR0aW1lLAorICAgICAgICAgICAgc3RhdHVzLAorICAgICAgICAgICAgZW5k dGltZSwKKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIGFzc2VydF9zdGFydHRpbWVzKGNhY2hl OiAmV3JpdGFibGVUYXNrQ2FjaGUsIHN0YXJ0dGltZXM6ICZbaTY0XSkgeworICAgICAgICBsZXQg dGFza3M6IFZlYzxpNjQ+ID0gY2FjaGUKKyAgICAgICAgICAgIC5nZXRfdGFza3MoR2V0VGFza3M6 OkFsbCkKKyAgICAgICAgICAgIC51bndyYXAoKQorICAgICAgICAgICAgLm1hcCh8dGFza3wgdGFz ay5zdGFydHRpbWUpCisgICAgICAgICAgICAuY29sbGVjdCgpOworCisgICAgICAgIGFzc2VydF9l cSEoJnRhc2tzLCBzdGFydHRpbWVzKTsKKyAgICB9CisKKyAgICBmbiBhZGRfdGFza3MoY2FjaGU6 ICZXcml0YWJsZVRhc2tDYWNoZSwgdGFza3M6IFZlYzxUYXNrQ2FjaGVJdGVtPikgLT4gUmVzdWx0 PCgpLCBFcnJvcj4geworICAgICAgICBsZXQgbXV0IG5vZGVfbWFwID0gTm9kZUZldGNoU3VjY2Vz c01hcDo6ZGVmYXVsdCgpOworICAgICAgICBub2RlX21hcC5zZXRfbm9kZV9zdWNjZXNzKCJwdmUt cmVtb3RlIi50b19zdHJpbmcoKSwgInB2ZSIudG9fc3RyaW5nKCkpOworCisgICAgICAgIGNhY2hl LnVwZGF0ZSh0YXNrcywgJm5vZGVfbWFwLCBIYXNoU2V0OjpuZXcoKSkKKyAgICB9CisKKyAgICBj b25zdCBERUZBVUxUX01BWF9TSVpFOiB1NjQgPSAxMDAwMDsKKworICAgICNbdGVzdF0KKyAgICBm biB0ZXN0X2FkZF90YXNrcygpIC0+IFJlc3VsdDwoKSwgRXJyb3I+IHsKKyAgICAgICAgbGV0IHRt cF9kaXIgPSBOYW1lZFRlbXBEaXI6Om5ldygpPzsKKyAgICAgICAgbGV0IGNhY2hlID0gVGFza0Nh Y2hlOjpuZXcoCisgICAgICAgICAgICB0bXBfZGlyLnBhdGgoKSwKKyAgICAgICAgICAgIENyZWF0 ZU9wdGlvbnM6Om5ldygpLAorICAgICAgICAgICAgMywKKyAgICAgICAgICAgIDEsCisgICAgICAg ICAgICAwLAorICAgICAgICAgICAgREVGQVVMVF9NQVhfU0laRSwKKyAgICAgICAgKQorICAgICAg ICAudW53cmFwKCkKKyAgICAgICAgLndyaXRlKCk/OworCisgICAgICAgIGNhY2hlLm5ld19maWxl KDEwMDAsIGZhbHNlKT87CisgICAgICAgIGFzc2VydF9lcSEoY2FjaGUuY2FjaGUuYXJjaGl2ZV9m aWxlcygmY2FjaGUubG9jayk/LmxlbigpLCAxKTsKKworICAgICAgICBhZGRfdGFza3MoJmNhY2hl LCB2ZWMhW3Rhc2soMTAwMCwgdHJ1ZSksIHRhc2soMTAwMSwgdHJ1ZSldKT87CisKKyAgICAgICAg YXNzZXJ0X2VxISgKKyAgICAgICAgICAgIGNhY2hlLnJlYWRfc3RhdGUoKS5jdXRvZmZfdGltZXN0 YW1wKCJwdmUtcmVtb3RlIiwgInB2ZSIpLAorICAgICAgICAgICAgU29tZSgxMDAxKQorICAgICAg ICApOworCisgICAgICAgIGNhY2hlLnJvdGF0ZSgxNTAwKT87CisKKyAgICAgICAgYXNzZXJ0X2Vx IShjYWNoZS5jYWNoZS5hcmNoaXZlX2ZpbGVzKCZjYWNoZS5sb2NrKT8ubGVuKCksIDIpOworCisg ICAgICAgIGFkZF90YXNrcygmY2FjaGUsIHZlYyFbdGFzaygxNTAwLCB0cnVlKSwgdGFzaygxNTAx LCB0cnVlKV0pPzsKKyAgICAgICAgYWRkX3Rhc2tzKCZjYWNoZSwgdmVjIVt0YXNrKDEyMDAsIHRy dWUpLCB0YXNrKDEzMDAsIHRydWUpXSk/OworCisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAg ICAgICBjYWNoZS5yZWFkX3N0YXRlKCkuY3V0b2ZmX3RpbWVzdGFtcCgicHZlLXJlbW90ZSIsICJw dmUiKSwKKyAgICAgICAgICAgIFNvbWUoMTUwMSksCisgICAgICAgICk7CisKKyAgICAgICAgY2Fj aGUucm90YXRlKDIwMDApPzsKKyAgICAgICAgYXNzZXJ0X2VxIShjYWNoZS5jYWNoZS5hcmNoaXZl X2ZpbGVzKCZjYWNoZS5sb2NrKT8ubGVuKCksIDMpOworCisgICAgICAgIGFkZF90YXNrcygmY2Fj aGUsIHZlYyFbdGFzaygyMDAwLCB0cnVlKV0pPzsKKyAgICAgICAgYWRkX3Rhc2tzKCZjYWNoZSwg dmVjIVt0YXNrKDE1MDIsIHRydWUpXSk/OworICAgICAgICBhZGRfdGFza3MoJmNhY2hlLCB2ZWMh W3Rhc2soMTAwMiwgdHJ1ZSldKT87CisKKyAgICAgICAgLy8gVGhlc2UgYXJlIGJlZm9yZSB0aGUg Y3V0LW9mZiBvZiAxMDAwLCBzbyB0aGV5IHdpbGwgYmUgZGlzY2FyZGVkLgorICAgICAgICAvLyBh ZGRfdGFza3MoJmNhY2hlLCB2ZWMhW3Rhc2soODAwLCB0cnVlKSwgdGFzayg5MDAsIHRydWUpXSk/ OworCisgICAgICAgIC8vIFRoaXMgb25lIHNob3VsZCBiZSBkZWR1cGVkCisgICAgICAgIGFkZF90 YXNrcygmY2FjaGUsIHZlYyFbdGFzaygxMDAwLCB0cnVlKV0pPzsKKworICAgICAgICBhc3NlcnRf c3RhcnR0aW1lcygKKyAgICAgICAgICAgICZjYWNoZSwKKyAgICAgICAgICAgICZbMjAwMCwgMTUw MiwgMTUwMSwgMTUwMCwgMTMwMCwgMTIwMCwgMTAwMiwgMTAwMSwgMTAwMF0sCisgICAgICAgICk7 CisKKyAgICAgICAgY2FjaGUucm90YXRlKDI1MDApPzsKKworICAgICAgICBhc3NlcnRfZXEhKGNh Y2hlLmNhY2hlLmFyY2hpdmVfZmlsZXMoJmNhY2hlLmxvY2spPy5sZW4oKSwgMyk7CisKKyAgICAg ICAgYXNzZXJ0X3N0YXJ0dGltZXMoJmNhY2hlLCAmWzIwMDAsIDE1MDIsIDE1MDEsIDE1MDBdKTsK KworICAgICAgICBjYWNoZS5yb3RhdGUoMzAwMCk/OworICAgICAgICBhc3NlcnRfZXEhKGNhY2hl LmNhY2hlLmFyY2hpdmVfZmlsZXMoJmNhY2hlLmxvY2spPy5sZW4oKSwgMyk7CisKKyAgICAgICAg YXNzZXJ0X3N0YXJ0dGltZXMoJmNhY2hlLCAmWzIwMDBdKTsKKworICAgICAgICBPaygoKSkKKyAg ICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9hY3RpdmVfdGFza3NfYXJlX21pZ3JhdGVk X3RvX2FyY2hpdmUoKSAtPiBSZXN1bHQ8KCksIEVycm9yPiB7CisgICAgICAgIGxldCB0bXBfZGly ID0gTmFtZWRUZW1wRGlyOjpuZXcoKT87CisgICAgICAgIGxldCBjYWNoZSA9IFRhc2tDYWNoZTo6 bmV3KAorICAgICAgICAgICAgdG1wX2Rpci5wYXRoKCksCisgICAgICAgICAgICBDcmVhdGVPcHRp b25zOjpuZXcoKSwKKyAgICAgICAgICAgIDMsCisgICAgICAgICAgICAxLAorICAgICAgICAgICAg MCwKKyAgICAgICAgICAgIERFRkFVTFRfTUFYX1NJWkUsCisgICAgICAgICkKKyAgICAgICAgLnVu d3JhcCgpCisgICAgICAgIC53cml0ZSgpPzsKKworICAgICAgICBjYWNoZS5uZXdfZmlsZSgxMDAw LCBmYWxzZSk/OworICAgICAgICBhZGRfdGFza3MoJmNhY2hlLCB2ZWMhW3Rhc2soMTAwMCwgZmFs c2UpLCB0YXNrKDEwMDEsIGZhbHNlKV0pPzsKKyAgICAgICAgYXNzZXJ0X2VxIShjYWNoZS5nZXRf dGFza3MoR2V0VGFza3M6OkFjdGl2ZSk/LmNvdW50KCksIDIpOworCisgICAgICAgIGFkZF90YXNr cygmY2FjaGUsIHZlYyFbdGFzaygxMDAwLCB0cnVlKSwgdGFzaygxMDAxLCB0cnVlKV0pPzsKKwor ICAgICAgICBhc3NlcnRfc3RhcnR0aW1lcygmY2FjaGUsICZbMTAwMSwgMTAwMF0pOworCisgICAg ICAgIGFzc2VydF9lcSEoY2FjaGUuZ2V0X3Rhc2tzKEdldFRhc2tzOjpBY3RpdmUpPy5jb3VudCgp LCAwKTsKKworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVz dF9pbml0KCkgLT4gUmVzdWx0PCgpLCBFcnJvcj4geworICAgICAgICBsZXQgdG1wX2RpciA9IE5h bWVkVGVtcERpcjo6bmV3KCk/OworICAgICAgICBsZXQgY2FjaGUgPSBUYXNrQ2FjaGU6Om5ldygK KyAgICAgICAgICAgIHRtcF9kaXIucGF0aCgpLAorICAgICAgICAgICAgQ3JlYXRlT3B0aW9uczo6 bmV3KCksCisgICAgICAgICAgICAzLAorICAgICAgICAgICAgMSwKKyAgICAgICAgICAgIDEwMCwK KyAgICAgICAgICAgIERFRkFVTFRfTUFYX1NJWkUsCisgICAgICAgICkKKyAgICAgICAgLnVud3Jh cCgpCisgICAgICAgIC53cml0ZSgpPzsKKworICAgICAgICBjYWNoZS5pbml0KDEwMDApPzsKKyAg ICAgICAgYXNzZXJ0X2VxIShjYWNoZS5jYWNoZS5hcmNoaXZlX2ZpbGVzKCZjYWNoZS5sb2NrKT8u bGVuKCksIDMpOworCisgICAgICAgIGFkZF90YXNrcygKKyAgICAgICAgICAgICZjYWNoZSwKKyAg ICAgICAgICAgIHZlYyFbdGFzaygxMDUwLCB0cnVlKSwgdGFzayg5NTAsIHRydWUpLCB0YXNrKDg1 MCwgdHJ1ZSldLAorICAgICAgICApPzsKKworICAgICAgICBhc3NlcnRfZXEhKGNhY2hlLmdldF90 YXNrcyhHZXRUYXNrczo6QXJjaGl2ZWQpPy5jb3VudCgpLCAzKTsKKworICAgICAgICBPaygoKSkK KyAgICB9CisKKyAgICBmbiBhZGRfZmluaXNoZWRfdHJhY2tlZChjYWNoZTogJldyaXRhYmxlVGFz a0NhY2hlLCBzdGFydHRpbWU6IGk2NCkgLT4gUmVzdWx0PCgpLCBFcnJvcj4geworICAgICAgICBs ZXQgdCA9IHRhc2soc3RhcnR0aW1lLCB0cnVlKTsKKyAgICAgICAgbGV0IHVwaWQgPSB0LnVwaWQu Y2xvbmUoKTsKKworICAgICAgICBsZXQgbXV0IG5vZGVfbWFwID0gTm9kZUZldGNoU3VjY2Vzc01h cDo6ZGVmYXVsdCgpOworICAgICAgICBub2RlX21hcC5zZXRfbm9kZV9zdWNjZXNzKCJwdmUtcmVt b3RlIi50b19zdHJpbmcoKSwgInB2ZSIudG9fc3RyaW5nKCkpOworCisgICAgICAgIGNhY2hlLnVw ZGF0ZSh2ZWMhW3RdLCAmbm9kZV9tYXAsIEhhc2hTZXQ6OmZyb21faXRlcihbdXBpZF0pKQorICAg IH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X3RyYWNraW5nX3Rhc2tzKCkgLT4gUmVzdWx0 PCgpLCBFcnJvcj4geworICAgICAgICBsZXQgdG1wX2RpciA9IE5hbWVkVGVtcERpcjo6bmV3KCk/ OworICAgICAgICBsZXQgY2FjaGUgPSBUYXNrQ2FjaGU6Om5ldygKKyAgICAgICAgICAgIHRtcF9k aXIucGF0aCgpLAorICAgICAgICAgICAgQ3JlYXRlT3B0aW9uczo6bmV3KCksCisgICAgICAgICAg ICAzLAorICAgICAgICAgICAgMSwKKyAgICAgICAgICAgIDEwMCwKKyAgICAgICAgICAgIERFRkFV TFRfTUFYX1NJWkUsCisgICAgICAgICkKKyAgICAgICAgLnVud3JhcCgpCisgICAgICAgIC53cml0 ZSgpPzsKKworICAgICAgICBjYWNoZS5pbml0KDEwMDApPzsKKworICAgICAgICBjYWNoZS5hZGRf dHJhY2tlZF90YXNrKHRhc2soMTA1MCwgZmFsc2UpKT87CisKKyAgICAgICAgYXNzZXJ0X2VxIShj YWNoZS5nZXRfdGFza3MoR2V0VGFza3M6OkFjdGl2ZSk/LmNvdW50KCksIDEpOworICAgICAgICBj YWNoZS5hZGRfdHJhY2tlZF90YXNrKHRhc2soMTA2MCwgZmFsc2UpKT87CisgICAgICAgIGFzc2Vy dF9lcSEoY2FjaGUuZ2V0X3Rhc2tzKEdldFRhc2tzOjpBY3RpdmUpPy5jb3VudCgpLCAyKTsKKwor ICAgICAgICBhc3NlcnRfZXEhKGNhY2hlLnJlYWRfc3RhdGUoKS50cmFja2VkX3Rhc2tzKCkuY291 bnQoKSwgMik7CisKKyAgICAgICAgLy8gTWFyayBmaXJzdCB0YXNrIGFzIGZpbmlzaGVkCisgICAg ICAgIGFkZF9maW5pc2hlZF90cmFja2VkKCZjYWNoZSwgMTA1MCk/OworCisgICAgICAgIGFzc2Vy dF9lcSEoY2FjaGUuZ2V0X3Rhc2tzKEdldFRhc2tzOjpBY3RpdmUpPy5jb3VudCgpLCAxKTsKKyAg ICAgICAgYXNzZXJ0X2VxIShjYWNoZS5nZXRfdGFza3MoR2V0VGFza3M6OkFyY2hpdmVkKT8uY291 bnQoKSwgMSk7CisgICAgICAgIGFzc2VydF9lcSEoY2FjaGUucmVhZF9zdGF0ZSgpLnRyYWNrZWRf dGFza3MoKS5jb3VudCgpLCAxKTsKKworICAgICAgICAvLyBNYXJrIHNlY29uZCB0YXNrIGFzIGZp bmlzaGVkCisgICAgICAgIGFkZF9maW5pc2hlZF90cmFja2VkKCZjYWNoZSwgMTA2MCk/OworCisg ICAgICAgIGFzc2VydF9lcSEoY2FjaGUuZ2V0X3Rhc2tzKEdldFRhc2tzOjpBY3RpdmUpPy5jb3Vu dCgpLCAwKTsKKyAgICAgICAgYXNzZXJ0X2VxIShjYWNoZS5nZXRfdGFza3MoR2V0VGFza3M6OkFy Y2hpdmVkKT8uY291bnQoKSwgMik7CisgICAgICAgIGFzc2VydF9lcSEoY2FjaGUucmVhZF9zdGF0 ZSgpLnRyYWNrZWRfdGFza3MoKS5jb3VudCgpLCAwKTsKKworICAgICAgICBPaygoKSkKKyAgICB9 CisKKyAgICAjW3Rlc3RdCisgICAgZm4gam91cm5hbF9pc19hcHBsaWVkX2lmX21heF9zaXplX2V4 Y2VlZGVkKCkgLT4gUmVzdWx0PCgpLCBFcnJvcj4geworICAgICAgICBsZXQgdG1wX2RpciA9IE5h bWVkVGVtcERpcjo6bmV3KCk/OworCisgICAgICAgIC8vIFNob3VsZCBiZSAqanVzdCogZW5vdWdo IHRvIGZpdCBhIHNpbmdsZSB0YXNrLCB3aGljaCBtZWFucyB0aGF0IHdlIGFwcGx5IHRoZSBqb3Vy bmFsCisgICAgICAgIC8vIGFmdGVyIGFkZGluZyBhIHNlY29uZCBvbmUuCisgICAgICAgIGNvbnN0 IEVOT1VHSF9GT1JfU0lOR0xFX1RBU0s6IHU2NCA9IDIwMDsKKworICAgICAgICBsZXQgY2FjaGUg PSBUYXNrQ2FjaGU6Om5ldygKKyAgICAgICAgICAgIHRtcF9kaXIucGF0aCgpLAorICAgICAgICAg ICAgQ3JlYXRlT3B0aW9uczo6bmV3KCksCisgICAgICAgICAgICAzLAorICAgICAgICAgICAgMSwK KyAgICAgICAgICAgIDEwMCwKKyAgICAgICAgICAgIEVOT1VHSF9GT1JfU0lOR0xFX1RBU0ssCisg ICAgICAgICkKKyAgICAgICAgLnVud3JhcCgpCisgICAgICAgIC53cml0ZSgpPzsKKworICAgICAg ICBhZGRfdGFza3MoJmNhY2hlLCB2ZWMhW3Rhc2soMTAwMCwgdHJ1ZSldKT87CisgICAgICAgIGFz c2VydCEoY2FjaGUuam91cm5hbF9zaXplKCk/ID4gMCk7CisKKyAgICAgICAgYWRkX3Rhc2tzKCZj YWNoZSwgdmVjIVt0YXNrKDEwMDAsIHRydWUpXSk/OworCisgICAgICAgIGFzc2VydF9lcSEoY2Fj aGUuam91cm5hbF9zaXplKCk/LCAwKTsKKworICAgICAgICBPaygoKSkKKyAgICB9Cit9Ci0tIAoy LjQ3LjIKCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18K cGRtLWRldmVsIG1haWxpbmcgbGlzdApwZG0tZGV2ZWxAbGlzdHMucHJveG1veC5jb20KaHR0cHM6 Ly9saXN0cy5wcm94bW94LmNvbS9jZ2ktYmluL21haWxtYW4vbGlzdGluZm8vcGRtLWRldmVsCg==